1 // THIS HEADER FILE IS AUTOMATICALLY GENERATED -- DO NOT EDIT
2 
3 /*
4  * Copyright (c) 2021 Raspberry Pi (Trading) Ltd.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #ifndef _HARDWARE_STRUCTS_PWM_H
10 #define _HARDWARE_STRUCTS_PWM_H
11 
12 #include "hardware/address_mapped.h"
13 #include "hardware/regs/pwm.h"
14 
15 // Reference to datasheet: https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#tab-registerlist_pwm
16 //
17 // The _REG_ macro is intended to help make the register navigable in your IDE (for example, using the "Go to Definition" feature)
18 // _REG_(x) will link to the corresponding register in hardware/regs/pwm.h.
19 //
20 // Bit-field descriptions are of the form:
21 // BITMASK [BITRANGE]: FIELDNAME (RESETVALUE): DESCRIPTION
22 
23 typedef struct pwm_slice_hw {
24     _REG_(PWM_CH0_CSR_OFFSET) // PWM_CH0_CSR
25     // Control and status register
26     // 0x00000080 [7]     : PH_ADV (0): Advance the phase of the counter by 1 count, while it is running
27     // 0x00000040 [6]     : PH_RET (0): Retard the phase of the counter by 1 count, while it is running
28     // 0x00000030 [5:4]   : DIVMODE (0)
29     // 0x00000008 [3]     : B_INV (0): Invert output B
30     // 0x00000004 [2]     : A_INV (0): Invert output A
31     // 0x00000002 [1]     : PH_CORRECT (0): 1: Enable phase-correct modulation
32     // 0x00000001 [0]     : EN (0): Enable the PWM channel
33     io_rw_32 csr;
34 
35     _REG_(PWM_CH0_DIV_OFFSET) // PWM_CH0_DIV
36     // INT and FRAC form a fixed-point fractional number
37     // 0x00000ff0 [11:4]  : INT (1)
38     // 0x0000000f [3:0]   : FRAC (0)
39     io_rw_32 div;
40 
41     _REG_(PWM_CH0_CTR_OFFSET) // PWM_CH0_CTR
42     // Direct access to the PWM counter
43     // 0x0000ffff [15:0]  : CH0_CTR (0)
44     io_rw_32 ctr;
45 
46     _REG_(PWM_CH0_CC_OFFSET) // PWM_CH0_CC
47     // Counter compare values
48     // 0xffff0000 [31:16] : B (0)
49     // 0x0000ffff [15:0]  : A (0)
50     io_rw_32 cc;
51 
52     _REG_(PWM_CH0_TOP_OFFSET) // PWM_CH0_TOP
53     // Counter wrap value
54     // 0x0000ffff [15:0]  : CH0_TOP (0xffff)
55     io_rw_32 top;
56 } pwm_slice_hw_t;
57 
58 typedef struct {
59     pwm_slice_hw_t slice[NUM_PWM_SLICES]; // 8
60 
61     _REG_(PWM_EN_OFFSET) // PWM_EN
62     // This register aliases the CSR_EN bits for all channels
63     // 0x00000080 [7]     : CH7 (0)
64     // 0x00000040 [6]     : CH6 (0)
65     // 0x00000020 [5]     : CH5 (0)
66     // 0x00000010 [4]     : CH4 (0)
67     // 0x00000008 [3]     : CH3 (0)
68     // 0x00000004 [2]     : CH2 (0)
69     // 0x00000002 [1]     : CH1 (0)
70     // 0x00000001 [0]     : CH0 (0)
71     io_rw_32 en;
72 
73     _REG_(PWM_INTR_OFFSET) // PWM_INTR
74     // Raw Interrupts
75     // 0x00000080 [7]     : CH7 (0)
76     // 0x00000040 [6]     : CH6 (0)
77     // 0x00000020 [5]     : CH5 (0)
78     // 0x00000010 [4]     : CH4 (0)
79     // 0x00000008 [3]     : CH3 (0)
80     // 0x00000004 [2]     : CH2 (0)
81     // 0x00000002 [1]     : CH1 (0)
82     // 0x00000001 [0]     : CH0 (0)
83     io_rw_32 intr;
84 
85     _REG_(PWM_INTE_OFFSET) // PWM_INTE
86     // Interrupt Enable
87     // 0x00000080 [7]     : CH7 (0)
88     // 0x00000040 [6]     : CH6 (0)
89     // 0x00000020 [5]     : CH5 (0)
90     // 0x00000010 [4]     : CH4 (0)
91     // 0x00000008 [3]     : CH3 (0)
92     // 0x00000004 [2]     : CH2 (0)
93     // 0x00000002 [1]     : CH1 (0)
94     // 0x00000001 [0]     : CH0 (0)
95     io_rw_32 inte;
96 
97     _REG_(PWM_INTF_OFFSET) // PWM_INTF
98     // Interrupt Force
99     // 0x00000080 [7]     : CH7 (0)
100     // 0x00000040 [6]     : CH6 (0)
101     // 0x00000020 [5]     : CH5 (0)
102     // 0x00000010 [4]     : CH4 (0)
103     // 0x00000008 [3]     : CH3 (0)
104     // 0x00000004 [2]     : CH2 (0)
105     // 0x00000002 [1]     : CH1 (0)
106     // 0x00000001 [0]     : CH0 (0)
107     io_rw_32 intf;
108 
109     _REG_(PWM_INTS_OFFSET) // PWM_INTS
110     // Interrupt status after masking & forcing
111     // 0x00000080 [7]     : CH7 (0)
112     // 0x00000040 [6]     : CH6 (0)
113     // 0x00000020 [5]     : CH5 (0)
114     // 0x00000010 [4]     : CH4 (0)
115     // 0x00000008 [3]     : CH3 (0)
116     // 0x00000004 [2]     : CH2 (0)
117     // 0x00000002 [1]     : CH1 (0)
118     // 0x00000001 [0]     : CH0 (0)
119     io_ro_32 ints;
120 } pwm_hw_t;
121 
122 #define pwm_hw ((pwm_hw_t *)PWM_BASE)
123 
124 static_assert( NUM_PWM_SLICES == 8, "");
125 
126 #endif
127