12#ifndef ZEPHYR_INCLUDE_DRIVERS_SPI_H_
13#define ZEPHYR_INCLUDE_DRIVERS_SPI_H_
40#define SPI_OP_MODE_MASTER 0U
41#define SPI_OP_MODE_SLAVE BIT(0)
42#define SPI_OP_MODE_MASK 0x1U
43#define SPI_OP_MODE_GET(_operation_) ((_operation_) & SPI_OP_MODE_MASK)
56#define SPI_MODE_CPOL BIT(1)
65#define SPI_MODE_CPHA BIT(2)
72#define SPI_MODE_LOOP BIT(3)
74#define SPI_MODE_MASK (0xEU)
75#define SPI_MODE_GET(_mode_) \
76 ((_mode_) & SPI_MODE_MASK)
84#define SPI_TRANSFER_MSB (0U)
85#define SPI_TRANSFER_LSB BIT(4)
92#define SPI_WORD_SIZE_SHIFT (5U)
93#define SPI_WORD_SIZE_MASK (0x3FU << SPI_WORD_SIZE_SHIFT)
94#define SPI_WORD_SIZE_GET(_operation_) \
95 (((_operation_) & SPI_WORD_SIZE_MASK) >> SPI_WORD_SIZE_SHIFT)
97#define SPI_WORD_SET(_word_size_) \
98 ((_word_size_) << SPI_WORD_SIZE_SHIFT)
106#define SPI_HOLD_ON_CS BIT(12)
112#define SPI_LOCK_ON BIT(13)
121#define SPI_CS_ACTIVE_HIGH BIT(14)
133#define SPI_LINES_SINGLE (0U << 16)
134#define SPI_LINES_DUAL (1U << 16)
135#define SPI_LINES_QUAD (2U << 16)
136#define SPI_LINES_OCTAL (3U << 16)
138#define SPI_LINES_MASK (0x3U << 16)
201#define SPI_CS_GPIOS_DT_SPEC_GET(spi_dev) \
202 GPIO_DT_SPEC_GET_BY_IDX_OR(DT_BUS(spi_dev), cs_gpios, \
203 DT_REG_ADDR(spi_dev), {})
214#define SPI_CS_GPIOS_DT_SPEC_INST_GET(inst) \
215 SPI_CS_GPIOS_DT_SPEC_GET(DT_DRV_INST(inst))
249#define SPI_CS_CONTROL_INIT(node_id, delay_) \
251 .gpio = SPI_CS_GPIOS_DT_SPEC_GET(node_id), \
268#define SPI_CS_CONTROL_INIT_INST(inst, delay_) \
269 SPI_CS_CONTROL_INIT(DT_DRV_INST(inst), delay_)
299#if defined(CONFIG_SPI_EXTENDED_MODES)
328#define SPI_CONFIG_DT(node_id, operation_, delay_) \
330 .frequency = DT_PROP(node_id, spi_max_frequency), \
331 .operation = (operation_) | \
332 DT_PROP(node_id, duplex) | \
333 DT_PROP(node_id, frame_format), \
334 .slave = DT_REG_ADDR(node_id), \
335 .cs = SPI_CS_CONTROL_INIT(node_id, delay_), \
349#define SPI_CONFIG_DT_INST(inst, operation_, delay_) \
350 SPI_CONFIG_DT(DT_DRV_INST(inst), operation_, delay_)
381#define SPI_DT_SPEC_GET(node_id, operation_, delay_) \
383 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
384 .config = SPI_CONFIG_DT(node_id, operation_, delay_) \
398#define SPI_DT_SPEC_INST_GET(inst, operation_, delay_) \
399 SPI_DT_SPEC_GET(DT_DRV_INST(inst), operation_, delay_)
425#if defined(CONFIG_SPI_STATS)
441struct spi_device_state {
443 struct stats_spi stats;
449#define Z_SPI_GET_STATS(dev_) \
450 CONTAINER_OF(dev_->state, struct spi_device_state, devstate)->stats
457#define SPI_STATS_RX_BYTES_INCN(dev_, n) \
458 STATS_INCN(Z_SPI_GET_STATS(dev_), rx_bytes, n)
465#define SPI_STATS_TX_BYTES_INCN(dev_, n) \
466 STATS_INCN(Z_SPI_GET_STATS(dev_), tx_bytes, n)
475#define SPI_STATS_TRANSFER_ERROR_INC(dev_) \
476 STATS_INC(Z_SPI_GET_STATS(dev_), transfer_error)
481#define Z_SPI_DEVICE_STATE_DEFINE(dev_id) \
482 static struct spi_device_state Z_DEVICE_STATE_NAME(dev_id) \
483 __attribute__((__section__(".z_devstate")));
491#define Z_SPI_INIT_FN(dev_id, init_fn) \
492 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
494 struct spi_device_state *state = \
495 CONTAINER_OF(dev->state, struct spi_device_state, devstate); \
496 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 3, \
497 STATS_NAME_INIT_PARMS(spi)); \
498 stats_register(dev->name, &(state->stats.s_hdr)); \
499 return init_fn(dev); \
521#define SPI_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
522 data_ptr, cfg_ptr, level, prio, \
524 Z_SPI_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
525 Z_SPI_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
526 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
527 DEVICE_DT_NAME(node_id), \
528 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
530 data_ptr, cfg_ptr, level, prio, \
532 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
548 SPI_STATS_TX_BYTES_INCN(dev, tx_bytes);
553 SPI_STATS_RX_BYTES_INCN(dev, rx_bytes);
559#define SPI_DEVICE_DT_DEFINE(node_id, init_fn, pm, \
560 data, config, level, prio, \
562 Z_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
563 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
564 DEVICE_DT_NAME(node_id), init_fn, pm, data, config, \
566 &Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)), \
569#define SPI_STATS_RX_BYTES_INC(dev_)
570#define SPI_STATS_TX_BYTES_INC(dev_)
571#define SPI_STATS_TRANSFER_ERROR_INC(dev_)
573#define spi_transceive_stats(dev, error, tx_bufs, rx_bufs)
608#if defined(CONFIG_SPI_RTIO) || defined(DOXYGEN)
614typedef void (*spi_api_iodev_submit)(
const struct device *dev,
633#ifdef CONFIG_SPI_ASYNC
636#ifdef CONFIG_SPI_RTIO
637 spi_api_iodev_submit iodev_submit;
734static inline int z_impl_spi_transceive(
const struct device *dev,
854#ifdef CONFIG_SPI_ASYNC
892 return api->
transceive_async(dev, config, tx_bufs, rx_bufs, callback, userdata);
898void z_spi_transfer_signal_cb(
const struct device *dev,
int result,
void *userdata);
926static inline int spi_transceive_signal(
const struct device *dev,
934 spi_callback_t cb = (sig == NULL) ? NULL : z_spi_transfer_signal_cb;
945__deprecated
static inline int spi_transceive_async(
const struct device *dev,
951 return spi_transceive_signal(dev, config, tx_bufs, rx_bufs, sig);
977static inline int spi_read_signal(
const struct device *dev,
982 return spi_transceive_signal(dev, config, NULL, rx_bufs, sig);
991__deprecated
static inline int spi_read_async(
const struct device *dev,
996 return spi_read_signal(dev, config, rx_bufs, sig);
1022static inline int spi_write_signal(
const struct device *dev,
1027 return spi_transceive_signal(dev, config, tx_bufs, NULL, sig);
1036__deprecated
static inline int spi_write_async(
const struct device *dev,
1041 return spi_write_signal(dev, config, tx_bufs, sig);
1049#if defined(CONFIG_SPI_RTIO) || defined(DOXYGEN)
1062static inline void spi_iodev_submit(
struct rtio_iodev_sqe *iodev_sqe)
1065 const struct device *dev = dt_spec->
bus;
1068 api->iodev_submit(dt_spec->
bus, iodev_sqe);
1081#define SPI_DT_IODEV_DEFINE(name, node_id, operation_, delay_) \
1082 const struct spi_dt_spec _spi_dt_spec_##name = \
1083 SPI_DT_SPEC_GET(node_id, operation_, delay_); \
1084 RTIO_IODEV_DEFINE(name, &spi_iodev_api, (void *)&_spi_dt_spec_##name)
1094static inline bool spi_is_ready_iodev(
const struct rtio_iodev *spi_iodev)
1113static inline int spi_rtio_copy(
struct rtio *
r,
1120 size_t tx_count = tx_bufs ? tx_bufs->
count : 0;
1121 size_t rx_count = rx_bufs ? rx_bufs->
count : 0;
1129 if (tx < tx_count) {
1137 if (rx < rx_count) {
1146 while ((tx < tx_count || rx < rx_count) && (tx_len > 0 || rx_len > 0)) {
1158 if (tx_len == rx_len) {
1162 }
else if (
rx_buf == NULL) {
1171 if (rx < rx_count) {
1178 if (tx < tx_count) {
1185 }
else if (tx_len == 0) {
1191 if (rx < rx_count) {
1198 }
else if (rx_len == 0) {
1204 if (tx < tx_count) {
1211 }
else if (tx_len > rx_len) {
1220 if (rx < rx_count) {
1227 }
else if (rx_len > tx_len) {
1236 if (tx < tx_count) {
1244 __ASSERT_NO_MSG(
"Invalid spi_rtio_copy state");
1284static inline int z_impl_spi_release(
const struct device *dev,
1290 return api->
release(dev, config);
1317#include <syscalls/spi.h>
workaround assembler barfing for ST r
Definition: asm-macro-32-bit-gnu.h:24
Public APIs for GPIO drivers.
struct result result[2]
Definition: errno.c:42
bool device_is_ready(const struct device *dev)
Verify that a device is ready for use.
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:594
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:485
static struct rtio_sqe * rtio_sqe_acquire(struct rtio *r)
Acquire a single submission queue event if available.
Definition: rtio.h:883
static void rtio_sqe_drop_all(struct rtio *r)
Drop all previously acquired sqe.
Definition: rtio.h:901
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:525
#define RTIO_SQE_TRANSACTION
The next request in the queue is part of a transaction.
Definition: rtio.h:114
#define RTIO_PRIO_NORM
Normal priority.
Definition: rtio.h:76
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:601
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:594
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:847
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:697
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:787
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:764
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:882
#define SPI_STATS_TRANSFER_ERROR_INC(dev_)
Definition: spi.h:571
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:806
static bool spi_is_ready(const struct spi_dt_spec *spec)
Validate that SPI bus is ready.
Definition: spi.h:675
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:828
static int spi_release_dt(const struct spi_dt_spec *spec)
Release the SPI device specified in spi_dt_spec.
Definition: spi.h:1304
int(* spi_api_release)(const struct device *dev, const struct spi_config *config)
Callback API for unlocking SPI device. See spi_release() for argument descriptions.
Definition: spi.h:623
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:582
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:661
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:573
static bool spi_cs_is_gpio(const struct spi_config *config)
Check if SPI CS is controlled using a GPIO.
Definition: spi.h:649
#define ENOMEM
Definition: errno.h:51
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:29
Real-Time IO device API for moving bytes with low effort.
#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:353
Runtime device structure (in ROM) per driver instance.
Definition: device.h:380
const void * api
Definition: device.h:386
Container for GPIO pin information specified in devicetree.
Definition: gpio.h:286
const struct device * port
Definition: gpio.h:288
Definition: kernel.h:5517
API that an RTIO IO device should implement.
Definition: rtio.h:421
Compute the mempool block index for a given pointer.
Definition: rtio.h:411
struct rtio_sqe sqe
Definition: rtio.h:412
An IO device with a function table for submitting requests.
Definition: rtio.h:439
void * data
Definition: rtio.h:447
A submission queue event.
Definition: rtio.h:238
uint8_t * tx_buf
Definition: rtio.h:283
uint8_t * rx_buf
Definition: rtio.h:284
const struct rtio_iodev * iodev
Definition: rtio.h:249
uint16_t flags
Definition: rtio.h:243
An RTIO context containing what can be viewed as a pair of queues.
Definition: rtio.h:338
SPI buffer array structure.
Definition: spi.h:420
const struct spi_buf * buffers
Definition: spi.h:421
size_t count
Definition: spi.h:422
SPI buffer structure.
Definition: spi.h:409
size_t len
Definition: spi.h:411
void * buf
Definition: spi.h:410
SPI controller configuration structure.
Definition: spi.h:297
uint16_t slave
Definition: spi.h:305
struct spi_cs_control cs
Definition: spi.h:308
uint32_t frequency
Definition: spi.h:298
uint16_t operation
Definition: spi.h:304
SPI Chip Select control structure.
Definition: spi.h:148
uint32_t delay
Definition: spi.h:161
struct gpio_dt_spec gpio
Definition: spi.h:156
SPI driver API This is the mandatory API any SPI driver needs to expose.
Definition: spi.h:631
spi_api_io transceive
Definition: spi.h:632
spi_api_release release
Definition: spi.h:639
spi_api_io_async transceive_async
Definition: spi.h:634
Complete SPI DT information.
Definition: spi.h:358
const struct device * bus
Definition: spi.h:359
struct spi_config config
Definition: spi.h:360
static fdata_t data[2]
Definition: test_fifo_contexts.c:15