2 * Copyright (C) 2012 Invensense, Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 #define pr_fmt(fmt) "inv_mpu: " fmt
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/slab.h>
18 #include <linux/err.h>
19 #include <linux/delay.h>
20 #include <linux/sysfs.h>
21 #include <linux/jiffies.h>
22 #include <linux/irq.h>
23 #include <linux/interrupt.h>
24 #include <linux/kfifo.h>
25 #include <linux/poll.h>
26 #include <linux/miscdevice.h>
29 #include "kfifo_buf.h"
30 #include "trigger_consumer.h"
33 #include "inv_mpu_iio.h"
34 struct inv_local_store {
45 bool step_indicator_on;
47 bool step_detector_on;
48 bool accel_cal_enable;
50 bool compass_cal_enable;
57 static struct inv_local_store local;
59 struct inv_compass_cal_params {
64 static struct inv_compass_cal_params compass_cal_param[] = {
90 struct inv_accel_cal_params {
98 static struct inv_accel_cal_params accel_cal_para[] = {
105 .gain = DEFAULT_ACCEL_GAIN,
111 .gain = DEFAULT_ACCEL_GAIN,
117 .freq = PEDOMETER_FREQ,
118 .gain = PED_ACCEL_GAIN,
125 .gain = DEFAULT_ACCEL_GAIN,
132 .gain = DEFAULT_ACCEL_GAIN,
139 static int accel_gyro_rate[] = {5, 6, 7, 8, 9, 10, 11, 12, 13,
140 14, 15, 17, 18, 22, 25, 28, 32, 37, 45,
143 static int inv_out_data_cntl(struct inv_mpu_state *st, u16 wd, bool en)
145 return inv_write_cntl(st, wd, en, DATA_OUT_CTL1);
148 static int inv_out_data_cntl_2(struct inv_mpu_state *st, u16 wd, bool en)
150 return inv_write_cntl(st, wd, en, DATA_OUT_CTL2);
153 static int inv_set_batchmode(struct inv_mpu_state *st, bool enable)
157 if (local.batchmode_en != enable) {
158 result = inv_out_data_cntl_2(st, BATCH_MODE_EN, enable);
161 local.batchmode_en = enable;
166 static int inv_calc_engine_dur(struct inv_engine_info *ei)
168 if (!ei->running_rate)
171 ei->dur = ei->base_time / ei->orig_rate;
172 ei->dur *= ei->divider;
176 static int inv_batchmode_calc(struct inv_mpu_state *st)
179 int i, bps, max_rate;
182 int en_num, en_sen, count;
190 for (i = 0; i < SENSOR_NUM_MAX; i++) {
191 if (st->sensor[i].on) {
192 if (max_rate < st->sensor[i].rate) {
193 max_rate = st->sensor[i].rate;
195 /* get actual rate */
196 real_rate = (MSEC_PER_SEC * NSEC_PER_MSEC) /
198 if (((MSEC_PER_SEC * NSEC_PER_MSEC) %
199 (st->sensor[i].dur)) > (st->sensor[i].dur / 2))
201 b = st->sensor[i].sample_size + 2;
202 bps += b * real_rate;
208 st->batch.max_rate = max_rate;
209 if (max_rate && bps) {
210 b = st->batch.timeout * bps;
211 if ((b > (FIFO_SIZE * MSEC_PER_SEC)) &&
212 (!st->batch.overflow_on)) {
214 timeout = FIFO_SIZE * MSEC_PER_SEC / bps;
216 count = FIFO_SIZE / ps *
217 st->sensor[en_sen].div;
221 timeout = st->batch.timeout;
223 if (st->chip_config.gyro_enable)
225 else if (st->chip_config.accel_enable)
230 if (st->chip_config.step_detector_on ||
231 st->chip_config.step_indicator_on) {
233 timeout = st->batch.timeout;
239 st->batch.engine_base = eng;
241 b = st->eng_info[eng].dur / USEC_PER_MSEC;
242 count = timeout * USEC_PER_MSEC / b;
244 st->batch.counter = count;
246 if (st->batch.counter)
252 static int inv_set_default_batch(struct inv_mpu_state *st)
254 if (st->batch.max_rate > DEFAULT_BATCH_RATE) {
255 st->batch.default_on = true;
256 st->batch.counter = DEFAULT_BATCH_TIME * NSEC_PER_MSEC /
257 st->eng_info[ENGINE_GYRO].dur;
262 int inv_batchmode_setup(struct inv_mpu_state *st)
266 s16 mask[ENGINE_NUM_MAX] = {1, 2, 8, 8};
268 r = write_be32_to_mem(st, 0, BM_BATCH_CNTR);
271 st->batch.on = false;
272 st->batch.default_on = false;
273 if (st->batch.timeout > 0) {
274 r = inv_batchmode_calc(st);
278 r = inv_set_default_batch(st);
283 on = (st->batch.on || st->batch.default_on);
286 r = write_be32_to_mem(st, st->batch.counter, BM_BATCH_THLD);
289 r = inv_write_2bytes(st, BM_BATCH_MASK,
290 mask[st->batch.engine_base]);
294 r = inv_set_batchmode(st, on);
299 static int inv_turn_on_fifo(struct inv_mpu_state *st)
305 /* clear FIFO data */
306 r = inv_plat_single_write(st, REG_FIFO_RST, MAX_5_BIT_VALUE);
309 if (!st->chip_config.dmp_on)
312 w = MAX_5_BIT_VALUE - 1;
313 r = inv_plat_single_write(st, REG_FIFO_RST, w);
316 /* turn on FIFO output data for non-DMP mode */
319 if (!st->chip_config.dmp_on) {
320 if (st->sensor[SENSOR_GYRO].on)
321 w |= BITS_GYRO_FIFO_EN;
322 if (st->sensor[SENSOR_ACCEL].on)
323 w |= BIT_ACCEL_FIFO_EN;
324 if (st->sensor[SENSOR_COMPASS].on)
325 x |= BIT_SLV_0_FIFO_EN;
327 r = inv_plat_single_write(st, REG_FIFO_EN_2, w);
330 r = inv_plat_single_write(st, REG_FIFO_EN, x);
333 /* turn on user ctrl register */
334 if (st->chip_config.dmp_on) {
336 r = inv_plat_single_write(st, REG_USER_CTRL, w | st->i2c_dis);
339 msleep(DMP_RESET_TIME);
341 /* reset counters in dmp */
342 if (st->chip_config.dmp_on) {
343 for (i = 0; i < SENSOR_NUM_MAX; i++) {
344 if (st->sensor[i].on) {
345 r = inv_write_2bytes(st,
346 st->sensor[i].counter_addr,
353 /* turn on interrupt */
354 if (st->chip_config.dmp_on) {
355 r = inv_plat_single_write(st, REG_INT_ENABLE, BIT_DMP_INT_EN);
358 r = inv_plat_single_write(st, REG_INT_ENABLE_2,
359 BIT_FIFO_OVERFLOW_EN_0);
362 if (st->sensor[SENSOR_GYRO].on && st->sensor[SENSOR_ACCEL].on)
363 w = (BIT_DATA_RDY_0_EN | BIT_DATA_RDY_1_EN);
365 w = BIT_DATA_RDY_0_EN;
366 r = inv_plat_single_write(st, REG_INT_ENABLE_1, w);
370 if (st->chip_config.dmp_on)
372 if (st->chip_config.slave_enable)
374 r = inv_plat_single_write(st, REG_USER_CTRL, w | st->i2c_dis);
381 static int inv_turn_off_fifo(struct inv_mpu_state *st)
385 if (st->chip_config.dmp_on) {
386 r = inv_plat_single_write(st, REG_INT_ENABLE, 0);
389 r = inv_plat_single_write(st, REG_INT_ENABLE_2, 0);
391 r = inv_plat_single_write(st, REG_INT_ENABLE_1, 0);
394 r = inv_plat_single_write(st, REG_FIFO_EN_2, 0);
399 r = inv_plat_single_write(st, REG_FIFO_RST, MAX_5_BIT_VALUE);
402 r = inv_plat_single_write(st, REG_FIFO_RST, 0x0);
408 * inv_reset_fifo() - Reset FIFO related registers.
410 int inv_reset_fifo(struct iio_dev *indio_dev, bool turn_off)
412 struct inv_mpu_state *st = iio_priv(indio_dev);
416 r = inv_turn_off_fifo(st);
420 r = inv_turn_on_fifo(st);
423 st->last_run_time = get_time_ns();
424 for (i = 0; i < SENSOR_NUM_MAX; i++) {
425 if (st->sensor[i].on) {
426 st->sensor[i].ts = st->last_run_time;
427 st->sensor[i].time_calib = st->last_run_time;
428 st->sensor[i].sample_calib = 0;
429 st->sensor[i].calib_flag = 0;
432 r = read_be32_from_mem(st, &st->start_dmp_counter, DMPRATE_CNTR);
435 for (i = 0; i < ENGINE_NUM_MAX; i++)
436 st->eng_info[i].last_update_time = st->last_run_time;
438 st->step_detector_base_ts = st->last_run_time;
439 st->ts_for_calib = st->last_run_time;
440 st->last_temp_comp_time = st->last_run_time;
441 st->left_over_size = 0;
446 static int inv_turn_on_engine(struct inv_mpu_state *st)
452 if (ICM20728 == st->chip_type) {
453 if (st->chip_config.gyro_enable |
454 st->chip_config.accel_enable |
455 st->chip_config.pressure_enable) {
457 if (!st->chip_config.gyro_enable)
458 w |= BIT_PWR_GYRO_STBY;
459 if (!st->chip_config.accel_enable)
460 w |= BIT_PWR_ACCEL_STBY;
461 if (!st->chip_config.pressure_enable)
462 w |= BIT_PWR_PRESSURE_STBY;
464 w = (BIT_PWR_GYRO_STBY |
466 BIT_PWR_PRESSURE_STBY);
469 if (st->chip_config.gyro_enable |
470 st->chip_config.accel_enable) {
471 w = BIT_PWR_PRESSURE_STBY;
472 if (!st->chip_config.gyro_enable)
473 w |= BIT_PWR_GYRO_STBY;
474 if (!st->chip_config.accel_enable)
475 w |= BIT_PWR_ACCEL_STBY;
477 w = (BIT_PWR_GYRO_STBY |
479 BIT_PWR_PRESSURE_STBY);
482 r = inv_plat_single_write(st, REG_PWR_MGMT_2, w);
486 if (st->chip_config.gyro_enable)
487 msleep(GYRO_ENGINE_UP_TIME);
489 if (st->chip_config.has_compass) {
490 if (st->chip_config.compass_enable)
491 r = st->slave_compass->resume(st);
493 r = st->slave_compass->suspend(st);
497 if (st->chip_config.has_als) {
498 if (st->chip_config.als_enable)
499 r = st->slave_als->resume(st);
501 r = st->slave_als->suspend(st);
505 if (st->chip_config.has_pressure && (ICM20628 == st->chip_type)) {
506 if (st->chip_config.pressure_enable)
507 r = st->slave_pressure->resume(st);
509 r = st->slave_pressure->suspend(st);
514 /* secondary cycle mode should be set all the time */
515 w = BIT_I2C_MST_CYCLE;
516 if (st->chip_config.low_power_gyro_on)
518 w |= BIT_ACCEL_CYCLE;
519 if (w != local.reg_lp_config) {
520 r = inv_plat_single_write(st, REG_LP_CONFIG, w);
521 local.reg_lp_config = w;
527 static int inv_setup_dmp_rate(struct inv_mpu_state *st)
530 int div[SENSOR_NUM_MAX];
534 for (i = 0; i < SENSOR_NUM_MAX; i++) {
535 if (st->sensor[i].on) {
536 if (!st->sensor[i].rate) {
537 pr_err("sensor %d rate is zero\n", i);
541 st->eng_info[st->sensor[i].engine_base].running_rate /
547 /* make geomag and rv consistent */
548 if (st->sensor[SENSOR_NINEQ].on &&
549 st->sensor[SENSOR_GEOMAG].on) {
550 tmp = min(div[SENSOR_GEOMAG], div[SENSOR_NINEQ]);
551 div[SENSOR_GEOMAG] = tmp;
552 div[SENSOR_NINEQ] = tmp;
555 /* make compass and calib compass consistent */
556 if (st->sensor[SENSOR_COMPASS].on &&
557 st->sensor[SENSOR_CALIB_COMPASS].on) {
558 tmp = min(div[SENSOR_COMPASS], div[SENSOR_CALIB_COMPASS]);
559 div[SENSOR_COMPASS] = tmp;
560 div[SENSOR_CALIB_COMPASS] = tmp;
563 /* make gyro and calib gyro consistent */
564 if (st->sensor[SENSOR_GYRO].on &&
565 st->sensor[SENSOR_CALIB_GYRO].on) {
566 tmp = min(div[SENSOR_GYRO], div[SENSOR_CALIB_GYRO]);
567 div[SENSOR_GYRO] = tmp;
568 div[SENSOR_CALIB_GYRO] = tmp;
570 for (i = 0; i < SENSOR_NUM_MAX; i++) {
571 if (st->sensor[i].on) {
573 st->eng_info[st->sensor[i].engine_base].dur *
575 if (div[i] != st->sensor[i].div) {
576 st->sensor[i].div = div[i];
577 result = inv_write_2bytes(st,
578 st->sensor[i].odr_addr, div[i] - 1);
581 result = inv_out_data_cntl(st,
582 st->sensor[i].output, true);
586 } else if (-1 != st->sensor[i].div) {
587 result = inv_out_data_cntl(st,
588 st->sensor[i].output, false);
591 st->sensor[i].div = -1;
596 for (i = 0; i < SENSOR_ACCURACY_NUM_MAX; i++) {
597 result = inv_out_data_cntl_2(st,
598 st->sensor_accuracy[i].output,
599 st->sensor_accuracy[i].on);
602 d_flag |= st->sensor_accuracy[i].on;
605 if (d_flag != local.d_flag) {
606 result = inv_out_data_cntl(st, HEADER2_SET, d_flag);
609 local.d_flag = d_flag;
611 if (st->chip_config.step_indicator_on != local.step_indicator_on) {
612 result = inv_out_data_cntl(st, PED_STEPIND_SET,
613 st->chip_config.step_indicator_on);
616 local.step_indicator_on = st->chip_config.step_indicator_on;
618 if (st->chip_config.geomag_enable != local.geomag_enable) {
619 result = inv_out_data_cntl_2(st, GEOMAG_EN,
620 st->chip_config.geomag_enable);
623 local.geomag_enable = st->chip_config.geomag_enable;
625 if (st->chip_config.step_detector_on != local.step_detector_on) {
626 result = inv_out_data_cntl(st, PED_STEPDET_SET,
627 st->chip_config.step_detector_on);
630 local.step_detector_on = st->chip_config.step_detector_on;
633 if (!st->chip_config.dmp_event_int_on)
634 result = inv_batchmode_setup(st);
639 static int inv_set_pressure_rate(struct inv_mpu_state *st)
643 if ((!st->chip_config.gyro_enable) && (!st->chip_config.accel_enable))
644 r = max(st->sensor[SENSOR_PRESSURE].rate,
645 st->chip_config.compass_rate);
647 r = st->sensor[SENSOR_PRESSURE].rate;
650 while (r < MAX_PRS_RATE) {
659 st->eng_info[ENGINE_PRESSURE].running_rate = (MAX_PRS_RATE >> i);
660 st->eng_info[ENGINE_PRESSURE].divider = (1 << i);
661 r = inv_calc_engine_dur(&st->eng_info[ENGINE_PRESSURE]);
664 r = inv_plat_single_write(st, REG_PRS_ODR_CONFIG, i);
669 static int inv_set_div(struct inv_mpu_state *st, int a_d, int g_d)
673 result = inv_set_bank(st, BANK_SEL_2);
677 if (local.reg_gyro_smplrt != g_d) {
678 result = inv_plat_single_write(st, REG_GYRO_SMPLRT_DIV, g_d);
681 local.reg_gyro_smplrt = g_d;
683 if (local.reg_accel_smplrt != a_d) {
684 result = inv_plat_single_write(st, REG_ACCEL_SMPLRT_DIV_2, a_d);
687 local.reg_accel_smplrt = a_d;
689 if (st->chip_config.pressure_enable && (ICM20728 == st->chip_type)) {
690 result = inv_set_pressure_rate(st);
694 result = inv_set_bank(st, BANK_SEL_0);
699 static int inv_set_rate(struct inv_mpu_state *st)
701 int g_d, a_d, result;
703 if (st->chip_config.dmp_on) {
704 result = inv_setup_dmp_rate(st);
708 st->eng_info[ENGINE_GYRO].running_rate =
709 st->sensor[SENSOR_GYRO].rate;
710 st->eng_info[ENGINE_ACCEL].running_rate =
711 st->sensor[SENSOR_ACCEL].rate;
714 g_d = st->eng_info[ENGINE_GYRO].divider - 1;
715 a_d = st->eng_info[ENGINE_ACCEL].divider - 1;
716 result = inv_set_div(st, a_d, g_d);
723 static int inv_set_fifo_size(struct inv_mpu_state *st)
729 if (st->chip_config.dmp_on) {
730 /* use one FIFO in DMP mode */
731 cfg = BIT_SINGLE_FIFO_CFG;
734 if (st->sensor[SENSOR_GYRO].on)
736 if (st->sensor[SENSOR_ACCEL].on)
738 if (st->sensor[SENSOR_COMPASS].on)
741 cfg = BIT_MULTI_FIFO_CFG;
743 cfg = BIT_SINGLE_FIFO_CFG;
745 result = inv_plat_single_write(st, REG_FIFO_CFG, cfg);
753 * inv_set_fake_secondary() - set fake secondary I2C such that
754 * I2C data in the same position.
756 static int inv_set_fake_secondary(struct inv_mpu_state *st)
761 /* may need to saturate the master I2C counter like Scorpion did */
762 r = inv_set_bank(st, BANK_SEL_3);
765 if (st->sec_set.delay_enable != local.reg_delay_enable) {
766 r = inv_plat_single_write(st, REG_I2C_MST_DELAY_CTRL,
767 st->sec_set.delay_enable);
770 local.reg_delay_enable = st->sec_set.delay_enable;
772 if (st->sec_set.delay_time != local.reg_delay_time) {
773 r = inv_plat_single_write(st, REG_I2C_SLV4_CTRL,
774 st->sec_set.delay_time);
777 local.reg_delay_time = st->sec_set.delay_time;
779 /* odr config is changed during slave setup */
780 r = inv_plat_single_write(st, REG_I2C_MST_ODR_CONFIG,
781 st->sec_set.odr_config);
784 r = inv_set_bank(st, BANK_SEL_0);
788 if (ICM20728 == st->chip_type)
791 if (st->chip_config.compass_enable && st->chip_config.als_enable)
794 if (st->chip_config.compass_enable &&
795 (!st->chip_config.als_enable) &&
796 (!st->chip_config.pressure_enable))
798 r = inv_set_bank(st, BANK_SEL_3);
802 if (st->chip_config.pressure_enable) {
804 if ((!st->chip_config.compass_enable) &&
805 (!st->chip_config.als_enable)) {
806 r = inv_read_secondary(st, 0,
807 st->plat_data.aux_i2c_addr,
808 BMP280_DIG_T1_LSB_REG,
809 DATA_AKM_99_BYTES_DMP);
812 r = inv_read_secondary(st, 2,
813 st->plat_data.aux_i2c_addr,
814 BMP280_DIG_T1_LSB_REG,
816 r = inv_set_bank(st, BANK_SEL_0);
821 if (st->chip_config.compass_enable &&
822 (!st->chip_config.als_enable)) {
825 if ((COMPASS_ID_AK09911 ==
826 st->plat_data.sec_slave_id) ||
827 (COMPASS_ID_AK09912 ==
828 st->plat_data.sec_slave_id))
829 bytes = DATA_ALS_BYTES_DMP;
831 bytes = DATA_ALS_BYTES_DMP +
832 DATA_AKM_99_BYTES_DMP -
833 DATA_AKM_89_BYTES_DMP;
836 bytes = DATA_AKM_99_BYTES_DMP;
838 r = inv_read_secondary(st, ind, st->plat_data.aux_i2c_addr,
839 BMP280_DIG_T1_LSB_REG, bytes);
840 } else { /* compass disabled; als enabled, pressure disabled 010 */
841 r = inv_read_secondary(st, 0, st->plat_data.read_only_i2c_addr,
842 APDS9900_AILTL_REG, DATA_AKM_99_BYTES_DMP);
846 r = inv_set_bank(st, BANK_SEL_0);
850 static int inv_set_ICM20728_secondary(struct inv_mpu_state *st)
855 static int inv_set_ICM20628_secondary(struct inv_mpu_state *st)
857 int rate, compass_rate, pressure_rate, als_rate, min_rate, base;
858 int mst_odr_config, d, delay;
860 if (st->chip_config.compass_enable)
861 compass_rate = st->chip_config.compass_rate;
864 if (st->chip_config.pressure_enable)
865 pressure_rate = st->sensor[SENSOR_PRESSURE].rate;
868 if (st->chip_config.als_enable)
869 als_rate = st->sensor[SENSOR_ALS].rate;
875 rate = max(pressure_rate, als_rate);
877 min_rate = BASE_SAMPLE_RATE;
879 while (rate < min_rate) {
883 if (mst_odr_config < MIN_MST_ODR_CONFIG)
884 mst_odr_config = MIN_MST_ODR_CONFIG;
886 if (mst_odr_config > MAX_MST_NON_COMPASS_ODR_CONFIG)
887 mst_odr_config = MAX_MST_NON_COMPASS_ODR_CONFIG;
890 base = BASE_SAMPLE_RATE / (1 << mst_odr_config);
891 if ((!st->chip_config.gyro_enable) &&
892 (!st->chip_config.accel_enable)) {
893 st->eng_info[ENGINE_I2C].running_rate = base;
894 st->eng_info[ENGINE_I2C].divider = (1 << mst_odr_config);
896 inv_calc_engine_dur(&st->eng_info[ENGINE_I2C]);
901 if (d > MAX_5_BIT_VALUE)
904 /* I2C_MST_DLY is set to slow down secondary I2C */
910 st->sec_set.delay_enable = delay;
911 st->sec_set.delay_time = d;
912 st->sec_set.odr_config = mst_odr_config;
917 static int inv_set_master_delay(struct inv_mpu_state *st)
920 if (!st->chip_config.slave_enable)
922 if (ICM20728 == st->chip_type)
923 inv_set_ICM20728_secondary(st);
925 inv_set_ICM20628_secondary(st);
930 static int inv_enable_accel_cal_V3(struct inv_mpu_state *st, u8 enable)
932 return inv_write_cntl(st, ACCEL_CAL_EN << 8, enable, MOTION_EVENT_CTL);
935 static int inv_enable_gyro_cal_V3(struct inv_mpu_state *st, u8 enable)
937 return inv_write_cntl(st, GYRO_CAL_EN << 8, enable, MOTION_EVENT_CTL);
940 static int inv_enable_compass_cal_V3(struct inv_mpu_state *st, u8 enable)
942 return inv_write_cntl(st, COMPASS_CAL_EN, enable, MOTION_EVENT_CTL);
945 static int inv_enable_9axes_V3(struct inv_mpu_state *st)
949 if (st->sensor[SENSOR_NINEQ].on ||
950 st->sensor[SENSOR_GEOMAG].on ||
951 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on)
956 return inv_write_cntl(st, NINE_AXIS_EN, en, MOTION_EVENT_CTL);
959 static int inv_set_wom(struct inv_mpu_state *st)
962 u8 d[4] = {0, 0, 0, 0};
964 if (st->chip_config.wom_on)
967 if (local.wom_on != st->chip_config.wom_on) {
968 result = mem_w(WOM_ENABLE, ARRAY_SIZE(d), d);
971 local.wom_on = st->chip_config.wom_on;
974 inv_write_2bytes(st, 0x8a, st->chip_config.gyro_enable |
975 (st->chip_config.accel_enable << 1) |
976 (st->chip_config.slave_enable << 3));
981 static int inv_setup_events(struct inv_mpu_state *st)
985 result = inv_write_cntl(st, PEDOMETER_EN << 8, st->ped.engine_on,
990 result = inv_write_cntl(st, SMD_EN << 8, st->smd.on,
996 static int inv_setup_sensor_interrupt(struct inv_mpu_state *st)
1005 for (i = 0; i < SENSOR_NUM_MAX; i++) {
1006 if (st->sensor[i].on) {
1008 cntl |= st->sensor[i].output;
1010 if (st->sensor[i].rate > rate) {
1012 rate = st->sensor[i].rate;
1017 // Take appropriate output for sensors sharing same configuration address
1020 for (i = 0; i < SENSOR_NUM_MAX; i++) {
1021 if ((st->sensor[i].odr_addr == st->sensor[ind].odr_addr) &&
1023 if (!st->sensor[ind].output) {
1030 cntl |= st->sensor[ind].output;
1031 if (st->chip_config.step_detector_on)
1032 cntl |= PED_STEPDET_SET;
1034 return inv_write_2bytes(st, DATA_INTR_CTL, cntl);
1037 static int inv_setup_dmp(struct inv_mpu_state *st)
1039 int result, i, tmp, min_diff, ind;
1041 result = inv_setup_sensor_interrupt(st);
1047 min_diff = accel_cal_para[0].freq;
1048 while (i < ARRAY_SIZE(accel_cal_para)) {
1049 tmp = abs(accel_cal_para[i].freq -
1050 st->eng_info[ENGINE_ACCEL].running_rate);
1051 if (tmp < min_diff) {
1058 if (i != local.accel_cal_ind) {
1059 result = inv_write_2bytes(st,
1060 ACCEL_CAL_RATE, accel_cal_para[i].rate);
1063 result = write_be32_to_mem(st,
1064 accel_cal_para[i].rate, PED_RATE);
1067 result = write_be32_to_mem(st,
1068 accel_cal_para[i].alpha, ACCEL_ALPHA_VAR);
1071 result = write_be32_to_mem(st,
1072 accel_cal_para[i].a, ACCEL_A_VAR);
1075 result = write_be32_to_mem(st,
1076 accel_cal_para[i].gain, ACCEL_ONLY_GAIN);
1079 local.accel_cal_ind = i;
1082 min_diff = compass_cal_param[0].ct;
1083 while (i < ARRAY_SIZE(compass_cal_param)) {
1084 tmp = abs(compass_cal_param[i].ct -
1085 st->eng_info[ENGINE_I2C].running_rate);
1086 if (tmp < min_diff) {
1093 if ((i != local.cpass_cal_ind) &&
1094 (st->eng_info[ENGINE_I2C].running_rate)) {
1095 result = inv_write_2bytes(st, CPASS_TIME_BUFFER,
1096 compass_cal_param[i].ct);
1099 result = write_be32_to_mem(st, compass_cal_param[i].RADIUS_3D,
1100 CPASS_RADIUS_3D_THRESH_ANOMALY);
1104 local.cpass_cal_ind = i;
1107 if (local.accel_cal_enable != st->accel_cal_enable) {
1108 result = inv_enable_accel_cal_V3(st, st->accel_cal_enable);
1111 local.accel_cal_enable = st->accel_cal_enable;
1113 if (local.gyro_cal_enable != st->gyro_cal_enable) {
1114 result = inv_enable_gyro_cal_V3(st, st->gyro_cal_enable);
1117 local.gyro_cal_enable = st->gyro_cal_enable;
1119 if (local.compass_cal_enable != st->compass_cal_enable) {
1120 result = inv_enable_compass_cal_V3(st, st->compass_cal_enable);
1123 local.compass_cal_enable = st->compass_cal_enable;
1125 result = inv_enable_9axes_V3(st);
1129 if (EVENT_TRIGGER == st->trigger_state) {
1130 result = inv_setup_events(st);
1135 result = inv_set_wom(st);
1140 static int inv_get_accel_gyro_rate(int compass_rate)
1145 while ((i < ARRAY_SIZE(accel_gyro_rate)) &&
1146 compass_rate > accel_gyro_rate[i])
1149 return accel_gyro_rate[i];
1152 static int inv_determine_engine(struct inv_mpu_state *st)
1155 bool a_en, g_en, c_en, p_en, data_on, ped_on;
1156 int compass_rate, pressure_rate, nineq_rate, accel_rate, gyro_rate;
1159 #define NINEQ_MIN_COMPASS_RATE 35
1160 #define GEOMAG_MIN_COMPASS_RATE 70
1161 if (st->chip_config.debug_data_collection_mode_on) {
1162 st->chip_config.dmp_on = 0;
1163 st->eng_info[ENGINE_GYRO].divider =
1165 st->chip_config.debug_data_collection_gyro_freq;
1166 st->eng_info[ENGINE_ACCEL].divider =
1168 st->chip_config.debug_data_collection_accel_freq;
1169 inv_calc_engine_dur(&st->eng_info[ENGINE_GYRO]);
1170 inv_calc_engine_dur(&st->eng_info[ENGINE_ACCEL]);
1171 st->chip_config.gyro_enable = true;
1172 st->chip_config.accel_enable = true;
1173 st->sensor[SENSOR_GYRO].on = true;
1174 st->sensor[SENSOR_ACCEL].on = true;
1175 st->sensor[SENSOR_GYRO].dur = st->eng_info[ENGINE_GYRO].dur;
1176 st->sensor[SENSOR_ACCEL].dur = st->eng_info[ENGINE_ACCEL].dur;
1189 gyro_rate = MPU_INIT_SENSOR_RATE;
1190 accel_rate = MPU_INIT_SENSOR_RATE;
1192 st->chip_config.geomag_enable = 0;
1193 if (st->sensor[SENSOR_NINEQ].on)
1194 nineq_rate = max(nineq_rate, NINEQ_MIN_COMPASS_RATE);
1195 else if (st->sensor[SENSOR_GEOMAG].on)
1196 nineq_rate = max(nineq_rate, GEOMAG_MIN_COMPASS_RATE);
1198 if (st->sensor[SENSOR_NINEQ].on) {
1199 st->sensor[SENSOR_GEOMAG].output = 0;
1200 st->sensor[SENSOR_GEOMAG].sample_size = 0;
1201 st->sensor[SENSOR_NINEQ].output = QUAT9_SET;
1202 st->sensor[SENSOR_NINEQ].sample_size = QUAT9_DATA_SZ;
1203 } else if (st->sensor[SENSOR_GEOMAG].on) {
1204 st->sensor[SENSOR_NINEQ].output = 0;
1205 st->sensor[SENSOR_NINEQ].sample_size = 0;
1206 st->sensor[SENSOR_GEOMAG].output = QUAT9_SET;
1207 st->sensor[SENSOR_GEOMAG].sample_size = QUAT9_DATA_SZ;
1208 st->chip_config.geomag_enable = 1;
1211 for (i = 0; i < SENSOR_NUM_MAX; i++) {
1212 if (st->sensor[i].on) {
1214 a_en |= st->sensor[i].a_en;
1215 g_en |= st->sensor[i].g_en;
1216 c_en |= st->sensor[i].c_en;
1217 p_en |= st->sensor[i].p_en;
1218 if (st->sensor[i].c_en &&
1219 (i != SENSOR_NINEQ) &&
1220 (i != SENSOR_GEOMAG))
1222 max(compass_rate, st->sensor[i].rate);
1223 if (st->sensor[i].p_en)
1225 max(pressure_rate, st->sensor[i].rate);
1228 if (st->chip_config.step_detector_on ||
1229 st->chip_config.step_indicator_on) {
1233 if (st->ped.on || ped_on || st->smd.on)
1234 st->ped.engine_on = true;
1236 st->ped.engine_on = false;
1237 if (st->sensor[SENSOR_ALS].on)
1238 st->chip_config.als_enable = true;
1240 st->chip_config.als_enable = false;
1241 if (st->ped.engine_on)
1245 st->chip_config.dmp_event_int_on = 0;
1247 st->chip_config.dmp_event_int_on = 1;
1249 if (st->chip_config.dmp_event_int_on)
1250 st->chip_config.wom_on = 1;
1252 st->chip_config.wom_on = 0;
1254 if (compass_rate < nineq_rate)
1255 compass_rate = nineq_rate;
1256 if (compass_rate > MAX_COMPASS_RATE)
1257 compass_rate = MAX_COMPASS_RATE;
1258 st->chip_config.compass_rate = compass_rate;
1259 if (st->sensor[SENSOR_NINEQ].on ||
1260 st->sensor[SENSOR_GEOMAG].on ||
1261 st->sensor[SENSOR_SIXQ].on ||
1262 st->sensor[SENSOR_PEDQ].on) {
1263 /* if 6 Q or 9 Q is on, set gyro/accel to default rate */
1264 accel_rate = MPU_DEFAULT_DMP_FREQ;
1265 gyro_rate = MPU_DEFAULT_DMP_FREQ;
1267 if (st->ped.engine_on) {
1268 if (st->sensor[SENSOR_ACCEL].on) {
1269 if (st->sensor[SENSOR_ACCEL].rate <
1271 accel_rate = PEDOMETER_FREQ;
1274 st->sensor[SENSOR_ACCEL].rate;
1277 accel_rate = PEDOMETER_FREQ;
1280 accel_rate = st->sensor[SENSOR_ACCEL].rate;
1284 gyro_rate = max(gyro_rate, PEDOMETER_FREQ);
1285 accel_rate = max(accel_rate, PEDOMETER_FREQ);
1287 if (st->sensor[SENSOR_GYRO].on)
1288 gyro_rate = max(gyro_rate, st->sensor[SENSOR_GYRO].rate);
1289 if (st->sensor[SENSOR_CALIB_GYRO].on)
1290 gyro_rate = max(gyro_rate, st->sensor[SENSOR_CALIB_GYRO].rate);
1294 gyro_rate = max(gyro_rate, accel_rate);
1296 if (gyro_rate < compass_rate)
1298 inv_get_accel_gyro_rate(compass_rate);
1300 accel_rate = gyro_rate;
1301 compass_rate = gyro_rate;
1304 if (accel_rate < compass_rate)
1306 inv_get_accel_gyro_rate(compass_rate);
1308 compass_rate = accel_rate;
1309 gyro_rate = accel_rate;
1312 st->eng_info[ENGINE_GYRO].running_rate = gyro_rate;
1313 st->eng_info[ENGINE_ACCEL].running_rate = accel_rate;
1314 st->eng_info[ENGINE_PRESSURE].running_rate = MPU_DEFAULT_DMP_FREQ;
1315 st->eng_info[ENGINE_I2C].running_rate = compass_rate;
1316 /* engine divider for pressure and compass is set later */
1317 st->eng_info[ENGINE_GYRO].divider =
1318 (BASE_SAMPLE_RATE / MPU_DEFAULT_DMP_FREQ) *
1319 (MPU_DEFAULT_DMP_FREQ /
1320 st->eng_info[ENGINE_GYRO].running_rate);
1321 st->eng_info[ENGINE_ACCEL].divider =
1322 (BASE_SAMPLE_RATE / MPU_DEFAULT_DMP_FREQ) *
1323 (MPU_DEFAULT_DMP_FREQ /
1324 st->eng_info[ENGINE_ACCEL].running_rate);
1325 st->eng_info[ENGINE_I2C].divider =
1326 (BASE_SAMPLE_RATE / MPU_DEFAULT_DMP_FREQ) *
1327 (MPU_DEFAULT_DMP_FREQ /
1328 st->eng_info[ENGINE_ACCEL].running_rate);
1330 base_time = NSEC_PER_SEC;
1332 st->eng_info[ENGINE_GYRO].base_time = base_time;
1333 st->eng_info[ENGINE_ACCEL].base_time = base_time;
1334 st->eng_info[ENGINE_I2C].base_time = base_time;
1336 inv_calc_engine_dur(&st->eng_info[ENGINE_GYRO]);
1337 inv_calc_engine_dur(&st->eng_info[ENGINE_ACCEL]);
1339 if (st->debug_determine_engine_on)
1342 st->chip_config.gyro_enable = g_en;
1343 st->chip_config.accel_enable = a_en;
1344 st->chip_config.compass_enable = c_en;
1345 st->chip_config.pressure_enable = p_en;
1346 st->chip_config.dmp_on = 1;
1347 /* if gyro is enabled, geomag become 9 axes */
1349 st->chip_config.geomag_enable = 0;
1351 st->chip_config.geomag_enable = 1;
1352 if (c_en || st->chip_config.als_enable ||
1353 (p_en && (ICM20628 == st->chip_type)))
1354 st->chip_config.slave_enable = 1;
1356 st->chip_config.slave_enable = 0;
1358 st->accel_cal_enable = 1;
1360 st->accel_cal_enable = 0;
1363 st->gyro_cal_enable = 1;
1365 st->gyro_cal_enable = 0;
1368 st->compass_cal_enable = 1;
1370 st->compass_cal_enable = 0;
1372 /* setting up accuracy output */
1373 if (st->sensor[SENSOR_ACCEL].on || st->sensor[SENSOR_NINEQ].on ||
1374 st->sensor[SENSOR_SIXQ].on)
1375 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].on = true;
1377 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].on = false;
1379 if (st->sensor[SENSOR_CALIB_GYRO].on || st->sensor[SENSOR_NINEQ].on ||
1380 st->sensor[SENSOR_SIXQ].on)
1381 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].on = true;
1383 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].on = false;
1385 if (st->sensor[SENSOR_CALIB_COMPASS].on || st->sensor[SENSOR_NINEQ].on)
1386 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on = true;
1388 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].on = false;
1390 inv_set_master_delay(st);
1396 * set_inv_enable() - enable function.
1398 int set_inv_enable(struct iio_dev *indio_dev)
1400 struct inv_mpu_state *st = iio_priv(indio_dev);
1403 inv_determine_engine(st);
1404 result = inv_switch_power_in_lp(st, true);
1408 result = inv_stop_dmp(st);
1411 result = inv_set_rate(st);
1413 pr_err("inv_set_rate error\n");
1416 if (st->chip_config.dmp_on) {
1417 result = inv_setup_dmp(st);
1419 pr_err("setup dmp error\n");
1423 result = inv_turn_on_engine(st);
1425 pr_err("inv_turn_on_engine error\n");
1428 result = inv_set_fifo_size(st);
1430 pr_err("inv_set_fifo_size error\n");
1433 result = inv_set_fake_secondary(st);
1437 result = inv_reset_fifo(indio_dev, false);
1440 result = inv_switch_power_in_lp(st, false);
1442 if ((!st->chip_config.gyro_enable) &&
1443 (!st->chip_config.accel_enable) &&
1444 (!st->chip_config.slave_enable) &&
1445 (!st->chip_config.pressure_enable)) {
1446 inv_set_power(st, false);
1453 void inv_init_sensor_struct(struct inv_mpu_state *st)
1457 for (i = 0; i < SENSOR_NUM_MAX; i++)
1458 st->sensor[i].rate = MPU_INIT_SENSOR_RATE;
1460 st->sensor[SENSOR_ACCEL].sample_size = ACCEL_DATA_SZ;
1461 st->sensor[SENSOR_GYRO].sample_size = GYRO_DATA_SZ;
1462 st->sensor[SENSOR_COMPASS].sample_size = CPASS_DATA_SZ;
1463 st->sensor[SENSOR_ALS].sample_size = ALS_DATA_SZ;
1464 st->sensor[SENSOR_PRESSURE].sample_size = PRESSURE_DATA_SZ;
1465 st->sensor[SENSOR_SIXQ].sample_size = QUAT6_DATA_SZ;
1466 st->sensor[SENSOR_PEDQ].sample_size = PQUAT6_DATA_SZ;
1467 st->sensor[SENSOR_CALIB_GYRO].sample_size = GYRO_CALIBR_DATA_SZ;
1468 st->sensor[SENSOR_CALIB_COMPASS].sample_size = CPASS_CALIBR_DATA_SZ;
1469 st->sensor[SENSOR_NINEQ].sample_size = QUAT9_DATA_SZ;
1470 st->sensor[SENSOR_GEOMAG].sample_size = QUAT9_DATA_SZ;
1472 st->sensor[SENSOR_ACCEL].odr_addr = ODR_ACCEL;
1473 st->sensor[SENSOR_GYRO].odr_addr = ODR_GYRO;
1474 st->sensor[SENSOR_COMPASS].odr_addr = ODR_CPASS;
1475 st->sensor[SENSOR_ALS].odr_addr = ODR_ALS;
1476 st->sensor[SENSOR_PRESSURE].odr_addr = ODR_PRESSURE;
1477 st->sensor[SENSOR_SIXQ].odr_addr = ODR_QUAT6;
1478 st->sensor[SENSOR_PEDQ].odr_addr = ODR_PQUAT6;
1479 st->sensor[SENSOR_CALIB_GYRO].odr_addr = ODR_GYRO_CALIBR;
1480 st->sensor[SENSOR_CALIB_COMPASS].odr_addr = ODR_CPASS_CALIBR;
1481 st->sensor[SENSOR_NINEQ].odr_addr = ODR_QUAT9;
1482 st->sensor[SENSOR_GEOMAG].odr_addr = ODR_QUAT9;
1484 st->sensor[SENSOR_ACCEL].counter_addr = ODR_CNTR_ACCEL;
1485 st->sensor[SENSOR_GYRO].counter_addr = ODR_CNTR_GYRO;
1486 st->sensor[SENSOR_COMPASS].counter_addr = ODR_CNTR_CPASS;
1487 st->sensor[SENSOR_ALS].counter_addr = ODR_CNTR_ALS;
1488 st->sensor[SENSOR_PRESSURE].counter_addr = ODR_CNTR_PRESSURE;
1489 st->sensor[SENSOR_SIXQ].counter_addr = ODR_CNTR_QUAT6;
1490 st->sensor[SENSOR_PEDQ].counter_addr = ODR_CNTR_PQUAT6;
1491 st->sensor[SENSOR_CALIB_GYRO].counter_addr = ODR_CNTR_GYRO_CALIBR;
1492 st->sensor[SENSOR_CALIB_COMPASS].counter_addr = ODR_CNTR_CPASS_CALIBR;
1493 st->sensor[SENSOR_NINEQ].counter_addr = ODR_CNTR_QUAT9;
1494 st->sensor[SENSOR_GEOMAG].counter_addr = ODR_CNTR_QUAT9;
1496 st->sensor[SENSOR_ACCEL].output = ACCEL_SET;
1497 st->sensor[SENSOR_GYRO].output = GYRO_SET;
1498 st->sensor[SENSOR_COMPASS].output = CPASS_SET;
1499 st->sensor[SENSOR_ALS].output = ALS_SET;
1500 st->sensor[SENSOR_PRESSURE].output = PRESSURE_SET;
1501 st->sensor[SENSOR_SIXQ].output = QUAT6_SET;
1502 st->sensor[SENSOR_PEDQ].output = PQUAT6_SET;
1503 st->sensor[SENSOR_CALIB_GYRO].output = GYRO_CALIBR_SET;
1504 st->sensor[SENSOR_CALIB_COMPASS].output = CPASS_CALIBR_SET;
1505 st->sensor[SENSOR_NINEQ].output = QUAT9_SET;
1506 st->sensor[SENSOR_GEOMAG].output = QUAT9_SET;
1508 st->sensor[SENSOR_ACCEL].header = ACCEL_HDR;
1509 st->sensor[SENSOR_GYRO].header = GYRO_HDR;
1510 st->sensor[SENSOR_COMPASS].header = COMPASS_HDR;
1511 st->sensor[SENSOR_ALS].header = ALS_HDR;
1512 st->sensor[SENSOR_PRESSURE].header = PRESSURE_HDR;
1513 st->sensor[SENSOR_SIXQ].header = SIXQUAT_HDR;
1514 st->sensor[SENSOR_PEDQ].header = PEDQUAT_HDR;
1515 st->sensor[SENSOR_CALIB_GYRO].header = GYRO_CALIB_HDR;
1516 st->sensor[SENSOR_CALIB_COMPASS].header = COMPASS_CALIB_HDR;
1517 st->sensor[SENSOR_NINEQ].header = NINEQUAT_HDR;
1518 st->sensor[SENSOR_GEOMAG].header = NINEQUAT_HDR;
1520 st->sensor[SENSOR_ACCEL].a_en = true;
1521 st->sensor[SENSOR_GYRO].a_en = false;
1522 st->sensor[SENSOR_COMPASS].a_en = false;
1523 st->sensor[SENSOR_ALS].a_en = false;
1524 st->sensor[SENSOR_PRESSURE].a_en = false;
1525 st->sensor[SENSOR_SIXQ].a_en = true;
1526 st->sensor[SENSOR_PEDQ].a_en = true;
1527 st->sensor[SENSOR_CALIB_GYRO].a_en = false;
1528 st->sensor[SENSOR_CALIB_COMPASS].a_en = false;
1529 st->sensor[SENSOR_NINEQ].a_en = true;
1530 st->sensor[SENSOR_GEOMAG].a_en = true;
1532 st->sensor[SENSOR_ACCEL].g_en = false;
1533 st->sensor[SENSOR_GYRO].g_en = true;
1534 st->sensor[SENSOR_COMPASS].g_en = false;
1535 st->sensor[SENSOR_ALS].g_en = false;
1536 st->sensor[SENSOR_PRESSURE].g_en = false;
1537 st->sensor[SENSOR_SIXQ].g_en = true;
1538 st->sensor[SENSOR_PEDQ].g_en = true;
1539 st->sensor[SENSOR_CALIB_GYRO].g_en = true;
1540 st->sensor[SENSOR_CALIB_COMPASS].g_en = false;
1541 st->sensor[SENSOR_NINEQ].g_en = true;
1542 st->sensor[SENSOR_GEOMAG].g_en = false;
1544 st->sensor[SENSOR_ACCEL].c_en = false;
1545 st->sensor[SENSOR_GYRO].c_en = false;
1546 st->sensor[SENSOR_COMPASS].c_en = true;
1547 st->sensor[SENSOR_ALS].c_en = false;
1548 st->sensor[SENSOR_PRESSURE].c_en = false;
1549 st->sensor[SENSOR_SIXQ].c_en = false;
1550 st->sensor[SENSOR_PEDQ].c_en = false;
1551 st->sensor[SENSOR_CALIB_GYRO].c_en = false;
1552 st->sensor[SENSOR_CALIB_COMPASS].c_en = true;
1553 st->sensor[SENSOR_NINEQ].c_en = true;
1554 st->sensor[SENSOR_GEOMAG].c_en = true;
1556 st->sensor[SENSOR_ACCEL].p_en = false;
1557 st->sensor[SENSOR_GYRO].p_en = false;
1558 st->sensor[SENSOR_COMPASS].p_en = false;
1559 st->sensor[SENSOR_ALS].p_en = false;
1560 st->sensor[SENSOR_PRESSURE].p_en = true;
1561 st->sensor[SENSOR_SIXQ].p_en = false;
1562 st->sensor[SENSOR_PEDQ].p_en = false;
1563 st->sensor[SENSOR_CALIB_GYRO].p_en = false;
1564 st->sensor[SENSOR_CALIB_COMPASS].p_en = false;
1565 st->sensor[SENSOR_NINEQ].p_en = false;
1566 st->sensor[SENSOR_GEOMAG].p_en = false;
1568 st->sensor[SENSOR_ACCEL].engine_base = ENGINE_ACCEL;
1569 st->sensor[SENSOR_GYRO].engine_base = ENGINE_GYRO;
1570 st->sensor[SENSOR_COMPASS].engine_base = ENGINE_I2C;
1571 st->sensor[SENSOR_ALS].engine_base = ENGINE_I2C;
1572 st->sensor[SENSOR_PRESSURE].engine_base = ENGINE_I2C;
1573 st->sensor[SENSOR_SIXQ].engine_base = ENGINE_GYRO;
1574 st->sensor[SENSOR_PEDQ].engine_base = ENGINE_GYRO;
1575 st->sensor[SENSOR_CALIB_GYRO].engine_base = ENGINE_GYRO;
1576 st->sensor[SENSOR_CALIB_COMPASS].engine_base = ENGINE_I2C;
1577 st->sensor[SENSOR_NINEQ].engine_base = ENGINE_GYRO;
1578 st->sensor[SENSOR_GEOMAG].engine_base = ENGINE_ACCEL;
1580 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].sample_size =
1582 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].sample_size =
1584 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].sample_size =
1587 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].output =
1589 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].output =
1591 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].output =
1594 st->sensor_accuracy[SENSOR_ACCEL_ACCURACY].header =
1596 st->sensor_accuracy[SENSOR_GYRO_ACCURACY].header =
1598 st->sensor_accuracy[SENSOR_COMPASS_ACCURACY].header =