upm  0.3.2
Sensor/Actuator repository for libmraa (v0.7.2)
lsm9ds0.h
1 /*
2  * Author: Jon Trulson <jtrulson@ics.com>
3  * Copyright (c) 2015 Intel Corporation.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #pragma once
25 
26 #include <string>
27 #include <mraa/i2c.hpp>
28 #include <mraa/gpio.hpp>
29 
30 #define LSM9DS0_I2C_BUS 1
31 #define LSM9DS0_DEFAULT_XM_ADDR 0x1d
32 #define LSM9DS0_DEFAULT_GYRO_ADDR 0x6b
33 
34 namespace upm {
35 
72  class LSM9DS0 {
73  public:
74 
75  // NOTE: reserved registers must not be written into or permanent
76  // damage to the device can result. Reserved bitfields must
77  // always be 0.
78 
79  // There are two sub-devices within this device - the
80  // Accelerometer and Magnetometer (XM) and the Gyroscope (G), each
81  // with their own I2C address.
82 
86  typedef enum {
87  // 0x00-0x0e reserved
88 
89  REG_WHO_AM_I_G = 0x0f, // should be 0xd4
90 
91  // 0x10-0x1f reserved
92 
93  REG_CTRL_REG1_G = 0x20,
94  REG_CTRL_REG2_G = 0x21,
95  REG_CTRL_REG3_G = 0x22,
96  REG_CTRL_REG4_G = 0x23,
97  REG_CTRL_REG5_G = 0x24,
98 
99  REG_REFERENCE_G = 0x25,
100 
101  // 0x26 reserved
102 
103  REG_STATUS_REG_G = 0x27,
104 
105  REG_OUT_X_L_G = 0x28, // gyro output, X axis, LSB
106  REG_OUT_X_H_G = 0x29, // gyro output, X axis, MSB
107  REG_OUT_Y_L_G = 0x2a,
108  REG_OUT_Y_H_G = 0x2b,
109  REG_OUT_Z_L_G = 0x2c,
110  REG_OUT_Z_H_G = 0x2d,
111 
112  REG_FIFO_CTRL_REG_G = 0x2e,
113  REG_FIFO_SRC_REG_G = 0x2f,
114 
115  REG_INT1_CFG_G = 0x30,
116  REG_INT1_SRC_G = 0x31,
117 
118  REG_INT1_TSH_XH_G = 0x32, // interrupt threshold registers
119  REG_INT1_TSH_XL_G = 0x33,
120  REG_INT1_TSH_YH_G = 0x34,
121  REG_INT1_TSH_YL_G = 0x35,
122  REG_INT1_TSH_ZH_G = 0x36,
123  REG_INT1_TSH_ZL_G = 0x37,
124 
125  // See fig 19 & 20 and preceeding description in the datasheet
126  // on how to use this register
127  REG_INT1_DURATION_G = 0x38
128  } REG_G_T;
129 
133  typedef enum {
134  CTRL_REG1_G_YEN = 0x01, // Y enable, odd ordering...
135  CTRL_REG1_G_XEN = 0x02,
136  CTRL_REG1_G_ZEN = 0x04,
137  CTRL_REG1_G_PD = 0x08, // power down (0)
138 
139  CTRL_REG1_G_BW0 = 0x10, // bandwidth
140  CTRL_REG1_G_BW1 = 0x20,
141  _CTRL_REG1_G_BW_MASK = 3,
142  _CTRL_REG1_G_BW_SHIFT = 4,
143 
144  CTRL_REG1_G_DR0 = 0x40, // data rate
145  CTRL_REG1_G_DR1 = 0x80,
146  _CTRL_REG1_G_DR_MASK = 3,
147  _CTRL_REG1_G_DR_SHIFT = 6,
148 
149  // The following are synthetic register and shift/mask
150  // definitions. Together both BW and DR setup the device for a
151  // specific output data rate (ODR) and cutoff frequency. These
152  // definitions allow us to use a more informative configuration
153  // for these 4 bits, rather than having the user go to the
154  // datasheet to figure out what to put for those values in order
155  // to get the desired ODR/cutoff. These are the values we will
156  // use in this driver.
157 
158  CTRL_REG1_G_ODR0 = 0x10, // BW0
159  CTRL_REG1_G_ODR1 = 0x20, // BW1
160  CTRL_REG1_G_ODR2 = 0x40, // DR0
161  CTRL_REG1_G_ODR3 = 0x80, // DR1
162  _CTRL_REG1_G_ODR_MASK = 15,
163  _CTRL_REG1_G_ODR_SHIFT = 4
165 
169  typedef enum {
170  G_ODR_95_12_5 = 0, // ODR = 95Hz, cutoff = 12.5
171  G_ODR_95_25 = 1, // ODR = 95Hz, cutoff = 25
172  // Other two (2 and 3) are the same (95_25)
173 
174  G_ODR_190_12_5 = 4,
175  G_ODR_190_25 = 5,
176  G_ODR_190_50 = 6,
177  G_ODR_190_70 = 7,
178 
179  G_ODR_380_20 = 8,
180  G_ODR_380_25 = 9,
181  G_ODR_380_50 = 10,
182  G_ODR_380_100 = 11,
183 
184  G_ODR_760_30 = 12,
185  G_ODR_760_35 = 13,
186  G_ODR_760_50 = 14,
187  G_ODR_760_100 = 15
188  } G_ODR_T;
189 
193  typedef enum {
194  CTRL_REG2_G_HPCF0 = 0x01, // high-pass cutoff freq
195  CTRL_REG2_G_HPCF1 = 0x02,
196  CTRL_REG2_G_HPCF2 = 0x04,
197  CTRL_REG2_G_HPCF3 = 0x08,
198  _CTRL_REG2_G_HPCF_MASK = 15,
199  _CTRL_REG2_G_HPCF_SHIFT = 0,
200 
201  CTRL_REG2_G_HPM0 = 0x10, // high-pass filter mode
202  CTRL_REG2_G_HPM1 = 0x20,
203  _CTRL_REG2_G_HPM_MASK = 3,
204  _CTRL_REG2_G_HPM_SHIFT = 4,
205 
206  // 0x40, 0x80 reserved
208 
216  typedef enum {
217  G_HPCF_7_2 = 0, // 7.2 Hz (if ODR is 95Hz)
218  G_HPCF_3_5 = 1,
219  G_HPCF_1_8 = 2,
220  G_HPCF_0_9 = 3, // 0.9Hz
221  G_HPCF_0_45 = 4,
222  G_HPCF_0_18 = 5,
223  G_HPCF_0_09 = 6,
224  G_HPCF_0_045 = 7,
225  G_HPCF_0_018 = 8,
226  G_HPCF_0_009 = 9
227 
228  // 10-15 unused
229  } G_HPCF_T;
230 
235  typedef enum {
236  G_HPM_NORMAL_RESET_HPF = 0, // reset reading (HP_RESET_FILTER)
237  G_HPM_REFERENCE = 1, // REF signal for filtering
238  G_HPM_NORMAL = 2, // normal mode
239  G_HPM_AUTORESET_ON_INTR = 3 // autoreset in interrupt event
240  } G_HPM_T;
241 
245  typedef enum {
246  CTRL_REG3_G_I2_EMPTY = 0x01, // FIFO empty on DRDY_G
247  CTRL_REG3_G_I2_ORUN = 0x02, // FIFO Overrun intr
248  CTRL_REG3_G_I2_WTM = 0x04, // FIFO watermark intr
249  CTRL_REG3_G_I2_DRDY = 0x08, // data ready on DRDY_G
250  CTRL_REG3_G_PP_OD = 0x10, // push-pull/open drain
251  CTRL_REG3_G_H_LACTIVE = 0x20,
252  CTRL_REG3_G_I1_BOOT = 0x40,
253  CTRL_REG3_G_I1_INT1 = 0x80, // intr enable on INT_G pin
255 
259  typedef enum {
260  CTRL_REG4_G_SIM = 0x01, // SPI mode selection
261 
262  CTRL_REG4_G_ST0 = 0x02, // self test enables
263  CTRL_REG4_G_ST1 = 0x04,
264  _CTRL_REG4_G_ST_MASK = 3,
265  _CTRL_REG4_G_ST_SHIFT = 1,
266 
267  // 0x08 reserved
268 
269  CTRL_REG4_G_FS0 = 0x10, // full scale selection
270  CTRL_REG4_G_FS1 = 0x20,
271  _CTRL_REG4_G_FS_MASK = 3,
272  _CTRL_REG4_G_FS_SHIFT = 4,
273 
274  CTRL_REG4_G_BLE = 0x40, // big/little endian data selection
275  CTRL_REG4_G_BDU = 0x80 // block data updates
277 
282  typedef enum {
283  G_ST_NORMAL = 0, // normal mode
284  G_ST_SELFTEST0 = 1, // x+, y-, z-
285 
286  // 2, reserved
287 
288  G_ST_SELFTEST1 = 3 // x-, y+, z+
289  } G_ST_T;
290 
295  typedef enum {
296  G_FS_245 = 0, // 245 deg/sec
297  G_FS_500 = 1,
298  G_FS_2000 = 2
299  // 3 is also 2000
300  } G_FS_T;
301 
305  typedef enum {
306  CTRL_REG5_G_OUTSEL0 = 0x01, // see fig. 18 in the datasheet
307  CTRL_REG5_G_OUTSEL1 = 0x02,
308  _CTRL_REG5_G_OUTSEL_MASK = 3,
309  _CTRL_REG5_G_OUTSEL_SHIFT = 0,
310 
311  CTRL_REG5_G_INT1SEL0 = 0x04, // see fig. 18 in the datasheet
312  CTRL_REG5_G_INT1SEL1 = 0x08,
313  _CTRL_REG5_G_INT1SEL_MASK = 3,
314  _CTRL_REG5_G_INT1SEL_SHIFT = 2,
315 
316  CTRL_REG5_G_HPEN = 0x10, // HPF enable
317 
318  // 0x20 reserved
319 
320  CTRL_REG5_G_FIFO_EN = 0x40,
321  CTRL_REG5_G_BOOT = 0x80 // reboot memory content
323 
324 
329  typedef enum {
330  G_INT1OUTSEL_0 = 0,
331  G_INT1OUTSEL_1 = 1,
332  G_INT1OUTSEL_2 = 2,
333  G_INT1OUTSEL_3 = 3
334  } G_INT1OUTSEL_T;
335 
339  typedef enum {
340  STATUS_REG_G_XDA = 0x01, // X axis data available
341  STATUS_REG_G_YDA = 0x02,
342  STATUS_REG_G_ZDA = 0x04,
343  STATUS_REG_G_ZYXDA = 0x08, // X, Y, and Z data available
344 
345  STATUS_REG_G_XOR = 0x10, // X data overrun
346  STATUS_REG_G_YOR = 0x20,
347  STATUS_REG_G_ZOR = 0x40,
348  STATUS_REG_G_ZYXOR = 0x80
350 
354  typedef enum {
355  FIFO_CTRL_REG_G_WTM0 = 0x01, // FIFO watermark
356  FIFO_CTRL_REG_G_WTM1 = 0x02,
357  FIFO_CTRL_REG_G_WTM2 = 0x04,
358  FIFO_CTRL_REG_G_WTM3 = 0x08,
359  FIFO_CTRL_REG_G_WTM4 = 0x10,
360  _FIFO_CTRL_REG_G_WTM_MASK = 31,
361  _FIFO_CTRL_REG_G_WTM_SHIFT = 0,
362 
363  FIFO_CTRL_REG_G_FM0 = 0x20, // FIFO mode config
364  FIFO_CTRL_REG_G_FM1 = 0x40,
365  FIFO_CTRL_REG_G_FM2 = 0x80,
366  _FIFO_CTRL_REG_G_FM_MASK = 7,
367  _FIFO_CTRL_REG_G_FM_SHIFT = 5,
369 
370  // FIFO_CTRL_REG_G_WTM (FIFO watermark) is just a numeric value
371  // between 0-31, so we won't enumerate those values.
372 
377  typedef enum {
378  G_FM_BYPASS = 0,
379  G_FM_FIFO = 1,
380  G_FM_STREAM = 2,
381  G_FM_STREAM2FIFO = 3,
382  G_FM_BYPASS2STREAM = 4
383 
384  // 5-7 unused
385  } G_FM_T;
386 
391  typedef enum {
392  FIFO_CTRL_REG_G_FSS0 = 0x01, // FIFO stored data level
393  FIFO_CTRL_REG_G_FSS1 = 0x02,
394  FIFO_CTRL_REG_G_FSS2 = 0x04,
395  FIFO_CTRL_REG_G_FSS3 = 0x08,
396  FIFO_CTRL_REG_G_FSS4 = 0x10,
397  _FIFO_CTRL_REG_G_FSS_MASK = 31,
398  _FIFO_CTRL_REG_G_FSS_SHIFT = 0,
399 
400  FIFO_CTRL_REG_G_EMPTY = 0x20, // FIFO empty
401  FIFO_CTRL_REG_G_OVRN = 0x40, // FIFO overrun
402  FIFO_CTRL_REG_G_WTM = 0x80 // watermark status
404 
409  typedef enum {
410  INT1_CFG_G_XLIE = 0x01, // X Low event interrupt enable
411  INT1_CFG_G_XHIE = 0x02, // X High event interrupt enable
412  INT1_CFG_G_YLIE = 0x04,
413  INT1_CFG_G_YHIE = 0x08,
414  INT1_CFG_G_ZLIE = 0x10,
415  INT1_CFG_G_ZHIE = 0x20,
416 
417  INT1_CFG_G_LIR = 0x40, // latch interrupt request
418  INT1_CFG_G_ANDOR = 0x80 // OR or AND interrupt events
420 
425  typedef enum {
426  INT1_SRC_G_XL = 0x01, // X low interrupt
427  INT1_SRC_G_XH = 0x02, // X high interrupt
428  INT1_SRC_G_YL = 0x04,
429  INT1_SRC_G_YH = 0x08,
430  INT1_SRC_G_ZL = 0x10,
431  INT1_SRC_G_ZH = 0x20,
432 
433  INT1_SRC_G_IA = 0x40 // interrupt active
434 
435  // 0x80 reserved
437 
438  // The following registers are for the Accelerometer (A/X),
439  // Magnetometer (M), and Temperature device.
440 
444  typedef enum {
445  // 0x00-0x04 reserved
446 
447  REG_OUT_TEMP_L_XM = 0x05, // temperature
448  REG_OUT_TEMP_H_XM = 0x06,
449 
450  REG_STATUS_REG_M = 0x07,
451 
452  REG_OUT_X_L_M = 0x08, // magnetometer outputs
453  REG_OUT_X_H_M = 0x09,
454  REG_OUT_Y_L_M = 0x0a,
455  REG_OUT_Y_H_M = 0x0b,
456  REG_OUT_Z_L_M = 0x0c,
457  REG_OUT_Z_H_M = 0x0d,
458 
459  // 0x0e reserved
460 
461  REG_WHO_AM_I_XM = 0x0f,
462 
463  // 0x10, 0x11 reserved
464 
465  REG_INT_CTRL_REG_M = 0x12,
466  REG_INT_SRC_REG_M = 0x13,
467 
468  REG_INT_THS_L_M = 0x14, // magnetometer threshold
469  REG_INT_THS_H_M = 0x15,
470 
471  REG_OFFSET_X_L_M = 0x16,
472  REG_OFFSET_X_H_M = 0x17,
473  REG_OFFSET_Y_L_M = 0x18,
474  REG_OFFSET_Y_H_M = 0x19,
475  REG_OFFSET_Z_L_M = 0x1a,
476  REG_OFFSET_Z_H_M = 0x1b,
477 
478  REG_REFERENCE_X = 0x1c,
479  REG_REFERENCE_Y = 0x1d,
480  REG_REFERENCE_Z = 0x1e,
481 
482  REG_CTRL_REG0_XM = 0x1f,
483  REG_CTRL_REG1_XM = 0x20,
484  REG_CTRL_REG2_XM = 0x21,
485  REG_CTRL_REG3_XM = 0x22,
486  REG_CTRL_REG4_XM = 0x23,
487  REG_CTRL_REG5_XM = 0x24,
488  REG_CTRL_REG6_XM = 0x25,
489  REG_CTRL_REG7_XM = 0x26,
490 
491  REG_STATUS_REG_A = 0x27,
492 
493  REG_OUT_X_L_A = 0x28, // accelerometer outputs
494  REG_OUT_X_H_A = 0x29,
495  REG_OUT_Y_L_A = 0x2a,
496  REG_OUT_Y_H_A = 0x2b,
497  REG_OUT_Z_L_A = 0x2c,
498  REG_OUT_Z_H_A = 0x2d,
499 
500  REG_FIFO_CTRL_REG = 0x2e,
501  REG_FIFO_SRC_REG = 0x2f,
502 
503  REG_INT_GEN_1_REG = 0x30,
504  REG_INT_GEN_1_SRC = 0x31,
505  REG_INT_GEN_1_THS = 0x32,
506  REG_INT_GEN_1_DURATION = 0x33,
507 
508  REG_INT_GEN_2_REG = 0x34,
509  REG_INT_GEN_2_SRC = 0x35,
510  REG_INT_GEN_2_THS = 0x36,
511  REG_INT_GEN_2_DURATION = 0x37,
512 
513  REG_CLICK_CFG = 0x38,
514  REG_CLICK_SRC = 0x39,
515  REG_CLICK_THS = 0x3a,
516 
517  REG_TIME_LIMIT = 0x3b,
518  REG_TIME_LATENCY = 0x3c,
519  REG_TIME_WINDOW = 0x3d,
520 
521  REG_ACT_THS = 0x3e,
522  REG_ACT_DUR = 0x3f
523  } REG_XM_T;
524 
528  typedef enum {
529  STATUS_REG_M_XMDA = 0x01, // X mag axis data available
530  STATUS_REG_M_YMDA = 0x02,
531  STATUS_REG_M_ZMDA = 0x04,
532  STATUS_REG_M_ZYXMDA = 0x08, // X, Y, and Z mag data available
533 
534  STATUS_REG_M_XMOR = 0x10, // X mag data overrun
535  STATUS_REG_M_YMOR = 0x20,
536  STATUS_REG_M_ZMOR = 0x40,
537  STATUS_REG_M_ZYXMOR = 0x80
539 
543  typedef enum {
544  INT_CTRL_REG_M_MIEN = 0x01, // mag interrupt enable
545  INT_CTRL_REG_M_4D = 0x02,
546  INT_CTRL_REG_M_IEL = 0x04, // latch intr request
547  INT_CTRL_REG_M_IEA = 0x08,
548  INT_CTRL_REG_M_PP_OD = 0x10, // push-pull/open drian
549  INT_CTRL_REG_M_ZMIEN = 0x20, // Z mag axis interrupt recognition
550  INT_CTRL_REG_M_YMIEN = 0x40,
551  INT_CTRL_REG_M_XMIEN = 0x80
553 
557  typedef enum {
558  INT_SRC_REG_M_MINT = 0x01,
559  INT_SRC_REG_M_MROI = 0x02,
560  INT_SRC_REG_M_NTH_Z = 0x04,
561  INT_SRC_REG_M_NTH_Y = 0x08,
562  INT_SRC_REG_M_NTH_X = 0x10,
563  INT_SRC_REG_M_PTH_Z = 0x20,
564  INT_SRC_REG_M_PTH_Y = 0x40,
565  INT_SRC_REG_M_PTH_X = 0x80
567 
568 
572  typedef enum {
573  CTRL_REG0_XM_HPIS2 = 0x01, // HPF enable for int generator 2
574  CTRL_REG0_XM_HPIS1 = 0x02,
575 
576  CTRL_REG0_XM_HP_CLICK = 0x04, // HPF enable for click
577 
578  // 0x08,0x10 reserved
579 
580  CTRL_REG0_XM_WTM_LEN = 0x20, // watermark enable
581  CTRL_REG0_XM_FIFO_EN = 0x40, // FIFO enable
582  CTRL_REG0_XM_BOOT = 0x80 // reboot memory content
584 
588  typedef enum {
589  CTRL_REG1_XM_AXEN = 0x01, // accelerometer x axis enable
590  CTRL_REG1_XM_AYEN = 0x02,
591  CTRL_REG1_XM_AZEN = 0x03,
592 
593  CTRL_REG1_XM_BDU = 0x04, // block data update
594 
595  CTRL_REG1_XM_AODR0 = 0x10, // accelerometer output data rate
596  CTRL_REG1_XM_AODR1 = 0x20,
597  CTRL_REG1_XM_AODR2 = 0x40,
598  CTRL_REG1_XM_AODR3 = 0x80,
599  _CTRL_REG1_XM_AODR_MASK = 15,
600  _CTRL_REG1_XM_AODR_SHIFT = 4
602 
606  typedef enum {
607  XM_AODR_PWRDWN = 0, // power down mode
608  XM_AODR_3_125 = 1, // 3.125 Hz
609  XM_AODR_6_25 = 2,
610  XM_AODR_12_5 = 3,
611  XM_AODR_25 = 4, // 25Hz
612  XM_AODR_50 = 5,
613  XM_AODR_100 = 6,
614  XM_AODR_200 = 7,
615  XM_AODR_400 = 8,
616  XM_AODR_800 = 9,
617  XM_AODR_1000 = 10
618  // 11-15 unused
619  } XM_AODR_T;
620 
624  typedef enum {
625  CTRL_REG2_XM_SIM = 0x01,
626 
627  CTRL_REG2_XM_AST0 = 0x02, // accel self-test enable
628  CTRL_REG2_XM_AST1 = 0x04,
629  _CTRL_REG2_XM_AST_MASK = 3,
630  _CTRL_REG2_XM_AST_SHIFT = 1,
631 
632  CTRL_REG2_XM_AFS0 = 0x08, // accel full scale
633  CTRL_REG2_XM_AFS1 = 0x10,
634  CTRL_REG2_XM_AFS2 = 0x20,
635  _CTRL_REG2_XM_AFS_MASK = 7,
636  _CTRL_REG2_XM_AFS_SHIFT = 3,
637 
638  CTRL_REG2_XM_ABW0 = 0x40, // accel anti-alias filter bandwidth
639  CTRL_REG2_XM_ABW1 = 0x80,
640  _CTRL_REG2_XM_ABW_MASK = 3,
641  _CTRL_REG2_XM_ABW_SHIFT = 6
643 
647  typedef enum {
648  XM_AST_NORMAL = 0,
649  XM_AST_POS_SIGN = 1,
650  XM_AST_NEG_SIGN = 2
651  // 3 not allowed
652  } XM_AST_T;
653 
657  typedef enum {
658  XM_AFS_2 = 0, // 2g
659  XM_AFS_4 = 1,
660  XM_AFS_6 = 2,
661  XM_AFS_8 = 3,
662  XM_AFS_16 = 4
663 
664  // 5-7 not used
665  } XM_AFS_T;
666 
670  typedef enum {
671  XM_ABW_773 = 0, // 773Hz
672  XM_ABW_194 = 1, // these two might be inverted (typo in ds)
673  XM_ABW_362 = 2,
674  XM_ABW_50 = 3
675  } XM_ABW_T;
676 
680  typedef enum {
681  CTRL_REG3_XM_P1_EMPTY = 0x01, // INT1_XM pin enables
682  CTRL_REG3_XM_P1_DRDYM = 0x02,
683  CTRL_REG3_XM_P1_DRDYA = 0x04,
684  CTRL_REG3_XM_P1_INTM = 0x08,
685  CTRL_REG3_XM_P1_INT2 = 0x10,
686  CTRL_REG3_XM_P1_INT1 = 0x20,
687  CTRL_REG3_XM_P1_TAP = 0x40,
688  CTRL_REG3_XM_P1_BOOT = 0x80
690 
694  typedef enum {
695  CTRL_REG4_XM_P2_WTM = 0x01, // INT2_XM pin enables
696  CTRL_REG4_XM_P2_OVERRUN = 0x02,
697  CTRL_REG4_XM_P2_DRDYM = 0x04,
698  CTRL_REG4_XM_P2_DRDYA = 0x08,
699  CTRL_REG4_XM_P2_INTM = 0x10,
700  CTRL_REG4_XM_P2_INT2 = 0x20,
701  CTRL_REG4_XM_P2_INT1 = 0x40,
702  CTRL_REG4_XM_P2_TAP = 0x80
704 
708  typedef enum {
709  CTRL_REG5_XM_LIR1 = 0x01, // latch intr 1
710  CTRL_REG5_XM_LIR2 = 0x02, // latch intr 2
711 
712  CTRL_REG5_XM_ODR0 = 0x04, // mag output data rate
713  CTRL_REG5_XM_ODR1 = 0x08,
714  CTRL_REG5_XM_ODR2 = 0x10,
715  _CTRL_REG5_XM_ODR_MASK = 7,
716  _CTRL_REG5_XM_ODR_SHIFT = 2,
717 
718  CTRL_REG5_XM_RES0 = 0x20, // mag resolution
719  CTRL_REG5_XM_RES1 = 0x40,
720  _CTRL_REG5_XM_RES_MASK = 3,
721  _CTRL_REG5_XM_RES_SHIFT = 5,
722 
723  CTRL_REG5_XM_TEMP_EN = 0x80 // temp sensor enable
725 
729  typedef enum {
730  XM_ODR_3_125 = 0, // 3.125Hz
731  XM_ODR_6_25 = 1,
732  XM_ODR_12_5 = 2,
733  XM_ODR_25 = 3,
734  XM_ODR_50 = 4,
735  XM_ODR_100 = 5
736 
737  // 6, 7 reserved
738  } XM_ODR_T;
739 
743  typedef enum {
744  XM_RES_LOW = 0, // low resolution
745 
746  // 1, 2 reserved
747 
748  XM_RES_HIGH = 3,
749  } XM_RES_T;
750 
754  typedef enum {
755  // 0x01-0x10 reserved
756 
757  CTRL_REG6_XM_MFS0 = 0x20,
758  CTRL_REG6_XM_MFS1 = 0x40,
759  _CTRL_REG6_XM_MFS_MASK = 3,
760  _CTRL_REG6_XM_MFS_SHIFT = 5
761 
762  // 0x80 reserved
764 
768  typedef enum {
769  XM_MFS_2 = 0, // +/- 2 gauss
770  XM_MFS_4 = 1,
771  XM_MFS_8 = 2,
772  XM_MFS_12 = 3
773  } XM_MFS_T;
774 
778  typedef enum {
779  CTRL_REG7_XM_MD0 = 0x01, // mag sensor mode
780  CTRL_REG7_XM_MD1 = 0x02,
781  _CTRL_REG7_XM_MD_MASK = 3,
782  _CTRL_REG7_XM_MD_SHIFT = 0,
783 
784  CTRL_REG7_XM_MLP = 0x04, // mag low power mode
785 
786  // 0x08, 0x10 reserved
787 
788  CTRL_REG7_XM_AFDS = 0x20, // filtered acceleration data
789 
790  CTRL_REG7_XM_AHPM0 = 0x40, // accel HPF selection
791  CTRL_REG7_XM_AHPM1 = 0x80,
792  _CTRL_REG7_XM_AHPM_MASK = 3,
793  _CTRL_REG7_XM_AHPM_SHIFT = 6
795 
799  typedef enum {
800  XM_MD_CONTINUOUS = 0, // continuous conversion
801  XM_MD_SINGLE = 1, // single conversion
802  XM_MD_POWERDOWN = 2 // power down mode
803  // 3 is also power down mode, for some odd reason
804  } XM_MD_T;
805 
809  typedef enum {
810  // XM_AHPM_NORMAL_REF: Normal mode (resets x, y and z-axis
811  // reading REFERENCE_X (1Ch), REFERENCE_Y (1Dh) and REFERENCE_Y
812  // (1Dh) registers respectively)
813 
814  XM_AHPM_NORMAL_REF = 0,
815  XM_AHPM_REFERENCE = 1,
816  XM_AHPM_NORMAL = 2,
817  XM_AHPM_AUTORESET = 3 // autoreset on interrupt
818  } XM_AHPM_T;
819 
823  typedef enum {
824  STATUS_REG_A_XADA = 0x01, // X accel axis data available
825  STATUS_REG_A_YADA = 0x02,
826  STATUS_REG_A_ZADA = 0x04,
827  STATUS_REG_A_ZYXADA = 0x08, // X, Y, and Z accel data available
828 
829  STATUS_REG_A_XAOR = 0x10, // X accel data overrun
830  STATUS_REG_A_YAOR = 0x20,
831  STATUS_REG_A_ZAOR = 0x40,
832  STATUS_REG_A_ZYXAOR = 0x80
834 
838  typedef enum {
839  FIFO_CTRL_REG_FTH0 = 0x01, // FIFO watermark/threshold
840  FIFO_CTRL_REG_FTH1 = 0x02,
841  FIFO_CTRL_REG_FTH2 = 0x04,
842  FIFO_CTRL_REG_FTH3 = 0x08,
843  FIFO_CTRL_REG_FTH4 = 0x10,
844  _FIFO_CTRL_REG_FTH_MASK = 31,
845  _FIFO_CTRL_REG_FTH_SHIFT = 0,
846 
847  FIFO_CTRL_REG_FM0 = 0x20, // FIFO mode config
848  FIFO_CTRL_REG_FM1 = 0x40,
849  FIFO_CTRL_REG_FM2 = 0x80,
850  _FIFO_CTRL_REG_FM_MASK = 7,
851  _FIFO_CTRL_REG_FM_SHIFT = 5,
852  } FIFO_CTRL_REG_T;
853 
854  // FIFO_CTRL_REG_FTH (FIFO watermark/threshold) is just a numeric
855  // value between 0-31, so we won't enumerate those values.
856 
861  typedef enum {
862  FM_BYPASS = 0,
863  FM_FIFO = 1,
864  FM_STREAM = 2,
865  FM_STREAM2FIFO = 3,
866  FM_BYPASS2STREAM = 4
867 
868  // 5-7 unused
869  } FM_T;
870 
875  typedef enum {
876  FIFO_CTRL_REG_FSS0 = 0x01, // FIFO stored data level
877  FIFO_CTRL_REG_FSS1 = 0x02,
878  FIFO_CTRL_REG_FSS2 = 0x04,
879  FIFO_CTRL_REG_FSS3 = 0x08,
880  FIFO_CTRL_REG_FSS4 = 0x10,
881  _FIFO_CTRL_REG_FSS_MASK = 31,
882  _FIFO_CTRL_REG_FSS_SHIFT = 0,
883 
884  FIFO_CTRL_REG_EMPTY = 0x20, // FIFO empty
885  FIFO_CTRL_REG_OVRN = 0x40, // FIFO overrun
886  FIFO_CTRL_REG_WTM = 0x80 // watermark status
888 
893  typedef enum {
894  INT_GEN_X_REG_XLIE_XDOWNE = 0x01, // enable intr on X low or dir recog
895  INT_GEN_X_REG_XHIE_XUPE = 0x02,
896  INT_GEN_X_REG_YLIE_YDOWNE = 0x04,
897  INT_GEN_X_REG_YHIE_YUPE = 0x08,
898  INT_GEN_X_REG_ZLIE_ZDOWNE = 0x10,
899  INT_GEN_X_REG_ZHIE_ZUPE = 0x20,
900  INT_GEN_X_REG_6D = 0x40, // enable 6D direction function
901  INT_GEN_X_REG_AOI = 0x80 // AND/OR combination of intrs
903 
908  typedef enum {
909  INT_GEN_X_SRC_XL = 0x01,
910  INT_GEN_X_SRC_XH = 0x02,
911  INT_GEN_X_SRC_YL = 0x04,
912  INT_GEN_X_SRC_YH = 0x08,
913  INT_GEN_X_SRC_ZL = 0x10,
914  INT_GEN_X_SRC_ZH = 0x20,
915  INT_GEN_X_SRC_IA = 0x40
916  // 0x80 reserved
918 
923  typedef enum {
924  INT_GEN_X_THS0 = 0x01, // interrupt threshold
925  INT_GEN_X_THS1 = 0x02,
926  INT_GEN_X_THS2 = 0x04,
927  INT_GEN_X_THS3 = 0x08,
928  INT_GEN_X_THS4 = 0x10,
929  INT_GEN_X_THS5 = 0x20,
930  INT_GEN_X_THS6 = 0x40,
931  _INT_GEN_X_THS_MASK = 127,
932  _INT_GEN_X_THS_SHIFT = 0
933  // 0x80 reserved
935 
940  typedef enum {
941  INT_GEN_X_DUR0 = 0x01, // interrupt duration
942  INT_GEN_X_DUR1 = 0x02,
943  INT_GEN_X_DUR2 = 0x04,
944  INT_GEN_X_DUR3 = 0x08,
945  INT_GEN_X_DUR4 = 0x10,
946  INT_GEN_X_DUR5 = 0x20,
947  INT_GEN_X_DUR6 = 0x40,
948  _INT_GEN_X_DUR_MASK = 127,
949  _INT_GEN_X_DUR_SHIFT = 0
950  // 0x80 reserved
952 
957  typedef enum {
958  CLICK_CONFIG_XS = 0x01, // enable intr single click x
959  CLICK_CONFIG_XD = 0x02, // enable intr double click x
960  CLICK_CONFIG_YS = 0x04,
961  CLICK_CONFIG_YD = 0x08,
962  CLICK_CONFIG_ZS = 0x10,
963  CLICK_CONFIG_ZD = 0x20
964  // 0x40, 0x80 reserved
966 
971  typedef enum {
972  CLICK_SRC_X = 0x01,
973  CLICK_SRC_Y = 0x02,
974  CLICK_SRC_Z = 0x04,
975  CLICK_SRC_SIGN = 0x08,
976  CLICK_SRC_SCLICK = 0x10,
977  CLICK_SRC_DCLICK = 0x20,
978  CLICK_SRC_IA = 0x40
979  // 0x80 reserved
981 
986  typedef enum {
987  CLICK_THS_THS0 = 0x01, // click threshold
988  CLICK_THS_THS1 = 0x02,
989  CLICK_THS_THS2 = 0x04,
990  CLICK_THS_THS3 = 0x08,
991  CLICK_THS_THS4 = 0x10,
992  CLICK_THS_THS5 = 0x20,
993  CLICK_THS_THS6 = 0x40,
994  _CLICK_THS_THS_MASK = 127,
995  _CLICK_THS_THS_SHIFT = 0
996  // 0x80 reserved
998 
1003  typedef enum {
1004  CLICK_TIME_LIMIT_TLI0 = 0x01,
1005  CLICK_TIME_LIMIT_TLI1 = 0x02,
1006  CLICK_TIME_LIMIT_TLI2 = 0x04,
1007  CLICK_TIME_LIMIT_TLI3 = 0x08,
1008  CLICK_TIME_LIMIT_TLI4 = 0x10,
1009  CLICK_TIME_LIMIT_TLI5 = 0x20,
1010  CLICK_TIME_LIMIT_TLI6 = 0x40,
1011  _CLICK_TIME_LIMIT_TLI_MASK = 127,
1012  _CLICK_TIME_LIMIT_TLI_SHIFT = 0
1013  // 0x80 reserved
1015 
1020  typedef enum {
1021  ACT_THS_ACTH0 = 0x01, // 1 LSb = 16mg (?)
1022  ACT_THS_ACTH1 = 0x02,
1023  ACT_THS_ACTH2 = 0x04,
1024  ACT_THS_ACTH3 = 0x08,
1025  ACT_THS_ACTH4 = 0x10,
1026  ACT_THS_ACTH5 = 0x20,
1027  ACT_THS_ACTH6 = 0x40,
1028  _ACT_THS_ACTH_MASK = 127,
1029  _ACT_THS_ACTH_SHIFT = 0
1030  // 0x80 reserved
1031  } ACT_THS_BITS_T;
1032 
1033  // Driver specific enumerations
1034 
1035  // device enums for read/write regs
1036  typedef enum {
1037  DEV_GYRO,
1038  DEV_XM
1039  } DEVICE_T;
1040 
1041  // interrupt selection for installISR() and uninstallISR()
1042  typedef enum {
1043  INTERRUPT_G_INT, // gyroscope interrupt
1044  INTERRUPT_G_DRDY, // gyroscope data ready interrupt
1045  INTERRUPT_XM_GEN1, // XM interrupt generator 1
1046  INTERRUPT_XM_GEN2 // XM interrupt generator 2
1047  } INTERRUPT_PINS_T;
1048 
1049 
1056  LSM9DS0(int bus=LSM9DS0_I2C_BUS,
1057  uint8_t gAddress=LSM9DS0_DEFAULT_GYRO_ADDR,
1058  uint8_t xmAddress=LSM9DS0_DEFAULT_XM_ADDR);
1059 
1063  ~LSM9DS0();
1064 
1070  bool init();
1071 
1076  void update();
1077 
1081  void updateGyroscope();
1082 
1086  void updateAccelerometer();
1087 
1091  void updateMagnetometer();
1092 
1096  void updateTemperature();
1097 
1105  uint8_t readReg(DEVICE_T dev, uint8_t reg);
1106 
1116  void readRegs(DEVICE_T dev, uint8_t reg, uint8_t *buf, int len);
1117 
1126  bool writeReg(DEVICE_T dev, uint8_t reg, uint8_t val);
1127 
1134  bool setGyroscopePowerDown(bool enable);
1135 
1144  bool setGyroscopeEnableAxes(uint8_t axes);
1145 
1152  bool setGyroscopeODR(G_ODR_T odr);
1153 
1160  bool setGyroscopeScale(G_FS_T scale);
1161 
1168  bool setAccelerometerEnableAxes(uint8_t axes);
1169 
1176  bool setAccelerometerODR(XM_AODR_T odr);
1177 
1184  bool setAccelerometerScale(XM_AFS_T scale);
1185 
1193 
1200  bool setMagnetometerODR(XM_ODR_T odr);
1201 
1208  bool setMagnetometerMode(XM_MD_T mode);
1209 
1218  bool setMagnetometerLPM(bool enable);
1219 
1226  bool setMagnetometerScale(XM_MFS_T scale);
1227 
1236  void getAccelerometer(float *x, float *y, float *z);
1237 
1246  void getGyroscope(float *x, float *y, float *z);
1247 
1256  void getMagnetometer(float *x, float *y, float *z);
1257 
1266  float getTemperature();
1267 
1274  bool enableTemperatureSensor(bool enable);
1275 
1281  uint8_t getGyroscopeStatus();
1282 
1288  uint8_t getMagnetometerStatus();
1289 
1295  uint8_t getAccelerometerStatus();
1296 
1302  uint8_t getGyroscopeInterruptConfig();
1303 
1310  bool setGyroscopeInterruptConfig(uint8_t enables);
1311 
1317  uint8_t getGyroscopeInterruptSrc();
1318 
1325 
1332  bool setMagnetometerInterruptControl(uint8_t enables);
1333 
1339  uint8_t getMagnetometerInterruptSrc();
1340 
1346  uint8_t getInterruptGen1();
1347 
1354  bool setInterruptGen1(uint8_t enables);
1355 
1361  uint8_t getInterruptGen1Src();
1362 
1368  uint8_t getInterruptGen2();
1369 
1376  bool setInterruptGen2(uint8_t enables);
1377 
1383  uint8_t getInterruptGen2Src();
1384 
1397  void installISR(INTERRUPT_PINS_T intr, int gpio, mraa::Edge level,
1398  void (*isr)(void *), void *arg);
1399 
1406  void uninstallISR(INTERRUPT_PINS_T intr);
1407 
1408  protected:
1409  // uncompensated accelerometer and gyroscope values
1410  float m_accelX;
1411  float m_accelY;
1412  float m_accelZ;
1413 
1414  float m_gyroX;
1415  float m_gyroY;
1416  float m_gyroZ;
1417 
1418  float m_magX;
1419  float m_magY;
1420  float m_magZ;
1421 
1422  // uncompensated temperature value
1423  float m_temp;
1424 
1425  // accelerometer and gyro scaling factors, depending on their Full
1426  // Scale settings.
1427  float m_accelScale;
1428  float m_gyroScale;
1429  float m_magScale;
1430 
1431  private:
1432  // OR'd with a register, this enables register autoincrement mode,
1433  // which we need.
1434  static const uint8_t m_autoIncrementMode = 0x80;
1435 
1436  mraa::I2c m_i2cG;
1437  mraa::I2c m_i2cXM;
1438  uint8_t m_gAddr;
1439  uint8_t m_xmAddr;
1440 
1441  // return a reference to a gpio pin pointer depending on intr
1442  mraa::Gpio*& getPin(INTERRUPT_PINS_T intr);
1443 
1444  // possible interrupt pins
1445  mraa::Gpio *m_gpioG_INT;
1446  mraa::Gpio *m_gpioG_DRDY;
1447  mraa::Gpio *m_gpioXM_GEN1;
1448  mraa::Gpio *m_gpioXM_GEN2;
1449  };
1450 }
1451 
1452 
CTRL_REG4_XM_BITS_T
Definition: lsm9ds0.h:694
CTRL_REG0_XM_BITS_T
Definition: lsm9ds0.h:572
bool setMagnetometerMode(XM_MD_T mode)
Definition: lsm9ds0.cxx:509
G_ODR_T
Definition: lsm9ds0.h:169
G_HPCF_T
Definition: lsm9ds0.h:216
float getTemperature()
Definition: lsm9ds0.cxx:610
void updateTemperature()
Definition: lsm9ds0.cxx:259
CTRL_REG7_XM_BITS_T
Definition: lsm9ds0.h:778
STATUS_REG_A_BITS_T
Definition: lsm9ds0.h:823
bool setInterruptGen1(uint8_t enables)
Definition: lsm9ds0.cxx:682
uint8_t getAccelerometerStatus()
Definition: lsm9ds0.cxx:642
CLICK_TIME_LIMIT_BITS_T
Definition: lsm9ds0.h:1003
bool setMagnetometerInterruptControl(uint8_t enables)
Definition: lsm9ds0.cxx:667
uint8_t readReg(DEVICE_T dev, uint8_t reg)
Definition: lsm9ds0.cxx:279
bool setMagnetometerODR(XM_ODR_T odr)
Definition: lsm9ds0.cxx:498
LSM9DS0(int bus=LSM9DS0_I2C_BUS, uint8_t gAddress=LSM9DS0_DEFAULT_GYRO_ADDR, uint8_t xmAddress=LSM9DS0_DEFAULT_XM_ADDR)
Definition: lsm9ds0.cxx:36
XM_ABW_T
Definition: lsm9ds0.h:670
uint8_t getMagnetometerStatus()
Definition: lsm9ds0.cxx:637
void update()
Definition: lsm9ds0.cxx:197
uint8_t getInterruptGen2Src()
Definition: lsm9ds0.cxx:702
bool setAccelerometerScale(XM_AFS_T scale)
Definition: lsm9ds0.cxx:441
void updateMagnetometer()
Definition: lsm9ds0.cxx:241
XM_MD_T
Definition: lsm9ds0.h:799
bool setGyroscopeODR(G_ODR_T odr)
Definition: lsm9ds0.cxx:365
FM_T
Definition: lsm9ds0.h:861
uint8_t getMagnetometerInterruptControl()
Definition: lsm9ds0.cxx:662
XM_AST_T
Definition: lsm9ds0.h:647
bool setGyroscopeInterruptConfig(uint8_t enables)
Definition: lsm9ds0.cxx:652
bool setGyroscopeScale(G_FS_T scale)
Definition: lsm9ds0.cxx:376
bool setMagnetometerResolution(XM_RES_T res)
Definition: lsm9ds0.cxx:487
G_FS_T
Definition: lsm9ds0.h:295
INT_GEN_X_DUR_BITS_T
Definition: lsm9ds0.h:940
REG_XM_T
Definition: lsm9ds0.h:444
API for the LSM9DS0 3-axis Gyroscope, Accelerometer, and Magnetometer.
Definition: lsm9ds0.h:72
uint8_t getGyroscopeInterruptConfig()
Definition: lsm9ds0.cxx:647
FIFO_CTRL_REG_G_T
Definition: lsm9ds0.h:354
bool setGyroscopeEnableAxes(uint8_t axes)
Definition: lsm9ds0.cxx:349
STATUS_REG_M_BITS_T
Definition: lsm9ds0.h:528
XM_ODR_T
Definition: lsm9ds0.h:729
Definition: a110x.h:29
CTRL_REG4_G_BITS_T
Definition: lsm9ds0.h:259
uint8_t getInterruptGen1Src()
Definition: lsm9ds0.cxx:687
void updateAccelerometer()
Definition: lsm9ds0.cxx:223
uint8_t getGyroscopeStatus()
Definition: lsm9ds0.cxx:632
bool setMagnetometerScale(XM_MFS_T scale)
Definition: lsm9ds0.cxx:532
INT_GEN_X_THS_BITS_T
Definition: lsm9ds0.h:923
uint8_t getMagnetometerInterruptSrc()
Definition: lsm9ds0.cxx:672
void updateGyroscope()
Definition: lsm9ds0.cxx:205
G_ST_T
Definition: lsm9ds0.h:282
CTRL_REG2_XM_BITS_T
Definition: lsm9ds0.h:624
uint8_t getInterruptGen1()
Definition: lsm9ds0.cxx:677
void readRegs(DEVICE_T dev, uint8_t reg, uint8_t *buf, int len)
Definition: lsm9ds0.cxx:295
G_HPM_T
Definition: lsm9ds0.h:235
bool setMagnetometerLPM(bool enable)
Definition: lsm9ds0.cxx:520
FIFO_SRC_REG_BITS_T
Definition: lsm9ds0.h:875
XM_RES_T
Definition: lsm9ds0.h:743
void getMagnetometer(float *x, float *y, float *z)
Definition: lsm9ds0.cxx:598
uint8_t getInterruptGen2()
Definition: lsm9ds0.cxx:692
CLICK_THS_BITS_T
Definition: lsm9ds0.h:986
INT1_CFG_G_BITS_T
Definition: lsm9ds0.h:409
CTRL_REG3_G_BITS_T
Definition: lsm9ds0.h:245
void getGyroscope(float *x, float *y, float *z)
Definition: lsm9ds0.cxx:586
FIFO_CTRL_REG_T
Definition: lsm9ds0.h:838
STATUS_REG_G_BITS_T
Definition: lsm9ds0.h:339
INT1_SRC_G_BITS_T
Definition: lsm9ds0.h:425
G_FM_T
Definition: lsm9ds0.h:377
bool setGyroscopePowerDown(bool enable)
Definition: lsm9ds0.cxx:337
CTRL_REG6_XM_BITS_T
Definition: lsm9ds0.h:754
CTRL_REG5_XM_BITS_T
Definition: lsm9ds0.h:708
bool writeReg(DEVICE_T dev, uint8_t reg, uint8_t val)
Definition: lsm9ds0.cxx:313
CLICK_CONFIG_BITS_T
Definition: lsm9ds0.h:957
XM_MFS_T
Definition: lsm9ds0.h:768
XM_AFS_T
Definition: lsm9ds0.h:657
XM_AODR_T
Definition: lsm9ds0.h:606
bool setInterruptGen2(uint8_t enables)
Definition: lsm9ds0.cxx:697
CTRL_REG1_XM_BITS_T
Definition: lsm9ds0.h:588
void getAccelerometer(float *x, float *y, float *z)
Definition: lsm9ds0.cxx:574
void installISR(INTERRUPT_PINS_T intr, int gpio, mraa::Edge level, void(*isr)(void *), void *arg)
Definition: lsm9ds0.cxx:707
bool setAccelerometerEnableAxes(uint8_t axes)
Definition: lsm9ds0.cxx:414
bool enableTemperatureSensor(bool enable)
Definition: lsm9ds0.cxx:620
CTRL_REG5_G_BITS_T
Definition: lsm9ds0.h:305
G_INT1OUTSEL_T
Definition: lsm9ds0.h:329
INT_GEN_X_SRC_BITS_T
Definition: lsm9ds0.h:908
ACT_THS_BITS_T
Definition: lsm9ds0.h:1020
bool setAccelerometerODR(XM_AODR_T odr)
Definition: lsm9ds0.cxx:430
INT_CTRL_REG_M_BITS_T
Definition: lsm9ds0.h:543
CLICK_SRC_BITS_T
Definition: lsm9ds0.h:971
CTRL_REG1_G_BITS_T
Definition: lsm9ds0.h:133
CTRL_REG3_XM_BITS_T
Definition: lsm9ds0.h:680
bool init()
Definition: lsm9ds0.cxx:90
XM_AHPM_T
Definition: lsm9ds0.h:809
CTRL_REG2_G_BITS_T
Definition: lsm9ds0.h:193
REG_G_T
Definition: lsm9ds0.h:86
FIFO_SRC_REG_G_BITS_T
Definition: lsm9ds0.h:391
INT_SRC_REG_M_BITS_T
Definition: lsm9ds0.h:557
~LSM9DS0()
Definition: lsm9ds0.cxx:82
uint8_t getGyroscopeInterruptSrc()
Definition: lsm9ds0.cxx:657
INT_GEN_X_REG_BITS_T
Definition: lsm9ds0.h:893
void uninstallISR(INTERRUPT_PINS_T intr)
Definition: lsm9ds0.cxx:720