13
13
#include <zephyr/sys/byteorder.h>
14
14
15
15
#include "icm42688.h"
16
+ #include "icm42688_decoder.h"
16
17
#include "icm42688_reg.h"
18
+ #include "icm42688_rtio.h"
17
19
#include "icm42688_spi.h"
18
20
#include "icm42688_trigger.h"
19
21
20
22
#include <zephyr/logging/log.h>
21
23
LOG_MODULE_REGISTER (ICM42688 , CONFIG_SENSOR_LOG_LEVEL );
22
24
23
- struct icm42688_sensor_data {
24
- struct icm42688_dev_data dev_data ;
25
-
26
- int16_t readings [7 ];
27
- };
28
-
29
- struct icm42688_sensor_config {
30
- struct icm42688_dev_cfg dev_cfg ;
31
- };
32
-
33
25
static void icm42688_convert_accel (struct sensor_value * val , int16_t raw_val ,
34
26
struct icm42688_cfg * cfg )
35
27
{
@@ -47,42 +39,40 @@ static inline void icm42688_convert_temp(struct sensor_value *val, int16_t raw_v
47
39
icm42688_temp_c ((int32_t )raw_val , & val -> val1 , & val -> val2 );
48
40
}
49
41
50
- static int icm42688_channel_get ( const struct device * dev , enum sensor_channel chan ,
51
- struct sensor_value * val )
42
+ int icm42688_channel_parse_readings ( enum sensor_channel chan , int16_t readings [ 7 ] ,
43
+ struct icm42688_cfg * cfg , struct sensor_value * val )
52
44
{
53
- struct icm42688_sensor_data * data = dev -> data ;
54
-
55
45
switch (chan ) {
56
46
case SENSOR_CHAN_ACCEL_XYZ :
57
- icm42688_convert_accel (& val [0 ], data -> readings [1 ], & data -> dev_data . cfg );
58
- icm42688_convert_accel (& val [1 ], data -> readings [2 ], & data -> dev_data . cfg );
59
- icm42688_convert_accel (& val [2 ], data -> readings [3 ], & data -> dev_data . cfg );
47
+ icm42688_convert_accel (& val [0 ], readings [1 ], cfg );
48
+ icm42688_convert_accel (& val [1 ], readings [2 ], cfg );
49
+ icm42688_convert_accel (& val [2 ], readings [3 ], cfg );
60
50
break ;
61
51
case SENSOR_CHAN_ACCEL_X :
62
- icm42688_convert_accel (val , data -> readings [1 ], & data -> dev_data . cfg );
52
+ icm42688_convert_accel (val , readings [1 ], cfg );
63
53
break ;
64
54
case SENSOR_CHAN_ACCEL_Y :
65
- icm42688_convert_accel (val , data -> readings [2 ], & data -> dev_data . cfg );
55
+ icm42688_convert_accel (val , readings [2 ], cfg );
66
56
break ;
67
57
case SENSOR_CHAN_ACCEL_Z :
68
- icm42688_convert_accel (val , data -> readings [3 ], & data -> dev_data . cfg );
58
+ icm42688_convert_accel (val , readings [3 ], cfg );
69
59
break ;
70
60
case SENSOR_CHAN_GYRO_XYZ :
71
- icm42688_convert_gyro (& val [0 ], data -> readings [4 ], & data -> dev_data . cfg );
72
- icm42688_convert_gyro (& val [1 ], data -> readings [5 ], & data -> dev_data . cfg );
73
- icm42688_convert_gyro (& val [2 ], data -> readings [6 ], & data -> dev_data . cfg );
61
+ icm42688_convert_gyro (& val [0 ], readings [4 ], cfg );
62
+ icm42688_convert_gyro (& val [1 ], readings [5 ], cfg );
63
+ icm42688_convert_gyro (& val [2 ], readings [6 ], cfg );
74
64
break ;
75
65
case SENSOR_CHAN_GYRO_X :
76
- icm42688_convert_gyro (val , data -> readings [4 ], & data -> dev_data . cfg );
66
+ icm42688_convert_gyro (val , readings [4 ], cfg );
77
67
break ;
78
68
case SENSOR_CHAN_GYRO_Y :
79
- icm42688_convert_gyro (val , data -> readings [5 ], & data -> dev_data . cfg );
69
+ icm42688_convert_gyro (val , readings [5 ], cfg );
80
70
break ;
81
71
case SENSOR_CHAN_GYRO_Z :
82
- icm42688_convert_gyro (val , data -> readings [6 ], & data -> dev_data . cfg );
72
+ icm42688_convert_gyro (val , readings [6 ], cfg );
83
73
break ;
84
74
case SENSOR_CHAN_DIE_TEMP :
85
- icm42688_convert_temp (val , data -> readings [0 ]);
75
+ icm42688_convert_temp (val , readings [0 ]);
86
76
break ;
87
77
default :
88
78
return - ENOTSUP ;
@@ -91,13 +81,21 @@ static int icm42688_channel_get(const struct device *dev, enum sensor_channel ch
91
81
return 0 ;
92
82
}
93
83
84
+ static int icm42688_channel_get (const struct device * dev , enum sensor_channel chan ,
85
+ struct sensor_value * val )
86
+ {
87
+ struct icm42688_dev_data * data = dev -> data ;
88
+
89
+ return icm42688_channel_parse_readings (chan , data -> readings , & data -> cfg , val );
90
+ }
91
+
94
92
static int icm42688_sample_fetch (const struct device * dev , enum sensor_channel chan )
95
93
{
96
94
uint8_t status ;
97
- struct icm42688_sensor_data * data = dev -> data ;
98
- const struct icm42688_sensor_config * cfg = dev -> config ;
95
+ struct icm42688_dev_data * data = dev -> data ;
96
+ const struct icm42688_dev_cfg * cfg = dev -> config ;
99
97
100
- int res = icm42688_spi_read (& cfg -> dev_cfg . spi , REG_INT_STATUS , & status , 1 );
98
+ int res = icm42688_spi_read (& cfg -> spi , REG_INT_STATUS , & status , 1 );
101
99
102
100
if (res ) {
103
101
return res ;
@@ -125,8 +123,8 @@ static int icm42688_sample_fetch(const struct device *dev, enum sensor_channel c
125
123
static int icm42688_attr_set (const struct device * dev , enum sensor_channel chan ,
126
124
enum sensor_attribute attr , const struct sensor_value * val )
127
125
{
128
- const struct icm42688_sensor_data * data = dev -> data ;
129
- struct icm42688_cfg new_config = data -> dev_data . cfg ;
126
+ const struct icm42688_dev_data * data = dev -> data ;
127
+ struct icm42688_cfg new_config = data -> cfg ;
130
128
int res = 0 ;
131
129
132
130
__ASSERT_NO_MSG (val != NULL );
@@ -173,8 +171,8 @@ static int icm42688_attr_set(const struct device *dev, enum sensor_channel chan,
173
171
static int icm42688_attr_get (const struct device * dev , enum sensor_channel chan ,
174
172
enum sensor_attribute attr , struct sensor_value * val )
175
173
{
176
- const struct icm42688_sensor_data * data = dev -> data ;
177
- const struct icm42688_cfg * cfg = & data -> dev_data . cfg ;
174
+ const struct icm42688_dev_data * data = dev -> data ;
175
+ const struct icm42688_cfg * cfg = & data -> cfg ;
178
176
int res = 0 ;
179
177
180
178
__ASSERT_NO_MSG (val != NULL );
@@ -222,16 +220,20 @@ static const struct sensor_driver_api icm42688_driver_api = {
222
220
.attr_get = icm42688_attr_get ,
223
221
#ifdef CONFIG_ICM42688_TRIGGER
224
222
.trigger_set = icm42688_trigger_set ,
223
+ #endif
224
+ .get_decoder = icm42688_get_decoder ,
225
+ #ifdef CONFIG_SENSOR_ASYNC_API
226
+ .submit = icm42688_submit ,
225
227
#endif
226
228
};
227
229
228
230
int icm42688_init (const struct device * dev )
229
231
{
230
- struct icm42688_sensor_data * data = dev -> data ;
231
- const struct icm42688_sensor_config * cfg = dev -> config ;
232
+ struct icm42688_dev_data * data = dev -> data ;
233
+ const struct icm42688_dev_cfg * cfg = dev -> config ;
232
234
int res ;
233
235
234
- if (!spi_is_ready_dt (& cfg -> dev_cfg . spi )) {
236
+ if (!spi_is_ready_dt (& cfg -> spi )) {
235
237
LOG_ERR ("SPI bus is not ready" );
236
238
return - ENODEV ;
237
239
}
@@ -247,22 +249,18 @@ int icm42688_init(const struct device *dev)
247
249
LOG_ERR ("Failed to initialize triggers" );
248
250
return res ;
249
251
}
250
-
251
- res = icm42688_trigger_enable_interrupt (dev );
252
- if (res != 0 ) {
253
- LOG_ERR ("Failed to enable triggers" );
254
- return res ;
255
- }
256
252
#endif
257
253
258
- data -> dev_data .cfg .accel_mode = ICM42688_ACCEL_LN ;
259
- data -> dev_data .cfg .gyro_mode = ICM42688_GYRO_LN ;
260
- data -> dev_data .cfg .accel_fs = ICM42688_ACCEL_FS_2G ;
261
- data -> dev_data .cfg .gyro_fs = ICM42688_GYRO_FS_125 ;
262
- data -> dev_data .cfg .accel_odr = ICM42688_ACCEL_ODR_1000 ;
263
- data -> dev_data .cfg .gyro_odr = ICM42688_GYRO_ODR_1000 ;
254
+ memset (& data -> cfg , 0 , sizeof (struct icm42688_cfg ));
255
+ data -> cfg .accel_mode = ICM42688_ACCEL_LN ;
256
+ data -> cfg .gyro_mode = ICM42688_GYRO_LN ;
257
+ data -> cfg .accel_fs = ICM42688_ACCEL_FS_2G ;
258
+ data -> cfg .gyro_fs = ICM42688_GYRO_FS_125 ;
259
+ data -> cfg .accel_odr = ICM42688_ACCEL_ODR_1000 ;
260
+ data -> cfg .gyro_odr = ICM42688_GYRO_ODR_1000 ;
261
+ data -> cfg .fifo_en = false;
264
262
265
- res = icm42688_configure (dev , & data -> dev_data . cfg );
263
+ res = icm42688_configure (dev , & data -> cfg );
266
264
if (res != 0 ) {
267
265
LOG_ERR ("Failed to configure" );
268
266
return res ;
@@ -286,16 +284,15 @@ void icm42688_unlock(const struct device *dev)
286
284
#define ICM42688_SPI_CFG \
287
285
SPI_OP_MODE_MASTER | SPI_MODE_CPOL | SPI_MODE_CPHA | SPI_WORD_SET(8) | SPI_TRANSFER_MSB
288
286
287
+ #define ICM42688_DEFINE_DATA (inst ) \
288
+ static struct icm42688_dev_data icm42688_driver_##inst;
289
289
290
290
#define ICM42688_INIT (inst ) \
291
- static struct icm42688_sensor_data icm42688_driver_##inst = { 0 }; \
291
+ ICM42688_DEFINE_DATA(inst); \
292
292
\
293
- static const struct icm42688_sensor_config icm42688_cfg_##inst = { \
294
- .dev_cfg = \
295
- { \
296
- .spi = SPI_DT_SPEC_INST_GET(inst, ICM42688_SPI_CFG, 0U), \
297
- .gpio_int1 = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0}), \
298
- }, \
293
+ static const struct icm42688_dev_cfg icm42688_cfg_##inst = { \
294
+ .spi = SPI_DT_SPEC_INST_GET(inst, ICM42688_SPI_CFG, 0U), \
295
+ .gpio_int1 = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0}), \
299
296
}; \
300
297
\
301
298
SENSOR_DEVICE_DT_INST_DEFINE(inst, icm42688_init, NULL, &icm42688_driver_##inst, \
0 commit comments