blob: bc9b4b8228a979a19cc4d5e69b1c84c8877592f5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
/*
* Copyright (c) 2006-2025 RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* spi driver for synopsys dw apb spi
*
* Change Logs:
* Date Author Notes
* 2025-01-03 ZhangJing first version
*/
#ifndef __DRV_DW_SPI_H__
#define __DRV_DW_SPI_H__
/* dw spi register */
struct dw_spi_regs
{
uint32_t ctrl0; /* 0x00:Control Register 0 (ctrl0) */
uint32_t ctrl1; /* 0x04:Control Register 1 (ctrl1) */
uint32_t ssienr; /* 0x08:Synchronous Serial Interface Enable Register (ssienr) */
uint32_t mwcr; /* 0x0c:Master Mode Control Register (mwcr) */
uint32_t ser; /* 0x10:Slave Enable Register (ser) */
uint32_t baudr; /* 0x14:Baud Rate Select Register (baudr) */
uint32_t txftlr; /* 0x18:Transmit FIFO Threshold Level Register (txftlr) */
uint32_t rxftlr; /* 0x1c:Receive FIFO Threshold Level Register (rxftlr) */
uint32_t txflr; /* 0x20:Transmit FIFO Level Register (txflr) */
uint32_t rxflr; /* 0x24:Receive FIFO Level Register (rxflr) */
uint32_t sr; /* 0x28:Status Register (sr) */
uint32_t imr; /* 0x2c:Interrupt Mask Register (imr) */
uint32_t isr; /* 0x30:Interrupt Status Register (isr) */
uint32_t risr; /* 0x34:Raw Interrupt Status Register (risr) */
uint32_t txoicr; /* 0x38:Transmit FIFO Overflow Interrupt Clear Register (txoicr) */
uint32_t rxoicr; /* 0x3c:Receive FIFO Overflow Interrupt Clear Register (rxoicr) */
uint32_t rxuicr; /* 0x40:Receive FIFO Underflow Interrupt Clear Register (rxuicr) */
uint32_t msticr; /* 0x44:Multi-Master Contention Interrupt Clear Register (msticr) */
uint32_t icr; /* 0x48:Interrupt Clear Register (icr) */
uint32_t dmacr; /* 0x4c:DMA Control Register (dmacr) */
uint32_t dmatdlr; /* 0x50:DMA Transmit Data Level Register (dmatdlr) */
uint32_t dmardlr; /* 0x54:DMA Receive Data Level Register (dmardlr) */
uint32_t idr; /* 0x58:Identification Register (idr) */
uint32_t version; /* 0x5c:Version Register (version) */
uint32_t dr[36]; /* 0x60:Data Register (dr) */
uint32_t rx_sample_delay; /* 0xf0: RX Sample Delay Register */
uint32_t spi_ctrl0; /* 0xf4*/
uint32_t txd_drive_edge; /* 0xf8*/
uint32_t rsvd; /* 0xfc*/
};
/* dw spi device */
struct dw_spi
{
struct dw_spi_regs *reg;
struct rt_spi_bus spi_bus;
char *device_name;
uint32_t version;
int irq;
uint32_t fifo_len;
uint32_t max_freq;
int bits_per_word;
void *tx;
void *tx_end;
void *rx;
void *rx_end;
unsigned int tx_len;
unsigned int rx_len;
uint32_t (*update_cr0)(struct dw_spi *dw_spi_dev);
uint8_t mode;
uint8_t cs; /* chip select pin */
uint8_t tmode; /* TR/TO/RO/EEPROM */
uint8_t type; /* SPI/SSP/MicroWire */
};
/* CTRLR0 bit definiation */
#define DW_SPI_CTRLR0_DFS_MASK ((uint32_t)0x000F)
#define CTRLR0_DFS_SHIFT 0
#define DW_SPI_CTRLR0_DFS_0 ((uint32_t)(1<<0))
#define DW_SPI_CTRLR0_DFS_1 ((uint32_t)(1<<1))
#define DW_SPI_CTRLR0_DFS_2 ((uint32_t)(1<<2))
#define DW_SPI_CTRLR0_DFS_3 ((uint32_t)(1<<3))
#define DW_SPI_CTRLR0_FRF_SHIFT (4)
#define DW_SPI_CTRLR0_FRF_MOT (0)
#define DW_SPI_CTRLR0_FRF_TI (1)
#define DW_SPI_CTRLR0_FRF_MICROWIRE (2)
#define DW_SPI_CTRLR0_FRF_RESV (3)
#define DW_SPI_CTRLR0_MODE_SHIFT (6)
#define DW_SPI_CTRLR0_SCPH ((uint32_t)(1<<6))
#define DW_SPI_CTRLR0_SCPOL ((uint32_t)(1<<7))
#define DW_SPI_CTRLR0_TMOD_SHIFT (8)
#define DW_SPI_CTRLR0_TMOD_TX_RX (0) /* transmit and receive */
#define DW_SPI_CTRLR0_TMOD_TX (1) /* transmit only */
#define DW_SPI_CTRLR0_TMOD_RX (2) /* receive only */
#define DW_SPI_CTRLR0_TMOD_EEPROM_READ (3) /* eeprom read mode */
#define CTRLR0_DFS_32_SHIFT (16)
#define DW_SPI_CTRLR0_SLV_OE ((uint32_t)(1<<10)) /* salve output enable */
#define DW_SPI_CTRLR0_SRL ((uint32_t)(1<<11)) /* shift register loop */
#define DW_SPI_CTRLR0_CFS ((uint32_t)(0xF << 12)) /* control frame size */
#define DW_SPI_SR_BUSY ((uint32_t)(1<<0))
#define DW_SPI_SR_TX_EMPTY ((uint32_t)(1<<2))
#endif /* __DRV_DW_SPI_H__ */
|