summaryrefslogtreecommitdiff
path: root/bsp/ultrarisc/drivers/drv_dw_spi.h
diff options
context:
space:
mode:
Diffstat (limited to 'bsp/ultrarisc/drivers/drv_dw_spi.h')
-rw-r--r--bsp/ultrarisc/drivers/drv_dw_spi.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/bsp/ultrarisc/drivers/drv_dw_spi.h b/bsp/ultrarisc/drivers/drv_dw_spi.h
new file mode 100644
index 0000000000..bc9b4b8228
--- /dev/null
+++ b/bsp/ultrarisc/drivers/drv_dw_spi.h
@@ -0,0 +1,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__ */ \ No newline at end of file