1 /*
2 * Copyright (c) 2025 Croxel Inc.
3 * Copyright (c) 2025 CogniPilot Foundation
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #ifndef ZEPHYR_DRIVERS_SENSOR_ICM45686_BUS_H_
9 #define ZEPHYR_DRIVERS_SENSOR_ICM45686_BUS_H_
10
11 #include <stdint.h>
12 #include <zephyr/rtio/rtio.h>
13
14 #include "icm45686.h"
15 #include "icm45686_reg.h"
16
icm45686_bus_read(const struct device * dev,uint8_t reg,uint8_t * buf,uint16_t len)17 static inline int icm45686_bus_read(const struct device *dev,
18 uint8_t reg,
19 uint8_t *buf,
20 uint16_t len)
21 {
22 struct icm45686_data *data = dev->data;
23 struct rtio *ctx = data->rtio.ctx;
24 struct rtio_iodev *iodev = data->rtio.iodev;
25 struct rtio_sqe *write_sqe = rtio_sqe_acquire(ctx);
26 struct rtio_sqe *read_sqe = rtio_sqe_acquire(ctx);
27 struct rtio_cqe *cqe;
28 int err;
29
30 if (!write_sqe || !read_sqe) {
31 return -ENOMEM;
32 }
33
34 reg = reg | REG_SPI_READ_BIT;
35
36 rtio_sqe_prep_write(write_sqe, iodev, RTIO_PRIO_HIGH, ®, 1, NULL);
37 write_sqe->flags |= RTIO_SQE_TRANSACTION;
38 rtio_sqe_prep_read(read_sqe, iodev, RTIO_PRIO_HIGH, buf, len, NULL);
39
40 err = rtio_submit(ctx, 2);
41 if (err) {
42 return err;
43 }
44
45 do {
46 cqe = rtio_cqe_consume(ctx);
47 if (cqe != NULL) {
48 err = cqe->result;
49 rtio_cqe_release(ctx, cqe);
50 }
51 } while (cqe != NULL);
52
53 return err;
54 }
55
icm45686_bus_write(const struct device * dev,uint8_t reg,const uint8_t * buf,uint16_t len)56 static inline int icm45686_bus_write(const struct device *dev,
57 uint8_t reg,
58 const uint8_t *buf,
59 uint16_t len)
60 {
61 struct icm45686_data *data = dev->data;
62 struct rtio *ctx = data->rtio.ctx;
63 struct rtio_iodev *iodev = data->rtio.iodev;
64 struct rtio_sqe *write_reg_sqe = rtio_sqe_acquire(ctx);
65 struct rtio_sqe *write_buf_sqe = rtio_sqe_acquire(ctx);
66 struct rtio_cqe *cqe;
67 int err;
68
69 if (!write_reg_sqe || !write_buf_sqe) {
70 return -ENOMEM;
71 }
72
73 rtio_sqe_prep_write(write_reg_sqe, iodev, RTIO_PRIO_HIGH, ®, 1, NULL);
74 write_reg_sqe->flags |= RTIO_SQE_TRANSACTION;
75 rtio_sqe_prep_write(write_buf_sqe, iodev, RTIO_PRIO_HIGH, buf, len, NULL);
76
77 err = rtio_submit(ctx, 2);
78 if (err) {
79 return err;
80 }
81
82 do {
83 cqe = rtio_cqe_consume(ctx);
84 if (cqe != NULL) {
85 err = cqe->result;
86 rtio_cqe_release(ctx, cqe);
87 }
88 } while (cqe != NULL);
89
90 return err;
91 }
92
93 #endif /* ZEPHYR_DRIVERS_SENSOR_ICM45686_BUS_H_ */
94