From bc73a08598d43d93cfa5607fd1807bf2b3c564ce Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Wed, 17 Jun 2020 15:57:26 +1000 Subject: i386/pc: Initialise the printk serial port on first use --- 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; + } } } -- cgit v1.2.3