-
Notifications
You must be signed in to change notification settings - Fork 100
/
bmi160_defs.h
1647 lines (1321 loc) · 56.2 KB
/
bmi160_defs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* Copyright (c) 2021 Bosch Sensortec GmbH. All rights reserved.
*
* BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @file bmi160_defs.h
* @date 2021-10-05
* @version v3.9.2
*
*/
#ifndef BMI160_DEFS_H_
#define BMI160_DEFS_H_
/*************************** C types headers *****************************/
#ifdef __KERNEL__
#include <linux/types.h>
#include <linux/kernel.h>
#else
#include <stdint.h>
#include <stddef.h>
#endif
/*************************** Common macros *****************************/
#if !defined(UINT8_C) && !defined(INT8_C)
#define INT8_C(x) S8_C(x)
#define UINT8_C(x) U8_C(x)
#endif
#if !defined(UINT16_C) && !defined(INT16_C)
#define INT16_C(x) S16_C(x)
#define UINT16_C(x) U16_C(x)
#endif
#if !defined(INT32_C) && !defined(UINT32_C)
#define INT32_C(x) S32_C(x)
#define UINT32_C(x) U32_C(x)
#endif
#if !defined(INT64_C) && !defined(UINT64_C)
#define INT64_C(x) S64_C(x)
#define UINT64_C(x) U64_C(x)
#endif
/**@}*/
/**\name C standard macros */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *) 0)
#endif
#endif
/*************************** Sensor macros *****************************/
/* Test for an endian machine */
#ifndef __ORDER_LITTLE_ENDIAN__
#define __ORDER_LITTLE_ENDIAN__ 0
#endif
#ifndef __BYTE_ORDER__
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#endif
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN 1
#endif
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#ifndef BIG_ENDIAN
#define BIG_ENDIAN 1
#endif
#else
#error "Code does not support Endian format of the processor"
#endif
/** Mask definitions */
#define BMI160_ACCEL_BW_MASK UINT8_C(0x70)
#define BMI160_ACCEL_ODR_MASK UINT8_C(0x0F)
#define BMI160_ACCEL_UNDERSAMPLING_MASK UINT8_C(0x80)
#define BMI160_ACCEL_RANGE_MASK UINT8_C(0x0F)
#define BMI160_GYRO_BW_MASK UINT8_C(0x30)
#define BMI160_GYRO_ODR_MASK UINT8_C(0x0F)
#define BMI160_GYRO_RANGE_MASK UINT8_C(0x07)
#define BMI160_ACCEL_BW_POS UINT8_C(4)
#define BMI160_GYRO_BW_POS UINT8_C(4)
/** Mask definitions for INT_EN registers */
#define BMI160_ANY_MOTION_X_INT_EN_MASK UINT8_C(0x01)
#define BMI160_HIGH_G_X_INT_EN_MASK UINT8_C(0x01)
#define BMI160_NO_MOTION_X_INT_EN_MASK UINT8_C(0x01)
#define BMI160_ANY_MOTION_Y_INT_EN_MASK UINT8_C(0x02)
#define BMI160_HIGH_G_Y_INT_EN_MASK UINT8_C(0x02)
#define BMI160_NO_MOTION_Y_INT_EN_MASK UINT8_C(0x02)
#define BMI160_ANY_MOTION_Z_INT_EN_MASK UINT8_C(0x04)
#define BMI160_HIGH_G_Z_INT_EN_MASK UINT8_C(0x04)
#define BMI160_NO_MOTION_Z_INT_EN_MASK UINT8_C(0x04)
#define BMI160_SIG_MOTION_INT_EN_MASK UINT8_C(0x07)
#define BMI160_ANY_MOTION_ALL_INT_EN_MASK UINT8_C(0x07)
#define BMI160_STEP_DETECT_INT_EN_MASK UINT8_C(0x08)
#define BMI160_DOUBLE_TAP_INT_EN_MASK UINT8_C(0x10)
#define BMI160_SINGLE_TAP_INT_EN_MASK UINT8_C(0x20)
#define BMI160_FIFO_FULL_INT_EN_MASK UINT8_C(0x20)
#define BMI160_ORIENT_INT_EN_MASK UINT8_C(0x40)
#define BMI160_FIFO_WATERMARK_INT_EN_MASK UINT8_C(0x40)
#define BMI160_LOW_G_INT_EN_MASK UINT8_C(0x08)
#define BMI160_STEP_DETECT_EN_MASK UINT8_C(0x08)
#define BMI160_FLAT_INT_EN_MASK UINT8_C(0x80)
#define BMI160_DATA_RDY_INT_EN_MASK UINT8_C(0x10)
/** PMU status Macros */
#define BMI160_AUX_PMU_SUSPEND UINT8_C(0x00)
#define BMI160_AUX_PMU_NORMAL UINT8_C(0x01)
#define BMI160_AUX_PMU_LOW_POWER UINT8_C(0x02)
#define BMI160_GYRO_PMU_SUSPEND UINT8_C(0x00)
#define BMI160_GYRO_PMU_NORMAL UINT8_C(0x01)
#define BMI160_GYRO_PMU_FSU UINT8_C(0x03)
#define BMI160_ACCEL_PMU_SUSPEND UINT8_C(0x00)
#define BMI160_ACCEL_PMU_NORMAL UINT8_C(0x01)
#define BMI160_ACCEL_PMU_LOW_POWER UINT8_C(0x02)
/** Mask definitions for INT_OUT_CTRL register */
#define BMI160_INT1_EDGE_CTRL_MASK UINT8_C(0x01)
#define BMI160_INT1_OUTPUT_MODE_MASK UINT8_C(0x04)
#define BMI160_INT1_OUTPUT_TYPE_MASK UINT8_C(0x02)
#define BMI160_INT1_OUTPUT_EN_MASK UINT8_C(0x08)
#define BMI160_INT2_EDGE_CTRL_MASK UINT8_C(0x10)
#define BMI160_INT2_OUTPUT_MODE_MASK UINT8_C(0x40)
#define BMI160_INT2_OUTPUT_TYPE_MASK UINT8_C(0x20)
#define BMI160_INT2_OUTPUT_EN_MASK UINT8_C(0x80)
/** Mask definitions for INT_LATCH register */
#define BMI160_INT1_INPUT_EN_MASK UINT8_C(0x10)
#define BMI160_INT2_INPUT_EN_MASK UINT8_C(0x20)
#define BMI160_INT_LATCH_MASK UINT8_C(0x0F)
/** Mask definitions for INT_MAP register */
#define BMI160_INT1_LOW_G_MASK UINT8_C(0x01)
#define BMI160_INT1_HIGH_G_MASK UINT8_C(0x02)
#define BMI160_INT1_SLOPE_MASK UINT8_C(0x04)
#define BMI160_INT1_NO_MOTION_MASK UINT8_C(0x08)
#define BMI160_INT1_DOUBLE_TAP_MASK UINT8_C(0x10)
#define BMI160_INT1_SINGLE_TAP_MASK UINT8_C(0x20)
#define BMI160_INT1_FIFO_FULL_MASK UINT8_C(0x20)
#define BMI160_INT1_FIFO_WM_MASK UINT8_C(0x40)
#define BMI160_INT1_ORIENT_MASK UINT8_C(0x40)
#define BMI160_INT1_FLAT_MASK UINT8_C(0x80)
#define BMI160_INT1_DATA_READY_MASK UINT8_C(0x80)
#define BMI160_INT2_LOW_G_MASK UINT8_C(0x01)
#define BMI160_INT1_LOW_STEP_DETECT_MASK UINT8_C(0x01)
#define BMI160_INT2_LOW_STEP_DETECT_MASK UINT8_C(0x01)
#define BMI160_INT2_HIGH_G_MASK UINT8_C(0x02)
#define BMI160_INT2_FIFO_FULL_MASK UINT8_C(0x02)
#define BMI160_INT2_FIFO_WM_MASK UINT8_C(0x04)
#define BMI160_INT2_SLOPE_MASK UINT8_C(0x04)
#define BMI160_INT2_DATA_READY_MASK UINT8_C(0x08)
#define BMI160_INT2_NO_MOTION_MASK UINT8_C(0x08)
#define BMI160_INT2_DOUBLE_TAP_MASK UINT8_C(0x10)
#define BMI160_INT2_SINGLE_TAP_MASK UINT8_C(0x20)
#define BMI160_INT2_ORIENT_MASK UINT8_C(0x40)
#define BMI160_INT2_FLAT_MASK UINT8_C(0x80)
/** Mask definitions for INT_DATA register */
#define BMI160_TAP_SRC_INT_MASK UINT8_C(0x08)
#define BMI160_LOW_HIGH_SRC_INT_MASK UINT8_C(0x80)
#define BMI160_MOTION_SRC_INT_MASK UINT8_C(0x80)
/** Mask definitions for INT_MOTION register */
#define BMI160_SLOPE_INT_DUR_MASK UINT8_C(0x03)
#define BMI160_NO_MOTION_INT_DUR_MASK UINT8_C(0xFC)
#define BMI160_NO_MOTION_SEL_BIT_MASK UINT8_C(0x01)
/** Mask definitions for INT_TAP register */
#define BMI160_TAP_DUR_MASK UINT8_C(0x07)
#define BMI160_TAP_SHOCK_DUR_MASK UINT8_C(0x40)
#define BMI160_TAP_QUIET_DUR_MASK UINT8_C(0x80)
#define BMI160_TAP_THRES_MASK UINT8_C(0x1F)
/** Mask definitions for INT_FLAT register */
#define BMI160_FLAT_THRES_MASK UINT8_C(0x3F)
#define BMI160_FLAT_HOLD_TIME_MASK UINT8_C(0x30)
#define BMI160_FLAT_HYST_MASK UINT8_C(0x07)
/** Mask definitions for INT_LOWHIGH register */
#define BMI160_LOW_G_HYST_MASK UINT8_C(0x03)
#define BMI160_LOW_G_LOW_MODE_MASK UINT8_C(0x04)
#define BMI160_HIGH_G_HYST_MASK UINT8_C(0xC0)
/** Mask definitions for INT_SIG_MOTION register */
#define BMI160_SIG_MOTION_SEL_MASK UINT8_C(0x02)
#define BMI160_SIG_MOTION_SKIP_MASK UINT8_C(0x0C)
#define BMI160_SIG_MOTION_PROOF_MASK UINT8_C(0x30)
/** Mask definitions for INT_ORIENT register */
#define BMI160_ORIENT_MODE_MASK UINT8_C(0x03)
#define BMI160_ORIENT_BLOCK_MASK UINT8_C(0x0C)
#define BMI160_ORIENT_HYST_MASK UINT8_C(0xF0)
#define BMI160_ORIENT_THETA_MASK UINT8_C(0x3F)
#define BMI160_ORIENT_UD_ENABLE UINT8_C(0x40)
#define BMI160_AXES_EN_MASK UINT8_C(0x80)
/** Mask definitions for FIFO_CONFIG register */
#define BMI160_FIFO_GYRO UINT8_C(0x80)
#define BMI160_FIFO_ACCEL UINT8_C(0x40)
#define BMI160_FIFO_AUX UINT8_C(0x20)
#define BMI160_FIFO_TAG_INT1 UINT8_C(0x08)
#define BMI160_FIFO_TAG_INT2 UINT8_C(0x04)
#define BMI160_FIFO_TIME UINT8_C(0x02)
#define BMI160_FIFO_HEADER UINT8_C(0x10)
#define BMI160_FIFO_CONFIG_1_MASK UINT8_C(0xFE)
/** Mask definitions for STEP_CONF register */
#define BMI160_STEP_COUNT_EN_BIT_MASK UINT8_C(0x08)
#define BMI160_STEP_DETECT_MIN_THRES_MASK UINT8_C(0x18)
#define BMI160_STEP_DETECT_STEPTIME_MIN_MASK UINT8_C(0x07)
#define BMI160_STEP_MIN_BUF_MASK UINT8_C(0x07)
/** Mask definition for FIFO Header Data Tag */
#define BMI160_FIFO_TAG_INTR_MASK UINT8_C(0xFC)
/** Fifo byte counter mask definitions */
#define BMI160_FIFO_BYTE_COUNTER_MASK UINT8_C(0x07)
/** Enable/disable bit value */
#define BMI160_ENABLE UINT8_C(0x01)
#define BMI160_DISABLE UINT8_C(0x00)
/** Latch Duration */
#define BMI160_LATCH_DUR_NONE UINT8_C(0x00)
#define BMI160_LATCH_DUR_312_5_MICRO_SEC UINT8_C(0x01)
#define BMI160_LATCH_DUR_625_MICRO_SEC UINT8_C(0x02)
#define BMI160_LATCH_DUR_1_25_MILLI_SEC UINT8_C(0x03)
#define BMI160_LATCH_DUR_2_5_MILLI_SEC UINT8_C(0x04)
#define BMI160_LATCH_DUR_5_MILLI_SEC UINT8_C(0x05)
#define BMI160_LATCH_DUR_10_MILLI_SEC UINT8_C(0x06)
#define BMI160_LATCH_DUR_20_MILLI_SEC UINT8_C(0x07)
#define BMI160_LATCH_DUR_40_MILLI_SEC UINT8_C(0x08)
#define BMI160_LATCH_DUR_80_MILLI_SEC UINT8_C(0x09)
#define BMI160_LATCH_DUR_160_MILLI_SEC UINT8_C(0x0A)
#define BMI160_LATCH_DUR_320_MILLI_SEC UINT8_C(0x0B)
#define BMI160_LATCH_DUR_640_MILLI_SEC UINT8_C(0x0C)
#define BMI160_LATCH_DUR_1_28_SEC UINT8_C(0x0D)
#define BMI160_LATCH_DUR_2_56_SEC UINT8_C(0x0E)
#define BMI160_LATCHED UINT8_C(0x0F)
/** BMI160 Register map */
#define BMI160_CHIP_ID_ADDR UINT8_C(0x00)
#define BMI160_ERROR_REG_ADDR UINT8_C(0x02)
#define BMI160_PMU_STATUS_ADDR UINT8_C(0x03)
#define BMI160_AUX_DATA_ADDR UINT8_C(0x04)
#define BMI160_GYRO_DATA_ADDR UINT8_C(0x0C)
#define BMI160_ACCEL_DATA_ADDR UINT8_C(0x12)
#define BMI160_STATUS_ADDR UINT8_C(0x1B)
#define BMI160_INT_STATUS_ADDR UINT8_C(0x1C)
#define BMI160_FIFO_LENGTH_ADDR UINT8_C(0x22)
#define BMI160_FIFO_DATA_ADDR UINT8_C(0x24)
#define BMI160_ACCEL_CONFIG_ADDR UINT8_C(0x40)
#define BMI160_ACCEL_RANGE_ADDR UINT8_C(0x41)
#define BMI160_GYRO_CONFIG_ADDR UINT8_C(0x42)
#define BMI160_GYRO_RANGE_ADDR UINT8_C(0x43)
#define BMI160_AUX_ODR_ADDR UINT8_C(0x44)
#define BMI160_FIFO_DOWN_ADDR UINT8_C(0x45)
#define BMI160_FIFO_CONFIG_0_ADDR UINT8_C(0x46)
#define BMI160_FIFO_CONFIG_1_ADDR UINT8_C(0x47)
#define BMI160_AUX_IF_0_ADDR UINT8_C(0x4B)
#define BMI160_AUX_IF_1_ADDR UINT8_C(0x4C)
#define BMI160_AUX_IF_2_ADDR UINT8_C(0x4D)
#define BMI160_AUX_IF_3_ADDR UINT8_C(0x4E)
#define BMI160_AUX_IF_4_ADDR UINT8_C(0x4F)
#define BMI160_INT_ENABLE_0_ADDR UINT8_C(0x50)
#define BMI160_INT_ENABLE_1_ADDR UINT8_C(0x51)
#define BMI160_INT_ENABLE_2_ADDR UINT8_C(0x52)
#define BMI160_INT_OUT_CTRL_ADDR UINT8_C(0x53)
#define BMI160_INT_LATCH_ADDR UINT8_C(0x54)
#define BMI160_INT_MAP_0_ADDR UINT8_C(0x55)
#define BMI160_INT_MAP_1_ADDR UINT8_C(0x56)
#define BMI160_INT_MAP_2_ADDR UINT8_C(0x57)
#define BMI160_INT_DATA_0_ADDR UINT8_C(0x58)
#define BMI160_INT_DATA_1_ADDR UINT8_C(0x59)
#define BMI160_INT_LOWHIGH_0_ADDR UINT8_C(0x5A)
#define BMI160_INT_LOWHIGH_1_ADDR UINT8_C(0x5B)
#define BMI160_INT_LOWHIGH_2_ADDR UINT8_C(0x5C)
#define BMI160_INT_LOWHIGH_3_ADDR UINT8_C(0x5D)
#define BMI160_INT_LOWHIGH_4_ADDR UINT8_C(0x5E)
#define BMI160_INT_MOTION_0_ADDR UINT8_C(0x5F)
#define BMI160_INT_MOTION_1_ADDR UINT8_C(0x60)
#define BMI160_INT_MOTION_2_ADDR UINT8_C(0x61)
#define BMI160_INT_MOTION_3_ADDR UINT8_C(0x62)
#define BMI160_INT_TAP_0_ADDR UINT8_C(0x63)
#define BMI160_INT_TAP_1_ADDR UINT8_C(0x64)
#define BMI160_INT_ORIENT_0_ADDR UINT8_C(0x65)
#define BMI160_INT_ORIENT_1_ADDR UINT8_C(0x66)
#define BMI160_INT_FLAT_0_ADDR UINT8_C(0x67)
#define BMI160_INT_FLAT_1_ADDR UINT8_C(0x68)
#define BMI160_FOC_CONF_ADDR UINT8_C(0x69)
#define BMI160_CONF_ADDR UINT8_C(0x6A)
#define BMI160_IF_CONF_ADDR UINT8_C(0x6B)
#define BMI160_SELF_TEST_ADDR UINT8_C(0x6D)
#define BMI160_OFFSET_ADDR UINT8_C(0x71)
#define BMI160_OFFSET_CONF_ADDR UINT8_C(0x77)
#define BMI160_INT_STEP_CNT_0_ADDR UINT8_C(0x78)
#define BMI160_INT_STEP_CONFIG_0_ADDR UINT8_C(0x7A)
#define BMI160_INT_STEP_CONFIG_1_ADDR UINT8_C(0x7B)
#define BMI160_COMMAND_REG_ADDR UINT8_C(0x7E)
#define BMI160_SPI_COMM_TEST_ADDR UINT8_C(0x7F)
#define BMI160_INTL_PULLUP_CONF_ADDR UINT8_C(0x85)
/** Error code definitions */
#define BMI160_OK INT8_C(0)
#define BMI160_E_NULL_PTR INT8_C(-1)
#define BMI160_E_COM_FAIL INT8_C(-2)
#define BMI160_E_DEV_NOT_FOUND INT8_C(-3)
#define BMI160_E_OUT_OF_RANGE INT8_C(-4)
#define BMI160_E_INVALID_INPUT INT8_C(-5)
#define BMI160_E_ACCEL_ODR_BW_INVALID INT8_C(-6)
#define BMI160_E_GYRO_ODR_BW_INVALID INT8_C(-7)
#define BMI160_E_LWP_PRE_FLTR_INT_INVALID INT8_C(-8)
#define BMI160_E_LWP_PRE_FLTR_INVALID INT8_C(-9)
#define BMI160_E_AUX_NOT_FOUND INT8_C(-10)
#define BMI160_E_FOC_FAILURE INT8_C(-11)
#define BMI160_E_READ_WRITE_LENGTH_INVALID INT8_C(-12)
#define BMI160_E_INVALID_CONFIG INT8_C(-13)
/**\name API warning codes */
#define BMI160_W_GYRO_SELF_TEST_FAIL INT8_C(1)
#define BMI160_W_ACCEl_SELF_TEST_FAIL INT8_C(2)
/** BMI160 unique chip identifier */
#define BMI160_CHIP_ID UINT8_C(0xD1)
/** Soft reset command */
#define BMI160_SOFT_RESET_CMD UINT8_C(0xb6)
#define BMI160_SOFT_RESET_DELAY_MS UINT8_C(1)
/** Start FOC command */
#define BMI160_START_FOC_CMD UINT8_C(0x03)
/** NVM backup enabling command */
#define BMI160_NVM_BACKUP_EN UINT8_C(0xA0)
/* Delay in ms settings */
#define BMI160_ACCEL_DELAY_MS UINT8_C(5)
#define BMI160_GYRO_DELAY_MS UINT8_C(80)
#define BMI160_ONE_MS_DELAY UINT8_C(1)
#define BMI160_AUX_COM_DELAY UINT8_C(10)
#define BMI160_GYRO_SELF_TEST_DELAY UINT8_C(20)
#define BMI160_ACCEL_SELF_TEST_DELAY UINT8_C(50)
/** Self test configurations */
#define BMI160_ACCEL_SELF_TEST_CONFIG UINT8_C(0x2C)
#define BMI160_ACCEL_SELF_TEST_POSITIVE_EN UINT8_C(0x0D)
#define BMI160_ACCEL_SELF_TEST_NEGATIVE_EN UINT8_C(0x09)
#define BMI160_ACCEL_SELF_TEST_LIMIT UINT16_C(8192)
/** Power mode settings */
/* Accel power mode */
#define BMI160_ACCEL_NORMAL_MODE UINT8_C(0x11)
#define BMI160_ACCEL_LOWPOWER_MODE UINT8_C(0x12)
#define BMI160_ACCEL_SUSPEND_MODE UINT8_C(0x10)
/* Gyro power mode */
#define BMI160_GYRO_SUSPEND_MODE UINT8_C(0x14)
#define BMI160_GYRO_NORMAL_MODE UINT8_C(0x15)
#define BMI160_GYRO_FASTSTARTUP_MODE UINT8_C(0x17)
/* Aux power mode */
#define BMI160_AUX_SUSPEND_MODE UINT8_C(0x18)
#define BMI160_AUX_NORMAL_MODE UINT8_C(0x19)
#define BMI160_AUX_LOWPOWER_MODE UINT8_C(0x1A)
/** Range settings */
/* Accel Range */
#define BMI160_ACCEL_RANGE_2G UINT8_C(0x03)
#define BMI160_ACCEL_RANGE_4G UINT8_C(0x05)
#define BMI160_ACCEL_RANGE_8G UINT8_C(0x08)
#define BMI160_ACCEL_RANGE_16G UINT8_C(0x0C)
/* Gyro Range */
#define BMI160_GYRO_RANGE_2000_DPS UINT8_C(0x00)
#define BMI160_GYRO_RANGE_1000_DPS UINT8_C(0x01)
#define BMI160_GYRO_RANGE_500_DPS UINT8_C(0x02)
#define BMI160_GYRO_RANGE_250_DPS UINT8_C(0x03)
#define BMI160_GYRO_RANGE_125_DPS UINT8_C(0x04)
/** Bandwidth settings */
/* Accel Bandwidth */
#define BMI160_ACCEL_BW_OSR4_AVG1 UINT8_C(0x00)
#define BMI160_ACCEL_BW_OSR2_AVG2 UINT8_C(0x01)
#define BMI160_ACCEL_BW_NORMAL_AVG4 UINT8_C(0x02)
#define BMI160_ACCEL_BW_RES_AVG8 UINT8_C(0x03)
#define BMI160_ACCEL_BW_RES_AVG16 UINT8_C(0x04)
#define BMI160_ACCEL_BW_RES_AVG32 UINT8_C(0x05)
#define BMI160_ACCEL_BW_RES_AVG64 UINT8_C(0x06)
#define BMI160_ACCEL_BW_RES_AVG128 UINT8_C(0x07)
#define BMI160_GYRO_BW_OSR4_MODE UINT8_C(0x00)
#define BMI160_GYRO_BW_OSR2_MODE UINT8_C(0x01)
#define BMI160_GYRO_BW_NORMAL_MODE UINT8_C(0x02)
/* Output Data Rate settings */
/* Accel Output data rate */
#define BMI160_ACCEL_ODR_RESERVED UINT8_C(0x00)
#define BMI160_ACCEL_ODR_0_78HZ UINT8_C(0x01)
#define BMI160_ACCEL_ODR_1_56HZ UINT8_C(0x02)
#define BMI160_ACCEL_ODR_3_12HZ UINT8_C(0x03)
#define BMI160_ACCEL_ODR_6_25HZ UINT8_C(0x04)
#define BMI160_ACCEL_ODR_12_5HZ UINT8_C(0x05)
#define BMI160_ACCEL_ODR_25HZ UINT8_C(0x06)
#define BMI160_ACCEL_ODR_50HZ UINT8_C(0x07)
#define BMI160_ACCEL_ODR_100HZ UINT8_C(0x08)
#define BMI160_ACCEL_ODR_200HZ UINT8_C(0x09)
#define BMI160_ACCEL_ODR_400HZ UINT8_C(0x0A)
#define BMI160_ACCEL_ODR_800HZ UINT8_C(0x0B)
#define BMI160_ACCEL_ODR_1600HZ UINT8_C(0x0C)
#define BMI160_ACCEL_ODR_RESERVED0 UINT8_C(0x0D)
#define BMI160_ACCEL_ODR_RESERVED1 UINT8_C(0x0E)
#define BMI160_ACCEL_ODR_RESERVED2 UINT8_C(0x0F)
/* Gyro Output data rate */
#define BMI160_GYRO_ODR_RESERVED UINT8_C(0x00)
#define BMI160_GYRO_ODR_25HZ UINT8_C(0x06)
#define BMI160_GYRO_ODR_50HZ UINT8_C(0x07)
#define BMI160_GYRO_ODR_100HZ UINT8_C(0x08)
#define BMI160_GYRO_ODR_200HZ UINT8_C(0x09)
#define BMI160_GYRO_ODR_400HZ UINT8_C(0x0A)
#define BMI160_GYRO_ODR_800HZ UINT8_C(0x0B)
#define BMI160_GYRO_ODR_1600HZ UINT8_C(0x0C)
#define BMI160_GYRO_ODR_3200HZ UINT8_C(0x0D)
/* Auxiliary sensor Output data rate */
#define BMI160_AUX_ODR_RESERVED UINT8_C(0x00)
#define BMI160_AUX_ODR_0_78HZ UINT8_C(0x01)
#define BMI160_AUX_ODR_1_56HZ UINT8_C(0x02)
#define BMI160_AUX_ODR_3_12HZ UINT8_C(0x03)
#define BMI160_AUX_ODR_6_25HZ UINT8_C(0x04)
#define BMI160_AUX_ODR_12_5HZ UINT8_C(0x05)
#define BMI160_AUX_ODR_25HZ UINT8_C(0x06)
#define BMI160_AUX_ODR_50HZ UINT8_C(0x07)
#define BMI160_AUX_ODR_100HZ UINT8_C(0x08)
#define BMI160_AUX_ODR_200HZ UINT8_C(0x09)
#define BMI160_AUX_ODR_400HZ UINT8_C(0x0A)
#define BMI160_AUX_ODR_800HZ UINT8_C(0x0B)
/** FIFO_CONFIG Definitions */
#define BMI160_FIFO_TIME_ENABLE UINT8_C(0x02)
#define BMI160_FIFO_TAG_INT2_ENABLE UINT8_C(0x04)
#define BMI160_FIFO_TAG_INT1_ENABLE UINT8_C(0x08)
#define BMI160_FIFO_HEAD_ENABLE UINT8_C(0x10)
#define BMI160_FIFO_M_ENABLE UINT8_C(0x20)
#define BMI160_FIFO_A_ENABLE UINT8_C(0x40)
#define BMI160_FIFO_M_A_ENABLE UINT8_C(0x60)
#define BMI160_FIFO_G_ENABLE UINT8_C(0x80)
#define BMI160_FIFO_M_G_ENABLE UINT8_C(0xA0)
#define BMI160_FIFO_G_A_ENABLE UINT8_C(0xC0)
#define BMI160_FIFO_M_G_A_ENABLE UINT8_C(0xE0)
/* Macro to specify the number of bytes over-read from the
* FIFO in order to get the sensor time at the end of FIFO */
#ifndef BMI160_FIFO_BYTES_OVERREAD
#define BMI160_FIFO_BYTES_OVERREAD UINT8_C(25)
#endif
/* Accel, gyro and aux. sensor length and also their combined
* length definitions in FIFO */
#define BMI160_FIFO_G_LENGTH UINT8_C(6)
#define BMI160_FIFO_A_LENGTH UINT8_C(6)
#define BMI160_FIFO_M_LENGTH UINT8_C(8)
#define BMI160_FIFO_GA_LENGTH UINT8_C(12)
#define BMI160_FIFO_MA_LENGTH UINT8_C(14)
#define BMI160_FIFO_MG_LENGTH UINT8_C(14)
#define BMI160_FIFO_MGA_LENGTH UINT8_C(20)
/** FIFO Header Data definitions */
#define BMI160_FIFO_HEAD_SKIP_FRAME UINT8_C(0x40)
#define BMI160_FIFO_HEAD_SENSOR_TIME UINT8_C(0x44)
#define BMI160_FIFO_HEAD_INPUT_CONFIG UINT8_C(0x48)
#define BMI160_FIFO_HEAD_OVER_READ UINT8_C(0x80)
#define BMI160_FIFO_HEAD_A UINT8_C(0x84)
#define BMI160_FIFO_HEAD_G UINT8_C(0x88)
#define BMI160_FIFO_HEAD_G_A UINT8_C(0x8C)
#define BMI160_FIFO_HEAD_M UINT8_C(0x90)
#define BMI160_FIFO_HEAD_M_A UINT8_C(0x94)
#define BMI160_FIFO_HEAD_M_G UINT8_C(0x98)
#define BMI160_FIFO_HEAD_M_G_A UINT8_C(0x9C)
/** FIFO sensor time length definitions */
#define BMI160_SENSOR_TIME_LENGTH UINT8_C(3)
/** FIFO DOWN selection */
/* Accel fifo down-sampling values*/
#define BMI160_ACCEL_FIFO_DOWN_ZERO UINT8_C(0x00)
#define BMI160_ACCEL_FIFO_DOWN_ONE UINT8_C(0x10)
#define BMI160_ACCEL_FIFO_DOWN_TWO UINT8_C(0x20)
#define BMI160_ACCEL_FIFO_DOWN_THREE UINT8_C(0x30)
#define BMI160_ACCEL_FIFO_DOWN_FOUR UINT8_C(0x40)
#define BMI160_ACCEL_FIFO_DOWN_FIVE UINT8_C(0x50)
#define BMI160_ACCEL_FIFO_DOWN_SIX UINT8_C(0x60)
#define BMI160_ACCEL_FIFO_DOWN_SEVEN UINT8_C(0x70)
/* Gyro fifo down-smapling values*/
#define BMI160_GYRO_FIFO_DOWN_ZERO UINT8_C(0x00)
#define BMI160_GYRO_FIFO_DOWN_ONE UINT8_C(0x01)
#define BMI160_GYRO_FIFO_DOWN_TWO UINT8_C(0x02)
#define BMI160_GYRO_FIFO_DOWN_THREE UINT8_C(0x03)
#define BMI160_GYRO_FIFO_DOWN_FOUR UINT8_C(0x04)
#define BMI160_GYRO_FIFO_DOWN_FIVE UINT8_C(0x05)
#define BMI160_GYRO_FIFO_DOWN_SIX UINT8_C(0x06)
#define BMI160_GYRO_FIFO_DOWN_SEVEN UINT8_C(0x07)
/* Accel Fifo filter enable*/
#define BMI160_ACCEL_FIFO_FILT_EN UINT8_C(0x80)
/* Gyro Fifo filter enable*/
#define BMI160_GYRO_FIFO_FILT_EN UINT8_C(0x08)
/** Definitions to check validity of FIFO frames */
#define FIFO_CONFIG_MSB_CHECK UINT8_C(0x80)
#define FIFO_CONFIG_LSB_CHECK UINT8_C(0x00)
/*! BMI160 accel FOC configurations */
#define BMI160_FOC_ACCEL_DISABLED UINT8_C(0x00)
#define BMI160_FOC_ACCEL_POSITIVE_G UINT8_C(0x01)
#define BMI160_FOC_ACCEL_NEGATIVE_G UINT8_C(0x02)
#define BMI160_FOC_ACCEL_0G UINT8_C(0x03)
/** Array Parameter DefinItions */
#define BMI160_SENSOR_TIME_LSB_BYTE UINT8_C(0)
#define BMI160_SENSOR_TIME_XLSB_BYTE UINT8_C(1)
#define BMI160_SENSOR_TIME_MSB_BYTE UINT8_C(2)
/** Interface settings */
#define BMI160_SPI_INTF UINT8_C(1)
#define BMI160_I2C_INTF UINT8_C(0)
#define BMI160_SPI_RD_MASK UINT8_C(0x80)
#define BMI160_SPI_WR_MASK UINT8_C(0x7F)
/* Sensor & time select definition*/
#define BMI160_ACCEL_SEL UINT8_C(0x01)
#define BMI160_GYRO_SEL UINT8_C(0x02)
#define BMI160_TIME_SEL UINT8_C(0x04)
/* Sensor select mask*/
#define BMI160_SEN_SEL_MASK UINT8_C(0x07)
/* Error code mask */
#define BMI160_ERR_REG_MASK UINT8_C(0x0F)
/* BMI160 I2C address */
#define BMI160_I2C_ADDR UINT8_C(0x68)
/* BMI160 secondary IF address */
#define BMI160_AUX_BMM150_I2C_ADDR UINT8_C(0x10)
/** BMI160 Length definitions */
#define BMI160_ONE UINT8_C(1)
#define BMI160_TWO UINT8_C(2)
#define BMI160_THREE UINT8_C(3)
#define BMI160_FOUR UINT8_C(4)
#define BMI160_FIVE UINT8_C(5)
/** BMI160 fifo level Margin */
#define BMI160_FIFO_LEVEL_MARGIN UINT8_C(16)
/** BMI160 fifo flush Command */
#define BMI160_FIFO_FLUSH_VALUE UINT8_C(0xB0)
/** BMI160 offset values for xyz axes of accel */
#define BMI160_ACCEL_MIN_OFFSET INT8_C(-128)
#define BMI160_ACCEL_MAX_OFFSET INT8_C(127)
/** BMI160 offset values for xyz axes of gyro */
#define BMI160_GYRO_MIN_OFFSET INT16_C(-512)
#define BMI160_GYRO_MAX_OFFSET INT16_C(511)
/** BMI160 fifo full interrupt position and mask */
#define BMI160_FIFO_FULL_INT_POS UINT8_C(5)
#define BMI160_FIFO_FULL_INT_MSK UINT8_C(0x20)
#define BMI160_FIFO_WTM_INT_POS UINT8_C(6)
#define BMI160_FIFO_WTM_INT_MSK UINT8_C(0x40)
#define BMI160_FIFO_FULL_INT_PIN1_POS UINT8_C(5)
#define BMI160_FIFO_FULL_INT_PIN1_MSK UINT8_C(0x20)
#define BMI160_FIFO_FULL_INT_PIN2_POS UINT8_C(1)
#define BMI160_FIFO_FULL_INT_PIN2_MSK UINT8_C(0x02)
#define BMI160_FIFO_WTM_INT_PIN1_POS UINT8_C(6)
#define BMI160_FIFO_WTM_INT_PIN1_MSK UINT8_C(0x40)
#define BMI160_FIFO_WTM_INT_PIN2_POS UINT8_C(2)
#define BMI160_FIFO_WTM_INT_PIN2_MSK UINT8_C(0x04)
#define BMI160_MANUAL_MODE_EN_POS UINT8_C(7)
#define BMI160_MANUAL_MODE_EN_MSK UINT8_C(0x80)
#define BMI160_AUX_READ_BURST_POS UINT8_C(0)
#define BMI160_AUX_READ_BURST_MSK UINT8_C(0x03)
#define BMI160_GYRO_SELF_TEST_POS UINT8_C(4)
#define BMI160_GYRO_SELF_TEST_MSK UINT8_C(0x10)
#define BMI160_GYRO_SELF_TEST_STATUS_POS UINT8_C(1)
#define BMI160_GYRO_SELF_TEST_STATUS_MSK UINT8_C(0x02)
#define BMI160_GYRO_FOC_EN_POS UINT8_C(6)
#define BMI160_GYRO_FOC_EN_MSK UINT8_C(0x40)
#define BMI160_ACCEL_FOC_X_CONF_POS UINT8_C(4)
#define BMI160_ACCEL_FOC_X_CONF_MSK UINT8_C(0x30)
#define BMI160_ACCEL_FOC_Y_CONF_POS UINT8_C(2)
#define BMI160_ACCEL_FOC_Y_CONF_MSK UINT8_C(0x0C)
#define BMI160_ACCEL_FOC_Z_CONF_MSK UINT8_C(0x03)
#define BMI160_FOC_STATUS_POS UINT8_C(3)
#define BMI160_FOC_STATUS_MSK UINT8_C(0x08)
#define BMI160_GYRO_OFFSET_X_MSK UINT8_C(0x03)
#define BMI160_GYRO_OFFSET_Y_POS UINT8_C(2)
#define BMI160_GYRO_OFFSET_Y_MSK UINT8_C(0x0C)
#define BMI160_GYRO_OFFSET_Z_POS UINT8_C(4)
#define BMI160_GYRO_OFFSET_Z_MSK UINT8_C(0x30)
#define BMI160_GYRO_OFFSET_EN_POS UINT8_C(7)
#define BMI160_GYRO_OFFSET_EN_MSK UINT8_C(0x80)
#define BMI160_ACCEL_OFFSET_EN_POS UINT8_C(6)
#define BMI160_ACCEL_OFFSET_EN_MSK UINT8_C(0x40)
#define BMI160_GYRO_OFFSET_POS UINT16_C(8)
#define BMI160_GYRO_OFFSET_MSK UINT16_C(0x0300)
#define BMI160_NVM_UPDATE_POS UINT8_C(1)
#define BMI160_NVM_UPDATE_MSK UINT8_C(0x02)
#define BMI160_NVM_STATUS_POS UINT8_C(4)
#define BMI160_NVM_STATUS_MSK UINT8_C(0x10)
#define BMI160_MAG_POWER_MODE_MSK UINT8_C(0x03)
#define BMI160_ACCEL_POWER_MODE_MSK UINT8_C(0x30)
#define BMI160_ACCEL_POWER_MODE_POS UINT8_C(4)
#define BMI160_GYRO_POWER_MODE_MSK UINT8_C(0x0C)
#define BMI160_GYRO_POWER_MODE_POS UINT8_C(2)
/* BIT SLICE GET AND SET FUNCTIONS */
#define BMI160_GET_BITS(regvar, bitname) \
((regvar & bitname##_MSK) >> bitname##_POS)
#define BMI160_SET_BITS(regvar, bitname, val) \
((regvar & ~bitname##_MSK) | \
((val << bitname##_POS) & bitname##_MSK))
#define BMI160_SET_BITS_POS_0(reg_data, bitname, data) \
((reg_data & ~(bitname##_MSK)) | \
(data & bitname##_MSK))
#define BMI160_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
/**\name UTILITY MACROS */
#define BMI160_SET_LOW_BYTE UINT16_C(0x00FF)
#define BMI160_SET_HIGH_BYTE UINT16_C(0xFF00)
#define BMI160_GET_LSB(var) (uint8_t)(var & BMI160_SET_LOW_BYTE)
#define BMI160_GET_MSB(var) (uint8_t)((var & BMI160_SET_HIGH_BYTE) >> 8)
/*****************************************************************************/
/* type definitions */
/*!
* @brief Bus communication function pointer which should be mapped to
* the platform specific read functions of the user
*/
typedef int8_t (*bmi160_read_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint16_t len);
/*!
* @brief Bus communication function pointer which should be mapped to
* the platform specific write functions of the user
*/
typedef int8_t (*bmi160_write_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *read_data, uint16_t len);
typedef void (*bmi160_delay_fptr_t)(uint32_t period);
/*************************** Data structures *********************************/
/*!
* @brief bmi160 interrupt status selection enum.
*/
enum bmi160_int_status_sel {
BMI160_INT_STATUS_0 = 1,
BMI160_INT_STATUS_1 = 2,
BMI160_INT_STATUS_2 = 4,
BMI160_INT_STATUS_3 = 8,
BMI160_INT_STATUS_ALL = 15
};
/*!
* @brief bmi160 interrupt status bits structure
*/
struct bmi160_int_status_bits
{
#ifdef LITTLE_ENDIAN
uint32_t step : 1;
uint32_t sigmot : 1;
uint32_t anym : 1;
/* pmu trigger will be handled later */
uint32_t pmu_trigger_reserved : 1;
uint32_t d_tap : 1;
uint32_t s_tap : 1;
uint32_t orient : 1;
uint32_t flat_int : 1;
uint32_t reserved : 2;
uint32_t high_g : 1;
uint32_t low_g : 1;
uint32_t drdy : 1;
uint32_t ffull : 1;
uint32_t fwm : 1;
uint32_t nomo : 1;
uint32_t anym_first_x : 1;
uint32_t anym_first_y : 1;
uint32_t anym_first_z : 1;
uint32_t anym_sign : 1;
uint32_t tap_first_x : 1;
uint32_t tap_first_y : 1;
uint32_t tap_first_z : 1;
uint32_t tap_sign : 1;
uint32_t high_first_x : 1;
uint32_t high_first_y : 1;
uint32_t high_first_z : 1;
uint32_t high_sign : 1;
uint32_t orient_1_0 : 2;
uint32_t orient_2 : 1;
uint32_t flat : 1;
#else
uint32_t high_first_x : 1;
uint32_t high_first_y : 1;
uint32_t high_first_z : 1;
uint32_t high_sign : 1;
uint32_t orient_1_0 : 2;
uint32_t orient_2 : 1;
uint32_t flat : 1;
uint32_t anym_first_x : 1;
uint32_t anym_first_y : 1;
uint32_t anym_first_z : 1;
uint32_t anym_sign : 1;
uint32_t tap_first_x : 1;
uint32_t tap_first_y : 1;
uint32_t tap_first_z : 1;
uint32_t tap_sign : 1;
uint32_t reserved : 2;
uint32_t high_g : 1;
uint32_t low_g : 1;
uint32_t drdy : 1;
uint32_t ffull : 1;
uint32_t fwm : 1;
uint32_t nomo : 1;
uint32_t step : 1;
uint32_t sigmot : 1;
uint32_t anym : 1;
/* pmu trigger will be handled later */
uint32_t pmu_trigger_reserved : 1;
uint32_t d_tap : 1;
uint32_t s_tap : 1;
uint32_t orient : 1;
uint32_t flat_int : 1;
#endif
};
/*!
* @brief bmi160 interrupt status structure
*/
union bmi160_int_status
{
uint8_t data[4];
struct bmi160_int_status_bits bit;
};
/*!
* @brief bmi160 sensor data structure which comprises of accel data
*/
struct bmi160_sensor_data
{
/*! X-axis sensor data */
int16_t x;
/*! Y-axis sensor data */
int16_t y;
/*! Z-axis sensor data */
int16_t z;
/*! sensor time */
uint32_t sensortime;
};
/*!
* @brief bmi160 aux data structure which comprises of 8 bytes of accel data
*/
struct bmi160_aux_data
{
/*! Auxiliary data */
uint8_t data[8];
};
/*!
* @brief bmi160 FOC configuration structure
*/
struct bmi160_foc_conf
{
/*! Enabling FOC in gyro
* Assignable macros :
* - BMI160_ENABLE
* - BMI160_DISABLE
*/
uint8_t foc_gyr_en;
/*! Accel FOC configurations
* Assignable macros :
* - BMI160_FOC_ACCEL_DISABLED
* - BMI160_FOC_ACCEL_POSITIVE_G
* - BMI160_FOC_ACCEL_NEGATIVE_G
* - BMI160_FOC_ACCEL_0G
*/
uint8_t foc_acc_x;
uint8_t foc_acc_y;
uint8_t foc_acc_z;
/*! Enabling offset compensation for accel in data registers
* Assignable macros :
* - BMI160_ENABLE
* - BMI160_DISABLE
*/
uint8_t acc_off_en;
/*! Enabling offset compensation for gyro in data registers
* Assignable macros :
* - BMI160_ENABLE
* - BMI160_DISABLE
*/
uint8_t gyro_off_en;
};
/*!
* @brief bmi160 accel gyro offsets
*/
struct bmi160_offsets
{
/*! Accel offset for x axis */
int8_t off_acc_x;
/*! Accel offset for y axis */
int8_t off_acc_y;
/*! Accel offset for z axis */
int8_t off_acc_z;
/*! Gyro offset for x axis */
int16_t off_gyro_x;
/*! Gyro offset for y axis */
int16_t off_gyro_y;
/*! Gyro offset for z axis */
int16_t off_gyro_z;
};
/*!
* @brief FIFO aux. sensor data structure
*/
struct bmi160_aux_fifo_data
{
/*! The value of aux. sensor x LSB data */
uint8_t aux_x_lsb;
/*! The value of aux. sensor x MSB data */
uint8_t aux_x_msb;
/*! The value of aux. sensor y LSB data */
uint8_t aux_y_lsb;
/*! The value of aux. sensor y MSB data */
uint8_t aux_y_msb;
/*! The value of aux. sensor z LSB data */
uint8_t aux_z_lsb;
/*! The value of aux. sensor z MSB data */
uint8_t aux_z_msb;
/*! The value of aux. sensor r for BMM150 LSB data */
uint8_t aux_r_y2_lsb;
/*! The value of aux. sensor r for BMM150 MSB data */
uint8_t aux_r_y2_msb;
};
/*!
* @brief bmi160 sensor select structure
*/
enum bmi160_select_sensor {
BMI160_ACCEL_ONLY = 1,
BMI160_GYRO_ONLY,
BMI160_BOTH_ACCEL_AND_GYRO
};
/*!
* @brief bmi160 sensor step detector mode structure
*/
enum bmi160_step_detect_mode {
BMI160_STEP_DETECT_NORMAL,
BMI160_STEP_DETECT_SENSITIVE,
BMI160_STEP_DETECT_ROBUST,
/*! Non recommended User defined setting */
BMI160_STEP_DETECT_USER_DEFINE
};
/*!
* @brief enum for auxiliary burst read selection
*/
enum bmi160_aux_read_len {
BMI160_AUX_READ_LEN_0,
BMI160_AUX_READ_LEN_1,
BMI160_AUX_READ_LEN_2,
BMI160_AUX_READ_LEN_3
};
/*!
* @brief bmi160 sensor configuration structure
*/
struct bmi160_cfg
{
/*! power mode */
uint8_t power;
/*! output data rate */
uint8_t odr;
/*! range */
uint8_t range;
/*! bandwidth */
uint8_t bw;
};
/*!
* @brief Aux sensor configuration structure
*/
struct bmi160_aux_cfg
{
/*! Aux sensor, 1 - enable 0 - disable */
uint8_t aux_sensor_enable : 1;
/*! Aux manual/auto mode status */
uint8_t manual_enable : 1;
/*! Aux read burst length */
uint8_t aux_rd_burst_len : 2;
/*! output data rate */
uint8_t aux_odr : 4;
/*! i2c addr of auxiliary sensor */
uint8_t aux_i2c_addr;
};
/*!