/* sensor_lsm6dsl.h - header file for LSM6DSL accelerometer, gyroscope and * temperature sensor driver */ /* * Copyright (c) 2017 Linaro Limited * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_DRIVERS_SENSOR_LSM6DSL_LSM6DSL_H_ #define ZEPHYR_DRIVERS_SENSOR_LSM6DSL_LSM6DSL_H_ #include #include #include #include #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) #include #endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */ #if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) #include #endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) */ #define LSM6DSL_REG_FUNC_CFG_ACCESS 0x01 #define LSM6DSL_MASK_FUNC_CFG_EN BIT(7) #define LSM6DSL_SHIFT_FUNC_CFG_EN 7 #define LSM6DSL_MASK_FUNC_CFG_EN_B BIT(5) #define LSM6DSL_SHIFT_FUNC_CFG_EN_B 5 #define LSM6DSL_REG_SENSOR_SYNC_TIME_FRAME 0x04 #define LSM6DSL_MASK_SENSOR_SYNC_TIME_FRAME_TPH (BIT(3) | BIT(2) | \ BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_SENSOR_SYNC_TIME_FRAME_TPH 0 #define LSM6DSL_REG_SENSOR_SYNC_RES_RATIO 0x05 #define LSM6DSL_MASK_SENSOR_SYNC_RES_RATIO (BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_SENSOR_SYNC_RES_RATIO 0 #define LSM6DSL_REG_FIFO_CTRL1 0x06 #define LSM6DSL_MASK_FIFO_CTRL1_FTH (BIT(7) | BIT(6) | \ BIT(5) | BIT(4) | \ BIT(3) | BIT(2) | \ BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_FIFO_CTRL1_FTH 0 #define LSM6DSL_REG_FIFO_CTRL2 0x07 #define LSM6DSL_MASK_FIFO_CTRL2_TIMER_PEDO_FIFO_EN BIT(7) #define LSM6DSL_SHIFT_FIFO_CTRL2_TIMER_PEDO_FIFO_EN 7 #define LSM6DSL_MASK_FIFO_CTRL2_TIMER_PEDO_FIFO_DRDY BIT(6) #define LSM6DSL_SHIFT_FIFO_CTRL2_TIMER_PEDO_FIFO_DRDY 6 #define LSM6DSL_MASK_FIFO_CTRL2_FIFO_TEMP_EN BIT(3) #define LSM6DSL_SHIFT_FIFO_CTRL2_FIFO_TEMP_EN 3 #define LSM6DSL_MASK_FIFO_CTRL2_FTH (BIT(2) | BIT(1) | \ BIT(0)) #define LSM6DSL_SHIFT_FIFO_CTRL2_FTH 0 #define LSM6DSL_REG_FIFO_CTRL3 0x08 #define LSM6DSL_MASK_FIFO_CTRL3_DEC_FIFO_GYRO (BIT(5) | BIT(4) | \ BIT(3)) #define LSM6DSL_SHIFT_FIFO_CTRL3_DEC_FIFO_GYRO 3 #define LSM6DSL_MASK_FIFO_CTRL3_DEC_FIFO_XL (BIT(2) | BIT(1) | \ BIT(0)) #define LSM6DSL_SHIFT_FIFO_CTRL3_DEC_FIFO_XL 0 #define LSM6DSL_REG_FIFO_CTRL4 0x09 #define LSM6DSL_MASK_FIFO_CTRL4_STOP_ON_FTH BIT(7) #define LSM6DSL_SHIFT_FIFO_CTRL4_STOP_ON_FTH 7 #define LSM6DSL_MASK_FIFO_CTRL4_ONLY_HIGH_DATA BIT(6) #define LSM6DSL_SHIFT_FIFO_CTRL4_ONLY_HIGH_DATA 6 #define LSM6DSL_MASK_FIFO_CTRL4_DEC_DS4_FIFO (BIT(5) | BIT(4) | \ BIT(3)) #define LSM6DSL_SHIFT_FIFO_CTRL4_DEC_DS4_FIFO 3 #define LSM6DSL_MASK_FIFO_CTRL4_DEC_DS3_FIFO (BIT(2) | BIT(1) | \ BIT(0)) #define LSM6DSL_SHIFT_FIFO_CTRL4_DEC_DS3_FIFO 0 #define LSM6DSL_REG_FIFO_CTRL5 0x0A #define LSM6DSL_MASK_FIFO_CTRL5_ODR_FIFO (BIT(6) | BIT(5) | \ BIT(4) | BIT(3)) #define LSM6DSL_SHIFT_FIFO_CTRL5_ODR_FIFO 3 #define LSM6DSL_MASK_FIFO_CTRL5_FIFO_MODE (BIT(2) | BIT(1) | \ BIT(0)) #define LSM6DSL_SHIFT_FIFO_CTRL5_FIFO_MODE 0 #define LSM6DSL_REG_DRDY_PULSE_CFG_G 0x0B #define LSM6DSL_MASK_DRDY_PULSE_CFG_G_DRDY_PULSED BIT(7) #define LSM6DSL_SHIFT_DRDY_PULSE_CFG_G_DRDY_PULSED 7 #define LSM6DSL_MASK_DRDY_PULSE_CFG_G_INT2_WRIST_TILT BIT(0) #define LSM6DSL_SHIFT_DRDY_PULSE_CFG_G_INT2_WRIST_TILT 0 #define LSM6DSL_REG_INT1_CTRL 0x0D #define LSM6DSL_MASK_INT1_CTRL_STEP_DETECTOR BIT(7) #define LSM6DSL_SHIFT_INT1_CTRL_STEP_DETECTOR 7 #define LSM6DSL_MASK_INT1_CTRL_SIGN_MOT BIT(6) #define LSM6DSL_SHIFT_INT1_CTRL_SIGN_MOT 6 #define LSM6DSL_MASK_INT1_CTRL_FULL_FLAG BIT(5) #define LSM6DSL_SHIFT_INT1_CTRL_FULL_FLAG 5 #define LSM6DSL_MASK_INT1_CTRL_FIFO_OVR BIT(4) #define LSM6DSL_SHIFT_INT1_CTRL_FIFO_OVR 4 #define LSM6DSL_MASK_INT1_FTH BIT(3) #define LSM6DSL_SHIFT_INT1_FTH 3 #define LSM6DSL_MASK_INT1_CTRL_BOOT BIT(2) #define LSM6DSL_SHIFT_INT1_CTRL_BOOT 2 #define LSM6DSL_MASK_INT1_CTRL_DRDY_G BIT(1) #define LSM6DSL_SHIFT_INT1_CTRL_DRDY_G 1 #define LSM6DSL_MASK_INT1_CTRL_DRDY_XL BIT(0) #define LSM6DSL_SHIFT_INT1_CTRL_DRDY_XL 0 #define LSM6DSL_REG_INT2_CTRL 0x0E #define LSM6DSL_MASK_INT2_CTRL_STEP_DELTA BIT(7) #define LSM6DSL_SHIFT_INT2_CTRL_STEP_DELTA 7 #define LSM6DSL_MASK_INT2_CTRL_STEP_COUNT_OV BIT(6) #define LSM6DSL_SHIFT_INT2_CTRL_STEP_COUNT_OV 6 #define LSM6DSL_MASK_INT2_CTRL_FULL_FLAG BIT(5) #define LSM6DSL_SHIFT_INT2_CTRL_FULL_FLAG 5 #define LSM6DSL_MASK_INT2_CTRL_FIFO_OVR BIT(4) #define LSM6DSL_SHIFT_INT2_CTRL_FIFO_OVR 4 #define LSM6DSL_MASK_INT2_FTH BIT(3) #define LSM6DSL_SHIFT_INT2_FTH 3 #define LSM6DSL_MASK_INT2_DRDY_TEMP BIT(2) #define LSM6DSL_SHIFT_INT2_DRDY_TEMP 2 #define LSM6DSL_MASK_INT2_CTRL_DRDY_G BIT(1) #define LSM6DSL_SHIFT_INT2_CTRL_DRDY_G 1 #define LSM6DSL_MASK_INT2_CTRL_DRDY_XL BIT(0) #define LSM6DSL_SHIFT_INT2_CTRL_DRDY_XL 0 #define LSM6DSL_REG_WHO_AM_I 0x0F #define LSM6DSL_VAL_WHO_AM_I 0x6A #define LSM6DSL_REG_CTRL1_XL 0x10 #define LSM6DSL_MASK_CTRL1_XL_ODR_XL (BIT(7) | BIT(6) | \ BIT(5) | BIT(4)) #define LSM6DSL_SHIFT_CTRL1_XL_ODR_XL 4 #define LSM6DSL_MASK_CTRL1_XL_FS_XL (BIT(3) | BIT(2)) #define LSM6DSL_SHIFT_CTRL1_XL_FS_XL 2 #define LSM6DSL_MASK_CTRL1_XL_LPF1_BW_SEL BIT(1) #define LSM6DSL_SHIFT_CTRL1_XL_LPF1_BW_SEL 1 #define LSM6DSL_REG_CTRL2_G 0x11 #define LSM6DSL_MASK_CTRL2_G_ODR_G (BIT(7) | BIT(6) | \ BIT(5) | BIT(4)) #define LSM6DSL_SHIFT_CTRL2_G_ODR_G 4 #define LSM6DSL_MASK_CTRL2_G_FS_G (BIT(3) | BIT(2)) #define LSM6DSL_SHIFT_CTRL2_G_FS_G 2 #define LSM6DSL_MASK_CTRL2_FS125 BIT(1) #define LSM6DSL_SHIFT_CTRL2_FS125 1 #define LSM6DSL_REG_CTRL3_C 0x12 #define LSM6DSL_MASK_CTRL3_C_BOOT BIT(7) #define LSM6DSL_SHIFT_CTRL3_C_BOOT 7 #define LSM6DSL_MASK_CTRL3_C_BDU BIT(6) #define LSM6DSL_SHIFT_CTRL3_C_BDU 6 #define LSM6DSL_MASK_CTRL3_C_H_LACTIVE BIT(5) #define LSM6DSL_SHIFT_CTRL3_C_H_LACTIVE 5 #define LSM6DSL_MASK_CTRL3_C_PP_OD BIT(4) #define LSM6DSL_SHIFT_CTRL3_C_PP_OD 4 #define LSM6DSL_MASK_CTRL3_C_SIM BIT(3) #define LSM6DSL_SHIFT_CTRL3_C_SIM 3 #define LSM6DSL_MASK_CTRL3_C_IF_INC BIT(2) #define LSM6DSL_SHIFT_CTRL3_C_IF_INC 2 #define LSM6DSL_MASK_CTRL3_C_BLE BIT(1) #define LSM6DSL_SHIFT_CTRL3_C_BLE 1 #define LSM6DSL_MASK_CTRL3_C_SW_RESET BIT(0) #define LSM6DSL_SHIFT_CTRL3_C_SW_RESET 0 #define LSM6DSL_REG_CTRL4_C 0x13 #define LSM6DSL_MASK_CTRL4_C_DEN_XL_EN BIT(7) #define LSM6DSL_SHIFT_CTRL4_C_DEN_XL_EN 7 #define LSM6DSL_MASK_CTRL4_C_SLEEP BIT(6) #define LSM6DSL_SHIFT_CTRL4_C_SLEEP 6 #define LSM6DSL_MASK_CTRL4_C_INT2_ON_INT1 BIT(5) #define LSM6DSL_SHIFT_CTRL4_C_INT2_ON_INT1 5 #define LSM6DSL_MASK_CTRL4_C_DEN_DRDY_INT1 BIT(4) #define LSM6DSL_SHIFT_CTRL4_C_DEN_DRDY_INT1 4 #define LSM6DSL_MASK_CTRL4_C_DRDY_MASK BIT(3) #define LSM6DSL_SHIFT_CTRL4_C_DRDY_MASK 3 #define LSM6DSL_MASK_CTRL4_C_I2C_DISABLE BIT(2) #define LSM6DSL_SHIFT_CTRL4_C_I2C_DISABLE 2 #define LSM6DSL_MASK_CTRL4_C_LPF1_SEL_G BIT(1) #define LSM6DSL_SHIFT_CTRL4_C_LPF1_SEL_G 1 #define LSM6DSL_REG_CTRL5_C 0x14 #define LSM6DSL_MASK_CTRL5_C_ROUNDING (BIT(7) | BIT(6) | \ BIT(5)) #define LSM6DSL_SHIFT_CTRL5_C_ROUNDING 5 #define LSM6DSL_MASK_CTRL5_C_DEN_LH BIT(4) #define LSM6DSL_SHIFT_CTRL5_C_DEN_LH 4 #define LSM6DSL_MASK_CTRL5_C_ST_G (BIT(3) | BIT(2)) #define LSM6DSL_SHIFT_CTRL5_C_ST_G 2 #define LSM6DSL_MASK_CTRL5_C_ST_XL (BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_CTRL5_C_ST_XL 0 #define LSM6DSL_REG_CTRL6_C 0x15 #define LSM6DSL_MASK_CTRL6_C_TRIG_EN BIT(7) #define LSM6DSL_SHIFT_CTRL6_C_TRIG_EN 7 #define LSM6DSL_MASK_CTRL6_C_LVL_EN BIT(6) #define LSM6DSL_SHIFT_CTRL6_C_LVL_EN 6 #define LSM6DSL_MASK_CTRL6_C_LVL2_EN BIT(5) #define LSM6DSL_SHIFT_CTRL6_C_LVL2_EN 5 #define LSM6DSL_MASK_CTRL6_C_XL_HM_MODE BIT(4) #define LSM6DSL_SHIFT_CTRL6_C_XL_HM_MODE 4 #define LSM6DSL_MASK_CTRL6_C_USR_OFF_W BIT(3) #define LSM6DSL_SHIFT_CTRL6_C_USR_OFF_W 3 #define LSM6DSL_MASK_CTRL6_C_FTYPE (BIT(0) | BIT(1)) #define LSM6DSL_SHIFT_CTRL6_C_FTYPE 0 #define LSM6DSL_REG_CTRL7_G 0x16 #define LSM6DSL_MASK_CTRL7_G_HM_MODE BIT(7) #define LSM6DSL_SHIFT_CTRL7_G_HM_MODE 7 #define LSM6DSL_MASK_CTRL7_HP_EN_G BIT(6) #define LSM6DSL_SHIFT_CTRL7_HP_EN_G 6 #define LSM6DSL_MASK_CTRL7_HPM_G (BIT(5) | BIT(4)) #define LSM6DSL_SHIFT_CTRL7_HPM_G 4 #define LSM6DSL_MASK_CTRL7_ROUNDING_STATUS BIT(2) #define LSM6DSL_SHIFT_CTRL7_ROUNDING_STATUS 2 #define LSM6DSL_REG_CTRL8_XL 0x17 #define LSM6DSL_MASK_CTRL8_LPF2_XL_EN BIT(7) #define LSM6DSL_SHIFT_CTRL8_LPF2_XL_EN 7 #define LSM6DSL_MASK_CTRL8_HPCF_XL (BIT(6) | BIT(5)) #define LSM6DSL_SHIFT_CTRL8_HPCF_XL 5 #define LSM6DSL_MASK_CTRL8_HP_REF_MODE BIT(4) #define LSM6DSL_SHIFT_CTRL8_HP_REF_MODE 4 #define LSM6DSL_MASK_CTRL8_INPUT_COMPOSITE BIT(3) #define LSM6DSL_SHIFT_CTRL8_INPUT_COMPOSITE 3 #define LSM6DSL_MASK_CTRL8_HP_SLOPE_XL_EN BIT(2) #define LSM6DSL_SHIFT_CTRL8_HP_SLOPE_XL_EN 2 #define LSM6DSL_MASK_CTRL8_LOW_PASS_ON_6D BIT(0) #define LSM6DSL_SHIFT_CTRL8_LOW_PASS_ON_6D 0 #define LSM6DSL_REG_CTRL9_XL 0x18 #define LSM6DSL_MASK_CTRL9_XL_DEN_X BIT(7) #define LSM6DSL_SHIFT_CTRL9_XL_DEN_X 7 #define LSM6DSL_MASK_CTRL9_XL_DEN_Y BIT(6) #define LSM6DSL_SHIFT_CTRL9_XL_DEN_Y 6 #define LSM6DSL_MASK_CTRL9_XL_DEN_Z BIT(5) #define LSM6DSL_SHIFT_CTRL9_XL_DEN_Z 5 #define LSM6DSL_MASK_CTRL9_XL_DEN_G BIT(4) #define LSM6DSL_SHIFT_CTRL9_XL_DEN_G 4 #define LSM6DSL_MASK_CTRL9_XL_SOFT_EN BIT(2) #define LSM6DSL_SHIFT_CTRL9_XL_SOFT_EN 2 #define LSM6DSL_REG_CTRL10_C 0x19 #define LSM6DSL_MASK_CTRL10_C_WRIST_TILT_EN BIT(7) #define LSM6DSL_SHIFT_CTRL10_C_WRIST_TILT_EN 7 #define LSM6DSL_MASK_CTRL10_C_TIMER_EN BIT(5) #define LSM6DSL_SHIFT_CTRL10_C_TIMER_EN 5 #define LSM6DSL_MASK_CTRL10_C_PEDO_EN BIT(4) #define LSM6DSL_SHIFT_CTRL10_C_PEDO_EN 4 #define LSM6DSL_MASK_CTRL10_C_TILT_EN BIT(3) #define LSM6DSL_SHIFT_CTRL10_C_TILT_EN 3 #define LSM6DSL_MASK_CTRL10_C_FUNC_EN BIT(2) #define LSM6DSL_SHIFT_CTRL10_C_FUNC_EN 2 #define LSM6DSL_MASK_CTRL10_C_PEDO_RST_STEP BIT(1) #define LSM6DSL_SHIFT_CTRL10_C_PEDO_RST_STEP 1 #define LSM6DSL_MASK_CTRL10_C_SIGN_MOTION_EN BIT(0) #define LSM6DSL_SHIFT_CTRL10_C_SIGN_MOTION_EN 0 #define LSM6DSL_REG_MASTER_CONFIG 0x1A #define LSM6DSL_MASK_MASTER_CONFIG_DRDY_ON_INT1 BIT(7) #define LSM6DSL_SHIFT_MASTER_CONFIG_DRDY_ON_INT1 7 #define LSM6DSL_MASK_MASTER_CONFIG_DATA_VALID_SEL_FIFO BIT(6) #define LSM6DSL_SHIFT_MASTER_CONFIG_DATA_VALID_SEL_FIFO 6 #define LSM6DSL_MASK_MASTER_CONFIG_START_CONFIG BIT(4) #define LSM6DSL_SHIFT_MASTER_CONFIG_START_CONFIG 4 #define LSM6DSL_MASK_MASTER_CONFIG_PULL_UP_EN BIT(3) #define LSM6DSL_SHIFT_MASTER_CONFIG_PULL_UP_EN 3 #define LSM6DSL_MASK_MASTER_CONFIG_PASS_THROUGH_MODE BIT(2) #define LSM6DSL_SHIFT_MASTER_CONFIG_PASS_THROUGH_MODE 2 #define LSM6DSL_MASK_MASTER_CONFIG_IRON_EN BIT(1) #define LSM6DSL_SHIFT_MASTER_CONFIG_IRON_EN 1 #define LSM6DSL_MASK_MASTER_CONFIG_MASTER_ON BIT(0) #define LSM6DSL_SHIFT_MASTER_CONFIG_MASTER_ON 0 #define LSM6DSL_REG_WAKE_UP_SRC 0x1B #define LSM6DSL_MASK_WAKE_UP_SRC_FF_IA BIT(5) #define LSM6DSL_SHIFT_WAKE_UP_SRC_FF_IA 5 #define LSM6DSL_MASK_WAKE_UP_SRC_SLEEP_STATE_IA BIT(4) #define LSM6DSL_SHIFT_WAKE_UP_SRC_SLEEP_STATE_IA 4 #define LSM6DSL_MASK_WAKE_UP_SRC_WU_IA BIT(3) #define LSM6DSL_SHIFT_WAKE_UP_SRC_WU_IA 3 #define LSM6DSL_MASK_WAKE_UP_SRC_X_WU BIT(2) #define LSM6DSL_SHIFT_WAKE_UP_SRC_X_WU 2 #define LSM6DSL_MASK_WAKE_UP_SRC_Y_WU BIT(1) #define LSM6DSL_SHIFT_WAKE_UP_SRC_Y_WU 1 #define LSM6DSL_MASK_WAKE_UP_SRC_Z_WU BIT(0) #define LSM6DSL_SHIFT_WAKE_UP_SRC_Z_WU 0 #define LSM6DSL_REG_TAP_SRC 0x1C #define LSM6DSL_MASK_TAP_SRC_TAP_IA BIT(6) #define LSM6DSL_SHIFT_TAP_SRC_TAP_IA 6 #define LSM6DSL_MASK_TAP_SRC_SINGLE_TAP BIT(5) #define LSM6DSL_SHIFT_TAP_SRC_SINGLE_TAP 5 #define LSM6DSL_MASK_TAP_SRC_DOUBLE_TAP BIT(4) #define LSM6DSL_SHIFT_TAP_SRC_DOUBLE_TAP 4 #define LSM6DSL_MASK_TAP_SRC_TAP_SIGN BIT(3) #define LSM6DSL_SHIFT_TAP_SRC_TAP_SIGN 3 #define LSM6DSL_MASK_TAP_SRC_X_TAP BIT(2) #define LSM6DSL_SHIFT_TAP_SRC_X_TAP 2 #define LSM6DSL_MASK_TAP_SRC_Y_TAP BIT(1) #define LSM6DSL_SHIFT_TAP_SRC_Y_TAP 1 #define LSM6DSL_MASK_TAP_SRC_Z_TAP BIT(0) #define LSM6DSL_SHIFT_TAP_SRC_Z_TAP 0 #define LSM6DSL_REG_D6D_SRC 0x1D #define LSM6DSL_MASK_D6D_SRC_DEN_DRDY BIT(7) #define LSM6DSL_SHIFT_D6D_SRC_DEN_DRDY 7 #define LSM6DSL_MASK_D6D_SRC_D6D_IA BIT(6) #define LSM6DSL_SHIFT_D6D_SRC_D6D_IA 6 #define LSM6DSL_MASK_D6D_SRC_ZH BIT(5) #define LSM6DSL_SHIFT_D6D_SRC_ZH 5 #define LSM6DSL_MASK_D6D_SRC_ZL BIT(4) #define LSM6DSL_SHIFT_D6D_SRC_ZL 4 #define LSM6DSL_MASK_D6D_SRC_YH BIT(3) #define LSM6DSL_SHIFT_D6D_SRC_YH 3 #define LSM6DSL_MASK_D6D_SRC_YL BIT(2) #define LSM6DSL_SHIFT_D6D_SRC_YL 2 #define LSM6DSL_MASK_D6D_SRC_XH BIT(1) #define LSM6DSL_SHIFT_D6D_SRC_XH 1 #define LSM6DSL_MASK_D6D_SRC_XL BIT(0) #define LSM6DSL_SHIFT_D6D_SRC_XL 0 #define LSM6DSL_REG_STATUS_REG 0x1E #define LSM6DSL_MASK_STATUS_REG_TDA BIT(2) #define LSM6DSL_SHIFT_STATUS_REG_TDA 2 #define LSM6DSL_MASK_STATUS_REG_GDA BIT(1) #define LSM6DSL_SHIFT_STATUS_REG_GDA 1 #define LSM6DSL_MASK_STATUS_REG_XLDA BIT(0) #define LSM6DSL_SHIFT_STATUS_REG_XLDA 0 #define LSM6DSL_REG_OUT_TEMP_L 0x20 #define LSM6DSL_REG_OUT_TEMP_H 0x21 #define LSM6DSL_REG_OUTX_L_G 0x22 #define LSM6DSL_REG_OUTX_H_G 0x23 #define LSM6DSL_REG_OUTY_L_G 0x24 #define LSM6DSL_REG_OUTY_H_G 0x25 #define LSM6DSL_REG_OUTZ_L_G 0x26 #define LSM6DSL_REG_OUTZ_H_G 0x27 #define LSM6DSL_REG_OUTX_L_XL 0x28 #define LSM6DSL_REG_OUTX_H_XL 0x29 #define LSM6DSL_REG_OUTY_L_XL 0x2A #define LSM6DSL_REG_OUTY_H_XL 0x2B #define LSM6DSL_REG_OUTZ_L_XL 0x2C #define LSM6DSL_REG_OUTZ_H_XL 0x2D #define LSM6DSL_REG_SENSORHUB1 0x2E #define LSM6DSL_REG_SENSORHUB2 0x2F #define LSM6DSL_REG_SENSORHUB3 0x30 #define LSM6DSL_REG_SENSORHUB4 0x31 #define LSM6DSL_REG_SENSORHUB5 0x32 #define LSM6DSL_REG_SENSORHUB6 0x33 #define LSM6DSL_REG_SENSORHUB7 0x34 #define LSM6DSL_REG_SENSORHUB8 0x35 #define LSM6DSL_REG_SENSORHUB9 0x36 #define LSM6DSL_REG_SENSORHUB10 0x37 #define LSM6DSL_REG_SENSORHUB11 0x38 #define LSM6DSL_REG_SENSORHUB12 0x39 #define LSM6DSL_REG_FIFO_STATUS1 0x3A #define LSM6DSL_REG_FIFO_STATUS2 0x3B #define LSM6DSL_MASK_FIFO_STATUS2_WATERM BIT(7) #define LSM6DSL_SHIFT_FIFO_STATUS2_WATERM 7 #define LSM6DSL_MASK_FIFO_STATUS2_OVER_RUN BIT(6) #define LSM6DSL_SHIFT_FIFO_STATUS2_OVER_RUN 6 #define LSM6DSL_MASK_FIFO_STATUS2_FIFO_FULL_SMART BIT(5) #define LSM6DSL_SHIFT_FIFO_STATUS2_FIFO_FULL_SMART 5 #define LSM6DSL_MASK_FIFO_STATUS2_FIFO_EMPTY BIT(4) #define LSM6DSL_SHIFT_FIFO_STATUS2_FIFO_EMPTY 4 #define LSM6DSL_MASK_FIFO_STATUS2_DIFF_FIFO (BIT(2) | BIT(1) | \ BIT(0)) #define LSM6DSL_SHIFT_FIFO_STATUS2_DIFF_FIFO 0 #define LSM6DSL_REG_FIFO_STATUS3 0x3C #define LSM6DSL_MASK_FIFO_STATUS3_FIFO_PATTERN 0xFF #define LSM6DSL_SHIFT_FIFO_STATUS3_FIFO_PATTERN 0 #define LSM6DSL_REG_FIFO_STATUS4 0x3D #define LSM6DSL_MASK_FIFO_STATUS4_FIFO_PATTERN (BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_FIFO_STATUS4_FIFO_PATTERN 0 #define LSM6DSL_REG_FIFO_DATA_OUT_L 0x3E #define LSM6DSL_REG_FIFO_DATA_OUT_H 0x3F #define LSM6DSL_REG_TIMESTAMP0 0x40 #define LSM6DSL_REG_TIMESTAMP1 0x41 #define LSM6DSL_REG_TIMESTAMP2 0x42 #define LSM6DSL_REG_STEP_TIMESTAMP_L 0x49 #define LSM6DSL_REG_STEP_TIMESTAMP_H 0x4A #define LSM6DSL_REG_STEP_COUNTER_L 0x4B #define LSM6DSL_REG_STEP_COUNTER_H 0x4C #define LSM6DSL_REG_SENSORHUB13 0x4D #define LSM6DSL_REG_SENSORHUB14 0x4E #define LSM6DSL_REG_SENSORHUB15 0x4F #define LSM6DSL_REG_SENSORHUB16 0x50 #define LSM6DSL_REG_SENSORHUB17 0x51 #define LSM6DSL_REG_SENSORHUB18 0x52 #define LSM6DSL_REG_FUNC_SRC1 0x53 #define LSM6DSL_MASK_FUNC_SRC1_STEP_COUNT_DELTA_IA BIT(7) #define LSM6DSL_SHIFT_FUNC_SRC1_STEP_COUNT_DELTA_IA 7 #define LSM6DSL_MASK_FUNC_SRC1_SIGN_MOTION_IA BIT(6) #define LSM6DSL_SHIFT_FUNC_SRC1_SIGN_MOTION_IA 6 #define LSM6DSL_MASK_FUNC_SRC1_TILT_IA BIT(5) #define LSM6DSL_SHIFT_FUNC_SRC1_TILT_IA 5 #define LSM6DSL_MASK_FUNC_SRC1_STEP_DETECTED BIT(4) #define LSM6DSL_SHIFT_FUNC_SRC1_STEP_DETECTED 4 #define LSM6DSL_MASK_FUNC_SRC1_STEP_OVERFLOW BIT(3) #define LSM6DSL_SHIFT_FUNC_SRC1_STEP_OVERFLOW 3 #define LSM6DSL_MASK_FUNC_SRC1_HI_FAIL BIT(2) #define LSM6DSL_SHIFT_FUNC_SRC1_HI_FAIL 2 #define LSM6DSL_MASK_FUNC_SRC1_SI_SEND_OP BIT(1) #define LSM6DSL_SHIFT_FUNC_SRC1_SI_SEND_OP 1 #define LSM6DSL_MASK_FUNC_SRC1_SENSORHUB_END_OP BIT(0) #define LSM6DSL_SHIFT_FUNC_SRC1_SENSORHUB_END_OP 0 #define LSM6DSL_REG_FUNC_SRC2 0x54 #define LSM6DSL_MASK_FUNC_SRC2_SLAVE3_NACK BIT(6) #define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE3_NACK 6 #define LSM6DSL_MASK_FUNC_SRC2_SLAVE2_NACK BIT(5) #define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE2_NACK 5 #define LSM6DSL_MASK_FUNC_SRC2_SLAVE1_NACK BIT(4) #define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE1_NACK 4 #define LSM6DSL_MASK_FUNC_SRC2_SLAVE0_NACK BIT(3) #define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE0_NACK 3 #define LSM6DSL_MASK_FUNC_SRC2_WRIST_TILT_IA BIT(0) #define LSM6DSL_SHIFT_FUNC_SRC2_WRIST_TILT_IA 0 #define LSM6DSL_REG_WRIST_TILT_IA 0x55 #define LSM6DSL_MASK_WRIST_TILT_IA_XPOS BIT(7) #define LSM6DSL_SHIFT_WRIST_TILT_IA_XPOS 7 #define LSM6DSL_MASK_WRIST_TILT_IA_XNEG BIT(6) #define LSM6DSL_SHIFT_WRIST_TILT_IA_XNEG 6 #define LSM6DSL_MASK_WRIST_TILT_IA_YPOS BIT(5) #define LSM6DSL_SHIFT_WRIST_TILT_IA_YPOS 5 #define LSM6DSL_MASK_WRIST_TILT_IA_YNEG BIT(4) #define LSM6DSL_SHIFT_WRIST_TILT_IA_YNEG 4 #define LSM6DSL_MASK_WRIST_TILT_IA_ZPOS BIT(3) #define LSM6DSL_SHIFT_WRIST_TILT_IA_ZPOS 3 #define LSM6DSL_MASK_WRIST_TILT_IA_ZNEG BIT(2) #define LSM6DSL_SHIFT_WRIST_TILT_IA_ZNEG 2 #define LSM6DSL_REG_TAP_CFG 0x58 #define LSM6DSL_MASK_TAP_CFG_INTERRPUTS_ENABLE BIT(7) #define LSM6DSL_SHIFT_TAP_CFG_INTERRPUTS_ENABLE 7 #define LSM6DSL_MASK_TAP_CFG_INACT_EN (BIT(6) | BIT(5)) #define LSM6DSL_SHIFT_TAP_CFG_INACT_EN 5 #define LSM6DSL_MASK_TAP_CFG_SLOPE_FDS BIT(4) #define LSM6DSL_SHIFT_TAP_CFG_SLOPE_FDS 4 #define LSM6DSL_MASK_TAP_CFG_X_EN BIT(3) #define LSM6DSL_SHIFT_TAP_CFG_X_EN 3 #define LSM6DSL_MASK_TAP_CFG_Y_EN BIT(2) #define LSM6DSL_SHIFT_TAP_CFG_Y_EN 2 #define LSM6DSL_MASK_TAP_CFG_Z_EN BIT(1) #define LSM6DSL_SHIFT_TAP_CFG_Z_EN 1 #define LSM6DSL_MASK_TAP_CFG_LIR BIT(0) #define LSM6DSL_SHIFT_TAP_CFG_LIR 0 #define LSM6DSL_REG_TAP_THS_6D 0x59 #define LSM6DSL_MASK_TAP_THS_6D_D4D_EN BIT(7) #define LSM6DSL_SHIFT_TAP_THS_6D_D4D_EN 7 #define LSM6DSL_MASK_TAP_THS_6D_SIXD_THS (BIT(6) | BIT(5)) #define LSM6DSL_SHIFT_TAP_THS_6D_SIXD_THS 5 #define LSM6DSL_MASK_TAP_THS_6D_TAP_THS (BIT(4) | BIT(3) | \ BIT(2) | BIT(1) | \ BIT(0)) #define LSM6DSL_SHIFT_TAP_THS_6D_TAP_THS 0 #define LSM6DSL_REG_INT_DUR2 0x5A #define LSM6DSL_MASK_INT_DUR2_DUR (BIT(7) | BIT(6) | \ BIT(5) | BIT(4)) #define LSM6DSL_SHIFT_INT_DUR2_DUR 4 #define LSM6DSL_MASK_INT_DUR2_QUIET (BIT(3) | BIT(2)) #define LSM6DSL_SHIFT_INT_QUIET 2 #define LSM6DSL_MASK_INT_DUR2_SHOCK (BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_INT_SHOCK 0 #define LSM6DSL_REG_WAKE_UP_THS 0x5B #define LSM6DSL_MASK_WAKE_UP_THS_SINGLE_DOUBLE_TAP BIT(7) #define LSM6DSL_SHIFT_WAKE_UP_THS_SINGLE_DOUBLE_TAP 7 #define LSM6DSL_MASK_WAKE_UP_THS_WK_THS (BIT(5) | BIT(4) | \ BIT(3) | BIT(2) | \ BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_WAKE_UP_THS_WK_THS 0 #define LSM6DSL_REG_WAKE_UP_DUR 0x5C #define LSM6DSL_MASK_WAKE_UP_DUR_FF_DUR5 BIT(7) #define LSM6DSL_SHIFT_WAKE_UP_DUR_FF_DUR5 7 #define LSM6DSL_MASK_WAKE_UP_DUR_WAKE_DUR (BIT(6) | BIT(5)) #define LSM6DSL_SHIFT_WAKE_UP_DUAR_WAKE_DUR 5 #define LSM6DSL_MASK_WAKE_UP_DUR_TIMER_HR BIT(4) #define LSM6DSL_SHIFT_WAKE_UP_DUR_TIMER_HR 4 #define LSM6DSL_MASK_WAKE_UP_DUR_SLEEP_DUR (BIT(3) | BIT(2) | \ BIT(1) | BIT(0)) #define LSM6DSL_SHIFT_WAKE_UP_DUR_SLEEP_DUR 0 #define LSM6DSL_REG_FREE_FALL 0x5D #define LSM6DSL_MASK_FREE_FALL_DUR (BIT(7) | BIT(6) | \ BIT(5) | BIT(4) | \ BIT(3)) #define LSM6DSL_SHIFT_FREE_FALL_DUR 4 #define LSM6DSL_MASK_FREE_FALL_THS (BIT(2) | BIT(1) | \ BIT(0)) #define LSM6DSL_SHIFT_FREE_FALL_THS 0 #define LSM6DSL_REG_MD1_CFG 0x5E #define LSM6DSL_MASK_MD1_CFG_INT1_INACT_STATE BIT(7) #define LSM6DSL_SHIFT_MD1_CFG_INT1_INACT_STATE 7 #define LSM6DSL_MASK_MD1_CFG_INT1_SINGLE_TAP BIT(6) #define LSM6DSL_SHIFT_MD1_CFG_INT1_SINGLE_TAP 6 #define LSM6DSL_MASK_MD1_CFG_INT1_WU BIT(5) #define LSM6DSL_SHIFT_MD1_CFG_INT1_WU 5 #define LSM6DSL_MASK_MD1_CFG_INT1_FF BIT(4) #define LSM6DSL_SHIFT_MD1_CFG_INT1_FF 4 #define LSM6DSL_MASK_MD1_CFG_INT1_DOUBLE_TAP BIT(3) #define LSM6DSL_SHIFT_MD1_CFG_INT1_DOUBLE_TAP 3 #define LSM6DSL_MASK_MD1_CFG_INT1_6D BIT(2) #define LSM6DSL_SHIFT_MD1_CFG_INT1_6D 2 #define LSM6DSL_MASK_MD1_CFG_INT1_TILT BIT(1) #define LSM6DSL_SHIFT_MD1_CFG_INT1_TILT 1 #define LSM6DSL_MASK_MD1_CFG_INT1_TIMER BIT(0) #define LSM6DSL_SHIFT_MD1_CFG_INT1_TIMER 0 #define LSM6DSL_REG_MD2_CFG 0x5F #define LSM6DSL_MASK_MD2_CFG_INT2_INACT_STATE BIT(7) #define LSM6DSL_SHIFT_MD2_CFG_INT2_INACT_STATE 7 #define LSM6DSL_MASK_MD2_CFG_INT2_SINGLE_TAP BIT(6) #define LSM6DSL_SHIFT_MD2_CFG_INT2_SINGLE_TAP 6 #define LSM6DSL_MASK_MD2_CFG_INT2_WU BIT(5) #define LSM6DSL_SHIFT_MD2_CFG_INT1_WU 5 #define LSM6DSL_MASK_MD2_CFG_INT2_FF BIT(4) #define LSM6DSL_SHIFT_MD2_CFG_INT2_FF 4 #define LSM6DSL_MASK_MD2_CFG_INT2_DOUBLE_TAP BIT(3) #define LSM6DSL_SHIFT_MD2_CFG_INT2_DOUBLE_TAP 3 #define LSM6DSL_MASK_MD2_CFG_INT2_6D BIT(2) #define LSM6DSL_SHIFT_MD2_CFG_INT2_6D 2 #define LSM6DSL_MASK_MD2_CFG_INT2_TILT BIT(1) #define LSM6DSL_SHIFT_MD2_CFG_INT2_TILT 1 #define LSM6DSL_MASK_MD2_CFG_INT2_IRON BIT(0) #define LSM6DSL_SHIFT_MD2_CFG_INT2_IRON 0 #define LSM6DSL_REG_MASTER_CMD_CODE 0x60 #define LSM6DSL_REG_SENS_SYNC_SPI_ERROR_CODE 0x61 #define LSM6DSL_REG_OUT_MAG_RAW_X_L 0x66 #define LSM6DSL_REG_OUT_MAG_RAW_X_H 0x67 #define LSM6DSL_REG_OUT_MAG_RAW_Y_L 0x68 #define LSM6DSL_REG_OUT_MAG_RAW_Y_H 0x69 #define LSM6DSL_REG_OUT_MAG_RAW_Z_L 0x6A #define LSM6DSL_REG_OUT_MAG_RAW_Z_H 0x6B #define LSM6DSL_REG_X_OFS_USR 0x73 #define LSM6DSL_REG_Y_OFS_USR 0x74 #define LSM6DSL_REG_Z_OFS_USR 0x75 /* Accel sensor sensitivity grain is 0.061 mg/LSB */ #define SENSI_GRAIN_XL (61LL / 1000.0) /* Gyro sensor sensitivity grain is 4.375 mdps/LSB */ #define SENSI_GRAIN_G (4375LL / 1000.0) #define SENSOR_PI_DOUBLE (SENSOR_PI / 1000000.0) #define SENSOR_DEG2RAD_DOUBLE (SENSOR_PI_DOUBLE / 180) #define SENSOR_G_DOUBLE (SENSOR_G / 1000000.0) #if CONFIG_LSM6DSL_ACCEL_FS == 0 #define LSM6DSL_ACCEL_FS_RUNTIME 1 #define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 0 #define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY SENSI_GRAIN_XL #elif CONFIG_LSM6DSL_ACCEL_FS == 2 #define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 0 #define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY SENSI_GRAIN_XL #elif CONFIG_LSM6DSL_ACCEL_FS == 4 #define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 2 #define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY (2.0 * SENSI_GRAIN_XL) #elif CONFIG_LSM6DSL_ACCEL_FS == 8 #define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 3 #define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY (4.0 * SENSI_GRAIN_XL) #elif CONFIG_LSM6DSL_ACCEL_FS == 16 #define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 1 #define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY (8.0 * SENSI_GRAIN_XL) #endif #if (CONFIG_LSM6DSL_ACCEL_ODR == 0) #define LSM6DSL_ACCEL_ODR_RUNTIME 1 #endif #define GYRO_FULLSCALE_125 4 #if CONFIG_LSM6DSL_GYRO_FS == 0 #define LSM6DSL_GYRO_FS_RUNTIME 1 #define LSM6DSL_DEFAULT_GYRO_FULLSCALE 4 #define LSM6DSL_DEFAULT_GYRO_SENSITIVITY SENSI_GRAIN_G #elif CONFIG_LSM6DSL_GYRO_FS == 125 #define LSM6DSL_DEFAULT_GYRO_FULLSCALE 4 #define LSM6DSL_DEFAULT_GYRO_SENSITIVITY SENSI_GRAIN_G #elif CONFIG_LSM6DSL_GYRO_FS == 245 #define LSM6DSL_DEFAULT_GYRO_FULLSCALE 0 #define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (2.0 * SENSI_GRAIN_G) #elif CONFIG_LSM6DSL_GYRO_FS == 500 #define LSM6DSL_DEFAULT_GYRO_FULLSCALE 1 #define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (4.0 * SENSI_GRAIN_G) #elif CONFIG_LSM6DSL_GYRO_FS == 1000 #define LSM6DSL_DEFAULT_GYRO_FULLSCALE 2 #define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (8.0 * SENSI_GRAIN_G) #elif CONFIG_LSM6DSL_GYRO_FS == 2000 #define LSM6DSL_DEFAULT_GYRO_FULLSCALE 3 #define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (16.0 * SENSI_GRAIN_G) #endif #if (CONFIG_LSM6DSL_GYRO_ODR == 0) #define LSM6DSL_GYRO_ODR_RUNTIME 1 #endif union lsm6dsl_bus_cfg { #if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) struct i2c_dt_spec i2c; #endif #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) struct spi_dt_spec spi; #endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */ }; struct lsm6dsl_config { int (*bus_init)(const struct device *dev); const union lsm6dsl_bus_cfg bus_cfg; #ifdef CONFIG_LSM6DSL_TRIGGER struct gpio_dt_spec int_gpio; #endif }; struct lsm6dsl_data; struct lsm6dsl_transfer_function { int (*read_data)(const struct device *dev, uint8_t reg_addr, uint8_t *value, uint8_t len); int (*write_data)(const struct device *dev, uint8_t reg_addr, uint8_t *value, uint8_t len); int (*read_reg)(const struct device *dev, uint8_t reg_addr, uint8_t *value); int (*update_reg)(const struct device *dev, uint8_t reg_addr, uint8_t mask, uint8_t value); }; struct lsm6dsl_data { int accel_sample_x; int accel_sample_y; int accel_sample_z; float accel_sensitivity; int gyro_sample_x; int gyro_sample_y; int gyro_sample_z; float gyro_sensitivity; #if defined(CONFIG_LSM6DSL_ENABLE_TEMP) int temp_sample; #endif #if defined(CONFIG_LSM6DSL_EXT0_LIS2MDL) int magn_sample_x; int magn_sample_y; int magn_sample_z; float magn_sensitivity; #endif #if defined(CONFIG_LSM6DSL_EXT0_LPS22HB) int sample_press; int sample_temp; #endif const struct lsm6dsl_transfer_function *hw_tf; uint16_t accel_freq; uint8_t accel_fs; uint16_t gyro_freq; uint8_t gyro_fs; #ifdef CONFIG_LSM6DSL_TRIGGER const struct device *dev; struct gpio_callback gpio_cb; struct sensor_trigger data_ready_trigger; sensor_trigger_handler_t data_ready_handler; #if defined(CONFIG_LSM6DSL_TRIGGER_OWN_THREAD) K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_LSM6DSL_THREAD_STACK_SIZE); struct k_thread thread; struct k_sem gpio_sem; #elif defined(CONFIG_LSM6DSL_TRIGGER_GLOBAL_THREAD) struct k_work work; #endif #endif /* CONFIG_LSM6DSL_TRIGGER */ }; int lsm6dsl_spi_init(const struct device *dev); int lsm6dsl_i2c_init(const struct device *dev); #if defined(CONFIG_LSM6DSL_SENSORHUB) int lsm6dsl_shub_init_external_chip(const struct device *dev); int lsm6dsl_shub_read_external_chip(const struct device *dev, uint8_t *buf, uint8_t len); #endif #ifdef CONFIG_LSM6DSL_TRIGGER int lsm6dsl_trigger_set(const struct device *dev, const struct sensor_trigger *trig, sensor_trigger_handler_t handler); int lsm6dsl_init_interrupt(const struct device *dev); #endif #endif /* ZEPHYR_DRIVERS_SENSOR_LSM6DSL_LSM6DSL_H_ */