Blame view
include/ns16550.h
7.9 KB
717b5aad2 Initial revision |
1 2 |
/* * NS16550 Serial Port |
a47a12bec Move arch/ppc to ... |
3 |
* originally from linux source (arch/powerpc/boot/ns16550.h) |
200779e3e Rename common ns1... |
4 5 6 7 |
* * Cleanup and unification * (C) 2009 by Detlev Zundel, DENX Software Engineering GmbH * |
717b5aad2 Initial revision |
8 |
* modified slightly to |
6d0f6bcf3 rename CFG_ macro... |
9 |
* have addresses as offsets from CONFIG_SYS_ISA_BASE |
717b5aad2 Initial revision |
10 11 12 13 |
* added a few more definitions * added prototypes for ns16550.c * reduced no of com ports to 2 * modifications (c) Rob Taylor, Flying Pig Systems. 2000. |
b87dfd285 Add support for T... |
14 |
* |
f5e0d0397 Add support for w... |
15 16 |
* added support for port on 64-bit bus * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems |
717b5aad2 Initial revision |
17 |
*/ |
453c0d755 include/ns16550.h... |
18 19 20 21 |
/* * Note that the following macro magic uses the fact that the compiler * will not allocate storage for arrays of size 0 */ |
79df1208e ns16550: change t... |
22 |
#include <linux/types.h> |
12e431b27 dm: serial: Add d... |
23 24 25 26 27 28 29 |
#ifdef CONFIG_DM_SERIAL /* * For driver model we always use one byte per register, and sort out the * differences in the driver */ #define CONFIG_SYS_NS16550_REG_SIZE (-1) #endif |
453c0d755 include/ns16550.h... |
30 |
#if !defined(CONFIG_SYS_NS16550_REG_SIZE) || (CONFIG_SYS_NS16550_REG_SIZE == 0) |
717b5aad2 Initial revision |
31 |
#error "Please define NS16550 registers size." |
909140085 dm: ns16550: Supp... |
32 |
#elif defined(CONFIG_SYS_NS16550_MEM32) && !defined(CONFIG_DM_SERIAL) |
79df1208e ns16550: change t... |
33 |
#define UART_REG(x) u32 x |
453c0d755 include/ns16550.h... |
34 35 36 37 38 39 40 41 |
#elif (CONFIG_SYS_NS16550_REG_SIZE > 0) #define UART_REG(x) \ unsigned char prepad_##x[CONFIG_SYS_NS16550_REG_SIZE - 1]; \ unsigned char x; #elif (CONFIG_SYS_NS16550_REG_SIZE < 0) #define UART_REG(x) \ unsigned char x; \ unsigned char postpad_##x[-CONFIG_SYS_NS16550_REG_SIZE - 1]; |
717b5aad2 Initial revision |
42 |
#endif |
12e431b27 dm: serial: Add d... |
43 44 45 46 47 48 |
/** * struct ns16550_platdata - information about a NS16550 port * * @base: Base register address * @reg_shift: Shift size of registers (0=byte, 1=16bit, 2=32bit...) * @clock: UART base clock speed in Hz |
6822cf3ec serial: ns16550: ... |
49 50 51 52 |
* * @buf: Pointer to the RX interrupt buffer * @rd_ptr: Read pointer in the RX interrupt buffer * @wr_ptr: Write pointer in the RX interrupt buffer |
12e431b27 dm: serial: Add d... |
53 54 |
*/ struct ns16550_platdata { |
167efe01b dm: ns16550: Use ... |
55 |
unsigned long base; |
12e431b27 dm: serial: Add d... |
56 57 |
int reg_shift; int clock; |
59b35ddd2 dm: ns16550: Add ... |
58 |
int reg_offset; |
65f83802b serial: 16550: Ad... |
59 |
u32 fcr; |
6822cf3ec serial: ns16550: ... |
60 61 62 63 64 65 |
int irq; char *buf; int rd_ptr; int wr_ptr; |
12e431b27 dm: serial: Add d... |
66 67 68 |
}; struct udevice; |
453c0d755 include/ns16550.h... |
69 70 71 72 73 74 75 76 77 |
struct NS16550 { UART_REG(rbr); /* 0 */ UART_REG(ier); /* 1 */ UART_REG(fcr); /* 2 */ UART_REG(lcr); /* 3 */ UART_REG(mcr); /* 4 */ UART_REG(lsr); /* 5 */ UART_REG(msr); /* 6 */ UART_REG(spr); /* 7 */ |
99b603e71 serial/ns16550: n... |
78 79 80 81 82 83 84 85 |
#ifdef CONFIG_SOC_DA8XX UART_REG(reg8); /* 8 */ UART_REG(reg9); /* 9 */ UART_REG(revid1); /* A */ UART_REG(revid2); /* B */ UART_REG(pwr_mgmt); /* C */ UART_REG(mdr1); /* D */ #else |
453c0d755 include/ns16550.h... |
86 87 88 89 90 91 92 93 94 95 |
UART_REG(mdr1); /* 8 */ UART_REG(reg9); /* 9 */ UART_REG(regA); /* A */ UART_REG(regB); /* B */ UART_REG(regC); /* C */ UART_REG(regD); /* D */ UART_REG(regE); /* E */ UART_REG(uasr); /* F */ UART_REG(scr); /* 10*/ UART_REG(ssr); /* 11*/ |
99b603e71 serial/ns16550: n... |
96 |
#endif |
12e431b27 dm: serial: Add d... |
97 98 99 |
#ifdef CONFIG_DM_SERIAL struct ns16550_platdata *plat; #endif |
453c0d755 include/ns16550.h... |
100 |
}; |
717b5aad2 Initial revision |
101 102 103 104 |
#define thr rbr #define iir fcr #define dll rbr #define dlm ier |
f8df9d0d1 NS16550: trivial ... |
105 |
typedef struct NS16550 *NS16550_t; |
717b5aad2 Initial revision |
106 |
|
200779e3e Rename common ns1... |
107 108 109 |
/* * These are the definitions for the FIFO Control Register */ |
f8df9d0d1 NS16550: trivial ... |
110 |
#define UART_FCR_FIFO_EN 0x01 /* Fifo enable */ |
200779e3e Rename common ns1... |
111 112 113 114 115 116 117 118 119 120 121 |
#define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */ #define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */ #define UART_FCR_DMA_SELECT 0x08 /* For DMA applications */ #define UART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */ #define UART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */ #define UART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */ #define UART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */ #define UART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */ #define UART_FCR_RXSR 0x02 /* Receiver soft reset */ #define UART_FCR_TXSR 0x04 /* Transmitter soft reset */ |
0b060eefd serial: 16550: Ad... |
122 123 |
/* Ingenic JZ47xx specific UART-enable bit. */ #define UART_FCR_UME 0x10 |
17fa03267 serial, ns16550: ... |
124 125 126 127 |
/* Clear & enable FIFOs */ #define UART_FCR_DEFVAL (UART_FCR_FIFO_EN | \ UART_FCR_RXSR | \ UART_FCR_TXSR) |
200779e3e Rename common ns1... |
128 129 130 131 132 133 134 135 |
/* * These are the definitions for the Modem Control Register */ #define UART_MCR_DTR 0x01 /* DTR */ #define UART_MCR_RTS 0x02 /* RTS */ #define UART_MCR_OUT1 0x04 /* Out 1 */ #define UART_MCR_OUT2 0x08 /* Out 2 */ #define UART_MCR_LOOP 0x10 /* Enable loopback test mode */ |
d57dee578 serial: nsl16550:... |
136 |
#define UART_MCR_AFE 0x20 /* Enable auto-RTS/CTS */ |
200779e3e Rename common ns1... |
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
#define UART_MCR_DMA_EN 0x04 #define UART_MCR_TX_DFR 0x08 /* * These are the definitions for the Line Control Register * * Note: if the word length is 5 bits (UART_LCR_WLEN5), then setting * UART_LCR_STOP will select 1.5 stop bits, not 2 stop bits. */ #define UART_LCR_WLS_MSK 0x03 /* character length select mask */ #define UART_LCR_WLS_5 0x00 /* 5 bit character length */ #define UART_LCR_WLS_6 0x01 /* 6 bit character length */ #define UART_LCR_WLS_7 0x02 /* 7 bit character length */ #define UART_LCR_WLS_8 0x03 /* 8 bit character length */ |
f8df9d0d1 NS16550: trivial ... |
152 |
#define UART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */ |
200779e3e Rename common ns1... |
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
#define UART_LCR_PEN 0x08 /* Parity eneble */ #define UART_LCR_EPS 0x10 /* Even Parity Select */ #define UART_LCR_STKP 0x20 /* Stick Parity */ #define UART_LCR_SBRK 0x40 /* Set Break */ #define UART_LCR_BKSE 0x80 /* Bank select enable */ #define UART_LCR_DLAB 0x80 /* Divisor latch access bit */ /* * These are the definitions for the Line Status Register */ #define UART_LSR_DR 0x01 /* Data ready */ #define UART_LSR_OE 0x02 /* Overrun */ #define UART_LSR_PE 0x04 /* Parity error */ #define UART_LSR_FE 0x08 /* Framing error */ #define UART_LSR_BI 0x10 /* Break */ #define UART_LSR_THRE 0x20 /* Xmit holding register empty */ #define UART_LSR_TEMT 0x40 /* Xmitter empty */ #define UART_LSR_ERR 0x80 /* Error */ #define UART_MSR_DCD 0x80 /* Data Carrier Detect */ #define UART_MSR_RI 0x40 /* Ring Indicator */ #define UART_MSR_DSR 0x20 /* Data Set Ready */ #define UART_MSR_CTS 0x10 /* Clear to Send */ #define UART_MSR_DDCD 0x08 /* Delta DCD */ #define UART_MSR_TERI 0x04 /* Trailing edge ring indicator */ #define UART_MSR_DDSR 0x02 /* Delta DSR */ #define UART_MSR_DCTS 0x01 /* Delta CTS */ /* * These are the definitions for the Interrupt Identification Register */ #define UART_IIR_NO_INT 0x01 /* No interrupts pending */ #define UART_IIR_ID 0x06 /* Mask for the interrupt ID */ #define UART_IIR_MSI 0x00 /* Modem status interrupt */ #define UART_IIR_THRI 0x02 /* Transmitter holding register empty */ #define UART_IIR_RDI 0x04 /* Receiver data interrupt */ #define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */ /* * These are the definitions for the Interrupt Enable Register */ #define UART_IER_MSI 0x08 /* Enable Modem status interrupt */ #define UART_IER_RLSI 0x04 /* Enable receiver line status interrupt */ #define UART_IER_THRI 0x02 /* Enable Transmitter holding register int. */ #define UART_IER_RDI 0x01 /* Enable receiver data interrupt */ |
717b5aad2 Initial revision |
199 |
/* useful defaults for LCR */ |
200779e3e Rename common ns1... |
200 |
#define UART_LCR_8N1 0x03 |
717b5aad2 Initial revision |
201 |
|
f8df9d0d1 NS16550: trivial ... |
202 203 204 205 206 |
void NS16550_init(NS16550_t com_port, int baud_divisor); void NS16550_putc(NS16550_t com_port, char c); char NS16550_getc(NS16550_t com_port); int NS16550_tstc(NS16550_t com_port); void NS16550_reinit(NS16550_t com_port, int baud_divisor); |
fa54eb124 dm: serial: Move ... |
207 208 209 210 211 212 213 214 215 216 217 218 219 |
/** * ns16550_calc_divisor() - calculate the divisor given clock and baud rate * * Given the UART input clock and required baudrate, calculate the divisor * that should be used. * * @port: UART port * @clock: UART input clock speed in Hz * @baudrate: Required baud rate * @return baud rate divisor that should be used */ int ns16550_calc_divisor(NS16550_t port, int clock, int baudrate); |
12e431b27 dm: serial: Add d... |
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
/** * ns16550_serial_ofdata_to_platdata() - convert DT to platform data * * Decode a device tree node for an ns16550 device. This includes the * register base address and register shift properties. The caller must set * up the clock frequency. * * @dev: dev to decode platform data for * @return: 0 if OK, -EINVAL on error */ int ns16550_serial_ofdata_to_platdata(struct udevice *dev); /** * ns16550_serial_probe() - probe a serial port * * This sets up the serial port ready for use, except for the baud rate * @return 0, or -ve on error */ int ns16550_serial_probe(struct udevice *dev); /** * struct ns16550_serial_ops - ns16550 serial operations * * These should be used by the client driver for the driver's 'ops' member */ extern const struct dm_serial_ops ns16550_serial_ops; |