VSF Documented
spi_master.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2026 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18/*
19 * Clean-room re-implementation of ESP-IDF "driver/spi_master.h".
20 *
21 * Authored from ESP-IDF v5.1 public API only. No code copied from the
22 * ESP-IDF source tree. The VSF port bridges onto
23 *
24 * hal/driver/common/template/vsf_template_spi.h
25 *
26 * via a caller-supplied pool of vsf_spi_t * instances (see
27 * vsf_espidf_cfg_t::spi
28 * ).
29 *
30 * For source-compat this single header consolidates what ESP-IDF scatters
31 * across driver/spi_master.h, driver/spi_common.h and hal/spi_types.h
32 * -- callers that only #include "driver/spi_master.h" find everything
33 * they need here.
34 *
35 * Implementation scope (initial drop):
36 * - Bus lifecycle: spi_bus_initialize / spi_bus_free
37 * - Device lifecycle: spi_bus_add_device / spi_bus_remove_device
38 * - Synchronous transfers: spi_device_transmit,
39 * spi_device_polling_transmit, spi_device_queue_trans /
40 * spi_device_get_trans_result (executed inline, non-FIFO).
41 * - Polling start/end: spi_device_polling_start / spi_device_polling_end
42 * - Bus locking: spi_device_acquire_bus / spi_device_release_bus
43 *
44 * Not implemented (returns ESP_ERR_NOT_SUPPORTED or best-effort ignore):
45 * - Dual / Quad / Octal line modes; only standard 1-line mode.
46 * - Variable-size cmd / addr / dummy phases; command_bits and
47 * address_bits must be a multiple of 8.
48 * - Half-duplex "write N then read M" as distinct phases -- emulated
49 * by one full-duplex transfer of max(N, M) bytes with appropriate
50 * buffer split. SPI_DEVICE_HALFDUPLEX sets read phase only.
51 *
52 * GPIO / pin-routing fields in spi_bus_config_t are accepted for source
53 * compatibility but ignored: the underlying vsf_spi_t is already wired
54 * by the BSP.
55 */
56
57#ifndef __VSF_ESPIDF_DRIVER_SPI_MASTER_H__
58#define __VSF_ESPIDF_DRIVER_SPI_MASTER_H__
59
60#include <stdint.h>
61#include <stdbool.h>
62#include <stddef.h>
63
64#include "esp_err.h"
65
66#ifdef __cplusplus
67extern "C" {
68#endif
69
70/*============================ MACROS ========================================*/
71
72/* Common SPI clock frequencies (Hz). Retained for source compatibility;
73 * the VSF HAL only uses clock_speed_hz numerically. */
74#define SPI_MASTER_FREQ_8M (8 * 1000 * 1000)
75#define SPI_MASTER_FREQ_10M (10 * 1000 * 1000)
76#define SPI_MASTER_FREQ_16M (16 * 1000 * 1000)
77#define SPI_MASTER_FREQ_20M (20 * 1000 * 1000)
78#define SPI_MASTER_FREQ_26M (80 * 1000 * 1000 / 3)
79#define SPI_MASTER_FREQ_40M (40 * 1000 * 1000)
80#define SPI_MASTER_FREQ_80M (80 * 1000 * 1000)
81
82/* Per-device flag bits (spi_device_interface_config_t::flags). */
83#define SPI_DEVICE_TXBIT_LSBFIRST (1U << 0)
84#define SPI_DEVICE_RXBIT_LSBFIRST (1U << 1)
85#define SPI_DEVICE_BIT_LSBFIRST (SPI_DEVICE_TXBIT_LSBFIRST | SPI_DEVICE_RXBIT_LSBFIRST)
86#define SPI_DEVICE_3WIRE (1U << 2)
87#define SPI_DEVICE_POSITIVE_CS (1U << 3)
88#define SPI_DEVICE_HALFDUPLEX (1U << 4)
89#define SPI_DEVICE_CLK_AS_CS (1U << 5)
90#define SPI_DEVICE_NO_DUMMY (1U << 6)
91#define SPI_DEVICE_DDRCLK (1U << 7)
92#define SPI_DEVICE_NO_RETURN_RESULT (1U << 8)
93
94/* Per-transaction flag bits (spi_transaction_t::flags). */
95#define SPI_TRANS_MODE_DIO (1U << 0)
96#define SPI_TRANS_MODE_QIO (1U << 1)
97#define SPI_TRANS_USE_RXDATA (1U << 2)
98#define SPI_TRANS_USE_TXDATA (1U << 3)
99#define SPI_TRANS_MODE_DIOQIO_ADDR (1U << 4)
100#define SPI_TRANS_VARIABLE_CMD (1U << 5)
101#define SPI_TRANS_VARIABLE_ADDR (1U << 6)
102#define SPI_TRANS_VARIABLE_DUMMY (1U << 7)
103#define SPI_TRANS_CS_KEEP_ACTIVE (1U << 8)
104#define SPI_TRANS_MULTILINE_CMD (1U << 9)
105#define SPI_TRANS_MODE_OCT (1U << 10)
106#define SPI_TRANS_MULTILINE_ADDR SPI_TRANS_MODE_DIOQIO_ADDR
107
108/* Bus config flag bits (spi_bus_config_t::flags). Accepted and ignored. */
109#define SPICOMMON_BUSFLAG_SLAVE (1U << 0)
110#define SPICOMMON_BUSFLAG_MASTER (1U << 1)
111#define SPICOMMON_BUSFLAG_IOMUX_PINS (1U << 2)
112#define SPICOMMON_BUSFLAG_GPIO_PINS (1U << 3)
113#define SPICOMMON_BUSFLAG_SCLK (1U << 4)
114#define SPICOMMON_BUSFLAG_MISO (1U << 5)
115#define SPICOMMON_BUSFLAG_MOSI (1U << 6)
116#define SPICOMMON_BUSFLAG_DUAL (1U << 7)
117#define SPICOMMON_BUSFLAG_WPHD (1U << 8)
118#define SPICOMMON_BUSFLAG_QUAD (SPICOMMON_BUSFLAG_DUAL | SPICOMMON_BUSFLAG_WPHD)
119#define SPICOMMON_BUSFLAG_IO4_IO7 (1U << 9)
120#define SPICOMMON_BUSFLAG_OCTAL (SPICOMMON_BUSFLAG_QUAD | SPICOMMON_BUSFLAG_IO4_IO7)
121#define SPICOMMON_BUSFLAG_NATIVE_PINS SPICOMMON_BUSFLAG_IOMUX_PINS
122
123/* DMA channel selection (accepted; DMA is managed internally by VSF). */
124typedef enum {
130
131#define SPI_DMA_CH_AUTO SPI_DMA_CH_AUTO
132
133/*============================ TYPES =========================================*/
134
141typedef enum {
147
148/* Clock source selector (accepted, ignored). */
150#define SPI_CLK_SRC_DEFAULT 0
151
152/* Sample-point tuning (accepted, ignored). */
154#define SPI_SAMPLING_POINT_PHASE_0 0
155
163typedef struct {
164 union { int mosi_io_num; int data0_io_num; };
165 union { int miso_io_num; int data1_io_num; };
167 union { int quadwp_io_num; int data2_io_num; };
168 union { int quadhd_io_num; int data3_io_num; };
177
178/* Forward declaration -- opaque device handle. */
180
181/* Forward declaration used by callback typedef below. */
182struct spi_transaction_t;
183typedef void (*transaction_cb_t)(struct spi_transaction_t *trans);
184
188typedef struct {
206
214typedef struct spi_transaction_t {
218 size_t length;
219 size_t rxlength;
220 void *user;
221 union {
222 const void *tx_buffer;
224 };
225 union {
228 };
230
237typedef struct {
243
244/*============================ BUS LIFECYCLE =================================*/
245
257 const spi_bus_config_t *bus_config,
258 spi_common_dma_t dma_chan);
259
266
267/*============================ DEVICE LIFECYCLE ==============================*/
268
273 const spi_device_interface_config_t *dev_config,
274 spi_device_handle_t *handle);
275
280
281/*============================ DATA TRANSFER =================================*/
282
293 spi_transaction_t *trans_desc,
294 uint32_t ticks_to_wait);
295
300 spi_transaction_t **trans_desc,
301 uint32_t ticks_to_wait);
302
307 spi_transaction_t *trans_desc);
308
313 spi_transaction_t *trans_desc);
314
321 spi_transaction_t *trans_desc,
322 uint32_t ticks_to_wait);
323
328 uint32_t ticks_to_wait);
329
330/*============================ BUS LOCKING ===================================*/
331
339 uint32_t wait);
340
345
346/*============================ UTILITIES =====================================*/
347
355 int *freq_khz);
356
357#ifdef __cplusplus
358}
359#endif
360
361#endif /* __VSF_ESPIDF_DRIVER_SPI_MASTER_H__ */
int esp_err_t
Definition esp_err.h:41
esp_err_t spi_bus_free(spi_host_device_t host_id)
Release an SPI bus.
Definition driver_spi_master_port.c:492
esp_err_t spi_device_transmit(spi_device_handle_t handle, spi_transaction_t *trans_desc)
Blocking, interrupt-backed transaction.
Definition driver_spi_master_port.c:622
int spi_sampling_point_t
Definition spi_master.h:153
esp_err_t spi_bus_add_device(spi_host_device_t host_id, const spi_device_interface_config_t *dev_config, spi_device_handle_t *handle)
Attach a device to an initialised bus.
Definition driver_spi_master_port.c:527
esp_err_t spi_device_queue_trans(spi_device_handle_t handle, spi_transaction_t *trans_desc, uint32_t ticks_to_wait)
Queue a transaction for later completion.
Definition driver_spi_master_port.c:634
#define SPI_DMA_CH_AUTO
Definition spi_master.h:131
void(* transaction_cb_t)(struct spi_transaction_t *trans)
Definition spi_master.h:183
esp_err_t spi_device_polling_transmit(spi_device_handle_t handle, spi_transaction_t *trans_desc)
Blocking polling transaction (shim: same as spi_device_transmit).
Definition driver_spi_master_port.c:628
esp_err_t spi_device_get_actual_freq(spi_device_handle_t handle, int *freq_khz)
Return the actual clock frequency used for a device.
Definition driver_spi_master_port.c:752
void spi_device_release_bus(spi_device_handle_t dev)
Release a previously acquired bus.
Definition driver_spi_master_port.c:737
struct spi_device_t * spi_device_handle_t
Definition spi_master.h:179
esp_err_t spi_device_get_trans_result(spi_device_handle_t handle, spi_transaction_t **trans_desc, uint32_t ticks_to_wait)
Retrieve a previously queued transaction.
Definition driver_spi_master_port.c:653
spi_host_device_t
SPI host controller enumeration.
Definition spi_master.h:141
@ SPI3_HOST
Definition spi_master.h:144
@ SPI2_HOST
Definition spi_master.h:143
@ SPI_HOST_MAX
Definition spi_master.h:145
@ SPI1_HOST
Definition spi_master.h:142
esp_err_t spi_bus_remove_device(spi_device_handle_t handle)
Detach a device from its bus.
Definition driver_spi_master_port.c:572
esp_err_t spi_device_polling_start(spi_device_handle_t handle, spi_transaction_t *trans_desc, uint32_t ticks_to_wait)
Start a polling transaction without blocking.
Definition driver_spi_master_port.c:669
esp_err_t spi_bus_initialize(spi_host_device_t host_id, const spi_bus_config_t *bus_config, spi_common_dma_t dma_chan)
Initialise an SPI bus.
Definition driver_spi_master_port.c:448
esp_err_t spi_device_polling_end(spi_device_handle_t handle, uint32_t ticks_to_wait)
Wait for a previously started polling transaction.
Definition driver_spi_master_port.c:701
int spi_clock_source_t
Definition spi_master.h:149
esp_err_t spi_device_acquire_bus(spi_device_handle_t device, uint32_t wait)
Acquire the bus for a series of back-to-back transactions.
Definition driver_spi_master_port.c:722
spi_common_dma_t
Definition spi_master.h:124
@ SPI_DMA_CH1
Definition spi_master.h:126
@ SPI_DMA_CH2
Definition spi_master.h:127
@ SPI_DMA_DISABLED
Definition spi_master.h:125
unsigned short uint16_t
Definition stdint.h:7
unsigned uint32_t
Definition stdint.h:9
unsigned long long uint64_t
Definition stdint.h:11
unsigned char uint8_t
Definition stdint.h:5
Definition device.h:33
Bus-wide configuration.
Definition spi_master.h:163
int data5_io_num
Definition spi_master.h:170
int data1_io_num
Definition spi_master.h:165
int data4_io_num
Definition spi_master.h:169
int sclk_io_num
Definition spi_master.h:166
int intr_flags
Definition spi_master.h:175
int data2_io_num
Definition spi_master.h:167
int max_transfer_sz
Definition spi_master.h:173
int data3_io_num
Definition spi_master.h:168
uint32_t flags
Definition spi_master.h:174
int data6_io_num
Definition spi_master.h:171
int data7_io_num
Definition spi_master.h:172
int data0_io_num
Definition spi_master.h:164
Per-device configuration.
Definition spi_master.h:188
int spics_io_num
Definition spi_master.h:200
int clock_speed_hz
Definition spi_master.h:197
uint8_t address_bits
Definition spi_master.h:190
uint16_t duty_cycle_pos
Definition spi_master.h:194
uint8_t mode
Definition spi_master.h:192
spi_clock_source_t clock_source
Definition spi_master.h:193
int queue_size
Definition spi_master.h:202
uint16_t cs_ena_pretrans
Definition spi_master.h:195
uint8_t dummy_bits
Definition spi_master.h:191
uint8_t command_bits
Definition spi_master.h:189
uint32_t flags
Definition spi_master.h:201
uint8_t cs_ena_posttrans
Definition spi_master.h:196
transaction_cb_t pre_cb
Definition spi_master.h:203
spi_sampling_point_t sample_point
Definition spi_master.h:199
transaction_cb_t post_cb
Definition spi_master.h:204
int input_delay_ns
Definition spi_master.h:198
Definition driver_spi_master_port.c:86
Extended transaction with per-transfer bit widths.
Definition spi_master.h:237
spi_transaction_t base
Definition spi_master.h:238
uint8_t address_bits
Definition spi_master.h:240
uint8_t command_bits
Definition spi_master.h:239
uint8_t dummy_bits
Definition spi_master.h:241
One SPI transaction descriptor.
Definition spi_master.h:214
size_t length
Definition spi_master.h:218
void * user
Definition spi_master.h:220
uint8_t rx_data[4]
Definition spi_master.h:227
uint16_t cmd
Definition spi_master.h:216
size_t rxlength
Definition spi_master.h:219
const void * tx_buffer
Definition spi_master.h:222
uint64_t addr
Definition spi_master.h:217
void * rx_buffer
Definition spi_master.h:226
uint8_t tx_data[4]
Definition spi_master.h:223
uint32_t flags
Definition spi_master.h:215
pid_t wait(int *status)
Definition vsf_linux.c:2759
Generated from commit: vsfteam/vsf@015f4d1