imxuartreg.h revision 1.5 1 /* $NetBSD: imxuartreg.h,v 1.5 2012/09/01 14:46:25 matt Exp $ */
2 /*
3 * register definitions for Freescale i.MX31 and i.MX31L UARTs
4 *
5 * UART specification obtained from:
6 * MCIMX31 and MCIMX31L Application Processors
7 * Reference Manual
8 * MCIMC31RM
9 * Rev. 2.3
10 * 1/2007
11 *
12 * MCIMC51 Multimedia Application Processor
13 * Reference Manual
14 * MCMIMX51RM
15 * Rev.1
16 * 2/2010
17 */
18 #ifndef _IMXUARTREG_H
19 #define _IMXUARTREG_H
20
21 /*
22 * Registers are 32 bits wide; the 16 MSBs are unused --
23 * they read as zeros and are ignored on write.
24 */
25
26
27 /*
28 * register offsets
29 */
30 #define IMX_URXD 0x00 /* r */ /* UART Receiver Reg */
31 #define IMX_UTXD 0x40 /* w */ /* UART Transmitter Reg */
32 #define IMX_UCR1 0x80 /* rw */ /* UART Control Reg 1 */
33 #define IMX_UCR2 0x84 /* rw */ /* UART Control Reg 2 */
34 #define IMX_UCR3 0x88 /* rw */ /* UART Control Reg 3 */
35 #define IMX_UCR4 0x8c /* rw */ /* UART Control Reg 4 */
36 #define IMX_UCRn(n) (IMX_UCR1 + ((n) << 2))
37 #define IMX_UFCR 0x90 /* rw */ /* UART FIFO Control Reg */
38 #define IMX_USR1 0x94 /* rw */ /* UART Status Reg 1 */
39 #define IMX_USR2 0x98 /* rw */ /* UART Status Reg 2 */
40 #define IMX_USRn(n) (IMX_USR1 + ((n) << 2))
41 #define IMX_UESC 0x9c /* rw */ /* UART Escape Character Reg */
42 #define IMX_UTIM 0xa0 /* rw */ /* UART Escape Timer Reg */
43 #define IMX_UBIR 0xa4 /* rw */ /* UART BRM Incremental Reg */
44 #define IMX_UBMR 0xa8 /* rw */ /* UART BRM Modulator Reg */
45 #define IMX_UBRC 0xac /* r */ /* UART Baud Rate Count Reg */
46 #define IMX_ONEMS 0xb0 /* rw */ /* UART One Millisecond Reg */
47 #define IMX_UTS 0xb4 /* rw */ /* UART Test Reg */
48
49 #define IMX_UART_SIZE 0xb8
50
51 /*
52 * bit attributes:
53 * ro read-only
54 * wo write-only
55 * rw read/write
56 * w1c write 1 to clear
57 *
58 * attrs defined but apparently unused for the UART:
59 * rwm rw bit that can be modified by HW (other than reset)
60 * scb self-clear: write 1 has some effect, always reads as 0
61 */
62
63 /*
64 * IMX_URXD bits
65 */
66 #define IMX_URXD_RX_DATA __BITS(7,0) /* ro */
67 #define IMX_URXD_RESV __BITS(9,8) /* ro */
68 #define IMX_URXD_PRERR __BIT(10) /* ro */
69 #define IMX_URXD_BRK __BIT(11) /* ro */
70 #define IMX_URXD_FRMERR __BIT(12) /* ro */
71 #define IMX_URXD_OVRRUN __BIT(13) /* ro */
72 #define IMX_URXD_ERR __BIT(14) /* ro */
73 #define IMX_URXD_CHARDY __BIT(15) /* ro */
74
75 /*
76 * IMX_UTXD bits
77 */
78 #define IMX_UTXD_TX_DATA __BITS(7,0) /* wo */
79 #define IMX_UTXD_RESV __BITS(15,8)
80
81 /*
82 * IMX_UCR1 bits
83 */
84 #define IMX_UCR1_UARTEN __BIT(0) /* rw */
85 #define IMX_UCR1_DOZE __BIT(1) /* rw */
86 #define IMX_UCR1_ATDMAEN __BIT(2) /* rw */
87 #define IMX_UCR1_TXDMAEN __BIT(3) /* rw */
88 #define IMX_UCR1_SNDBRK __BIT(4) /* rw */
89 #define IMX_UCR1_RTSDEN __BIT(5) /* rw */
90 #define IMX_UCR1_TXMPTYEN __BIT(6) /* rw */
91 #define IMX_UCR1_IREN __BIT(7) /* rw */
92 #define IMX_UCR1_RXDMAEN __BIT(8) /* rw */
93 #define IMX_UCR1_RRDYEN __BIT(9) /* rw */
94 #define IMX_UCR1_ICD __BITS(11,10) /* rw */
95 #define IMX_UCR1_IDEN __BIT(12) /* rw */
96 #define IMX_UCR1_TRDYEN __BIT(13) /* rw */
97 #define IMX_UCR1_ADBR __BIT(14) /* rw */
98 #define IMX_UCR1_ADEN __BIT(15) /* rw */
99
100 /*
101 * IMX_UCR2 bits
102 */
103 #define IMX_UCR2_SRST __BIT(0) /* rw */
104 #define IMX_UCR2_RXEN __BIT(1) /* rw */
105 #define IMX_UCR2_TXEN __BIT(2) /* rw */
106 #define IMX_UCR2_ATEN __BIT(3) /* rw */
107 #define IMX_UCR2_RTSEN __BIT(4) /* rw */
108 #define IMX_UCR2_WS __BIT(5) /* rw */
109 #define IMX_UCR2_STPB __BIT(6) /* rw */
110 #define IMX_UCR2_PROE __BIT(7) /* rw */
111 #define IMX_UCR2_PREN __BIT(8) /* rw */
112 #define IMX_UCR2_RTEC __BITS(10,9) /* rw */
113 #define IMX_UCR2_ESCEN __BIT(11) /* rw */
114 #define IMX_UCR2_CTS __BIT(12) /* rw */
115 #define IMX_UCR2_CTSC __BIT(13) /* rw */
116 #define IMX_UCR2_IRTS __BIT(14) /* rw */
117 #define IMX_UCR2_ESCI __BIT(15) /* rw */
118
119 /*
120 * IMX_UCR3 bits
121 */
122 #define IMX_UCR3_ACIEN __BIT(0) /* rw */
123 #define IMX_UCR3_INVT __BIT(1) /* rw */
124 #define IMX_UCR3_RXDMUXSEL __BIT(2) /* rw */
125 #define IMX_UCR3_DTRDEN __BIT(3) /* rw */
126 #define IMX_UCR3_AWAKEN __BIT(4) /* rw */
127 #define IMX_UCR3_AIRINTEN __BIT(5) /* rw */
128 #define IMX_UCR3_RXDSEN __BIT(6) /* rw */
129 #define IMX_UCR3_ADNIMP __BIT(7) /* rw */
130 #define IMX_UCR3_RI __BIT(8) /* rw */
131 #define IMX_UCR3_DCD __BIT(9) /* rw */
132 #define IMX_UCR3_DSR __BIT(10) /* rw */
133 #define IMX_UCR3_FRAERREN __BIT(11) /* rw */
134 #define IMX_UCR3_PARERREN __BIT(12) /* rw */
135 #define IMX_UCR3_DTREN __BIT(13) /* rw */
136 #define IMX_UCR3_DPEC __BITS(15,14) /* rw */
137
138 /*
139 * IMX_UCR4 bits
140 */
141 #define IMX_UCR4_DREN __BIT(0) /* rw */
142 #define IMX_UCR4_OREN __BIT(1) /* rw */
143 #define IMX_UCR4_BKEN __BIT(2) /* rw */
144 #define IMX_UCR4_TCEN __BIT(3) /* rw */
145 #define IMX_UCR4_LPBYP __BIT(4) /* rw */
146 #define IMX_UCR4_IRSC __BIT(5) /* rw */
147 #define IMX_UCR4_IDDMAEN __BIT(6) /* rw */
148 #define IMX_UCR4_WKEN __BIT(7) /* rw */
149 #define IMX_UCR4_ENIRI __BIT(8) /* rw */
150 #define IMX_UCR4_INVR __BIT(9) /* rw */
151 #define IMX_UCR4_CTSTL __BITS(15,10) /* rw */
152
153 /*
154 * IMX_UFCR bits
155 */
156 #define IMX_UFCR_RXTL_SHIFT 0
157 #define IMX_UFCR_RXTL __BITS(5,IMX_UFCR_RXTL_SHIFT) /* rw */
158 #define IMX_UFCR_DCEDTE __BIT(6) /* rw */
159 #define IMX_UFCR_RFDIV_SHIFT 7
160 #define IMX_UFCR_RFDIV __BITS(9,IMX_UFCR_RFDIV_SHIFT) /* rw */
161 #define IMX_UFCR_TXTL_SHIFT 10
162 #define IMX_UFCR_TXTL __BITS(15,IMX_UFCR_TXTL_SHIFT) /* rw */
163
164 #define IMX_UFCR_DIVIDER_TO_RFDIV(div) \
165 (((6 - div) % 7) & 0x7)
166
167 /*
168 * IMX_USR1 bits
169 */
170 #define IMX_USR1_RESV __BITS(3,0)
171 #define IMX_USR1_AWAKE __BIT(4) /* w1c */
172 #define IMX_USR1_AIRINT __BIT(5) /* w1c */
173 #define IMX_USR1_RXDS __BIT(6) /* ro */
174 #define IMX_USR1_DTRD __BIT(7) /* w1c */
175 #define IMX_USR1_AGTIM __BIT(8) /* w1c */
176 #define IMX_USR1_RRDY __BIT(9) /* ro */
177 #define IMX_USR1_FRAMERR __BIT(10) /* w1c */
178 #define IMX_USR1_ESCF __BIT(11) /* w1c */
179 #define IMX_USR1_RTSD __BIT(12) /* w1c */
180 #define IMX_USR1_TRDY __BIT(13) /* ro */
181 #define IMX_USR1_RTSS __BIT(14) /* ro */
182 #define IMX_USR1_PARITYERR __BIT(15) /* w1c */
183
184 /*
185 * IMX_USR2 bits
186 */
187 #define IMX_USR2_RDR __BIT(0)
188 #define IMX_USR2_ORE __BIT(1) /* w1c */
189 #define IMX_USR2_BRCD __BIT(2) /* w1c */
190 #define IMX_USR2_TXDC __BIT(3) /* ro */
191 #define IMX_USR2_RTSF __BIT(4) /* w1c */
192 #define IMX_USR2_DCDIN __BIT(5) /* ro */
193 #define IMX_USR2_DCDDELT __BIT(6) /* rw */
194 #define IMX_USR2_WAKE __BIT(7) /* w1c */
195 #define IMX_USR2_IRINT __BIT(8) /* rw */
196 #define IMX_USR2_RIIN __BIT(9) /* ro */
197 #define IMX_USR2_RIDELT __BIT(10) /* w1c */
198 #define IMX_USR2_ACST __BIT(11) /* rw */
199 #define IMX_USR2_IDLE __BIT(12) /* w1c */
200 #define IMX_USR2_DTRF __BIT(13) /* rw */
201 #define IMX_USR2_TXFE __BIT(14) /* ro */
202 #define IMX_USR2_ADET __BIT(15) /* w1c */
203
204 /*
205 * IMX_UESC bits
206 */
207 #define IMX_UESC_ESC_CHAR __BITS(7,0) /* rw */
208 #define IMX_UESC_RESV __BITS(15,8)
209
210 /*
211 * IMX_UTIM bits
212 */
213 #define IMX_UTIM_TIM __BITS(11,0) /* rw */
214 #define IMX_UTIM_RESV __BITS(15,12)
215
216 /*
217 * IMX_UBIR bits
218 */
219 #define IMX_UBIR_INC __BITS(15,0) /* rw */
220
221 /*
222 * IMX_UBMR bits
223 */
224 #define IMX_UBMR_MOD __BITS(15,0) /* rw */
225
226 /*
227 * IMX_UBRC bits
228 */
229 #define IMX_UBRC_BCNT __BITS(15,0) /* ro */
230
231 /*
232 * IMX_ONEMS bits
233 */
234 #define IMX_ONEMS_ONEMS __BITS(15,0) /* rw */
235
236 /*
237 * IMX_UTS bits
238 */
239 #define IMX_UTS_SOFTRST __BIT(0) /* rw */
240 #define IMX_UTS_RESVa __BITS(2,1)
241 #define IMX_UTS_RXFULL __BIT(3) /* rw */
242 #define IMX_UTS_TXFUL __BIT(4) /* rw */
243 #define IMX_UTS_RXEMPTY __BIT(5) /* rw */
244 #define IMX_UTS_TXEMPTY __BIT(5) /* rw */
245 #define IMX_UTS_RESVb __BITS(8,7)
246 #define IMX_UTS_RXDBG __BIT(9) /* rw */
247 #define IMX_UTS_LOOPIR __BIT(10) /* rw */
248 #define IMX_UTS_DBGEN __BIT(11) /* rw */
249 #define IMX_UTS_LOOP __BIT(12) /* rw */
250 #define IMX_UTS_FRCPERR __BIT(13) /* rw */
251 #define IMX_UTS_RESVc __BITS(15,14)
252 #define IMX_UTS_RESV (IMX_UTS_RESVa|IMX_UTS_RESVb|IMX_UTS_RESVc)
253
254 #ifndef __ASSEMBLER__
255 /*
256 * interrupt specs
257 * see Table 31-25. "Interrupts an DMA"
258 */
259
260 /*
261 * abstract interrupts spec indexing
262 */
263 typedef enum {
264 RX_RRDY=0,
265 RX_ID,
266 RX_DR,
267 RX_RXDS,
268 RX_AT,
269 TX_TXMPTY,
270 TX_TRDY,
271 TX_TC,
272 MINT_OR,
273 MINT_BR,
274 MINT_WK,
275 MINT_AD,
276 MINT_ACI,
277 MINT_ESCI,
278 MINT_IRI,
279 MINT_AIRINT,
280 MINT_AWAK,
281 MINT_FRAERR,
282 MINT_PARERR,
283 MINT_RTSD,
284 MINT_RTS,
285 MINT_DCE_DTR,
286 MINT_DTE_RI,
287 MINT_DTE_DCE,
288 MINT_DTRD,
289 RX_DMAREQ_RXDMA,
290 RX_DMAREQ_ATDMA,
291 RX_DMAREQ_IDDMA,
292 RX_DMAREQ_TXDMA,
293 } imxuart_intrix_t;
294
295 /*
296 * abstract interrupts spec
297 */
298 typedef struct {
299 const uint32_t enb_bit;
300 const uint enb_reg;
301 const uint32_t flg_bit;
302 const uint flg_reg;
303 const char * name; /* for debug */
304 } imxuart_intrspec_t;
305
306 #define IMXUART_INTRSPEC(cv, cr, sv, sr) \
307 { IMX_UCR##cr##_##cv, ((cr) - 1), IMX_USR##sr##_##sv, ((sr) - 1), #sv }
308
309 static const imxuart_intrspec_t imxuart_intrspec_tab[] = {
310 /* ipi_uart_rx */
311 IMXUART_INTRSPEC(RRDYEN, 1, RRDY, 1),
312 IMXUART_INTRSPEC(IDEN, 1, IDLE, 2),
313 IMXUART_INTRSPEC(DREN, 4, RDR, 2),
314 IMXUART_INTRSPEC(RXDSEN, 3, RXDS, 1),
315 IMXUART_INTRSPEC(ATEN, 2, AGTIM, 1),
316 /* ipi_uart_tx */
317 IMXUART_INTRSPEC(TXMPTYEN, 1, TXFE, 2),
318 IMXUART_INTRSPEC(TRDYEN, 1, TRDY, 1),
319 IMXUART_INTRSPEC(TCEN, 4, TXDC, 2),
320 /* ipi_uart_mint */
321 IMXUART_INTRSPEC(OREN, 4, ORE, 2),
322 IMXUART_INTRSPEC(BKEN, 4, BRCD, 2),
323 IMXUART_INTRSPEC(WKEN, 4, WAKE, 2),
324 IMXUART_INTRSPEC(ADEN, 1, ADET, 2),
325 IMXUART_INTRSPEC(ACIEN, 3, ACST, 2),
326 IMXUART_INTRSPEC(ESCI, 2, ESCF, 1),
327 IMXUART_INTRSPEC(ENIRI, 4, IRINT, 2),
328 IMXUART_INTRSPEC(AIRINTEN, 3, AIRINT, 1),
329 IMXUART_INTRSPEC(AWAKEN, 3, AWAKE, 1),
330 IMXUART_INTRSPEC(FRAERREN, 3, FRAMERR, 1),
331 IMXUART_INTRSPEC(PARERREN, 3, PARITYERR, 1),
332 IMXUART_INTRSPEC(RTSDEN, 1, RTSD, 1),
333 IMXUART_INTRSPEC(RTSEN, 2, RTSF, 2),
334 IMXUART_INTRSPEC(DTREN, 3, DTRF, 2),
335 IMXUART_INTRSPEC(RI, 3, DTRF, 2),
336 IMXUART_INTRSPEC(DCD, 3, DCDDELT, 2),
337 IMXUART_INTRSPEC(DTRDEN, 3, DTRD, 1),
338 /* ipd_uart_rx_dmareq */
339 IMXUART_INTRSPEC(RXDMAEN, 1, RRDY, 1),
340 IMXUART_INTRSPEC(ATDMAEN, 1, AGTIM, 1),
341 IMXUART_INTRSPEC(IDDMAEN, 4, IDLE, 2),
342 /* ipd_uart_tx_dmareq */
343 IMXUART_INTRSPEC(TXDMAEN, 1, TRDY, 1),
344 };
345 #define IMXUART_INTRSPEC_TAB_SZ \
346 (sizeof(imxuart_intrspec_tab) / sizeof(imxuart_intrspec_tab[0]))
347
348 #endif /* __ASSEMBLER__ */
349
350 /*
351 * functional groupings of intr status flags by reg
352 */
353 #define IMXUART_RXINTR_USR1 (IMX_USR1_RRDY|IMX_USR1_RXDS|IMX_USR1_AGTIM)
354 #define IMXUART_RXINTR_USR2 (IMX_USR2_IDLE|IMX_USR2_RDR)
355 #define IMXUART_TXINTR_USR1 (IMX_USR1_TRDY)
356 #define IMXUART_TXINTR_USR2 (IMX_USR2_TXFE|IMX_USR2_TXDC)
357 #define IMXUART_MINT_USR1 (IMX_USR1_ESCF|IMX_USR1_AIRINT||IMX_USR1_AWAKE \
358 |IMX_USR1_FRAMERR|IMX_USR1_PARITYERR \
359 |IMX_USR1_RTSD|IMX_USR1_DTRD)
360 #define IMXUART_MINT_USR2 (IMX_USR2_ORE|IMX_USR2_BRCD|IMX_USR2_WAKE \
361 |IMX_USR2_ADET|IMX_USR2_ACST|IMX_USR2_IRINT \
362 |IMX_USR2_RTSF|IMX_USR2_DTRF|IMX_USR2_DTRF \
363 |IMX_USR2_DCDDELT)
364 #define IMXUART_RXDMA_USR1 (IMX_USR1_RRDY|IMX_USR1_AGTIM)
365 #define IMXUART_RXDMA_USR2 (IMX_USR2_IDLE)
366 #define IMXUART_TXDMA_USR1 (IMX_USR1_TRDY)
367 #define IMXUART_TXDMA_USR2 (0)
368
369 /*
370 * all intr status flags by reg
371 */
372 #define IMXUART_INTRS_USR1 (IMXUART_RXINTR_USR1|IMXUART_TXINTR_USR1 \
373 |IMXUART_MINT_USR1|IMXUART_RXDMA_USR1 \
374 |IMXUART_TXDMA_USR1)
375 #define IMXUART_INTRS_USR2 (IMXUART_RXINTR_USR2|IMXUART_TXINTR_USR2 \
376 |IMXUART_MINT_USR2|IMXUART_RXDMA_USR2 \
377 |IMXUART_TXDMA_USR2)
378
379 /*
380 * all intr controls by reg
381 */
382 #define IMXUART_INTRS_UCR1 (IMX_UCR1_RRDYEN|IMX_UCR1_IDEN \
383 |IMX_UCR1_TXMPTYEN|IMX_UCR1_TRDYEN \
384 |IMX_UCR1_ADEN|IMX_UCR1_RTSDEN \
385 |IMX_UCR1_RXDMAEN|IMX_UCR1_RXDMAEN \
386 |IMX_UCR1_ATDMAEN|IMX_UCR1_TXDMAEN)
387 #define IMXUART_INTRS_UCR2 (IMX_UCR2_ATEN|IMX_UCR2_ESCI|IMX_UCR2_RTSEN)
388 #define IMXUART_INTRS_UCR3 (IMX_UCR3_RXDSEN|IMX_UCR3_ACIEN \
389 |IMX_UCR3_AIRINTEN|IMX_UCR3_AWAKEN \
390 |IMX_UCR3_FRAERREN|IMX_UCR3_PARERREN \
391 |IMX_UCR3_DTREN|IMX_UCR3_RI \
392 |IMX_UCR3_DCD|IMX_UCR3_DTRDEN)
393 #define IMXUART_INTRS_UCR4 (IMX_UCR4_DREN|IMX_UCR4_TCEN|IMX_UCR4_OREN \
394 |IMX_UCR4_BKEN|IMX_UCR4_WKEN \
395 |IMX_UCR4_ENIRI|IMX_UCR4_IDDMAEN)
396
397
398 #endif /* _IMXUARTREG_H */
399