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. 10717b5aadSwdenk */ 11717b5aadSwdenk 12717b5aadSwdenk #if (CFG_NS16550_REG_SIZE == 1) 13717b5aadSwdenk struct NS16550 { 14717b5aadSwdenk unsigned char rbr; /* 0 */ 15717b5aadSwdenk unsigned char ier; /* 1 */ 16717b5aadSwdenk unsigned char fcr; /* 2 */ 17717b5aadSwdenk unsigned char lcr; /* 3 */ 18717b5aadSwdenk unsigned char mcr; /* 4 */ 19717b5aadSwdenk unsigned char lsr; /* 5 */ 20717b5aadSwdenk unsigned char msr; /* 6 */ 21717b5aadSwdenk unsigned char scr; /* 7 */ 22a56bd922Swdenk #if defined(CONFIG_OMAP730) 23a56bd922Swdenk unsigned char mdr1; /* 8 */ 24a56bd922Swdenk unsigned char reg9; /* 9 */ 25a56bd922Swdenk unsigned char regA; /* A */ 26a56bd922Swdenk unsigned char regB; /* B */ 27a56bd922Swdenk unsigned char regC; /* C */ 28a56bd922Swdenk unsigned char regD; /* D */ 29a56bd922Swdenk unsigned char regE; /* E */ 30a56bd922Swdenk unsigned char regF; /* F */ 31a56bd922Swdenk unsigned char reg10; /* 10 */ 32a56bd922Swdenk unsigned char ssr; /* 11*/ 33a56bd922Swdenk #endif 34717b5aadSwdenk } __attribute__ ((packed)); 35717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 2) 36717b5aadSwdenk struct NS16550 { 37717b5aadSwdenk unsigned short rbr; /* 0 */ 38717b5aadSwdenk unsigned short ier; /* 1 */ 39717b5aadSwdenk unsigned short fcr; /* 2 */ 40717b5aadSwdenk unsigned short lcr; /* 3 */ 41717b5aadSwdenk unsigned short mcr; /* 4 */ 42717b5aadSwdenk unsigned short lsr; /* 5 */ 43717b5aadSwdenk unsigned short msr; /* 6 */ 44717b5aadSwdenk unsigned short scr; /* 7 */ 45717b5aadSwdenk } __attribute__ ((packed)); 46717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 4) 47717b5aadSwdenk struct NS16550 { 48*22814904SWolfgang Denk unsigned long rbr; /* 0 r */ 49*22814904SWolfgang Denk unsigned long ier; /* 1 rw */ 50*22814904SWolfgang Denk unsigned long fcr; /* 2 w */ 51*22814904SWolfgang Denk unsigned long lcr; /* 3 rw */ 52*22814904SWolfgang Denk unsigned long mcr; /* 4 rw */ 53*22814904SWolfgang Denk unsigned long lsr; /* 5 r */ 54*22814904SWolfgang Denk unsigned long msr; /* 6 r */ 55*22814904SWolfgang Denk unsigned long scr; /* 7 rw */ 56*22814904SWolfgang Denk }; /* No need to pack an already aligned struct */ 57717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == -4) 58717b5aadSwdenk struct NS16550 { 59717b5aadSwdenk unsigned char rbr; /* 0 */ 60717b5aadSwdenk int pad1:24; 61717b5aadSwdenk unsigned char ier; /* 1 */ 62717b5aadSwdenk int pad2:24; 63717b5aadSwdenk unsigned char fcr; /* 2 */ 64717b5aadSwdenk int pad3:24; 65717b5aadSwdenk unsigned char lcr; /* 3 */ 66717b5aadSwdenk int pad4:24; 67717b5aadSwdenk unsigned char mcr; /* 4 */ 68717b5aadSwdenk int pad5:24; 69717b5aadSwdenk unsigned char lsr; /* 5 */ 70717b5aadSwdenk int pad6:24; 71717b5aadSwdenk unsigned char msr; /* 6 */ 72717b5aadSwdenk int pad7:24; 73717b5aadSwdenk unsigned char scr; /* 7 */ 74717b5aadSwdenk int pad8:24; 758ed96046Swdenk #if defined(CONFIG_OMAP) 762e5983d2Swdenk unsigned char mdr1; /* mode select reset TL16C750*/ 776f21347dSwdenk #endif 786f21347dSwdenk #ifdef CONFIG_OMAP1510 792e5983d2Swdenk int pad9:24; 802e5983d2Swdenk unsigned long pad[10]; 812e5983d2Swdenk unsigned char osc_12m_sel; 822e5983d2Swdenk int pad10:24; 832e5983d2Swdenk #endif 84717b5aadSwdenk } __attribute__ ((packed)); 85717b5aadSwdenk #else 86717b5aadSwdenk #error "Please define NS16550 registers size." 87717b5aadSwdenk #endif 88717b5aadSwdenk 89717b5aadSwdenk #define thr rbr 90717b5aadSwdenk #define iir fcr 91717b5aadSwdenk #define dll rbr 92717b5aadSwdenk #define dlm ier 93717b5aadSwdenk 94717b5aadSwdenk typedef volatile struct NS16550 *NS16550_t; 95717b5aadSwdenk 96717b5aadSwdenk #define FCR_FIFO_EN 0x01 /* Fifo enable */ 97717b5aadSwdenk #define FCR_RXSR 0x02 /* Receiver soft reset */ 98717b5aadSwdenk #define FCR_TXSR 0x04 /* Transmitter soft reset */ 99717b5aadSwdenk 100717b5aadSwdenk #define MCR_DTR 0x01 101717b5aadSwdenk #define MCR_RTS 0x02 102717b5aadSwdenk #define MCR_DMA_EN 0x04 103717b5aadSwdenk #define MCR_TX_DFR 0x08 104717b5aadSwdenk 105*22814904SWolfgang Denk #define LCR_WLS_MSK 0x03 /* character length select mask */ 106717b5aadSwdenk #define LCR_WLS_5 0x00 /* 5 bit character length */ 107717b5aadSwdenk #define LCR_WLS_6 0x01 /* 6 bit character length */ 108717b5aadSwdenk #define LCR_WLS_7 0x02 /* 7 bit character length */ 109717b5aadSwdenk #define LCR_WLS_8 0x03 /* 8 bit character length */ 110717b5aadSwdenk #define LCR_STB 0x04 /* Number of stop Bits, off = 1, on = 1.5 or 2) */ 111717b5aadSwdenk #define LCR_PEN 0x08 /* Parity eneble */ 112717b5aadSwdenk #define LCR_EPS 0x10 /* Even Parity Select */ 113717b5aadSwdenk #define LCR_STKP 0x20 /* Stick Parity */ 114717b5aadSwdenk #define LCR_SBRK 0x40 /* Set Break */ 115717b5aadSwdenk #define LCR_BKSE 0x80 /* Bank select enable */ 116717b5aadSwdenk 117717b5aadSwdenk #define LSR_DR 0x01 /* Data ready */ 118717b5aadSwdenk #define LSR_OE 0x02 /* Overrun */ 119717b5aadSwdenk #define LSR_PE 0x04 /* Parity error */ 120717b5aadSwdenk #define LSR_FE 0x08 /* Framing error */ 121717b5aadSwdenk #define LSR_BI 0x10 /* Break */ 122717b5aadSwdenk #define LSR_THRE 0x20 /* Xmit holding register empty */ 123717b5aadSwdenk #define LSR_TEMT 0x40 /* Xmitter empty */ 124717b5aadSwdenk #define LSR_ERR 0x80 /* Error */ 125717b5aadSwdenk 1262e5983d2Swdenk #ifdef CONFIG_OMAP1510 1272e5983d2Swdenk #define OSC_12M_SEL 0x01 /* selects 6.5 * current clk div */ 1282e5983d2Swdenk #endif 1292e5983d2Swdenk 130717b5aadSwdenk /* useful defaults for LCR */ 131717b5aadSwdenk #define LCR_8N1 0x03 132717b5aadSwdenk 133717b5aadSwdenk void NS16550_init (NS16550_t com_port, int baud_divisor); 134717b5aadSwdenk void NS16550_putc (NS16550_t com_port, char c); 135717b5aadSwdenk char NS16550_getc (NS16550_t com_port); 136717b5aadSwdenk int NS16550_tstc (NS16550_t com_port); 137717b5aadSwdenk void NS16550_reinit (NS16550_t com_port, int baud_divisor); 138