@@ -52,6 +52,11 @@ static int iis3dwb_odr_set(const struct device *dev,
52
52
break ;
53
53
54
54
default :
55
+ if (val -> val1 > 26 ) {
56
+ LOG_ERR ("%s: odr %d Hz not supported" , dev -> name , val -> val1 );
57
+ return - EINVAL ;
58
+ }
59
+
55
60
odr = IIS3DWB_XL_ODR_26k7Hz ;
56
61
break ;
57
62
}
@@ -64,25 +69,20 @@ static int iis3dwb_odr_set(const struct device *dev,
64
69
return 0 ;
65
70
}
66
71
67
- static int iis3dwb_set_fs (const struct device * dev , uint8_t fs )
72
+ static int iis3dwb_set_fs (const struct device * dev , int32_t fs )
68
73
{
69
74
int ret ;
70
75
uint8_t range ;
71
76
72
- switch (fs ) {
73
- case 2 :
77
+ if (fs <= 2 ) {
74
78
range = IIS3DWB_DT_FS_2G ;
75
- break ;
76
- case 4 :
79
+ } else if (fs <= 4 ) {
77
80
range = IIS3DWB_DT_FS_4G ;
78
- break ;
79
- case 8 :
81
+ } else if (fs <= 8 ) {
80
82
range = IIS3DWB_DT_FS_8G ;
81
- break ;
82
- case 16 :
83
+ } else if (fs <= 16 ) {
83
84
range = IIS3DWB_DT_FS_16G ;
84
- break ;
85
- default :
85
+ } else {
86
86
LOG_ERR ("fs [%d] not supported." , fs );
87
87
return - EINVAL ;
88
88
}
@@ -172,6 +172,8 @@ void iis3dwb_rtio_rd_transaction(const struct device *dev,
172
172
read_reg = rtio_sqe_acquire (rtio );
173
173
174
174
if (write_addr == NULL || read_reg == NULL ) {
175
+ rtio_iodev_sqe_err (iodev_sqe , - ENOMEM );
176
+ rtio_sqe_drop_all (rtio );
175
177
return ;
176
178
}
177
179
@@ -185,6 +187,8 @@ void iis3dwb_rtio_rd_transaction(const struct device *dev,
185
187
186
188
complete_op = rtio_sqe_acquire (rtio );
187
189
if (complete_op == NULL ) {
190
+ rtio_iodev_sqe_err (iodev_sqe , - ENOMEM );
191
+ rtio_sqe_drop_all (rtio );
188
192
return ;
189
193
}
190
194
@@ -210,6 +214,7 @@ static void iis3dwb_submit_one_shot(const struct device *dev, struct rtio_iodev_
210
214
rc = rtio_sqe_rx_buf (iodev_sqe , min_buf_len , min_buf_len , & buf , & buf_len );
211
215
if (rc != 0 ) {
212
216
LOG_ERR ("Failed to get a read buffer of size %u bytes" , min_buf_len );
217
+ rtio_iodev_sqe_err (iodev_sqe , - ENOMEM );
213
218
return ;
214
219
}
215
220
@@ -291,43 +296,28 @@ static void iis3dwb_submit_one_shot(const struct device *dev, struct rtio_iodev_
291
296
}
292
297
}
293
298
294
- if (edata -> has_accel == 0 ) {
299
+ if (edata -> has_accel == 0 && edata -> has_temp == 0 ) {
295
300
rtio_iodev_sqe_err (iodev_sqe , - EIO );
296
301
}
297
302
}
298
303
299
- void iis3dwb_submit_sync ( struct rtio_iodev_sqe * iodev_sqe )
304
+ void iis3dwb_submit ( const struct device * dev , struct rtio_iodev_sqe * iodev_sqe )
300
305
{
301
306
const struct sensor_read_config * cfg = iodev_sqe -> sqe .iodev -> data ;
302
- const struct device * dev = cfg -> sensor ;
303
307
304
308
if (!cfg -> is_streaming ) {
305
309
iis3dwb_submit_one_shot (dev , iodev_sqe );
310
+ } else if (IS_ENABLED (CONFIG_IIS3DWB_STREAM )) {
311
+ iis3dwb_submit_stream (dev , iodev_sqe );
306
312
} else {
307
313
rtio_iodev_sqe_err (iodev_sqe , - ENOTSUP );
308
314
}
309
315
}
310
316
311
- void iis3dwb_submit (const struct device * dev , struct rtio_iodev_sqe * iodev_sqe )
312
- {
313
- struct rtio_work_req * req = rtio_work_req_alloc ();
314
-
315
- if (req == NULL ) {
316
- LOG_ERR ("RTIO work item allocation failed. Consider to increase "
317
- "CONFIG_RTIO_WORKQ_POOL_ITEMS." );
318
- rtio_iodev_sqe_err (iodev_sqe , - ENOMEM );
319
- return ;
320
- }
321
-
322
- rtio_work_req_submit (req , iodev_sqe , iis3dwb_submit_sync );
323
- }
324
-
325
317
static DEVICE_API (sensor , iis3dwb_driver_api ) = {
326
318
.attr_set = iis3dwb_attr_set ,
327
- #ifdef CONFIG_SENSOR_ASYNC_API
328
319
.get_decoder = iis3dwb_get_decoder ,
329
320
.submit = iis3dwb_submit ,
330
- #endif
331
321
};
332
322
333
323
static int iis3dwb_init_chip (const struct device * dev )
@@ -350,9 +340,8 @@ static int iis3dwb_init_chip(const struct device *dev)
350
340
* Restore default configuration
351
341
*/
352
342
iis3dwb_reset_set (ctx , PROPERTY_ENABLE );
353
- do {
354
- iis3dwb_reset_get (ctx , & rst );
355
- } while (rst );
343
+ WAIT_FOR ((iis3dwb_reset_get (ctx , & rst ) == 0 ) && !rst ,
344
+ 100 * USEC_PER_MSEC , k_msleep (10 ));
356
345
357
346
/* Enable Block Data Update */
358
347
iis3dwb_block_data_update_set (ctx , PROPERTY_ENABLE );
@@ -371,6 +360,15 @@ static int iis3dwb_init(const struct device *dev)
371
360
return - EIO ;
372
361
}
373
362
363
+ #ifdef CONFIG_IIS3DWB_TRIGGER
364
+ if (cfg -> trig_enabled ) {
365
+ if (iis3dwb_init_interrupt (dev ) < 0 ) {
366
+ LOG_ERR ("Failed to initialize interrupt." );
367
+ return - EIO ;
368
+ }
369
+ }
370
+ #endif
371
+
374
372
/* set sensor default scale (used to convert sample values) */
375
373
LOG_DBG ("%s: range is %d" , dev -> name , cfg -> range );
376
374
ret = iis3dwb_set_range_raw (dev , cfg -> range );
@@ -406,6 +404,17 @@ static int iis3dwb_init(const struct device *dev)
406
404
DT_DRV_INST(inst), IIS3DWB_SPI_OPERATION, 0U); \
407
405
RTIO_DEFINE(iis3dwb_rtio_ctx_##inst, 8, 8);
408
406
407
+ #ifdef CONFIG_IIS3DWB_TRIGGER
408
+ #define IIS3DWB_CFG_IRQ (inst ) \
409
+ .trig_enabled = true, \
410
+ .int1_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int1_gpios, {0}), \
411
+ .int2_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int2_gpios, {0}), \
412
+ .drdy_pulsed = DT_INST_PROP(inst, drdy_pulsed), \
413
+ .drdy_pin = DT_INST_PROP(inst, drdy_pin),
414
+ #else
415
+ #define IIS3DWB_CFG_IRQ (inst )
416
+ #endif /* CONFIG_IIS3DWB_TRIGGER */
417
+
409
418
#define IIS3DWB_CONFIG (inst ) \
410
419
{ \
411
420
STMEMSC_CTX_SPI(&iis3dwb_config_##inst.stmemsc_cfg), \
@@ -417,6 +426,16 @@ static int iis3dwb_init(const struct device *dev)
417
426
.range = DT_INST_PROP(inst, range), \
418
427
.filter = DT_INST_PROP(inst, filter), \
419
428
.odr = DT_INST_PROP(inst, odr), \
429
+ \
430
+ IF_ENABLED(CONFIG_IIS3DWB_STREAM, \
431
+ (.fifo_wtm = DT_INST_PROP(inst, fifo_watermark), \
432
+ .accel_batch = DT_INST_PROP(inst, accel_fifo_batch_rate), \
433
+ .temp_batch = DT_INST_PROP(inst, temp_fifo_batch_rate), \
434
+ .ts_batch = DT_INST_PROP(inst, timestamp_fifo_batch_rate),)) \
435
+ \
436
+ IF_ENABLED(UTIL_OR(DT_INST_NODE_HAS_PROP(inst, int1_gpios), \
437
+ DT_INST_NODE_HAS_PROP(inst, int2_gpios)), \
438
+ (IIS3DWB_CFG_IRQ(inst))) \
420
439
}
421
440
422
441
#define IIS3DWB_DEFINE (inst ) \
0 commit comments