aboutsummaryrefslogtreecommitdiff
path: root/fdl/ch573/spi.fdl
diff options
context:
space:
mode:
Diffstat (limited to 'fdl/ch573/spi.fdl')
-rw-r--r--fdl/ch573/spi.fdl158
1 files changed, 158 insertions, 0 deletions
diff --git a/fdl/ch573/spi.fdl b/fdl/ch573/spi.fdl
new file mode 100644
index 0000000..855d17f
--- /dev/null
+++ b/fdl/ch573/spi.fdl
@@ -0,0 +1,158 @@
+import "ch573/common.fdl";
+
+/** Package for the SPI subsystem. */
+package ch573.spi {
+
+ location spi_base = 0x4000_4000;
+
+ using ch573.common;
+
+ type spi_t : struct {
+ /** SPI0 Control Mode Register */
+ reg ctrl_mod(8) : struct {
+ /** SPI master/slave mode select */
+ mode_slave : bit_t;
+ /** Clear FIFO/counter/interrupt flag */
+ all_clear : bit_t;
+ /** 2-wire/3-wire SPI mode select in slave mode */
+ wire_2_mod : bit_t;
+ union {
+ /** Clock idle mode select in master mode */
+ mst_sck_mod : bit_t;
+ /** First byte command mode select in slave mode */
+ slv_cmd_mod : bit_t;
+ };
+ /** FIFO direction setting bit */
+ fifo_dir : bit_t;
+ /** SCK output enable bit */
+ sck_oe : bit_t;
+ /** MOSI output enable bit */
+ mosi_oe : bit_t;
+ /** MISO output enable bit */
+ miso_oe : bit_t;
+ };
+
+ /** SPI0 Control Configuration Register */
+ reg ctrl_cfg(8) : struct {
+ /** DMA function enable bit */
+ dma_enable : bit_t;
+ reserved(1);
+ /** DMA address loop enable bit */
+ dma_loop : bit_t;
+ reserved(1);
+ /** Auto-clear RB_SPI_IF_BYTE_END when accessing BUFFER/FIFO */
+ auto_if : bit_t;
+ /** SPI data bit sequence selection */
+ bit_order : bit_t;
+ /** Input delay enable in master mode */
+ mst_dly_en : bit_t;
+ reserved(1);
+ };
+
+ /** SPI0 Interrupt Enable Register */
+ reg inter_en(8) : struct {
+ /** All byte transmission completion interrupt enable bit */
+ ie_cnt_end : bit_t;
+ /** Single byte transmission completion interrupt enable bit */
+ ie_byte_end : bit_t;
+ /** More than half FIFO used interrupt enable bit */
+ ie_fifo_hf : bit_t;
+ /** DMA end interrupt enable bit */
+ ie_dma_end : bit_t;
+ /** FIFO overflow interrupt enable bit */
+ ie_fifo_ov : bit_t;
+ reserved(2);
+ /** Enable receiving the first byte interrupt in slave mode */
+ ie_fst_byte : bit_t;
+ };
+
+ assert_pos(0x03);
+ union {
+ /** SPI0 Clock Divider Register */
+ reg clock_div(8);
+ /** SPI0 Preset data register in slave mode. */
+ reg slave_pre(8);
+ };
+
+ assert_pos(0x04);
+ /** SPI0 Data Buffer Register */
+ reg data_buf(8);
+
+ assert_pos(0x05);
+ /** SPI0 Status Register */
+ reg status(8) : struct {
+ reserved(4);
+ /** Command receive completion in slave mode */
+ slv_cmd_act : bit_t;
+ /** FIFO ready status */
+ fifo_ready : bit_t;
+ /** First loading status after chip select in slave mode */
+ slv_cs_load : bit_t;
+ /** Chip select status in slave mode */
+ slv_select : bit_t;
+ };
+
+ assert_pos(0x06);
+ /** SPI0 Interrupt Flag Register */
+ reg int_flag(8) : struct {
+ /** All byte transmission completion flag */
+ if_cnt_end : bit_t;
+ /** Single byte transmission completion flag */
+ if_byte_end : bit_t;
+ /** More than half FIFO used flag */
+ if_fifo_hf : bit_t;
+ /** DMA completion flag */
+ if_dma_end : bit_t;
+ /** FIFO overflow flag */
+ if_fifo_ov : bit_t;
+ reserved(1);
+ /** SPI idle status */
+ free : bit_t;
+ /** First byte received flag in slave mode */
+ if_fst_byte : bit_t;
+ };
+
+ assert_pos(0x07);
+ /** SPI0 FIFO Count Register */
+ reg fifo_count(8);
+
+ skip_to(0x0C);
+ /** SPI0 Total Transmission Length Register */
+ reg total_count(16);
+
+ skip_to(0x10);
+ reg fifo(8);
+ reserved(16);
+
+ assert_pos(0x13);
+ reg fifo_count_1(8);
+
+ assert_pos(0x14);
+ /** SPI0 DMA Buffer Current Address */
+ reg (16) : struct {
+ /** DMA buffer current address (lower 14 bits valid) */
+ dma_now : (14);
+ reserved(2);
+ };
+ reserved(16);
+
+ assert_pos(0x18);
+ /** SPI0 DMA Buffer Start Address */
+ reg (16) : struct {
+ /** DMA buffer start address (lower 14 bits valid) */
+ dma_beg : (14);
+ reserved(2);
+ };
+ reserved(16);
+
+ assert_pos(0x1C);
+ /** SPI0 DMA Buffer End Address */
+ reg (16) : struct {
+ /** DMA buffer end address (lower 14 bits valid) */
+ dma_end : (14);
+ reserved(2);
+ };
+ };
+
+ instance spi0 at spi_base : spi_t;
+};