[PATCH] i386/pc: Initialise the printk serial port on first use

chrisj at rtems.org chrisj at rtems.org
Wed Jun 17 05:58:21 UTC 2020


From: Chris Johns <chrisj at rtems.org>

---
 bsps/i386/pc386/console/conscfg.c        |  7 ++--
 bsps/i386/pc386/console/printk_support.c | 42 +++++++++++++++++++-----
 2 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/bsps/i386/pc386/console/conscfg.c b/bsps/i386/pc386/console/conscfg.c
index a4ae88626f..8aa8ab5c2a 100644
--- a/bsps/i386/pc386/console/conscfg.c
+++ b/bsps/i386/pc386/console/conscfg.c
@@ -46,15 +46,14 @@
 
   #define CLOCK_RATE    (115200 * 16)
 
-  static uint8_t com_get_register(uint32_t addr, uint8_t i)
+  static uint8_t com_get_register(uintptr_t addr, uint8_t i)
   {
-    register uint8_t val;
-
+    uint8_t val;
     inport_byte( (addr + i), val );
     return val;
   }
 
-  static void com_set_register(uint32_t addr, uint8_t i, uint8_t val)
+  static void com_set_register(uintptr_t addr, uint8_t i, uint8_t val)
   {
     outport_byte( (addr + i), val );
   }
diff --git a/bsps/i386/pc386/console/printk_support.c b/bsps/i386/pc386/console/printk_support.c
index d7bc329868..c9e003dab0 100644
--- a/bsps/i386/pc386/console/printk_support.c
+++ b/bsps/i386/pc386/console/printk_support.c
@@ -29,6 +29,28 @@
 
 rtems_device_minor_number BSPPrintkPort = 0;
 
+static bool serialInit;
+static bool serialOK;
+
+static bool serialValid(console_tbl *port)
+{
+  if (port->pDeviceFns) {
+    if (!serialInit) {
+      serialOK = true;
+      if (port->pDeviceFns->deviceProbe != NULL) {
+        if (!port->pDeviceFns->deviceProbe( BSPPrintkPort ))
+          serialOK = false;
+        else if (port->pDeviceFns->deviceInitialize != NULL)
+          port->pDeviceFns->deviceInitialize( BSPPrintkPort );
+        else
+          serialOK = false;
+      }
+      serialInit = true;
+    }
+  }
+  return serialOK;
+}
+
 void BSP_outch(char ch);
 int BSP_inch(void);
 
@@ -42,10 +64,12 @@ void BSP_outch(char ch)
 
   if ( !isVga ) {
     console_tbl *port = Console_Port_Tbl[BSPPrintkPort];
-    if (port->pDeviceFns && port->pDeviceFns->deviceWritePolled) {
-      port->pDeviceFns->deviceWritePolled( BSPPrintkPort, ch );
+    if (serialValid(port)) {
+      if (port->pDeviceFns->deviceWritePolled) {
+        port->pDeviceFns->deviceWritePolled( BSPPrintkPort, ch );
+      }
+      return;
     }
-    return;
   }
 
   #if BSP_ENABLE_VGA
@@ -65,11 +89,13 @@ int BSP_inch(void)
 
   if ( !isVga ) {
     console_tbl *port = Console_Port_Tbl[BSPPrintkPort];
-    if (port->pDeviceFns && port->pDeviceFns->deviceRead) {
-      do {
-        result = port->pDeviceFns->deviceRead( BSPPrintkPort );
-      } while (result == -1);
-      return result;
+    if (serialValid(port)) {
+      if (port->pDeviceFns->deviceRead) {
+        do {
+          result = port->pDeviceFns->deviceRead( BSPPrintkPort );
+        } while (result == -1);
+        return result;
+      }
     }
   }
 
-- 
2.24.1



More information about the devel mailing list