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_PWM_H
9 #define _HARDWARE_STRUCTS_PWM_H
10 
11 /**
12  * \file rp2350/pwm.h
13  */
14 
15 #include "hardware/address_mapped.h"
16 #include "hardware/regs/pwm.h"
17 
18 // Reference to datasheet: https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf#tab-registerlist_pwm
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/pwm.h.
22 //
23 // Bit-field descriptions are of the form:
24 // BITMASK [BITRANGE] FIELDNAME (RESETVALUE) DESCRIPTION
25 
26 typedef struct {
27     _REG_(PWM_CH0_CSR_OFFSET) // PWM_CH0_CSR
28     // Control and status register
29     // 0x00000080 [7]     PH_ADV       (0) Advance the phase of the counter by 1 count, while it is running
30     // 0x00000040 [6]     PH_RET       (0) Retard the phase of the counter by 1 count, while it is running
31     // 0x00000030 [5:4]   DIVMODE      (0x0)
32     // 0x00000008 [3]     B_INV        (0) Invert output B
33     // 0x00000004 [2]     A_INV        (0) Invert output A
34     // 0x00000002 [1]     PH_CORRECT   (0) 1: Enable phase-correct modulation
35     // 0x00000001 [0]     EN           (0) Enable the PWM channel
36     io_rw_32 csr;
37 
38     _REG_(PWM_CH0_DIV_OFFSET) // PWM_CH0_DIV
39     // INT and FRAC form a fixed-point fractional number
40     // 0x00000ff0 [11:4]  INT          (0x01)
41     // 0x0000000f [3:0]   FRAC         (0x0)
42     io_rw_32 div;
43 
44     _REG_(PWM_CH0_CTR_OFFSET) // PWM_CH0_CTR
45     // Direct access to the PWM counter
46     // 0x0000ffff [15:0]  CH0_CTR      (0x0000)
47     io_rw_32 ctr;
48 
49     _REG_(PWM_CH0_CC_OFFSET) // PWM_CH0_CC
50     // Counter compare values
51     // 0xffff0000 [31:16] B            (0x0000)
52     // 0x0000ffff [15:0]  A            (0x0000)
53     io_rw_32 cc;
54 
55     _REG_(PWM_CH0_TOP_OFFSET) // PWM_CH0_TOP
56     // Counter wrap value
57     // 0x0000ffff [15:0]  CH0_TOP      (0xffff)
58     io_rw_32 top;
59 } pwm_slice_hw_t;
60 
61 typedef struct {
62     _REG_(PWM_IRQ0_INTE_OFFSET) // PWM_IRQ0_INTE
63     // Interrupt Enable for irq0
64     // 0x00000800 [11]    CH11         (0)
65     // 0x00000400 [10]    CH10         (0)
66     // 0x00000200 [9]     CH9          (0)
67     // 0x00000100 [8]     CH8          (0)
68     // 0x00000080 [7]     CH7          (0)
69     // 0x00000040 [6]     CH6          (0)
70     // 0x00000020 [5]     CH5          (0)
71     // 0x00000010 [4]     CH4          (0)
72     // 0x00000008 [3]     CH3          (0)
73     // 0x00000004 [2]     CH2          (0)
74     // 0x00000002 [1]     CH1          (0)
75     // 0x00000001 [0]     CH0          (0)
76     io_rw_32 inte;
77 
78     _REG_(PWM_IRQ0_INTF_OFFSET) // PWM_IRQ0_INTF
79     // Interrupt Force for irq0
80     // 0x00000800 [11]    CH11         (0)
81     // 0x00000400 [10]    CH10         (0)
82     // 0x00000200 [9]     CH9          (0)
83     // 0x00000100 [8]     CH8          (0)
84     // 0x00000080 [7]     CH7          (0)
85     // 0x00000040 [6]     CH6          (0)
86     // 0x00000020 [5]     CH5          (0)
87     // 0x00000010 [4]     CH4          (0)
88     // 0x00000008 [3]     CH3          (0)
89     // 0x00000004 [2]     CH2          (0)
90     // 0x00000002 [1]     CH1          (0)
91     // 0x00000001 [0]     CH0          (0)
92     io_rw_32 intf;
93 
94     _REG_(PWM_IRQ0_INTS_OFFSET) // PWM_IRQ0_INTS
95     // Interrupt status after masking & forcing for irq0
96     // 0x00000800 [11]    CH11         (0)
97     // 0x00000400 [10]    CH10         (0)
98     // 0x00000200 [9]     CH9          (0)
99     // 0x00000100 [8]     CH8          (0)
100     // 0x00000080 [7]     CH7          (0)
101     // 0x00000040 [6]     CH6          (0)
102     // 0x00000020 [5]     CH5          (0)
103     // 0x00000010 [4]     CH4          (0)
104     // 0x00000008 [3]     CH3          (0)
105     // 0x00000004 [2]     CH2          (0)
106     // 0x00000002 [1]     CH1          (0)
107     // 0x00000001 [0]     CH0          (0)
108     io_ro_32 ints;
109 } pwm_irq_ctrl_hw_t;
110 
111 typedef struct {
112     pwm_slice_hw_t slice[12];
113 
114     _REG_(PWM_EN_OFFSET) // PWM_EN
115     // This register aliases the CSR_EN bits for all channels
116     // 0x00000800 [11]    CH11         (0)
117     // 0x00000400 [10]    CH10         (0)
118     // 0x00000200 [9]     CH9          (0)
119     // 0x00000100 [8]     CH8          (0)
120     // 0x00000080 [7]     CH7          (0)
121     // 0x00000040 [6]     CH6          (0)
122     // 0x00000020 [5]     CH5          (0)
123     // 0x00000010 [4]     CH4          (0)
124     // 0x00000008 [3]     CH3          (0)
125     // 0x00000004 [2]     CH2          (0)
126     // 0x00000002 [1]     CH1          (0)
127     // 0x00000001 [0]     CH0          (0)
128     io_rw_32 en;
129 
130     _REG_(PWM_INTR_OFFSET) // PWM_INTR
131     // Raw Interrupts
132     // 0x00000800 [11]    CH11         (0)
133     // 0x00000400 [10]    CH10         (0)
134     // 0x00000200 [9]     CH9          (0)
135     // 0x00000100 [8]     CH8          (0)
136     // 0x00000080 [7]     CH7          (0)
137     // 0x00000040 [6]     CH6          (0)
138     // 0x00000020 [5]     CH5          (0)
139     // 0x00000010 [4]     CH4          (0)
140     // 0x00000008 [3]     CH3          (0)
141     // 0x00000004 [2]     CH2          (0)
142     // 0x00000002 [1]     CH1          (0)
143     // 0x00000001 [0]     CH0          (0)
144     io_rw_32 intr;
145 
146     union {
147         struct {
148             _REG_(PWM_IRQ0_INTE_OFFSET) // PWM_IRQ0_INTE
149             // Interrupt Enable for irq0
150             // 0x00000800 [11]    CH11         (0)
151             // 0x00000400 [10]    CH10         (0)
152             // 0x00000200 [9]     CH9          (0)
153             // 0x00000100 [8]     CH8          (0)
154             // 0x00000080 [7]     CH7          (0)
155             // 0x00000040 [6]     CH6          (0)
156             // 0x00000020 [5]     CH5          (0)
157             // 0x00000010 [4]     CH4          (0)
158             // 0x00000008 [3]     CH3          (0)
159             // 0x00000004 [2]     CH2          (0)
160             // 0x00000002 [1]     CH1          (0)
161             // 0x00000001 [0]     CH0          (0)
162             io_rw_32 inte;
163 
164             _REG_(PWM_IRQ0_INTF_OFFSET) // PWM_IRQ0_INTF
165             // Interrupt Force for irq0
166             // 0x00000800 [11]    CH11         (0)
167             // 0x00000400 [10]    CH10         (0)
168             // 0x00000200 [9]     CH9          (0)
169             // 0x00000100 [8]     CH8          (0)
170             // 0x00000080 [7]     CH7          (0)
171             // 0x00000040 [6]     CH6          (0)
172             // 0x00000020 [5]     CH5          (0)
173             // 0x00000010 [4]     CH4          (0)
174             // 0x00000008 [3]     CH3          (0)
175             // 0x00000004 [2]     CH2          (0)
176             // 0x00000002 [1]     CH1          (0)
177             // 0x00000001 [0]     CH0          (0)
178             io_rw_32 intf;
179 
180             _REG_(PWM_IRQ0_INTS_OFFSET) // PWM_IRQ0_INTS
181             // Interrupt status after masking & forcing for irq0
182             // 0x00000800 [11]    CH11         (0)
183             // 0x00000400 [10]    CH10         (0)
184             // 0x00000200 [9]     CH9          (0)
185             // 0x00000100 [8]     CH8          (0)
186             // 0x00000080 [7]     CH7          (0)
187             // 0x00000040 [6]     CH6          (0)
188             // 0x00000020 [5]     CH5          (0)
189             // 0x00000010 [4]     CH4          (0)
190             // 0x00000008 [3]     CH3          (0)
191             // 0x00000004 [2]     CH2          (0)
192             // 0x00000002 [1]     CH1          (0)
193             // 0x00000001 [0]     CH0          (0)
194             io_rw_32 ints;
195 
196             _REG_(PWM_IRQ1_INTE_OFFSET) // PWM_IRQ1_INTE
197             // Interrupt Enable for irq1
198             // 0x00000800 [11]    CH11         (0)
199             // 0x00000400 [10]    CH10         (0)
200             // 0x00000200 [9]     CH9          (0)
201             // 0x00000100 [8]     CH8          (0)
202             // 0x00000080 [7]     CH7          (0)
203             // 0x00000040 [6]     CH6          (0)
204             // 0x00000020 [5]     CH5          (0)
205             // 0x00000010 [4]     CH4          (0)
206             // 0x00000008 [3]     CH3          (0)
207             // 0x00000004 [2]     CH2          (0)
208             // 0x00000002 [1]     CH1          (0)
209             // 0x00000001 [0]     CH0          (0)
210             io_rw_32 inte1;
211 
212             _REG_(PWM_IRQ1_INTF_OFFSET) // PWM_IRQ1_INTF
213             // Interrupt Force for irq1
214             // 0x00000800 [11]    CH11         (0)
215             // 0x00000400 [10]    CH10         (0)
216             // 0x00000200 [9]     CH9          (0)
217             // 0x00000100 [8]     CH8          (0)
218             // 0x00000080 [7]     CH7          (0)
219             // 0x00000040 [6]     CH6          (0)
220             // 0x00000020 [5]     CH5          (0)
221             // 0x00000010 [4]     CH4          (0)
222             // 0x00000008 [3]     CH3          (0)
223             // 0x00000004 [2]     CH2          (0)
224             // 0x00000002 [1]     CH1          (0)
225             // 0x00000001 [0]     CH0          (0)
226             io_rw_32 intf1;
227 
228             _REG_(PWM_IRQ1_INTS_OFFSET) // PWM_IRQ1_INTS
229             // Interrupt status after masking & forcing for irq1
230             // 0x00000800 [11]    CH11         (0)
231             // 0x00000400 [10]    CH10         (0)
232             // 0x00000200 [9]     CH9          (0)
233             // 0x00000100 [8]     CH8          (0)
234             // 0x00000080 [7]     CH7          (0)
235             // 0x00000040 [6]     CH6          (0)
236             // 0x00000020 [5]     CH5          (0)
237             // 0x00000010 [4]     CH4          (0)
238             // 0x00000008 [3]     CH3          (0)
239             // 0x00000004 [2]     CH2          (0)
240             // 0x00000002 [1]     CH1          (0)
241             // 0x00000001 [0]     CH0          (0)
242             io_rw_32 ints1;
243         };
244         pwm_irq_ctrl_hw_t irq_ctrl[2];
245     };
246 } pwm_hw_t;
247 
248 #define pwm_hw ((pwm_hw_t *)PWM_BASE)
249 static_assert(sizeof (pwm_hw_t) == 0x0110, "");
250 
251 #endif // _HARDWARE_STRUCTS_PWM_H
252 
253