2023-04-08 01:12:05 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2023 Intel Corporation
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
2023-09-14 17:07:22 +08:00
|
|
|
#include <zephyr/rtio/rtio.h>
|
2023-04-08 01:12:05 +08:00
|
|
|
#include <zephyr/drivers/i2c.h>
|
|
|
|
#include <zephyr/rtio/rtio_spsc.h>
|
|
|
|
#include <zephyr/sys/__assert.h>
|
|
|
|
|
|
|
|
const struct rtio_iodev_api i2c_iodev_api = {
|
|
|
|
.submit = i2c_iodev_submit,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct rtio_sqe *i2c_rtio_copy(struct rtio *r,
|
|
|
|
struct rtio_iodev *iodev,
|
|
|
|
const struct i2c_msg *msgs,
|
|
|
|
uint8_t num_msgs)
|
|
|
|
{
|
|
|
|
__ASSERT(num_msgs > 0, "Expecting at least one message to copy");
|
|
|
|
|
|
|
|
struct rtio_sqe *sqe = NULL;
|
|
|
|
|
|
|
|
for (uint8_t i = 0; i < num_msgs; i++) {
|
|
|
|
sqe = rtio_sqe_acquire(r);
|
|
|
|
|
|
|
|
if (sqe == NULL) {
|
|
|
|
rtio_spsc_drop_all(r->sq);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msgs[i].flags & I2C_MSG_READ) {
|
|
|
|
rtio_sqe_prep_read(sqe, iodev, RTIO_PRIO_NORM,
|
|
|
|
msgs[i].buf, msgs[i].len, NULL);
|
|
|
|
} else {
|
|
|
|
rtio_sqe_prep_write(sqe, iodev, RTIO_PRIO_NORM,
|
|
|
|
msgs[i].buf, msgs[i].len, NULL);
|
|
|
|
}
|
|
|
|
sqe->flags |= RTIO_SQE_TRANSACTION;
|
|
|
|
sqe->iodev_flags = ((msgs[i].flags & I2C_MSG_STOP) ? RTIO_IODEV_I2C_STOP : 0) |
|
|
|
|
((msgs[i].flags & I2C_MSG_RESTART) ? RTIO_IODEV_I2C_RESTART : 0) |
|
|
|
|
((msgs[i].flags & I2C_MSG_ADDR_10_BITS) ? RTIO_IODEV_I2C_10_BITS : 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
sqe->flags &= ~RTIO_SQE_TRANSACTION;
|
|
|
|
|
|
|
|
return sqe;
|
|
|
|
}
|