From a840459c379681c5017d72a9fdd4aaa7781eb7b1 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Wed, 7 Feb 2007 00:29:50 +0000 Subject: [PATCH] Fix "keyboard does not respond" bug. Thanks to Peter Krawies (breakoutbox /AT/ web /DOT/ de) svn path=/trunk/; revision=25745 --- .../boot/freeldr/freeldr/arch/i386/hardware.c | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index a7c8a894abb..15343b3c51b 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -1925,6 +1925,8 @@ DetectPS2AuxDevice(VOID) { UCHAR Scancode; UCHAR Status; + ULONG Loops; + BOOLEAN Result = TRUE; PS2ControllerWait(); WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_CONTROL, @@ -1935,31 +1937,43 @@ DetectPS2AuxDevice(VOID) WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, 0xF2); - StallExecutionProcessor(10000); + /* Wait for reply */ + for (Loops = 0; Loops < 10; 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 & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) - { - return FALSE; - } + Result = FALSE; Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); if (Scancode != 0xFA) - return FALSE; + Result = FALSE; StallExecutionProcessor(10000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) - { - return FALSE; - } + Result = FALSE; Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); if (Scancode != 0x00) - return FALSE; + Result = FALSE; - return TRUE; + /* 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; }