xref: /rk3399_rockchip-uboot/include/ns16550.h (revision f5e0d03970409feb3c77ab0107d5dece6b7d45c9)
1717b5aadSwdenk /*
2717b5aadSwdenk  * NS16550 Serial Port
3717b5aadSwdenk  * originally from linux source (arch/ppc/boot/ns16550.h)
4717b5aadSwdenk  * modified slightly to
5717b5aadSwdenk  * have addresses as offsets from CFG_ISA_BASE
6717b5aadSwdenk  * added a few more definitions
7717b5aadSwdenk  * added prototypes for ns16550.c
8717b5aadSwdenk  * reduced no of com ports to 2
9717b5aadSwdenk  * modifications (c) Rob Taylor, Flying Pig Systems. 2000.
10*f5e0d039SHeiko Schocher  *
11*f5e0d039SHeiko Schocher  * added support for port on 64-bit bus
12*f5e0d039SHeiko Schocher  * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems
13717b5aadSwdenk  */
14717b5aadSwdenk 
15717b5aadSwdenk #if (CFG_NS16550_REG_SIZE == 1)
16717b5aadSwdenk struct NS16550 {
17717b5aadSwdenk 	unsigned char rbr;		/* 0 */
18717b5aadSwdenk 	unsigned char ier;		/* 1 */
19717b5aadSwdenk 	unsigned char fcr;		/* 2 */
20717b5aadSwdenk 	unsigned char lcr;		/* 3 */
21717b5aadSwdenk 	unsigned char mcr;		/* 4 */
22717b5aadSwdenk 	unsigned char lsr;		/* 5 */
23717b5aadSwdenk 	unsigned char msr;		/* 6 */
24717b5aadSwdenk 	unsigned char scr;		/* 7 */
25a56bd922Swdenk #if defined(CONFIG_OMAP730)
26a56bd922Swdenk 	unsigned char mdr1;		/* 8 */
27a56bd922Swdenk 	unsigned char reg9;		/* 9 */
28a56bd922Swdenk 	unsigned char regA;		/* A */
29a56bd922Swdenk 	unsigned char regB;		/* B */
30a56bd922Swdenk 	unsigned char regC;		/* C */
31a56bd922Swdenk 	unsigned char regD;		/* D */
32a56bd922Swdenk 	unsigned char regE;		/* E */
33a56bd922Swdenk 	unsigned char regF;		/* F */
34a56bd922Swdenk 	unsigned char reg10;		/* 10 */
35a56bd922Swdenk 	unsigned char ssr;		/* 11*/
36a56bd922Swdenk #endif
37717b5aadSwdenk } __attribute__ ((packed));
38717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 2)
39717b5aadSwdenk struct NS16550 {
40717b5aadSwdenk 	unsigned short rbr;		/* 0 */
41717b5aadSwdenk 	unsigned short ier;		/* 1 */
42717b5aadSwdenk 	unsigned short fcr;		/* 2 */
43717b5aadSwdenk 	unsigned short lcr;		/* 3 */
44717b5aadSwdenk 	unsigned short mcr;		/* 4 */
45717b5aadSwdenk 	unsigned short lsr;		/* 5 */
46717b5aadSwdenk 	unsigned short msr;		/* 6 */
47717b5aadSwdenk 	unsigned short scr;		/* 7 */
48717b5aadSwdenk } __attribute__ ((packed));
49717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 4)
50717b5aadSwdenk struct NS16550 {
5122814904SWolfgang Denk 	unsigned long rbr;		/* 0 r  */
5222814904SWolfgang Denk 	unsigned long ier;		/* 1 rw */
5322814904SWolfgang Denk 	unsigned long fcr;		/* 2 w  */
5422814904SWolfgang Denk 	unsigned long lcr;		/* 3 rw */
5522814904SWolfgang Denk 	unsigned long mcr;		/* 4 rw */
5622814904SWolfgang Denk 	unsigned long lsr;		/* 5 r  */
5722814904SWolfgang Denk 	unsigned long msr;		/* 6 r  */
5822814904SWolfgang Denk 	unsigned long scr;		/* 7 rw */
5922814904SWolfgang Denk }; /* No need to pack an already aligned struct */
60717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == -4)
61717b5aadSwdenk struct NS16550 {
62717b5aadSwdenk 	unsigned char rbr;		/* 0 */
63717b5aadSwdenk 	int pad1:24;
64717b5aadSwdenk 	unsigned char ier;		/* 1 */
65717b5aadSwdenk 	int pad2:24;
66717b5aadSwdenk 	unsigned char fcr;		/* 2 */
67717b5aadSwdenk 	int pad3:24;
68717b5aadSwdenk 	unsigned char lcr;		/* 3 */
69717b5aadSwdenk 	int pad4:24;
70717b5aadSwdenk 	unsigned char mcr;		/* 4 */
71717b5aadSwdenk 	int pad5:24;
72717b5aadSwdenk 	unsigned char lsr;		/* 5 */
73717b5aadSwdenk 	int pad6:24;
74717b5aadSwdenk 	unsigned char msr;		/* 6 */
75717b5aadSwdenk 	int pad7:24;
76717b5aadSwdenk 	unsigned char scr;		/* 7 */
77717b5aadSwdenk 	int pad8:24;
788ed96046Swdenk #if defined(CONFIG_OMAP)
792e5983d2Swdenk 	unsigned char mdr1;		/* mode select reset TL16C750*/
806f21347dSwdenk #endif
816f21347dSwdenk #ifdef CONFIG_OMAP1510
822e5983d2Swdenk 	int pad9:24;
832e5983d2Swdenk 	unsigned long pad[10];
842e5983d2Swdenk 	unsigned char osc_12m_sel;
852e5983d2Swdenk 	int pad10:24;
862e5983d2Swdenk #endif
87717b5aadSwdenk } __attribute__ ((packed));
88*f5e0d039SHeiko Schocher #elif (CFG_NS16550_REG_SIZE == -8)
89*f5e0d039SHeiko Schocher struct NS16550 {
90*f5e0d039SHeiko Schocher 	unsigned char rbr;		/* 0 */
91*f5e0d039SHeiko Schocher 	unsigned char pad0[7];
92*f5e0d039SHeiko Schocher 	unsigned char ier;		/* 1 */
93*f5e0d039SHeiko Schocher 	unsigned char pad1[7];
94*f5e0d039SHeiko Schocher 	unsigned char fcr;		/* 2 */
95*f5e0d039SHeiko Schocher 	unsigned char pad2[7];
96*f5e0d039SHeiko Schocher 	unsigned char lcr;		/* 3 */
97*f5e0d039SHeiko Schocher 	unsigned char pad3[7];
98*f5e0d039SHeiko Schocher 	unsigned char mcr;		/* 4 */
99*f5e0d039SHeiko Schocher 	unsigned char pad4[7];
100*f5e0d039SHeiko Schocher 	unsigned char lsr;		/* 5 */
101*f5e0d039SHeiko Schocher 	unsigned char pad5[7];
102*f5e0d039SHeiko Schocher 	unsigned char msr;		/* 6 */
103*f5e0d039SHeiko Schocher 	unsigned char pad6[7];
104*f5e0d039SHeiko Schocher 	unsigned char scr;		/* 7 */
105*f5e0d039SHeiko Schocher 	unsigned char pad7[7];
106*f5e0d039SHeiko Schocher } __attribute__ ((packed));
107717b5aadSwdenk #else
108717b5aadSwdenk #error "Please define NS16550 registers size."
109717b5aadSwdenk #endif
110717b5aadSwdenk 
111717b5aadSwdenk #define thr rbr
112717b5aadSwdenk #define iir fcr
113717b5aadSwdenk #define dll rbr
114717b5aadSwdenk #define dlm ier
115717b5aadSwdenk 
116717b5aadSwdenk typedef volatile struct NS16550 *NS16550_t;
117717b5aadSwdenk 
118717b5aadSwdenk #define FCR_FIFO_EN     0x01		/* Fifo enable */
119717b5aadSwdenk #define FCR_RXSR        0x02		/* Receiver soft reset */
120717b5aadSwdenk #define FCR_TXSR        0x04		/* Transmitter soft reset */
121717b5aadSwdenk 
122717b5aadSwdenk #define MCR_DTR         0x01
123717b5aadSwdenk #define MCR_RTS         0x02
124717b5aadSwdenk #define MCR_DMA_EN      0x04
125717b5aadSwdenk #define MCR_TX_DFR      0x08
126717b5aadSwdenk 
12722814904SWolfgang Denk #define LCR_WLS_MSK	0x03		/* character length select mask */
128717b5aadSwdenk #define LCR_WLS_5	0x00		/* 5 bit character length */
129717b5aadSwdenk #define LCR_WLS_6	0x01		/* 6 bit character length */
130717b5aadSwdenk #define LCR_WLS_7	0x02		/* 7 bit character length */
131717b5aadSwdenk #define LCR_WLS_8	0x03		/* 8 bit character length */
132717b5aadSwdenk #define LCR_STB		0x04		/* Number of stop Bits, off = 1, on = 1.5 or 2) */
133717b5aadSwdenk #define LCR_PEN		0x08		/* Parity eneble */
134717b5aadSwdenk #define LCR_EPS		0x10		/* Even Parity Select */
135717b5aadSwdenk #define LCR_STKP	0x20		/* Stick Parity */
136717b5aadSwdenk #define LCR_SBRK	0x40		/* Set Break */
137717b5aadSwdenk #define LCR_BKSE	0x80		/* Bank select enable */
138717b5aadSwdenk 
139717b5aadSwdenk #define LSR_DR		0x01		/* Data ready */
140717b5aadSwdenk #define LSR_OE		0x02		/* Overrun */
141717b5aadSwdenk #define LSR_PE		0x04		/* Parity error */
142717b5aadSwdenk #define LSR_FE		0x08		/* Framing error */
143717b5aadSwdenk #define LSR_BI		0x10		/* Break */
144717b5aadSwdenk #define LSR_THRE	0x20		/* Xmit holding register empty */
145717b5aadSwdenk #define LSR_TEMT	0x40		/* Xmitter empty */
146717b5aadSwdenk #define LSR_ERR		0x80		/* Error */
147717b5aadSwdenk 
1482e5983d2Swdenk #ifdef CONFIG_OMAP1510
1492e5983d2Swdenk #define OSC_12M_SEL	0x01		/* selects 6.5 * current clk div */
1502e5983d2Swdenk #endif
1512e5983d2Swdenk 
152717b5aadSwdenk /* useful defaults for LCR */
153717b5aadSwdenk #define LCR_8N1		0x03
154717b5aadSwdenk 
155717b5aadSwdenk void	NS16550_init   (NS16550_t com_port, int baud_divisor);
156717b5aadSwdenk void	NS16550_putc   (NS16550_t com_port, char c);
157717b5aadSwdenk char	NS16550_getc   (NS16550_t com_port);
158717b5aadSwdenk int	NS16550_tstc   (NS16550_t com_port);
159717b5aadSwdenk void	NS16550_reinit (NS16550_t com_port, int baud_divisor);
160