xref: /xnu-11215.81.4/pexpert/pexpert/arm/pl011.h (revision d4514f0bc1d3f944c22d92e68b646ac3fb40d452)
1 /**
2  * @file pl011.h
3  *
4  * @brief Contains all the types necessary to ergonomically interact with the
5  * ARM PrimeCell UART (PL011).
6  */
7 
8 #include <stdint.h>
9 
10 typedef union {
11 	uint32_t raw;
12 	struct {
13 		uint32_t data : 8;
14 		uint32_t fe : 1;
15 		uint32_t pe : 1;
16 		uint32_t be : 1;
17 		uint32_t oe : 1;
18 	};
19 } uartdr_t;
20 
21 typedef union {
22 	uint32_t raw;
23 	struct {
24 		uint32_t fe : 1;
25 		uint32_t pe : 1;
26 		uint32_t be : 1;
27 		uint32_t oe : 1;
28 	};
29 } uartrsr_uartecr_t;
30 
31 typedef union {
32 	uint32_t raw;
33 	struct {
34 		uint32_t cts : 1;
35 		uint32_t dsr : 1;
36 		uint32_t dcd : 1;
37 		uint32_t busy : 1;
38 		uint32_t rxfe : 1;
39 		uint32_t txff : 1;
40 		uint32_t rxff : 1;
41 		uint32_t txfe : 1;
42 		uint32_t ri : 1;
43 	};
44 } uartfr_t;
45 
46 typedef union {
47 	uint32_t raw;
48 	struct {
49 		uint32_t ilpdvsr : 8;
50 	};
51 } uartilpr_t;
52 
53 typedef union {
54 	uint32_t raw;
55 	struct {
56 		uint32_t baud_divint : 16;
57 	};
58 } uartibrd_t;
59 
60 typedef union {
61 	uint32_t raw;
62 	struct {
63 		uint32_t baud_divfrac : 6;
64 	};
65 } uartfbrd_t;
66 
67 typedef union {
68 	uint32_t raw;
69 	struct {
70 		uint32_t brk : 1;
71 		uint32_t pen : 1;
72 		uint32_t eps : 1;
73 		uint32_t stp2 : 1;
74 		uint32_t fen : 1;
75 		uint32_t wlen : 2;
76 		uint32_t sps : 1;
77 	};
78 } uartlcr_h_t;
79 
80 typedef union {
81 	uint32_t raw;
82 	struct {
83 		uint32_t uarten : 1;
84 		uint32_t siren : 1;
85 		uint32_t sirlp : 1;
86 		uint32_t : 4;
87 		uint32_t lbe : 1;
88 		uint32_t txe : 1;
89 		uint32_t rxe : 1;
90 		uint32_t dtr : 1;
91 		uint32_t rts : 1;
92 		uint32_t out1 : 1;
93 		uint32_t out2 : 1;
94 		uint32_t rtsen : 1;
95 		uint32_t ctsen : 1;
96 	};
97 } uartcr_t;
98 
99 typedef union {
100 	uint32_t raw;
101 	struct {
102 		uint32_t txiflsel : 3;
103 		uint32_t rxiflsel : 3;
104 	};
105 } uartifls_t;
106 
107 typedef union {
108 	uint32_t raw;
109 	struct {
110 		uint32_t rimim : 1;
111 		uint32_t ctsmim : 1;
112 		uint32_t dcdmim : 1;
113 		uint32_t dsrmim : 1;
114 		uint32_t rxim : 1;
115 		uint32_t txim : 1;
116 		uint32_t rtim : 1;
117 		uint32_t feim : 1;
118 		uint32_t peim : 1;
119 		uint32_t beim : 1;
120 		uint32_t oeim : 1;
121 	};
122 } uartimsc_t;
123 
124 typedef union {
125 	uint32_t raw;
126 	struct {
127 		uint32_t rirmis : 1;
128 		uint32_t ctsrmis : 1;
129 		uint32_t dcdrmis : 1;
130 		uint32_t dsrrmis : 1;
131 		uint32_t rxris : 1;
132 		uint32_t txris : 1;
133 		uint32_t rtris : 1;
134 		uint32_t feris : 1;
135 		uint32_t peris : 1;
136 		uint32_t beris : 1;
137 		uint32_t oeris : 1;
138 	};
139 } uartris_t;
140 
141 typedef union {
142 	uint32_t raw;
143 	struct {
144 		uint32_t rimmis : 1;
145 		uint32_t ctsmmis : 1;
146 		uint32_t dcdmmis : 1;
147 		uint32_t dsrmmis : 1;
148 		uint32_t rxmis : 1;
149 		uint32_t txmis : 1;
150 		uint32_t rtmis : 1;
151 		uint32_t femis : 1;
152 		uint32_t pemis : 1;
153 		uint32_t bemis : 1;
154 		uint32_t oemis : 1;
155 	};
156 } uartmis_t;
157 
158 typedef union {
159 	uint32_t raw;
160 	struct {
161 		uint32_t rimic : 1;
162 		uint32_t ctsmic : 1;
163 		uint32_t dcdmic : 1;
164 		uint32_t dsrmic : 1;
165 		uint32_t rxic : 1;
166 		uint32_t txic : 1;
167 		uint32_t rtic : 1;
168 		uint32_t feic : 1;
169 		uint32_t peic : 1;
170 		uint32_t beic : 1;
171 		uint32_t oeic : 1;
172 	};
173 } uarticr_t;
174 
175 typedef union {
176 	uint32_t raw;
177 	struct {
178 		uint32_t rxdmae : 1;
179 		uint32_t txdmae : 1;
180 		uint32_t dmaonerr : 1;
181 	};
182 } uartdmacr_t;
183 
184 typedef union {
185 	uint32_t raw;
186 	struct {
187 		uint32_t partnumber0 : 8;
188 	};
189 } uart_periph_id0_t;
190 
191 typedef union {
192 	uint32_t raw;
193 	struct {
194 		uint32_t partnumber1 : 4;
195 		uint32_t designer0 : 4;
196 	};
197 } uart_periph_id1_t;
198 
199 typedef union {
200 	uint32_t raw;
201 	struct {
202 		uint32_t designer1 : 4;
203 		uint32_t revision : 4;
204 	};
205 } uart_periph_id2_t;
206 
207 typedef union {
208 	uint32_t raw;
209 	struct {
210 		uint32_t configuration : 8;
211 	};
212 } uart_periph_id3_t;
213 
214 typedef union {
215 	uint32_t raw;
216 	struct {
217 		uint32_t uart_pcell_id0 : 8;
218 	};
219 } uart_pcell_id0_t;
220 
221 typedef union {
222 	uint32_t raw;
223 	struct {
224 		uint32_t uart_pcell_id1 : 8;
225 	};
226 } uart_pcell_id1_t;
227 
228 typedef union {
229 	uint32_t raw;
230 	struct {
231 		uint32_t uart_pcell_id2 : 8;
232 	};
233 } uart_pcell_id2_t;
234 
235 typedef union {
236 	uint32_t raw;
237 	struct {
238 		uint32_t uart_pcell_id3 : 8;
239 	};
240 } uart_pcell_id3_t;
241 
242 typedef struct {
243 	uartdr_t uartdr;
244 	uartrsr_uartecr_t uartrsr_uartecr;
245 	uint8_t _reserved0[0x10];
246 	uartfr_t uartfr;
247 	uint8_t _reserved1[0x4];
248 	uartilpr_t uartilpr;
249 	uartibrd_t uartibrd;
250 	uartfbrd_t uartfbrd;
251 	uartlcr_h_t uartlcr_h;
252 	uartcr_t uartcr;
253 	uartifls_t uartifls;
254 	uartimsc_t uartimsc;
255 	uartris_t uartris;
256 	uartmis_t uartmis;
257 	uarticr_t uarticr;
258 	uartdmacr_t uartdmacr;
259 	uint8_t _reserved2[0x34];
260 	uint8_t _reserved3[0x10];
261 	uint8_t _reserved4[0xf40];
262 	uint8_t _reserved5[0x10];
263 	uart_periph_id0_t uart_periph_id0;
264 	uart_periph_id1_t uart_periph_id1;
265 	uart_periph_id2_t uart_periph_id2;
266 	uart_periph_id3_t uart_periph_id3;
267 	uart_pcell_id0_t uart_pcell_id0;
268 	uart_pcell_id1_t uart_pcell_id1;
269 	uart_pcell_id2_t uart_pcell_id2;
270 	uart_pcell_id3_t uart_pcell_id3;
271 } pl011_registers_t;
272