[PATCH] i386/pc: Initialise the printk serial port on first use
Joel Sherrill
joel at rtems.org
Thu Jun 18 13:14:36 UTC 2020
I don't have access to target hardware right now but if you say it works,
please commit this everywhere needed. This was the problem Lou was
reporting around the end of last year/first of this year.
Any idea when this regression was introduced?
On Wed, Jun 17, 2020 at 8:36 PM Gedare Bloom <gedare at rtems.org> wrote:
> Looks good to me, thanks for the type fixes too.
>
> On Tue, Jun 16, 2020, 11:58 PM <chrisj at rtems.org> wrote:
>
>> 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
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel
>>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200618/823a52c1/attachment.html>
More information about the devel
mailing list