Zephyr API Documentation  3.6.0
A Scalable Open Source RTOS
3.6.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
spi.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12#ifndef ZEPHYR_INCLUDE_DRIVERS_SPI_H_
13#define ZEPHYR_INCLUDE_DRIVERS_SPI_H_
14
22#include <zephyr/types.h>
23#include <stddef.h>
24#include <zephyr/device.h>
26#include <zephyr/drivers/gpio.h>
27#include <zephyr/kernel.h>
28#include <zephyr/sys/__assert.h>
29#include <zephyr/rtio/rtio.h>
30#include <zephyr/stats/stats.h>
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
40#define SPI_OP_MODE_MASTER 0U
41#define SPI_OP_MODE_SLAVE BIT(0)
43#define SPI_OP_MODE_MASK 0x1U
46#define SPI_OP_MODE_GET(_operation_) ((_operation_) & SPI_OP_MODE_MASK)
59#define SPI_MODE_CPOL BIT(1)
60
68#define SPI_MODE_CPHA BIT(2)
69
75#define SPI_MODE_LOOP BIT(3)
77#define SPI_MODE_MASK (0xEU)
80#define SPI_MODE_GET(_mode_) \
81 ((_mode_) & SPI_MODE_MASK)
82
89#define SPI_TRANSFER_MSB (0U)
90#define SPI_TRANSFER_LSB BIT(4)
98#define SPI_WORD_SIZE_SHIFT (5U)
99#define SPI_WORD_SIZE_MASK (0x3FU << SPI_WORD_SIZE_SHIFT)
102#define SPI_WORD_SIZE_GET(_operation_) \
103 (((_operation_) & SPI_WORD_SIZE_MASK) >> SPI_WORD_SIZE_SHIFT)
105#define SPI_WORD_SET(_word_size_) \
106 ((_word_size_) << SPI_WORD_SIZE_SHIFT)
114#define SPI_HOLD_ON_CS BIT(12)
120#define SPI_LOCK_ON BIT(13)
121
129#define SPI_CS_ACTIVE_HIGH BIT(14)
141#define SPI_LINES_SINGLE (0U << 16)
142#define SPI_LINES_DUAL (1U << 16)
143#define SPI_LINES_QUAD (2U << 16)
144#define SPI_LINES_OCTAL (3U << 16)
146#define SPI_LINES_MASK (0x3U << 16)
171};
172
210#define SPI_CS_GPIOS_DT_SPEC_GET(spi_dev) \
211 GPIO_DT_SPEC_GET_BY_IDX_OR(DT_BUS(spi_dev), cs_gpios, \
212 DT_REG_ADDR(spi_dev), {})
213
223#define SPI_CS_GPIOS_DT_SPEC_INST_GET(inst) \
224 SPI_CS_GPIOS_DT_SPEC_GET(DT_DRV_INST(inst))
225
264#define SPI_CS_CONTROL_INIT(node_id, delay_) \
265 { \
266 .gpio = SPI_CS_GPIOS_DT_SPEC_GET(node_id), \
267 .delay = (delay_), \
268 }
269
283#define SPI_CS_CONTROL_INIT_INST(inst, delay_) \
284 SPI_CS_CONTROL_INIT(DT_DRV_INST(inst), delay_)
285
290#if defined(CONFIG_SPI_EXTENDED_MODES)
292#else
294#endif
295
330};
331
345#define SPI_CONFIG_DT(node_id, operation_, delay_) \
346 { \
347 .frequency = DT_PROP(node_id, spi_max_frequency), \
348 .operation = (operation_) | \
349 DT_PROP(node_id, duplex) | \
350 DT_PROP(node_id, frame_format) | \
351 COND_CODE_1(DT_PROP(node_id, spi_cpol), SPI_MODE_CPOL, (0)) | \
352 COND_CODE_1(DT_PROP(node_id, spi_cpha), SPI_MODE_CPHA, (0)) | \
353 COND_CODE_1(DT_PROP(node_id, spi_hold_cs), SPI_HOLD_ON_CS, (0)), \
354 .slave = DT_REG_ADDR(node_id), \
355 .cs = SPI_CS_CONTROL_INIT(node_id, delay_), \
356 }
357
369#define SPI_CONFIG_DT_INST(inst, operation_, delay_) \
370 SPI_CONFIG_DT(DT_DRV_INST(inst), operation_, delay_)
371
377 const struct device *bus;
380};
381
400#define SPI_DT_SPEC_GET(node_id, operation_, delay_) \
401 { \
402 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
403 .config = SPI_CONFIG_DT(node_id, operation_, delay_) \
404 }
405
417#define SPI_DT_SPEC_INST_GET(inst, operation_, delay_) \
418 SPI_DT_SPEC_GET(DT_DRV_INST(inst), operation_, delay_)
419
423struct spi_buf {
425 void *buf;
430 size_t len;
431};
432
438 const struct spi_buf *buffers;
440 size_t count;
441};
442
443#if defined(CONFIG_SPI_STATS)
445STATS_SECT_ENTRY32(rx_bytes)
446STATS_SECT_ENTRY32(tx_bytes)
447STATS_SECT_ENTRY32(transfer_error)
449
451STATS_NAME(spi, rx_bytes)
452STATS_NAME(spi, tx_bytes)
453STATS_NAME(spi, transfer_error)
454STATS_NAME_END(spi);
455
459struct spi_device_state {
460 struct device_state devstate;
461 struct stats_spi stats;
462};
463
467#define Z_SPI_GET_STATS(dev_) \
468 CONTAINER_OF(dev_->state, struct spi_device_state, devstate)->stats
469
475#define SPI_STATS_RX_BYTES_INCN(dev_, n) \
476 STATS_INCN(Z_SPI_GET_STATS(dev_), rx_bytes, n)
477
483#define SPI_STATS_TX_BYTES_INCN(dev_, n) \
484 STATS_INCN(Z_SPI_GET_STATS(dev_), tx_bytes, n)
485
493#define SPI_STATS_TRANSFER_ERROR_INC(dev_) \
494 STATS_INC(Z_SPI_GET_STATS(dev_), transfer_error)
495
499#define Z_SPI_DEVICE_STATE_DEFINE(dev_id) \
500 static struct spi_device_state Z_DEVICE_STATE_NAME(dev_id) \
501 __attribute__((__section__(".z_devstate")));
502
509#define Z_SPI_INIT_FN(dev_id, init_fn) \
510 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
511 { \
512 struct spi_device_state *state = \
513 CONTAINER_OF(dev->state, struct spi_device_state, devstate); \
514 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 3, \
515 STATS_NAME_INIT_PARMS(spi)); \
516 stats_register(dev->name, &(state->stats.s_hdr)); \
517 return init_fn(dev); \
518 }
519
539#define SPI_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
540 data_ptr, cfg_ptr, level, prio, \
541 api_ptr, ...) \
542 Z_SPI_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
543 Z_SPI_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
544 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
545 DEVICE_DT_NAME(node_id), \
546 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
547 pm_device, \
548 data_ptr, cfg_ptr, level, prio, \
549 api_ptr, \
550 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
551 __VA_ARGS__)
552
553static inline void spi_transceive_stats(const struct device *dev, int error,
554 const struct spi_buf_set *tx_bufs,
555 const struct spi_buf_set *rx_bufs)
556{
557 uint32_t tx_bytes;
558 uint32_t rx_bytes;
559
560 if (error) {
562 }
563
564 if (tx_bufs) {
565 tx_bytes = tx_bufs->count ? tx_bufs->buffers->len : 0;
566 SPI_STATS_TX_BYTES_INCN(dev, tx_bytes);
567 }
568
569 if (rx_bufs) {
570 rx_bytes = rx_bufs->count ? rx_bufs->buffers->len : 0;
571 SPI_STATS_RX_BYTES_INCN(dev, rx_bytes);
572 }
573}
574
575#else /*CONFIG_SPI_STATS*/
576
577#define SPI_DEVICE_DT_DEFINE(node_id, init_fn, pm, \
578 data, config, level, prio, \
579 api, ...) \
580 Z_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
581 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
582 DEVICE_DT_NAME(node_id), init_fn, pm, data, config, \
583 level, prio, api, \
584 &Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)), \
585 __VA_ARGS__)
586
587#define SPI_STATS_RX_BYTES_INC(dev_)
588#define SPI_STATS_TX_BYTES_INC(dev_)
589#define SPI_STATS_TRANSFER_ERROR_INC(dev_)
590
591#define spi_transceive_stats(dev, error, tx_bufs, rx_bufs)
592
593#endif /*CONFIG_SPI_STATS*/
594
600typedef int (*spi_api_io)(const struct device *dev,
601 const struct spi_config *config,
602 const struct spi_buf_set *tx_bufs,
603 const struct spi_buf_set *rx_bufs);
604
612typedef void (*spi_callback_t)(const struct device *dev, int result, void *data);
613
619typedef int (*spi_api_io_async)(const struct device *dev,
620 const struct spi_config *config,
621 const struct spi_buf_set *tx_bufs,
622 const struct spi_buf_set *rx_bufs,
624 void *userdata);
625
626#if defined(CONFIG_SPI_RTIO) || defined(DOXYGEN)
627
632typedef void (*spi_api_iodev_submit)(const struct device *dev,
633 struct rtio_iodev_sqe *iodev_sqe);
634#endif /* CONFIG_SPI_RTIO */
635
641typedef int (*spi_api_release)(const struct device *dev,
642 const struct spi_config *config);
643
644
649__subsystem struct spi_driver_api {
651#ifdef CONFIG_SPI_ASYNC
652 spi_api_io_async transceive_async;
653#endif /* CONFIG_SPI_ASYNC */
654#ifdef CONFIG_SPI_RTIO
655 spi_api_iodev_submit iodev_submit;
656#endif /* CONFIG_SPI_RTIO */
658};
659
667static inline bool spi_cs_is_gpio(const struct spi_config *config)
668{
669 return config->cs.gpio.port != NULL;
670}
671
679static inline bool spi_cs_is_gpio_dt(const struct spi_dt_spec *spec)
680{
681 return spi_cs_is_gpio(&spec->config);
682}
683
692__deprecated
693static inline bool spi_is_ready(const struct spi_dt_spec *spec)
694{
695 /* Validate bus is ready */
696 if (!device_is_ready(spec->bus)) {
697 return false;
698 }
699 /* Validate CS gpio port is ready, if it is used */
700 if (spi_cs_is_gpio_dt(spec) &&
701 !gpio_is_ready_dt(&spec->config.cs.gpio)) {
702 return false;
703 }
704 return true;
705}
706
715static inline bool spi_is_ready_dt(const struct spi_dt_spec *spec)
716{
717 /* Validate bus is ready */
718 if (!device_is_ready(spec->bus)) {
719 return false;
720 }
721 /* Validate CS gpio port is ready, if it is used */
722 if (spi_cs_is_gpio_dt(spec) &&
723 !gpio_is_ready_dt(&spec->config.cs.gpio)) {
724 return false;
725 }
726 return true;
727}
728
747__syscall int spi_transceive(const struct device *dev,
748 const struct spi_config *config,
749 const struct spi_buf_set *tx_bufs,
750 const struct spi_buf_set *rx_bufs);
751
752static inline int z_impl_spi_transceive(const struct device *dev,
753 const struct spi_config *config,
754 const struct spi_buf_set *tx_bufs,
755 const struct spi_buf_set *rx_bufs)
756{
757 const struct spi_driver_api *api =
758 (const struct spi_driver_api *)dev->api;
759 int ret;
760
761 ret = api->transceive(dev, config, tx_bufs, rx_bufs);
762 spi_transceive_stats(dev, ret, tx_bufs, rx_bufs);
763
764 return ret;
765}
766
782static inline int spi_transceive_dt(const struct spi_dt_spec *spec,
783 const struct spi_buf_set *tx_bufs,
784 const struct spi_buf_set *rx_bufs)
785{
786 return spi_transceive(spec->bus, &spec->config, tx_bufs, rx_bufs);
787}
788
806static inline int spi_read(const struct device *dev,
807 const struct spi_config *config,
808 const struct spi_buf_set *rx_bufs)
809{
810 return spi_transceive(dev, config, NULL, rx_bufs);
811}
812
825static inline int spi_read_dt(const struct spi_dt_spec *spec,
826 const struct spi_buf_set *rx_bufs)
827{
828 return spi_read(spec->bus, &spec->config, rx_bufs);
829}
830
847static inline int spi_write(const struct device *dev,
848 const struct spi_config *config,
849 const struct spi_buf_set *tx_bufs)
850{
851 return spi_transceive(dev, config, tx_bufs, NULL);
852}
853
866static inline int spi_write_dt(const struct spi_dt_spec *spec,
867 const struct spi_buf_set *tx_bufs)
868{
869 return spi_write(spec->bus, &spec->config, tx_bufs);
870}
871
872#if defined(CONFIG_SPI_ASYNC) || defined(__DOXYGEN__)
873
900static inline int spi_transceive_cb(const struct device *dev,
901 const struct spi_config *config,
902 const struct spi_buf_set *tx_bufs,
903 const struct spi_buf_set *rx_bufs,
904 spi_callback_t callback,
905 void *userdata)
906{
907 const struct spi_driver_api *api =
908 (const struct spi_driver_api *)dev->api;
909
910 return api->transceive_async(dev, config, tx_bufs, rx_bufs, callback, userdata);
911}
912
913#if defined(CONFIG_POLL) || defined(__DOXYGEN__)
914
916void z_spi_transfer_signal_cb(const struct device *dev, int result, void *userdata);
944static inline int spi_transceive_signal(const struct device *dev,
945 const struct spi_config *config,
946 const struct spi_buf_set *tx_bufs,
947 const struct spi_buf_set *rx_bufs,
948 struct k_poll_signal *sig)
949{
950 const struct spi_driver_api *api =
951 (const struct spi_driver_api *)dev->api;
952 spi_callback_t cb = (sig == NULL) ? NULL : z_spi_transfer_signal_cb;
953
954 return api->transceive_async(dev, config, tx_bufs, rx_bufs, cb, sig);
955}
956
962__deprecated static inline int spi_transceive_async(const struct device *dev,
963 const struct spi_config *config,
964 const struct spi_buf_set *tx_bufs,
965 const struct spi_buf_set *rx_bufs,
966 struct k_poll_signal *sig)
967{
968 return spi_transceive_signal(dev, config, tx_bufs, rx_bufs, sig);
969}
970
995static inline int spi_read_signal(const struct device *dev,
996 const struct spi_config *config,
997 const struct spi_buf_set *rx_bufs,
998 struct k_poll_signal *sig)
999{
1000 return spi_transceive_signal(dev, config, NULL, rx_bufs, sig);
1001}
1002
1008__deprecated static inline int spi_read_async(const struct device *dev,
1009 const struct spi_config *config,
1010 const struct spi_buf_set *rx_bufs,
1011 struct k_poll_signal *sig)
1012{
1013 return spi_read_signal(dev, config, rx_bufs, sig);
1014}
1015
1039static inline int spi_write_signal(const struct device *dev,
1040 const struct spi_config *config,
1041 const struct spi_buf_set *tx_bufs,
1042 struct k_poll_signal *sig)
1043{
1044 return spi_transceive_signal(dev, config, tx_bufs, NULL, sig);
1045}
1046
1052__deprecated static inline int spi_write_async(const struct device *dev,
1053 const struct spi_config *config,
1054 const struct spi_buf_set *tx_bufs,
1055 struct k_poll_signal *sig)
1056{
1057 return spi_write_signal(dev, config, tx_bufs, sig);
1058}
1059
1060#endif /* CONFIG_POLL */
1061
1062#endif /* CONFIG_SPI_ASYNC */
1063
1064
1065#if defined(CONFIG_SPI_RTIO) || defined(__DOXYGEN__)
1066
1074static inline void spi_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
1075{
1076 const struct spi_dt_spec *dt_spec = iodev_sqe->sqe.iodev->data;
1077 const struct device *dev = dt_spec->bus;
1078 const struct spi_driver_api *api = (const struct spi_driver_api *)dev->api;
1079
1080 api->iodev_submit(dt_spec->bus, iodev_sqe);
1081}
1082
1083extern const struct rtio_iodev_api spi_iodev_api;
1084
1096#define SPI_DT_IODEV_DEFINE(name, node_id, operation_, delay_) \
1097 const struct spi_dt_spec _spi_dt_spec_##name = \
1098 SPI_DT_SPEC_GET(node_id, operation_, delay_); \
1099 RTIO_IODEV_DEFINE(name, &spi_iodev_api, (void *)&_spi_dt_spec_##name)
1100
1109static inline bool spi_is_ready_iodev(const struct rtio_iodev *spi_iodev)
1110{
1111 struct spi_dt_spec *spec = spi_iodev->data;
1112
1113 return spi_is_ready_dt(spec);
1114}
1115
1128static inline int spi_rtio_copy(struct rtio *r,
1129 struct rtio_iodev *iodev,
1130 const struct spi_buf_set *tx_bufs,
1131 const struct spi_buf_set *rx_bufs,
1132 struct rtio_sqe **last_sqe)
1133{
1134 int ret = 0;
1135 size_t tx_count = tx_bufs ? tx_bufs->count : 0;
1136 size_t rx_count = rx_bufs ? rx_bufs->count : 0;
1137
1138 uint32_t tx = 0, tx_len = 0;
1139 uint32_t rx = 0, rx_len = 0;
1140 uint8_t *tx_buf, *rx_buf;
1141
1142 struct rtio_sqe *sqe = NULL;
1143
1144 if (tx < tx_count) {
1145 tx_buf = tx_bufs->buffers[tx].buf;
1146 tx_len = tx_bufs->buffers[tx].len;
1147 } else {
1148 tx_buf = NULL;
1149 tx_len = rx_bufs->buffers[rx].len;
1150 }
1151
1152 if (rx < rx_count) {
1153 rx_buf = rx_bufs->buffers[rx].buf;
1154 rx_len = rx_bufs->buffers[rx].len;
1155 } else {
1156 rx_buf = NULL;
1157 rx_len = tx_bufs->buffers[tx].len;
1158 }
1159
1160
1161 while ((tx < tx_count || rx < rx_count) && (tx_len > 0 || rx_len > 0)) {
1162 sqe = rtio_sqe_acquire(r);
1163
1164 if (sqe == NULL) {
1165 ret = -ENOMEM;
1167 goto out;
1168 }
1169
1170 ret++;
1171
1172 /* If tx/rx len are same, we can do a simple transceive */
1173 if (tx_len == rx_len) {
1174 if (tx_buf == NULL) {
1176 rx_buf, rx_len, NULL);
1177 } else if (rx_buf == NULL) {
1179 tx_buf, tx_len, NULL);
1180 } else {
1182 tx_buf, rx_buf, rx_len, NULL);
1183 }
1184 tx++;
1185 rx++;
1186 if (rx < rx_count) {
1187 rx_buf = rx_bufs->buffers[rx].buf;
1188 rx_len = rx_bufs->buffers[rx].len;
1189 } else {
1190 rx_buf = NULL;
1191 rx_len = 0;
1192 }
1193 if (tx < tx_count) {
1194 tx_buf = tx_bufs->buffers[tx].buf;
1195 tx_len = tx_bufs->buffers[tx].len;
1196 } else {
1197 tx_buf = NULL;
1198 tx_len = 0;
1199 }
1200 } else if (tx_len == 0) {
1202 (uint8_t *)rx_buf,
1203 (uint32_t)rx_len,
1204 NULL);
1205 rx++;
1206 if (rx < rx_count) {
1207 rx_buf = rx_bufs->buffers[rx].buf;
1208 rx_len = rx_bufs->buffers[rx].len;
1209 } else {
1210 rx_buf = NULL;
1211 rx_len = 0;
1212 }
1213 } else if (rx_len == 0) {
1215 (uint8_t *)tx_buf,
1216 (uint32_t)tx_len,
1217 NULL);
1218 tx++;
1219 if (tx < tx_count) {
1220 tx_buf = rx_bufs->buffers[rx].buf;
1221 tx_len = rx_bufs->buffers[rx].len;
1222 } else {
1223 tx_buf = NULL;
1224 tx_len = 0;
1225 }
1226 } else if (tx_len > rx_len) {
1228 (uint8_t *)tx_buf,
1229 (uint8_t *)rx_buf,
1230 (uint32_t)rx_len,
1231 NULL);
1232 tx_len -= rx_len;
1233 tx_buf += rx_len;
1234 rx++;
1235 if (rx < rx_count) {
1236 rx_buf = rx_bufs->buffers[rx].buf;
1237 rx_len = rx_bufs->buffers[rx].len;
1238 } else {
1239 rx_buf = NULL;
1240 rx_len = tx_len;
1241 }
1242 } else if (rx_len > tx_len) {
1244 (uint8_t *)tx_buf,
1245 (uint8_t *)rx_buf,
1246 (uint32_t)tx_len,
1247 NULL);
1248 rx_len -= tx_len;
1249 rx_buf += tx_len;
1250 tx++;
1251 if (tx < tx_count) {
1252 tx_buf = tx_bufs->buffers[tx].buf;
1253 tx_len = tx_bufs->buffers[tx].len;
1254 } else {
1255 tx_buf = NULL;
1256 tx_len = rx_len;
1257 }
1258 } else {
1259 __ASSERT_NO_MSG("Invalid spi_rtio_copy state");
1260 }
1261
1263 }
1264
1265 if (sqe != NULL) {
1266 sqe->flags = 0;
1267 *last_sqe = sqe;
1268 }
1269
1270out:
1271 return ret;
1272}
1273
1274#endif /* CONFIG_SPI_RTIO */
1275
1296__syscall int spi_release(const struct device *dev,
1297 const struct spi_config *config);
1298
1299static inline int z_impl_spi_release(const struct device *dev,
1300 const struct spi_config *config)
1301{
1302 const struct spi_driver_api *api =
1303 (const struct spi_driver_api *)dev->api;
1304
1305 return api->release(dev, config);
1306}
1307
1319static inline int spi_release_dt(const struct spi_dt_spec *spec)
1320{
1321 return spi_release(spec->bus, &spec->config);
1322}
1323
1324#ifdef __cplusplus
1325}
1326#endif
1327
1332#include <syscalls/spi.h>
1333
1334#endif /* ZEPHYR_INCLUDE_DRIVERS_SPI_H_ */
workaround assembler barfing for ST r
Definition: asm-macro-32-bit-gnu.h:24
Public APIs for GPIO drivers.
bool device_is_ready(const struct device *dev)
Verify that a device is ready for use.
static bool gpio_is_ready_dt(const struct gpio_dt_spec *spec)
Validate that GPIO port is ready.
Definition: gpio.h:831
#define RTIO_SQE_TRANSACTION
The next request in the queue is part of a transaction.
Definition: rtio.h:106
#define RTIO_PRIO_NORM
Normal priority.
Definition: rtio.h:68
static void rtio_sqe_prep_transceive(struct rtio_sqe *sqe, const struct rtio_iodev *iodev, int8_t prio, uint8_t *tx_buf, uint8_t *rx_buf, uint32_t buf_len, void *userdata)
Prepare a transceive op submission.
Definition: rtio.h:599
static void rtio_sqe_prep_read(struct rtio_sqe *sqe, const struct rtio_iodev *iodev, int8_t prio, uint8_t *buf, uint32_t len, void *userdata)
Prepare a read op submission.
Definition: rtio.h:490
static struct rtio_sqe * rtio_sqe_acquire(struct rtio *r)
Acquire a single submission queue event if available.
Definition: rtio.h:895
static void rtio_sqe_drop_all(struct rtio *r)
Drop all previously acquired sqe.
Definition: rtio.h:913
static void rtio_sqe_prep_write(struct rtio_sqe *sqe, const struct rtio_iodev *iodev, int8_t prio, uint8_t *buf, uint32_t len, void *userdata)
Prepare a write op submission.
Definition: rtio.h:530
int(* spi_api_io_async)(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs, spi_callback_t cb, void *userdata)
Definition: spi.h:619
uint16_t spi_operation_t
Opaque type to hold the SPI operation flags.
Definition: spi.h:293
int spi_release(const struct device *dev, const struct spi_config *config)
Release the SPI device locked on and/or the CS by the current config.
void(* spi_callback_t)(const struct device *dev, int result, void *data)
SPI callback for asynchronous transfer requests.
Definition: spi.h:612
static int spi_write_dt(const struct spi_dt_spec *spec, const struct spi_buf_set *tx_bufs)
Write data to a SPI bus specified in spi_dt_spec.
Definition: spi.h:866
static bool spi_is_ready_dt(const struct spi_dt_spec *spec)
Validate that SPI bus (and CS gpio if defined) is ready.
Definition: spi.h:715
static int spi_write_async(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, struct k_poll_signal *sig)
Alias for spi_write_signal for backwards compatibility.
Definition: spi.h:1052
static int spi_transceive_signal(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs, struct k_poll_signal *sig)
Read/write the specified amount of data from the SPI driver.
Definition: spi.h:944
static int spi_read(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *rx_bufs)
Read the specified amount of data from the SPI driver.
Definition: spi.h:806
static int spi_read_async(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *rx_bufs, struct k_poll_signal *sig)
Alias for spi_read_signal for backwards compatibility.
Definition: spi.h:1008
static int spi_transceive_dt(const struct spi_dt_spec *spec, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs)
Read/write data from an SPI bus specified in spi_dt_spec.
Definition: spi.h:782
static int spi_transceive_cb(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs, spi_callback_t callback, void *userdata)
Read/write the specified amount of data from the SPI driver.
Definition: spi.h:900
#define SPI_STATS_TRANSFER_ERROR_INC(dev_)
Definition: spi.h:589
static int spi_read_dt(const struct spi_dt_spec *spec, const struct spi_buf_set *rx_bufs)
Read data from a SPI bus specified in spi_dt_spec.
Definition: spi.h:825
static bool spi_is_ready(const struct spi_dt_spec *spec)
Validate that SPI bus is ready.
Definition: spi.h:693
static int spi_write(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs)
Write the specified amount of data from the SPI driver.
Definition: spi.h:847
static int spi_rtio_copy(struct rtio *r, struct rtio_iodev *iodev, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs, struct rtio_sqe **last_sqe)
Copy the tx_bufs and rx_bufs into a set of RTIO requests.
Definition: spi.h:1128
static int spi_release_dt(const struct spi_dt_spec *spec)
Release the SPI device specified in spi_dt_spec.
Definition: spi.h:1319
int(* spi_api_release)(const struct device *dev, const struct spi_config *config)
Callback API for unlocking SPI device.
Definition: spi.h:641
static void spi_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
Submit a SPI device with a request.
Definition: spi.h:1074
static int spi_read_signal(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *rx_bufs, struct k_poll_signal *sig)
Read the specified amount of data from the SPI driver.
Definition: spi.h:995
int(* spi_api_io)(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs)
Callback API for I/O See spi_transceive() for argument descriptions.
Definition: spi.h:600
static bool spi_cs_is_gpio_dt(const struct spi_dt_spec *spec)
Check if SPI CS in spi_dt_spec is controlled using a GPIO.
Definition: spi.h:679
static int spi_transceive_async(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs, struct k_poll_signal *sig)
Alias for spi_transceive_signal for backwards compatibility.
Definition: spi.h:962
const struct rtio_iodev_api spi_iodev_api
int spi_transceive(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs)
Read/write the specified amount of data from the SPI driver.
#define spi_transceive_stats(dev, error, tx_bufs, rx_bufs)
Definition: spi.h:591
static int spi_write_signal(const struct device *dev, const struct spi_config *config, const struct spi_buf_set *tx_bufs, struct k_poll_signal *sig)
Write the specified amount of data from the SPI driver.
Definition: spi.h:1039
static bool spi_cs_is_gpio(const struct spi_config *config)
Check if SPI CS is controlled using a GPIO.
Definition: spi.h:667
static bool spi_is_ready_iodev(const struct rtio_iodev *spi_iodev)
Validate that SPI bus (and CS gpio if defined) is ready.
Definition: spi.h:1109
#define ENOMEM
Not enough core.
Definition: errno.h:51
Public kernel APIs.
Real-Time IO device API for moving bytes with low effort.
Statistics.
#define STATS_NAME_END(name__)
Definition: stats.h:391
#define STATS_NAME(name__, entry__)
Definition: stats.h:390
#define STATS_SECT_END
Ends a stats group struct definition.
Definition: stats.h:89
#define STATS_SECT_ENTRY32(var__)
Definition: stats.h:359
#define STATS_NAME_START(name__)
Definition: stats.h:389
#define STATS_SECT_START(group__)
Definition: stats.h:354
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
Runtime device dynamic structure (in RAM) per driver instance.
Definition: device.h:358
Runtime device structure (in ROM) per driver instance.
Definition: device.h:387
void * data
Address of the device instance private data.
Definition: device.h:397
const void * api
Address of the API structure exposed by the device instance.
Definition: device.h:393
Container for GPIO pin information specified in devicetree.
Definition: gpio.h:286
const struct device * port
GPIO device controlling the pin.
Definition: gpio.h:288
Definition: kernel.h:5622
API that an RTIO IO device should implement.
Definition: rtio.h:429
Compute the mempool block index for a given pointer.
Definition: rtio.h:419
struct rtio_sqe sqe
Definition: rtio.h:420
An IO device with a function table for submitting requests.
Definition: rtio.h:444
void * data
Definition: rtio.h:452
A submission queue event.
Definition: rtio.h:230
uint8_t * tx_buf
Definition: rtio.h:275
uint8_t * rx_buf
Definition: rtio.h:276
const struct rtio_iodev * iodev
Device to operation on.
Definition: rtio.h:241
uint16_t flags
Op Flags.
Definition: rtio.h:235
An RTIO context containing what can be viewed as a pair of queues.
Definition: rtio.h:323
SPI buffer array structure.
Definition: spi.h:436
const struct spi_buf * buffers
Pointer to an array of spi_buf, or NULL.
Definition: spi.h:438
size_t count
Length of the array pointed by buffers.
Definition: spi.h:440
SPI buffer structure.
Definition: spi.h:423
size_t len
Length of the buffer buf.
Definition: spi.h:430
void * buf
Valid pointer to a data buffer, or NULL otherwise.
Definition: spi.h:425
SPI controller configuration structure.
Definition: spi.h:299
uint16_t slave
Slave number from 0 to host controller slave limit.
Definition: spi.h:324
struct spi_cs_control cs
GPIO chip-select line (optional, must be initialized to zero if not used).
Definition: spi.h:329
spi_operation_t operation
Operation flags.
Definition: spi.h:322
uint32_t frequency
Bus frequency in Hertz.
Definition: spi.h:301
SPI Chip Select control structure.
Definition: spi.h:157
uint32_t delay
Delay in microseconds to wait before starting the transmission and before releasing the CS line.
Definition: spi.h:170
struct gpio_dt_spec gpio
GPIO devicetree specification of CS GPIO.
Definition: spi.h:165
SPI driver API This is the mandatory API any SPI driver needs to expose.
Definition: spi.h:649
spi_api_io transceive
Definition: spi.h:650
spi_api_release release
Definition: spi.h:657
Complete SPI DT information.
Definition: spi.h:375
const struct device * bus
SPI bus.
Definition: spi.h:377
struct spi_config config
Slave specific configuration.
Definition: spi.h:379