aboutsummaryrefslogtreecommitdiffstats
path: root/os/ex/ST/lsm6ds0.h
diff options
context:
space:
mode:
Diffstat (limited to 'os/ex/ST/lsm6ds0.h')
-rw-r--r--os/ex/ST/lsm6ds0.h517
1 files changed, 359 insertions, 158 deletions
diff --git a/os/ex/ST/lsm6ds0.h b/os/ex/ST/lsm6ds0.h
index a2cee28ec..34efdcec3 100644
--- a/os/ex/ST/lsm6ds0.h
+++ b/os/ex/ST/lsm6ds0.h
@@ -35,14 +35,260 @@
/*===========================================================================*/
/**
- * @brief LSM6DS0 accelerometer subsystem number of axes.
+ * @name Version identification
+ * @{
+ */
+/**
+ * @brief LSM6DS0 driver version string.
+ */
+#define EX_LSM6DS0_VERSION "1.0.0"
+
+/**
+ * @brief LSM6DS0 driver version major number.
+ */
+#define EX_LSM6DS0_MAJOR 1
+
+/**
+ * @brief LSM6DS0 driver version minor number.
+ */
+#define EX_LSM6DS0_MINOR 0
+
+/**
+ * @brief LSM6DS0 driver version patch number.
+ */
+#define EX_LSM6DS0_PATCH 0
+/** @} */
+
+/**
+ * @brief LSM6DS0 accelerometer subsystem characteristics.
+ *
+ * @{
+ */
+#define LSM6DS0_ACC_NUMBER_OF_AXES 3U
+
+#define LSM6DS0_ACC_2G 2.0f
+#define LSM6DS0_ACC_4G 4.0f
+#define LSM6DS0_ACC_8G 8.0f
+#define LSM6DS0_ACC_16G 16.0f
+
+#define LSM6DS0_ACC_SENS_2G 0.061f
+#define LSM6DS0_ACC_SENS_4G 0.122f
+#define LSM6DS0_ACC_SENS_8G 0.244f
+#define LSM6DS0_ACC_SENS_16G 0.732f
+/** @} */
+
+/**
+ * @brief LSM6DS0 gyroscope subsystem characteristics.
+ *
+ * @{
+ */
+#define LSM6DS0_GYRO_NUMBER_OF_AXES 3U
+
+#define LSM6DS0_GYRO_245DPS 245.0f
+#define LSM6DS0_GYRO_500DPS 500.0f
+#define LSM6DS0_GYRO_2000DPS 2000.0f
+
+#define LSM6DS0_GYRO_SENS_245DPS 0.00875f
+#define LSM6DS0_GYRO_SENS_500DPS 0.01750f
+#define LSM6DS0_GYRO_SENS_2000DPS 0.07000f
+/** @} */
+
+/**
+ * @name LSM6DS0 communication interfaces related bit masks
+ * @{
+ */
+#define LSM6DS0_DI_MASK 0xFF /**< Data In mask */
+#define LSM6DS0_DI(n) (1 << n) /**< Data In bit n */
+#define LSM6DS0_AD_MASK 0x7F /**< Address Data mask */
+#define LSM6DS0_AD(n) (1 << n) /**< Address Data bit n */
+#define LSM6DS0_MS (1 << 7) /**< Multiple read write */
+/** @} */
+
+/**
+ * @name LSM6DS0 register addresses
+ * @{
+ */
+#define LSM6DS0_AD_ACT_THS 0x04
+#define LSM6DS0_AD_ACT_DUR 0x05
+#define LSM6DS0_AD_INT_GEN_CFG_XL 0x06
+#define LSM6DS0_AD_INT_GEN_THS_X_XL 0x07
+#define LSM6DS0_AD_INT_GEN_THS_Y_XL 0x08
+#define LSM6DS0_AD_INT_GEN_THS_Z_XL 0x09
+#define LSM6DS0_AD_INT_GEN_DUR_XL 0x0A
+#define LSM6DS0_AD_REFERENCE_G 0x0B
+#define LSM6DS0_AD_INT_CTRL 0x0C
+#define LSM6DS0_AD_WHO_AM_I 0x0F
+#define LSM6DS0_AD_CTRL_REG1_G 0x10
+#define LSM6DS0_AD_CTRL_REG2_G 0x11
+#define LSM6DS0_AD_CTRL_REG3_G 0x12
+#define LSM6DS0_AD_ORIENT_CFG_G 0x13
+#define LSM6DS0_AD_INT_GEN_SRC_G 0x14
+#define LSM6DS0_AD_OUT_TEMP_L 0x15
+#define LSM6DS0_AD_OUT_TEMP_H 0x16
+#define LSM6DS0_AD_STATUS_REG1 0x17
+#define LSM6DS0_AD_OUT_X_L_G 0x18
+#define LSM6DS0_AD_OUT_X_H_G 0x19
+#define LSM6DS0_AD_OUT_Y_L_G 0x1A
+#define LSM6DS0_AD_OUT_Y_H_G 0x1B
+#define LSM6DS0_AD_OUT_Z_L_G 0x1C
+#define LSM6DS0_AD_OUT_Z_H_G 0x1D
+#define LSM6DS0_AD_CTRL_REG4 0x1E
+#define LSM6DS0_AD_CTRL_REG5_XL 0x1F
+#define LSM6DS0_AD_CTRL_REG6_XL 0x20
+#define LSM6DS0_AD_CTRL_REG7_XL 0x21
+#define LSM6DS0_AD_CTRL_REG8 0x22
+#define LSM6DS0_AD_CTRL_REG9 0x23
+#define LSM6DS0_AD_CTRL_REG10 0x24
+#define LSM6DS0_AD_INT_GEN_SRC_XL 0x26
+#define LSM6DS0_AD_STATUS_REG2 0x27
+#define LSM6DS0_AD_OUT_X_L_XL 0x28
+#define LSM6DS0_AD_OUT_X_H_XL 0x29
+#define LSM6DS0_AD_OUT_Y_L_XL 0x2A
+#define LSM6DS0_AD_OUT_Y_H_XL 0x2B
+#define LSM6DS0_AD_OUT_Z_L_XL 0x2C
+#define LSM6DS0_AD_OUT_Z_H_XL 0x2D
+#define LSM6DS0_AD_FIFO_CTRL 0x2E
+#define LSM6DS0_AD_FIFO_SRC 0x2F
+#define LSM6DS0_AD_INT_GEN_CFG_G 0x30
+#define LSM6DS0_AD_INT_GEN_THS_XH_G 0x31
+#define LSM6DS0_AD_INT_GEN_THS_XL_G 0x32
+#define LSM6DS0_AD_INT_GEN_THS_YH_G 0x33
+#define LSM6DS0_AD_INT_GEN_THS_YL_G 0x34
+#define LSM6DS0_AD_INT_GEN_THS_ZH_G 0x35
+#define LSM6DS0_AD_INT_GEN_THS_ZL_G 0x36
+#define LSM6DS0_AD_INT_GEN_DUR_G 0x37
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG1_G register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG1_G 0xFA
+#define LSM6DS0_CTRL_REG1_G_BW_G0 (1 << 0)
+#define LSM6DS0_CTRL_REG1_G_BW_G1 (1 << 1)
+#define LSM6DS0_CTRL_REG1_G_FS_MASK 0x1F
+#define LSM6DS0_CTRL_REG1_G_FS_G0 (1 << 3)
+#define LSM6DS0_CTRL_REG1_G_FS_G1 (1 << 4)
+#define LSM6DS0_CTRL_REG1_G_ODR_G0 (1 << 5)
+#define LSM6DS0_CTRL_REG1_G_ODR_G1 (1 << 6)
+#define LSM6DS0_CTRL_REG1_G_ODR_G2 (1 << 7)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG2_G register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG2_G 0x0F
+#define LSM6DS0_CTRL_REG2_G_OUT_SEL0 (1 << 0)
+#define LSM6DS0_CTRL_REG2_G_OUT_SEL1 (1 << 1)
+#define LSM6DS0_CTRL_REG2_G_INT_SEL0 (1 << 2)
+#define LSM6DS0_CTRL_REG2_G_INT_SEL1 (1 << 3)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG3_G register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG3_G 0x64
+#define LSM6DS0_CTRL_REG3_G_HP_CF0_G (1 << 0)
+#define LSM6DS0_CTRL_REG3_G_HP_CF1_G (1 << 1)
+#define LSM6DS0_CTRL_REG3_G_HP_CF2_G (1 << 2)
+#define LSM6DS0_CTRL_REG3_G_HP_CF3_G (1 << 3)
+#define LSM6DS0_CTRL_REG3_G_HP_EN (1 << 6)
+#define LSM6DS0_CTRL_REG3_G_LP_MODE (1 << 7)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG4 register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG4 0x3A
+#define LSM6DS0_CTRL_REG4_4D_XL1 (1 << 0)
+#define LSM6DS0_CTRL_REG4_LIR_XL1 (1 << 1)
+#define LSM6DS0_CTRL_REG4_XEN_G (1 << 3)
+#define LSM6DS0_CTRL_REG4_YEN_G (1 << 4)
+#define LSM6DS0_CTRL_REG4_ZEN_G (1 << 5)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG5_XL register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG5_XL 0xF8
+#define LSM6DS0_CTRL_REG5_XL_XEN_XL (1 << 3)
+#define LSM6DS0_CTRL_REG5_XL_YEN_XL (1 << 4)
+#define LSM6DS0_CTRL_REG5_XL_ZEN_XL (1 << 5)
+#define LSM6DS0_CTRL_REG5_XL_DEC0 (1 << 6)
+#define LSM6DS0_CTRL_REG5_XL_DEC1 (1 << 7)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG6_XL register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG6_XL 0xFF
+#define LSM6DS0_CTRL_REG6_XL_BW_XL0 (1 << 0)
+#define LSM6DS0_CTRL_REG6_XL_BW_XL1 (1 << 1)
+#define LSM6DS0_CTRL_REG6_XL_BW_SCAL_ODR (1 << 2)
+#define LSM6DS0_CTRL_REG6_XL_FS_MASK 0x1F
+#define LSM6DS0_CTRL_REG6_XL_FS0_XL (1 << 3)
+#define LSM6DS0_CTRL_REG6_XL_FS1_XL (1 << 4)
+#define LSM6DS0_CTRL_REG6_XL_ODR_XL0 (1 << 5)
+#define LSM6DS0_CTRL_REG6_XL_ODR_XL1 (1 << 6)
+#define LSM6DS0_CTRL_REG6_XL_ODR_XL2 (1 << 7)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG7_XL register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG7_XL 0xE5
+#define LSM6DS0_CTRL_REG7_XL_HPIS1 (1 << 0)
+#define LSM6DS0_CTRL_REG7_XL_FDS (1 << 2)
+#define LSM6DS0_CTRL_REG7_XL_DCF0 (1 << 5)
+#define LSM6DS0_CTRL_REG7_XL_DCF1 (1 << 6)
+#define LSM6DS0_CTRL_REG7_XL_HR (1 << 7)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG8 register bits definitions
+ * @{
*/
-#define LSM6DS0_ACC_NUMBER_OF_AXES ((size_t) 3U)
+#define LSM6DS0_CTRL_REG8 0xFF
+#define LSM6DS0_CTRL_REG8_SW_RESET (1 << 0)
+#define LSM6DS0_CTRL_REG8_BLE (1 << 1)
+#define LSM6DS0_CTRL_REG8_IF_ADD_INC (1 << 2)
+#define LSM6DS0_CTRL_REG8_SIM (1 << 3)
+#define LSM6DS0_CTRL_REG8_PP_OD (1 << 4)
+#define LSM6DS0_CTRL_REG8_H_LACTIVE (1 << 5)
+#define LSM6DS0_CTRL_REG8_BDU (1 << 6)
+#define LSM6DS0_CTRL_REG8_BOOT (1 << 7)
+/** @} */
+
+/**
+ * @name LSM6DS0_AD_CTRL_REG9 register bits definitions
+ * @{
+ */
+#define LSM6DS0_CTRL_REG9 0x5F
+#define LSM6DS0_CTRL_REG9_STOP_ON_FTH (1 << 0)
+#define LSM6DS0_CTRL_REG9_FIFO_EN (1 << 1)
+#define LSM6DS0_CTRL_REG9_I2C_DISABLE (1 << 2)
+#define LSM6DS0_CTRL_REG9_DRDY_MASK_BIT (1 << 3)
+#define LSM6DS0_CTRL_REG9_FIFO_TEMP_EN (1 << 4)
+#define LSM6DS0_CTRL_REG9_SLEEP_G (1 << 6)
+/** @} */
/**
- * @brief LSM6DS0 gyroscope subsystem number of axes.
+ * @name LSM6DS0_AD_CTRL_REG10 register bits definitions
+ * @{
*/
-#define LSM6DS0_GYRO_NUMBER_OF_AXES ((size_t) 3U)
+#define LSM6DS0_CTRL_REG10 0x05
+#define LSM6DS0_CTRL_REG10_ST_XL (1 << 0)
+#define LSM6DS0_CTRL_REG10_ST_G (1 << 2)
+
+/** @} */
+
+//TODO: ADD more LSM6DS0 register bits definitions
/*===========================================================================*/
/* Driver pre-compile time settings. */
@@ -81,6 +327,35 @@
#endif
/**
+ * @brief LSM6DS0 subsystem advanced configurations switch.
+ * @details If set to @p TRUE more configurations are available.
+ * @note The default is @p FALSE.
+ */
+#if !defined(LSM6DS0_USE_ADVANCED) || defined(__DOXYGEN__)
+#define LSM6DS0_USE_ADVANCED FALSE
+#endif
+
+/**
+ * @brief LSM6DS0 accelerometer subsystem advanced configurations
+ * switch.
+ * @details If set to @p TRUE more configurations are available.
+ * @note The default is @p FALSE.
+ */
+#if !defined(LSM6DS0_ACC_USE_ADVANCED) || defined(__DOXYGEN__)
+#define LSM6DS0_ACC_USE_ADVANCED FALSE
+#endif
+
+/**
+ * @brief LSM6DS0 gyroscope subsystem advanced configurations
+ * switch.
+ * @details If set to @p TRUE more configurations are available.
+ * @note The default is @p FALSE.
+ */
+#if !defined(LSM6DS0_GYRO_USE_ADVANCED) || defined(__DOXYGEN__)
+#define LSM6DS0_GYRO_USE_ADVANCED FALSE
+#endif
+
+/**
* @brief Number of acquisitions for gyroscope bias removal.
* @details This is the number of acquisitions performed to compute the
* bias. A repetition is required in order to remove noise.
@@ -126,7 +401,6 @@
* @name LSM6DS0 accelerometer subsystem data structures and types.
* @{
*/
-
/**
* @brief LSM6DS0 accelerometer subsystem full scale.
*/
@@ -151,65 +425,6 @@ typedef enum {
} lsm6ds0_acc_odr_t;
/**
- * @brief LSM6DS0 accelerometer subsystem axes enabling.
- */
-typedef enum {
- LSM6DS0_ACC_AE_DISABLED = 0x00, /**< All axes disabled. */
- LSM6DS0_ACC_AE_X = 0x08, /**< Only X-axis enabled. */
- LSM6DS0_ACC_AE_Y = 0x10, /**< Only Y-axis enabled. */
- LSM6DS0_ACC_AE_XY = 0x18, /**< X and Y axes enabled. */
- LSM6DS0_ACC_AE_Z = 0x20, /**< Only Z-axis enabled. */
- LSM6DS0_ACC_AE_XZ = 0x28, /**< X and Z axes enabled. */
- LSM6DS0_ACC_AE_YZ = 0x30, /**< Y and Z axes enabled. */
- LSM6DS0_ACC_AE_XYZ = 0x38 /**< All axes enabled. */
-} lsm6ds0_acc_ae_t;
-
-/**
- * @brief LSM6DS0 accelerometer subsystem anti aliasing filter bandwidth.
- */
-typedef enum {
- LSM6DS0_ACC_OBW_ODR = 0x00, /**< Depending on ODR. */
- LSM6DS0_ACC_OBW_AA = 0x04 /**< Same of the Anti aliasing. */
-} lsm6ds0_acc_obw_t;
-
-/**
- * @brief LSM6DS0 accelerometer subsystem high resolution mode.
- */
-typedef enum {
- LSM6DS0_ACC_HR_DISABLED = 0x00, /**< High resolution mode disabled. */
- LSM6DS0_ACC_HR_ENABLED = 0x80 /**< High resolution mode enabled. */
-} lsm6ds0_acc_hr_t;
-
-/**
- * @brief LSM6DS0 accelerometer subsystem filtered data selection.
- */
-typedef enum {
- LSM6DS0_ACC_FDS_ENABLED = 0x00, /**< Internal filter bypassed. */
- LSM6DS0_ACC_FDS_DISABLED = 0x04 /**< Internal filter not bypassed. */
-} lsm6ds0_acc_fds_t;
-
-/**
- * @brief LSM6DS0 accelerometer subsystem digital filter.
- */
-typedef enum {
- LSM6DS0_ACC_DCF_400 = 0x00, /**< Low pass cutoff freq. ODR/400 Hz. */
- LSM6DS0_ACC_DCF_100 = 0x20, /**< Low pass cutoff freq. ODR/100 Hz. */
- LSM6DS0_ACC_DCF_50 = 0x60, /**< Low pass cutoff freq. ODR/50 Hz. */
- LSM6DS0_ACC_DCF_9 = 0x40 /**< Low pass cutoff freq. ODR/9 Hz. */
-} lsm6ds0_acc_dcf_t;
-
-/**
- * @brief LSM6DS0 accelerometer subsystem anti aliasing filter bandwidth.
- */
-typedef enum {
- LSM6DS0_ACC_AABW_408Hz = 0x00, /**< Anti Aliasing filter BW 408Hz. */
- LSM6DS0_ACC_AABW_211Hz = 0x01, /**< Anti Aliasing filter BW 211Hz. */
- LSM6DS0_ACC_AABW_105Hz = 0x02, /**< Anti Aliasing filter BW 105Hz. */
- LSM6DS0_ACC_AABW_50Hz = 0x03, /**< Anti Aliasing filter BW 50Hz. */
- LSM6DS0_ACC_AABW_AUTO = 0x04 /**< Anti Aliasing filter BW auto. */
-} lsm6ds0_acc_aabw_t;
-
-/**
* @brief LSM6DS0 accelerometer subsystem decimation mode.
*/
typedef enum {
@@ -220,76 +435,49 @@ typedef enum {
} lsm6ds0_acc_dec_t;
/**
- * @brief LSM6DS0 accelerometer subsystem unit.
- */
-typedef enum {
- LSM6DS0_ACC_UNIT_G = 0x00, /**< Cooked data in g. */
- LSM6DS0_ACC_UNIT_MG = 0x01, /**< Cooked data in mg. */
- LSM6DS0_ACC_UNIT_SI = 0x02, /**< Cooked data in m/s^2. */
-} lsm6ds0_acc_unit_t;
-
-/**
* @brief LSM6DS0 accelerometer subsystem configuration structure.
*/
typedef struct {
/**
- * @brief LSM6DS0 accelerometer subsystem full scale.
- */
- lsm6ds0_acc_fs_t fullscale;
- /**
- * @brief LSM6DS0 accelerometer subsystem output data rate.
- */
- lsm6ds0_acc_odr_t outdatarate;
- /**
- * @brief LSM6DS0 accelerometer subsystem axes enabling.
- */
- lsm6ds0_acc_ae_t axesenabling;
- /**
- * @brief LSM6DS0 accelerometer subsystem output bandwidth.
+ * @brief LSM6DS0 accelerometer initial sensitivity.
*/
- lsm6ds0_acc_obw_t outbandwidth;
+ float sensitivity[LSM6DS0_ACC_NUMBER_OF_AXES];
/**
- * @brief LSM6DS0 accelerometer subsystem high resolution mode.
+ * @brief LSM6DS0 accelerometer initial bias.
*/
- lsm6ds0_acc_hr_t highresmode;
+ float bias[LSM6DS0_ACC_NUMBER_OF_AXES];
/**
- * @brief LSM6DS0 accelerometer subsystem filtered data selection.
+ * @brief LSM6DS0 accelerometer subsystem full scale.
*/
- lsm6ds0_acc_fds_t filtdatasel;
+ lsm6ds0_acc_fs_t fullscale;
/**
- * @brief LSM6DS0 accelerometer subsystem digital filter.
+ * @brief LSM6DS0 accelerometer subsystem output data rate.
*/
- lsm6ds0_acc_dcf_t digifilter;
+ lsm6ds0_acc_odr_t outdatarate;
+#if LSM6DS0_ACC_USE_ADVANCED || defined(__DOXYGEN__)
/**
- * @brief LSM6DS0 accelerometer subsystem anti aliasing filter bandwidth.
+ * @brief LSM6DS0 accelerometer subsystem decimation mode.
*/
- lsm6ds0_acc_aabw_t aabandwidth;
- /**
- * @brief LSM6DS0 accelerometer subsystem decimation mode.
- */
- lsm6ds0_acc_dec_t decmode;
- /**
- * @brief LSM6DS0 accelerometer subsystem unit.
- */
- lsm6ds0_acc_unit_t unit;
+ lsm6ds0_acc_dec_t decmode;
+#endif /* LSM6DS0_ACC_USE_ADVANCED */
} LSM6DS0AccConfig;
/** @} */
/**
- * @name LSM6DS0 gyroscope subsystem data structures and types.
+ * @name LSM6DS0 gyroscope subsystem data structures and types.
* @{
*/
/**
- * @brief LSM6DS0 gyroscope subsystem full scale.
+ * @brief LSM6DS0 gyroscope subsystem full scale.
*/
typedef enum {
- LSM6DS0_GYRO_FS_245DSP = 0x00, /**< Full scale ±245 degree per second */
- LSM6DS0_GYRO_FS_500DSP = 0x08, /**< Full scale ±500 degree per second */
- LSM6DS0_GYRO_FS_2000DSP = 0x18 /**< Full scale ±2000 degree per second */
+ LSM6DS0_GYRO_FS_245DPS = 0x00, /**< Full scale ±245 degree per second */
+ LSM6DS0_GYRO_FS_500DPS = 0x08, /**< Full scale ±500 degree per second */
+ LSM6DS0_GYRO_FS_2000DPS = 0x18 /**< Full scale ±2000 degree per second */
} lsm6ds0_gyro_fs_t;
/**
- * @brief LSM6DS0 gyroscope subsystem output data rate.
+ * @brief LSM6DS0 gyroscope subsystem output data rate.
*/
typedef enum {
LSM6DS0_GYRO_ODR_PD = 0x00,
@@ -313,21 +501,7 @@ typedef enum {
} lsm6ds0_gyro_odr_t;
/**
- * @brief LSM6DS0 gyroscope subsystem axes enabling.
- */
-typedef enum {
- LSM6DS0_GYRO_AE_DISABLED = 0x00, /**< All axes disabled. */
- LSM6DS0_GYRO_AE_X = 0x08, /**< Only X-axis enabled. */
- LSM6DS0_GYRO_AE_Y = 0x10, /**< Only Y-axis enabled. */
- LSM6DS0_GYRO_AE_XY = 0x18, /**< X and Y axes enabled. */
- LSM6DS0_GYRO_AE_Z = 0x20, /**< Only Z-axis enabled. */
- LSM6DS0_GYRO_AE_XZ = 0x28, /**< X and Z axes enabled. */
- LSM6DS0_GYRO_AE_YZ = 0x30, /**< Y and Z axes enabled. */
- LSM6DS0_GYRO_AE_XYZ = 0x38 /**< All axes enabled. */
-} lsm6ds0_gyro_ae_t;
-
-/**
- * @brief LSM6DS0 gyroscope subsystem low mode configuration.
+ * @brief LSM6DS0 gyroscope subsystem low mode configuration.
*/
typedef enum {
LSM6DS0_GYRO_LP_DISABLED = 0x00, /**< Low power mode disabled. */
@@ -368,42 +542,48 @@ typedef enum {
} lsm6ds0_gyro_hpcf_t;
/**
- * @brief LSM6DS0 gyroscope subsystem configuration structure.
+ * @brief LSM6DS0 gyroscope subsystem configuration structure.
*/
typedef struct {
/**
- * @brief LSM6DS0 gyroscope subsystem full scale.
+ * @brief LSM6DS0 gyroscope initial sensitivity.
+ */
+ float sensitivity[LSM6DS0_ACC_NUMBER_OF_AXES];
+ /**
+ * @brief LSM6DS0 gyroscope initial bias.
*/
- lsm6ds0_gyro_fs_t fullscale;
+ float bias[LSM6DS0_ACC_NUMBER_OF_AXES];
/**
- * @brief LSM6DS0 gyroscope subsystem output data rate.
+ * @brief LSM6DS0 gyroscope subsystem full scale.
*/
- lsm6ds0_gyro_odr_t outdatarate;
+ lsm6ds0_gyro_fs_t fullscale;
/**
- * @brief LSM6DS0 gyroscope subsystem axes enabling.
+ * @brief LSM6DS0 gyroscope subsystem output data rate.
*/
- lsm6ds0_gyro_ae_t axesenabling;
+ lsm6ds0_gyro_odr_t outdatarate;
+#if LSM6DS0_GYRO_USE_ADVANCED || defined(__DOXYGEN__)
/**
- * @brief LSM6DS0 gyroscope subsystem low mode configuration.
+ * @brief LSM6DS0 gyroscope subsystem low mode configuration.
*/
- lsm6ds0_gyro_lp_t lowmodecfg;
+ lsm6ds0_gyro_lp_t lowmodecfg;
/**
- * @brief LSM6DS0 gyroscope subsystem output selection.
+ * @brief LSM6DS0 gyroscope subsystem output selection.
*/
- lsm6ds0_gyro_out_sel_t outsel;
+ lsm6ds0_gyro_out_sel_t outsel;
/**
- * @brief LSM6DS0 gyroscope subsystem high pass filter.
+ * @brief LSM6DS0 gyroscope subsystem high pass filter.
*/
- lsm6ds0_gyro_hp_t hpfenable;
+ lsm6ds0_gyro_hp_t hpfenable;
/**
- * @brief LSM6DS0 gyroscope subsystem high pass filter configuration.
+ * @brief LSM6DS0 gyroscope subsystem high pass filter configuration.
*/
- lsm6ds0_gyro_hpcf_t hpcfg;
+ lsm6ds0_gyro_hpcf_t hpcfg;
+ #endif /* LSM6DS0_GYRO_USE_ADVANCED */
} LSM6DS0GyroConfig;
/** @} */
/**
- * @name LSM6DS0 main system data structures and types.
+ * @name LSM6DS0 main system data structures and types.
* @{
*/
/**
@@ -415,7 +595,7 @@ typedef enum {
} lsm6ds0_sad_t;
/**
- * @brief LSM6DS0 block data update.
+ * @brief LSM6DS0 block data update.
*/
typedef enum {
LSM6DS0_BDU_CONTINUOUS = 0x00, /**< Block data continuously updated. */
@@ -423,7 +603,7 @@ typedef enum {
} lsm6ds0_bdu_t;
/**
- * @brief LSM6DS0 endianness.
+ * @brief LSM6DS0 endianness.
*/
typedef enum {
LSM6DS0_END_LITTLE = 0x00, /**< Little endian. */
@@ -440,7 +620,7 @@ typedef enum {
} lsm6ds0_state_t;
/**
- * @brief LSM6DS0 configuration structure.
+ * @brief LSM6DS0 configuration structure.
*/
typedef struct {
#if (LSM6DS0_USE_SPI) || defined(__DOXYGEN__)
@@ -471,25 +651,27 @@ typedef struct {
const I2CConfig *i2ccfg;
#endif /* LSM6DS0_USE_I2C */
/**
- * @brief LSM6DS0 accelerometer subsystem configuration structure
+ * @brief LSM6DS0 accelerometer subsystem configuration structure
*/
const LSM6DS0AccConfig *acccfg;
/**
- * @brief LSM6DS0 gyroscope subsystem configuration structure
+ * @brief LSM6DS0 gyroscope subsystem configuration structure
*/
const LSM6DS0GyroConfig *gyrocfg;
/**
* @brief Accelerometer and Gyroscope Slave Address
*/
lsm6ds0_sad_t slaveaddress;
+#if (LSM6DS0_USE_ADVANCED) || defined(__DOXYGEN__)
/**
- * @brief LSM6DS0 block data update
+ * @brief LSM6DS0 block data update
*/
lsm6ds0_bdu_t blockdataupdate;
/**
- * @brief LSM6DS0 endianness
+ * @brief LSM6DS0 endianness
*/
lsm6ds0_end_t endianness;
+#endif /* LSM6DS0_USE_ADVANCED */
} LSM6DS0Config;
/**
@@ -501,15 +683,17 @@ typedef struct LSM6DS0Driver LSM6DS0Driver;
* @brief @p LSM6DS0 accelerometer subsystem specific methods.
*/
#define _lsm6ds0_acc_methods \
- _base_accelerometer_methods
+ _base_accelerometer_methods \
+ /* Change full scale value of LSM6DS0 accelerometer subsystem .*/ \
+ msg_t (*set_full_scale)(void *instance, lsm6ds0_acc_fs_t fs);
/**
* @brief @p LSM6DS0 gyroscope subsystem specific methods.
*/
#define _lsm6ds0_gyro_methods \
_base_gyroscope_methods \
- /* Retrieve the temperature of LSM6DS0 chip.*/ \
- msg_t (*get_temperature)(void *instance, float* temperature);
+ /* Change full scale value of LSM6DS0 gyroscope subsystem .*/ \
+ msg_t (*set_full_scale)(void *instance, lsm6ds0_gyro_fs_t fs);
/**
* @extends BaseAccelerometerVMT
@@ -542,14 +726,18 @@ struct LSM6DS0GYROVMT {
/* Current accelerometer sensitivity.*/ \
float accsensitivity[LSM6DS0_ACC_NUMBER_OF_AXES]; \
/* Accelerometer bias data.*/ \
- int32_t accbias[LSM6DS0_ACC_NUMBER_OF_AXES]; \
+ float accbias[LSM6DS0_ACC_NUMBER_OF_AXES]; \
+ /* Current accelerometer full scale value.*/ \
+ float accfullscale; \
/* Current gyroscope sensitivity.*/ \
float gyrosensitivity[LSM6DS0_GYRO_NUMBER_OF_AXES]; \
/* Bias data.*/ \
- int32_t gyrobias[LSM6DS0_GYRO_NUMBER_OF_AXES];
+ float gyrobias[LSM6DS0_GYRO_NUMBER_OF_AXES]; \
+ /* Current gyroscope full scale value.*/ \
+ float gyrofullscale;
/**
- * @brief LSM6DS0 6-axis accelerometer/gyroscope class.
+ * @brief LSM6DS0 6-axis accelerometer/gyroscope class.
*/
struct LSM6DS0Driver {
/** @brief BaseSensor Virtual Methods Table. */
@@ -571,19 +759,32 @@ struct LSM6DS0Driver {
/*===========================================================================*/
/**
- * @brief Get current MEMS temperature.
- * @detail This information is very useful especially for high accuracy IMU
+ * @brief Change accelerometer fullscale value.
+ *
+ * @param[in] ip pointer to a @p BaseAccelerometer class.
+ * @param[in] fs the new full scale value.
+ *
+ * @return The operation status.
+ * @retval MSG_OK if the function succeeded.
+ * @retval MSG_RESET if one or more errors occurred.
+ * @api
+ */
+#define accelerometerSetFullScale(ip, fs) \
+ (ip)->vmt_lsm6ds0acc->set_full_scale(ip, fs)
+
+/**
+ * @brief Change compass fullscale value.
*
* @param[in] ip pointer to a @p BaseGyroscope class.
- * @param[out] temp the MEMS temperature as single precision floating.
+ * @param[in] fs the new full scale value.
*
* @return The operation status.
* @retval MSG_OK if the function succeeded.
* @retval MSG_RESET if one or more errors occurred.
* @api
*/
-#define gyroscopeGetTemp(ip, tpp) \
- (ip)->vmt_lsm6ds0gyro->get_temperature(ip, tpp)
+#define gyroscopeSetFullScale(ip, fs) \
+ (ip)->vmt_lsm6ds0gyro->set_full_scale(ip, fs)
/*===========================================================================*/
/* External declarations. */