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_PIO_H
9 #define _HARDWARE_STRUCTS_PIO_H
10 
11 /**
12  * \file rp2350/pio.h
13  */
14 
15 #include "hardware/address_mapped.h"
16 #include "hardware/regs/pio.h"
17 
18 // Reference to datasheet: https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf#tab-registerlist_pio
19 //
20 // The _REG_ macro is intended to help make the register navigable in your IDE (for example, using the "Go to Definition" feature)
21 // _REG_(x) will link to the corresponding register in hardware/regs/pio.h.
22 //
23 // Bit-field descriptions are of the form:
24 // BITMASK [BITRANGE] FIELDNAME (RESETVALUE) DESCRIPTION
25 
26 typedef struct {
27     _REG_(PIO_SM0_CLKDIV_OFFSET) // PIO_SM0_CLKDIV
28     // Clock divisor register for state machine 0 +
29     // 0xffff0000 [31:16] INT          (0x0001) Effective frequency is sysclk/(int + frac/256)
30     // 0x0000ff00 [15:8]  FRAC         (0x00) Fractional part of clock divisor
31     io_rw_32 clkdiv;
32 
33     _REG_(PIO_SM0_EXECCTRL_OFFSET) // PIO_SM0_EXECCTRL
34     // Execution/behavioural settings for state machine 0
35     // 0x80000000 [31]    EXEC_STALLED (0) If 1, an instruction written to SMx_INSTR is stalled,...
36     // 0x40000000 [30]    SIDE_EN      (0) If 1, the MSB of the Delay/Side-set instruction field is...
37     // 0x20000000 [29]    SIDE_PINDIR  (0) If 1, side-set data is asserted to pin directions,...
38     // 0x1f000000 [28:24] JMP_PIN      (0x00) The GPIO number to use as condition for JMP PIN
39     // 0x00f80000 [23:19] OUT_EN_SEL   (0x00) Which data bit to use for inline OUT enable
40     // 0x00040000 [18]    INLINE_OUT_EN (0) If 1, use a bit of OUT data as an auxiliary write enable +
41     // 0x00020000 [17]    OUT_STICKY   (0) Continuously assert the most recent OUT/SET to the pins
42     // 0x0001f000 [16:12] WRAP_TOP     (0x1f) After reaching this address, execution is wrapped to wrap_bottom
43     // 0x00000f80 [11:7]  WRAP_BOTTOM  (0x00) After reaching wrap_top, execution is wrapped to this address
44     // 0x00000060 [6:5]   STATUS_SEL   (0x0) Comparison used for the MOV x, STATUS instruction
45     // 0x0000001f [4:0]   STATUS_N     (0x00) Comparison level or IRQ index for the MOV x, STATUS instruction
46     io_rw_32 execctrl;
47 
48     _REG_(PIO_SM0_SHIFTCTRL_OFFSET) // PIO_SM0_SHIFTCTRL
49     // Control behaviour of the input/output shift registers for state machine 0
50     // 0x80000000 [31]    FJOIN_RX     (0) When 1, RX FIFO steals the TX FIFO's storage, and...
51     // 0x40000000 [30]    FJOIN_TX     (0) When 1, TX FIFO steals the RX FIFO's storage, and...
52     // 0x3e000000 [29:25] PULL_THRESH  (0x00) Number of bits shifted out of OSR before autopull, or...
53     // 0x01f00000 [24:20] PUSH_THRESH  (0x00) Number of bits shifted into ISR before autopush, or...
54     // 0x00080000 [19]    OUT_SHIFTDIR (1) 1 = shift out of output shift register to right
55     // 0x00040000 [18]    IN_SHIFTDIR  (1) 1 = shift input shift register to right (data enters from left)
56     // 0x00020000 [17]    AUTOPULL     (0) Pull automatically when the output shift register is emptied, i
57     // 0x00010000 [16]    AUTOPUSH     (0) Push automatically when the input shift register is filled, i
58     // 0x00008000 [15]    FJOIN_RX_PUT (0) If 1, disable this state machine's RX FIFO, make its...
59     // 0x00004000 [14]    FJOIN_RX_GET (0) If 1, disable this state machine's RX FIFO, make its...
60     // 0x0000001f [4:0]   IN_COUNT     (0x00) Set the number of pins which are not masked to 0 when...
61     io_rw_32 shiftctrl;
62 
63     _REG_(PIO_SM0_ADDR_OFFSET) // PIO_SM0_ADDR
64     // Current instruction address of state machine 0
65     // 0x0000001f [4:0]   SM0_ADDR     (0x00)
66     io_ro_32 addr;
67 
68     _REG_(PIO_SM0_INSTR_OFFSET) // PIO_SM0_INSTR
69     // Read to see the instruction currently addressed by state machine 0's program counter +
70     // 0x0000ffff [15:0]  SM0_INSTR    (-)
71     io_rw_32 instr;
72 
73     _REG_(PIO_SM0_PINCTRL_OFFSET) // PIO_SM0_PINCTRL
74     // State machine pin control
75     // 0xe0000000 [31:29] SIDESET_COUNT (0x0) The number of MSBs of the Delay/Side-set instruction...
76     // 0x1c000000 [28:26] SET_COUNT    (0x5) The number of pins asserted by a SET
77     // 0x03f00000 [25:20] OUT_COUNT    (0x00) The number of pins asserted by an OUT PINS, OUT PINDIRS...
78     // 0x000f8000 [19:15] IN_BASE      (0x00) The pin which is mapped to the least-significant bit of...
79     // 0x00007c00 [14:10] SIDESET_BASE (0x00) The lowest-numbered pin that will be affected by a...
80     // 0x000003e0 [9:5]   SET_BASE     (0x00) The lowest-numbered pin that will be affected by a SET...
81     // 0x0000001f [4:0]   OUT_BASE     (0x00) The lowest-numbered pin that will be affected by an OUT...
82     io_rw_32 pinctrl;
83 } pio_sm_hw_t;
84 
85 typedef struct {
86     _REG_(PIO_IRQ0_INTE_OFFSET) // PIO_IRQ0_INTE
87     // Interrupt Enable for irq0
88     // 0x00008000 [15]    SM7          (0)
89     // 0x00004000 [14]    SM6          (0)
90     // 0x00002000 [13]    SM5          (0)
91     // 0x00001000 [12]    SM4          (0)
92     // 0x00000800 [11]    SM3          (0)
93     // 0x00000400 [10]    SM2          (0)
94     // 0x00000200 [9]     SM1          (0)
95     // 0x00000100 [8]     SM0          (0)
96     // 0x00000080 [7]     SM3_TXNFULL  (0)
97     // 0x00000040 [6]     SM2_TXNFULL  (0)
98     // 0x00000020 [5]     SM1_TXNFULL  (0)
99     // 0x00000010 [4]     SM0_TXNFULL  (0)
100     // 0x00000008 [3]     SM3_RXNEMPTY (0)
101     // 0x00000004 [2]     SM2_RXNEMPTY (0)
102     // 0x00000002 [1]     SM1_RXNEMPTY (0)
103     // 0x00000001 [0]     SM0_RXNEMPTY (0)
104     io_rw_32 inte;
105 
106     _REG_(PIO_IRQ0_INTF_OFFSET) // PIO_IRQ0_INTF
107     // Interrupt Force for irq0
108     // 0x00008000 [15]    SM7          (0)
109     // 0x00004000 [14]    SM6          (0)
110     // 0x00002000 [13]    SM5          (0)
111     // 0x00001000 [12]    SM4          (0)
112     // 0x00000800 [11]    SM3          (0)
113     // 0x00000400 [10]    SM2          (0)
114     // 0x00000200 [9]     SM1          (0)
115     // 0x00000100 [8]     SM0          (0)
116     // 0x00000080 [7]     SM3_TXNFULL  (0)
117     // 0x00000040 [6]     SM2_TXNFULL  (0)
118     // 0x00000020 [5]     SM1_TXNFULL  (0)
119     // 0x00000010 [4]     SM0_TXNFULL  (0)
120     // 0x00000008 [3]     SM3_RXNEMPTY (0)
121     // 0x00000004 [2]     SM2_RXNEMPTY (0)
122     // 0x00000002 [1]     SM1_RXNEMPTY (0)
123     // 0x00000001 [0]     SM0_RXNEMPTY (0)
124     io_rw_32 intf;
125 
126     _REG_(PIO_IRQ0_INTS_OFFSET) // PIO_IRQ0_INTS
127     // Interrupt status after masking & forcing for irq0
128     // 0x00008000 [15]    SM7          (0)
129     // 0x00004000 [14]    SM6          (0)
130     // 0x00002000 [13]    SM5          (0)
131     // 0x00001000 [12]    SM4          (0)
132     // 0x00000800 [11]    SM3          (0)
133     // 0x00000400 [10]    SM2          (0)
134     // 0x00000200 [9]     SM1          (0)
135     // 0x00000100 [8]     SM0          (0)
136     // 0x00000080 [7]     SM3_TXNFULL  (0)
137     // 0x00000040 [6]     SM2_TXNFULL  (0)
138     // 0x00000020 [5]     SM1_TXNFULL  (0)
139     // 0x00000010 [4]     SM0_TXNFULL  (0)
140     // 0x00000008 [3]     SM3_RXNEMPTY (0)
141     // 0x00000004 [2]     SM2_RXNEMPTY (0)
142     // 0x00000002 [1]     SM1_RXNEMPTY (0)
143     // 0x00000001 [0]     SM0_RXNEMPTY (0)
144     io_ro_32 ints;
145 } pio_irq_ctrl_hw_t;
146 
147 typedef struct {
148     _REG_(PIO_CTRL_OFFSET) // PIO_CTRL
149     // PIO control register
150     // 0x04000000 [26]    NEXTPREV_CLKDIV_RESTART (0) Write 1 to restart the clock dividers of state machines...
151     // 0x02000000 [25]    NEXTPREV_SM_DISABLE (0) Write 1 to disable state machines in neighbouring PIO...
152     // 0x01000000 [24]    NEXTPREV_SM_ENABLE (0) Write 1 to enable state machines in neighbouring PIO...
153     // 0x00f00000 [23:20] NEXT_PIO_MASK (0x0) A mask of state machines in the neighbouring...
154     // 0x000f0000 [19:16] PREV_PIO_MASK (0x0) A mask of state machines in the neighbouring...
155     // 0x00000f00 [11:8]  CLKDIV_RESTART (0x0) Restart a state machine's clock divider from an initial...
156     // 0x000000f0 [7:4]   SM_RESTART   (0x0) Write 1 to instantly clear internal SM state which may...
157     // 0x0000000f [3:0]   SM_ENABLE    (0x0) Enable/disable each of the four state machines by...
158     io_rw_32 ctrl;
159 
160     _REG_(PIO_FSTAT_OFFSET) // PIO_FSTAT
161     // FIFO status register
162     // 0x0f000000 [27:24] TXEMPTY      (0xf) State machine TX FIFO is empty
163     // 0x000f0000 [19:16] TXFULL       (0x0) State machine TX FIFO is full
164     // 0x00000f00 [11:8]  RXEMPTY      (0xf) State machine RX FIFO is empty
165     // 0x0000000f [3:0]   RXFULL       (0x0) State machine RX FIFO is full
166     io_ro_32 fstat;
167 
168     _REG_(PIO_FDEBUG_OFFSET) // PIO_FDEBUG
169     // FIFO debug register
170     // 0x0f000000 [27:24] TXSTALL      (0x0) State machine has stalled on empty TX FIFO during a...
171     // 0x000f0000 [19:16] TXOVER       (0x0) TX FIFO overflow (i
172     // 0x00000f00 [11:8]  RXUNDER      (0x0) RX FIFO underflow (i
173     // 0x0000000f [3:0]   RXSTALL      (0x0) State machine has stalled on full RX FIFO during a...
174     io_rw_32 fdebug;
175 
176     _REG_(PIO_FLEVEL_OFFSET) // PIO_FLEVEL
177     // FIFO levels
178     // 0xf0000000 [31:28] RX3          (0x0)
179     // 0x0f000000 [27:24] TX3          (0x0)
180     // 0x00f00000 [23:20] RX2          (0x0)
181     // 0x000f0000 [19:16] TX2          (0x0)
182     // 0x0000f000 [15:12] RX1          (0x0)
183     // 0x00000f00 [11:8]  TX1          (0x0)
184     // 0x000000f0 [7:4]   RX0          (0x0)
185     // 0x0000000f [3:0]   TX0          (0x0)
186     io_ro_32 flevel;
187 
188     // (Description copied from array index 0 register PIO_TXF0 applies similarly to other array indexes)
189     _REG_(PIO_TXF0_OFFSET) // PIO_TXF0
190     // Direct write access to the TX FIFO for this state machine
191     // 0xffffffff [31:0]  TXF0         (0x00000000)
192     io_wo_32 txf[4];
193 
194     // (Description copied from array index 0 register PIO_RXF0 applies similarly to other array indexes)
195     _REG_(PIO_RXF0_OFFSET) // PIO_RXF0
196     // Direct read access to the RX FIFO for this state machine
197     // 0xffffffff [31:0]  RXF0         (-)
198     io_ro_32 rxf[4];
199 
200     _REG_(PIO_IRQ_OFFSET) // PIO_IRQ
201     // State machine IRQ flags register
202     // 0x000000ff [7:0]   IRQ          (0x00)
203     io_rw_32 irq;
204 
205     _REG_(PIO_IRQ_FORCE_OFFSET) // PIO_IRQ_FORCE
206     // Writing a 1 to each of these bits will forcibly assert the corresponding IRQ
207     // 0x000000ff [7:0]   IRQ_FORCE    (0x00)
208     io_wo_32 irq_force;
209 
210     _REG_(PIO_INPUT_SYNC_BYPASS_OFFSET) // PIO_INPUT_SYNC_BYPASS
211     // There is a 2-flipflop synchronizer on each GPIO input, which protects PIO logic from metastabilities
212     // 0xffffffff [31:0]  INPUT_SYNC_BYPASS (0x00000000)
213     io_rw_32 input_sync_bypass;
214 
215     _REG_(PIO_DBG_PADOUT_OFFSET) // PIO_DBG_PADOUT
216     // Read to sample the pad output values PIO is currently driving to the GPIOs
217     // 0xffffffff [31:0]  DBG_PADOUT   (0x00000000)
218     io_ro_32 dbg_padout;
219 
220     _REG_(PIO_DBG_PADOE_OFFSET) // PIO_DBG_PADOE
221     // Read to sample the pad output enables (direction) PIO is currently driving to the GPIOs
222     // 0xffffffff [31:0]  DBG_PADOE    (0x00000000)
223     io_ro_32 dbg_padoe;
224 
225     _REG_(PIO_DBG_CFGINFO_OFFSET) // PIO_DBG_CFGINFO
226     // The PIO hardware has some free parameters that may vary between chip products
227     // 0xf0000000 [31:28] VERSION      (0x1) Version of the core PIO hardware
228     // 0x003f0000 [21:16] IMEM_SIZE    (-) The size of the instruction memory, measured in units of...
229     // 0x00000f00 [11:8]  SM_COUNT     (-) The number of state machines this PIO instance is equipped with
230     // 0x0000003f [5:0]   FIFO_DEPTH   (-) The depth of the state machine TX/RX FIFOs, measured in words
231     io_ro_32 dbg_cfginfo;
232 
233     // (Description copied from array index 0 register PIO_INSTR_MEM0 applies similarly to other array indexes)
234     _REG_(PIO_INSTR_MEM0_OFFSET) // PIO_INSTR_MEM0
235     // Write-only access to instruction memory location 0
236     // 0x0000ffff [15:0]  INSTR_MEM0   (0x0000)
237     io_wo_32 instr_mem[32];
238 
239     pio_sm_hw_t sm[4];
240 
241     // (Description copied from array index 0 register PIO_RXF0_PUTGET0 applies similarly to other array indexes)
242     _REG_(PIO_RXF0_PUTGET0_OFFSET) // PIO_RXF0_PUTGET0
243     // Direct read/write access to the RX FIFO on all SMs, if SHIFTCTRL_FJOIN_RX_PUT xor SHIFTCTRL_FJOIN_RX_GET is set
244     // 0xffffffff [31:0]  RXF0_PUTGET0 (0x00000000)
245     io_rw_32 rxf_putget[4][4];
246 
247     _REG_(PIO_GPIOBASE_OFFSET) // PIO_GPIOBASE
248     // Relocate GPIO 0 (from PIO's point of view) in the system GPIO numbering, to access more than 32...
249     // 0x00000010 [4]     GPIOBASE     (0)
250     io_rw_32 gpiobase;
251 
252     _REG_(PIO_INTR_OFFSET) // PIO_INTR
253     // Raw Interrupts
254     // 0x00008000 [15]    SM7          (0)
255     // 0x00004000 [14]    SM6          (0)
256     // 0x00002000 [13]    SM5          (0)
257     // 0x00001000 [12]    SM4          (0)
258     // 0x00000800 [11]    SM3          (0)
259     // 0x00000400 [10]    SM2          (0)
260     // 0x00000200 [9]     SM1          (0)
261     // 0x00000100 [8]     SM0          (0)
262     // 0x00000080 [7]     SM3_TXNFULL  (0)
263     // 0x00000040 [6]     SM2_TXNFULL  (0)
264     // 0x00000020 [5]     SM1_TXNFULL  (0)
265     // 0x00000010 [4]     SM0_TXNFULL  (0)
266     // 0x00000008 [3]     SM3_RXNEMPTY (0)
267     // 0x00000004 [2]     SM2_RXNEMPTY (0)
268     // 0x00000002 [1]     SM1_RXNEMPTY (0)
269     // 0x00000001 [0]     SM0_RXNEMPTY (0)
270     io_ro_32 intr;
271 
272     union {
273         struct {
274             _REG_(PIO_IRQ0_INTE_OFFSET) // PIO_IRQ0_INTE
275             // Interrupt Enable for irq0
276             // 0x00000800 [11]    SM3          (0)
277             // 0x00000400 [10]    SM2          (0)
278             // 0x00000200 [9]     SM1          (0)
279             // 0x00000100 [8]     SM0          (0)
280             // 0x00000080 [7]     SM3_TXNFULL  (0)
281             // 0x00000040 [6]     SM2_TXNFULL  (0)
282             // 0x00000020 [5]     SM1_TXNFULL  (0)
283             // 0x00000010 [4]     SM0_TXNFULL  (0)
284             // 0x00000008 [3]     SM3_RXNEMPTY (0)
285             // 0x00000004 [2]     SM2_RXNEMPTY (0)
286             // 0x00000002 [1]     SM1_RXNEMPTY (0)
287             // 0x00000001 [0]     SM0_RXNEMPTY (0)
288             io_rw_32 inte0;
289 
290             _REG_(PIO_IRQ0_INTF_OFFSET) // PIO_IRQ0_INTF
291             // Interrupt Force for irq0
292             // 0x00000800 [11]    SM3          (0)
293             // 0x00000400 [10]    SM2          (0)
294             // 0x00000200 [9]     SM1          (0)
295             // 0x00000100 [8]     SM0          (0)
296             // 0x00000080 [7]     SM3_TXNFULL  (0)
297             // 0x00000040 [6]     SM2_TXNFULL  (0)
298             // 0x00000020 [5]     SM1_TXNFULL  (0)
299             // 0x00000010 [4]     SM0_TXNFULL  (0)
300             // 0x00000008 [3]     SM3_RXNEMPTY (0)
301             // 0x00000004 [2]     SM2_RXNEMPTY (0)
302             // 0x00000002 [1]     SM1_RXNEMPTY (0)
303             // 0x00000001 [0]     SM0_RXNEMPTY (0)
304             io_rw_32 intf0;
305 
306             _REG_(PIO_IRQ0_INTS_OFFSET) // PIO_IRQ0_INTS
307             // Interrupt status after masking & forcing for irq0
308             // 0x00000800 [11]    SM3          (0)
309             // 0x00000400 [10]    SM2          (0)
310             // 0x00000200 [9]     SM1          (0)
311             // 0x00000100 [8]     SM0          (0)
312             // 0x00000080 [7]     SM3_TXNFULL  (0)
313             // 0x00000040 [6]     SM2_TXNFULL  (0)
314             // 0x00000020 [5]     SM1_TXNFULL  (0)
315             // 0x00000010 [4]     SM0_TXNFULL  (0)
316             // 0x00000008 [3]     SM3_RXNEMPTY (0)
317             // 0x00000004 [2]     SM2_RXNEMPTY (0)
318             // 0x00000002 [1]     SM1_RXNEMPTY (0)
319             // 0x00000001 [0]     SM0_RXNEMPTY (0)
320             io_ro_32 ints0;
321 
322             _REG_(PIO_IRQ1_INTE_OFFSET) // PIO_IRQ1_INTE
323             // Interrupt Enable for irq1
324             // 0x00000800 [11]    SM3          (0)
325             // 0x00000400 [10]    SM2          (0)
326             // 0x00000200 [9]     SM1          (0)
327             // 0x00000100 [8]     SM0          (0)
328             // 0x00000080 [7]     SM3_TXNFULL  (0)
329             // 0x00000040 [6]     SM2_TXNFULL  (0)
330             // 0x00000020 [5]     SM1_TXNFULL  (0)
331             // 0x00000010 [4]     SM0_TXNFULL  (0)
332             // 0x00000008 [3]     SM3_RXNEMPTY (0)
333             // 0x00000004 [2]     SM2_RXNEMPTY (0)
334             // 0x00000002 [1]     SM1_RXNEMPTY (0)
335             // 0x00000001 [0]     SM0_RXNEMPTY (0)
336             io_rw_32 inte1;
337 
338             _REG_(PIO_IRQ1_INTF_OFFSET) // PIO_IRQ1_INTF
339             // Interrupt Force for irq1
340             // 0x00000800 [11]    SM3          (0)
341             // 0x00000400 [10]    SM2          (0)
342             // 0x00000200 [9]     SM1          (0)
343             // 0x00000100 [8]     SM0          (0)
344             // 0x00000080 [7]     SM3_TXNFULL  (0)
345             // 0x00000040 [6]     SM2_TXNFULL  (0)
346             // 0x00000020 [5]     SM1_TXNFULL  (0)
347             // 0x00000010 [4]     SM0_TXNFULL  (0)
348             // 0x00000008 [3]     SM3_RXNEMPTY (0)
349             // 0x00000004 [2]     SM2_RXNEMPTY (0)
350             // 0x00000002 [1]     SM1_RXNEMPTY (0)
351             // 0x00000001 [0]     SM0_RXNEMPTY (0)
352             io_rw_32 intf1;
353 
354             _REG_(PIO_IRQ1_INTS_OFFSET) // PIO_IRQ1_INTS
355             // Interrupt status after masking & forcing for irq1
356             // 0x00000800 [11]    SM3          (0)
357             // 0x00000400 [10]    SM2          (0)
358             // 0x00000200 [9]     SM1          (0)
359             // 0x00000100 [8]     SM0          (0)
360             // 0x00000080 [7]     SM3_TXNFULL  (0)
361             // 0x00000040 [6]     SM2_TXNFULL  (0)
362             // 0x00000020 [5]     SM1_TXNFULL  (0)
363             // 0x00000010 [4]     SM0_TXNFULL  (0)
364             // 0x00000008 [3]     SM3_RXNEMPTY (0)
365             // 0x00000004 [2]     SM2_RXNEMPTY (0)
366             // 0x00000002 [1]     SM1_RXNEMPTY (0)
367             // 0x00000001 [0]     SM0_RXNEMPTY (0)
368             io_ro_32 ints1;
369         };
370         pio_irq_ctrl_hw_t irq_ctrl[2];
371     };
372 } pio_hw_t;
373 
374 #define pio0_hw ((pio_hw_t *)PIO0_BASE)
375 #define pio1_hw ((pio_hw_t *)PIO1_BASE)
376 #define pio2_hw ((pio_hw_t *)PIO2_BASE)
377 static_assert(sizeof (pio_hw_t) == 0x0188, "");
378 
379 #endif // _HARDWARE_STRUCTS_PIO_H
380 
381