xref: /rk3399_rockchip-uboot/include/ns16550.h (revision 78237df55248034a2d7c2daea992b9dbe7ca8e96)
1 /*
2  * NS16550 Serial Port
3  * originally from linux source (arch/ppc/boot/ns16550.h)
4  * modified slightly to
5  * have addresses as offsets from CONFIG_SYS_ISA_BASE
6  * added a few more definitions
7  * added prototypes for ns16550.c
8  * reduced no of com ports to 2
9  * modifications (c) Rob Taylor, Flying Pig Systems. 2000.
10  *
11  * added support for port on 64-bit bus
12  * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems
13  */
14 
15 #if (CONFIG_SYS_NS16550_REG_SIZE == 1)
16 struct NS16550 {
17 	unsigned char rbr;		/* 0 */
18 	unsigned char ier;		/* 1 */
19 	unsigned char fcr;		/* 2 */
20 	unsigned char lcr;		/* 3 */
21 	unsigned char mcr;		/* 4 */
22 	unsigned char lsr;		/* 5 */
23 	unsigned char msr;		/* 6 */
24 	unsigned char scr;		/* 7 */
25 #if defined(CONFIG_OMAP730)
26 	unsigned char mdr1;		/* 8 */
27 	unsigned char reg9;		/* 9 */
28 	unsigned char regA;		/* A */
29 	unsigned char regB;		/* B */
30 	unsigned char regC;		/* C */
31 	unsigned char regD;		/* D */
32 	unsigned char regE;		/* E */
33 	unsigned char regF;		/* F */
34 	unsigned char reg10;		/* 10 */
35 	unsigned char ssr;		/* 11*/
36 #endif
37 } __attribute__ ((packed));
38 #elif (CONFIG_SYS_NS16550_REG_SIZE == 2)
39 struct NS16550 {
40 	unsigned short rbr;		/* 0 */
41 	unsigned short ier;		/* 1 */
42 	unsigned short fcr;		/* 2 */
43 	unsigned short lcr;		/* 3 */
44 	unsigned short mcr;		/* 4 */
45 	unsigned short lsr;		/* 5 */
46 	unsigned short msr;		/* 6 */
47 	unsigned short scr;		/* 7 */
48 } __attribute__ ((packed));
49 #elif (CONFIG_SYS_NS16550_REG_SIZE == 4)
50 struct NS16550 {
51 	unsigned long rbr;		/* 0 r  */
52 	unsigned long ier;		/* 1 rw */
53 	unsigned long fcr;		/* 2 w  */
54 	unsigned long lcr;		/* 3 rw */
55 	unsigned long mcr;		/* 4 rw */
56 	unsigned long lsr;		/* 5 r  */
57 	unsigned long msr;		/* 6 r  */
58 	unsigned long scr;		/* 7 rw */
59 }; /* No need to pack an already aligned struct */
60 #elif (CONFIG_SYS_NS16550_REG_SIZE == -4)
61 struct NS16550 {
62 	unsigned char rbr;		/* 0 */
63 	int pad1:24;
64 	unsigned char ier;		/* 1 */
65 	int pad2:24;
66 	unsigned char fcr;		/* 2 */
67 	int pad3:24;
68 	unsigned char lcr;		/* 3 */
69 	int pad4:24;
70 	unsigned char mcr;		/* 4 */
71 	int pad5:24;
72 	unsigned char lsr;		/* 5 */
73 	int pad6:24;
74 	unsigned char msr;		/* 6 */
75 	int pad7:24;
76 	unsigned char scr;		/* 7 */
77 	int pad8:24;
78 #if defined(CONFIG_OMAP)
79 	unsigned char mdr1;		/* mode select reset TL16C750*/
80 #endif
81 #ifdef CONFIG_OMAP1510
82 	int pad9:24;
83 	unsigned long pad[10];
84 	unsigned char osc_12m_sel;
85 	int pad10:24;
86 #endif
87 } __attribute__ ((packed));
88 #elif (CONFIG_SYS_NS16550_REG_SIZE == -8)
89 struct NS16550 {
90 	unsigned char rbr;		/* 0 */
91 	unsigned char pad0[7];
92 	unsigned char ier;		/* 1 */
93 	unsigned char pad1[7];
94 	unsigned char fcr;		/* 2 */
95 	unsigned char pad2[7];
96 	unsigned char lcr;		/* 3 */
97 	unsigned char pad3[7];
98 	unsigned char mcr;		/* 4 */
99 	unsigned char pad4[7];
100 	unsigned char lsr;		/* 5 */
101 	unsigned char pad5[7];
102 	unsigned char msr;		/* 6 */
103 	unsigned char pad6[7];
104 	unsigned char scr;		/* 7 */
105 	unsigned char pad7[7];
106 } __attribute__ ((packed));
107 #else
108 #error "Please define NS16550 registers size."
109 #endif
110 
111 #define thr rbr
112 #define iir fcr
113 #define dll rbr
114 #define dlm ier
115 
116 typedef volatile struct NS16550 *NS16550_t;
117 
118 #define FCR_FIFO_EN     0x01		/* Fifo enable */
119 #define FCR_RXSR        0x02		/* Receiver soft reset */
120 #define FCR_TXSR        0x04		/* Transmitter soft reset */
121 
122 #define MCR_DTR         0x01
123 #define MCR_RTS         0x02
124 #define MCR_DMA_EN      0x04
125 #define MCR_TX_DFR      0x08
126 #define MCR_LOOP	0x10		/* Enable loopback test mode */
127 
128 #define LCR_WLS_MSK	0x03		/* character length select mask */
129 #define LCR_WLS_5	0x00		/* 5 bit character length */
130 #define LCR_WLS_6	0x01		/* 6 bit character length */
131 #define LCR_WLS_7	0x02		/* 7 bit character length */
132 #define LCR_WLS_8	0x03		/* 8 bit character length */
133 #define LCR_STB		0x04		/* Number of stop Bits, off = 1, on = 1.5 or 2) */
134 #define LCR_PEN		0x08		/* Parity eneble */
135 #define LCR_EPS		0x10		/* Even Parity Select */
136 #define LCR_STKP	0x20		/* Stick Parity */
137 #define LCR_SBRK	0x40		/* Set Break */
138 #define LCR_BKSE	0x80		/* Bank select enable */
139 #define LCR_DLAB	0x80		/* Divisor latch access bit */
140 
141 #define LSR_DR		0x01		/* Data ready */
142 #define LSR_OE		0x02		/* Overrun */
143 #define LSR_PE		0x04		/* Parity error */
144 #define LSR_FE		0x08		/* Framing error */
145 #define LSR_BI		0x10		/* Break */
146 #define LSR_THRE	0x20		/* Xmit holding register empty */
147 #define LSR_TEMT	0x40		/* Xmitter empty */
148 #define LSR_ERR		0x80		/* Error */
149 
150 #define MSR_DCD		0x80		/* Data Carrier Detect */
151 #define MSR_RI		0x40		/* Ring Indicator */
152 #define MSR_DSR		0x20		/* Data Set Ready */
153 #define MSR_CTS		0x10		/* Clear to Send */
154 #define MSR_DDCD	0x08		/* Delta DCD */
155 #define MSR_TERI	0x04		/* Trailing edge ring indicator */
156 #define MSR_DDSR	0x02		/* Delta DSR */
157 #define MSR_DCTS	0x01		/* Delta CTS */
158 
159 #ifdef CONFIG_OMAP1510
160 #define OSC_12M_SEL	0x01		/* selects 6.5 * current clk div */
161 #endif
162 
163 /* useful defaults for LCR */
164 #define LCR_8N1		0x03
165 
166 void	NS16550_init   (NS16550_t com_port, int baud_divisor);
167 void	NS16550_putc   (NS16550_t com_port, char c);
168 char	NS16550_getc   (NS16550_t com_port);
169 int	NS16550_tstc   (NS16550_t com_port);
170 void	NS16550_reinit (NS16550_t com_port, int baud_divisor);
171