1 // THIS HEADER FILE IS AUTOMATICALLY GENERATED -- DO NOT EDIT 2 3 /** 4 * Copyright (c) 2024 Raspberry Pi Ltd. 5 * 6 * SPDX-License-Identifier: BSD-3-Clause 7 */ 8 #ifndef _HARDWARE_STRUCTS_DMA_H 9 #define _HARDWARE_STRUCTS_DMA_H 10 11 /** 12 * \file rp2040/dma.h 13 */ 14 15 #include "hardware/address_mapped.h" 16 #include "hardware/regs/dma.h" 17 #include "hardware/structs/dma_debug.h" 18 19 // Reference to datasheet: https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#tab-registerlist_dma 20 // 21 // The _REG_ macro is intended to help make the register navigable in your IDE (for example, using the "Go to Definition" feature) 22 // _REG_(x) will link to the corresponding register in hardware/regs/dma.h. 23 // 24 // Bit-field descriptions are of the form: 25 // BITMASK [BITRANGE] FIELDNAME (RESETVALUE) DESCRIPTION 26 27 typedef struct { 28 _REG_(DMA_CH0_READ_ADDR_OFFSET) // DMA_CH0_READ_ADDR 29 // DMA Channel 0 Read Address pointer 30 // 0xffffffff [31:0] CH0_READ_ADDR (0x00000000) This register updates automatically each time a read completes 31 io_rw_32 read_addr; 32 33 _REG_(DMA_CH0_WRITE_ADDR_OFFSET) // DMA_CH0_WRITE_ADDR 34 // DMA Channel 0 Write Address pointer 35 // 0xffffffff [31:0] CH0_WRITE_ADDR (0x00000000) This register updates automatically each time a write completes 36 io_rw_32 write_addr; 37 38 _REG_(DMA_CH0_TRANS_COUNT_OFFSET) // DMA_CH0_TRANS_COUNT 39 // DMA Channel 0 Transfer Count 40 // 0xffffffff [31:0] CH0_TRANS_COUNT (0x00000000) Program the number of bus transfers a channel will... 41 io_rw_32 transfer_count; 42 43 _REG_(DMA_CH0_CTRL_TRIG_OFFSET) // DMA_CH0_CTRL_TRIG 44 // DMA Channel 0 Control and Status 45 // 0x80000000 [31] AHB_ERROR (0) Logical OR of the READ_ERROR and WRITE_ERROR flags 46 // 0x40000000 [30] READ_ERROR (0) If 1, the channel received a read bus error 47 // 0x20000000 [29] WRITE_ERROR (0) If 1, the channel received a write bus error 48 // 0x01000000 [24] BUSY (0) This flag goes high when the channel starts a new... 49 // 0x00800000 [23] SNIFF_EN (0) If 1, this channel's data transfers are visible to the... 50 // 0x00400000 [22] BSWAP (0) Apply byte-swap transformation to DMA data 51 // 0x00200000 [21] IRQ_QUIET (0) In QUIET mode, the channel does not generate IRQs at the... 52 // 0x001f8000 [20:15] TREQ_SEL (0x00) Select a Transfer Request signal 53 // 0x00007800 [14:11] CHAIN_TO (0x0) When this channel completes, it will trigger the channel... 54 // 0x00000400 [10] RING_SEL (0) Select whether RING_SIZE applies to read or write addresses 55 // 0x000003c0 [9:6] RING_SIZE (0x0) Size of address wrap region 56 // 0x00000020 [5] INCR_WRITE (0) If 1, the write address increments with each transfer 57 // 0x00000010 [4] INCR_READ (0) If 1, the read address increments with each transfer 58 // 0x0000000c [3:2] DATA_SIZE (0x0) Set the size of each bus transfer (byte/halfword/word) 59 // 0x00000002 [1] HIGH_PRIORITY (0) HIGH_PRIORITY gives a channel preferential treatment in... 60 // 0x00000001 [0] EN (0) DMA Channel Enable 61 io_rw_32 ctrl_trig; 62 63 _REG_(DMA_CH0_AL1_CTRL_OFFSET) // DMA_CH0_AL1_CTRL 64 // Alias for channel 0 CTRL register 65 // 0xffffffff [31:0] CH0_AL1_CTRL (-) 66 io_rw_32 al1_ctrl; 67 68 _REG_(DMA_CH0_AL1_READ_ADDR_OFFSET) // DMA_CH0_AL1_READ_ADDR 69 // Alias for channel 0 READ_ADDR register 70 // 0xffffffff [31:0] CH0_AL1_READ_ADDR (-) 71 io_rw_32 al1_read_addr; 72 73 _REG_(DMA_CH0_AL1_WRITE_ADDR_OFFSET) // DMA_CH0_AL1_WRITE_ADDR 74 // Alias for channel 0 WRITE_ADDR register 75 // 0xffffffff [31:0] CH0_AL1_WRITE_ADDR (-) 76 io_rw_32 al1_write_addr; 77 78 _REG_(DMA_CH0_AL1_TRANS_COUNT_TRIG_OFFSET) // DMA_CH0_AL1_TRANS_COUNT_TRIG 79 // Alias for channel 0 TRANS_COUNT register + 80 // 0xffffffff [31:0] CH0_AL1_TRANS_COUNT_TRIG (-) 81 io_rw_32 al1_transfer_count_trig; 82 83 _REG_(DMA_CH0_AL2_CTRL_OFFSET) // DMA_CH0_AL2_CTRL 84 // Alias for channel 0 CTRL register 85 // 0xffffffff [31:0] CH0_AL2_CTRL (-) 86 io_rw_32 al2_ctrl; 87 88 _REG_(DMA_CH0_AL2_TRANS_COUNT_OFFSET) // DMA_CH0_AL2_TRANS_COUNT 89 // Alias for channel 0 TRANS_COUNT register 90 // 0xffffffff [31:0] CH0_AL2_TRANS_COUNT (-) 91 io_rw_32 al2_transfer_count; 92 93 _REG_(DMA_CH0_AL2_READ_ADDR_OFFSET) // DMA_CH0_AL2_READ_ADDR 94 // Alias for channel 0 READ_ADDR register 95 // 0xffffffff [31:0] CH0_AL2_READ_ADDR (-) 96 io_rw_32 al2_read_addr; 97 98 _REG_(DMA_CH0_AL2_WRITE_ADDR_TRIG_OFFSET) // DMA_CH0_AL2_WRITE_ADDR_TRIG 99 // Alias for channel 0 WRITE_ADDR register + 100 // 0xffffffff [31:0] CH0_AL2_WRITE_ADDR_TRIG (-) 101 io_rw_32 al2_write_addr_trig; 102 103 _REG_(DMA_CH0_AL3_CTRL_OFFSET) // DMA_CH0_AL3_CTRL 104 // Alias for channel 0 CTRL register 105 // 0xffffffff [31:0] CH0_AL3_CTRL (-) 106 io_rw_32 al3_ctrl; 107 108 _REG_(DMA_CH0_AL3_WRITE_ADDR_OFFSET) // DMA_CH0_AL3_WRITE_ADDR 109 // Alias for channel 0 WRITE_ADDR register 110 // 0xffffffff [31:0] CH0_AL3_WRITE_ADDR (-) 111 io_rw_32 al3_write_addr; 112 113 _REG_(DMA_CH0_AL3_TRANS_COUNT_OFFSET) // DMA_CH0_AL3_TRANS_COUNT 114 // Alias for channel 0 TRANS_COUNT register 115 // 0xffffffff [31:0] CH0_AL3_TRANS_COUNT (-) 116 io_rw_32 al3_transfer_count; 117 118 _REG_(DMA_CH0_AL3_READ_ADDR_TRIG_OFFSET) // DMA_CH0_AL3_READ_ADDR_TRIG 119 // Alias for channel 0 READ_ADDR register + 120 // 0xffffffff [31:0] CH0_AL3_READ_ADDR_TRIG (-) 121 io_rw_32 al3_read_addr_trig; 122 } dma_channel_hw_t; 123 124 typedef struct { 125 _REG_(DMA_INTR_OFFSET) // DMA_INTR 126 // Interrupt Status (raw) 127 // 0x0000ffff [15:0] INTR (0x0000) Raw interrupt status for DMA Channels 0 128 io_rw_32 intr; 129 130 _REG_(DMA_INTE0_OFFSET) // DMA_INTE0 131 // Interrupt Enables for IRQ 0 132 // 0x0000ffff [15:0] INTE0 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 0 133 io_rw_32 inte; 134 135 _REG_(DMA_INTF0_OFFSET) // DMA_INTF0 136 // Force Interrupts 137 // 0x0000ffff [15:0] INTF0 (0x0000) Write 1s to force the corresponding bits in INTE0 138 io_rw_32 intf; 139 140 _REG_(DMA_INTS0_OFFSET) // DMA_INTS0 141 // Interrupt Status for IRQ 0 142 // 0x0000ffff [15:0] INTS0 (0x0000) Indicates active channel interrupt requests which are... 143 io_rw_32 ints; 144 } dma_irq_ctrl_hw_t; 145 146 typedef struct { 147 dma_channel_hw_t ch[12]; 148 149 uint32_t _pad0[64]; 150 151 union { 152 struct { 153 _REG_(DMA_INTR_OFFSET) // DMA_INTR 154 // Interrupt Status (raw) 155 // 0x0000ffff [15:0] INTR (0x0000) Raw interrupt status for DMA Channels 0 156 io_rw_32 intr; 157 158 _REG_(DMA_INTE0_OFFSET) // DMA_INTE0 159 // Interrupt Enables for IRQ 0 160 // 0x0000ffff [15:0] INTE0 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 0 161 io_rw_32 inte0; 162 163 _REG_(DMA_INTF0_OFFSET) // DMA_INTF0 164 // Force Interrupts 165 // 0x0000ffff [15:0] INTF0 (0x0000) Write 1s to force the corresponding bits in INTE0 166 io_rw_32 intf0; 167 168 _REG_(DMA_INTS0_OFFSET) // DMA_INTS0 169 // Interrupt Status for IRQ 0 170 // 0x0000ffff [15:0] INTS0 (0x0000) Indicates active channel interrupt requests which are... 171 io_rw_32 ints0; 172 173 uint32_t __pad0; 174 175 _REG_(DMA_INTE1_OFFSET) // DMA_INTE1 176 // Interrupt Enables for IRQ 1 177 // 0x0000ffff [15:0] INTE1 (0x0000) Set bit n to pass interrupts from channel n to DMA IRQ 1 178 io_rw_32 inte1; 179 180 _REG_(DMA_INTF1_OFFSET) // DMA_INTF1 181 // Force Interrupts for IRQ 1 182 // 0x0000ffff [15:0] INTF1 (0x0000) Write 1s to force the corresponding bits in INTF1 183 io_rw_32 intf1; 184 185 _REG_(DMA_INTS1_OFFSET) // DMA_INTS1 186 // Interrupt Status (masked) for IRQ 1 187 // 0x0000ffff [15:0] INTS1 (0x0000) Indicates active channel interrupt requests which are... 188 io_rw_32 ints1; 189 }; 190 dma_irq_ctrl_hw_t irq_ctrl[2]; 191 }; 192 193 // (Description copied from array index 0 register DMA_TIMER0 applies similarly to other array indexes) 194 _REG_(DMA_TIMER0_OFFSET) // DMA_TIMER0 195 // Pacing (X/Y) Fractional Timer + 196 // 0xffff0000 [31:16] X (0x0000) Pacing Timer Dividend 197 // 0x0000ffff [15:0] Y (0x0000) Pacing Timer Divisor 198 io_rw_32 timer[4]; 199 200 _REG_(DMA_MULTI_CHAN_TRIGGER_OFFSET) // DMA_MULTI_CHAN_TRIGGER 201 // Trigger one or more channels simultaneously 202 // 0x0000ffff [15:0] MULTI_CHAN_TRIGGER (0x0000) Each bit in this register corresponds to a DMA channel 203 io_wo_32 multi_channel_trigger; 204 205 _REG_(DMA_SNIFF_CTRL_OFFSET) // DMA_SNIFF_CTRL 206 // Sniffer Control 207 // 0x00000800 [11] OUT_INV (0) If set, the result appears inverted (bitwise complement)... 208 // 0x00000400 [10] OUT_REV (0) If set, the result appears bit-reversed when read 209 // 0x00000200 [9] BSWAP (0) Locally perform a byte reverse on the sniffed data,... 210 // 0x000001e0 [8:5] CALC (0x0) 211 // 0x0000001e [4:1] DMACH (0x0) DMA channel for Sniffer to observe 212 // 0x00000001 [0] EN (0) Enable sniffer 213 io_rw_32 sniff_ctrl; 214 215 _REG_(DMA_SNIFF_DATA_OFFSET) // DMA_SNIFF_DATA 216 // Data accumulator for sniff hardware 217 // 0xffffffff [31:0] SNIFF_DATA (0x00000000) Write an initial seed value here before starting a DMA... 218 io_rw_32 sniff_data; 219 220 uint32_t _pad1; 221 222 _REG_(DMA_FIFO_LEVELS_OFFSET) // DMA_FIFO_LEVELS 223 // Debug RAF, WAF, TDF levels 224 // 0x00ff0000 [23:16] RAF_LVL (0x00) Current Read-Address-FIFO fill level 225 // 0x0000ff00 [15:8] WAF_LVL (0x00) Current Write-Address-FIFO fill level 226 // 0x000000ff [7:0] TDF_LVL (0x00) Current Transfer-Data-FIFO fill level 227 io_ro_32 fifo_levels; 228 229 _REG_(DMA_CHAN_ABORT_OFFSET) // DMA_CHAN_ABORT 230 // Abort an in-progress transfer sequence on one or more channels 231 // 0x0000ffff [15:0] CHAN_ABORT (0x0000) Each bit corresponds to a channel 232 io_wo_32 abort; 233 } dma_hw_t; 234 235 #define dma_hw ((dma_hw_t *)DMA_BASE) 236 static_assert(sizeof (dma_hw_t) == 0x0448, ""); 237 238 #endif // _HARDWARE_STRUCTS_DMA_H 239 240