X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fns16550.h;h=d1f3a906c095d8f0269f8ce376f92804e0c5943c;hb=52d00a812a29974e660f64a8839ddb550dca5290;hp=87624bf4220f90d6f5c35f681f7ac8dded7db8bb;hpb=3405f38a15eec5092ac47efe0829f10a24491c6e;p=u-boot diff --git a/include/ns16550.h b/include/ns16550.h index 87624bf422..d1f3a906c0 100644 --- a/include/ns16550.h +++ b/include/ns16550.h @@ -1,6 +1,6 @@ /* * NS16550 Serial Port - * originally from linux source (arch/ppc/boot/ns16550.h) + * originally from linux source (arch/powerpc/boot/ns16550.h) * * Cleanup and unification * (C) 2009 by Detlev Zundel, DENX Software Engineering GmbH @@ -16,113 +16,68 @@ * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems */ -#if (CONFIG_SYS_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 (CONFIG_SYS_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 (CONFIG_SYS_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 (CONFIG_SYS_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; +/* + * Note that the following macro magic uses the fact that the compiler + * will not allocate storage for arrays of size 0 + */ + +#include + +#if !defined(CONFIG_SYS_NS16550_REG_SIZE) || (CONFIG_SYS_NS16550_REG_SIZE == 0) +#error "Please define NS16550 registers size." +#elif defined(CONFIG_SYS_NS16550_MEM32) +#define UART_REG(x) u32 x +#elif (CONFIG_SYS_NS16550_REG_SIZE > 0) +#define UART_REG(x) \ + unsigned char prepad_##x[CONFIG_SYS_NS16550_REG_SIZE - 1]; \ + unsigned char x; +#elif (CONFIG_SYS_NS16550_REG_SIZE < 0) +#define UART_REG(x) \ + unsigned char x; \ + unsigned char postpad_##x[-CONFIG_SYS_NS16550_REG_SIZE - 1]; #endif -} __attribute__ ((packed)); -#elif (CONFIG_SYS_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)); + UART_REG(rbr); /* 0 */ + UART_REG(ier); /* 1 */ + UART_REG(fcr); /* 2 */ + UART_REG(lcr); /* 3 */ + UART_REG(mcr); /* 4 */ + UART_REG(lsr); /* 5 */ + UART_REG(msr); /* 6 */ + UART_REG(spr); /* 7 */ +#ifdef CONFIG_SOC_DA8XX + UART_REG(reg8); /* 8 */ + UART_REG(reg9); /* 9 */ + UART_REG(revid1); /* A */ + UART_REG(revid2); /* B */ + UART_REG(pwr_mgmt); /* C */ + UART_REG(mdr1); /* D */ #else -#error "Please define NS16550 registers size." + UART_REG(mdr1); /* 8 */ + UART_REG(reg9); /* 9 */ + UART_REG(regA); /* A */ + UART_REG(regB); /* B */ + UART_REG(regC); /* C */ + UART_REG(regD); /* D */ + UART_REG(regE); /* E */ + UART_REG(uasr); /* F */ + UART_REG(scr); /* 10*/ + UART_REG(ssr); /* 11*/ #endif +}; #define thr rbr #define iir fcr #define dll rbr #define dlm ier -typedef volatile struct NS16550 *NS16550_t; +typedef struct NS16550 *NS16550_t; /* * These are the definitions for the FIFO Control Register */ -#define UART_FCR_FIFO_EN 0x01 /* Fifo enable */ +#define UART_FCR_FIFO_EN 0x01 /* Fifo enable */ #define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */ #define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */ #define UART_FCR_DMA_SELECT 0x08 /* For DMA applications */ @@ -143,6 +98,7 @@ typedef volatile struct NS16550 *NS16550_t; #define UART_MCR_OUT1 0x04 /* Out 1 */ #define UART_MCR_OUT2 0x08 /* Out 2 */ #define UART_MCR_LOOP 0x10 /* Enable loopback test mode */ +#define UART_MCR_AFE 0x20 /* Enable auto-RTS/CTS */ #define UART_MCR_DMA_EN 0x04 #define UART_MCR_TX_DFR 0x08 @@ -158,7 +114,7 @@ typedef volatile struct NS16550 *NS16550_t; #define UART_LCR_WLS_6 0x01 /* 6 bit character length */ #define UART_LCR_WLS_7 0x02 /* 7 bit character length */ #define UART_LCR_WLS_8 0x03 /* 8 bit character length */ -#define UART_LCR_STB 0x04 /* Number of stop Bits, off = 1, on = 1.5 or 2) */ +#define UART_LCR_STB 0x04 /* # stop Bits, off=1, on=1.5 or 2) */ #define UART_LCR_PEN 0x08 /* Parity eneble */ #define UART_LCR_EPS 0x10 /* Even Parity Select */ #define UART_LCR_STKP 0x20 /* Stick Parity */ @@ -206,16 +162,11 @@ typedef volatile struct NS16550 *NS16550_t; #define UART_IER_THRI 0x02 /* Enable Transmitter holding register int. */ #define UART_IER_RDI 0x01 /* Enable receiver data interrupt */ - -#ifdef CONFIG_OMAP1510 -#define OSC_12M_SEL 0x01 /* selects 6.5 * current clk div */ -#endif - /* useful defaults for LCR */ #define UART_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); +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);