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 */ 22717b5aadSwdenk } __attribute__ ((packed)); 23717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 2) 24717b5aadSwdenk struct NS16550 { 25717b5aadSwdenk unsigned short rbr; /* 0 */ 26717b5aadSwdenk unsigned short ier; /* 1 */ 27717b5aadSwdenk unsigned short fcr; /* 2 */ 28717b5aadSwdenk unsigned short lcr; /* 3 */ 29717b5aadSwdenk unsigned short mcr; /* 4 */ 30717b5aadSwdenk unsigned short lsr; /* 5 */ 31717b5aadSwdenk unsigned short msr; /* 6 */ 32717b5aadSwdenk unsigned short scr; /* 7 */ 33717b5aadSwdenk } __attribute__ ((packed)); 34717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 4) 35717b5aadSwdenk struct NS16550 { 36717b5aadSwdenk unsigned long rbr; /* 0 */ 37717b5aadSwdenk unsigned long ier; /* 1 */ 38717b5aadSwdenk unsigned long fcr; /* 2 */ 39717b5aadSwdenk unsigned long lcr; /* 3 */ 40717b5aadSwdenk unsigned long mcr; /* 4 */ 41717b5aadSwdenk unsigned long lsr; /* 5 */ 42717b5aadSwdenk unsigned long msr; /* 6 */ 43717b5aadSwdenk unsigned long scr; /* 7 */ 44717b5aadSwdenk } __attribute__ ((packed)); 45717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == -4) 46717b5aadSwdenk struct NS16550 { 47717b5aadSwdenk unsigned char rbr; /* 0 */ 48717b5aadSwdenk int pad1:24; 49717b5aadSwdenk unsigned char ier; /* 1 */ 50717b5aadSwdenk int pad2:24; 51717b5aadSwdenk unsigned char fcr; /* 2 */ 52717b5aadSwdenk int pad3:24; 53717b5aadSwdenk unsigned char lcr; /* 3 */ 54717b5aadSwdenk int pad4:24; 55717b5aadSwdenk unsigned char mcr; /* 4 */ 56717b5aadSwdenk int pad5:24; 57717b5aadSwdenk unsigned char lsr; /* 5 */ 58717b5aadSwdenk int pad6:24; 59717b5aadSwdenk unsigned char msr; /* 6 */ 60717b5aadSwdenk int pad7:24; 61717b5aadSwdenk unsigned char scr; /* 7 */ 62717b5aadSwdenk int pad8:24; 63*6f21347dSwdenk #if defined(CONFIG_OMAP1510) || defined(CONFIG_OMAP1610) 642e5983d2Swdenk unsigned char mdr1; /* mode select reset TL16C750*/ 65*6f21347dSwdenk #endif 66*6f21347dSwdenk #ifdef CONFIG_OMAP1510 672e5983d2Swdenk int pad9:24; 682e5983d2Swdenk unsigned long pad[10]; 692e5983d2Swdenk unsigned char osc_12m_sel; 702e5983d2Swdenk int pad10:24; 712e5983d2Swdenk #endif 72717b5aadSwdenk } __attribute__ ((packed)); 73717b5aadSwdenk #else 74717b5aadSwdenk #error "Please define NS16550 registers size." 75717b5aadSwdenk #endif 76717b5aadSwdenk 77717b5aadSwdenk #define thr rbr 78717b5aadSwdenk #define iir fcr 79717b5aadSwdenk #define dll rbr 80717b5aadSwdenk #define dlm ier 81717b5aadSwdenk 82717b5aadSwdenk typedef volatile struct NS16550 *NS16550_t; 83717b5aadSwdenk 84717b5aadSwdenk #define FCR_FIFO_EN 0x01 /* Fifo enable */ 85717b5aadSwdenk #define FCR_RXSR 0x02 /* Receiver soft reset */ 86717b5aadSwdenk #define FCR_TXSR 0x04 /* Transmitter soft reset */ 87717b5aadSwdenk 88717b5aadSwdenk #define MCR_DTR 0x01 89717b5aadSwdenk #define MCR_RTS 0x02 90717b5aadSwdenk #define MCR_DMA_EN 0x04 91717b5aadSwdenk #define MCR_TX_DFR 0x08 92717b5aadSwdenk 93717b5aadSwdenk #define LCR_WLS_MSK 0x03 /* character length slect mask */ 94717b5aadSwdenk #define LCR_WLS_5 0x00 /* 5 bit character length */ 95717b5aadSwdenk #define LCR_WLS_6 0x01 /* 6 bit character length */ 96717b5aadSwdenk #define LCR_WLS_7 0x02 /* 7 bit character length */ 97717b5aadSwdenk #define LCR_WLS_8 0x03 /* 8 bit character length */ 98717b5aadSwdenk #define LCR_STB 0x04 /* Number of stop Bits, off = 1, on = 1.5 or 2) */ 99717b5aadSwdenk #define LCR_PEN 0x08 /* Parity eneble */ 100717b5aadSwdenk #define LCR_EPS 0x10 /* Even Parity Select */ 101717b5aadSwdenk #define LCR_STKP 0x20 /* Stick Parity */ 102717b5aadSwdenk #define LCR_SBRK 0x40 /* Set Break */ 103717b5aadSwdenk #define LCR_BKSE 0x80 /* Bank select enable */ 104717b5aadSwdenk 105717b5aadSwdenk #define LSR_DR 0x01 /* Data ready */ 106717b5aadSwdenk #define LSR_OE 0x02 /* Overrun */ 107717b5aadSwdenk #define LSR_PE 0x04 /* Parity error */ 108717b5aadSwdenk #define LSR_FE 0x08 /* Framing error */ 109717b5aadSwdenk #define LSR_BI 0x10 /* Break */ 110717b5aadSwdenk #define LSR_THRE 0x20 /* Xmit holding register empty */ 111717b5aadSwdenk #define LSR_TEMT 0x40 /* Xmitter empty */ 112717b5aadSwdenk #define LSR_ERR 0x80 /* Error */ 113717b5aadSwdenk 1142e5983d2Swdenk #ifdef CONFIG_OMAP1510 1152e5983d2Swdenk #define OSC_12M_SEL 0x01 /* selects 6.5 * current clk div */ 1162e5983d2Swdenk #endif 1172e5983d2Swdenk 118717b5aadSwdenk /* useful defaults for LCR */ 119717b5aadSwdenk #define LCR_8N1 0x03 120717b5aadSwdenk 121717b5aadSwdenk void NS16550_init (NS16550_t com_port, int baud_divisor); 122717b5aadSwdenk void NS16550_putc (NS16550_t com_port, char c); 123717b5aadSwdenk char NS16550_getc (NS16550_t com_port); 124717b5aadSwdenk int NS16550_tstc (NS16550_t com_port); 125717b5aadSwdenk void NS16550_reinit (NS16550_t com_port, int baud_divisor); 126