Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | /* * NS16550 Serial Port * originally from linux source (arch/ppc/boot/ns16550.h) * modified slightly to * have addresses as offsets from CFG_ISA_BASE * added a few more definitions * added prototypes for ns16550.c * reduced no of com ports to 2 * modifications (c) Rob Taylor, Flying Pig Systems. 2000. * * added support for port on 64-bit bus * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems */ #if (CFG_NS16550_REG_SIZE == 1) struct NS16550 { unsigned char rbr; /* 0 */ unsigned char ier; /* 1 */ unsigned char fcr; /* 2 */ unsigned char lcr; /* 3 */ unsigned char mcr; /* 4 */ unsigned char lsr; /* 5 */ unsigned char msr; /* 6 */ unsigned char scr; /* 7 */ #if defined(CONFIG_OMAP730) unsigned char mdr1; /* 8 */ unsigned char reg9; /* 9 */ unsigned char regA; /* A */ unsigned char regB; /* B */ unsigned char regC; /* C */ unsigned char regD; /* D */ unsigned char regE; /* E */ unsigned char regF; /* F */ unsigned char reg10; /* 10 */ unsigned char ssr; /* 11*/ #endif } __attribute__ ((packed)); #elif (CFG_NS16550_REG_SIZE == 2) struct NS16550 { unsigned short rbr; /* 0 */ unsigned short ier; /* 1 */ unsigned short fcr; /* 2 */ unsigned short lcr; /* 3 */ unsigned short mcr; /* 4 */ unsigned short lsr; /* 5 */ unsigned short msr; /* 6 */ unsigned short scr; /* 7 */ } __attribute__ ((packed)); #elif (CFG_NS16550_REG_SIZE == 4) struct NS16550 { unsigned long rbr; /* 0 r */ unsigned long ier; /* 1 rw */ unsigned long fcr; /* 2 w */ unsigned long lcr; /* 3 rw */ unsigned long mcr; /* 4 rw */ unsigned long lsr; /* 5 r */ unsigned long msr; /* 6 r */ unsigned long scr; /* 7 rw */ }; /* No need to pack an already aligned struct */ #elif (CFG_NS16550_REG_SIZE == -4) struct NS16550 { unsigned char rbr; /* 0 */ int pad1:24; unsigned char ier; /* 1 */ int pad2:24; unsigned char fcr; /* 2 */ int pad3:24; unsigned char lcr; /* 3 */ int pad4:24; unsigned char mcr; /* 4 */ int pad5:24; unsigned char lsr; /* 5 */ int pad6:24; unsigned char msr; /* 6 */ int pad7:24; unsigned char scr; /* 7 */ int pad8:24; #if defined(CONFIG_OMAP) unsigned char mdr1; /* mode select reset TL16C750*/ #endif #ifdef CONFIG_OMAP1510 int pad9:24; unsigned long pad[10]; unsigned char osc_12m_sel; int pad10:24; #endif } __attribute__ ((packed)); #elif (CFG_NS16550_REG_SIZE == -8) struct NS16550 { unsigned char rbr; /* 0 */ unsigned char pad0[7]; unsigned char ier; /* 1 */ unsigned char pad1[7]; unsigned char fcr; /* 2 */ unsigned char pad2[7]; unsigned char lcr; /* 3 */ unsigned char pad3[7]; unsigned char mcr; /* 4 */ unsigned char pad4[7]; unsigned char lsr; /* 5 */ unsigned char pad5[7]; unsigned char msr; /* 6 */ unsigned char pad6[7]; unsigned char scr; /* 7 */ unsigned char pad7[7]; } __attribute__ ((packed)); #else #error "Please define NS16550 registers size." #endif #define thr rbr #define iir fcr #define dll rbr #define dlm ier typedef volatile struct NS16550 *NS16550_t; #define FCR_FIFO_EN 0x01 /* Fifo enable */ #define FCR_RXSR 0x02 /* Receiver soft reset */ #define FCR_TXSR 0x04 /* Transmitter soft reset */ #define MCR_DTR 0x01 #define MCR_RTS 0x02 #define MCR_DMA_EN 0x04 #define MCR_TX_DFR 0x08 #define LCR_WLS_MSK 0x03 /* character length select mask */ #define LCR_WLS_5 0x00 /* 5 bit character length */ #define LCR_WLS_6 0x01 /* 6 bit character length */ #define LCR_WLS_7 0x02 /* 7 bit character length */ #define LCR_WLS_8 0x03 /* 8 bit character length */ #define LCR_STB 0x04 /* Number of stop Bits, off = 1, on = 1.5 or 2) */ #define LCR_PEN 0x08 /* Parity eneble */ #define LCR_EPS 0x10 /* Even Parity Select */ #define LCR_STKP 0x20 /* Stick Parity */ #define LCR_SBRK 0x40 /* Set Break */ #define LCR_BKSE 0x80 /* Bank select enable */ #define LSR_DR 0x01 /* Data ready */ #define LSR_OE 0x02 /* Overrun */ #define LSR_PE 0x04 /* Parity error */ #define LSR_FE 0x08 /* Framing error */ #define LSR_BI 0x10 /* Break */ #define LSR_THRE 0x20 /* Xmit holding register empty */ #define LSR_TEMT 0x40 /* Xmitter empty */ #define LSR_ERR 0x80 /* Error */ #ifdef CONFIG_OMAP1510 #define OSC_12M_SEL 0x01 /* selects 6.5 * current clk div */ #endif /* useful defaults for LCR */ #define LCR_8N1 0x03 void NS16550_init (NS16550_t com_port, int baud_divisor); void NS16550_putc (NS16550_t com_port, char c); char NS16550_getc (NS16550_t com_port); int NS16550_tstc (NS16550_t com_port); void NS16550_reinit (NS16550_t com_port, int baud_divisor); |