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