45#define CHIP_NAME "TDK MPU6050"
46#define MANUFACTURER_NAME "TDK"
47#define SUPPLY_VOLTAGE_MIN 2.375f
48#define SUPPLY_VOLTAGE_MAX 3.46f
49#define MAX_CURRENT 3.9f
50#define TEMPERATURE_MIN -40.0f
51#define TEMPERATURE_MAX 85.0f
52#define DRIVER_VERSION 1000
57#define MPU6050_REG_SELF_TEST_X 0x0D
58#define MPU6050_REG_SELF_TEST_Y 0x0E
59#define MPU6050_REG_SELF_TEST_Z 0x0F
60#define MPU6050_REG_SELF_TEST_A 0x10
61#define MPU6050_REG_SMPRT_DIV 0x19
62#define MPU6050_REG_CONFIG 0x1A
63#define MPU6050_REG_GYRO_CONFIG 0x1B
64#define MPU6050_REG_ACCEL_CONFIG 0x1C
65#define MPU6050_REG_MOTION_THRESHOLD 0x1F
66#define MPU6050_REG_MOTION_DURATION 0x20
67#define MPU6050_REG_FIFO_EN 0x23
68#define MPU6050_REG_I2C_MST_CTRL 0x24
69#define MPU6050_REG_I2C_MST_STATUS 0x36
70#define MPU6050_REG_I2C_MST_DELAY_CTRL 0x67
71#define MPU6050_REG_I2C_SLV0_ADDR 0x25
72#define MPU6050_REG_I2C_SLV0_REG 0x26
73#define MPU6050_REG_I2C_SLV0_CTRL 0x27
74#define MPU6050_REG_I2C_SLV0_DO 0x63
75#define MPU6050_REG_I2C_SLV1_ADDR 0x28
76#define MPU6050_REG_I2C_SLV1_REG 0x29
77#define MPU6050_REG_I2C_SLV1_CTRL 0x2A
78#define MPU6050_REG_I2C_SLV1_DO 0x64
79#define MPU6050_REG_I2C_SLV2_ADDR 0x2B
80#define MPU6050_REG_I2C_SLV2_REG 0x2C
81#define MPU6050_REG_I2C_SLV2_CTRL 0x2D
82#define MPU6050_REG_I2C_SLV2_DO 0x65
83#define MPU6050_REG_I2C_SLV3_ADDR 0x2E
84#define MPU6050_REG_I2C_SLV3_REG 0x2F
85#define MPU6050_REG_I2C_SLV3_CTRL 0x30
86#define MPU6050_REG_I2C_SLV3_DO 0x66
87#define MPU6050_REG_I2C_SLV4_ADDR 0x31
88#define MPU6050_REG_I2C_SLV4_REG 0x32
89#define MPU6050_REG_I2C_SLV4_CTRL 0x34
90#define MPU6050_REG_I2C_SLV4_DO 0x33
91#define MPU6050_REG_I2C_SLV4_DI 0x35
92#define MPU6050_REG_EXT_SENS_DATA_00 0x49
93#define MPU6050_REG_INT_PIN_CFG 0x37
94#define MPU6050_REG_INT_ENABLE 0x38
95#define MPU6050_REG_INT_STATUS 0x3A
96#define MPU6050_REG_ACCEL_XOUT_H 0x3B
97#define MPU6050_REG_ACCEL_XOUT_L 0x3C
98#define MPU6050_REG_ACCEL_YOUT_H 0x3D
99#define MPU6050_REG_ACCEL_YOUT_L 0x3E
100#define MPU6050_REG_ACCEL_ZOUT_H 0x3F
101#define MPU6050_REG_ACCEL_ZOUT_L 0x40
102#define MPU6050_REG_TEMP_OUT_H 0x41
103#define MPU6050_REG_TEMP_OUT_L 0x42
104#define MPU6050_REG_GYRO_XOUT_H 0x43
105#define MPU6050_REG_GYRO_XOUT_L 0x44
106#define MPU6050_REG_GYRO_YOUT_H 0x45
107#define MPU6050_REG_GYRO_YOUT_L 0x46
108#define MPU6050_REG_GYRO_ZOUT_H 0x47
109#define MPU6050_REG_GYRO_ZOUT_L 0x48
110#define MPU6050_REG_SIGNAL_PATH_RESET 0x68
111#define MPU6050_REG_USER_CTRL 0x6A
112#define MPU6050_REG_PWR_MGMT_1 0x6B
113#define MPU6050_REG_PWR_MGMT_2 0x6C
114#define MPU6050_REG_BANK_SEL 0x6D
115#define MPU6050_REG_MEM 0x6F
116#define MPU6050_REG_PROGRAM_START 0x70
117#define MPU6050_REG_FIFO_COUNTH 0x72
118#define MPU6050_REG_FIFO_COUNTL 0x73
119#define MPU6050_REG_R_W 0x74
120#define MPU6050_REG_WHO_AM_I 0x75
125#define MPU6050_DMP_SAMPLE_RATE 200
126#define MPU6050_DMP_GYRO_SF (46850825LL * 200 / MPU6050_DMP_SAMPLE_RATE)
127#define MPU6050_DMP_D_PEDSTD_TIMECTR 964
128#define MPU6050_DMP_D_PEDSTD_STEPCTR (768 + 0x60)
129#define MPU6050_DMP_D_1_36 (256 + 36)
130#define MPU6050_DMP_D_1_40 (256 + 40)
131#define MPU6050_DMP_D_1_44 (256 + 44)
132#define MPU6050_DMP_D_1_72 (256 + 72)
133#define MPU6050_DMP_D_1_79 (256 + 79)
134#define MPU6050_DMP_D_1_88 (256 + 88)
135#define MPU6050_DMP_D_1_90 (256 + 90)
136#define MPU6050_DMP_D_1_92 (256 + 92)
137#define MPU6050_DMP_D_1_218 (256 + 218)
138#define MPU6050_DMP_D_0_22 (512 + 22)
139#define MPU6050_DMP_D_0_104 104
140#define MPU6050_DMP_TAPW_MIN 478
141#define MPU6050_DMP_TAP_THX 468
142#define MPU6050_DMP_TAP_THY 472
143#define MPU6050_DMP_TAP_THZ 476
144#define MPU6050_DMP_CFG_6 2753
145#define MPU6050_DMP_CFG_8 2718
146#define MPU6050_DMP_CFG_MOTION_BIAS 1208
147#define MPU6050_DMP_CFG_LP_QUAT 2712
148#define MPU6050_DMP_CFG_FIFO_ON_EVENT 2690
149#define MPU6050_DMP_FCFG_1 1062
150#define MPU6050_DMP_FCFG_2 1066
151#define MPU6050_DMP_FCFG_3 1088
152#define MPU6050_DMP_FCFG_7 1073
153#define MPU6050_DMP_D_EXT_GYRO_BIAS_X (61 * 16)
154#define MPU6050_DMP_D_EXT_GYRO_BIAS_Y (61 * 16 + 4)
155#define MPU6050_DMP_D_EXT_GYRO_BIAS_Z (61 * 16 + 8)
156#define MPU6050_DMP_D_ACCEL_BIAS 660
157#define MPU6050_DMP_FEATURE_SEND_ANY_GYRO (MPU6050_DMP_FEATURE_SEND_RAW_GYRO | \
158 MPU6050_DMP_FEATURE_SEND_CAL_GYRO)
159#define MPU6050_DMP_CFG_15 2727
160#define MPU6050_DMP_CFG_27 2742
161#define MPU6050_DMP_CFG_GYRO_RAW_DATA 2722
162#define MPU6050_DMP_CFG_20 2224
163#define MPU6050_DMP_CFG_ORIENT_INT 1853
164#define MPU6050_DMP_QUAT_ERROR_THRESH (1L << 24)
165#define MPU6050_DMP_QUAT_MAG_SQ_NORMALIZED (1L << 28)
166#define MPU6050_DMP_QUAT_MAG_SQ_MIN (MPU6050_DMP_QUAT_MAG_SQ_NORMALIZED - \
167 MPU6050_DMP_QUAT_ERROR_THRESH)
168#define MPU6050_DMP_QUAT_MAG_SQ_MAX (MPU6050_DMP_QUAT_MAG_SQ_NORMALIZED + \
169 MPU6050_DMP_QUAT_ERROR_THRESH)
170#define MPU6050_DMP_INT_SRC_TAP 0x01
171#define MPU6050_DMP_INT_SRC_ORIENT 0x08
172#define MPU6050_DMP_TAP_THRESH 250
173#define MPU6050_DMP_TAP_MIN_TAP_COUNT 1
174#define MPU6050_DMP_TAP_TIME 100
175#define MPU6050_DMP_TAP_TIME_MULTI 200
176#define MPU6050_DMP_SHAKE_REJECT_THRESH 200
177#define MPU6050_DMP_SHAKE_REJECT_TIME 40
178#define MPU6050_DMP_SHAKE_REJECT_TIMEOUT 10
183#define MIN(a, b) (((a) < (b)) ? (a) : (b))
196static uint8_t a_mpu6050_iic_read(
mpu6050_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
219static uint8_t a_mpu6050_iic_write(
mpu6050_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
243static uint8_t a_mpu6050_write_mem(
mpu6050_handle_t *handle, uint16_t addr, uint8_t *buf, uint16_t len)
247 tmp[0] = (addr >> 8) & 0xFF;
248 tmp[1] = (addr >> 0) & 0xFF;
250 if (tmp[1] + len > 256)
279static uint8_t a_mpu6050_read_mem(
mpu6050_handle_t *handle, uint16_t addr, uint8_t *buf, uint16_t len)
283 tmp[0] = (addr >> 8) & 0xFF;
284 tmp[1] = (addr >> 0) & 0xFF;
286 if (tmp[1] + len > 256)
321 handle->
debug_print(
"mpu6050: read int enable register failed.\n");
328 handle->
debug_print(
"mpu6050: read fifo enable register failed.\n");
335 handle->
debug_print(
"mpu6050: read user ctrl register failed.\n");
344 handle->
debug_print(
"mpu6050: write int enable register failed.\n");
352 handle->
debug_print(
"mpu6050: write fifo enable register failed.\n");
356 user_ctrl &= ~(1 << 6);
357 user_ctrl &= ~(1 << 7);
360 user_ctrl |= (1 << 2) | (1 << 3);
369 handle->
debug_print(
"mpu6050: write user ctrl register failed.\n");
376 user_ctrl |= (1 << 6) | (1 << 7);
385 handle->
debug_print(
"mpu6050: write user ctrl register failed.\n");
393 handle->
debug_print(
"mpu6050: write int enable register failed.\n");
400 handle->
debug_print(
"mpu6050: write fifo enable register failed.\n");
414static uint16_t a_mpu6050_inv_row_2_scale(int8_t *row)
456static uint16_t a_mpu6050_inv_orientation_matrix_to_scalar(int8_t *mtx)
460 scalar = a_mpu6050_inv_row_2_scale(mtx);
461 scalar |= a_mpu6050_inv_row_2_scale(mtx + 3) << 3;
462 scalar |= a_mpu6050_inv_row_2_scale(mtx + 6) << 6;
472static void a_mpu6050_dmp_decode_gesture(
mpu6050_handle_t *handle, uint8_t gesture[4])
477 orient = gesture[3] & 0xC0;
478 tap = 0x3F & gesture[3];
481 uint8_t direction, count;
483 direction = tap >> 3;
484 count = (tap % 8) + 1;
508static uint8_t a_mpu6050_get_accel_prod_shift(
mpu6050_handle_t *handle,
float *st_shift)
512 uint8_t shift_code[3];
521 shift_code[0] = ((tmp[0] & 0xE0) >> 3) | ((tmp[3] & 0x30) >> 4);
522 shift_code[1] = ((tmp[1] & 0xE0) >> 3) | ((tmp[3] & 0x0C) >> 2);
523 shift_code[2] = ((tmp[2] & 0xE0) >> 3) | (tmp[3] & 0x03);
524 for (i = 0; i < 3; i++)
533 while ((--shift_code[i]) != 0)
535 st_shift[i] *= 1.034f;
552static uint8_t a_mpu6050_accel_self_test(
mpu6050_handle_t *handle, int32_t *bias_regular, int32_t *bias_st)
554 uint8_t j, result = 0;
555 float st_shift[3], st_shift_cust, st_shift_var;
557 if (a_mpu6050_get_accel_prod_shift(handle, st_shift) != 0)
561 for (j = 0; j < 3; j++)
563 st_shift_cust = labs(bias_regular[j] - bias_st[j]) / 65536.f;
564 if (fabsf(st_shift[j] - 0.0f) > 1e-6f)
566 st_shift_var = st_shift_cust / st_shift[j] - 1.f;
567 if (fabs(st_shift_var) > 0.14f)
572 else if ((st_shift_cust < 0.3f) || (st_shift_cust > 0.95f))
595static uint8_t a_mpu6050_gyro_self_test(
mpu6050_handle_t *handle, int32_t *bias_regular, int32_t *bias_st)
598 uint8_t j, result = 0;
600 float st_shift, st_shift_cust, st_shift_var;
611 for (j = 0; j < 3; j++)
613 st_shift_cust = labs(bias_regular[j] - bias_st[j]) / 65536.f;
616 st_shift = 3275.f / (32768 / 250);
617 while ((--tmp[j]) != 0)
621 st_shift_var = st_shift_cust / st_shift - 1.f;
622 if (fabs(st_shift_var) > 0.14f)
627 else if ((st_shift_cust < 10.0f) || (st_shift_cust > 105.0f))
652 int32_t gyro_offset[3], int32_t accel_offset[3],
653 uint8_t hw_test_enable)
696 data[0] = 1 << 3 | 1 << 2;
715 if (hw_test_enable != 0)
717 data[0] = 0x00 | 0xE0;
728 if (hw_test_enable != 0)
730 data[0] = 0x18 | 0xE0;
741 if (hw_test_enable != 0)
771 cnt = ((uint16_t)data[0] << 8) | data[1];
780 for (i = 0; i < pack_cnt; i++)
782 int16_t accel_cur[3];
791 accel_cur[0] = ((int16_t)data[0] << 8) | data[1];
792 accel_cur[1] = ((int16_t)data[2] << 8) | data[3];
793 accel_cur[2] = ((int16_t)data[4] << 8) | data[5];
794 accel_offset[0] += (int32_t)accel_cur[0];
795 accel_offset[1] += (int32_t)accel_cur[1];
796 accel_offset[2] += (int32_t)accel_cur[2];
797 gyro_cur[0] = (((int16_t)data[6] << 8) | data[7]);
798 gyro_cur[1] = (((int16_t)data[8] << 8) | data[9]);
799 gyro_cur[2] = (((int16_t)data[10] << 8) | data[11]);
800 gyro_offset[0] += (int32_t)gyro_cur[0];
801 gyro_offset[1] += (int32_t)gyro_cur[1];
802 gyro_offset[2] += (int32_t)gyro_cur[2];
805 gyro_offset[0] = (int32_t)(((int64_t)gyro_offset[0] << 16) / (32768 / 250) / pack_cnt);
806 gyro_offset[1] = (int32_t)(((int64_t)gyro_offset[1] << 16) / (32768 / 250) / pack_cnt);
807 gyro_offset[2] = (int32_t)(((int64_t)gyro_offset[2] << 16) / (32768 / 250) / pack_cnt);
808 accel_offset[0] = (int32_t)(((int64_t)accel_offset[0] << 16) / (32768 / 16) / pack_cnt);
809 accel_offset[1] = (int32_t)(((int64_t)accel_offset[1] << 16) / (32768 / 16) / pack_cnt);
810 accel_offset[2] = (int32_t)(((int64_t)accel_offset[2] << 16) / (32768 / 16) / pack_cnt);
811 if (accel_offset[2] > 0L)
813 accel_offset[2] -= 65536L;
817 accel_offset[2] += 65536L;
861 for (i = 0; i < size; i += this_write)
863 this_write =
MIN(16, size - i);
865 res = a_mpu6050_write_mem(handle, i, (uint8_t *)(gs_mpu6050_dmp_code + i),
869 handle->
debug_print(
"mpu6050: write mem failed.\n");
873 res = a_mpu6050_read_mem(handle, i, cur, this_write);
876 handle->
debug_print(
"mpu6050: read mem failed.\n");
880 if (memcmp(gs_mpu6050_dmp_code + i, cur, this_write) != 0)
882 handle->
debug_print(
"mpu6050: code compare error.\n");
887 tmp[0] = (0x0400 >> 8) & 0xFF;
888 tmp[1] = (0x0400 >> 0) & 0xFF;
891 (uint8_t *)tmp, 2) != 0)
893 handle->
debug_print(
"mpu6050: set program start failed.\n");
929 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
935 tmp[0] = (uint8_t)((ms >> 24) & 0xFF);
936 tmp[1] = (uint8_t)((ms >> 16) & 0xFF);
937 tmp[2] = (uint8_t)((ms >> 8) & 0xFF);
938 tmp[3] = (uint8_t)(ms & 0xFF);
943 handle->
debug_print(
"mpu6050: write mem failed.\n");
978 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
986 handle->
debug_print(
"mpu6050: read mem failed.\n");
990 *ms = (((uint32_t)tmp[0] << 24) | ((uint32_t)tmp[1] << 16) |
991 ((uint32_t)tmp[2] << 8) | tmp[3]) * 20;
1023 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1028 tmp[0] = (uint8_t)((count >> 24) & 0xFF);
1029 tmp[1] = (uint8_t)((count >> 16) & 0xFF);
1030 tmp[2] = (uint8_t)((count >> 8) & 0xFF);
1031 tmp[3] = (uint8_t)(count & 0xFF);
1036 handle->
debug_print(
"mpu6050: write mem failed.\n");
1071 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1079 handle->
debug_print(
"mpu6050: read mem failed.\n");
1083 *count = (((uint32_t)tmp[0] << 24) | ((uint32_t)tmp[1] << 16) |
1084 ((uint32_t)tmp[2] << 8) | tmp[3]);
1116 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1122 tmp[0] = (ms >> 8) & 0xFF;
1123 tmp[1] = (ms >> 0) & 0xFF;
1128 handle->
debug_print(
"mpu6050: write mem failed.\n");
1163 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1171 handle->
debug_print(
"mpu6050: read mem failed.\n");
1175 *ms = (uint16_t)((uint16_t)tmp[0] << 8) | tmp[1];
1208 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1214 tmp[0] = (ms >> 8) & 0xFF;
1215 tmp[1] = (ms >> 0) & 0xFF;
1220 handle->
debug_print(
"mpu6050: write mem failed.\n");
1255 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1263 handle->
debug_print(
"mpu6050: read mem failed.\n");
1267 *ms = (uint16_t)((uint16_t)tmp[0] << 8) | tmp[1];
1289 uint32_t thresh_scaled;
1301 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1307 tmp[0] = (uint8_t)(((uint32_t)thresh_scaled >> 24) & 0xFF);
1308 tmp[1] = (uint8_t)(((uint32_t)thresh_scaled >> 16) & 0xFF);
1309 tmp[2] = (uint8_t)(((uint32_t)thresh_scaled >> 8) & 0xFF);
1310 tmp[3] = (uint8_t)((uint32_t)thresh_scaled & 0xFF);
1315 handle->
debug_print(
"mpu6050: write mem failed.\n");
1339 uint32_t thresh_scaled;
1351 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1359 handle->
debug_print(
"mpu6050: read mem failed.\n");
1363 thresh_scaled = (((uint32_t)tmp[0] << 24) | ((uint32_t)tmp[1] << 16) |
1364 ((uint32_t)tmp[2] << 8) | tmp[3]);
1365 *dps = (uint16_t)((
float)(thresh_scaled) /
1398 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1404 tmp[0] = (ms >> 8) & 0xFF;
1405 tmp[1] = (ms >> 0) & 0xFF;
1410 handle->
debug_print(
"mpu6050: write mem failed.\n");
1445 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1453 handle->
debug_print(
"mpu6050: read mem failed.\n");
1457 *ms = (uint16_t)((uint16_t)tmp[0] << 8) | tmp[1];
1490 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1496 tmp[0] = (ms >> 8) & 0xFF;
1497 tmp[1] = (ms >> 0) & 0xFF;
1502 handle->
debug_print(
"mpu6050: write mem failed.\n");
1537 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1545 handle->
debug_print(
"mpu6050: read mem failed.\n");
1549 *ms = (uint16_t)((uint16_t)tmp[0] << 8) | tmp[1];
1583 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1587 if ((cnt < 1) || (cnt > 4))
1589 handle->
debug_print(
"mpu6050: cnt must be between 1 and 4.\n");
1598 handle->
debug_print(
"mpu6050: write mem failed.\n");
1633 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1641 handle->
debug_print(
"mpu6050: read mem failed.\n");
1676 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1683 uint8_t regs[9] = {0xb8, 0xaa, 0xb3, 0x8d, 0xb4, 0x98, 0x0d, 0x35, 0x5d};
1688 handle->
debug_print(
"mpu6050: write mem failed.\n");
1698 uint8_t regs[9] = {0xb8, 0xaa, 0xaa, 0xaa, 0xb0, 0x88, 0xc3, 0xc5, 0xc7};
1703 handle->
debug_print(
"mpu6050: write mem failed.\n");
1739 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1746 uint8_t regs[4] = {0xC0, 0xC2, 0xC4, 0xC6};
1751 handle->
debug_print(
"mpu6050: write mem failed.\n");
1755 res = a_mpu6050_reset_fifo(handle);
1758 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
1768 uint8_t regs[4] = {0x8B, 0x8B, 0x8B, 0x8B};
1773 handle->
debug_print(
"mpu6050: write mem failed.\n");
1777 res = a_mpu6050_reset_fifo(handle);
1780 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
1816 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1823 uint8_t regs[4] = {0x20, 0x28, 0x30, 0x38};
1828 handle->
debug_print(
"mpu6050: write mem failed.\n");
1832 res = a_mpu6050_reset_fifo(handle);
1835 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
1845 uint8_t regs[4] = {0xA3, 0xA3, 0xA3, 0xA3};
1850 handle->
debug_print(
"mpu6050: write mem failed.\n");
1854 res = a_mpu6050_reset_fifo(handle);
1857 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
1893 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1900 uint8_t regs_continuous[11] = {0xd8, 0xb1, 0xb9,
1906 (uint8_t *)regs_continuous, 11);
1909 handle->
debug_print(
"mpu6050: write mem failed.\n");
1918 uint8_t regs_gesture[11] = {0xda, 0xb1, 0xb9,
1924 (uint8_t *)regs_gesture, 11);
1927 handle->
debug_print(
"mpu6050: write mem failed.\n");
1952 int32_t gyro_bias_body[3];
1964 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
1969 gyro_bias_body[0] = bias[handle->
orient & 3];
1970 if ((handle->
orient & 4) != 0)
1972 gyro_bias_body[0] *= -1;
1974 gyro_bias_body[1] = bias[(handle->
orient >> 3) & 3];
1975 if ((handle->
orient & 0x20) != 0)
1977 gyro_bias_body[1] *= -1;
1979 gyro_bias_body[2] = bias[(handle->
orient >> 6) & 3];
1980 if ((handle->
orient & 0x100) != 0)
1982 gyro_bias_body[2] *= -1;
1989 regs[0] = (uint8_t)((gyro_bias_body[0] >> 24) & 0xFF);
1990 regs[1] = (uint8_t)((gyro_bias_body[0] >> 16) & 0xFF);
1991 regs[2] = (uint8_t)((gyro_bias_body[0] >> 8) & 0xFF);
1992 regs[3] = (uint8_t)(gyro_bias_body[0] & 0xFF);
1996 handle->
debug_print(
"mpu6050: write mem failed.\n");
2000 regs[0] = (uint8_t)((gyro_bias_body[1] >> 24) & 0xFF);
2001 regs[1] = (uint8_t)((gyro_bias_body[1] >> 16) & 0xFF);
2002 regs[2] = (uint8_t)((gyro_bias_body[1] >> 8) & 0xFF);
2003 regs[3] = (uint8_t)(gyro_bias_body[1] & 0xFF);
2007 handle->
debug_print(
"mpu6050: write mem failed.\n");
2011 regs[0] = (uint8_t)((gyro_bias_body[2] >> 24) & 0xFF);
2012 regs[1] = (uint8_t)((gyro_bias_body[2] >> 16) & 0xFF);
2013 regs[2] = (uint8_t)((gyro_bias_body[2] >> 8) & 0xFF);
2014 regs[3] = (uint8_t)(gyro_bias_body[2] & 0xFF);
2018 handle->
debug_print(
"mpu6050: write mem failed.\n");
2043 int32_t accel_bias_body[3];
2057 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2065 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
2069 range = ((prev >> 3) & 0x3);
2072 accel_sf = (int64_t)16384 << 15;
2074 else if (range == 1)
2076 accel_sf = (int64_t)8192 << 15;
2078 else if (range == 2)
2080 accel_sf = (int64_t)4096 << 15;
2084 accel_sf = (int64_t)2048 << 15;
2087 accel_bias_body[0] = bias[handle->
orient & 3];
2088 if ((handle->
orient & 4) != 0)
2090 accel_bias_body[0] *= -1;
2092 accel_bias_body[1] = bias[(handle->
orient >> 3) & 3];
2093 if ((handle->
orient & 0x20) != 0)
2095 accel_bias_body[1] *= -1;
2097 accel_bias_body[2] = bias[(handle->
orient >> 6) & 3];
2098 if ((handle->
orient & 0x100) != 0)
2100 accel_bias_body[2] *= -1;
2103 accel_bias_body[0] = (int32_t)(((int64_t)accel_bias_body[0] * accel_sf) >> 30);
2104 accel_bias_body[1] = (int32_t)(((int64_t)accel_bias_body[1] * accel_sf) >> 30);
2105 accel_bias_body[2] = (int32_t)(((int64_t)accel_bias_body[2] * accel_sf) >> 30);
2106 regs[0] = (uint8_t)((accel_bias_body[0] >> 24) & 0xFF);
2107 regs[1] = (uint8_t)((accel_bias_body[0] >> 16) & 0xFF);
2108 regs[2] = (uint8_t)((accel_bias_body[0] >> 8) & 0xFF);
2109 regs[3] = (uint8_t)(accel_bias_body[0] & 0xFF);
2110 regs[4] = (uint8_t)((accel_bias_body[1] >> 24) & 0xFF);
2111 regs[5] = (uint8_t)((accel_bias_body[1] >> 16) & 0xFF);
2112 regs[6] = (uint8_t)((accel_bias_body[1] >> 8) & 0xFF);
2113 regs[7] = (uint8_t)(accel_bias_body[1] & 0xFF);
2114 regs[8] = (uint8_t)((accel_bias_body[2] >> 24) & 0xFF);
2115 regs[9] = (uint8_t)((accel_bias_body[2] >> 16) & 0xFF);
2116 regs[10] = (uint8_t)((accel_bias_body[2] >> 8) & 0xFF);
2117 regs[11] = (uint8_t)(accel_bias_body[2] & 0xFF);
2121 handle->
debug_print(
"mpu6050: write mem failed.\n");
2143 uint8_t gyro_axes[4] = {0x4C, 0xCD, 0x6C, 0x00};
2144 uint8_t accel_axes[4] = {0x0C, 0xC9, 0x2C, 0x00 };
2145 uint8_t gyro_sign[4] = {0x36, 0x56, 0x76, 0x00 };
2146 uint8_t accel_sign[4] = {0x26, 0x46, 0x66, 0x00 };
2148 uint8_t gyro_regs[3];
2149 uint8_t accel_regs[3];
2162 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2167 orient = a_mpu6050_inv_orientation_matrix_to_scalar(mat);
2168 gyro_regs[0] = gyro_axes[orient & 3];
2169 gyro_regs[1] = gyro_axes[(orient >> 3) & 3];
2170 gyro_regs[2] = gyro_axes[(orient >> 6) & 3];
2171 accel_regs[0] = accel_axes[orient & 3];
2172 accel_regs[1] = accel_axes[(orient >> 3) & 3];
2173 accel_regs[2] = accel_axes[(orient >> 6) & 3];
2175 (uint8_t *)gyro_regs, 3);
2178 handle->
debug_print(
"mpu6050: write mem failed.\n");
2183 (uint8_t *)accel_regs, 3);
2186 handle->
debug_print(
"mpu6050: write mem failed.\n");
2191 memcpy(gyro_regs, gyro_sign, 3);
2192 memcpy(accel_regs, accel_sign, 3);
2193 if ((orient & 4) != 0)
2198 if ((orient & 0x20) != 0)
2203 if ((orient & 0x100) != 0)
2209 (uint8_t *)gyro_regs, 3);
2212 handle->
debug_print(
"mpu6050: write mem failed.\n");
2217 (uint8_t *)accel_regs, 3);
2220 handle->
debug_print(
"mpu6050: write mem failed.\n");
2260 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2272 handle->
debug_print(
"mpu6050: write mem failed.\n");
2308 handle->
debug_print(
"mpu6050: write mem failed.\n");
2324 handle->
debug_print(
"mpu6050: write mem failed.\n");
2331 uint8_t regs[9] = {0xb8, 0xaa, 0xb3, 0x8d, 0xb4, 0x98, 0x0d, 0x35, 0x5d};
2336 handle->
debug_print(
"mpu6050: write mem failed.\n");
2343 uint8_t regs[9] = {0xb8, 0xaa, 0xaa, 0xaa, 0xb0, 0x88, 0xc3, 0xc5, 0xc7};
2348 handle->
debug_print(
"mpu6050: write mem failed.\n");
2373 handle->
debug_print(
"mpu6050: write mem failed.\n");
2384 uint32_t thresh_scaled;
2386 uint16_t dmp_thresh;
2387 uint16_t dmp_thresh_2;
2388 float scaled_thresh;
2394 handle->
debug_print(
"mpu6050: write mem failed.\n");
2401 (uint8_t *)&prev, 1);
2404 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
2408 range = ((prev >> 3) & 0x3);
2411 dmp_thresh = (uint16_t)(scaled_thresh * 16384);
2412 dmp_thresh_2 = (uint16_t)(scaled_thresh * 12288);
2414 else if (range == 1)
2416 dmp_thresh = (uint16_t)(scaled_thresh * 8192);
2417 dmp_thresh_2 = (uint16_t)(scaled_thresh * 6144);
2419 else if (range == 2)
2421 dmp_thresh = (uint16_t)(scaled_thresh * 4096);
2422 dmp_thresh_2 = (uint16_t)(scaled_thresh * 3072);
2426 dmp_thresh = (uint16_t)(scaled_thresh * 2048);
2427 dmp_thresh_2 = (uint16_t)(scaled_thresh * 1536);
2429 tmp[0] = (uint8_t)(dmp_thresh >> 8);
2430 tmp[1] = (uint8_t)(dmp_thresh & 0xFF);
2431 tmp[2] = (uint8_t)(dmp_thresh_2 >> 8);
2432 tmp[3] = (uint8_t)(dmp_thresh_2 & 0xFF);
2437 handle->
debug_print(
"mpu6050: write mem failed.\n");
2444 handle->
debug_print(
"mpu6050: write mem failed.\n");
2452 handle->
debug_print(
"mpu6050: write mem failed.\n");
2459 handle->
debug_print(
"mpu6050: write mem failed.\n");
2467 handle->
debug_print(
"mpu6050: write mem failed.\n");
2474 handle->
debug_print(
"mpu6050: write mem failed.\n");
2483 handle->
debug_print(
"mpu6050: write mem failed.\n");
2492 handle->
debug_print(
"mpu6050: write mem failed.\n");
2499 tmp[0] = (ms >> 8) & 0xFF;
2500 tmp[1] = (ms >> 0) & 0xFF;
2505 handle->
debug_print(
"mpu6050: write mem failed.\n");
2512 tmp[0] = (ms >> 8) & 0xFF;
2513 tmp[1] = (ms >> 0) & 0xFF;
2518 handle->
debug_print(
"mpu6050: write mem failed.\n");
2525 tmp[0] = (uint8_t)(((uint32_t)thresh_scaled >> 24) & 0xFF);
2526 tmp[1] = (uint8_t)(((uint32_t)thresh_scaled >> 16) & 0xFF);
2527 tmp[2] = (uint8_t)(((uint32_t)thresh_scaled >> 8) & 0xFF);
2528 tmp[3] = (uint8_t)((uint32_t)thresh_scaled & 0xFF);
2533 handle->
debug_print(
"mpu6050: write mem failed.\n");
2540 tmp[0] = (ms >> 8) & 0xFF;
2541 tmp[1] = (ms >> 0) & 0xFF;
2546 handle->
debug_print(
"mpu6050: write mem failed.\n");
2553 tmp[0] = (ms >> 8) & 0xFF;
2554 tmp[1] = (ms >> 0) & 0xFF;
2559 handle->
debug_print(
"mpu6050: write mem failed.\n");
2570 handle->
debug_print(
"mpu6050: write mem failed.\n");
2587 handle->
debug_print(
"mpu6050: write mem failed.\n");
2594 uint8_t regs[4] = {0xC0, 0xC2, 0xC4, 0xC6};
2599 handle->
debug_print(
"mpu6050: write mem failed.\n");
2603 res = a_mpu6050_reset_fifo(handle);
2606 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
2613 uint8_t regs[4] = {0x8B, 0x8B, 0x8B, 0x8B};
2618 handle->
debug_print(
"mpu6050: write mem failed.\n");
2622 res = a_mpu6050_reset_fifo(handle);
2625 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
2633 uint8_t regs[4] = {0x20, 0x28, 0x30, 0x38};
2638 handle->
debug_print(
"mpu6050: write mem failed.\n");
2642 res = a_mpu6050_reset_fifo(handle);
2645 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
2652 uint8_t regs[4] = {0xA3, 0xA3, 0xA3, 0xA3};
2657 handle->
debug_print(
"mpu6050: write mem failed.\n");
2661 res = a_mpu6050_reset_fifo(handle);
2664 handle->
debug_print(
"mpu6050: reset fifo failed.\n");
2672 return a_mpu6050_reset_fifo(handle);
2690 uint8_t regs_end[12] = {0xFE, 0xF2, 0xAB,
2708 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2720 tmp[0] = (uint8_t)((d >> 8) & 0xFF);
2721 tmp[1] = (uint8_t)(d & 0xFF);
2726 handle->
debug_print(
"mpu6050: write mem failed.\n");
2731 (uint8_t *)regs_end, 12);
2734 handle->
debug_print(
"mpu6050: write mem failed.\n");
2770 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2778 handle->
debug_print(
"mpu6050: read mem failed.\n");
2782 d = (uint16_t)tmp[0] << 8 | tmp[1];
2817 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2825 handle->
debug_print(
"mpu6050: read mem failed.\n");
2829 pos = (uint8_t)((axis - 5) * 2);
2841 handle->
debug_print(
"mpu6050: write mem failed.\n");
2878 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2886 handle->
debug_print(
"mpu6050: read mem failed.\n");
2890 pos = (uint8_t)((axis - 5) * 2);
2891 if (((tmp >> pos) & 0x3) == 0x3)
2924 uint16_t dmp_thresh;
2925 uint16_t dmp_thresh_2;
2926 float scaled_thresh;
2938 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
2951 (uint8_t *)&prev, 1);
2954 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
2958 range = ((prev >> 3) & 0x3);
2961 dmp_thresh = (uint16_t)(scaled_thresh * 16384);
2962 dmp_thresh_2 = (uint16_t)(scaled_thresh * 12288);
2964 else if (range == 1)
2966 dmp_thresh = (uint16_t)(scaled_thresh * 8192);
2967 dmp_thresh_2 = (uint16_t)(scaled_thresh * 6144);
2969 else if (range == 2)
2971 dmp_thresh = (uint16_t)(scaled_thresh * 4096);
2972 dmp_thresh_2 = (uint16_t)(scaled_thresh * 3072);
2976 dmp_thresh = (uint16_t)(scaled_thresh * 2048);
2977 dmp_thresh_2 = (uint16_t)(scaled_thresh * 1536);
2979 tmp[0] = (uint8_t)(dmp_thresh >> 8);
2980 tmp[1] = (uint8_t)(dmp_thresh & 0xFF);
2981 tmp[2] = (uint8_t)(dmp_thresh_2 >> 8);
2982 tmp[3] = (uint8_t)(dmp_thresh_2 & 0xFF);
2989 handle->
debug_print(
"mpu6050: write mem failed.\n");
2996 handle->
debug_print(
"mpu6050: write mem failed.\n");
3008 handle->
debug_print(
"mpu6050: write mem failed.\n");
3015 handle->
debug_print(
"mpu6050: write mem failed.\n");
3027 handle->
debug_print(
"mpu6050: write mem failed.\n");
3034 handle->
debug_print(
"mpu6050: write mem failed.\n");
3069 uint16_t dmp_thresh;
3070 float scaled_thresh;
3082 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
3092 handle->
debug_print(
"mpu6050: read mem failed.\n");
3102 handle->
debug_print(
"mpu6050: read mem failed.\n");
3112 handle->
debug_print(
"mpu6050: read mem failed.\n");
3123 dmp_thresh = (uint16_t)tmp[0] << 8 | tmp[1];
3126 (uint8_t *)&prev, 1);
3129 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
3133 range = ((prev >> 3) & 0x3);
3136 scaled_thresh = dmp_thresh / 16384.0f;
3138 else if (range == 1)
3140 scaled_thresh = dmp_thresh / 8192.0f;
3142 else if (range == 2)
3144 scaled_thresh = dmp_thresh / 4096.0f;
3148 scaled_thresh = dmp_thresh / 2048.0f;
3180 int16_t (*accel_raw)[3],
float (*accel_g)[3],
3181 int16_t (*gyro_raw)[3],
float (*gyro_dps)[3],
3183 float *pitch,
float *roll,
float *yaw,
3205 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
3213 handle->
debug_print(
"mpu6050: read int status failed.\n");
3220 (void)a_mpu6050_reset_fifo(handle);
3252 handle->
debug_print(
"mpu6050: read fifo count failed.\n");
3256 count = (uint16_t)(((uint16_t)buf[0] << 8) | buf[1]);
3257 count = (count < 1024) ? count : 1024;
3258 count = (count < (*l) * len) ? count : ((*l) *len);
3259 count = (count / len) * len;
3270 handle->
debug_print(
"mpu6050: fifo data is too little.\n");
3275 for (j = 0; j < (*l); j++)
3279 int32_t quat_q14[4];
3280 int32_t quat_mag_sq;
3281 float q0=1.0f, q1=0.0f, q2=0.0f, q3=0.0f;
3284 quat[j][0] = ((int32_t)handle->
buf[0 + len * j] << 24) | ((int32_t)handle->
buf[1 + len * j] << 16) |
3285 ((int32_t)handle->
buf[2 + len * j] << 8) | handle->
buf[3 + len * j];
3286 quat[j][1] = ((int32_t)handle->
buf[4 + len * j] << 24) | ((int32_t)handle->
buf[5 + len * j] << 16) |
3287 ((int32_t)handle->
buf[6 + len * j] << 8) | handle->
buf[7 + len * j];
3288 quat[j][2] = ((int32_t)handle->
buf[8 + len * j] << 24) | ((int32_t)handle->
buf[9 + len * j] << 16) |
3289 ((int32_t)handle->
buf[10 + len * j] << 8) | handle->
buf[11 + len * j];
3290 quat[j][3] = ((int32_t)handle->
buf[12 + len * j] << 24) | ((int32_t)handle->
buf[13 + len * j] << 16) |
3291 ((int32_t)handle->
buf[14 + len * j] << 8) | handle->
buf[15 + len * j];
3294 quat_q14[0] = quat[j][0] >> 16;
3295 quat_q14[1] = quat[j][1] >> 16;
3296 quat_q14[2] = quat[j][2] >> 16;
3297 quat_q14[3] = quat[j][3] >> 16;
3298 quat_mag_sq = quat_q14[0] * quat_q14[0] + quat_q14[1] * quat_q14[1] +
3299 quat_q14[2] * quat_q14[2] + quat_q14[3] * quat_q14[3];
3303 handle->
debug_print(
"mpu6050: quat check error.\n");
3304 (void)a_mpu6050_reset_fifo(handle);
3308 q0 = quat[j][0] / 1073741824.0f;
3309 q1 = quat[j][1] / 1073741824.0f;
3310 q2 = quat[j][2] / 1073741824.0f;
3311 q3 = quat[j][3] / 1073741824.0f;
3312 pitch[j] = asinf(-2 * q1 * q3 + 2 * q0* q2)* 57.3f;
3313 roll[j] = atan2f(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2 * q2 + 1)* 57.3f;
3314 yaw[j] = atan2f(2 * (q1 * q2 + q0 * q3), q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3) * 57.3f;
3330 accel_raw[j][0] = ((int16_t)handle->
buf[i + 0 + len * j] << 8) | handle->
buf[i + 1 + len * j];
3331 accel_raw[j][1] = ((int16_t)handle->
buf[i + 2 + len * j] << 8) | handle->
buf[i + 3 + len * j];
3332 accel_raw[j][2] = ((int16_t)handle->
buf[i + 4 + len * j] << 8) | handle->
buf[i + 5 + len * j];
3338 handle->
debug_print(
"mpu6050: read accel config failed.\n");
3342 accel_conf = (accel_conf >> 3) & 0x3;
3343 if (accel_conf == 0)
3345 accel_g[j][0] = (float)(accel_raw[j][0]) / 16384.0f;
3346 accel_g[j][1] = (float)(accel_raw[j][1]) / 16384.0f;
3347 accel_g[j][2] = (float)(accel_raw[j][2]) / 16384.0f;
3349 else if (accel_conf == 1)
3351 accel_g[j][0] = (float)(accel_raw[j][0]) / 8192.0f;
3352 accel_g[j][1] = (float)(accel_raw[j][1]) / 8192.0f;
3353 accel_g[j][2] = (float)(accel_raw[j][2]) / 8192.0f;
3355 else if (accel_conf == 2)
3357 accel_g[j][0] = (float)(accel_raw[j][0]) / 4096.0f;
3358 accel_g[j][1] = (float)(accel_raw[j][1]) / 4096.0f;
3359 accel_g[j][2] = (float)(accel_raw[j][2]) / 4096.0f;
3363 accel_g[j][0] = (float)(accel_raw[j][0]) / 2048.0f;
3364 accel_g[j][1] = (float)(accel_raw[j][1]) / 2048.0f;
3365 accel_g[j][2] = (float)(accel_raw[j][2]) / 2048.0f;
3370 accel_raw[j][0] = 0;
3371 accel_raw[j][1] = 0;
3372 accel_raw[j][2] = 0;
3373 accel_g[j][0] = 0.0f;
3374 accel_g[j][1] = 0.0f;
3375 accel_g[j][2] = 0.0f;
3381 gyro_raw[j][0] = ((int16_t)handle->
buf[i + 0 + len * j] << 8) | handle->
buf[i + 1 + len * j];
3382 gyro_raw[j][1] = ((int16_t)handle->
buf[i + 2 + len * j] << 8) | handle->
buf[i + 3 + len * j];
3383 gyro_raw[j][2] = ((int16_t)handle->
buf[i + 4 + len * j] << 8) | handle->
buf[i + 5 + len * j];
3389 handle->
debug_print(
"mpu6050: read gyro config failed.\n");
3393 gyro_conf = (gyro_conf >> 3) & 0x3;
3396 gyro_dps[j][0] = (float)(gyro_raw[j][0]) / 131.0f;
3397 gyro_dps[j][1] = (float)(gyro_raw[j][1]) / 131.0f;
3398 gyro_dps[j][2] = (float)(gyro_raw[j][2]) / 131.0f;
3400 else if (gyro_conf == 1)
3402 gyro_dps[j][0] = (float)(gyro_raw[j][0]) / 65.5f;
3403 gyro_dps[j][1] = (float)(gyro_raw[j][1]) / 65.5f;
3404 gyro_dps[j][2] = (float)(gyro_raw[j][2]) / 65.5f;
3406 else if (gyro_conf == 2)
3408 gyro_dps[j][0] = (float)(gyro_raw[j][0]) / 32.8f;
3409 gyro_dps[j][1] = (float)(gyro_raw[j][1]) / 32.8f;
3410 gyro_dps[j][2] = (float)(gyro_raw[j][2]) / 32.8f;
3414 gyro_dps[j][0] = (float)(gyro_raw[j][0]) / 16.4f;
3415 gyro_dps[j][1] = (float)(gyro_raw[j][1]) / 16.4f;
3416 gyro_dps[j][2] = (float)(gyro_raw[j][2]) / 16.4f;
3424 gyro_dps[j][0] = 0.0f;
3425 gyro_dps[j][1] = 0.0f;
3426 gyro_dps[j][2] = 0.0f;
3430 a_mpu6050_dmp_decode_gesture(handle, handle->
buf + i + len * j);
3461 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
3495 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
3532 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
3540 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
3545 prev |= enable << 7;
3549 handle->
debug_print(
"mpu6050: write user ctrl failed.\n");
3573 int32_t gyro_offset_raw[3], int32_t accel_offset_raw[3],
3574 int32_t gyro_offset[3], int32_t accel_offset[3])
3590 handle->
debug_print(
"mpu6050: dmp is not inited.\n");
3598 handle->
debug_print(
"mpu6050: read accel config failed.\n");
3605 handle->
debug_print(
"mpu6050: read gyro config failed.\n");
3609 accel_conf = (accel_conf >> 3) & 0x3;
3610 gyro_conf = (gyro_conf >> 3) & 0x3;
3611 if (accel_conf == 0)
3613 accel_offset[0] = (int32_t)(accel_offset_raw[0] * 16384.0f);
3614 accel_offset[1] = (int32_t)(accel_offset_raw[1] * 16384.0f);
3615 accel_offset[2] = (int32_t)(accel_offset_raw[2] * 16384.0f);
3617 else if (accel_conf == 1)
3619 accel_offset[0] = (int32_t)(accel_offset_raw[0] * 8192.0f);
3620 accel_offset[1] = (int32_t)(accel_offset_raw[1] * 8192.0f);
3621 accel_offset[2] = (int32_t)(accel_offset_raw[2] * 8192.0f);
3623 else if (accel_conf == 2)
3625 accel_offset[0] = (int32_t)(accel_offset_raw[0] * 4096.0f);
3626 accel_offset[1] = (int32_t)(accel_offset_raw[1] * 4096.0f);
3627 accel_offset[2] = (int32_t)(accel_offset_raw[2] * 4096.0f);
3631 accel_offset[0] = (int32_t)(accel_offset_raw[0] * 2048.0f);
3632 accel_offset[1] = (int32_t)(accel_offset_raw[1] * 2048.0f);
3633 accel_offset[2] = (int32_t)(accel_offset_raw[2] * 2048.0f);
3637 gyro_offset[0] = (int32_t)(gyro_offset_raw[0] * 131.f);
3638 gyro_offset[1] = (int32_t)(gyro_offset_raw[1] * 131.f);
3639 gyro_offset[2] = (int32_t)(gyro_offset_raw[2] * 131.f);
3641 else if (gyro_conf == 1)
3643 gyro_offset[0] = (int32_t)(gyro_offset_raw[0] * 65.5f);
3644 gyro_offset[1] = (int32_t)(gyro_offset_raw[1] * 65.5f);
3645 gyro_offset[2] = (int32_t)(gyro_offset_raw[2] * 65.5f);
3647 else if (gyro_conf == 2)
3649 gyro_offset[0] = (int32_t)(gyro_offset_raw[0] * 32.8f);
3650 gyro_offset[1] = (int32_t)(gyro_offset_raw[1] * 32.8f);
3651 gyro_offset[2] = (int32_t)(gyro_offset_raw[2] * 32.8f);
3655 gyro_offset[0] = (int32_t)(gyro_offset_raw[0] * 16.4f);
3656 gyro_offset[1] = (int32_t)(gyro_offset_raw[1] * 16.4f);
3657 gyro_offset[2] = (int32_t)(gyro_offset_raw[2] * 16.4f);
3679 handle->
iic_addr = (uint8_t)addr_pin;
3732 handle->
debug_print(
"mpu6050: iic_init is null.\n");
3738 handle->
debug_print(
"mpu6050: iic_deinit is null.\n");
3744 handle->
debug_print(
"mpu6050: iic_read is null.\n");
3750 handle->
debug_print(
"mpu6050: iic_write is null.\n");
3756 handle->
debug_print(
"mpu6050: delay_ms is null.\n");
3762 handle->
debug_print(
"mpu6050: receive_callback is null.\n");
3770 handle->
debug_print(
"mpu6050: iic init failed.\n");
3777 handle->
debug_print(
"mpu6050: read who am i failed.\n");
3794 handle->
debug_print(
"mpu6050: write pwr mgmt 1 failed.\n");
3800 while (timeout != 0)
3806 handle->
debug_print(
"mpu6050: read pwr mgmt 1 failed.\n");
3811 if ((prev & (1 << 7)) == 0)
3851 prev = (1 << 6) | (1 << 3) | (7 << 0);
3855 handle->
debug_print(
"mpu6050: write pwr mgmt 1 failed.\n");
3863 handle->
debug_print(
"mpu6050: iic deinit failed.\n");
3892 int16_t (*gyro_raw)[3],
float (*gyro_dps)[3], uint16_t *len)
3909 handle->
debug_print(
"mpu6050: length is zero.\n");
3915 handle->
debug_print(
"mpu6050: dmp is running.\n");
3923 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
3930 handle->
debug_print(
"mpu6050: read accel config failed.\n");
3937 handle->
debug_print(
"mpu6050: read gyro config failed.\n");
3941 accel_conf = (accel_conf >> 3) & 0x3;
3942 gyro_conf = (gyro_conf >> 3) & 0x3;
3943 if ((prev & (1 << 6)) != 0)
3953 handle->
debug_print(
"mpu6050: read fifo enable failed.\n");
3959 handle->
debug_print(
"mpu6050: fifo conf is error.\n");
3967 handle->
debug_print(
"mpu6050: read fifo count failed.\n");
3971 count = (uint16_t)(((uint16_t)buf[0] << 8) | buf[1]);
3972 count = (count < 1024) ? count : 1024;
3973 count = (count < ((*len) * 12)) ? count : ((*len) * 12);
3974 count = (count / 12) * 12;
3983 for (i = 0; i < (*len); i++)
3985 accel_raw[i][0] = (int16_t)((uint16_t)handle->
buf[i * 12 + 0] << 8) |
3986 handle->
buf[i * 12 + 1];
3987 accel_raw[i][1] = (int16_t)((uint16_t)handle->
buf[i * 12 + 2] << 8) |
3988 handle->
buf[i * 12 + 3];
3989 accel_raw[i][2] = (int16_t)((uint16_t)handle->
buf[i * 12 + 4] << 8) |
3990 handle->
buf[i * 12 + 5];
3991 gyro_raw[i][0] = (int16_t)((uint16_t)handle->
buf[i * 12 + 6] << 8) |
3992 handle->
buf[i * 12 + 7];
3993 gyro_raw[i][1] = (int16_t)((uint16_t)handle->
buf[i * 12 + 8] << 8) |
3994 handle->
buf[i * 12 + 9];
3995 gyro_raw[i][2] = (int16_t)((uint16_t)handle->
buf[i * 12 + 10] << 8) |
3996 handle->
buf[i * 12 + 11];
3998 if (accel_conf == 0)
4000 accel_g[i][0] = (float)(accel_raw[i][0]) / 16384.0f;
4001 accel_g[i][1] = (float)(accel_raw[i][1]) / 16384.0f;
4002 accel_g[i][2] = (float)(accel_raw[i][2]) / 16384.0f;
4004 else if (accel_conf == 1)
4006 accel_g[i][0] = (float)(accel_raw[i][0]) / 8192.0f;
4007 accel_g[i][1] = (float)(accel_raw[i][1]) / 8192.0f;
4008 accel_g[i][2] = (float)(accel_raw[i][2]) / 8192.0f;
4010 else if (accel_conf == 2)
4012 accel_g[i][0] = (float)(accel_raw[i][0]) / 4096.0f;
4013 accel_g[i][1] = (float)(accel_raw[i][1]) / 4096.0f;
4014 accel_g[i][2] = (float)(accel_raw[i][2]) / 4096.0f;
4018 accel_g[i][0] = (float)(accel_raw[i][0]) / 2048.0f;
4019 accel_g[i][1] = (float)(accel_raw[i][1]) / 2048.0f;
4020 accel_g[i][2] = (float)(accel_raw[i][2]) / 2048.0f;
4025 gyro_dps[i][0] = (float)(gyro_raw[i][0]) / 131.0f;
4026 gyro_dps[i][1] = (float)(gyro_raw[i][1]) / 131.0f;
4027 gyro_dps[i][2] = (float)(gyro_raw[i][2]) / 131.0f;
4029 else if (gyro_conf == 1)
4031 gyro_dps[i][0] = (float)(gyro_raw[i][0]) / 65.5f;
4032 gyro_dps[i][1] = (float)(gyro_raw[i][1]) / 65.5f;
4033 gyro_dps[i][2] = (float)(gyro_raw[i][2]) / 65.5f;
4035 else if (gyro_conf == 2)
4037 gyro_dps[i][0] = (float)(gyro_raw[i][0]) / 32.8f;
4038 gyro_dps[i][1] = (float)(gyro_raw[i][1]) / 32.8f;
4039 gyro_dps[i][2] = (float)(gyro_raw[i][2]) / 32.8f;
4043 gyro_dps[i][0] = (float)(gyro_raw[i][0]) / 16.4f;
4044 gyro_dps[i][1] = (float)(gyro_raw[i][1]) / 16.4f;
4045 gyro_dps[i][2] = (float)(gyro_raw[i][2]) / 16.4f;
4061 accel_raw[0][0] = (int16_t)((uint16_t)handle->
buf[0] << 8) | handle->
buf[1];
4062 accel_raw[0][1] = (int16_t)((uint16_t)handle->
buf[2] << 8) | handle->
buf[3];
4063 accel_raw[0][2] = (int16_t)((uint16_t)handle->
buf[4] << 8) | handle->
buf[5];
4064 gyro_raw[0][0] = (int16_t)((uint16_t)handle->
buf[8] << 8) | handle->
buf[9];
4065 gyro_raw[0][1] = (int16_t)((uint16_t)handle->
buf[10] << 8) | handle->
buf[11];
4066 gyro_raw[0][2] = (int16_t)((uint16_t)handle->
buf[12] << 8) | handle->
buf[13];
4068 if (accel_conf == 0)
4070 accel_g[0][0] = (float)(accel_raw[0][0]) / 16384.0f;
4071 accel_g[0][1] = (float)(accel_raw[0][1]) / 16384.0f;
4072 accel_g[0][2] = (float)(accel_raw[0][2]) / 16384.0f;
4074 else if (accel_conf == 1)
4076 accel_g[0][0] = (float)(accel_raw[0][0]) / 8192.0f;
4077 accel_g[0][1] = (float)(accel_raw[0][1]) / 8192.0f;
4078 accel_g[0][2] = (float)(accel_raw[0][2]) / 8192.0f;
4080 else if (accel_conf == 2)
4082 accel_g[0][0] = (float)(accel_raw[0][0]) / 4096.0f;
4083 accel_g[0][1] = (float)(accel_raw[0][1]) / 4096.0f;
4084 accel_g[0][2] = (float)(accel_raw[0][2]) / 4096.0f;
4088 accel_g[0][0] = (float)(accel_raw[0][0]) / 2048.0f;
4089 accel_g[0][1] = (float)(accel_raw[0][1]) / 2048.0f;
4090 accel_g[0][2] = (float)(accel_raw[0][2]) / 2048.0f;
4095 gyro_dps[0][0] = (float)(gyro_raw[0][0]) / 131.0f;
4096 gyro_dps[0][1] = (float)(gyro_raw[0][1]) / 131.0f;
4097 gyro_dps[0][2] = (float)(gyro_raw[0][2]) / 131.0f;
4099 else if (gyro_conf == 1)
4101 gyro_dps[0][0] = (float)(gyro_raw[0][0]) / 65.5f;
4102 gyro_dps[0][1] = (float)(gyro_raw[0][1]) / 65.5f;
4103 gyro_dps[0][2] = (float)(gyro_raw[0][2]) / 65.5f;
4105 else if (gyro_conf == 2)
4107 gyro_dps[0][0] = (float)(gyro_raw[0][0]) / 32.8f;
4108 gyro_dps[0][1] = (float)(gyro_raw[0][1]) / 32.8f;
4109 gyro_dps[0][2] = (float)(gyro_raw[0][2]) / 32.8f;
4113 gyro_dps[0][0] = (float)(gyro_raw[0][0]) / 16.4f;
4114 gyro_dps[0][1] = (float)(gyro_raw[0][1]) / 16.4f;
4115 gyro_dps[0][2] = (float)(gyro_raw[0][2]) / 16.4f;
4155 *raw = (int16_t)((uint16_t)buf[0] << 8) | buf[1];
4156 *degrees = (float)(*raw) / 340.0f + 36.53f;
4188 handle->
debug_print(
"mpu6050: read int status failed.\n");
4205 (void)a_mpu6050_reset_fifo(handle);
4260 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4265 prev |= enable << 6;
4269 handle->
debug_print(
"mpu6050: write user ctrl failed.\n");
4305 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4337 res = a_mpu6050_reset_fifo(handle);
4340 handle->
debug_print(
"mpu6050: force reset fifo failed.\n");
4376 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4381 prev |= enable << 5;
4385 handle->
debug_print(
"mpu6050: write user ctrl failed.\n");
4421 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4457 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4466 handle->
debug_print(
"mpu6050: write user ctrl failed.\n");
4502 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4538 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4547 handle->
debug_print(
"mpu6050: write user ctrl failed.\n");
4583 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4619 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4628 handle->
debug_print(
"mpu6050: write user ctrl failed.\n");
4664 handle->
debug_print(
"mpu6050: read user ctrl failed.\n");
4700 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
4709 handle->
debug_print(
"mpu6050: write power management 1 failed.\n");
4746 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
4783 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
4787 prev &= ~(0x7 << 0);
4788 prev |= clock_source << 0;
4792 handle->
debug_print(
"mpu6050: write power management 1 failed.\n");
4828 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
4865 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
4870 prev |= (!enable) << 3;
4874 handle->
debug_print(
"mpu6050: write power management 1 failed.\n");
4910 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
4947 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
4952 prev |= enable << 5;
4956 handle->
debug_print(
"mpu6050: write power management 1 failed.\n");
4992 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
5029 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
5034 prev |= enable << 6;
5038 handle->
debug_print(
"mpu6050: write power management 1 failed.\n");
5074 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
5112 handle->
debug_print(
"mpu6050: read power management 2 failed.\n");
5116 prev &= ~(1 << source);
5117 prev |= enable << source;
5121 handle->
debug_print(
"mpu6050: write power management 2 failed.\n");
5158 handle->
debug_print(
"mpu6050: read power management 2 failed.\n");
5195 handle->
debug_print(
"mpu6050: read power management 2 failed.\n");
5199 prev &= ~(0x3 << 6);
5200 prev |= frequency << 6;
5204 handle->
debug_print(
"mpu6050: write power management 2 failed.\n");
5240 handle->
debug_print(
"mpu6050: read power management 2 failed.\n");
5277 handle->
debug_print(
"mpu6050: read fifo count failed.\n");
5281 *count = (uint16_t)(((uint16_t)buf[0] << 8) | buf[1]);
5314 handle->
debug_print(
"mpu6050: fifo read failed.\n");
5350 handle->
debug_print(
"mpu6050: fifo write failed.\n");
5386 handle->
debug_print(
"mpu6050: read signal path reset failed.\n");
5390 prev &= ~(1 << path);
5395 handle->
debug_print(
"mpu6050: write signal path reset failed.\n");
5430 handle->
debug_print(
"mpu6050: write smprt div failed.\n");
5465 handle->
debug_print(
"mpu6050: read smprt div failed.\n");
5501 handle->
debug_print(
"mpu6050: read config failed.\n");
5505 prev &= ~(0x7 << 3);
5510 handle->
debug_print(
"mpu6050: write config failed.\n");
5546 handle->
debug_print(
"mpu6050: read config failed.\n");
5583 handle->
debug_print(
"mpu6050: read config failed.\n");
5587 prev &= ~(0x7 << 0);
5588 prev |= filter << 0;
5592 handle->
debug_print(
"mpu6050: write config failed.\n");
5628 handle->
debug_print(
"mpu6050: read config failed.\n");
5666 handle->
debug_print(
"mpu6050: read gyroscope config failed.\n");
5670 prev &= ~(1 << axis);
5671 prev |= enable << axis;
5675 handle->
debug_print(
"mpu6050: write gyroscope config failed.\n");
5712 handle->
debug_print(
"mpu6050: read gyroscope config failed.\n");
5749 handle->
debug_print(
"mpu6050: read gyroscope config failed.\n");
5758 handle->
debug_print(
"mpu6050: write gyroscope config failed.\n");
5794 handle->
debug_print(
"mpu6050: read gyroscope config failed.\n");
5832 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
5836 prev &= ~(1 << axis);
5837 prev |= enable << axis;
5841 handle->
debug_print(
"mpu6050: write accelerometer config failed.\n");
5878 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
5915 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
5924 handle->
debug_print(
"mpu6050: write accelerometer config failed.\n");
5960 handle->
debug_print(
"mpu6050: read accelerometer config failed.\n");
5998 handle->
debug_print(
"mpu6050: read fifo enable config failed.\n");
6002 prev &= ~(1 << fifo);
6003 prev |= enable << fifo;
6007 handle->
debug_print(
"mpu6050: write fifo enable config failed.\n");
6044 handle->
debug_print(
"mpu6050: read fifo enable config failed.\n");
6081 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6090 handle->
debug_print(
"mpu6050: write interrupt pin failed.\n");
6126 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6163 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6172 handle->
debug_print(
"mpu6050: write interrupt pin failed.\n");
6208 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6245 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6250 prev |= (!enable) << 5;
6254 handle->
debug_print(
"mpu6050: write interrupt pin failed.\n");
6290 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6327 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6332 prev |= enable << 4;
6336 handle->
debug_print(
"mpu6050: write interrupt pin failed.\n");
6372 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6409 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6418 handle->
debug_print(
"mpu6050: write interrupt pin failed.\n");
6454 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6491 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6496 prev |= enable << 2;
6500 handle->
debug_print(
"mpu6050: write interrupt pin failed.\n");
6536 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6573 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6578 prev |= enable << 1;
6582 handle->
debug_print(
"mpu6050: write interrupt pin failed.\n");
6618 handle->
debug_print(
"mpu6050: read interrupt pin failed.\n");
6656 handle->
debug_print(
"mpu6050: read interrupt enable failed.\n");
6660 prev &= ~(1 << type);
6661 prev |= enable << type;
6665 handle->
debug_print(
"mpu6050: write interrupt enable failed.\n");
6702 handle->
debug_print(
"mpu6050: read interrupt enable failed.\n");
6738 handle->
debug_print(
"mpu6050: read interrupt status failed.\n");
6773 handle->
debug_print(
"mpu6050: data is over 0x1F.\n");
6781 handle->
debug_print(
"mpu6050: read self test x failed.\n");
6790 handle->
debug_print(
"mpu6050: write self test x failed.\n");
6825 handle->
debug_print(
"mpu6050: read self test x failed.\n");
6861 handle->
debug_print(
"mpu6050: data is over 0x1F.\n");
6869 handle->
debug_print(
"mpu6050: read self test y failed.\n");
6878 handle->
debug_print(
"mpu6050: write self test y failed.\n");
6913 handle->
debug_print(
"mpu6050: read self test y failed.\n");
6949 handle->
debug_print(
"mpu6050: data is over 0x1F.\n");
6957 handle->
debug_print(
"mpu6050: read self test z failed.\n");
6966 handle->
debug_print(
"mpu6050: write self test z failed.\n");
7001 handle->
debug_print(
"mpu6050: read self test z failed.\n");
7037 handle->
debug_print(
"mpu6050: data is over 0x1F.\n");
7045 handle->
debug_print(
"mpu6050: read self test x failed.\n");
7050 prev |= ((data >> 2) & 0x7) << 5;
7054 handle->
debug_print(
"mpu6050: write self test x failed.\n");
7061 handle->
debug_print(
"mpu6050: read self test a failed.\n");
7066 prev |= (data & 0x3) << 4;
7070 handle->
debug_print(
"mpu6050: write self test a failed.\n");
7107 handle->
debug_print(
"mpu6050: read self test x failed.\n");
7114 handle->
debug_print(
"mpu6050: read self test a failed.\n");
7118 *data = ((prev1 & (0x7 << 5)) >> 5) << 2 | ((prev2 >> 4) & 0x3);
7150 handle->
debug_print(
"mpu6050: data is over 0x1F.\n");
7158 handle->
debug_print(
"mpu6050: read self test y failed.\n");
7163 prev |= ((data >> 2) & 0x7) << 5;
7167 handle->
debug_print(
"mpu6050: write self test y failed.\n");
7174 handle->
debug_print(
"mpu6050: read self test a failed.\n");
7179 prev |= (data & 0x3) << 2;
7183 handle->
debug_print(
"mpu6050: write self test a failed.\n");
7220 handle->
debug_print(
"mpu6050: read self test y failed.\n");
7227 handle->
debug_print(
"mpu6050: read self test a failed.\n");
7231 *data = ((prev1 & (0x7 << 5)) >> 5) << 2 | ((prev2 >> 2) & 0x3);
7263 handle->
debug_print(
"mpu6050: data is over 0x1F.\n");
7271 handle->
debug_print(
"mpu6050: read self test z failed.\n");
7276 prev |= ((data >> 2) & 0x7) << 5;
7280 handle->
debug_print(
"mpu6050: write self test z failed.\n");
7287 handle->
debug_print(
"mpu6050: read self test a failed.\n");
7292 prev |= (data & 0x3) << 0;
7296 handle->
debug_print(
"mpu6050: write self test a failed.\n");
7333 handle->
debug_print(
"mpu6050: read self test z failed.\n");
7340 handle->
debug_print(
"mpu6050: read self test a failed.\n");
7344 *data = ((prev1 & (0x7 << 5)) >> 5) << 2 | ((prev2 >> 0) & 0x3);
7376 handle->
debug_print(
"mpu6050: write motion threshold failed.\n");
7411 handle->
debug_print(
"mpu6050: read motion threshold failed.\n");
7441 *reg = (uint8_t)(mg / 32.0f);
7468 *mg = (float)(reg) * 32.0f;
7500 handle->
debug_print(
"mpu6050: write motion duration failed.\n");
7535 handle->
debug_print(
"mpu6050: read motion duration failed.\n");
7626 handle->
debug_print(
"mpu6050: read accel config failed.\n");
7641 handle->
debug_print(
"mpu6050: write accel config failed.\n");
7665 int32_t gyro_offset_raw_st[3];
7666 int32_t accel_offset_raw_st[3];
7677 res = a_mpu6050_get_st_biases(handle, gyro_offset_raw, accel_offset_raw, 0);
7680 handle->
debug_print(
"mpu6050: get st biases failed.\n");
7684 res = a_mpu6050_get_st_biases(handle, gyro_offset_raw_st, accel_offset_raw_st, 1);
7687 handle->
debug_print(
"mpu6050: get st biases failed.\n");
7691 res = a_mpu6050_accel_self_test(handle, accel_offset_raw, accel_offset_raw_st);
7694 handle->
debug_print(
"mpu6050: accel self test failed.\n");
7698 res = a_mpu6050_gyro_self_test(handle, gyro_offset_raw, gyro_offset_raw_st);
7701 handle->
debug_print(
"mpu6050: gyro self test failed.\n");
7710 handle->
debug_print(
"mpu6050: write pwr mgmt 1 failed.\n");
7718 handle->
debug_print(
"mpu6050: read power management 1 failed.\n");
7726 handle->
debug_print(
"mpu6050: write power management 1 failed.\n");
7762 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
7771 handle->
debug_print(
"mpu6050: write i2c mst ctrl failed.\n");
7807 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
7844 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
7849 prev |= enable << 7;
7853 handle->
debug_print(
"mpu6050: write i2c mst ctrl failed.\n");
7889 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
7926 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
7931 prev |= enable << 6;
7935 handle->
debug_print(
"mpu6050: write i2c mst ctrl failed.\n");
7971 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
8008 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
8017 handle->
debug_print(
"mpu6050: write i2c mst ctrl failed.\n");
8053 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
8097 handle->
debug_print(
"mpu6050: read fifo enable failed.\n");
8101 prev &= ~(1 << slave);
8102 prev |= enable << slave;
8106 handle->
debug_print(
"mpu6050: write fifo enable failed.\n");
8116 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
8121 prev |= enable << 5;
8125 handle->
debug_print(
"mpu6050: write i2c mst ctrl failed.\n");
8175 handle->
debug_print(
"mpu6050: read fifo enable failed.\n");
8186 handle->
debug_print(
"mpu6050: read i2c mst ctrl failed.\n");
8234 handle->
debug_print(
"mpu6050: read i2c slv0 addr failed.\n");
8243 handle->
debug_print(
"mpu6050: write i2c slv0 addr failed.\n");
8253 handle->
debug_print(
"mpu6050: read i2c slv1 addr failed.\n");
8262 handle->
debug_print(
"mpu6050: write i2c slv1 addr failed.\n");
8272 handle->
debug_print(
"mpu6050: read i2c slv2 addr failed.\n");
8281 handle->
debug_print(
"mpu6050: write i2c slv2 addr failed.\n");
8291 handle->
debug_print(
"mpu6050: read i2c slv3 addr failed.\n");
8300 handle->
debug_print(
"mpu6050: write i2c slv3 addr failed.\n");
8310 handle->
debug_print(
"mpu6050: read i2c slv4 addr failed.\n");
8319 handle->
debug_print(
"mpu6050: write i2c slv4 addr failed.\n");
8366 handle->
debug_print(
"mpu6050: read i2c slv0 addr failed.\n");
8377 handle->
debug_print(
"mpu6050: read i2c slv1 addr failed.\n");
8388 handle->
debug_print(
"mpu6050: read i2c slv2 addr failed.\n");
8399 handle->
debug_print(
"mpu6050: read i2c slv3 addr failed.\n");
8410 handle->
debug_print(
"mpu6050: read i2c slv4 addr failed.\n");
8458 handle->
debug_print(
"mpu6050: read i2c slv0 addr failed.\n");
8463 prev |= addr_7bit & 0x7F;
8467 handle->
debug_print(
"mpu6050: write i2c slv0 addr failed.\n");
8477 handle->
debug_print(
"mpu6050: read i2c slv1 addr failed.\n");
8482 prev |= addr_7bit & 0x7F;
8486 handle->
debug_print(
"mpu6050: write i2c slv1 addr failed.\n");
8496 handle->
debug_print(
"mpu6050: read i2c slv2 addr failed.\n");
8501 prev |= addr_7bit & 0x7F;
8505 handle->
debug_print(
"mpu6050: write i2c slv2 addr failed.\n");
8515 handle->
debug_print(
"mpu6050: read i2c slv3 addr failed.\n");
8520 prev |= addr_7bit & 0x7F;
8524 handle->
debug_print(
"mpu6050: write i2c slv3 addr failed.\n");
8534 handle->
debug_print(
"mpu6050: read i2c slv4 addr failed.\n");
8539 prev |= addr_7bit & 0x7F;
8543 handle->
debug_print(
"mpu6050: write i2c slv4 addr failed.\n");
8590 handle->
debug_print(
"mpu6050: read i2c slv0 addr failed.\n");
8594 *addr_7bit = prev & 0x7F;
8601 handle->
debug_print(
"mpu6050: read i2c slv1 addr failed.\n");
8605 *addr_7bit = prev & 0x7F;
8612 handle->
debug_print(
"mpu6050: read i2c slv2 addr failed.\n");
8616 *addr_7bit = prev & 0x7F;
8623 handle->
debug_print(
"mpu6050: read i2c slv3 addr failed.\n");
8627 *addr_7bit = prev & 0x7F;
8634 handle->
debug_print(
"mpu6050: read i2c slv4 addr failed.\n");
8638 *addr_7bit = prev & 0x7F;
8681 handle->
debug_print(
"mpu6050: write i2c slv0 reg failed.\n");
8691 handle->
debug_print(
"mpu6050: write i2c slv1 reg failed.\n");
8701 handle->
debug_print(
"mpu6050: write i2c slv2 reg failed.\n");
8711 handle->
debug_print(
"mpu6050: write i2c slv3 reg failed.\n");
8721 handle->
debug_print(
"mpu6050: write i2c slv4 reg failed.\n");
8767 handle->
debug_print(
"mpu6050: read i2c slv0 reg failed.\n");
8777 handle->
debug_print(
"mpu6050: read i2c slv1 reg failed.\n");
8787 handle->
debug_print(
"mpu6050: read i2c slv2 reg failed.\n");
8797 handle->
debug_print(
"mpu6050: read i2c slv3 reg failed.\n");
8807 handle->
debug_print(
"mpu6050: read i2c slv4 reg failed.\n");
8853 handle->
debug_print(
"mpu6050: write i2c slv0 do failed.\n");
8863 handle->
debug_print(
"mpu6050: write i2c slv1 do failed.\n");
8873 handle->
debug_print(
"mpu6050: write i2c slv2 do failed.\n");
8883 handle->
debug_print(
"mpu6050: write i2c slv3 do failed.\n");
8929 handle->
debug_print(
"mpu6050: read i2c slv0 do failed.\n");
8939 handle->
debug_print(
"mpu6050: read i2c slv1 do failed.\n");
8949 handle->
debug_print(
"mpu6050: read i2c slv2 do failed.\n");
8959 handle->
debug_print(
"mpu6050: read i2c slv3 do failed.\n");
9006 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9011 prev |= enable << 7;
9015 handle->
debug_print(
"mpu6050: write i2c slv0 ctrl failed.\n");
9025 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9030 prev |= enable << 7;
9034 handle->
debug_print(
"mpu6050: write i2c slv1 ctrl failed.\n");
9044 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9049 prev |= enable << 7;
9053 handle->
debug_print(
"mpu6050: write i2c slv2 ctrl failed.\n");
9063 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9068 prev |= enable << 7;
9072 handle->
debug_print(
"mpu6050: write i2c slv3 ctrl failed.\n");
9119 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9130 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9141 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9152 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9200 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9205 prev |= enable << 6;
9209 handle->
debug_print(
"mpu6050: write i2c slv0 ctrl failed.\n");
9219 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9224 prev |= enable << 6;
9228 handle->
debug_print(
"mpu6050: write i2c slv1 ctrl failed.\n");
9238 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9243 prev |= enable << 6;
9247 handle->
debug_print(
"mpu6050: write i2c slv2 ctrl failed.\n");
9257 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9262 prev |= enable << 6;
9266 handle->
debug_print(
"mpu6050: write i2c slv3 ctrl failed.\n");
9313 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9324 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9335 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9346 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9394 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9403 handle->
debug_print(
"mpu6050: write i2c slv0 ctrl failed.\n");
9413 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9422 handle->
debug_print(
"mpu6050: write i2c slv1 ctrl failed.\n");
9432 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9441 handle->
debug_print(
"mpu6050: write i2c slv2 ctrl failed.\n");
9451 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9460 handle->
debug_print(
"mpu6050: write i2c slv3 ctrl failed.\n");
9507 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9518 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9529 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9540 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9588 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9597 handle->
debug_print(
"mpu6050: write i2c slv0 ctrl failed.\n");
9607 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9616 handle->
debug_print(
"mpu6050: write i2c slv1 ctrl failed.\n");
9626 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9635 handle->
debug_print(
"mpu6050: write i2c slv2 ctrl failed.\n");
9645 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9654 handle->
debug_print(
"mpu6050: write i2c slv3 ctrl failed.\n");
9701 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9712 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9723 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9734 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9789 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9798 handle->
debug_print(
"mpu6050: write i2c slv0 ctrl failed.\n");
9808 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9817 handle->
debug_print(
"mpu6050: write i2c slv1 ctrl failed.\n");
9827 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9836 handle->
debug_print(
"mpu6050: write i2c slv2 ctrl failed.\n");
9846 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9855 handle->
debug_print(
"mpu6050: write i2c slv3 ctrl failed.\n");
9902 handle->
debug_print(
"mpu6050: read i2c slv0 ctrl failed.\n");
9913 handle->
debug_print(
"mpu6050: read i2c slv1 ctrl failed.\n");
9924 handle->
debug_print(
"mpu6050: read i2c slv2 ctrl failed.\n");
9935 handle->
debug_print(
"mpu6050: read i2c slv3 ctrl failed.\n");
9978 handle->
debug_print(
"mpu6050: read i2c mst status failed.\n");
10003 if (handle == NULL)
10007 if (handle->
inited != 1)
10015 handle->
debug_print(
"mpu6050: read i2c mst delay ctrl failed.\n");
10019 prev &= ~(1 << delay);
10020 prev |= enable << delay;
10024 handle->
debug_print(
"mpu6050: write i2c mst delay ctrl failed.\n");
10049 if (handle == NULL)
10053 if (handle->
inited != 1)
10061 handle->
debug_print(
"mpu6050: read i2c mst delay ctrl failed.\n");
10086 if (handle == NULL)
10090 if (handle->
inited != 1)
10098 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10103 prev |= enable << 7;
10107 handle->
debug_print(
"mpu6050: write i2c slv4 ctrl failed.\n");
10131 if (handle == NULL)
10135 if (handle->
inited != 1)
10143 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10168 if (handle == NULL)
10172 if (handle->
inited != 1)
10180 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10185 prev |= enable << 6;
10189 handle->
debug_print(
"mpu6050: write i2c slv4 ctrl failed.\n");
10213 if (handle == NULL)
10217 if (handle->
inited != 1)
10225 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10250 if (handle == NULL)
10254 if (handle->
inited != 1)
10262 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10271 handle->
debug_print(
"mpu6050: write i2c slv4 ctrl failed.\n");
10295 if (handle == NULL)
10299 if (handle->
inited != 1)
10307 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10333 if (handle == NULL)
10337 if (handle->
inited != 1)
10351 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10360 handle->
debug_print(
"mpu6050: write i2c slv4 ctrl failed.\n");
10384 if (handle == NULL)
10388 if (handle->
inited != 1)
10396 handle->
debug_print(
"mpu6050: read i2c slv4 ctrl failed.\n");
10400 *delay = prev & 0x1F;
10420 if (handle == NULL)
10424 if (handle->
inited != 1)
10432 handle->
debug_print(
"mpu6050: write i2c slv4 do failed.\n");
10455 if (handle == NULL)
10459 if (handle->
inited != 1)
10467 handle->
debug_print(
"mpu6050: read i2c slv4 do failed.\n");
10490 if (handle == NULL)
10494 if (handle->
inited != 1)
10502 handle->
debug_print(
"mpu6050: write i2c slv4 di failed.\n");
10525 if (handle == NULL)
10529 if (handle->
inited != 1)
10537 handle->
debug_print(
"mpu6050: read i2c slv4 di failed.\n");
10562 if (handle == NULL)
10566 if (handle->
inited != 1)
10580 handle->
debug_print(
"mpu6050: read ext sens data 00 failed.\n");
10603 if (handle == NULL)
10607 if (handle->
inited != 1)
10612 return a_mpu6050_iic_write(handle, reg, buf, len);
10630 if (handle == NULL)
10634 if (handle->
inited != 1)
10639 return a_mpu6050_iic_read(handle, reg, buf, len);
#define MPU6050_DMP_D_0_22
#define MPU6050_REG_I2C_SLV2_REG
#define MPU6050_REG_I2C_SLV2_DO
#define MPU6050_DMP_D_PEDSTD_TIMECTR
#define MPU6050_DMP_FCFG_7
#define MPU6050_REG_I2C_SLV1_CTRL
#define MPU6050_REG_EXT_SENS_DATA_00
#define MPU6050_REG_USER_CTRL
#define MPU6050_REG_WHO_AM_I
#define MPU6050_DMP_INT_SRC_TAP
#define MPU6050_REG_SELF_TEST_X
chip register definition
#define MPU6050_DMP_D_EXT_GYRO_BIAS_X
#define MPU6050_DMP_D_1_88
#define MPU6050_DMP_QUAT_MAG_SQ_MIN
#define MPU6050_DMP_TAP_THZ
#define MPU6050_REG_ACCEL_XOUT_H
#define MPU6050_DMP_CFG_LP_QUAT
#define MPU6050_REG_CONFIG
#define MPU6050_REG_FIFO_EN
#define MPU6050_DMP_CFG_ORIENT_INT
#define MPU6050_DMP_FCFG_2
#define MPU6050_REG_I2C_SLV0_DO
#define MPU6050_DMP_CFG_MOTION_BIAS
#define MPU6050_DMP_TAP_TIME_MULTI
#define MPU6050_REG_ACCEL_CONFIG
#define MPU6050_REG_I2C_SLV0_ADDR
#define MPU6050_DMP_TAP_THY
#define MIN(a, b)
inner function definition
#define MPU6050_REG_SELF_TEST_Z
#define MPU6050_DMP_CFG_15
#define MPU6050_REG_I2C_SLV1_ADDR
#define MPU6050_REG_MOTION_DURATION
#define MPU6050_REG_INT_ENABLE
#define MPU6050_DMP_SHAKE_REJECT_TIMEOUT
#define MPU6050_DMP_CFG_8
#define MPU6050_DMP_SHAKE_REJECT_TIME
#define MPU6050_DMP_D_EXT_GYRO_BIAS_Y
#define MPU6050_DMP_D_1_36
#define MPU6050_REG_I2C_SLV0_REG
#define MPU6050_DMP_D_1_92
#define MPU6050_DMP_FCFG_1
#define MPU6050_REG_BANK_SEL
#define MPU6050_REG_PROGRAM_START
#define MPU6050_DMP_D_PEDSTD_STEPCTR
#define MPU6050_REG_SELF_TEST_A
#define SUPPLY_VOLTAGE_MAX
#define MPU6050_REG_I2C_SLV0_CTRL
#define MPU6050_REG_I2C_SLV3_REG
#define MPU6050_REG_I2C_SLV1_REG
#define MPU6050_REG_I2C_SLV4_DI
#define MPU6050_DMP_TAPW_MIN
#define MPU6050_DMP_FEATURE_SEND_ANY_GYRO
#define MPU6050_DMP_TAP_THX
#define MPU6050_REG_INT_PIN_CFG
#define MPU6050_REG_I2C_MST_STATUS
#define MPU6050_REG_SELF_TEST_Y
#define MPU6050_DMP_CFG_6
#define MPU6050_DMP_FCFG_3
#define MPU6050_REG_I2C_SLV3_ADDR
#define MPU6050_REG_FIFO_COUNTH
#define MPU6050_REG_PWR_MGMT_2
#define MPU6050_DMP_D_0_104
#define MPU6050_DMP_D_1_72
#define MPU6050_DMP_D_1_218
#define MPU6050_REG_I2C_SLV2_ADDR
#define MPU6050_REG_I2C_SLV4_ADDR
#define MPU6050_DMP_CFG_20
#define MPU6050_REG_GYRO_CONFIG
#define MANUFACTURER_NAME
#define SUPPLY_VOLTAGE_MIN
#define MPU6050_DMP_CFG_GYRO_RAW_DATA
#define MPU6050_DMP_D_1_90
#define MPU6050_DMP_D_1_44
#define MPU6050_REG_I2C_SLV3_CTRL
#define MPU6050_DMP_SAMPLE_RATE
mpu6050 dmp code definition
#define MPU6050_REG_I2C_MST_CTRL
#define MPU6050_DMP_D_1_40
#define MPU6050_REG_SMPRT_DIV
#define MPU6050_DMP_CFG_27
#define MPU6050_DMP_SHAKE_REJECT_THRESH
#define MPU6050_DMP_INT_SRC_ORIENT
#define MPU6050_DMP_TAP_THRESH
#define MPU6050_REG_I2C_SLV3_DO
#define MPU6050_REG_MOTION_THRESHOLD
#define MPU6050_REG_I2C_MST_DELAY_CTRL
#define MPU6050_REG_I2C_SLV4_CTRL
#define MPU6050_DMP_D_EXT_GYRO_BIAS_Z
#define CHIP_NAME
chip information definition
#define MPU6050_REG_TEMP_OUT_H
#define MPU6050_DMP_CFG_FIFO_ON_EVENT
#define MPU6050_DMP_TAP_MIN_TAP_COUNT
#define MPU6050_REG_I2C_SLV4_REG
#define MPU6050_DMP_TAP_TIME
#define MPU6050_REG_PWR_MGMT_1
#define MPU6050_REG_I2C_SLV4_DO
#define MPU6050_REG_SIGNAL_PATH_RESET
#define MPU6050_DMP_D_1_79
#define MPU6050_DMP_D_ACCEL_BIAS
#define MPU6050_DMP_QUAT_MAG_SQ_MAX
#define MPU6050_REG_INT_STATUS
#define MPU6050_REG_I2C_SLV1_DO
#define MPU6050_DMP_GYRO_SF
#define MPU6050_REG_I2C_SLV2_CTRL
driver mpu6050 header file
driver mpu6050 code header file
uint8_t mpu6050_get_interrupt_latch(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the interrupt latch status
mpu6050_iic_mode_t
mpu6050 iic mode enumeration definition
uint8_t mpu6050_get_motion_duration(mpu6050_handle_t *handle, uint8_t *duration)
get the motion duration
uint8_t mpu6050_get_iic4_transaction_mode(mpu6050_handle_t *handle, mpu6050_iic4_transaction_mode_t *mode)
get the iic4 transaction mode
uint8_t mpu6050_get_motion_threshold(mpu6050_handle_t *handle, uint8_t *threshold)
get the motion_threshold
uint8_t mpu6050_get_temperature_sensor(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the temperature sensor status
uint8_t mpu6050_get_iic_byte_swap(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_bool_t *enable)
get the iic byte swap status
uint8_t mpu6050_get_iic_transferred_len(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t *len)
get the iic transferred length
uint8_t mpu6050_set_gyroscope_z_test(mpu6050_handle_t *handle, uint8_t data)
set the gyroscope z test
uint8_t mpu6050_get_accelerometer_test(mpu6050_handle_t *handle, mpu6050_axis_t axis, mpu6050_bool_t *enable)
get the accelerometer test
mpu6050_pin_type_t
mpu6050 pin type enumeration definition
uint8_t mpu6050_get_iic_read_mode(mpu6050_handle_t *handle, mpu6050_iic_read_mode_t *mode)
get the iic read mode
uint8_t mpu6050_get_accelerometer_x_test(mpu6050_handle_t *handle, uint8_t *data)
get the accelerometer x test
mpu6050_iic_read_mode_t
mpu6050 iic read mode enumeration definition
mpu6050_wake_up_frequency_t
mpu6050 wake up frequency enumeration definition
uint8_t mpu6050_get_iic4_data_out(mpu6050_handle_t *handle, uint8_t *data)
get the iic4 data out
struct mpu6050_info_s mpu6050_info_t
mpu6050 information structure definition
mpu6050_iic_clock_t
mpu6050 iic clock enumeration definition
uint8_t mpu6050_get_interrupt_status(mpu6050_handle_t *handle, uint8_t *status)
get the interrupt status
uint8_t mpu6050_set_iic4_enable(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the iic4
uint8_t mpu6050_set_iic_transaction_mode(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_iic_transaction_mode_t mode)
set the iic transaction mode
uint8_t mpu6050_set_iic4_data_in(mpu6050_handle_t *handle, uint8_t data)
set the iic4 data in
uint8_t mpu6050_get_cycle_wake_up(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the cycle wake up mode status
uint8_t mpu6050_iic_master_reset(mpu6050_handle_t *handle)
reset the iic master controller
uint8_t mpu6050_set_gyroscope_y_test(mpu6050_handle_t *handle, uint8_t data)
set the gyroscope y test
uint8_t mpu6050_set_iic_wait_for_external_sensor(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable iic wait for external sensor
uint8_t mpu6050_sensor_reset(mpu6050_handle_t *handle)
reset all sensors
uint8_t mpu6050_get_low_pass_filter(mpu6050_handle_t *handle, mpu6050_low_pass_filter_t *filter)
get the low pass filter
uint8_t mpu6050_set_wake_up_frequency(mpu6050_handle_t *handle, mpu6050_wake_up_frequency_t frequency)
set the wake up frequency
mpu6050_gyroscope_range_t
mpu6050 gyroscope range enumeration definition
uint8_t mpu6050_set_accelerometer_x_test(mpu6050_handle_t *handle, uint8_t data)
set the accelerometer x test
uint8_t mpu6050_fifo_reset(mpu6050_handle_t *handle)
reset the fifo
uint8_t mpu6050_get_interrupt_pin_type(mpu6050_handle_t *handle, mpu6050_pin_type_t *type)
get the interrupt pin type
uint8_t mpu6050_get_iic_address(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t *addr_7bit)
get the iic address
uint8_t mpu6050_get_iic_group_order(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_iic_group_order_t *order)
get the iic group order
uint8_t mpu6050_init(mpu6050_handle_t *handle)
initialize the chip
uint8_t mpu6050_set_iic_multi_master(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable iic multi master
uint8_t mpu6050_set_iic_group_order(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_iic_group_order_t order)
set the iic group order
uint8_t mpu6050_get_iic_clock(mpu6050_handle_t *handle, mpu6050_iic_clock_t *clk)
get the iic clock
uint8_t mpu6050_set_iic_address(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t addr_7bit)
set the iic address
mpu6050_extern_sync_t
mpu6050 extern sync enumeration definition
uint8_t mpu6050_read_temperature(mpu6050_handle_t *handle, int16_t(*raw), float *degrees)
read the temperature
uint8_t mpu6050_set_accelerometer_range(mpu6050_handle_t *handle, mpu6050_accelerometer_range_t range)
set the accelerometer range
uint8_t mpu6050_device_reset(mpu6050_handle_t *handle)
reset the chip
mpu6050_address_t
mpu6050 address enumeration definition
uint8_t mpu6050_set_standby_mode(mpu6050_handle_t *handle, mpu6050_source_t source, mpu6050_bool_t enable)
set source into standby mode
mpu6050_iic_delay_t
mpu6050 iic delay enumeration definition
uint8_t mpu6050_get_iic_fifo_enable(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_bool_t *enable)
get the iic fifo status
uint8_t mpu6050_get_interrupt_read_clear(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the interrupt reading clear status
uint8_t mpu6050_set_iic_register(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t reg)
set the iic register
uint8_t mpu6050_motion_threshold_convert_to_register(mpu6050_handle_t *handle, float mg, uint8_t *reg)
convert the motion threshold to the register raw data
uint8_t mpu6050_get_iic_master_reset(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the iic master reset status
uint8_t mpu6050_get_interrupt(mpu6050_handle_t *handle, mpu6050_interrupt_t type, mpu6050_bool_t *enable)
get the interrupt status
uint8_t mpu6050_self_test(mpu6050_handle_t *handle, int32_t gyro_offset_raw[3], int32_t accel_offset_raw[3])
run the self test
uint8_t mpu6050_set_gyroscope_x_test(mpu6050_handle_t *handle, uint8_t data)
set the gyroscope x test
uint8_t mpu6050_get_accelerometer_z_test(mpu6050_handle_t *handle, uint8_t *data)
get the accelerometer z test
uint8_t mpu6050_set_iic_delay(mpu6050_handle_t *handle, uint8_t delay)
set the iic delay
mpu6050_source_t
mpu6050 source enumeration definition
uint8_t mpu6050_get_sleep(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the sleep status
uint8_t mpu6050_set_iic_transferred_len(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t len)
set the iic transferred length
uint8_t mpu6050_set_motion_threshold(mpu6050_handle_t *handle, uint8_t threshold)
set the motion_threshold
uint8_t mpu6050_get_sample_rate_divider(mpu6050_handle_t *handle, uint8_t *d)
get the sample rate divider
uint8_t mpu6050_set_iic4_interrupt(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the iic4 interrupt
uint8_t mpu6050_set_iic_clock(mpu6050_handle_t *handle, mpu6050_iic_clock_t clk)
set the iic clock
uint8_t mpu6050_set_iic4_data_out(mpu6050_handle_t *handle, uint8_t data)
set the iic4 data out
uint8_t mpu6050_fifo_get(mpu6050_handle_t *handle, uint8_t *buf, uint16_t len)
fifo read bytes
uint8_t mpu6050_get_accelerometer_y_test(mpu6050_handle_t *handle, uint8_t *data)
get the accelerometer y test
uint8_t mpu6050_set_sample_rate_divider(mpu6050_handle_t *handle, uint8_t d)
set the sample rate divider
uint8_t mpu6050_set_motion_duration(mpu6050_handle_t *handle, uint8_t duration)
set the motion duration
uint8_t mpu6050_set_gyroscope_range(mpu6050_handle_t *handle, mpu6050_gyroscope_range_t range)
set the gyroscope range
uint8_t mpu6050_set_addr_pin(mpu6050_handle_t *handle, mpu6050_address_t addr_pin)
set the chip address pin
uint8_t mpu6050_get_wake_up_frequency(mpu6050_handle_t *handle, mpu6050_wake_up_frequency_t *frequency)
get the wake up frequency
uint8_t mpu6050_get_interrupt_level(mpu6050_handle_t *handle, mpu6050_pin_level_t *level)
get the interrupt level
mpu6050_iic_group_order_t
mpu6050 iic group order enumeration definition
uint8_t mpu6050_set_interrupt_read_clear(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the interrupt reading clear
uint8_t mpu6050_read(mpu6050_handle_t *handle, int16_t(*accel_raw)[3], float(*accel_g)[3], int16_t(*gyro_raw)[3], float(*gyro_dps)[3], uint16_t *len)
read the data
uint8_t mpu6050_set_fifo_enable(mpu6050_handle_t *handle, mpu6050_fifo_t fifo, mpu6050_bool_t enable)
enable or disable the fifo function
mpu6050_fifo_t
mpu6050 fifo enumeration definition
mpu6050_clock_source_t
mpu6050 clock source enumeration definition
uint8_t mpu6050_set_iic_byte_swap(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_bool_t enable)
enable or disable the iic byte swap
uint8_t mpu6050_get_gyroscope_z_test(mpu6050_handle_t *handle, uint8_t *data)
get the gyroscope z test
uint8_t mpu6050_get_iic_data_out(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t *data)
get the iic data out
uint8_t mpu6050_get_fifo_enable(mpu6050_handle_t *handle, mpu6050_fifo_t fifo, mpu6050_bool_t *enable)
get the fifo function status
uint8_t mpu6050_get_extern_sync(mpu6050_handle_t *handle, mpu6050_extern_sync_t *sync)
get the extern sync type
uint8_t mpu6050_get_iic_master(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the iic master status
uint8_t mpu6050_set_accelerometer_y_test(mpu6050_handle_t *handle, uint8_t data)
set the accelerometer y test
uint8_t mpu6050_set_interrupt(mpu6050_handle_t *handle, mpu6050_interrupt_t type, mpu6050_bool_t enable)
enable or disable the interrupt
uint8_t mpu6050_set_iic_bypass(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the iic bypass
uint8_t mpu6050_info(mpu6050_info_t *info)
get the chip's information
uint8_t mpu6050_set_gyroscope_test(mpu6050_handle_t *handle, mpu6050_axis_t axis, mpu6050_bool_t enable)
set the gyroscope test
uint8_t mpu6050_get_fsync_interrupt_level(mpu6050_handle_t *handle, mpu6050_pin_level_t *level)
get the fsync interrupt level
mpu6050_pin_level_t
mpu6050 pin level enumeration definition
uint8_t mpu6050_get_iic4_enable(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the iic4 status
uint8_t mpu6050_set_cycle_wake_up(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the cycle wake up mode
uint8_t mpu6050_get_device_reset(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the device reset status
uint8_t mpu6050_get_fifo_reset(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the fifo reset status
uint8_t mpu6050_set_interrupt_pin_type(mpu6050_handle_t *handle, mpu6050_pin_type_t type)
set the interrupt pin type
uint8_t mpu6050_set_signal_path_reset(mpu6050_handle_t *handle, mpu6050_signal_path_reset_t path)
set the signal path reset
uint8_t mpu6050_get_iic_enable(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_bool_t *enable)
get the iic status
uint8_t mpu6050_get_iic_transaction_mode(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_iic_transaction_mode_t *mode)
get the iic transaction mode
uint8_t mpu6050_irq_handler(mpu6050_handle_t *handle)
irq handler
uint8_t mpu6050_get_standby_mode(mpu6050_handle_t *handle, mpu6050_source_t source, mpu6050_bool_t *enable)
get the source mode
uint8_t mpu6050_set_iic_master(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the iic master mode
uint8_t mpu6050_force_fifo_reset(mpu6050_handle_t *handle)
force reset the fifo
uint8_t mpu6050_get_gyroscope_x_test(mpu6050_handle_t *handle, uint8_t *data)
get the gyroscope x test
uint8_t mpu6050_get_gyroscope_y_test(mpu6050_handle_t *handle, uint8_t *data)
get the gyroscope y test
uint8_t mpu6050_set_temperature_sensor(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the temperature sensor
uint8_t mpu6050_set_interrupt_latch(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the interrupt latch
mpu6050_interrupt_t
mpu6050 interrupt enumeration definition
uint8_t mpu6050_set_iic4_transaction_mode(mpu6050_handle_t *handle, mpu6050_iic4_transaction_mode_t mode)
set the iic4 transaction mode
mpu6050_accelerometer_range_t
mpu6050 accelerometer range enumeration definition
mpu6050_signal_path_reset_t
mpu6050 signal path reset enumeration definition
uint8_t mpu6050_get_gyroscope_test(mpu6050_handle_t *handle, mpu6050_axis_t axis, mpu6050_bool_t *enable)
get the gyroscope test
mpu6050_iic_slave_t
mpu6050 iic slave enumeration definition
mpu6050_iic_transaction_mode_t
mpu6050 iic transaction mode enumeration definition
uint8_t mpu6050_get_fsync_interrupt(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the fsync interrupt status
uint8_t mpu6050_set_iic_enable(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_bool_t enable)
enable or disable the iic
uint8_t mpu6050_set_accelerometer_test(mpu6050_handle_t *handle, mpu6050_axis_t axis, mpu6050_bool_t enable)
set the accelerometer test
uint8_t mpu6050_set_extern_sync(mpu6050_handle_t *handle, mpu6050_extern_sync_t sync)
set the extern sync type
uint8_t mpu6050_get_iic_bypass(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the iic bypass status
uint8_t mpu6050_set_sleep(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the sleep mode
struct mpu6050_handle_s mpu6050_handle_t
mpu6050 handle structure definition
uint8_t mpu6050_motion_threshold_convert_to_data(mpu6050_handle_t *handle, uint8_t reg, float *mg)
convert the register raw data to the motion threshold
uint8_t mpu6050_get_clock_source(mpu6050_handle_t *handle, mpu6050_clock_source_t *clock_source)
get the chip clock source
mpu6050_bool_t
mpu6050 bool enumeration definition
uint8_t mpu6050_set_fifo(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable fifo
uint8_t mpu6050_set_interrupt_level(mpu6050_handle_t *handle, mpu6050_pin_level_t level)
set the interrupt level
uint8_t mpu6050_read_extern_sensor_data(mpu6050_handle_t *handle, uint8_t *data, uint8_t len)
read the extern sensor data
uint8_t mpu6050_get_addr_pin(mpu6050_handle_t *handle, mpu6050_address_t *addr_pin)
get the chip address pin
uint8_t mpu6050_motion_duration_convert_to_register(mpu6050_handle_t *handle, uint8_t ms, uint8_t *reg)
convert the motion duration to the register raw data
uint8_t mpu6050_get_iic_status(mpu6050_handle_t *handle, uint8_t *status)
get the iic status
uint8_t mpu6050_get_accelerometer_range(mpu6050_handle_t *handle, mpu6050_accelerometer_range_t *range)
get the accelerometer range
uint8_t mpu6050_set_iic_data_out(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t data)
set the iic data out
uint8_t mpu6050_get_iic_wait_for_external_sensor(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the iic wait for external sensor status
uint8_t mpu6050_set_iic_fifo_enable(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_bool_t enable)
enable or disable the iic fifo
mpu6050_low_pass_filter_t
mpu6050 low pass filter enumeration definition
uint8_t mpu6050_get_fifo(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the fifo status
uint8_t mpu6050_set_clock_source(mpu6050_handle_t *handle, mpu6050_clock_source_t clock_source)
set the chip clock source
uint8_t mpu6050_fifo_set(mpu6050_handle_t *handle, uint8_t *buf, uint16_t len)
fifo write bytes
uint8_t mpu6050_get_iic_register(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, uint8_t *reg)
get the iic register
uint8_t mpu6050_get_gyroscope_range(mpu6050_handle_t *handle, mpu6050_gyroscope_range_t *range)
get the gyroscope range
uint8_t mpu6050_set_iic_read_mode(mpu6050_handle_t *handle, mpu6050_iic_read_mode_t mode)
set the iic read mode
uint8_t mpu6050_get_iic4_data_in(mpu6050_handle_t *handle, uint8_t *data)
get the iic4 data in
uint8_t mpu6050_get_sensor_reset(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the sensor reset status
uint8_t mpu6050_get_fifo_count(mpu6050_handle_t *handle, uint16_t *count)
get the fifo counter value
uint8_t mpu6050_set_fsync_interrupt(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the fsync interrupt
uint8_t mpu6050_motion_duration_convert_to_data(mpu6050_handle_t *handle, uint8_t reg, uint8_t *ms)
convert the register raw data to the motion duration
mpu6050_iic4_transaction_mode_t
mpu6050 iic4 transaction mode enumeration definition
uint8_t mpu6050_set_low_pass_filter(mpu6050_handle_t *handle, mpu6050_low_pass_filter_t filter)
set the low pass filter
uint8_t mpu6050_set_iic_mode(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_iic_mode_t mode)
set the iic mode
uint8_t mpu6050_deinit(mpu6050_handle_t *handle)
close the chip
uint8_t mpu6050_get_iic_delay_enable(mpu6050_handle_t *handle, mpu6050_iic_delay_t delay, mpu6050_bool_t *enable)
get the iic delay status
uint8_t mpu6050_set_iic_delay_enable(mpu6050_handle_t *handle, mpu6050_iic_delay_t delay, mpu6050_bool_t enable)
enable or disable the iic delay
uint8_t mpu6050_get_iic_mode(mpu6050_handle_t *handle, mpu6050_iic_slave_t slave, mpu6050_iic_mode_t *mode)
get the iic mode
uint8_t mpu6050_get_iic_multi_master(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the iic multi master status
uint8_t mpu6050_get_iic_delay(mpu6050_handle_t *handle, uint8_t *delay)
get the iic delay
uint8_t mpu6050_set_fsync_interrupt_level(mpu6050_handle_t *handle, mpu6050_pin_level_t level)
set the fsync interrupt level
uint8_t mpu6050_set_force_accel_sample(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable force accel sample
mpu6050_axis_t
mpu6050 axis enumeration definition
uint8_t mpu6050_set_accelerometer_z_test(mpu6050_handle_t *handle, uint8_t data)
set the accelerometer z test
uint8_t mpu6050_get_iic4_interrupt(mpu6050_handle_t *handle, mpu6050_bool_t *enable)
get the iic4 interrupt status
@ MPU6050_INTERRUPT_I2C_MAST
@ MPU6050_INTERRUPT_DATA_READY
@ MPU6050_INTERRUPT_FIFO_OVERFLOW
@ MPU6050_INTERRUPT_MOTION
uint8_t mpu6050_dmp_set_tap_thresh(mpu6050_handle_t *handle, mpu6050_axis_t axis, uint16_t mg_ms)
dmp set the tap thresh
uint8_t mpu6050_dmp_set_gyro_bias(mpu6050_handle_t *handle, int32_t bias[3])
dmp set the gyro bias
uint8_t mpu6050_dmp_set_orientation(mpu6050_handle_t *handle, int8_t mat[9])
dmp set the orientation
uint8_t mpu6050_dmp_get_shake_reject_time(mpu6050_handle_t *handle, uint16_t *ms)
dmp get the shake reject time
uint8_t mpu6050_dmp_get_shake_reject_thresh(mpu6050_handle_t *handle, uint16_t *dps)
dmp get the shake reject thresh
uint8_t mpu6050_dmp_set_enable(mpu6050_handle_t *handle, mpu6050_bool_t enable)
enable or disable the dmp
uint8_t mpu6050_dmp_load_firmware(mpu6050_handle_t *handle)
load the dmp firmware
uint8_t mpu6050_dmp_set_tap_callback(mpu6050_handle_t *handle, void(*callback)(uint8_t count, uint8_t direction))
dmp set the tap callback
uint8_t mpu6050_dmp_set_orient_callback(mpu6050_handle_t *handle, void(*callback)(uint8_t orientation))
dmp set the orient callback
uint8_t mpu6050_dmp_set_shake_reject_timeout(mpu6050_handle_t *handle, uint16_t ms)
dmp set the shake reject timeout
uint8_t mpu6050_dmp_read(mpu6050_handle_t *handle, int16_t(*accel_raw)[3], float(*accel_g)[3], int16_t(*gyro_raw)[3], float(*gyro_dps)[3], int32_t(*quat)[4], float *pitch, float *roll, float *yaw, uint16_t *l)
dmp read the data
uint8_t mpu6050_dmp_set_tap_time_multi(mpu6050_handle_t *handle, uint16_t ms)
dmp set max time between taps to register as a multi tap
uint8_t mpu6050_dmp_set_accel_bias(mpu6050_handle_t *handle, int32_t bias[3])
dmp set the accel bias
uint8_t mpu6050_dmp_get_pedometer_step_count(mpu6050_handle_t *handle, uint32_t *count)
dmp get the pedometer step count
#define MPU6050_DMP_CODE_SIZE
mpu6050 dmp code definition
uint8_t mpu6050_dmp_set_pedometer_step_count(mpu6050_handle_t *handle, uint32_t count)
dmp set the pedometer step count
uint8_t mpu6050_dmp_get_tap_axes(mpu6050_handle_t *handle, mpu6050_axis_t axis, mpu6050_bool_t *enable)
dmp get the tap axes status
uint8_t mpu6050_dmp_set_feature(mpu6050_handle_t *handle, uint16_t mask)
dmp enable or disable the dmp feature
uint8_t mpu6050_dmp_gyro_accel_raw_offset_convert(mpu6050_handle_t *handle, int32_t gyro_offset_raw[3], int32_t accel_offset_raw[3], int32_t gyro_offset[3], int32_t accel_offset[3])
dmp gyro accel raw offset convert
uint8_t mpu6050_dmp_get_tap_thresh(mpu6050_handle_t *handle, mpu6050_axis_t axis, uint16_t *mg_ms)
dmp get the tap thresh
uint8_t mpu6050_dmp_set_6x_quaternion(mpu6050_handle_t *handle, mpu6050_bool_t enable)
dmp enable or disable generate 6 axis quaternions from dmp
uint8_t mpu6050_dmp_get_pedometer_walk_time(mpu6050_handle_t *handle, uint32_t *ms)
dmp get the pedometer walk time
uint8_t mpu6050_dmp_set_shake_reject_thresh(mpu6050_handle_t *handle, uint16_t dps)
dmp set the shake reject thresh
uint8_t mpu6050_dmp_get_tap_time(mpu6050_handle_t *handle, uint16_t *ms)
dmp get the tap time
mpu6050_dmp_interrupt_mode_t
mpu6050 dmp interrupt mode enumeration definition
uint8_t mpu6050_dmp_set_fifo_rate(mpu6050_handle_t *handle, uint16_t rate)
dmp set the fifo rate
uint8_t mpu6050_dmp_set_tap_axes(mpu6050_handle_t *handle, mpu6050_axis_t axis, mpu6050_bool_t enable)
dmp enable or disable the tap axes
uint8_t mpu6050_dmp_set_shake_reject_time(mpu6050_handle_t *handle, uint16_t ms)
dmp set the shake reject time
uint8_t mpu6050_dmp_get_fifo_rate(mpu6050_handle_t *handle, uint16_t *rate)
dmp get the fifo rate
uint8_t mpu6050_dmp_set_min_tap_count(mpu6050_handle_t *handle, uint8_t cnt)
dmp set the min tap count
uint8_t mpu6050_dmp_get_shake_reject_timeout(mpu6050_handle_t *handle, uint16_t *ms)
dmp get the shake reject timeout
uint8_t mpu6050_dmp_get_min_tap_count(mpu6050_handle_t *handle, uint8_t *cnt)
dmp get the min tap count
uint8_t mpu6050_dmp_get_tap_time_multi(mpu6050_handle_t *handle, uint16_t *ms)
dmp get max time between taps to register as a multi tap
uint8_t mpu6050_dmp_set_gyro_calibrate(mpu6050_handle_t *handle, mpu6050_bool_t enable)
dmp enable or disable gyro calibrate
uint8_t mpu6050_dmp_set_tap_time(mpu6050_handle_t *handle, uint16_t ms)
dmp set the tap time
uint8_t mpu6050_dmp_set_3x_quaternion(mpu6050_handle_t *handle, mpu6050_bool_t enable)
dmp enable or disable generate 3 axis quaternions from dmp
uint8_t mpu6050_dmp_set_interrupt_mode(mpu6050_handle_t *handle, mpu6050_dmp_interrupt_mode_t mode)
dmp set the interrupt mode
uint8_t mpu6050_dmp_set_pedometer_walk_time(mpu6050_handle_t *handle, uint32_t ms)
dmp set the pedometer walk time
@ MPU6050_DMP_FEATURE_PEDOMETER
@ MPU6050_DMP_FEATURE_TAP
@ MPU6050_DMP_FEATURE_ORIENT
@ MPU6050_DMP_FEATURE_6X_QUAT
@ MPU6050_DMP_FEATURE_GYRO_CAL
@ MPU6050_DMP_FEATURE_SEND_RAW_ACCEL
@ MPU6050_DMP_FEATURE_SEND_CAL_GYRO
@ MPU6050_DMP_FEATURE_3X_QUAT
@ MPU6050_DMP_INTERRUPT_MODE_CONTINUOUS
uint8_t mpu6050_get_reg(mpu6050_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
get the chip register
uint8_t mpu6050_set_reg(mpu6050_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len)
set the chip register
void(* dmp_tap_callback)(uint8_t count, uint8_t direction)
void(* delay_ms)(uint32_t ms)
void(* receive_callback)(uint8_t type)
void(* debug_print)(const char *const fmt,...)
uint8_t(* iic_init)(void)
void(* dmp_orient_callback)(uint8_t orientation)
uint8_t(* iic_write)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_read)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
uint8_t(* iic_deinit)(void)
float supply_voltage_max_v
char manufacturer_name[32]
float supply_voltage_min_v