X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fns16550.h;h=51cb5b4a66d86029674feca1cdf395d493ec56ae;hb=59155f4c502ff1045a702d3fda79a17aeda63240;hp=87624bf4220f90d6f5c35f681f7ac8dded7db8bb;hpb=200779e3e2a9aeda7030b171a8c39d7797019917;p=u-boot diff --git a/include/ns16550.h b/include/ns16550.h index 87624bf422..51cb5b4a66 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,70 @@ * 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*/ + UART_REG(reg12); /* 12*/ + UART_REG(osc_12m_sel); /* 13*/ #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 */ @@ -158,7 +115,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 */ @@ -214,8 +171,8 @@ typedef volatile struct NS16550 *NS16550_t; /* 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);