1919#include <zephyr/logging/log.h>
2020
2121#include "lsm6dsv16x.h"
22+ #include "lsm6dsv16x_decoder.h"
23+ #include "lsm6dsv16x_rtio.h"
2224
2325LOG_MODULE_REGISTER (LSM6DSV16X , CONFIG_SENSOR_LOG_LEVEL );
2426
@@ -86,6 +88,16 @@ static const uint16_t lsm6dsv16x_gyro_fs_map[] = {125, 250, 500, 1000, 2000, 0,
8688 0 , 0 , 0 , 0 , 0 , 4000 };
8789static const uint16_t lsm6dsv16x_gyro_fs_sens [] = {1 , 2 , 4 , 8 , 16 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 32 };
8890
91+ int lsm6dsv16x_calc_accel_gain (uint8_t fs )
92+ {
93+ return lsm6dsv16x_accel_fs_map [fs ] * GAIN_UNIT_XL / 2 ;
94+ }
95+
96+ int lsm6dsv16x_calc_gyro_gain (uint8_t fs )
97+ {
98+ return lsm6dsv16x_gyro_fs_sens [fs ] * GAIN_UNIT_G ;
99+ }
100+
89101static int lsm6dsv16x_gyro_range_to_fs_val (int32_t range )
90102{
91103 size_t i ;
@@ -205,7 +217,7 @@ static int lsm6dsv16x_accel_range_set(const struct device *dev, int32_t range)
205217 return - EIO ;
206218 }
207219
208- data -> acc_gain = lsm6dsv16x_accel_fs_map [ fs ] * GAIN_UNIT_XL / 2 ;
220+ data -> acc_gain = lsm6dsv16x_calc_accel_gain ( fs ) ;
209221 return 0 ;
210222}
211223
@@ -295,7 +307,7 @@ static int lsm6dsv16x_gyro_range_set(const struct device *dev, int32_t range)
295307 return - EIO ;
296308 }
297309
298- data -> gyro_gain = ( lsm6dsv16x_gyro_fs_sens [ fs ] * GAIN_UNIT_G );
310+ data -> gyro_gain = lsm6dsv16x_calc_gyro_gain ( fs );
299311 return 0 ;
300312}
301313
@@ -924,6 +936,10 @@ static const struct sensor_driver_api lsm6dsv16x_driver_api = {
924936#endif
925937 .sample_fetch = lsm6dsv16x_sample_fetch ,
926938 .channel_get = lsm6dsv16x_channel_get ,
939+ #ifdef CONFIG_SENSOR_ASYNC_API
940+ .get_decoder = lsm6dsv16x_get_decoder ,
941+ .submit = lsm6dsv16x_submit ,
942+ #endif
927943};
928944
929945static int lsm6dsv16x_init_chip (const struct device * dev )
@@ -970,7 +986,7 @@ static int lsm6dsv16x_init_chip(const struct device *dev)
970986 LOG_ERR ("failed to set accelerometer range %d" , fs );
971987 return - EIO ;
972988 }
973- lsm6dsv16x -> acc_gain = lsm6dsv16x_accel_fs_map [ fs ] * GAIN_UNIT_XL / 2 ;
989+ lsm6dsv16x -> acc_gain = lsm6dsv16x_calc_accel_gain ( fs ) ;
974990
975991 odr = cfg -> accel_odr ;
976992 LOG_DBG ("accel odr is %d" , odr );
@@ -985,7 +1001,7 @@ static int lsm6dsv16x_init_chip(const struct device *dev)
9851001 LOG_ERR ("failed to set gyroscope range %d" , fs );
9861002 return - EIO ;
9871003 }
988- lsm6dsv16x -> gyro_gain = ( lsm6dsv16x_gyro_fs_sens [ fs ] * GAIN_UNIT_G );
1004+ lsm6dsv16x -> gyro_gain = lsm6dsv16x_calc_gyro_gain ( fs );
9891005
9901006 odr = cfg -> gyro_odr ;
9911007 LOG_DBG ("gyro odr is %d" , odr );
@@ -1057,10 +1073,6 @@ static int lsm6dsv16x_init(const struct device *dev)
10571073 CONFIG_SENSOR_INIT_PRIORITY, \
10581074 &lsm6dsv16x_driver_api);
10591075
1060- /*
1061- * Instantiation macros used when a device is on a SPI bus.
1062- */
1063-
10641076#ifdef CONFIG_LSM6DSV16X_TRIGGER
10651077#define LSM6DSV16X_CFG_IRQ (inst ) \
10661078 .trig_enabled = true, \
@@ -1072,19 +1084,33 @@ static int lsm6dsv16x_init(const struct device *dev)
10721084#define LSM6DSV16X_CFG_IRQ (inst )
10731085#endif /* CONFIG_LSM6DSV16X_TRIGGER */
10741086
1087+ #define LSM6DSV16X_CONFIG_COMMON (inst ) \
1088+ .accel_odr = DT_INST_PROP(inst, accel_odr), \
1089+ .accel_range = DT_INST_PROP(inst, accel_range), \
1090+ .gyro_odr = DT_INST_PROP(inst, gyro_odr), \
1091+ .gyro_range = DT_INST_PROP(inst, gyro_range), \
1092+ IF_ENABLED(CONFIG_LSM6DSV16X_STREAM, \
1093+ (.fifo_wtm = DT_INST_PROP(inst, fifo_watermark), \
1094+ .accel_batch = DT_INST_PROP(inst, accel_fifo_batch_rate), \
1095+ .gyro_batch = DT_INST_PROP(inst, gyro_fifo_batch_rate), \
1096+ .temp_batch = DT_INST_PROP(inst, temp_fifo_batch_rate),)) \
1097+ IF_ENABLED(UTIL_OR(DT_INST_NODE_HAS_PROP(inst, int1_gpios), \
1098+ DT_INST_NODE_HAS_PROP(inst, int2_gpios)), \
1099+ (LSM6DSV16X_CFG_IRQ(inst)))
1100+
1101+ /*
1102+ * Instantiation macros used when a device is on a SPI bus.
1103+ */
1104+
10751105#define LSM6DSV16X_SPI_OP (SPI_WORD_SET(8) | \
10761106 SPI_OP_MODE_MASTER | \
10771107 SPI_MODE_CPOL | \
10781108 SPI_MODE_CPHA) \
10791109
1080- #define LSM6DSV16X_CONFIG_COMMON (inst ) \
1081- .accel_odr = DT_INST_PROP(inst, accel_odr), \
1082- .accel_range = DT_INST_PROP(inst, accel_range), \
1083- .gyro_odr = DT_INST_PROP(inst, gyro_odr), \
1084- .gyro_range = DT_INST_PROP(inst, gyro_range), \
1085- IF_ENABLED(UTIL_OR(DT_INST_NODE_HAS_PROP(inst, int1_gpios), \
1086- DT_INST_NODE_HAS_PROP(inst, int2_gpios)), \
1087- (LSM6DSV16X_CFG_IRQ(inst)))
1110+ #define LSM6DSV16X_SPI_RTIO_DEFINE (inst ) \
1111+ SPI_DT_IODEV_DEFINE(lsm6dsv16x_iodev_##inst, \
1112+ DT_DRV_INST(inst), LSM6DSV16X_SPI_OP, 0U); \
1113+ RTIO_DEFINE(lsm6dsv16x_rtio_ctx_##inst, 4, 4);
10881114
10891115#define LSM6DSV16X_CONFIG_SPI (inst ) \
10901116 { \
@@ -1097,10 +1123,25 @@ static int lsm6dsv16x_init(const struct device *dev)
10971123 LSM6DSV16X_CONFIG_COMMON(inst) \
10981124 }
10991125
1126+ #define LSM6DSV16X_DEFINE_SPI (inst ) \
1127+ IF_ENABLED(CONFIG_LSM6DSV16X_STREAM, (LSM6DSV16X_SPI_RTIO_DEFINE(inst))); \
1128+ static struct lsm6dsv16x_data lsm6dsv16x_data_##inst = { \
1129+ IF_ENABLED(CONFIG_LSM6DSV16X_STREAM, \
1130+ (.rtio_ctx = &lsm6dsv16x_rtio_ctx_##inst, \
1131+ .iodev = &lsm6dsv16x_iodev_##inst, \
1132+ .bus_type = BUS_SPI,)) \
1133+ }; \
1134+ static const struct lsm6dsv16x_config lsm6dsv16x_config_##inst = \
1135+ LSM6DSV16X_CONFIG_SPI(inst); \
1136+
11001137/*
11011138 * Instantiation macros used when a device is on an I2C bus.
11021139 */
11031140
1141+ #define LSM6DSV16X_I2C_RTIO_DEFINE (inst ) \
1142+ I2C_DT_IODEV_DEFINE(lsm6dsv16x_iodev_##inst, DT_DRV_INST(inst));\
1143+ RTIO_DEFINE(lsm6dsv16x_rtio_ctx_##inst, 4, 4);
1144+
11041145#define LSM6DSV16X_CONFIG_I2C (inst ) \
11051146 { \
11061147 STMEMSC_CTX_I2C(&lsm6dsv16x_config_##inst.stmemsc_cfg), \
@@ -1110,17 +1151,27 @@ static int lsm6dsv16x_init(const struct device *dev)
11101151 LSM6DSV16X_CONFIG_COMMON(inst) \
11111152 }
11121153
1154+
1155+ #define LSM6DSV16X_DEFINE_I2C (inst ) \
1156+ IF_ENABLED(CONFIG_LSM6DSV16X_STREAM, (LSM6DSV16X_I2C_RTIO_DEFINE(inst))); \
1157+ static struct lsm6dsv16x_data lsm6dsv16x_data_##inst = { \
1158+ IF_ENABLED(CONFIG_LSM6DSV16X_STREAM, \
1159+ (.rtio_ctx = &lsm6dsv16x_rtio_ctx_##inst, \
1160+ .iodev = &lsm6dsv16x_iodev_##inst, \
1161+ .bus_type = BUS_I2C,)) \
1162+ }; \
1163+ static const struct lsm6dsv16x_config lsm6dsv16x_config_##inst = \
1164+ LSM6DSV16X_CONFIG_I2C(inst); \
1165+
11131166/*
11141167 * Main instantiation macro. Use of COND_CODE_1() selects the right
11151168 * bus-specific macro at preprocessor time.
11161169 */
11171170
11181171#define LSM6DSV16X_DEFINE (inst ) \
1119- static struct lsm6dsv16x_data lsm6dsv16x_data_##inst; \
1120- static const struct lsm6dsv16x_config lsm6dsv16x_config_##inst = \
11211172 COND_CODE_1(DT_INST_ON_BUS(inst, spi), \
1122- (LSM6DSV16X_CONFIG_SPI (inst)), \
1123- (LSM6DSV16X_CONFIG_I2C (inst))); \
1124- LSM6DSV16X_DEVICE_INIT(inst)
1173+ (LSM6DSV16X_DEFINE_SPI (inst)), \
1174+ (LSM6DSV16X_DEFINE_I2C (inst))); \
1175+ LSM6DSV16X_DEVICE_INIT(inst)
11251176
11261177DT_INST_FOREACH_STATUS_OKAY (LSM6DSV16X_DEFINE )
0 commit comments