--- c/src/lib/libbsp/arm/rtl22xx/console/uart.c | 372 +++++++++++------------- c/src/lib/libbsp/arm/rtl22xx/include/bsp.h | 5 + c/src/lib/libbsp/arm/rtl22xx/startup/bspstart.c | 7 - 3 files changed, 167 insertions(+), 217 deletions(-)
diff --git a/c/src/lib/libbsp/arm/rtl22xx/console/uart.c b/c/src/lib/libbsp/arm/rtl22xx/console/uart.c index fed3e37..91f7f32 100644 --- a/c/src/lib/libbsp/arm/rtl22xx/console/uart.c +++ b/c/src/lib/libbsp/arm/rtl22xx/console/uart.c @@ -1,20 +1,19 @@ /* * console driver for RTL22xx UARTs * - * This driver uses the shared console driver in - * ...../libbsp/shared/console.c - * * If you want the driver to be interrupt driven, you * need to write the ISR, and in the ISR insert the * chars into termios's queue. + */ + +/* * Copyright (c) By ray <rayx...@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. - * - * -*/ + */ + #include <bsp.h> /* Must be before libio.h */ #include <rtems/libio.h> #include <termios.h> @@ -30,8 +29,6 @@ /* How many serial ports? */ #define NUM_DEVS 1 -int uart_poll_read(int minor); - int dbg_dly; /* static function prototypes */ @@ -47,17 +44,16 @@ static int uart_set_attributes(int minor, const struct termios *t); unsigned long Console_Configuration_Count = NUM_DEVS; /* Pointers to functions for handling the UART. */ -const console_fns uart_fns = -{ - libchip_serial_default_probe, - uart_first_open, - uart_last_close, - uart_read, - uart_write, - uart_init, - uart_write_polled, /* not used in this driver */ - uart_set_attributes, - FALSE /* TRUE if interrupt driven, FALSE if not. */ +const console_fns uart_fns = { + libchip_serial_default_probe, + uart_first_open, + uart_last_close, + uart_read, + uart_write, + uart_init, + uart_write_polled, /* not used in this driver */ + uart_set_attributes, + FALSE /* TRUE if interrupt driven, FALSE if not. */ }; /* @@ -65,55 +61,50 @@ const console_fns uart_fns = * * Some of these fields are marked "NOT USED". They are not used * by console.c, but may be used by drivers in libchip - * */ console_tbl Console_Configuration_Ports[] = { - { - "/dev/com0", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &uart_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - 0, /* ulCtrlPort1 - NOT USED */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - } - #if 0 - { - "/dev/com1", /* sDeviceName */ - SERIAL_CUSTOM, /* deviceType */ - &uart_fns, /* pDeviceFns */ - NULL, /* deviceProbe */ - NULL, /* pDeviceFlow */ - 0, /* ulMargin - NOT USED */ - 0, /* ulHysteresis - NOT USED */ - NULL, /* pDeviceParams */ - 0, /* ulCtrlPort1 - NOT USED */ - 0, /* ulCtrlPort2 - NOT USED */ - 0, /* ulDataPort - NOT USED */ - NULL, /* getRegister - NOT USED */ - NULL, /* setRegister - NOT USED */ - NULL, /* getData - NOT USED */ - NULL, /* setData - NOT USED */ - 0, /* ulClock - NOT USED */ - 0 /* ulIntVector - NOT USED */ - } - #endif +{ + "/dev/com0", /* sDeviceName */ + SERIAL_CUSTOM, /* deviceType */ + &uart_fns, /* pDeviceFns */ + NULL, /* deviceProbe */ + NULL, /* pDeviceFlow */ + 0, /* ulMargin - NOT USED */ + 0, /* ulHysteresis - NOT USED */ + NULL, /* pDeviceParams */ + 0, /* ulCtrlPort1 - NOT USED */ + 0, /* ulCtrlPort2 - NOT USED */ + 0, /* ulDataPort - NOT USED */ + NULL, /* getRegister - NOT USED */ + NULL, /* setRegister - NOT USED */ + NULL, /* getData - NOT USED */ + NULL, /* setData - NOT USED */ + 0, /* ulClock - NOT USED */ + 0 /* ulIntVector - NOT USED */ +} +#if 0 +{ + "/dev/com1", /* sDeviceName */ + SERIAL_CUSTOM, /* deviceType */ + &uart_fns, /* pDeviceFns */ + NULL, /* deviceProbe */ + NULL, /* pDeviceFlow */ + 0, /* ulMargin - NOT USED */ + 0, /* ulHysteresis - NOT USED */ + NULL, /* pDeviceParams */ + 0, /* ulCtrlPort1 - NOT USED */ + 0, /* ulCtrlPort2 - NOT USED */ + 0, /* ulDataPort - NOT USED */ + NULL, /* getRegister - NOT USED */ + NULL, /* setRegister - NOT USED */ + NULL, /* getData - NOT USED */ + NULL, /* setData - NOT USED */ + 0, /* ulClock - NOT USED */ + 0 /* ulIntVector - NOT USED */ +} +#endif }; -/*********************************************************************/ -/* Functions called via termios callbacks (i.e. the ones in uart_fns */ -/*********************************************************************/ - /* * This is called the first time each device is opened. If the driver * is interrupt driven, you should enable interrupts here. Otherwise, @@ -123,10 +114,9 @@ console_tbl Console_Configuration_Ports[] = { */ static int uart_first_open(int major, int minor, void *arg) { - return 0; + return 0; } - /* * This is called the last time each device is closed. If the driver * is interrupt driven, you should disable interrupts here. Otherwise, @@ -134,10 +124,9 @@ static int uart_first_open(int major, int minor, void *arg) */ static int uart_last_close(int major, int minor, void *arg) { - return 0; + return 0; } - /* * Read one character from UART. * @@ -146,30 +135,28 @@ static int uart_last_close(int major, int minor, void *arg) */ static int uart_read(int minor) { - char c; - - if (minor == 0) { - if(U0LSR & ULSR_RDR) { - c = U0RBR; - return c; - } else { - return -1; - } - } else if (minor == 1) { - if (U1LSR & ULSR_RDR) { - c = U1RBR; - return c; - } else { - return -1; - } - } else { - printk("Unknown console minor number %d\n", minor); - return -1; - } - + char c; + + switch (minor) { + case 0: + if (U0LSR & ULSR_RDR) { + c = U0RBR; + return c; + } + return -1; + case 1: + if (U1LSR & ULSR_RDR) { + c = U1RBR; + return c; + } + return -1; + default: + break; + } + printk("Unknown console minor number %d\n", minor); + return -1; } - /* * Write buffer to UART * @@ -177,158 +164,123 @@ static int uart_read(int minor) */ static ssize_t uart_write(int minor, const char *buf, size_t len) { - size_t i; - - if (minor == 0) { - for (i = 0; i < len; i++) { - while(!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/ - continue; /* also either WDOG() or swap()*/ - U0THR = (char) buf[i]; - } - } else if (minor == 1) { - for (i = 0; i < len; i++) { - while(!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/ - continue; /* also either WDOG() or swap()*/ - U0THR = (char) buf[i]; - } - } else { - printk("Unknown console minor number %d\n", minor); - return -1; - } - - return 1; + size_t i; + + switch (minor) { + case 0: + for (i = 0; i < len; i++) { + while (!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/ + continue; /* also either WDOG() or swap()*/ + U0THR = (char) buf[i]; + } + break; + case 1: + for (i = 0; i < len; i++) { + while (!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/ + continue; /* also either WDOG() or swap()*/ + U0THR = (char) buf[i]; + } + break; + default: + printk("Unknown console minor number %d\n", minor); + return -1; + } + + return len; } - /* Set up the UART. */ static void uart_init(int minor) { #if 0 //init will be done in bspstart.c - int baud=6; - int mode =0x03; - if(minor==0){ - // set port pins for UART0 - PINSEL0 = (PINSEL0 & ~U0_PINMASK) | U0_PINSEL; - - U0IER = 0x00; // disable all interrupts - - // set the baudrate - U0LCR = 1<<7; // select divisor latches - U0DLL = (uint8_t)baud; // set for baud low byte - U0DLM = (uint8_t)(baud >> 8); // set for baud high byte - - // set the number of characters and other - // user specified operating parameters - U0LCR = (mode & ~ULCR_DLAB_ENABLE); - U0FCR = mode>>8; /*fifo mode*/ - - // set port pins for UART1 - PINSEL0 = (PINSEL0 & ~U1_PINMASK) | U1_PINSEL; - - U1IER = 0x00; // disable all interrupts - }else if(minor==1){ - // set the baudrate - U1LCR = ULCR_DLAB_ENABLE; // select divisor latches - U1DLL = (uint8_t)baud; // set for baud low byte - U1DLM = (uint8_t)(baud >> 8); // set for baud high byte - - // set the number of characters and other - // user specified operating parameters - U1LCR = (mode & ~ULCR_DLAB_ENABLE); - U1FCR = mode>>8;/*fifo mode*/ - } + int baud=6; + int mode =0x03; + if(minor==0){ + // set port pins for UART0 + PINSEL0 = (PINSEL0 & ~U0_PINMASK) | U0_PINSEL; + + U0IER = 0x00; // disable all interrupts + + // set the baudrate + U0LCR = 1<<7; // select divisor latches + U0DLL = (uint8_t)baud; // set for baud low byte + U0DLM = (uint8_t)(baud >> 8); // set for baud high byte + + // set the number of characters and other + // user specified operating parameters + U0LCR = (mode & ~ULCR_DLAB_ENABLE); + U0FCR = mode>>8; /*fifo mode*/ + + // set port pins for UART1 + PINSEL0 = (PINSEL0 & ~U1_PINMASK) | U1_PINSEL; + + U1IER = 0x00; // disable all interrupts + }else if(minor==1){ + // set the baudrate + U1LCR = ULCR_DLAB_ENABLE; // select divisor latches + U1DLL = (uint8_t)baud; // set for baud low byte + U1DLM = (uint8_t)(baud >> 8); // set for baud high byte + + // set the number of characters and other + // user specified operating parameters + U1LCR = (mode & ~ULCR_DLAB_ENABLE); + U1FCR = mode>>8;/*fifo mode*/ + } #endif } /* I'm not sure this is needed for the shared console driver. */ -static void uart_write_polled(int minor, char c) +static void uart_write_polled(int minor, char c) { - uart_write(minor, &c, 1); + uart_write(minor, &c, 1); } /* This is for setting baud rate, bits, etc. */ -static int uart_set_attributes(int minor, const struct termios *t) -{ - return 0; -} - -/***********************************************************************/ -/* - * The following functions are not used by TERMIOS, but other RTEMS - * functions use them instead. - */ -/***********************************************************************/ -/* - * Read from UART. This is used in the exit code, and can't - * rely on interrupts. -*/ -int uart_poll_read(int minor) +static int uart_set_attributes(int minor, const struct termios *t) { - return uart_read(minor); + return 0; } - /* * Write a character to the console. This is used by printk() and * maybe other low level functions. It should not use interrupts or any * RTEMS system calls. It needs to be very simple */ -static void _BSP_put_char( char c ) { - uart_write_polled(0, c); - if (c == '\n') { - uart_write_polled(0, '\r'); - } +static void _BSP_put_char( char c ) +{ + uart_write_polled(0, c); + if (c == '\n') { + uart_write_polled(0, '\r'); + } } BSP_output_char_function_type BSP_output_char = _BSP_put_char; static int _BSP_get_char(void) { - return uart_poll_read(0); + return uart_read(0); } BSP_polling_getchar_function_type BSP_poll_char = _BSP_get_char; - -/**************************************************************************** -* init USART 0??8 bit, 1 Stop,No checkout, BPS115200 -****************************************************************************/ -void UART0_Ini(void) -{ - long Fdiv; - int i; - PINSEL0 = 0x00000005; // I/O to UART0 - U0LCR = 0x83; // DLAB = 1 - Fdiv = (Fpclk >>4) / UART_BPS; // configure BPS - U0DLM = Fdiv/256; - U0DLL = Fdiv%256; - U0LCR = 0x03; - - for(i=0;i<10;i++){ - U0THR = 67; //send a C to see if is OK - while( (U0LSR&0x40)==0 ); - } -} - - -/**************************************************************************** -*Send a Byte -****************************************************************************/ -void UART0_SendByte(char data) +/* + * init USART 0??8 bit, 1 Stop,No checkout, BPS115200 + */ +void UART0_Ini(void) { - U0THR = data; - - while( (U0LSR&0x40)==0 ); -} - - -/**************************************************************************** -*Send a string -****************************************************************************/ -void UART0_SendStr(char const *str) -{ while(1) - { if( *str == '\0' ) break; - UART0_SendByte(*str++); // Send the char - } + long Fdiv; + int i; + + PINSEL0 = 0x00000005; // I/O to UART0 + U0LCR = 0x83; // DLAB = 1 + Fdiv = (Fpclk >>4) / UART_BPS; // configure BPS + U0DLM = Fdiv/256; + U0DLL = Fdiv%256; + U0LCR = 0x03; + + for(i=0;i<10;i++){ + U0THR = 67; //send a C to see if is OK + while ( (U0LSR&0x40)==0 ); + } } diff --git a/c/src/lib/libbsp/arm/rtl22xx/include/bsp.h b/c/src/lib/libbsp/arm/rtl22xx/include/bsp.h index bc52e22..f6f8a15 100644 --- a/c/src/lib/libbsp/arm/rtl22xx/include/bsp.h +++ b/c/src/lib/libbsp/arm/rtl22xx/include/bsp.h @@ -215,6 +215,11 @@ int cs8900_driver_attach (struct rtems_bsdnet_ifconfig *config, /** @} */ +/* + * Prototypes for methods used across file boundaries in the BSP. + */ +extern void UART0_Ini(void); + /** @} */ #ifdef __cplusplus diff --git a/c/src/lib/libbsp/arm/rtl22xx/startup/bspstart.c b/c/src/lib/libbsp/arm/rtl22xx/startup/bspstart.c index 8c4d614..cb764c4 100644 --- a/c/src/lib/libbsp/arm/rtl22xx/startup/bspstart.c +++ b/c/src/lib/libbsp/arm/rtl22xx/startup/bspstart.c @@ -13,12 +13,6 @@ #include <lpc22xx.h> /* - * Function prototypes - */ -extern void UART0_Ini(void); -extern void printi(unsigned long); - -/* * bsp_start_default - BSP initialization function * * This function is called before RTEMS is initialized and used @@ -28,7 +22,6 @@ extern void printi(unsigned long); * * RESTRICTIONS/LIMITATIONS: * Since RTEMS is not configured, no RTEMS functions can be called. - * */ void bsp_start_default( void ) { -- 1.9.3
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel