summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2020-06-17 15:57:26 +1000
committerChris Johns <chrisj@rtems.org>2020-06-18 12:03:28 +1000
commitbc73a08598d43d93cfa5607fd1807bf2b3c564ce (patch)
tree440414177c199f6d295671b354bf2cf978aabc85
parentbsps/i386/pc386/start/*.S: Remove space before tab (diff)
downloadrtems-bc73a08598d43d93cfa5607fd1807bf2b3c564ce.tar.bz2
i386/pc: Initialise the printk serial port on first use
-rw-r--r--bsps/i386/pc386/console/conscfg.c7
-rw-r--r--bsps/i386/pc386/console/printk_support.c42
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;
+ }
}
}