From 9645a00e53fa5b60b046890df7bda188dd342ffb Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Thu, 15 Feb 2007 10:57:38 +0000 Subject: [PATCH] - fix "keyboard does not respond" bug on Biostar board (thanks to Peter Krawies) - fix printf() svn path=/trunk/; revision=25803 --- .../boot/freeldr/freeldr/arch/i386/hardware.c | 66 +++++++++---------- reactos/boot/freeldr/freeldr/ui/tui.c | 4 +- 2 files changed, 32 insertions(+), 38 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index 15343b3c51b..7aa4c9a4b57 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -1621,58 +1621,69 @@ DetectKeyboardDevice(VOID) { UCHAR Status; UCHAR Scancode; + ULONG Loops; + BOOLEAN Result = TRUE; + /* Identify device */ WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, 0xF2); - StallExecutionProcessor(10000); + /* Wait for reply */ + for (Loops = 0; Loops < 100; Loops++) + { + StallExecutionProcessor(10000); + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); + if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0) + break; + } - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & 0x01) != 0x01) + if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) { /* PC/XT keyboard or no keyboard */ - return FALSE; + Result = FALSE; } Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); if (Scancode != 0xFA) { /* No ACK received */ - return FALSE; + Result = FALSE; } StallExecutionProcessor(10000); + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & 0x01) != 0x01) + if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) { /* Found AT keyboard */ - return TRUE; + return Result; } Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); if (Scancode != 0xAB) { /* No 0xAB received */ - return FALSE; + Result = FALSE; } StallExecutionProcessor(10000); + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & 0x01) != 0x01) + if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) { /* No byte in buffer */ - return FALSE; + Result = FALSE; } Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); if (Scancode != 0x41) { /* No 0x41 received */ - return FALSE; + Result = FALSE; } /* Found MF-II keyboard */ - return TRUE; + return Result; } @@ -1880,7 +1891,6 @@ static BOOLEAN DetectPS2AuxPort(VOID) { ULONG Loops; - UCHAR Scancode; UCHAR Status; /* Put the value 0x5A in the output buffer using the @@ -1901,22 +1911,15 @@ DetectPS2AuxPort(VOID) for (Loops = 0; Loops < 10; Loops++) { - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0) - { - Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); - if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) != 0) - { - return TRUE; - } - break; - } - StallExecutionProcessor(10000); + Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); + if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0) + break; } - return FALSE; + READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); + + return (Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL); } @@ -1938,7 +1941,7 @@ DetectPS2AuxDevice(VOID) 0xF2); /* Wait for reply */ - for (Loops = 0; Loops < 10; Loops++) + for (Loops = 0; Loops < 100; Loops++) { StallExecutionProcessor(10000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); @@ -1964,15 +1967,6 @@ DetectPS2AuxDevice(VOID) if (Scancode != 0x00) Result = FALSE; - /* Flush output buffer */ - for (Loops = 0; Loops < 10; Loops++) - { - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) - break; - StallExecutionProcessor(10000); - } - return Result; } diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c index 8b80f3eab05..0f635aa5434 100644 --- a/reactos/boot/freeldr/freeldr/ui/tui.c +++ b/reactos/boot/freeldr/freeldr/ui/tui.c @@ -45,9 +45,9 @@ int printf(const char *format, ... ) { case 'd': case 'u': case 'x': if (c == 'x') - *_itoa(va_arg(ap, unsigned long), str, 16) = 0; + _itoa(va_arg(ap, unsigned long), str, 16); else - *_itoa(va_arg(ap, unsigned long), str, 10) = 0; + _itoa(va_arg(ap, unsigned long), str, 10); ptr = str;