Enhance Ps2Mouse and Ps2Keyboard driver and fix for random hangs in System waiting for the Key if no KBC is present.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8473 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
gikidy 2009-06-05 03:25:09 +00:00
parent 502bfcef5c
commit 007c18f5b7
3 changed files with 47 additions and 9 deletions

View File

@ -216,6 +216,21 @@ KbdControllerDriverStart (
ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify; ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify;
InitializeListHead (&ConsoleIn->NotifyList); InitializeListHead (&ConsoleIn->NotifyList);
//
// Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.
//
KeyboardRead (ConsoleIn, &Data);
if ((KeyReadStatusRegister (ConsoleIn) & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {
//
// If nobody decodes KBC I/O port, it will read back as 0xFF.
// Check the Time-Out and Parity bit to see if it has an active KBC in system
//
Status = EFI_DEVICE_ERROR;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;
goto ErrorExit;
}
// //
// Setup the WaitForKey event // Setup the WaitForKey event
// //
@ -355,7 +370,7 @@ ErrorExit:
// //
if (ConsoleIn != NULL) { if (ConsoleIn != NULL) {
Status1 = EFI_SUCCESS; Status1 = EFI_SUCCESS;
while (!EFI_ERROR (Status1)) { while (!EFI_ERROR (Status1) && (Status != EFI_DEVICE_ERROR)) {
Status1 = KeyboardRead (ConsoleIn, &Data);; Status1 = KeyboardRead (ConsoleIn, &Data);;
} }
} }

View File

@ -180,6 +180,12 @@ InstallPs2KeyboardDriver (
#define SCANCODE_SYS_REQ_MAKE 0x37 #define SCANCODE_SYS_REQ_MAKE 0x37
#define SCANCODE_MAX_MAKE 0x60 #define SCANCODE_MAX_MAKE 0x60
//
// Keyboard Controller Status
//
#define KBC_PARE 0x80 // Parity Error
#define KBC_TIM 0x40 // General Time Out
// //
// Other functions that are used among .c files // Other functions that are used among .c files
// //

View File

@ -228,6 +228,18 @@ PS2MouseDriverStart (
// Initialize keyboard controller if necessary // Initialize keyboard controller if necessary
// //
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data); IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
//
// Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.
//
if ((Data & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {
//
// If nobody decodes KBC I/O port, it will read back as 0xFF.
// Check the Time-Out and Parity bit to see if it has an active KBC in system
//
Status = EFI_DEVICE_ERROR;
StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
goto ErrorExit;
}
if ((Data & KBC_SYSF) != KBC_SYSF) { if ((Data & KBC_SYSF) != KBC_SYSF) {
Status = KbcSelfTest (IsaIo); Status = KbcSelfTest (IsaIo);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -329,7 +341,9 @@ PS2MouseDriverStart (
ErrorExit: ErrorExit:
KbcDisableAux (IsaIo); if (Status != EFI_DEVICE_ERROR) {
KbcDisableAux (IsaIo);
}
if (StatusCode != 0) { if (StatusCode != 0) {
REPORT_STATUS_CODE_WITH_DEVICE_PATH ( REPORT_STATUS_CODE_WITH_DEVICE_PATH (
@ -350,13 +364,16 @@ ErrorExit:
if ((MouseDev != NULL) && (MouseDev->ControllerNameTable != NULL)) { if ((MouseDev != NULL) && (MouseDev->ControllerNameTable != NULL)) {
FreeUnicodeStringTable (MouseDev->ControllerNameTable); FreeUnicodeStringTable (MouseDev->ControllerNameTable);
} }
//
// Since there will be no timer handler for mouse input any more, if (Status != EFI_DEVICE_ERROR) {
// exhaust input data just in case there is still mouse data left //
// // Since there will be no timer handler for mouse input any more,
EmptyStatus = EFI_SUCCESS; // exhaust input data just in case there is still mouse data left
while (!EFI_ERROR (EmptyStatus)) { //
EmptyStatus = In8042Data (IsaIo, &Data); EmptyStatus = EFI_SUCCESS;
while (!EFI_ERROR (EmptyStatus)) {
EmptyStatus = In8042Data (IsaIo, &Data);
}
} }
if (MouseDev != NULL) { if (MouseDev != NULL) {