1*717b5aadSwdenk /* 2*717b5aadSwdenk * NS16550 Serial Port 3*717b5aadSwdenk * originally from linux source (arch/ppc/boot/ns16550.h) 4*717b5aadSwdenk * modified slightly to 5*717b5aadSwdenk * have addresses as offsets from CFG_ISA_BASE 6*717b5aadSwdenk * added a few more definitions 7*717b5aadSwdenk * added prototypes for ns16550.c 8*717b5aadSwdenk * reduced no of com ports to 2 9*717b5aadSwdenk * modifications (c) Rob Taylor, Flying Pig Systems. 2000. 10*717b5aadSwdenk */ 11*717b5aadSwdenk 12*717b5aadSwdenk #if (CFG_NS16550_REG_SIZE == 1) 13*717b5aadSwdenk struct NS16550 { 14*717b5aadSwdenk unsigned char rbr; /* 0 */ 15*717b5aadSwdenk unsigned char ier; /* 1 */ 16*717b5aadSwdenk unsigned char fcr; /* 2 */ 17*717b5aadSwdenk unsigned char lcr; /* 3 */ 18*717b5aadSwdenk unsigned char mcr; /* 4 */ 19*717b5aadSwdenk unsigned char lsr; /* 5 */ 20*717b5aadSwdenk unsigned char msr; /* 6 */ 21*717b5aadSwdenk unsigned char scr; /* 7 */ 22*717b5aadSwdenk } __attribute__ ((packed)); 23*717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 2) 24*717b5aadSwdenk struct NS16550 { 25*717b5aadSwdenk unsigned short rbr; /* 0 */ 26*717b5aadSwdenk unsigned short ier; /* 1 */ 27*717b5aadSwdenk unsigned short fcr; /* 2 */ 28*717b5aadSwdenk unsigned short lcr; /* 3 */ 29*717b5aadSwdenk unsigned short mcr; /* 4 */ 30*717b5aadSwdenk unsigned short lsr; /* 5 */ 31*717b5aadSwdenk unsigned short msr; /* 6 */ 32*717b5aadSwdenk unsigned short scr; /* 7 */ 33*717b5aadSwdenk } __attribute__ ((packed)); 34*717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == 4) 35*717b5aadSwdenk struct NS16550 { 36*717b5aadSwdenk unsigned long rbr; /* 0 */ 37*717b5aadSwdenk unsigned long ier; /* 1 */ 38*717b5aadSwdenk unsigned long fcr; /* 2 */ 39*717b5aadSwdenk unsigned long lcr; /* 3 */ 40*717b5aadSwdenk unsigned long mcr; /* 4 */ 41*717b5aadSwdenk unsigned long lsr; /* 5 */ 42*717b5aadSwdenk unsigned long msr; /* 6 */ 43*717b5aadSwdenk unsigned long scr; /* 7 */ 44*717b5aadSwdenk } __attribute__ ((packed)); 45*717b5aadSwdenk #elif (CFG_NS16550_REG_SIZE == -4) 46*717b5aadSwdenk struct NS16550 { 47*717b5aadSwdenk unsigned char rbr; /* 0 */ 48*717b5aadSwdenk int pad1:24; 49*717b5aadSwdenk unsigned char ier; /* 1 */ 50*717b5aadSwdenk int pad2:24; 51*717b5aadSwdenk unsigned char fcr; /* 2 */ 52*717b5aadSwdenk int pad3:24; 53*717b5aadSwdenk unsigned char lcr; /* 3 */ 54*717b5aadSwdenk int pad4:24; 55*717b5aadSwdenk unsigned char mcr; /* 4 */ 56*717b5aadSwdenk int pad5:24; 57*717b5aadSwdenk unsigned char lsr; /* 5 */ 58*717b5aadSwdenk int pad6:24; 59*717b5aadSwdenk unsigned char msr; /* 6 */ 60*717b5aadSwdenk int pad7:24; 61*717b5aadSwdenk unsigned char scr; /* 7 */ 62*717b5aadSwdenk int pad8:24; 63*717b5aadSwdenk } __attribute__ ((packed)); 64*717b5aadSwdenk #else 65*717b5aadSwdenk #error "Please define NS16550 registers size." 66*717b5aadSwdenk #endif 67*717b5aadSwdenk 68*717b5aadSwdenk #define thr rbr 69*717b5aadSwdenk #define iir fcr 70*717b5aadSwdenk #define dll rbr 71*717b5aadSwdenk #define dlm ier 72*717b5aadSwdenk 73*717b5aadSwdenk typedef volatile struct NS16550 *NS16550_t; 74*717b5aadSwdenk 75*717b5aadSwdenk #define FCR_FIFO_EN 0x01 /* Fifo enable */ 76*717b5aadSwdenk #define FCR_RXSR 0x02 /* Receiver soft reset */ 77*717b5aadSwdenk #define FCR_TXSR 0x04 /* Transmitter soft reset */ 78*717b5aadSwdenk 79*717b5aadSwdenk #define MCR_DTR 0x01 80*717b5aadSwdenk #define MCR_RTS 0x02 81*717b5aadSwdenk #define MCR_DMA_EN 0x04 82*717b5aadSwdenk #define MCR_TX_DFR 0x08 83*717b5aadSwdenk 84*717b5aadSwdenk #define LCR_WLS_MSK 0x03 /* character length slect mask */ 85*717b5aadSwdenk #define LCR_WLS_5 0x00 /* 5 bit character length */ 86*717b5aadSwdenk #define LCR_WLS_6 0x01 /* 6 bit character length */ 87*717b5aadSwdenk #define LCR_WLS_7 0x02 /* 7 bit character length */ 88*717b5aadSwdenk #define LCR_WLS_8 0x03 /* 8 bit character length */ 89*717b5aadSwdenk #define LCR_STB 0x04 /* Number of stop Bits, off = 1, on = 1.5 or 2) */ 90*717b5aadSwdenk #define LCR_PEN 0x08 /* Parity eneble */ 91*717b5aadSwdenk #define LCR_EPS 0x10 /* Even Parity Select */ 92*717b5aadSwdenk #define LCR_STKP 0x20 /* Stick Parity */ 93*717b5aadSwdenk #define LCR_SBRK 0x40 /* Set Break */ 94*717b5aadSwdenk #define LCR_BKSE 0x80 /* Bank select enable */ 95*717b5aadSwdenk 96*717b5aadSwdenk #define LSR_DR 0x01 /* Data ready */ 97*717b5aadSwdenk #define LSR_OE 0x02 /* Overrun */ 98*717b5aadSwdenk #define LSR_PE 0x04 /* Parity error */ 99*717b5aadSwdenk #define LSR_FE 0x08 /* Framing error */ 100*717b5aadSwdenk #define LSR_BI 0x10 /* Break */ 101*717b5aadSwdenk #define LSR_THRE 0x20 /* Xmit holding register empty */ 102*717b5aadSwdenk #define LSR_TEMT 0x40 /* Xmitter empty */ 103*717b5aadSwdenk #define LSR_ERR 0x80 /* Error */ 104*717b5aadSwdenk 105*717b5aadSwdenk /* useful defaults for LCR */ 106*717b5aadSwdenk #define LCR_8N1 0x03 107*717b5aadSwdenk 108*717b5aadSwdenk void NS16550_init (NS16550_t com_port, int baud_divisor); 109*717b5aadSwdenk void NS16550_putc (NS16550_t com_port, char c); 110*717b5aadSwdenk char NS16550_getc (NS16550_t com_port); 111*717b5aadSwdenk int NS16550_tstc (NS16550_t com_port); 112*717b5aadSwdenk void NS16550_reinit (NS16550_t com_port, int baud_divisor); 113