Home | History | Annotate | Line # | Download | only in imx
      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