summaryrefslogtreecommitdiff
path: root/driver/accelgyro_lsm6dsm.h
diff options
context:
space:
mode:
Diffstat (limited to 'driver/accelgyro_lsm6dsm.h')
-rw-r--r--driver/accelgyro_lsm6dsm.h293
1 files changed, 153 insertions, 140 deletions
diff --git a/driver/accelgyro_lsm6dsm.h b/driver/accelgyro_lsm6dsm.h
index 907429257a..51da2a42fb 100644
--- a/driver/accelgyro_lsm6dsm.h
+++ b/driver/accelgyro_lsm6dsm.h
@@ -1,4 +1,4 @@
-/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+/* Copyright 2016 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
@@ -17,165 +17,163 @@
* 7-bit address is 110101xb. Where 'x' is determined
* by the voltage on the ADDR pin
*/
-#define LSM6DSM_ADDR0_FLAGS 0x6a
-#define LSM6DSM_ADDR1_FLAGS 0x6b
+#define LSM6DSM_ADDR0_FLAGS 0x6a
+#define LSM6DSM_ADDR1_FLAGS 0x6b
/* COMMON DEFINE FOR ACCEL-GYRO SENSORS */
-#define LSM6DSM_EN_BIT 0x01
-#define LSM6DSM_DIS_BIT 0x00
+#define LSM6DSM_EN_BIT 0x01
+#define LSM6DSM_DIS_BIT 0x00
/* Access to embedded sensor hub register bank */
-#define LSM6DSM_FUNC_CFG_ACC_ADDR 0x01
-#define LSM6DSM_FUNC_CFG_EN 0x80
-#define LSM6DSM_FUNC_CFG_EN_B 0x20
+#define LSM6DSM_FUNC_CFG_ACC_ADDR 0x01
+#define LSM6DSM_FUNC_CFG_EN 0x80
+#define LSM6DSM_FUNC_CFG_EN_B 0x20
/* FIFO decimator registers and bitmask */
-#define LSM6DSM_FIFO_CTRL1_ADDR 0x06
+#define LSM6DSM_FIFO_CTRL1_ADDR 0x06
/* Output data rate registers and masks */
-#define LSM6DSM_ODR_REG(_sensor) \
- (LSM6DSM_CTRL1_ADDR + _sensor)
-#define LSM6DSM_ODR_MASK 0xf0
+#define LSM6DSM_ODR_REG(_sensor) (LSM6DSM_CTRL1_ADDR + _sensor)
+#define LSM6DSM_ODR_MASK 0xf0
-#define LSM6DSM_FIFO_CTRL2_ADDR 0x07
+#define LSM6DSM_FIFO_CTRL2_ADDR 0x07
-#define LSM6DSM_FIFO_CTRL3_ADDR 0x08
-#define LSM6DSM_FIFO_DEC_XL_OFF 0
-#define LSM6DSM_FIFO_DEC_G_OFF 3
+#define LSM6DSM_FIFO_CTRL3_ADDR 0x08
+#define LSM6DSM_FIFO_DEC_XL_OFF 0
+#define LSM6DSM_FIFO_DEC_G_OFF 3
-#define LSM6DSM_FIFO_CTRL4_ADDR 0x09
+#define LSM6DSM_FIFO_CTRL4_ADDR 0x09
#define LSM6DSM_FIFO_DECIMATOR(_dec) \
(_dec < 8 ? _dec : (2 + __builtin_ctz(_dec)))
/* Hardware FIFO size in byte */
-#define LSM6DSM_MAX_FIFO_SIZE 4096
-#define LSM6DSM_MAX_FIFO_LENGTH (LSM6DSM_MAX_FIFO_SIZE / OUT_XYZ_SIZE)
+#define LSM6DSM_MAX_FIFO_SIZE 4096
+#define LSM6DSM_MAX_FIFO_LENGTH (LSM6DSM_MAX_FIFO_SIZE / OUT_XYZ_SIZE)
-#define LSM6DSM_FIFO_CTRL5_ADDR 0x0a
-#define LSM6DSM_FIFO_CTRL5_ODR_OFF 3
-#define LSM6DSM_FIFO_CTRL5_ODR_MASK \
- (0xf << LSM6DSM_FIFO_CTRL5_ODR_OFF)
-#define LSM6DSM_FIFO_CTRL5_MODE_MASK 0x07
+#define LSM6DSM_FIFO_CTRL5_ADDR 0x0a
+#define LSM6DSM_FIFO_CTRL5_ODR_OFF 3
+#define LSM6DSM_FIFO_CTRL5_ODR_MASK (0xf << LSM6DSM_FIFO_CTRL5_ODR_OFF)
+#define LSM6DSM_FIFO_CTRL5_MODE_MASK 0x07
-#define LSM6DSM_INT1_CTRL 0x0d
-#define LSM6DSM_INT_FIFO_TH 0x08
-#define LSM6DSM_INT_FIFO_OVR 0x10
-#define LSM6DSM_INT_FIFO_FULL 0x20
-#define LSM6DSM_INT_SIGMO 0x40
+#define LSM6DSM_INT1_CTRL 0x0d
+#define LSM6DSM_INT_FIFO_TH 0x08
+#define LSM6DSM_INT_FIFO_OVR 0x10
+#define LSM6DSM_INT_FIFO_FULL 0x20
+#define LSM6DSM_INT_SIGMO 0x40
/* Who Am I */
-#define LSM6DSM_WHO_AM_I_REG 0x0f
+#define LSM6DSM_WHO_AM_I_REG 0x0f
/* LSM6DSM/LSM6DSL/LSM6DS3TR-C */
-#define LSM6DSM_WHO_AM_I 0x6a
+#define LSM6DSM_WHO_AM_I 0x6a
/* LSM6DS3 */
-#define LSM6DS3_WHO_AM_I 0x69
+#define LSM6DS3_WHO_AM_I 0x69
-#define LSM6DSM_CTRL1_ADDR 0x10
-#define LSM6DSM_XL_ODR_MASK 0xf0
+#define LSM6DSM_CTRL1_ADDR 0x10
+#define LSM6DSM_XL_ODR_MASK 0xf0
-#define LSM6DSM_CTRL2_ADDR 0x11
-#define LSM6DSM_CTRL3_ADDR 0x12
-#define LSM6DSM_SW_RESET 0x01
-#define LSM6DSM_IF_INC 0x04
-#define LSM6DSM_PP_OD 0x10
-#define LSM6DSM_H_L_ACTIVE 0x20
-#define LSM6DSM_BDU 0x40
-#define LSM6DSM_BOOT 0x80
+#define LSM6DSM_CTRL2_ADDR 0x11
+#define LSM6DSM_CTRL3_ADDR 0x12
+#define LSM6DSM_SW_RESET 0x01
+#define LSM6DSM_IF_INC 0x04
+#define LSM6DSM_PP_OD 0x10
+#define LSM6DSM_H_L_ACTIVE 0x20
+#define LSM6DSM_BDU 0x40
+#define LSM6DSM_BOOT 0x80
-#define LSM6DSM_CTRL4_ADDR 0x13
-#define LSM6DSM_INT2_ON_INT1_MASK 0x20
+#define LSM6DSM_CTRL4_ADDR 0x13
+#define LSM6DSM_INT2_ON_INT1_MASK 0x20
-#define LSM6DSM_CTRL6_ADDR 0x15
-#define LSM6DSM_CTRL7_ADDR 0x16
+#define LSM6DSM_CTRL6_ADDR 0x15
+#define LSM6DSM_CTRL7_ADDR 0x16
-#define LSM6DSM_CTRL10_ADDR 0x19
-#define LSM6DSM_FUNC_EN_MASK 0x04
-#define LSM6DSM_SIG_MOT_MASK 0x01
-#define LSM6DSM_EMBED_FUNC_EN 0x04
-#define LSM6DSM_SIG_MOT_EN 0x01
+#define LSM6DSM_CTRL10_ADDR 0x19
+#define LSM6DSM_FUNC_EN_MASK 0x04
+#define LSM6DSM_SIG_MOT_MASK 0x01
+#define LSM6DSM_EMBED_FUNC_EN 0x04
+#define LSM6DSM_SIG_MOT_EN 0x01
/* Controller mode configuration register */
-#define LSM6DSM_CONTROLLER_CFG_ADDR 0x1a
-#define LSM6DSM_PASSTROUGH_MASK 0x1f
-#define LSM6DSM_EXT_TRIGGER_EN 0x10
-#define LSM6DSM_PULLUP_EN 0x08
-#define LSM6DSM_I2C_PASS_THRU_MODE 0x04
-#define LSM6DSM_I2C_CONTROLLER_ON 0x01
+#define LSM6DSM_CONTROLLER_CFG_ADDR 0x1a
+#define LSM6DSM_PASSTROUGH_MASK 0x1f
+#define LSM6DSM_EXT_TRIGGER_EN 0x10
+#define LSM6DSM_PULLUP_EN 0x08
+#define LSM6DSM_I2C_PASS_THRU_MODE 0x04
+#define LSM6DSM_I2C_CONTROLLER_ON 0x01
-#define LSM6DSM_TAP_SRC_ADDR 0x1c
-#define LSM6DSM_STAP_DETECT 0x20
-#define LSM6DSM_DTAP_DETECT 0x10
+#define LSM6DSM_TAP_SRC_ADDR 0x1c
+#define LSM6DSM_STAP_DETECT 0x20
+#define LSM6DSM_DTAP_DETECT 0x10
-#define LSM6DSM_STATUS_REG 0x1e
+#define LSM6DSM_STATUS_REG 0x1e
-#define LSM6DSM_OUT_TEMP_L_ADDR 0x20
+#define LSM6DSM_OUT_TEMP_L_ADDR 0x20
-#define LSM6DSM_GYRO_OUT_X_L_ADDR 0x22
-#define LSM6DSM_ACCEL_OUT_X_L_ADDR 0x28
+#define LSM6DSM_GYRO_OUT_X_L_ADDR 0x22
+#define LSM6DSM_ACCEL_OUT_X_L_ADDR 0x28
-#define LSM6DSM_SENSORHUB1_REG 0x2e
+#define LSM6DSM_SENSORHUB1_REG 0x2e
-#define LSM6DSM_FIFO_STS1_ADDR 0x3a
-#define LSM6DSM_FIFO_STS2_ADDR 0x3b
-#define LSM6DSM_FIFO_DIFF_MASK 0x0fff
-#define LSM6DSM_FIFO_EMPTY 0x1000
-#define LSM6DSM_FIFO_FULL 0x2000
-#define LSM6DSM_FIFO_DATA_OVR 0x4000
-#define LSM6DSM_FIFO_WATERMARK 0x8000
-#define LSM6DSM_FIFO_NODECIM 0x01
+#define LSM6DSM_FIFO_STS1_ADDR 0x3a
+#define LSM6DSM_FIFO_STS2_ADDR 0x3b
+#define LSM6DSM_FIFO_DIFF_MASK 0x0fff
+#define LSM6DSM_FIFO_EMPTY 0x1000
+#define LSM6DSM_FIFO_FULL 0x2000
+#define LSM6DSM_FIFO_DATA_OVR 0x4000
+#define LSM6DSM_FIFO_WATERMARK 0x8000
+#define LSM6DSM_FIFO_NODECIM 0x01
/* Out data register */
-#define LSM6DSM_FIFO_DATA_ADDR 0x3e
+#define LSM6DSM_FIFO_DATA_ADDR 0x3e
/* Registers value for supported FIFO mode */
-#define LSM6DSM_FIFO_MODE_BYPASS_VAL 0x00
-#define LSM6DSM_FIFO_MODE_CONTINUOUS_VAL 0x06
+#define LSM6DSM_FIFO_MODE_BYPASS_VAL 0x00
+#define LSM6DSM_FIFO_MODE_CONTINUOUS_VAL 0x06
-#define LSM6DSM_FUNC_SRC1_ADDR 0x53
-#define LSM6DSM_SENSORHUB_END_OP 0x01
-#define LSM6DSM_SIGN_MOTION_IA 0x40
+#define LSM6DSM_FUNC_SRC1_ADDR 0x53
+#define LSM6DSM_SENSORHUB_END_OP 0x01
+#define LSM6DSM_SIGN_MOTION_IA 0x40
-#define LSM6DSM_LIR_ADDR 0x58
-#define LSM6DSM_LIR_MASK 0x01
-#define LSM6DSM_EN_INT 0x80
-#define LSM6DSM_EN_TAP 0x0e
-#define LSM6DSM_TAP_MASK 0x8e
+#define LSM6DSM_LIR_ADDR 0x58
+#define LSM6DSM_LIR_MASK 0x01
+#define LSM6DSM_EN_INT 0x80
+#define LSM6DSM_EN_TAP 0x0e
+#define LSM6DSM_TAP_MASK 0x8e
-#define LSM6DSM_TAP_THS_6D 0x59
-#define LSM6DSM_D4D_EN_MASK 0x80
-#define LSM6DSM_TAP_TH_MASK 0x1f
+#define LSM6DSM_TAP_THS_6D 0x59
+#define LSM6DSM_D4D_EN_MASK 0x80
+#define LSM6DSM_TAP_TH_MASK 0x1f
-#define LSM6DSM_INT_DUR2_ADDR 0x5a
-#define LSM6DSM_TAP_DUR_MASK 0xf0
-#define LSM6DSM_TAP_QUIET_MASK 0x0c
+#define LSM6DSM_INT_DUR2_ADDR 0x5a
+#define LSM6DSM_TAP_DUR_MASK 0xf0
+#define LSM6DSM_TAP_QUIET_MASK 0x0c
-#define LSM6DSM_WUP_THS_ADDR 0x5b
-#define LSM6DSM_S_D_TAP_MASK 0x80
-#define LSM6DSM_STAP_EN 0
-#define LSM6DSM_DTAP_EN 1
+#define LSM6DSM_WUP_THS_ADDR 0x5b
+#define LSM6DSM_S_D_TAP_MASK 0x80
+#define LSM6DSM_STAP_EN 0
+#define LSM6DSM_DTAP_EN 1
-#define LSM6DSM_MD1_CFG_ADDR 0x5e
-#define LSM6DSM_INT1_STAP 0x40
-#define LSM6DSM_INT1_DTAP 0x08
+#define LSM6DSM_MD1_CFG_ADDR 0x5e
+#define LSM6DSM_INT1_STAP 0x40
+#define LSM6DSM_INT1_DTAP 0x08
/* Register values for Sensor Hub Slave 0 / Bank A */
-#define LSM6DSM_SLV0_ADD_ADDR 0x02
-#define LSM6DSM_SLV0_ADDR_SHFT 1
-#define LSM6DSM_SLV0_ADDR_MASK 0xfe
-#define LSM6DSM_SLV0_RD_BIT 0x01
+#define LSM6DSM_SLV0_ADD_ADDR 0x02
+#define LSM6DSM_SLV0_ADDR_SHFT 1
+#define LSM6DSM_SLV0_ADDR_MASK 0xfe
+#define LSM6DSM_SLV0_RD_BIT 0x01
-#define LSM6DSM_SLV0_SUBADD_ADDR 0x03
+#define LSM6DSM_SLV0_SUBADD_ADDR 0x03
-#define LSM6DSM_SLV0_CONFIG_ADDR 0x04
-#define LSM6DSM_SLV0_SLV_RATE_SHFT 6
-#define LSM6DSM_SLV0_SLV_RATE_MASK 0xc0
-#define LSM6DSM_SLV0_AUX_SENS_SHFT 4
-#define LSM6DSM_SLV0_AUX_SENS_MASK 0x30
-#define LSM6DSM_SLV0_NUM_OPS_MASK 0x07
+#define LSM6DSM_SLV0_CONFIG_ADDR 0x04
+#define LSM6DSM_SLV0_SLV_RATE_SHFT 6
+#define LSM6DSM_SLV0_SLV_RATE_MASK 0xc0
+#define LSM6DSM_SLV0_AUX_SENS_SHFT 4
+#define LSM6DSM_SLV0_AUX_SENS_MASK 0x30
+#define LSM6DSM_SLV0_NUM_OPS_MASK 0x07
-#define LSM6DSM_SLV1_CONFIG_ADDR 0x07
-#define LSM6DSM_SLV0_WR_ONCE_MASK 0x20
+#define LSM6DSM_SLV1_CONFIG_ADDR 0x07
+#define LSM6DSM_SLV0_WR_ONCE_MASK 0x20
#define LSM6DSM_DATA_WRITE_SUB_SLV0_ADDR 0x0e
@@ -188,9 +186,9 @@ enum dev_fifo {
};
#ifdef CONFIG_LSM6DSM_SEC_I2C
-#define FIFO_DEV_NUM (FIFO_DEV_MAG + 1)
+#define FIFO_DEV_NUM (FIFO_DEV_MAG + 1)
#else
-#define FIFO_DEV_NUM (FIFO_DEV_ACCEL + 1)
+#define FIFO_DEV_NUM (FIFO_DEV_ACCEL + 1)
#endif
struct fstatus {
@@ -199,7 +197,7 @@ struct fstatus {
};
/* Absolute maximum rate for acc and gyro sensors */
-#define LSM6DSM_ODR_MIN_VAL 13000
+#define LSM6DSM_ODR_MIN_VAL 13000
#define LSM6DSM_ODR_MAX_VAL \
MOTION_MAX_SENSOR_FREQUENCY(416000, LSM6DSM_ODR_MIN_VAL)
@@ -210,31 +208,30 @@ struct fstatus {
#define LSM6DSM_REG_TO_ODR(_reg) (LSM6DSM_ODR_MIN_VAL << (_reg - 1))
/* Full Scale range value and gain for Acc */
-#define LSM6DSM_FS_LIST_NUM 4
+#define LSM6DSM_FS_LIST_NUM 4
-#define LSM6DSM_ACCEL_FS_ADDR 0x10
-#define LSM6DSM_ACCEL_FS_MASK 0x0c
+#define LSM6DSM_ACCEL_FS_ADDR 0x10
+#define LSM6DSM_ACCEL_FS_MASK 0x0c
-#define LSM6DSM_ACCEL_FS_2G_VAL 0x00
-#define LSM6DSM_ACCEL_FS_4G_VAL 0x02
-#define LSM6DSM_ACCEL_FS_8G_VAL 0x03
-#define LSM6DSM_ACCEL_FS_16G_VAL 0x01
+#define LSM6DSM_ACCEL_FS_2G_VAL 0x00
+#define LSM6DSM_ACCEL_FS_4G_VAL 0x02
+#define LSM6DSM_ACCEL_FS_8G_VAL 0x03
+#define LSM6DSM_ACCEL_FS_16G_VAL 0x01
-#define LSM6DSM_ACCEL_FS_MAX_VAL 16
+#define LSM6DSM_ACCEL_FS_MAX_VAL 16
/* Accel Reg value from Full Scale */
-#define LSM6DSM_ACCEL_FS_REG(_fs) \
- (_fs == 2 ? LSM6DSM_ACCEL_FS_2G_VAL : \
- _fs == 16 ? LSM6DSM_ACCEL_FS_16G_VAL : \
- __fls(_fs))
+#define LSM6DSM_ACCEL_FS_REG(_fs) \
+ (_fs == 2 ? LSM6DSM_ACCEL_FS_2G_VAL : \
+ _fs == 16 ? LSM6DSM_ACCEL_FS_16G_VAL : \
+ __fls(_fs))
/* Accel normalized FS value from Full Scale */
#define LSM6DSM_ACCEL_NORMALIZE_FS(_fs) (1 << __fls(_fs))
/* Full Scale range value and gain for Gyro */
-#define LSM6DSM_GYRO_FS_ADDR 0x11
-#define LSM6DSM_GYRO_FS_MASK 0x0c
-
+#define LSM6DSM_GYRO_FS_ADDR 0x11
+#define LSM6DSM_GYRO_FS_MASK 0x0c
/* Supported gyroscope ranges:
* name(dps) | register | gain(udps/LSB) | actual value(dps)
@@ -255,8 +252,8 @@ struct fstatus {
((LSM6DSM_GYRO_FS_MIN_VAL_MDPS << (_reg)) / 1000)
/* FS register address/mask for Acc/Gyro sensors */
-#define LSM6DSM_RANGE_REG(_sensor) (LSM6DSM_ACCEL_FS_ADDR + (_sensor))
-#define LSM6DSM_RANGE_MASK 0x0c
+#define LSM6DSM_RANGE_REG(_sensor) (LSM6DSM_ACCEL_FS_ADDR + (_sensor))
+#define LSM6DSM_RANGE_MASK 0x0c
/* Status register bitmask for Acc/Gyro data ready */
enum lsm6dsm_status {
@@ -265,11 +262,11 @@ enum lsm6dsm_status {
LSM6DSM_STS_GDA_UP = 0x02
};
-#define LSM6DSM_STS_XLDA_MASK 0x01
-#define LSM6DSM_STS_GDA_MASK 0x02
+#define LSM6DSM_STS_XLDA_MASK 0x01
+#define LSM6DSM_STS_GDA_MASK 0x02
/* Sensor resolution in number of bits: fixed 16 bit */
-#define LSM6DSM_RESOLUTION 16
+#define LSM6DSM_RESOLUTION 16
extern const struct accelgyro_drv lsm6dsm_drv;
@@ -347,24 +344,24 @@ struct lsm6dsm_data {
#if defined(CONFIG_LSM6DSM_SEC_I2C) && defined(CONFIG_MAG_CALIBRATE)
union {
#ifdef CONFIG_MAG_LSM6DSM_BMM150
- struct bmm150_private_data compass;
+ struct bmm150_private_data compass;
#endif
#ifdef CONFIG_MAG_LSM6DSM_LIS2MDL
- struct lis2mdl_private_data compass;
+ struct lis2mdl_private_data compass;
#endif
- struct mag_cal_t cal;
+ struct mag_cal_t cal;
};
-#endif /* CONFIG_MAG_CALIBRATE */
+#endif /* CONFIG_MAG_CALIBRATE */
};
#ifdef CONFIG_ACCEL_FIFO
-#define LSM6DSM_ACCEL_FIFO_STATE (&((struct lsm6dsm_accel_fifo_state) {}))
+#define LSM6DSM_ACCEL_FIFO_STATE (&((struct lsm6dsm_accel_fifo_state){}))
#else
#define LSM6DSM_ACCEL_FIFO_STATE NULL
#endif
-#define LSM6DSM_DATA \
- ((struct lsm6dsm_data) { \
+#define LSM6DSM_DATA \
+ ((struct lsm6dsm_data){ \
.accel_fifo_state = LSM6DSM_ACCEL_FIFO_STATE, \
})
@@ -389,5 +386,21 @@ struct lsm6dsm_data {
int lsm6dsm_set_data_rate(const struct motion_sensor_t *s, int rate, int rnd);
+#if defined(CONFIG_ZEPHYR)
+/* Get the motion sensor ID of the LSM6DSM sensor that generates the
+ * interrupt. The interrupt is converted to the event and transferred to
+ * motion sense task that actually handles the interrupt.
+ *
+ * Here we use an alias (lsm6dsm_int) to get the motion sensor ID. This alias
+ * MUST be defined for this driver to work.
+ * aliases {
+ * lsm6dsm-int = &lid_accel;
+ * };
+ */
+#if DT_NODE_EXISTS(DT_ALIAS(lsm6dsm_int))
+#define CONFIG_ACCEL_LSM6DSM_INT_EVENT \
+ TASK_EVENT_MOTION_SENSOR_INTERRUPT(SENSOR_ID(DT_ALIAS(lsm6dsm_int)))
+#endif
+#endif
#endif /* __CROS_EC_ACCELGYRO_LSM6DSM_H */