[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