This patch updates the console driver to new Termios API. Update #3034 --- bsps/arm/beagle/console/console-config.c | 117 +++++++++++++---------- c/src/lib/libbsp/arm/beagle/Makefile.am | 4 +- 2 files changed, 69 insertions(+), 52 deletions(-)
diff --git a/bsps/arm/beagle/console/console-config.c b/bsps/arm/beagle/console/console-config.c index 78af5f6a93..b2246571f8 100644 --- a/bsps/arm/beagle/console/console-config.c +++ b/bsps/arm/beagle/console/console-config.c @@ -21,12 +21,15 @@ * * Modified by Ben Gras <b...@shrike-systems.com> to make * interrupt-driven uart i/o work for beagleboards; beaglebone support added. + * + * Modified by Niteesh Babu G S <niteesh...@gmail.com> + * Update console to new termios API. */ -#include <libchip/serial.h> #include <libchip/ns16550.h> #include <rtems/bspIo.h> +#include <rtems/console.h> #include <bsp.h> #include <bsp/irq.h> @@ -41,6 +44,8 @@ #define TX_FIFO_E (1<<5) #define RX_FIFO_E (1<<0) +#define BEAGLE_UART0 "/dev/ttyS0" + static uint8_t beagle_uart_get_register(uintptr_t addr, uint8_t i) { uint8_t v; @@ -65,77 +70,91 @@ static void beagle_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val) reg [i] = val; } -console_tbl Console_Configuration_Ports [] = { - { - .sDeviceName = "/dev/ttyS0", - .deviceType = SERIAL_NS16550, -#if CONSOLE_POLLED /* option to facilitate running the tests */ - .pDeviceFns = &ns16550_fns_polled, -#else - .pDeviceFns = &ns16550_fns, -#endif - .ulMargin = 16, - .ulHysteresis = 8, - .pDeviceParams = (void *) CONSOLE_BAUD, - .ulCtrlPort1 = BSP_CONSOLE_UART_BASE, - .ulDataPort = BSP_CONSOLE_UART_BASE, - .ulIntVector = BSP_CONSOLE_UART_IRQ, - .getRegister = beagle_uart_get_register, - .setRegister = beagle_uart_set_register, - .ulClock = UART_CLOCK, /* 48MHz base clock */ - }, -}; - -unsigned long Console_Configuration_Count = 1; - -static int init_needed = 1; // don't rely on bss being 0 +static ns16550_context uart_context; +static void uart_write_polled( char c ); static void beagle_console_init(void) { - if(init_needed) { - const uint32_t div = UART_CLOCK / 16 / CONSOLE_BAUD; - CONSOLE_SYSC = 2; - while ((CONSOLE_SYSS & 1) == 0) - ; - if ((CONSOLE_LSR & (CONSOLE_LSR_THRE | CONSOLE_LSR_TEMT)) == CONSOLE_LSR_THRE) { - CONSOLE_LCR = 0x83; - CONSOLE_DLL = div; - CONSOLE_DLM = (div >> 8) & 0xff; - CONSOLE_LCR = 0x03; - CONSOLE_ACR = 0x00; - } + ns16550_context *ctx; + static bool initialized = false; - while ((CONSOLE_LSR & CONSOLE_LSR_TEMT) == 0) - ; + if ( initialized ) { + return ; + } - CONSOLE_LCR = 0x80 | 0x03; - CONSOLE_DLL = 0x00; - CONSOLE_DLM = 0x00; - CONSOLE_LCR = 0x03; - CONSOLE_MCR = 0x03; - CONSOLE_FCR = 0x07; + /* + * Don't rely on BSS being zeroed + */ + memset(&uart_context, 0, sizeof(uart_context)); + ctx = &uart_context; + + ctx->port = BSP_CONSOLE_UART_BASE; + ctx->irq = BSP_CONSOLE_UART_IRQ; + ctx->set_reg = beagle_uart_set_register; + ctx->get_reg = beagle_uart_get_register; + ctx->initial_baud = CONSOLE_BAUD; + ctx->clock = UART_CLOCK; + + const uint32_t div = UART_CLOCK / 16 / CONSOLE_BAUD; + CONSOLE_SYSC = 2; + while ((CONSOLE_SYSS & 1) == 0) + ; + if ((CONSOLE_LSR & (CONSOLE_LSR_THRE | CONSOLE_LSR_TEMT)) == CONSOLE_LSR_THRE) { CONSOLE_LCR = 0x83; CONSOLE_DLL = div; CONSOLE_DLM = (div >> 8) & 0xff; CONSOLE_LCR = 0x03; CONSOLE_ACR = 0x00; - init_needed = 0; } + while ((CONSOLE_LSR & CONSOLE_LSR_TEMT) == 0) + ; + CONSOLE_LCR = 0x80 | 0x03; + CONSOLE_DLL = 0x00; + CONSOLE_DLM = 0x00; + CONSOLE_LCR = 0x03; + CONSOLE_MCR = 0x03; + CONSOLE_FCR = 0x07; + CONSOLE_LCR = 0x83; + CONSOLE_DLL = div; + CONSOLE_DLM = (div >> 8) & 0xff; + CONSOLE_LCR = 0x03; + CONSOLE_ACR = 0x00; + + BSP_output_char = uart_write_polled; } #define CONSOLE_THR8 (*(volatile uint8_t *) (BSP_CONSOLE_UART_BASE + 0x00)) static void uart_write_polled( char c ) { - if(init_needed) beagle_console_init(); - while( ( CONSOLE_LSR & TX_FIFO_E ) == 0 ) ; CONSOLE_THR8 = c; } +rtems_status_code console_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_termios_initialize(); + + beagle_console_init(); + + rtems_termios_device_install( + BEAGLE_UART0, + &ns16550_handler_polled, + NULL, + &uart_context.base + ); + + return RTEMS_SUCCESSFUL; +} + static void _BSP_put_char( char c ) { - uart_write_polled( c ); + beagle_console_init(); + uart_write_polled( c ); } static int _BSP_get_char(void) diff --git a/c/src/lib/libbsp/arm/beagle/Makefile.am b/c/src/lib/libbsp/arm/beagle/Makefile.am index e37472373c..1cd9920b2f 100644 --- a/c/src/lib/libbsp/arm/beagle/Makefile.am +++ b/c/src/lib/libbsp/arm/beagle/Makefile.am @@ -62,9 +62,7 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/beagle/irq/irq.c # Console -librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console.c -librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-control.c -librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/legacy-console-select.c +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c librtemsbsp_a_SOURCES += ../../../../../../bsps/arm/beagle/console/console-config.c # I2C -- 2.17.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel