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