1717b5aadSwdenk /* 2717b5aadSwdenk * NS16550 Serial Port 3717b5aadSwdenk * originally from linux source (arch/ppc/boot/ns16550.h) 4*200779e3SDetlev Zundel * 5*200779e3SDetlev Zundel * Cleanup and unification 6*200779e3SDetlev Zundel * (C) 2009 by Detlev Zundel, DENX Software Engineering GmbH 7*200779e3SDetlev Zundel * 8717b5aadSwdenk * modified slightly to 96d0f6bcfSJean-Christophe PLAGNIOL-VILLARD * have addresses as offsets from CONFIG_SYS_ISA_BASE 10717b5aadSwdenk * added a few more definitions 11717b5aadSwdenk * added prototypes for ns16550.c 12717b5aadSwdenk * reduced no of com ports to 2 13717b5aadSwdenk * modifications (c) Rob Taylor, Flying Pig Systems. 2000. 14f5e0d039SHeiko Schocher * 15f5e0d039SHeiko Schocher * added support for port on 64-bit bus 16f5e0d039SHeiko Schocher * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems 17717b5aadSwdenk */ 18717b5aadSwdenk 196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if (CONFIG_SYS_NS16550_REG_SIZE == 1) 20717b5aadSwdenk struct NS16550 { 21717b5aadSwdenk unsigned char rbr; /* 0 */ 22717b5aadSwdenk unsigned char ier; /* 1 */ 23717b5aadSwdenk unsigned char fcr; /* 2 */ 24717b5aadSwdenk unsigned char lcr; /* 3 */ 25717b5aadSwdenk unsigned char mcr; /* 4 */ 26717b5aadSwdenk unsigned char lsr; /* 5 */ 27717b5aadSwdenk unsigned char msr; /* 6 */ 28717b5aadSwdenk unsigned char scr; /* 7 */ 29a56bd922Swdenk #if defined(CONFIG_OMAP730) 30a56bd922Swdenk unsigned char mdr1; /* 8 */ 31a56bd922Swdenk unsigned char reg9; /* 9 */ 32a56bd922Swdenk unsigned char regA; /* A */ 33a56bd922Swdenk unsigned char regB; /* B */ 34a56bd922Swdenk unsigned char regC; /* C */ 35a56bd922Swdenk unsigned char regD; /* D */ 36a56bd922Swdenk unsigned char regE; /* E */ 37a56bd922Swdenk unsigned char regF; /* F */ 38a56bd922Swdenk unsigned char reg10; /* 10 */ 39a56bd922Swdenk unsigned char ssr; /* 11*/ 40a56bd922Swdenk #endif 41717b5aadSwdenk } __attribute__ ((packed)); 426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif (CONFIG_SYS_NS16550_REG_SIZE == 2) 43717b5aadSwdenk struct NS16550 { 44717b5aadSwdenk unsigned short rbr; /* 0 */ 45717b5aadSwdenk unsigned short ier; /* 1 */ 46717b5aadSwdenk unsigned short fcr; /* 2 */ 47717b5aadSwdenk unsigned short lcr; /* 3 */ 48717b5aadSwdenk unsigned short mcr; /* 4 */ 49717b5aadSwdenk unsigned short lsr; /* 5 */ 50717b5aadSwdenk unsigned short msr; /* 6 */ 51717b5aadSwdenk unsigned short scr; /* 7 */ 52717b5aadSwdenk } __attribute__ ((packed)); 536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif (CONFIG_SYS_NS16550_REG_SIZE == 4) 54717b5aadSwdenk struct NS16550 { 5522814904SWolfgang Denk unsigned long rbr; /* 0 r */ 5622814904SWolfgang Denk unsigned long ier; /* 1 rw */ 5722814904SWolfgang Denk unsigned long fcr; /* 2 w */ 5822814904SWolfgang Denk unsigned long lcr; /* 3 rw */ 5922814904SWolfgang Denk unsigned long mcr; /* 4 rw */ 6022814904SWolfgang Denk unsigned long lsr; /* 5 r */ 6122814904SWolfgang Denk unsigned long msr; /* 6 r */ 6222814904SWolfgang Denk unsigned long scr; /* 7 rw */ 6322814904SWolfgang Denk }; /* No need to pack an already aligned struct */ 646d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif (CONFIG_SYS_NS16550_REG_SIZE == -4) 65717b5aadSwdenk struct NS16550 { 66717b5aadSwdenk unsigned char rbr; /* 0 */ 67717b5aadSwdenk int pad1:24; 68717b5aadSwdenk unsigned char ier; /* 1 */ 69717b5aadSwdenk int pad2:24; 70717b5aadSwdenk unsigned char fcr; /* 2 */ 71717b5aadSwdenk int pad3:24; 72717b5aadSwdenk unsigned char lcr; /* 3 */ 73717b5aadSwdenk int pad4:24; 74717b5aadSwdenk unsigned char mcr; /* 4 */ 75717b5aadSwdenk int pad5:24; 76717b5aadSwdenk unsigned char lsr; /* 5 */ 77717b5aadSwdenk int pad6:24; 78717b5aadSwdenk unsigned char msr; /* 6 */ 79717b5aadSwdenk int pad7:24; 80717b5aadSwdenk unsigned char scr; /* 7 */ 81717b5aadSwdenk int pad8:24; 828ed96046Swdenk #if defined(CONFIG_OMAP) 832e5983d2Swdenk unsigned char mdr1; /* mode select reset TL16C750*/ 846f21347dSwdenk #endif 856f21347dSwdenk #ifdef CONFIG_OMAP1510 862e5983d2Swdenk int pad9:24; 872e5983d2Swdenk unsigned long pad[10]; 882e5983d2Swdenk unsigned char osc_12m_sel; 892e5983d2Swdenk int pad10:24; 902e5983d2Swdenk #endif 91717b5aadSwdenk } __attribute__ ((packed)); 926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif (CONFIG_SYS_NS16550_REG_SIZE == -8) 93f5e0d039SHeiko Schocher struct NS16550 { 94f5e0d039SHeiko Schocher unsigned char rbr; /* 0 */ 95f5e0d039SHeiko Schocher unsigned char pad0[7]; 96f5e0d039SHeiko Schocher unsigned char ier; /* 1 */ 97f5e0d039SHeiko Schocher unsigned char pad1[7]; 98f5e0d039SHeiko Schocher unsigned char fcr; /* 2 */ 99f5e0d039SHeiko Schocher unsigned char pad2[7]; 100f5e0d039SHeiko Schocher unsigned char lcr; /* 3 */ 101f5e0d039SHeiko Schocher unsigned char pad3[7]; 102f5e0d039SHeiko Schocher unsigned char mcr; /* 4 */ 103f5e0d039SHeiko Schocher unsigned char pad4[7]; 104f5e0d039SHeiko Schocher unsigned char lsr; /* 5 */ 105f5e0d039SHeiko Schocher unsigned char pad5[7]; 106f5e0d039SHeiko Schocher unsigned char msr; /* 6 */ 107f5e0d039SHeiko Schocher unsigned char pad6[7]; 108f5e0d039SHeiko Schocher unsigned char scr; /* 7 */ 109f5e0d039SHeiko Schocher unsigned char pad7[7]; 110f5e0d039SHeiko Schocher } __attribute__ ((packed)); 111717b5aadSwdenk #else 112717b5aadSwdenk #error "Please define NS16550 registers size." 113717b5aadSwdenk #endif 114717b5aadSwdenk 115717b5aadSwdenk #define thr rbr 116717b5aadSwdenk #define iir fcr 117717b5aadSwdenk #define dll rbr 118717b5aadSwdenk #define dlm ier 119717b5aadSwdenk 120717b5aadSwdenk typedef volatile struct NS16550 *NS16550_t; 121717b5aadSwdenk 122*200779e3SDetlev Zundel /* 123*200779e3SDetlev Zundel * These are the definitions for the FIFO Control Register 124*200779e3SDetlev Zundel */ 125*200779e3SDetlev Zundel #define UART_FCR_FIFO_EN 0x01 /* Fifo enable */ 126*200779e3SDetlev Zundel #define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */ 127*200779e3SDetlev Zundel #define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */ 128*200779e3SDetlev Zundel #define UART_FCR_DMA_SELECT 0x08 /* For DMA applications */ 129*200779e3SDetlev Zundel #define UART_FCR_TRIGGER_MASK 0xC0 /* Mask for the FIFO trigger range */ 130*200779e3SDetlev Zundel #define UART_FCR_TRIGGER_1 0x00 /* Mask for trigger set at 1 */ 131*200779e3SDetlev Zundel #define UART_FCR_TRIGGER_4 0x40 /* Mask for trigger set at 4 */ 132*200779e3SDetlev Zundel #define UART_FCR_TRIGGER_8 0x80 /* Mask for trigger set at 8 */ 133*200779e3SDetlev Zundel #define UART_FCR_TRIGGER_14 0xC0 /* Mask for trigger set at 14 */ 134717b5aadSwdenk 135*200779e3SDetlev Zundel #define UART_FCR_RXSR 0x02 /* Receiver soft reset */ 136*200779e3SDetlev Zundel #define UART_FCR_TXSR 0x04 /* Transmitter soft reset */ 137717b5aadSwdenk 138*200779e3SDetlev Zundel /* 139*200779e3SDetlev Zundel * These are the definitions for the Modem Control Register 140*200779e3SDetlev Zundel */ 141*200779e3SDetlev Zundel #define UART_MCR_DTR 0x01 /* DTR */ 142*200779e3SDetlev Zundel #define UART_MCR_RTS 0x02 /* RTS */ 143*200779e3SDetlev Zundel #define UART_MCR_OUT1 0x04 /* Out 1 */ 144*200779e3SDetlev Zundel #define UART_MCR_OUT2 0x08 /* Out 2 */ 145*200779e3SDetlev Zundel #define UART_MCR_LOOP 0x10 /* Enable loopback test mode */ 146717b5aadSwdenk 147*200779e3SDetlev Zundel #define UART_MCR_DMA_EN 0x04 148*200779e3SDetlev Zundel #define UART_MCR_TX_DFR 0x08 149717b5aadSwdenk 150*200779e3SDetlev Zundel /* 151*200779e3SDetlev Zundel * These are the definitions for the Line Control Register 152*200779e3SDetlev Zundel * 153*200779e3SDetlev Zundel * Note: if the word length is 5 bits (UART_LCR_WLEN5), then setting 154*200779e3SDetlev Zundel * UART_LCR_STOP will select 1.5 stop bits, not 2 stop bits. 155*200779e3SDetlev Zundel */ 156*200779e3SDetlev Zundel #define UART_LCR_WLS_MSK 0x03 /* character length select mask */ 157*200779e3SDetlev Zundel #define UART_LCR_WLS_5 0x00 /* 5 bit character length */ 158*200779e3SDetlev Zundel #define UART_LCR_WLS_6 0x01 /* 6 bit character length */ 159*200779e3SDetlev Zundel #define UART_LCR_WLS_7 0x02 /* 7 bit character length */ 160*200779e3SDetlev Zundel #define UART_LCR_WLS_8 0x03 /* 8 bit character length */ 161*200779e3SDetlev Zundel #define UART_LCR_STB 0x04 /* Number of stop Bits, off = 1, on = 1.5 or 2) */ 162*200779e3SDetlev Zundel #define UART_LCR_PEN 0x08 /* Parity eneble */ 163*200779e3SDetlev Zundel #define UART_LCR_EPS 0x10 /* Even Parity Select */ 164*200779e3SDetlev Zundel #define UART_LCR_STKP 0x20 /* Stick Parity */ 165*200779e3SDetlev Zundel #define UART_LCR_SBRK 0x40 /* Set Break */ 166*200779e3SDetlev Zundel #define UART_LCR_BKSE 0x80 /* Bank select enable */ 167*200779e3SDetlev Zundel #define UART_LCR_DLAB 0x80 /* Divisor latch access bit */ 168*200779e3SDetlev Zundel 169*200779e3SDetlev Zundel /* 170*200779e3SDetlev Zundel * These are the definitions for the Line Status Register 171*200779e3SDetlev Zundel */ 172*200779e3SDetlev Zundel #define UART_LSR_DR 0x01 /* Data ready */ 173*200779e3SDetlev Zundel #define UART_LSR_OE 0x02 /* Overrun */ 174*200779e3SDetlev Zundel #define UART_LSR_PE 0x04 /* Parity error */ 175*200779e3SDetlev Zundel #define UART_LSR_FE 0x08 /* Framing error */ 176*200779e3SDetlev Zundel #define UART_LSR_BI 0x10 /* Break */ 177*200779e3SDetlev Zundel #define UART_LSR_THRE 0x20 /* Xmit holding register empty */ 178*200779e3SDetlev Zundel #define UART_LSR_TEMT 0x40 /* Xmitter empty */ 179*200779e3SDetlev Zundel #define UART_LSR_ERR 0x80 /* Error */ 180*200779e3SDetlev Zundel 181*200779e3SDetlev Zundel #define UART_MSR_DCD 0x80 /* Data Carrier Detect */ 182*200779e3SDetlev Zundel #define UART_MSR_RI 0x40 /* Ring Indicator */ 183*200779e3SDetlev Zundel #define UART_MSR_DSR 0x20 /* Data Set Ready */ 184*200779e3SDetlev Zundel #define UART_MSR_CTS 0x10 /* Clear to Send */ 185*200779e3SDetlev Zundel #define UART_MSR_DDCD 0x08 /* Delta DCD */ 186*200779e3SDetlev Zundel #define UART_MSR_TERI 0x04 /* Trailing edge ring indicator */ 187*200779e3SDetlev Zundel #define UART_MSR_DDSR 0x02 /* Delta DSR */ 188*200779e3SDetlev Zundel #define UART_MSR_DCTS 0x01 /* Delta CTS */ 189*200779e3SDetlev Zundel 190*200779e3SDetlev Zundel /* 191*200779e3SDetlev Zundel * These are the definitions for the Interrupt Identification Register 192*200779e3SDetlev Zundel */ 193*200779e3SDetlev Zundel #define UART_IIR_NO_INT 0x01 /* No interrupts pending */ 194*200779e3SDetlev Zundel #define UART_IIR_ID 0x06 /* Mask for the interrupt ID */ 195*200779e3SDetlev Zundel 196*200779e3SDetlev Zundel #define UART_IIR_MSI 0x00 /* Modem status interrupt */ 197*200779e3SDetlev Zundel #define UART_IIR_THRI 0x02 /* Transmitter holding register empty */ 198*200779e3SDetlev Zundel #define UART_IIR_RDI 0x04 /* Receiver data interrupt */ 199*200779e3SDetlev Zundel #define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */ 200*200779e3SDetlev Zundel 201*200779e3SDetlev Zundel /* 202*200779e3SDetlev Zundel * These are the definitions for the Interrupt Enable Register 203*200779e3SDetlev Zundel */ 204*200779e3SDetlev Zundel #define UART_IER_MSI 0x08 /* Enable Modem status interrupt */ 205*200779e3SDetlev Zundel #define UART_IER_RLSI 0x04 /* Enable receiver line status interrupt */ 206*200779e3SDetlev Zundel #define UART_IER_THRI 0x02 /* Enable Transmitter holding register int. */ 207*200779e3SDetlev Zundel #define UART_IER_RDI 0x01 /* Enable receiver data interrupt */ 208*200779e3SDetlev Zundel 2097b5611cdSDetlev Zundel 2102e5983d2Swdenk #ifdef CONFIG_OMAP1510 2112e5983d2Swdenk #define OSC_12M_SEL 0x01 /* selects 6.5 * current clk div */ 2122e5983d2Swdenk #endif 2132e5983d2Swdenk 214717b5aadSwdenk /* useful defaults for LCR */ 215*200779e3SDetlev Zundel #define UART_LCR_8N1 0x03 216717b5aadSwdenk 217717b5aadSwdenk void NS16550_init (NS16550_t com_port, int baud_divisor); 218717b5aadSwdenk void NS16550_putc (NS16550_t com_port, char c); 219717b5aadSwdenk char NS16550_getc (NS16550_t com_port); 220717b5aadSwdenk int NS16550_tstc (NS16550_t com_port); 221717b5aadSwdenk void NS16550_reinit (NS16550_t com_port, int baud_divisor); 222