SemiDrive SSDK Appication Program Interface PTG3.0
sdrv_spi.h
Go to the documentation of this file.
1
9#ifndef SDRV_SPI_H
10#define SDRV_SPI_H
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16#include <sdrv_ckgen.h>
17#include <stdbool.h>
18#include <stdint.h>
19
20#include "reg.h"
21#include "sdrv_dma.h"
22#include "spi_reg.h"
23
24#define SPI_PIPE_LINE_SIZE_8B 3U
25#define SPI_PIPE_LINE_SIZE_4B 4U
26#define SPI_PIPE_LINE_SIZE_2B 5U
27#define SPI_PIPE_LINE_SIZE_OB 2U
28// 2 mst_idle 3 mst_start 7 mst_data_wait
29#define SPI_FSM_WAIT_DATA_STA 7U
30#define SPI_FSM_M_STR_STA 3U
31#define SPI_FSM_IDLE_STA 2U
32
37
44};
45
50
55
75};
76
81 SPI_RX_FIFO_READ = (0x01 << 0),
82 SPI_TX_FIFO_WRITE = (0x01 << 1),
83 SPI_TX_FIFO_UDR = (0x01 << 2),
84 SPI_RX_FIFO_OVR = (0x01 << 3),
85 SPI_TX_DMA_ERR = (0x01 << 4),
86 SPI_RX_DMA_ERR = (0x01 << 5),
87 SPI_TX_ONLY_DONE = (0x01 << 6),
88};
89
95 SPI_RX_READ_REQ = 0x01 << 1,
96 SPI_TX_WRITE_REQ = 0x01 << 2,
97 SPI_CS_INVLD_REQ = 0x01 << 3,
98};
99
104
112};
113
117typedef enum {
122
126enum data_dir { SPI_RX_DIR = 0x01, SPI_TX_DIR = 0x02 };
127
131typedef void (*spi_callback_t)(void *spi, spi_event_type Event);
132
137 /* sclk frea in hz */
138 uint32_t sclk_freq;
139 /* Idle level */
141 /* Sampling phase */
143 /* cs active polarity */
145 /* ss0-ss3 or GPIO_xx */
146 uint8_t cs_sel;
147 /* deivce raw data width 4-32*/
148 uint8_t width;
149 /* minimum interval between two transmissions in n*sclk */
150 uint8_t fream_delay;
151 /* cs setup time in n*sclk */
153 /* cs hold time in n*sclk */
155 /* lsb or msb */
157 /* Control the cs signal through IO or peripherals */
159 /* enable miso sampling delay half sclk on master mode */
161};
162
167 /* motor rola mode or ti mode */
169 /* half mode */
171 /* master or slave mode */
173 /* polling mode */
175#if CONFIG_SPI_ENABLE_DMA
176 /* rx dma channel id */
178 /* tx dma channel id */
180 /* dma handler */
182#endif
183 /* reg base */
184 uint32_t base;
185 /* irq num */
186 uint32_t irq;
187 /* root clk node */
189};
190
195 /* data */
196 uint32_t val;
197 uint8_t *u8_ptr;
198 uint16_t *u16_ptr;
199 uint32_t *u32_ptr;
200};
201
207 void *bus;
209};
210
215 /* transmit_sche mode need this*/
216 uint32_t len;
217 /* tansmit data width type */
218 uint8_t width_type;
219 /* prxdata */
221 /* ptxdata */
223 /* prxdata */
224 uint32_t rx_cur;
225 /* ptxdata */
226 uint32_t tx_cur;
227 /* remain of this item */
228 uint32_t cur_remian;
229 /* once except of this item */
230 uint32_t expect_len;
231 /* vector transmit need */
233};
234
238typedef struct sdrv_spi {
239 /* get frame static config */
240 uint32_t base;
241 /* get frame static config */
242 uint32_t irq;
243 /* Max baudrate when divide by 0 */
244 uint32_t max_baudrate;
245 /* Max baudrate when divide by 256 */
246 uint32_t min_baudrate;
247 /* spi preinstance config */
249 /* default Config or slave mode cfg */
251 /* */
253 /* */
255 /* status */
256 uint32_t state;
257 /* cur cmd */
258 uint32_t cur_cmd;
259#if CONFIG_SPI_ENABLE_DMA
260 /* dma rx channel */
262 /* dma rx channel */
264 /* dma rx channel */
266 /* dma rx channel */
268 /* dma error */
269 uint32_t dma_err;
270#endif
272
273#define SPI_POL_VEL_ILLEGAL (~0xFu)
274#define SPI_START_DELAY_MAX 0xFFu
275#define SPI_END_DELAY_MAX 0xFFu
276#define SPI_FRAME_DELAY_MAX 0xFFu
277#define SPI_CLK_PRESSCALE_MAX 0xFFu
278#define SPI_FIFO_LEN 16u
279#define SPI_FRAME_SIZE_MAX 1024U
280#define SPI_SLAVE_IRQ_NICE_ADJUST (-1) /* slave irq nice val */
281
285#define SPI_DATA_WIDTH_MIN 4U
286#define SPI_DATA_WIDTH_BYTE 8U
287#define SPI_DATA_WIDTH_HALF_WORD 16U
288#define SPI_DATA_WIDTH_WORD 32U
289#define SPI_DATA_WIDTH_MAX SPI_DATA_WIDTH_WORD
290
291#define SPI_INTERNAL_DIV_SHIFT (1u)
292#define SPI_CLK_PRESSCALE_MAX_SHIFT (8u)
293#define SPI_TIMMING_CFG(f, s, e) \
294 (FV_SPI_TIM_CTRL_START_DLY(s) | FV_SPI_TIM_CTRL_END_DLY(e) | \
295 FV_SPI_TIM_CTRL_FRM_DLY(f))
296#define BUS_BUSY_MASK (SPI_STATE_BUSY_TX | SPI_STATE_BUSY_RX)
297#define BUS_BUSY_DMA_MASK (SPI_STATE_DMA_TX | SPI_STATE_DMA_RX)
298#define BUS_BUSY_IRQ_MASK (SPI_STATE_IRQ_TX | SPI_STATE_IRQ_RX)
299#define BUS_FIFO_STATE_MASK (SPI_RX_FIFO_READ | SPI_TX_FIFO_WRITE)
300#define BUS_BUSY_ASYNC_MASK (BUS_BUSY_DMA_MASK | BUS_BUSY_IRQ_MASK)
301#define BUS_BUSY_STATUS_MASK (BUS_BUSY_MASK | BUS_BUSY_ASYNC_MASK)
302#define BUS_FIFO_STATE_ERR_MASK \
303 (SPI_TX_FIFO_UDR | SPI_RX_FIFO_OVR | SPI_TX_DMA_ERR | SPI_RX_DMA_ERR)
304#define BUS_FIFO_EMPTYE_TIMEOUT(f_delay, s_delay, e_delay, baudrate) \
305 (((f_delay) + (s_delay) + (e_delay) + SPI_DATA_WIDTH_MAX) * 1000000 / \
306 (baudrate))
307#define BUS_STATE_TX_MASK \
308 (SPI_STATE_DMA_TX | SPI_STATE_BUSY_TX | SPI_STATE_IRQ_TX)
309#define BUS_STATE_RX_MASK \
310 (SPI_STATE_DMA_RX | SPI_STATE_BUSY_RX | SPI_STATE_IRQ_RX)
311
312#define SPI_SATE_EXT_FLAGS \
313 (SPI_STATE_IS_UNS_EN | SPI_STATE_IS_RO_END | SPI_STATE_CS_ACTIVEED)
314
315#define SPI_GET_WIDTH_SHIFT(width_type) \
316 (((width_type) == SPI_DATA_WIDTH_WORD \
317 ? 2 \
318 : ((width_type) / SPI_DATA_WIDTH_BYTE) - 1))
319
320#define SPI_GET_WIDTH_TYPE(width) \
321 (((width) > 16U) \
322 ? (SPI_DATA_WIDTH_WORD) \
323 : ((width) > 8U ? SPI_DATA_WIDTH_HALF_WORD : SPI_DATA_WIDTH_BYTE))
324
325#define SPI_IS_VALID_LEN(bytes, width) \
326 (!((bytes) & ((0x1 << SPI_GET_WIDTH_SHIFT(SPI_GET_WIDTH_TYPE(width))) - 1)))
327
328/* (16 * 32 + 9 * delay * 1000000)/baudrate == us */
329#define SPI_READ_FIFO_TIMEOUT_MAX(f_delay, s_delay, e_delay, baudrate) \
330 ((((f_delay) + (s_delay) + (e_delay)) * 9 + \
331 SPI_DATA_WIDTH_MAX * SPI_FIFO_LEN) * \
332 1000000 / (baudrate))
336enum {
338 SDRV_STATUS_GROUP_SPI, 1), /* Spi configuration mode usage mismatch. */
340 SDRV_STATUS_GROUP_SPI, 2), /* Spi IP version is not supported. */
342 SDRV_STATUS_GROUP_SPI, 3), /* Spi first Write CMD wait timeout. */
345 4), /* Spi first write CMD last transfer ended wait timeout. */
348 5), /* Spi CLK idle level switching wait timeout. */
351 6), /* Spi Write CMD wait timeout(Not the first time). */
354 7), /* Spi last transfer ended wait timeout.(Not the first time) */
356 SDRV_STATUS_GROUP_SPI, 8), /* Spi Synchronous transfer timeout. */
359 9), /* Spi Synchronous transfer(Tx only) wait clk ended timeout. */
361 SDRV_STATUS_GROUP_SPI, 10), /* Spi dma configuration failed. */
363 SDRV_STATUS_GROUP_SPI, 11), /* Spi irq configuration failed. */
365 SDRV_STATUS_GROUP_SPI, 12), /* Spi user params error.*/
366};
376int sdrv_spi_init(struct sdrv_spi *spi, struct spi_common_config *cfg);
377
386
401 const struct spi_device_config *cfg);
402
417int sdrv_spi_sync_transmit(struct sdrv_spi *spi, void *tx_buf, void *rx_buf,
418 uint32_t bytes, uint32_t timeout);
419
427
442int sdrv_spi_async_transmit(struct sdrv_spi *spi, void *tx_buf, void *rx_buf,
443 uint32_t bytes, enum spi_ops_type type);
444
452
460
468
469#ifdef __cplusplus
470}
471#endif
472
473#endif
SemiDrive clock generator driver header file.
@ SDRV_STATUS_GROUP_SPI
Definition: sdrv_common.h:37
#define SDRV_ERROR_STATUS(group, code)
Construct a status code value from a group and code number. All the error statuses are negetive numbe...
Definition: sdrv_common.h:17
SemiDrive DMA driver header file.
sdrv_dma_channel_id_e
DMA Channel ID.
Definition: sdrv_dma.h:47
spi_cs_polarity
Spi cs mode.
Definition: sdrv_spi.h:49
@ CS_ACTIVE_HIGH
Definition: sdrv_spi.h:49
@ CS_ACTIVE_LOW
Definition: sdrv_spi.h:49
struct sdrv_spi sdrv_spi_t
Spi bus module handler type .
irq_type
Spi irq type .
Definition: sdrv_spi.h:93
@ SPI_RX_READ_REQ
Definition: sdrv_spi.h:95
@ SPI_TRASPORT_FINISH
Definition: sdrv_spi.h:94
@ SPI_CS_INVLD_REQ
Definition: sdrv_spi.h:97
@ SPI_TX_WRITE_REQ
Definition: sdrv_spi.h:96
uint32_t sdrv_spi_slave_get_transmit_len(struct sdrv_spi *bus)
Get slave transmit cnt.
spi_event_type
Spi async transmit callback type .
Definition: sdrv_spi.h:117
@ SPI_TRANS_DONE
Definition: sdrv_spi.h:118
@ SPI_TRANS_FAIL
Definition: sdrv_spi.h:119
@ SPI_TRANS_PASS
Definition: sdrv_spi.h:120
void sdrv_spi_polling(struct sdrv_spi *bus)
Get SPI bus polling.
@ SDRV_SPI_STATUS_SYNC_TIMEOUT
Definition: sdrv_spi.h:355
@ SDRV_SPI_STATUS_UCMD_TIMEOUT_WRITE
Definition: sdrv_spi.h:349
@ SDRV_SPI_STATUS_FAIL_DMA_SETUP
Definition: sdrv_spi.h:360
@ SDRV_SPI_STATUS_SOFT_CS_TIMEOUT
Definition: sdrv_spi.h:346
@ SDRV_SPI_STATUS_SOFT_CS_WAIT_TIMEOUT
Definition: sdrv_spi.h:357
@ SDRV_SPI_STATUS_UCMD_TIMEOUT_FINISH
Definition: sdrv_spi.h:352
@ SDRV_SPI_STATUS_MODE_ERROR
Definition: sdrv_spi.h:337
@ SDRV_SPI_STATUS_GCMD_NO_SUPPORT
Definition: sdrv_spi.h:339
@ SDRV_SPI_STATUS_GCMD_TIMEOUT_WRITE
Definition: sdrv_spi.h:341
@ SDRV_SPI_STATUS_PARAM_ILLEGAL
Definition: sdrv_spi.h:364
@ SDRV_SPI_STATUS_FAIL_IRQ_SETUP
Definition: sdrv_spi.h:362
@ SDRV_SPI_STATUS_GCMD_TIMEOUT_FINISH
Definition: sdrv_spi.h:343
spi_state
Spi Bus state flags.
Definition: sdrv_spi.h:59
@ SPI_STATE_INITED
Definition: sdrv_spi.h:61
@ SPI_STATE_IS_RO_END
Definition: sdrv_spi.h:72
@ SPI_STATE_IRQ_ACT
Definition: sdrv_spi.h:64
@ SPI_STATE_DMA_RX
Definition: sdrv_spi.h:66
@ SPI_STATE_BUSY_RX
Definition: sdrv_spi.h:63
@ SPI_STATE_IS_UNS_EN
Definition: sdrv_spi.h:71
@ SPI_STATE_DMA_TX_RD
Definition: sdrv_spi.h:73
@ SPI_STATE_DMA_RX_RD
Definition: sdrv_spi.h:74
@ SPI_STATE_UNINIT
Definition: sdrv_spi.h:60
@ SPI_STATE_DMA_TX
Definition: sdrv_spi.h:65
@ SPI_STATE_IRQ_RX
Definition: sdrv_spi.h:68
@ SPI_STATE_IS_SLAVE
Definition: sdrv_spi.h:69
@ SPI_STATE_IRQ_TX
Definition: sdrv_spi.h:67
@ SPI_STATE_CS_ACTIVEED
Definition: sdrv_spi.h:70
@ SPI_STATE_BUSY_TX
Definition: sdrv_spi.h:62
void sdrv_spi_attach_async_callback(struct sdrv_spi *spi, spi_callback_t cb)
Setup the async callback handler.
spi_cs_select
Spi hardware cs select .
Definition: sdrv_spi.h:54
@ CS_SEL_SS3
Definition: sdrv_spi.h:54
@ CS_SEL_SS2
Definition: sdrv_spi.h:54
@ CS_SEL_SS0
Definition: sdrv_spi.h:54
@ CS_SEL_SS1
Definition: sdrv_spi.h:54
spi_cpha
Spi sclk phase mode.
Definition: sdrv_spi.h:41
@ DATA_CPT_ON_FIRST_SCK_EDGE
Definition: sdrv_spi.h:42
@ DATA_CPT_ON_SECOND_SCK_EDGE
Definition: sdrv_spi.h:43
int sdrv_spi_config_device(struct sdrv_spi *spi, const struct spi_device_config *cfg)
SPI device configuration.
fifo_state
Spi fifo state flags.
Definition: sdrv_spi.h:80
@ SPI_TX_DMA_ERR
Definition: sdrv_spi.h:85
@ SPI_RX_DMA_ERR
Definition: sdrv_spi.h:86
@ SPI_TX_FIFO_UDR
Definition: sdrv_spi.h:83
@ SPI_TX_FIFO_WRITE
Definition: sdrv_spi.h:82
@ SPI_RX_FIFO_OVR
Definition: sdrv_spi.h:84
@ SPI_TX_ONLY_DONE
Definition: sdrv_spi.h:87
@ SPI_RX_FIFO_READ
Definition: sdrv_spi.h:81
data_dir
Spi transmit data direction type .
Definition: sdrv_spi.h:126
@ SPI_TX_DIR
Definition: sdrv_spi.h:126
@ SPI_RX_DIR
Definition: sdrv_spi.h:126
int sdrv_spi_deinit(struct sdrv_spi *bus)
Deinitialize the SPI device.
spi_ops_type
Spi transmit mode .
Definition: sdrv_spi.h:108
@ OP_MODE_IRQ
Definition: sdrv_spi.h:110
@ OP_MODE_SYNC
Definition: sdrv_spi.h:109
@ OP_MODE_DMA
Definition: sdrv_spi.h:111
spi_cpol
Spi sclk idle mode.
Definition: sdrv_spi.h:36
@ SCK_IDLE_LOW
Definition: sdrv_spi.h:36
@ SCK_IDLE_HIGH
Definition: sdrv_spi.h:36
enum spi_bus_state sdrv_spi_get_status(struct sdrv_spi *spi)
Get SPI bus state.
int sdrv_spi_sync_transmit(struct sdrv_spi *spi, void *tx_buf, void *rx_buf, uint32_t bytes, uint32_t timeout)
SPI sync transmit.
spi_bus_state
Spi bus idle/busy state .
Definition: sdrv_spi.h:103
@ SPI_IDLE
Definition: sdrv_spi.h:103
@ SPI_BUSY
Definition: sdrv_spi.h:103
int sdrv_spi_init(struct sdrv_spi *spi, struct spi_common_config *cfg)
Initialize the SPI module.
int sdrv_spi_async_transmit(struct sdrv_spi *spi, void *tx_buf, void *rx_buf, uint32_t bytes, enum spi_ops_type type)
SPI async transmit in IRQ or DMA mode.
void(* spi_callback_t)(void *spi, spi_event_type Event)
Spi async transmit callback type .
Definition: sdrv_spi.h:131
Abstract clock slice node for driver operate.
Definition: sdrv_ckgen.h:184
DMA channel structure.
Definition: sdrv_dma.h:554
DMA controller structure.
Definition: sdrv_dma.h:472
Spi bus module handler type .
Definition: sdrv_spi.h:238
uint32_t cur_cmd
Definition: sdrv_spi.h:258
spi_callback_t callback
Definition: sdrv_spi.h:252
uint32_t base
Definition: sdrv_spi.h:240
uint32_t irq
Definition: sdrv_spi.h:242
uint32_t state
Definition: sdrv_spi.h:256
sdrv_dma_channel_t tx_dma_chan
Definition: sdrv_spi.h:265
uint32_t max_baudrate
Definition: sdrv_spi.h:244
const struct spi_common_config * com_config
Definition: sdrv_spi.h:248
struct spi_dma_context tx_context
Definition: sdrv_spi.h:267
struct spi_dma_context rx_context
Definition: sdrv_spi.h:263
sdrv_dma_channel_t rx_dma_chan
Definition: sdrv_spi.h:261
struct spi_transmit_cb transmit_sche
Definition: sdrv_spi.h:254
const struct spi_device_config * dev_config
Definition: sdrv_spi.h:250
uint32_t min_baudrate
Definition: sdrv_spi.h:246
uint32_t dma_err
Definition: sdrv_spi.h:269
Spi controller configuration .
Definition: sdrv_spi.h:166
sdrv_dma_channel_id_e rx_ch_id
Definition: sdrv_spi.h:177
uint32_t base
Definition: sdrv_spi.h:184
uint32_t irq
Definition: sdrv_spi.h:186
bool is_spi_mode
Definition: sdrv_spi.h:168
sdrv_dma_t * dma_ins
Definition: sdrv_spi.h:181
sdrv_dma_channel_id_e tx_ch_id
Definition: sdrv_spi.h:179
const sdrv_ckgen_slice_node_t * clk
Definition: sdrv_spi.h:188
bool is_polling_mode
Definition: sdrv_spi.h:174
bool is_master
Definition: sdrv_spi.h:172
bool is_half_mode
Definition: sdrv_spi.h:170
SPI device configuration.
Definition: sdrv_spi.h:136
uint8_t clk2cs_end_delay
Definition: sdrv_spi.h:154
uint8_t width
Definition: sdrv_spi.h:148
uint32_t sclk_freq
Definition: sdrv_spi.h:138
uint8_t fream_delay
Definition: sdrv_spi.h:150
uint8_t cs_sel
Definition: sdrv_spi.h:146
enum spi_cpha cpha
Definition: sdrv_spi.h:142
bool is_tx_delay
Definition: sdrv_spi.h:160
bool is_soft_cs
Definition: sdrv_spi.h:158
enum spi_cs_polarity cs_pol
Definition: sdrv_spi.h:144
uint8_t clk2cs_delay
Definition: sdrv_spi.h:152
bool is_lsb_mode
Definition: sdrv_spi.h:156
enum spi_cpol cpol
Definition: sdrv_spi.h:140
Spi dma context type .
Definition: sdrv_spi.h:205
void * bus
Definition: sdrv_spi.h:207
bool is_need_handle
Definition: sdrv_spi.h:208
enum data_dir dir
Definition: sdrv_spi.h:206
Spi transmit context type .
Definition: sdrv_spi.h:214
uint32_t expect_len
Definition: sdrv_spi.h:230
uint32_t cur_remian
Definition: sdrv_spi.h:228
uint32_t rx_cur
Definition: sdrv_spi.h:224
uint32_t len
Definition: sdrv_spi.h:216
union spi_data_ptr ptxdata
Definition: sdrv_spi.h:222
union spi_data_ptr prxdata
Definition: sdrv_spi.h:220
struct spi_transmit_cb * next
Definition: sdrv_spi.h:232
uint32_t tx_cur
Definition: sdrv_spi.h:226
uint8_t width_type
Definition: sdrv_spi.h:218
Spi transmition data ptr .
Definition: sdrv_spi.h:194
uint16_t * u16_ptr
Definition: sdrv_spi.h:198
uint8_t * u8_ptr
Definition: sdrv_spi.h:197
uint32_t val
Definition: sdrv_spi.h:196
uint32_t * u32_ptr
Definition: sdrv_spi.h:199