|
21 | 21 |
|
22 | 22 | #include <zephyr/types.h> |
23 | 23 | #include <zephyr/device.h> |
| 24 | +#include <zephyr/rtio/rtio.h> |
24 | 25 | #include <errno.h> |
25 | 26 |
|
26 | 27 | #ifdef __cplusplus |
@@ -318,6 +319,10 @@ enum sensor_attribute { |
318 | 319 | * to the new sampling frequency. |
319 | 320 | */ |
320 | 321 | SENSOR_ATTR_FF_DUR, |
| 322 | + /** FIFO watermark attribute */ |
| 323 | + SENSOR_ATTR_FIFO_WATERMARK, |
| 324 | + /** FIFO enable/disable fifo related interrupts */ |
| 325 | + SENSOR_ATTR_FIFO_INTERRUPT, |
321 | 326 | /** |
322 | 327 | * Number of all common sensor attributes. |
323 | 328 | */ |
@@ -394,12 +399,48 @@ typedef int (*sensor_channel_get_t)(const struct device *dev, |
394 | 399 | enum sensor_channel chan, |
395 | 400 | struct sensor_value *val); |
396 | 401 |
|
| 402 | +#ifdef CONFIG_RTIO |
| 403 | + |
| 404 | +/** |
| 405 | + * @type sensor_fifo_iodev_t |
| 406 | + * @brief Callback API for obtaining a reference to a sensors FIFO iodev. |
| 407 | + */ |
| 408 | +typedef int (*sensor_fifo_iodev_t)(const struct device *dev, struct rtio_iodev **iodev_sqe); |
| 409 | + |
| 410 | +/** |
| 411 | + * @type sensor_fifo_read_t |
| 412 | + * @brief Callback API for immediately triggering a FIFO read. |
| 413 | + */ |
| 414 | +typedef int (*sensor_fifo_read_t)(const struct device *dev); |
| 415 | + |
| 416 | +/** |
| 417 | + * @type sensor_fifo_start_t |
| 418 | + * @brief Callback API to start FIFO streaming. |
| 419 | + */ |
| 420 | +typedef int (*sensor_fifo_start_t)(const struct device *dev); |
| 421 | + |
| 422 | +/** |
| 423 | + * @type sensor_fifo_stop_t |
| 424 | + * @brief Callback API to stop FIFO streaming. |
| 425 | + */ |
| 426 | +typedef int (*sensor_fifo_stop_t)(const struct device *dev); |
| 427 | + |
| 428 | + |
| 429 | +#endif /* CONFIG_RTIO */ |
| 430 | + |
397 | 431 | __subsystem struct sensor_driver_api { |
398 | 432 | sensor_attr_set_t attr_set; |
399 | 433 | sensor_attr_get_t attr_get; |
400 | 434 | sensor_trigger_set_t trigger_set; |
401 | 435 | sensor_sample_fetch_t sample_fetch; |
402 | 436 | sensor_channel_get_t channel_get; |
| 437 | + |
| 438 | +#ifdef CONFIG_RTIO |
| 439 | + sensor_fifo_iodev_t fifo_iodev; |
| 440 | + sensor_fifo_read_t fifo_read; |
| 441 | + sensor_fifo_start_t fifo_start; |
| 442 | + sensor_fifo_stop_t fifo_stop; |
| 443 | +#endif /* CONFIG_RTIO */ |
403 | 444 | }; |
404 | 445 |
|
405 | 446 | /** |
@@ -593,6 +634,70 @@ static inline int z_impl_sensor_channel_get(const struct device *dev, |
593 | 634 | return api->channel_get(dev, chan, val); |
594 | 635 | } |
595 | 636 |
|
| 637 | +/** |
| 638 | + * @brief Submit a request for the fifo stream (iodev) for this sensor. |
| 639 | + */ |
| 640 | +static inline int sensor_fifo_iodev(const struct device *dev, struct rtio_iodev **iodev) |
| 641 | +{ |
| 642 | +#ifdef CONFIG_RTIO |
| 643 | + |
| 644 | + const struct sensor_driver_api *api = |
| 645 | + (const struct sensor_driver_api *)dev->api; |
| 646 | + |
| 647 | + return api->fifo_iodev(dev, iodev); |
| 648 | +#else |
| 649 | + return -ENOSYS; |
| 650 | +#endif |
| 651 | +} |
| 652 | + |
| 653 | +/** |
| 654 | + * @brief Checkin a rtio_iodev pointer for this sensor, only one per device. |
| 655 | + */ |
| 656 | +static inline int sensor_fifo_read(const struct device *dev) |
| 657 | +{ |
| 658 | +#ifdef CONFIG_RTIO |
| 659 | + |
| 660 | + const struct sensor_driver_api *api = |
| 661 | + (const struct sensor_driver_api *)dev->api; |
| 662 | + |
| 663 | + return api->fifo_read(dev); |
| 664 | +#else |
| 665 | + return -ENOSYS; |
| 666 | +#endif |
| 667 | +} |
| 668 | + |
| 669 | +/** |
| 670 | + * @brief Start streaming the fifo for this sensor. |
| 671 | + */ |
| 672 | +static inline int sensor_fifo_start(const struct device *dev) |
| 673 | +{ |
| 674 | +#ifdef CONFIG_RTIO |
| 675 | + |
| 676 | + const struct sensor_driver_api *api = |
| 677 | + (const struct sensor_driver_api *)dev->api; |
| 678 | + |
| 679 | + return api->fifo_start(dev); |
| 680 | +#else |
| 681 | + return -ENOSYS; |
| 682 | +#endif |
| 683 | +} |
| 684 | + |
| 685 | +/** |
| 686 | + * @brief Stop streaming the fifo for this sensor. |
| 687 | + */ |
| 688 | +static inline int sensor_fifo_stop(const struct device *dev) |
| 689 | +{ |
| 690 | +#ifdef CONFIG_RTIO |
| 691 | + |
| 692 | + const struct sensor_driver_api *api = |
| 693 | + (const struct sensor_driver_api *)dev->api; |
| 694 | + |
| 695 | + return api->fifo_stop(dev); |
| 696 | +#else |
| 697 | + return -ENOSYS; |
| 698 | +#endif |
| 699 | +} |
| 700 | + |
596 | 701 | /** |
597 | 702 | * @brief The value of gravitational constant in micro m/s^2. |
598 | 703 | */ |
|
0 commit comments