12#ifndef ZEPHYR_INCLUDE_DRIVERS_SPI_H_
13#define ZEPHYR_INCLUDE_DRIVERS_SPI_H_
50#define SPI_OP_MODE_MASTER 0U
60#define SPI_OP_MODE_SLAVE BIT(0)
63#define SPI_OP_MODE_MASK 0x1U
69#define SPI_OP_MODE_GET(_operation_) ((_operation_) & SPI_OP_MODE_MASK)
87#define SPI_MODE_CPOL BIT(1)
98#define SPI_MODE_CPHA BIT(2)
109#define SPI_MODE_LOOP BIT(3)
112#define SPI_MODE_MASK (0xEU)
118#define SPI_MODE_GET(_mode_) \
119 ((_mode_) & SPI_MODE_MASK)
118#define SPI_MODE_GET(_mode_) \ …
137#define SPI_TRANSFER_MSB (0U)
139#define SPI_TRANSFER_LSB BIT(4)
142#define SPI_WORD_SIZE_SHIFT (5U)
143#define SPI_WORD_SIZE_MASK (0x3FU << SPI_WORD_SIZE_SHIFT)
152#define SPI_WORD_SIZE_GET(operation) \
153 (((operation) & SPI_WORD_SIZE_MASK) >> SPI_WORD_SIZE_SHIFT)
152#define SPI_WORD_SIZE_GET(operation) \ …
161#define SPI_WORD_SET(word_size) \
162 ((word_size) << SPI_WORD_SIZE_SHIFT)
161#define SPI_WORD_SET(word_size) \ …
179#define SPI_HOLD_ON_CS BIT(12)
194#define SPI_LOCK_ON BIT(13)
207#define SPI_CS_ACTIVE_HIGH BIT(14)
221#define SPI_LINES_SINGLE (0U << 16)
222#define SPI_LINES_DUAL (1U << 16)
223#define SPI_LINES_QUAD (2U << 16)
224#define SPI_LINES_OCTAL (3U << 16)
226#define SPI_LINES_MASK (0x3U << 16)
295#define SPI_CS_GPIOS_DT_SPEC_GET(spi_dev) \
296 GPIO_DT_SPEC_GET_BY_IDX_OR(DT_BUS(spi_dev), cs_gpios, \
297 DT_REG_ADDR_RAW(spi_dev), {})
295#define SPI_CS_GPIOS_DT_SPEC_GET(spi_dev) \ …
308#define SPI_CS_GPIOS_DT_SPEC_INST_GET(inst) \
309 SPI_CS_GPIOS_DT_SPEC_GET(DT_DRV_INST(inst))
308#define SPI_CS_GPIOS_DT_SPEC_INST_GET(inst) \ …
349#define SPI_CS_CONTROL_INIT(node_id, delay_) \
351 .gpio = SPI_CS_GPIOS_DT_SPEC_GET(node_id), \
349#define SPI_CS_CONTROL_INIT(node_id, delay_) \ …
368#define SPI_CS_CONTROL_INIT_INST(inst, delay_) \
369 SPI_CS_CONTROL_INIT(DT_DRV_INST(inst), delay_)
368#define SPI_CS_CONTROL_INIT_INST(inst, delay_) \ …
377#if defined(CONFIG_SPI_EXTENDED_MODES)
436#define SPI_CONFIG_DT(node_id, operation_, delay_) \
438 .frequency = DT_PROP(node_id, spi_max_frequency), \
439 .operation = (operation_) | \
440 DT_PROP(node_id, duplex) | \
441 DT_PROP(node_id, frame_format) | \
442 COND_CODE_1(DT_PROP(node_id, spi_cpol), SPI_MODE_CPOL, (0)) | \
443 COND_CODE_1(DT_PROP(node_id, spi_cpha), SPI_MODE_CPHA, (0)) | \
444 COND_CODE_1(DT_PROP(node_id, spi_hold_cs), SPI_HOLD_ON_CS, (0)), \
445 .slave = DT_REG_ADDR(node_id), \
446 .cs = SPI_CS_CONTROL_INIT(node_id, delay_), \
436#define SPI_CONFIG_DT(node_id, operation_, delay_) \ …
460#define SPI_CONFIG_DT_INST(inst, operation_, delay_) \
461 SPI_CONFIG_DT(DT_DRV_INST(inst), operation_, delay_)
460#define SPI_CONFIG_DT_INST(inst, operation_, delay_) \ …
490#define SPI_DT_SPEC_GET(node_id, operation_, delay_) \
492 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
493 .config = SPI_CONFIG_DT(node_id, operation_, delay_) \
490#define SPI_DT_SPEC_GET(node_id, operation_, delay_) \ …
507#define SPI_DT_SPEC_INST_GET(inst, operation_, delay_) \
508 SPI_DT_SPEC_GET(DT_DRV_INST(inst), operation_, delay_)
507#define SPI_DT_SPEC_INST_GET(inst, operation_, delay_) \ …
513#define SPI_MOSI_OVERRUN_UNKNOWN 0x100
527#define SPI_MOSI_OVERRUN_DT(node_id) \
528 DT_PROP_OR(node_id, overrun_character, SPI_MOSI_OVERRUN_UNKNOWN)
527#define SPI_MOSI_OVERRUN_DT(node_id) \ …
541#define SPI_MOSI_OVERRUN_DT_INST(inst) \
542 DT_INST_PROP_OR(inst, overrun_character, SPI_MOSI_OVERRUN_UNKNOWN)
541#define SPI_MOSI_OVERRUN_DT_INST(inst) \ …
581#if defined(CONFIG_SPI_STATS)
597struct spi_device_state {
599 struct stats_spi stats;
605#define Z_SPI_GET_STATS(dev_) \
606 CONTAINER_OF(dev_->state, struct spi_device_state, devstate)->stats
613#define SPI_STATS_RX_BYTES_INCN(dev_, n) \
614 STATS_INCN(Z_SPI_GET_STATS(dev_), rx_bytes, n)
621#define SPI_STATS_TX_BYTES_INCN(dev_, n) \
622 STATS_INCN(Z_SPI_GET_STATS(dev_), tx_bytes, n)
631#define SPI_STATS_TRANSFER_ERROR_INC(dev_) \
632 STATS_INC(Z_SPI_GET_STATS(dev_), transfer_error)
638#define Z_SPI_DEVICE_STATE_DEFINE(dev_id) \
639 static struct spi_device_state Z_DEVICE_STATE_NAME(dev_id) \
640 __attribute__((__section__(".z_devstate")));
648#define Z_SPI_INIT_FN(dev_id, init_fn) \
649 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
651 struct spi_device_state *state = \
652 CONTAINER_OF(dev->state, struct spi_device_state, devstate); \
653 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 3, \
654 STATS_NAME_INIT_PARMS(spi)); \
655 stats_register(dev->name, &(state->stats.s_hdr)); \
656 return init_fn(dev); \
660#define SPI_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
661 data_ptr, cfg_ptr, level, prio, \
663 Z_SPI_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
664 Z_SPI_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
665 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
666 DEVICE_DT_NAME(node_id), \
667 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
668 NULL, Z_DEVICE_DT_FLAGS(node_id), pm_device, \
669 data_ptr, cfg_ptr, level, prio, \
671 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
687 SPI_STATS_TX_BYTES_INCN(dev, tx_bytes);
692 SPI_STATS_RX_BYTES_INCN(dev, rx_bytes);
722#define SPI_DEVICE_DT_DEFINE(node_id, init_fn, pm, \
723 data, config, level, prio, \
725 Z_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
726 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
727 DEVICE_DT_NAME(node_id), init_fn, NULL, \
728 Z_DEVICE_DT_FLAGS(node_id), pm, data, config, \
730 &Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)), \
734#define SPI_STATS_RX_BYTES_INC(dev_)
735#define SPI_STATS_TX_BYTES_INC(dev_)
736#define SPI_STATS_TRANSFER_ERROR_INC(dev_)
738#define spi_transceive_stats(dev, error, tx_bufs, rx_bufs)
751#define SPI_DEVICE_DT_INST_DEFINE(inst, ...) \
752 SPI_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
751#define SPI_DEVICE_DT_INST_DEFINE(inst, ...) \ …
785#if defined(CONFIG_SPI_RTIO) || defined(DOXYGEN)
791typedef void (*spi_api_iodev_submit)(
const struct device *dev,
810#ifdef CONFIG_SPI_ASYNC
813#ifdef CONFIG_SPI_RTIO
814 spi_api_iodev_submit iodev_submit;
908static inline int z_impl_spi_transceive(
const struct device *dev,
917 ret = api->transceive(dev, config, tx_bufs, rx_bufs);
1035#if defined(CONFIG_SPI_ASYNC) || defined(__DOXYGEN__)
1090 return api->transceive_async(dev, config, tx_bufs, rx_bufs, callback, userdata);
1093#if defined(CONFIG_POLL) || defined(__DOXYGEN__)
1096void z_spi_transfer_signal_cb(
const struct device *dev,
int result,
void *userdata);
1140 return api->transceive_async(dev, config, tx_bufs, rx_bufs, cb, sig);
1218#if defined(CONFIG_SPI_RTIO) || defined(__DOXYGEN__)
1237 const struct device *dev = dt_spec->
bus;
1240 api->iodev_submit(dt_spec->
bus, iodev_sqe);
1258#define SPI_DT_IODEV_DEFINE(name, node_id, operation_, delay_) \
1259 const struct spi_dt_spec _spi_dt_spec_##name = \
1260 SPI_DT_SPEC_GET(node_id, operation_, delay_); \
1261 RTIO_IODEV_DEFINE(name, &spi_iodev_api, (void *)&_spi_dt_spec_##name)
1258#define SPI_DT_IODEV_DEFINE(name, node_id, operation_, delay_) \ …
1304static inline int z_impl_spi_release(
const struct device *dev,
1310 return api->release(dev, config);
1337#include <zephyr/syscalls/spi.h>
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:837
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:778
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:771
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:1028
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:851
uint16_t spi_operation_t
Opaque type to hold the SPI operation flags.
Definition spi.h:380
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:759
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:1130
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:965
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:938
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:1080
#define SPI_STATS_TRANSFER_ERROR_INC(dev_)
Definition spi.h:736
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:984
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:1009
static int spi_release_dt(const struct spi_dt_spec *spec)
Release the SPI device specified in spi_dt_spec.
Definition spi.h:1324
static void spi_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
Submit a SPI device with a request.
Definition spi.h:1234
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:1170
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:838
int(* spi_api_release)(const struct device *dev, const struct spi_config *config)
Callback API for unlocking SPI device.
Definition spi.h:800
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:738
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:1204
static bool spi_cs_is_gpio(const struct spi_config *config)
Check if SPI CS is controlled using a GPIO.
Definition spi.h:826
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:1271
#define NULL
Definition iar_missing_defs.h:20
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
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device dynamic structure (in RAM) per driver instance.
Definition device.h:451
Runtime device structure (in ROM) per driver instance.
Definition device.h:504
void * data
Address of the device instance private data.
Definition device.h:514
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:510
Container for GPIO pin information specified in devicetree.
Definition gpio.h:289
const struct device * port
GPIO device controlling the pin.
Definition gpio.h:291
API that an RTIO IO device should implement.
Definition rtio.h:524
Compute the mempool block index for a given pointer.
Definition rtio.h:514
struct rtio_sqe sqe
Definition rtio.h:515
An IO device with a function table for submitting requests.
Definition rtio.h:539
void * data
Definition rtio.h:544
const struct rtio_iodev * iodev
Device to operation on.
Definition rtio.h:304
SPI scatter-gather buffer array structure.
Definition spi.h:570
const struct spi_buf * buffers
Pointer to an array of spi_buf, or NULL.
Definition spi.h:572
size_t count
Number of buffers in the array pointed to: by buffers.
Definition spi.h:574
SPI buffer structure.
Definition spi.h:552
size_t len
Length of the buffer buf in bytes, or length of NOP.
Definition spi.h:556
void * buf
Valid pointer to a data buffer, or NULL for NOP indication.
Definition spi.h:554
SPI controller configuration structure.
Definition spi.h:390
uint16_t slave
Slave number from 0 to host controller slave limit.
Definition spi.h:415
struct spi_cs_control cs
GPIO chip-select line (optional, must be initialized to zero if not used).
Definition spi.h:420
spi_operation_t operation
Operation flags.
Definition spi.h:413
uint32_t frequency
Bus frequency in Hertz.
Definition spi.h:392
SPI Chip Select control structure.
Definition spi.h:242
uint32_t delay
Delay in microseconds to wait before starting the transmission and before releasing the CS line.
Definition spi.h:255
struct gpio_dt_spec gpio
GPIO devicetree specification of CS GPIO.
Definition spi.h:250
SPI driver API This is the mandatory API any SPI driver needs to expose.
Definition spi.h:808
spi_api_io transceive
Definition spi.h:809
spi_api_release release
Definition spi.h:816
Complete SPI DT information.
Definition spi.h:466
const struct device * bus
SPI bus.
Definition spi.h:468
struct spi_config config
Slave specific configuration.
Definition spi.h:470