Hello Niteesh,

sorry for the late review. It somehow slipped my attention.

Although I'm generally OK with it, my suggestion would be to move it
after the release. It's a not strictly necessary change and therefore I
don't want to potentially break stuff with it now.

I added some comments below:

On 23/03/2020 11:28, G S Niteesh Babu wrote:
> 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 ) {

You never set initialized to true. So this will never happen.

> +    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;

I would prefer declarations at the top of the function.

> +  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 ) {

Maybe in this case it would be more correct to call it something like
"early_uart_write_polled" or "init_uart_and_write_polled" or
"uart_write_polled_first". This makes it a bit more clear what the
function does and that it is only called once.

> -   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
> 
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to