iNEMO inertial module: 3D accelerometer and 3D gyroscope.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Diff: lsm6dsox_reg.h
- Revision:
- 1:fe40aec6e97a
- Parent:
- 0:f27ce43dee4f
- Child:
- 4:88054adaed8d
--- a/lsm6dsox_reg.h Wed Jul 10 12:08:49 2019 +0000 +++ b/lsm6dsox_reg.h Thu Oct 29 12:45:14 2020 +0000 @@ -1,7 +1,7 @@ /* ****************************************************************************** * @file lsm6dsox_reg.h - * @author Sensor Solutions Software Team + * @author Sensors Software Solution Team * @brief This file contains all the functions prototypes for the * lsm6dsox_reg.c driver. ****************************************************************************** @@ -19,8 +19,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef LSM6DSOX_DRIVER_H -#define LSM6DSOX_DRIVER_H +#ifndef LSM6DSOX_REGS_H +#define LSM6DSOX_REGS_H #ifdef __cplusplus extern "C" { @@ -28,6 +28,7 @@ /* Includes ------------------------------------------------------------------*/ #include <stdint.h> +#include <stddef.h> #include <math.h> /** @addtogroup LSM6DSOX @@ -35,7 +36,7 @@ * */ -/** @defgroup LSM6DSOX_sensors_common_types +/** @defgroup STMicroelectronics sensors common types * @{ * */ @@ -55,24 +56,24 @@ * */ -typedef union{ - int16_t i16bit[3]; - uint8_t u8bit[6]; +typedef union { + int16_t i16bit[3]; + uint8_t u8bit[6]; } axis3bit16_t; -typedef union{ - int16_t i16bit; - uint8_t u8bit[2]; +typedef union { + int16_t i16bit; + uint8_t u8bit[2]; } axis1bit16_t; -typedef union{ - int32_t i32bit[3]; - uint8_t u8bit[12]; +typedef union { + int32_t i32bit[3]; + uint8_t u8bit[12]; } axis3bit32_t; -typedef union{ - int32_t i32bit; - uint8_t u8bit[4]; +typedef union { + int32_t i32bit; + uint8_t u8bit[4]; } axis1bit32_t; /** @@ -80,15 +81,15 @@ * */ -typedef struct{ - uint8_t bit0 : 1; - uint8_t bit1 : 1; - uint8_t bit2 : 1; - uint8_t bit3 : 1; - uint8_t bit4 : 1; - uint8_t bit5 : 1; - uint8_t bit6 : 1; - uint8_t bit7 : 1; +typedef struct { + uint8_t bit0 : 1; + uint8_t bit1 : 1; + uint8_t bit2 : 1; + uint8_t bit3 : 1; + uint8_t bit4 : 1; + uint8_t bit5 : 1; + uint8_t bit6 : 1; + uint8_t bit7 : 1; } bitwise_t; #define PROPERTY_DISABLE (0U) @@ -96,6 +97,32 @@ #endif /* MEMS_SHARED_TYPES */ +#ifndef MEMS_UCF_SHARED_TYPES +#define MEMS_UCF_SHARED_TYPES + +/** @defgroup Generic address-data structure definition + * @brief This structure is useful to load a predefined configuration + * of a sensor. + * You can create a sensor configuration by your own or using + * Unico / Unicleo tools available on STMicroelectronics + * web site. + * + * @{ + * + */ + +typedef struct { + uint8_t address; + uint8_t data; +} ucf_line_t; + +/** + * @} + * + */ + +#endif /* MEMS_UCF_SHARED_TYPES */ + /** * @} * @@ -109,15 +136,15 @@ * */ -typedef int32_t (*lsm6dsox_write_ptr)(void *, uint8_t, uint8_t*, uint16_t); -typedef int32_t (*lsm6dsox_read_ptr) (void *, uint8_t, uint8_t*, uint16_t); +typedef int32_t (*lsm6dsox_write_ptr)(void *, uint8_t, uint8_t *, uint16_t); +typedef int32_t (*lsm6dsox_read_ptr)(void *, uint8_t, uint8_t *, uint16_t); typedef struct { - /** Component mandatory fields **/ - lsm6dsox_write_ptr write_reg; - lsm6dsox_read_ptr read_reg; - /** Customizable optional pointer **/ - void *handle; + /** Component mandatory fields **/ + lsm6dsox_write_ptr write_reg; + lsm6dsox_read_ptr read_reg; + /** Customizable optional pointer **/ + void *handle; } lsm6dsox_ctx_t; /** @@ -131,11 +158,11 @@ */ /** I2C Device Address 8 bit format if SA0=0 -> D5 if SA0=1 -> D7 **/ -#define LSM6DSOX_I2C_ADD_L 0xD5 -#define LSM6DSOX_I2C_ADD_H 0xD7 +#define LSM6DSOX_I2C_ADD_L 0xD5U +#define LSM6DSOX_I2C_ADD_H 0xD7U /** Device Identification (Who am I) **/ -#define LSM6DSOX_ID 0x6C +#define LSM6DSOX_ID 0x6CU /** * @} @@ -615,7 +642,7 @@ typedef struct { uint8_t not_used_01 : 3; uint8_t spi2_read_en : 1; - uint8_t not_used_02 : 1; + uint8_t not_used_02 : 1; uint8_t den_lh_ois : 1; uint8_t lvl2_ois : 1; uint8_t int2_drdy_ois : 1; @@ -1175,7 +1202,8 @@ uint8_t fsm_init : 1; uint8_t not_used_01 : 2; uint8_t fifo_compr_init : 1; - uint8_t not_used_02 : 4; + uint8_t mlc_init : 1; + uint8_t not_used_02 : 3; } lsm6dsox_emb_func_init_b_t; #define LSM6DSOX_MLC0_SRC 0x70U @@ -1663,7 +1691,7 @@ lsm6dsox_fsm_outs15_t fsm_outs15; lsm6dsox_fsm_outs16_t fsm_outs16; lsm6dsox_emb_func_odr_cfg_b_t emb_func_odr_cfg_b; - lsm6dsox_emb_func_odr_cfg_c_t emb_func_odr_cfg_c; + lsm6dsox_emb_func_odr_cfg_c_t emb_func_odr_cfg_c; lsm6dsox_emb_func_src_t emb_func_src; lsm6dsox_emb_func_init_a_t emb_func_init_a; lsm6dsox_emb_func_init_b_t emb_func_init_b; @@ -1750,7 +1778,7 @@ LSM6DSOX_XL_ODR_1667Hz = 8, LSM6DSOX_XL_ODR_3333Hz = 9, LSM6DSOX_XL_ODR_6667Hz = 10, - LSM6DSOX_XL_ODR_6Hz5 = 11, /* (low power only) */ + LSM6DSOX_XL_ODR_1Hz6 = 11, /* (low power only) */ } lsm6dsox_odr_xl_t; int32_t lsm6dsox_xl_data_rate_set(lsm6dsox_ctx_t *ctx, lsm6dsox_odr_xl_t val); int32_t lsm6dsox_xl_data_rate_get(lsm6dsox_ctx_t *ctx, lsm6dsox_odr_xl_t *val); @@ -1812,20 +1840,6 @@ int32_t lsm6dsox_gy_power_mode_get(lsm6dsox_ctx_t *ctx, lsm6dsox_g_hm_mode_t *val); -typedef struct { - lsm6dsox_all_int_src_t all_int_src; - lsm6dsox_wake_up_src_t wake_up_src; - lsm6dsox_tap_src_t tap_src; - lsm6dsox_d6d_src_t d6d_src; - lsm6dsox_status_reg_t status_reg; - lsm6dsox_emb_func_status_t emb_func_status; - lsm6dsox_fsm_status_a_t fsm_status_a; - lsm6dsox_fsm_status_b_t fsm_status_b; - lsm6dsox_mlc_status_mainpage_t mlc_status; -} lsm6dsox_all_sources_t; -int32_t lsm6dsox_all_sources_get(lsm6dsox_ctx_t *ctx, - lsm6dsox_all_sources_t *val); - int32_t lsm6dsox_status_reg_get(lsm6dsox_ctx_t *ctx, lsm6dsox_status_reg_t *val); @@ -1847,6 +1861,8 @@ int32_t lsm6dsox_xl_usr_offset_set(lsm6dsox_ctx_t *ctx, uint8_t val); int32_t lsm6dsox_xl_usr_offset_get(lsm6dsox_ctx_t *ctx, uint8_t *val); +int32_t lsm6dsox_timestamp_rst(lsm6dsox_ctx_t *ctx); + int32_t lsm6dsox_timestamp_set(lsm6dsox_ctx_t *ctx, uint8_t val); int32_t lsm6dsox_timestamp_get(lsm6dsox_ctx_t *ctx, uint8_t *val); @@ -1911,7 +1927,7 @@ uint8_t *val); int32_t lsm6dsox_ln_pg_read_byte(lsm6dsox_ctx_t *ctx, uint16_t address, uint8_t *val); - + int32_t lsm6dsox_ln_pg_write(lsm6dsox_ctx_t *ctx, uint16_t address, uint8_t *buf, uint8_t len); int32_t lsm6dsox_ln_pg_read(lsm6dsox_ctx_t *ctx, uint16_t address, @@ -2228,31 +2244,6 @@ lsm6dsox_i3c_disable_t val); int32_t lsm6dsox_i3c_disable_get(lsm6dsox_ctx_t *ctx, lsm6dsox_i3c_disable_t *val); -typedef struct { - lsm6dsox_int1_ctrl_t int1_ctrl; - lsm6dsox_md1_cfg_t md1_cfg; - lsm6dsox_emb_func_int1_t emb_func_int1; - lsm6dsox_fsm_int1_a_t fsm_int1_a; - lsm6dsox_fsm_int1_b_t fsm_int1_b; - lsm6dsox_mlc_int1_t mlc_int1; -} lsm6dsox_pin_int1_route_t; -int32_t lsm6dsox_pin_int1_route_set(lsm6dsox_ctx_t *ctx, - lsm6dsox_pin_int1_route_t *val); -int32_t lsm6dsox_pin_int1_route_get(lsm6dsox_ctx_t *ctx, - lsm6dsox_pin_int1_route_t *val); - -typedef struct { - lsm6dsox_int2_ctrl_t int2_ctrl; - lsm6dsox_md2_cfg_t md2_cfg; - lsm6dsox_emb_func_int2_t emb_func_int2; - lsm6dsox_fsm_int2_a_t fsm_int2_a; - lsm6dsox_fsm_int2_b_t fsm_int2_b; - lsm6dsox_mlc_int2_t mlc_int2; -} lsm6dsox_pin_int2_route_t; -int32_t lsm6dsox_pin_int2_route_set(lsm6dsox_ctx_t *ctx, - lsm6dsox_pin_int2_route_t *val); -int32_t lsm6dsox_pin_int2_route_get(lsm6dsox_ctx_t *ctx, - lsm6dsox_pin_int2_route_t *val); typedef enum { LSM6DSOX_PUSH_PULL = 0x00, @@ -2509,7 +2500,7 @@ } lsm6dsox_trig_counter_bdr_t; typedef enum { - LSM6DSOX_GYRO_NC_TAG = 1, + LSM6DSOX_GYRO_NC_TAG = 1, LSM6DSOX_XL_NC_TAG, LSM6DSOX_TEMPERATURE_TAG, LSM6DSOX_TIMESTAMP_TAG, @@ -2530,7 +2521,7 @@ LSM6DSOX_GAME_ROTATION_TAG, LSM6DSOX_GEOMAG_ROTATION_TAG, LSM6DSOX_ROTATION_TAG, - LSM6DSOX_SENSORHUB_NACK_TAG = 0x19, + LSM6DSOX_SENSORHUB_NACK_TAG = 0x19, } lsm6dsox_fifo_tag_t; int32_t lsm6dsox_fifo_cnt_event_batch_set(lsm6dsox_ctx_t *ctx, lsm6dsox_trig_counter_bdr_t val); @@ -2557,7 +2548,7 @@ int32_t lsm6dsox_fifo_wtm_flag_get(lsm6dsox_ctx_t *ctx, uint8_t *val); int32_t lsm6dsox_fifo_sensor_tag_get(lsm6dsox_ctx_t *ctx, - lsm6dsox_fifo_tag_t *val); + lsm6dsox_fifo_tag_t *val); int32_t lsm6dsox_fifo_pedo_batch_set(lsm6dsox_ctx_t *ctx, uint8_t val); int32_t lsm6dsox_fifo_pedo_batch_get(lsm6dsox_ctx_t *ctx, uint8_t *val); @@ -2609,11 +2600,9 @@ int32_t lsm6dsox_den_mark_axis_z_get(lsm6dsox_ctx_t *ctx, uint8_t *val); typedef enum { - LSM6DSOX_PEDO_DISABLE = 0x00, - LSM6DSOX_PEDO_BASE_MODE = 0x01, - LSM6DSOX_PEDO_ADV_MODE = 0x03, - LSM6DSOX_FALSE_STEP_REJ = 0x13, - LSM6DSOX_FALSE_STEP_REJ_ADV_MODE = 0x33, + LSM6DSOX_PEDO_BASE_MODE = 0x00, + LSM6DSOX_FALSE_STEP_REJ = 0x10, + LSM6DSOX_FALSE_STEP_REJ_ADV_MODE = 0x30, } lsm6dsox_pedo_md_t; int32_t lsm6dsox_pedo_sens_set(lsm6dsox_ctx_t *ctx, lsm6dsox_pedo_md_t val); int32_t lsm6dsox_pedo_sens_get(lsm6dsox_ctx_t *ctx, lsm6dsox_pedo_md_t *val); @@ -2645,15 +2634,9 @@ int32_t lsm6dsox_pedo_int_mode_get(lsm6dsox_ctx_t *ctx, lsm6dsox_carry_count_en_t *val); -int32_t lsm6dsox_motion_sens_set(lsm6dsox_ctx_t *ctx, uint8_t val); -int32_t lsm6dsox_motion_sens_get(lsm6dsox_ctx_t *ctx, uint8_t *val); - int32_t lsm6dsox_motion_flag_data_ready_get(lsm6dsox_ctx_t *ctx, uint8_t *val); -int32_t lsm6dsox_tilt_sens_set(lsm6dsox_ctx_t *ctx, uint8_t val); -int32_t lsm6dsox_tilt_sens_get(lsm6dsox_ctx_t *ctx, uint8_t *val); - int32_t lsm6dsox_tilt_flag_data_ready_get(lsm6dsox_ctx_t *ctx, uint8_t *val); @@ -2711,9 +2694,6 @@ int32_t lsm6dsox_long_cnt_flag_data_ready_get(lsm6dsox_ctx_t *ctx, uint8_t *val); -int32_t lsm6dsox_emb_fsm_en_set(lsm6dsox_ctx_t *ctx, uint8_t val); -int32_t lsm6dsox_emb_fsm_en_get(lsm6dsox_ctx_t *ctx, uint8_t *val); - typedef struct { lsm6dsox_fsm_enable_a_t fsm_enable_a; lsm6dsox_fsm_enable_b_t fsm_enable_b; @@ -2775,9 +2755,6 @@ int32_t lsm6dsox_fsm_start_address_set(lsm6dsox_ctx_t *ctx, uint16_t val); int32_t lsm6dsox_fsm_start_address_get(lsm6dsox_ctx_t *ctx, uint16_t *val); -int32_t lsm6dsox_mlc_set(lsm6dsox_ctx_t *ctx, uint8_t val); -int32_t lsm6dsox_mlc_get(lsm6dsox_ctx_t *ctx, uint8_t *val); - int32_t lsm6dsox_mlc_status_get(lsm6dsox_ctx_t *ctx, lsm6dsox_mlc_status_mainpage_t *val); @@ -2813,7 +2790,8 @@ lsm6dsox_sensor_hub_18_t sh_byte_18; } lsm6dsox_emb_sh_read_t; int32_t lsm6dsox_sh_read_data_raw_get(lsm6dsox_ctx_t *ctx, - lsm6dsox_emb_sh_read_t *val); + lsm6dsox_emb_sh_read_t *val, + uint8_t len); typedef enum { LSM6DSOX_SLV_0 = 0, @@ -2840,8 +2818,8 @@ int32_t lsm6dsox_sh_pass_through_get(lsm6dsox_ctx_t *ctx, uint8_t *val); typedef enum { - LSM6DSOX_EXT_ON_INT2_PIN = 0, - LSM6DSOX_XL_GY_DRDY = 1, + LSM6DSOX_EXT_ON_INT2_PIN = 1, + LSM6DSOX_XL_GY_DRDY = 0, } lsm6dsox_start_config_t; int32_t lsm6dsox_sh_syncro_mode_set(lsm6dsox_ctx_t *ctx, lsm6dsox_start_config_t val); @@ -2921,6 +2899,429 @@ int32_t lsm6dsox_s4s_dt_set(lsm6dsox_ctx_t *ctx, uint8_t val); int32_t lsm6dsox_s4s_dt_get(lsm6dsox_ctx_t *ctx, uint8_t *val); +typedef struct { + uint8_t ui; + uint8_t aux; +} lsm6dsox_id_t; +int32_t lsm6dsox_id_get(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_id_t *val); + +typedef struct { + enum { + LSM6DSOX_SEL_BY_HW = 0x00, /* bus mode select by HW (SPI 3W disable) */ + LSM6DSOX_SPI_4W = 0x06, /* Only SPI: SDO / SDI separated pins */ + LSM6DSOX_SPI_3W = 0x07, /* Only SPI: SDO / SDI share the same pin */ + LSM6DSOX_I2C = 0x04, /* Only I2C */ + LSM6DSOX_I3C_T_50us = 0x02, /* I3C: available time equal to 50 μs */ + LSM6DSOX_I3C_T_2us = 0x12, /* I3C: available time equal to 2 μs */ + LSM6DSOX_I3C_T_1ms = 0x22, /* I3C: available time equal to 1 ms */ + LSM6DSOX_I3C_T_25ms = 0x32, /* I3C: available time equal to 25 ms */ + } ui_bus_md; + enum { + LSM6DSOX_SPI_4W_AUX = 0x00, + LSM6DSOX_SPI_3W_AUX = 0x01, + } aux_bus_md; +} lsm6dsox_bus_mode_t; +int32_t lsm6dsox_bus_mode_set(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_bus_mode_t val); +int32_t lsm6dsox_bus_mode_get(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_bus_mode_t *val); + +typedef enum { + LSM6DSOX_DRV_RDY = 0x00, /* Initialize the device for driver usage */ + LSM6DSOX_BOOT = 0x01, /* Restore calib. param. ( it takes 10ms ) */ + LSM6DSOX_RESET = 0x02, /* Reset configuration registers */ + LSM6DSOX_FIFO_COMP = 0x04, /* FIFO compression initialization request. */ + LSM6DSOX_FSM = 0x08, /* Finite State Machine initialization request */ + LSM6DSOX_MLC = 0x10, /* Machine Learning Core initialization request */ + LSM6DSOX_PEDO = 0x20, /* Pedometer algo initialization request. */ + LSM6DSOX_TILT = 0x40, /* Tilt algo initialization request */ + LSM6DSOX_SMOTION = 0x80, /* Significant Motion initialization request */ +} lsm6dsox_init_t; +int32_t lsm6dsox_init_set(lsm6dsox_ctx_t *ctx, lsm6dsox_init_t val); + +typedef struct { + uint8_t sw_reset : 1; /* Restoring configuration registers */ + uint8_t boot : 1; /* Restoring calibration parameters */ + uint8_t drdy_xl : 1; /* Accelerometer data ready */ + uint8_t drdy_g : 1; /* Gyroscope data ready */ + uint8_t drdy_temp : 1; /* Temperature data ready */ + uint8_t ois_drdy_xl : 1; /* Accelerometer data ready on OIS */ + uint8_t ois_drdy_g : 1; /* Gyroscope data ready on OIS */ + uint8_t ois_gyro_settling : 1; /* Gyroscope is in the settling phase */ +} lsm6dsox_status_t; +int32_t lsm6dsox_status_get(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_status_t *val); + +typedef struct { + uint8_t sdo_sa0_pull_up : 1; /* 1 = pull-up on SDO/SA0 pin */ + uint8_t aux_sdo_ocs_pull_up : 1; /* 1 = pull-up on OCS_Aux/SDO_Aux pins */ + uint8_t int1_int2_push_pull : 1; /* 1 = push-pull / 0 = open-drain*/ + uint8_t int1_pull_down : 1; /* 1 = pull-down always disabled (0=auto) */ +} lsm6dsox_pin_conf_t; +int32_t lsm6dsox_pin_conf_set(lsm6dsox_ctx_t *ctx, lsm6dsox_pin_conf_t val); +int32_t lsm6dsox_pin_conf_get(lsm6dsox_ctx_t *ctx, lsm6dsox_pin_conf_t *val); + +typedef struct { + uint8_t active_low : 1; /* 1 = active low / 0 = active high */ + uint8_t base_latched : 1; /* base functions are: FF, WU, 6D, Tap, Act/Inac */ + uint8_t emb_latched : 1; /* emb functions are: Pedo, Tilt, SMot, Timestamp */ +} lsm6dsox_int_mode_t; +int32_t lsm6dsox_interrupt_mode_set(lsm6dsox_ctx_t *ctx, + lsm6dsox_int_mode_t val); +int32_t lsm6dsox_interrupt_mode_get(lsm6dsox_ctx_t *ctx, + lsm6dsox_int_mode_t *val); + +typedef struct { + uint8_t drdy_xl : 1; /* Accelerometer data ready */ + uint8_t drdy_g : 1; /* Gyroscope data ready */ + uint8_t drdy_temp : 1; /* Temperature data ready (1 = int2 pin disable) */ + uint8_t boot : 1; /* Restoring calibration parameters */ + uint8_t fifo_th : 1; /* FIFO threshold reached */ + uint8_t fifo_ovr : 1; /* FIFO overrun */ + uint8_t fifo_full : 1; /* FIFO full */ + uint8_t fifo_bdr : 1; /* FIFO Batch counter threshold reached */ + uint8_t den_flag : 1; /* external trigger level recognition (DEN) */ + uint8_t sh_endop : 1; /* sensor hub end operation */ + uint8_t timestamp : 1; /* timestamp overflow (1 = int2 pin disable) */ + uint8_t six_d : 1; /* orientation change (6D/4D detection) */ + uint8_t double_tap : 1; /* double-tap event */ + uint8_t free_fall : 1; /* free fall event */ + uint8_t wake_up : 1; /* wake up event */ + uint8_t single_tap : 1; /* single-tap event */ + uint8_t sleep_change : 1; /* Act/Inact (or Vice-versa) status changed */ + uint8_t step_detector : 1; /* Step detected */ + uint8_t tilt : 1; /* Relative tilt event detected */ + uint8_t sig_mot : 1; /* "significant motion" event detected */ + uint8_t fsm_lc : 1; /* fsm long counter timeout interrupt event */ + uint8_t fsm1 : 1; /* fsm 1 interrupt event */ + uint8_t fsm2 : 1; /* fsm 2 interrupt event */ + uint8_t fsm3 : 1; /* fsm 3 interrupt event */ + uint8_t fsm4 : 1; /* fsm 4 interrupt event */ + uint8_t fsm5 : 1; /* fsm 5 interrupt event */ + uint8_t fsm6 : 1; /* fsm 6 interrupt event */ + uint8_t fsm7 : 1; /* fsm 7 interrupt event */ + uint8_t fsm8 : 1; /* fsm 8 interrupt event */ + uint8_t fsm9 : 1; /* fsm 9 interrupt event */ + uint8_t fsm10 : 1; /* fsm 10 interrupt event */ + uint8_t fsm11 : 1; /* fsm 11 interrupt event */ + uint8_t fsm12 : 1; /* fsm 12 interrupt event */ + uint8_t fsm13 : 1; /* fsm 13 interrupt event */ + uint8_t fsm14 : 1; /* fsm 14 interrupt event */ + uint8_t fsm15 : 1; /* fsm 15 interrupt event */ + uint8_t fsm16 : 1; /* fsm 16 interrupt event */ + uint8_t mlc1 : 1; /* mlc 1 interrupt event */ + uint8_t mlc2 : 1; /* mlc 2 interrupt event */ + uint8_t mlc3 : 1; /* mlc 3 interrupt event */ + uint8_t mlc4 : 1; /* mlc 4 interrupt event */ + uint8_t mlc5 : 1; /* mlc 5 interrupt event */ + uint8_t mlc6 : 1; /* mlc 6 interrupt event */ + uint8_t mlc7 : 1; /* mlc 7 interrupt event */ + uint8_t mlc8 : 1; /* mlc 8 interrupt event */ +} lsm6dsox_pin_int1_route_t; + +int32_t lsm6dsox_pin_int1_route_set(lsm6dsox_ctx_t *ctx, + lsm6dsox_pin_int1_route_t val); +int32_t lsm6dsox_pin_int1_route_get(lsm6dsox_ctx_t *ctx, + lsm6dsox_pin_int1_route_t *val); + +typedef struct { + uint8_t drdy_ois : 1; /* OIS chain data ready */ + uint8_t drdy_xl : 1; /* Accelerometer data ready */ + uint8_t drdy_g : 1; /* Gyroscope data ready */ + uint8_t drdy_temp : 1; /* Temperature data ready */ + uint8_t fifo_th : 1; /* FIFO threshold reached */ + uint8_t fifo_ovr : 1; /* FIFO overrun */ + uint8_t fifo_full : 1; /* FIFO full */ + uint8_t fifo_bdr : 1; /* FIFO Batch counter threshold reached */ + uint8_t timestamp : 1; /* timestamp overflow */ + uint8_t six_d : 1; /* orientation change (6D/4D detection) */ + uint8_t double_tap : 1; /* double-tap event */ + uint8_t free_fall : 1; /* free fall event */ + uint8_t wake_up : 1; /* wake up event */ + uint8_t single_tap : 1; /* single-tap event */ + uint8_t sleep_change : 1; /* Act/Inact (or Vice-versa) status changed */ + uint8_t step_detector : 1; /* Step detected */ + uint8_t tilt : 1; /* Relative tilt event detected */ + uint8_t sig_mot : 1; /* "significant motion" event detected */ + uint8_t fsm_lc : 1; /* fsm long counter timeout interrupt event */ + uint8_t fsm1 : 1; /* fsm 1 interrupt event */ + uint8_t fsm2 : 1; /* fsm 2 interrupt event */ + uint8_t fsm3 : 1; /* fsm 3 interrupt event */ + uint8_t fsm4 : 1; /* fsm 4 interrupt event */ + uint8_t fsm5 : 1; /* fsm 5 interrupt event */ + uint8_t fsm6 : 1; /* fsm 6 interrupt event */ + uint8_t fsm7 : 1; /* fsm 7 interrupt event */ + uint8_t fsm8 : 1; /* fsm 8 interrupt event */ + uint8_t fsm9 : 1; /* fsm 9 interrupt event */ + uint8_t fsm10 : 1; /* fsm 10 interrupt event */ + uint8_t fsm11 : 1; /* fsm 11 interrupt event */ + uint8_t fsm12 : 1; /* fsm 12 interrupt event */ + uint8_t fsm13 : 1; /* fsm 13 interrupt event */ + uint8_t fsm14 : 1; /* fsm 14 interrupt event */ + uint8_t fsm15 : 1; /* fsm 15 interrupt event */ + uint8_t fsm16 : 1; /* fsm 16 interrupt event */ + uint8_t mlc1 : 1; /* mlc 1 interrupt event */ + uint8_t mlc2 : 1; /* mlc 2 interrupt event */ + uint8_t mlc3 : 1; /* mlc 3 interrupt event */ + uint8_t mlc4 : 1; /* mlc 4 interrupt event */ + uint8_t mlc5 : 1; /* mlc 5 interrupt event */ + uint8_t mlc6 : 1; /* mlc 6 interrupt event */ + uint8_t mlc7 : 1; /* mlc 7 interrupt event */ + uint8_t mlc8 : 1; /* mlc 8 interrupt event */ +} lsm6dsox_pin_int2_route_t; + +int32_t lsm6dsox_pin_int2_route_set(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_pin_int2_route_t val); +int32_t lsm6dsox_pin_int2_route_get(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_pin_int2_route_t *val); + +typedef struct { + uint8_t drdy_xl : 1; /* Accelerometer data ready */ + uint8_t drdy_g : 1; /* Gyroscope data ready */ + uint8_t drdy_temp : 1; /* Temperature data ready */ + uint8_t den_flag : 1; /* external trigger level recognition (DEN) */ + uint8_t timestamp : 1; /* timestamp overflow (1 = int2 pin disable) */ + uint8_t free_fall : 1; /* free fall event */ + uint8_t wake_up : 1; /* wake up event */ + uint8_t wake_up_z : 1; /* wake up on Z axis event */ + uint8_t wake_up_y : 1; /* wake up on Y axis event */ + uint8_t wake_up_x : 1; /* wake up on X axis event */ + uint8_t single_tap : 1; /* single-tap event */ + uint8_t double_tap : 1; /* double-tap event */ + uint8_t tap_z : 1; /* single-tap on Z axis event */ + uint8_t tap_y : 1; /* single-tap on Y axis event */ + uint8_t tap_x : 1; /* single-tap on X axis event */ + uint8_t tap_sign : 1; /* sign of tap event (0-pos / 1-neg) */ + uint8_t six_d : 1; /* orientation change (6D/4D detection) */ + uint8_t six_d_xl : 1; /* X-axis low 6D/4D event (under threshold) */ + uint8_t six_d_xh : 1; /* X-axis high 6D/4D event (over threshold) */ + uint8_t six_d_yl : 1; /* Y-axis low 6D/4D event (under threshold) */ + uint8_t six_d_yh : 1; /* Y-axis high 6D/4D event (over threshold) */ + uint8_t six_d_zl : 1; /* Z-axis low 6D/4D event (under threshold) */ + uint8_t six_d_zh : 1; /* Z-axis high 6D/4D event (over threshold) */ + uint8_t sleep_change : 1; /* Act/Inact (or Vice-versa) status changed */ + uint8_t sleep_state : 1; /* Act/Inact status flag (0-Act / 1-Inact) */ + uint8_t step_detector : 1; /* Step detected */ + uint8_t tilt : 1; /* Relative tilt event detected */ + uint8_t sig_mot : 1; /* "significant motion" event detected */ + uint8_t fsm_lc : 1; /* fsm long counter timeout interrupt event */ + uint8_t fsm1 : 1; /* fsm 1 interrupt event */ + uint8_t fsm2 : 1; /* fsm 2 interrupt event */ + uint8_t fsm3 : 1; /* fsm 3 interrupt event */ + uint8_t fsm4 : 1; /* fsm 4 interrupt event */ + uint8_t fsm5 : 1; /* fsm 5 interrupt event */ + uint8_t fsm6 : 1; /* fsm 6 interrupt event */ + uint8_t fsm7 : 1; /* fsm 7 interrupt event */ + uint8_t fsm8 : 1; /* fsm 8 interrupt event */ + uint8_t fsm9 : 1; /* fsm 9 interrupt event */ + uint8_t fsm10 : 1; /* fsm 10 interrupt event */ + uint8_t fsm11 : 1; /* fsm 11 interrupt event */ + uint8_t fsm12 : 1; /* fsm 12 interrupt event */ + uint8_t fsm13 : 1; /* fsm 13 interrupt event */ + uint8_t fsm14 : 1; /* fsm 14 interrupt event */ + uint8_t fsm15 : 1; /* fsm 15 interrupt event */ + uint8_t fsm16 : 1; /* fsm 16 interrupt event */ + uint8_t mlc1 : 1; /* mlc 1 interrupt event */ + uint8_t mlc2 : 1; /* mlc 2 interrupt event */ + uint8_t mlc3 : 1; /* mlc 3 interrupt event */ + uint8_t mlc4 : 1; /* mlc 4 interrupt event */ + uint8_t mlc5 : 1; /* mlc 5 interrupt event */ + uint8_t mlc6 : 1; /* mlc 6 interrupt event */ + uint8_t mlc7 : 1; /* mlc 7 interrupt event */ + uint8_t mlc8 : 1; /* mlc 8 interrupt event */ + uint8_t sh_endop : 1; /* sensor hub end operation */ + uint8_t sh_slave0_nack : 1; /* Not acknowledge on sensor hub slave 0 */ + uint8_t sh_slave1_nack : 1; /* Not acknowledge on sensor hub slave 1 */ + uint8_t sh_slave2_nack : 1; /* Not acknowledge on sensor hub slave 2 */ + uint8_t sh_slave3_nack : 1; /* Not acknowledge on sensor hub slave 3 */ + uint8_t sh_wr_once : 1; /* "WRITE_ONCE" end on sensor hub slave 0 */ + uint16_t fifo_diff : 10; /* Number of unread sensor data in FIFO*/ + uint8_t fifo_ovr_latched : 1; /* Latched FIFO overrun status */ + uint8_t fifo_bdr : 1; /* FIFO Batch counter threshold reached */ + uint8_t fifo_full : 1; /* FIFO full */ + uint8_t fifo_ovr : 1; /* FIFO overrun */ + uint8_t fifo_th : 1; /* FIFO threshold reached */ +} lsm6dsox_all_sources_t; +int32_t lsm6dsox_all_sources_get(lsm6dsox_ctx_t *ctx, + lsm6dsox_all_sources_t *val); + +typedef struct{ + uint8_t odr_fine_tune; +} dev_cal_t; +int32_t lsm6dsox_calibration_get(lsm6dsox_ctx_t *ctx, dev_cal_t *val); + +typedef struct { + struct { + struct { + enum { + LSM6DSOX_XL_UI_OFF = 0x00, /* in power down */ + LSM6DSOX_XL_UI_1Hz6_LP = 0x1B, /* @1Hz6 (low power) */ + LSM6DSOX_XL_UI_1Hz6_ULP = 0x2B, /* @1Hz6 (ultra low/Gy, OIS imu off) */ + LSM6DSOX_XL_UI_12Hz5_HP = 0x01, /* @12Hz5 (high performance) */ + LSM6DSOX_XL_UI_12Hz5_LP = 0x11, /* @12Hz5 (low power) */ + LSM6DSOX_XL_UI_12Hz5_ULP = 0x21, /* @12Hz5 (ultra low/Gy, OIS imu off) */ + LSM6DSOX_XL_UI_26Hz_HP = 0x02, /* @26Hz (high performance) */ + LSM6DSOX_XL_UI_26Hz_LP = 0x12, /* @26Hz (low power) */ + LSM6DSOX_XL_UI_26Hz_ULP = 0x22, /* @26Hz (ultra low/Gy, OIS imu off) */ + LSM6DSOX_XL_UI_52Hz_HP = 0x03, /* @52Hz (high performance) */ + LSM6DSOX_XL_UI_52Hz_LP = 0x13, /* @52Hz (low power) */ + LSM6DSOX_XL_UI_52Hz_ULP = 0x23, /* @52Hz (ultra low/Gy, OIS imu off) */ + LSM6DSOX_XL_UI_104Hz_HP = 0x04, /* @104Hz (high performance) */ + LSM6DSOX_XL_UI_104Hz_NM = 0x14, /* @104Hz (normal mode) */ + LSM6DSOX_XL_UI_104Hz_ULP = 0x24, /* @104Hz (ultra low/Gy, OIS imu off) */ + LSM6DSOX_XL_UI_208Hz_HP = 0x05, /* @208Hz (high performance) */ + LSM6DSOX_XL_UI_208Hz_NM = 0x15, /* @208Hz (normal mode) */ + LSM6DSOX_XL_UI_208Hz_ULP = 0x25, /* @208Hz (ultra low/Gy, OIS imu off) */ + LSM6DSOX_XL_UI_416Hz_HP = 0x06, /* @416Hz (high performance) */ + LSM6DSOX_XL_UI_833Hz_HP = 0x07, /* @833Hz (high performance) */ + LSM6DSOX_XL_UI_1667Hz_HP = 0x08, /* @1kHz66 (high performance) */ + LSM6DSOX_XL_UI_3333Hz_HP = 0x09, /* @3kHz33 (high performance) */ + LSM6DSOX_XL_UI_6667Hz_HP = 0x0A, /* @6kHz66 (high performance) */ + } odr; + enum { + LSM6DSOX_XL_UI_2g = 0, + LSM6DSOX_XL_UI_4g = 2, + LSM6DSOX_XL_UI_8g = 3, + LSM6DSOX_XL_UI_16g = 1, /* OIS full scale is also forced to be 16g */ + } fs; + } xl; + struct { + enum { + LSM6DSOX_GY_UI_OFF = 0x00, /* gy in power down */ + LSM6DSOX_GY_UI_12Hz5_LP = 0x11, /* gy @12Hz5 (low power) */ + LSM6DSOX_GY_UI_12Hz5_HP = 0x01, /* gy @12Hz5 (high performance) */ + LSM6DSOX_GY_UI_26Hz_LP = 0x12, /* gy @26Hz (low power) */ + LSM6DSOX_GY_UI_26Hz_HP = 0x02, /* gy @26Hz (high performance) */ + LSM6DSOX_GY_UI_52Hz_LP = 0x13, /* gy @52Hz (low power) */ + LSM6DSOX_GY_UI_52Hz_HP = 0x03, /* gy @52Hz (high performance) */ + LSM6DSOX_GY_UI_104Hz_NM = 0x14, /* gy @104Hz (low power) */ + LSM6DSOX_GY_UI_104Hz_HP = 0x04, /* gy @104Hz (high performance) */ + LSM6DSOX_GY_UI_208Hz_NM = 0x15, /* gy @208Hz (low power) */ + LSM6DSOX_GY_UI_208Hz_HP = 0x05, /* gy @208Hz (high performance) */ + LSM6DSOX_GY_UI_416Hz_HP = 0x06, /* gy @416Hz (high performance) */ + LSM6DSOX_GY_UI_833Hz_HP = 0x07, /* gy @833Hz (high performance) */ + LSM6DSOX_GY_UI_1667Hz_HP = 0x08, /* gy @1kHz66 (high performance) */ + LSM6DSOX_GY_UI_3333Hz_HP = 0x09, /* gy @3kHz33 (high performance) */ + LSM6DSOX_GY_UI_6667Hz_HP = 0x0A, /* gy @6kHz66 (high performance) */ + } odr; + enum { + LSM6DSOX_GY_UI_250dps = 0, + LSM6DSOX_GY_UI_125dps = 1, + LSM6DSOX_GY_UI_500dps = 2, + LSM6DSOX_GY_UI_1000dps = 4, + LSM6DSOX_GY_UI_2000dps = 6, + } fs; + }gy; + } ui; + struct { + enum { + LSM6DSOX_OIS_ONLY_AUX = 0x00, /* Auxiliary SPI full control */ + LSM6DSOX_OIS_ONLY_UI = 0x02, /* Primary interface full control */ + LSM6DSOX_OIS_MIXED = 0x01, /* Enabling by UI / read-config by AUX */ + } ctrl_md; + struct { + enum { + LSM6DSOX_XL_OIS_OFF = 0x00, /* in power down */ + LSM6DSOX_XL_OIS_6667Hz_HP = 0x01, /* @6kHz OIS imu active/NO ULP on UI */ + } odr; + enum { + LSM6DSOX_XL_OIS_2g = 0, + LSM6DSOX_XL_OIS_4g = 2, + LSM6DSOX_XL_OIS_8g = 3, + LSM6DSOX_XL_OIS_16g = 1, /* UI full scale is also forced to be 16g */ + } fs; + } xl; + struct { + enum { + LSM6DSOX_GY_OIS_OFF = 0x00, /* in power down */ + LSM6DSOX_GY_OIS_6667Hz_HP = 0x01, /* @6kHz No Ultra Low Power*/ + } odr; + enum { + LSM6DSOX_GY_OIS_250dps = 0, + LSM6DSOX_GY_OIS_125dps = 1, + LSM6DSOX_GY_OIS_500dps = 2, + LSM6DSOX_GY_OIS_1000dps = 4, + LSM6DSOX_GY_OIS_2000dps = 6, + } fs; + } gy; + } ois; + struct { + enum { + LSM6DSOX_FSM_DISABLE = 0x00, + LSM6DSOX_FSM_XL = 0x01, + LSM6DSOX_FSM_GY = 0x02, + LSM6DSOX_FSM_XL_GY = 0x03, + } sens; + enum { + LSM6DSOX_FSM_12Hz5 = 0x00, + LSM6DSOX_FSM_26Hz = 0x01, + LSM6DSOX_FSM_52Hz = 0x02, + LSM6DSOX_FSM_104Hz = 0x03, + } odr; + } fsm; + struct { + enum { + LSM6DSOX_MLC_DISABLE = 0x00, + LSM6DSOX_MLC_XL = 0x01, + LSM6DSOX_MLC_XL_GY = 0x03, + } sens; + enum { + LSM6DSOX_MLC_12Hz5 = 0x00, + LSM6DSOX_MLC_26Hz = 0x01, + LSM6DSOX_MLC_52Hz = 0x02, + LSM6DSOX_MLC_104Hz = 0x03, + } odr; + } mlc; +} lsm6dsox_md_t; +int32_t lsm6dsox_mode_set(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_md_t *val); +int32_t lsm6dsox_mode_get(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_md_t *val); + +typedef struct { + struct { + struct { + float mg[3]; + int16_t raw[3]; + }xl; + struct { + float mdps[3]; + int16_t raw[3]; + }gy; + struct { + float deg_c; + int16_t raw; + }heat; + } ui; + struct { + struct { + float mg[3]; + int16_t raw[3]; + }xl; + struct { + float mdps[3]; + int16_t raw[3]; + }gy; + } ois; +} lsm6dsox_data_t; +int32_t lsm6dsox_data_get(lsm6dsox_ctx_t *ctx, lsm6dsox_ctx_t *aux_ctx, + lsm6dsox_md_t *md, lsm6dsox_data_t *data); + +typedef struct { + uint8_t sig_mot : 1; /* significant motion */ + uint8_t tilt : 1; /* tilt detection */ + uint8_t step : 1; /* step counter/detector */ + uint8_t mlc : 1; /* machine learning core */ + uint8_t fsm : 1; /* finite state machine */ + uint8_t fifo_compr : 1; /* mlc 8 interrupt event */ +} lsm6dsox_emb_sens_t; +int32_t lsm6dsox_embedded_sens_set(lsm6dsox_ctx_t *ctx, + lsm6dsox_emb_sens_t *emb_sens); +int32_t lsm6dsox_embedded_sens_get(lsm6dsox_ctx_t *ctx, + lsm6dsox_emb_sens_t *emb_sens); +int32_t lsm6dsox_embedded_sens_off(lsm6dsox_ctx_t *ctx); + /** * @} *