[PATCH v3] bsp/beagle: Update console to new Termios API.

G S Niteesh Babu niteesh.gs at gmail.com
Mon Mar 23 10:28:09 UTC 2020


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 <beng at shrike-systems.com> to make
  * interrupt-driven uart i/o work for beagleboards; beaglebone support added.
+ *
+ * Modified by Niteesh Babu G S <niteesh.gs at 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



More information about the devel mailing list