From e812318638dbee1bf9a1eea65d46a07c502127ab Mon Sep 17 00:00:00 2001 From: vanjeff Date: Mon, 16 May 2011 02:00:34 +0000 Subject: [PATCH] Update PS/2 keyboard driver to return scan code for Pause key. Signed-off-by: vanjeff Reviewed-by: niruiyu git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11657 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c | 226 +++++++++--------- .../Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.h | 2 + 2 files changed, 121 insertions(+), 107 deletions(-) diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c b/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c index fa0f53b742..93fdf6d94f 100644 --- a/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c @@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "Ps2Keyboard.h" struct { - UINT8 ScanCode; ///< follows value defined in Scan Code Set1 + UINT16 ScanCode; ///< follows value defined in Scan Code Set1 UINT16 EfiScanCode; CHAR16 UnicodeChar; CHAR16 ShiftUnicodeChar; @@ -549,7 +549,13 @@ ConvertKeyboardScanCodeToEfiKey[] = { SCAN_NULL, 0x0000, 0x0000 - }, + }, + { + 0x1D45, //Pause key + SCAN_PAUSE, + 0x0000, + 0x0000 + }, { TABLE_END, TABLE_END, @@ -1152,8 +1158,9 @@ KeyGetchar ( ) { EFI_STATUS Status; - UINT8 ScanCode; + UINT16 ScanCode; BOOLEAN Extended; + BOOLEAN Extended1; UINTN Index; EFI_KEY_DATA KeyData; LIST_ENTRY *Link; @@ -1163,20 +1170,18 @@ KeyGetchar ( // UINT8 ScancodeArr[4]; UINT32 ScancodeArrPos; - // - // point to the current position in ScancodeArr - // - - Extended = FALSE; - ScancodeArrPos = 0; // // Check if there are enough bytes of scancode representing a single key // available in the buffer // while (TRUE) { - + Extended = FALSE; + Extended1 = FALSE; Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 1, ScancodeArr); + // + // point to the current position in ScancodeArr + // ScancodeArrPos = 0; if (EFI_ERROR (Status)) { return ; @@ -1195,7 +1200,7 @@ KeyGetchar ( // if present, ignore them // if (ScancodeArr[ScancodeArrPos] == SCANCODE_EXTENDED1) { - + Extended1 = TRUE; Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 2, ScancodeArr); ScancodeArrPos = 1; @@ -1209,9 +1214,6 @@ KeyGetchar ( if (EFI_ERROR (Status)) { return ; } - - PopScancodeBufHead (&ConsoleIn->ScancodeQueue, 3, ScancodeArr); - return ; } // // if we reach this position, scancodes for a key is in buffer now,pop them @@ -1220,104 +1222,114 @@ KeyGetchar ( if (EFI_ERROR (Status)) { return ; } - // - // store the last available byte, this byte of scancode will be checked - // - ScanCode = ScancodeArr[ScancodeArrPos]; - // - // Check for special keys and update the driver state. - // - switch (ScanCode) { - - case SCANCODE_CTRL_MAKE: - ConsoleIn->Ctrl = TRUE; - break; - - case SCANCODE_CTRL_BREAK: - ConsoleIn->Ctrl = FALSE; - break; - - case SCANCODE_ALT_MAKE: - ConsoleIn->Alt = TRUE; - break; - - case SCANCODE_ALT_BREAK: - ConsoleIn->Alt = FALSE; - break; - - case SCANCODE_LEFT_SHIFT_MAKE: - if (!Extended) { - ConsoleIn->Shift = TRUE; - ConsoleIn->LeftShift = TRUE; - } - break; - case SCANCODE_RIGHT_SHIFT_MAKE: - if (!Extended) { - ConsoleIn->Shift = TRUE; - ConsoleIn->RightShift = TRUE; + if (!Extended1) { + // + // store the last available byte, this byte of scancode will be checked + // + ScanCode = ScancodeArr[ScancodeArrPos]; + + // + // Check for special keys and update the driver state. + // + switch (ScanCode) { + + case SCANCODE_CTRL_MAKE: + ConsoleIn->Ctrl = TRUE; + break; + + case SCANCODE_CTRL_BREAK: + ConsoleIn->Ctrl = FALSE; + break; + + case SCANCODE_ALT_MAKE: + ConsoleIn->Alt = TRUE; + break; + + case SCANCODE_ALT_BREAK: + ConsoleIn->Alt = FALSE; + break; + + case SCANCODE_LEFT_SHIFT_MAKE: + if (!Extended) { + ConsoleIn->Shift = TRUE; + ConsoleIn->LeftShift = TRUE; + } + break; + case SCANCODE_RIGHT_SHIFT_MAKE: + if (!Extended) { + ConsoleIn->Shift = TRUE; + ConsoleIn->RightShift = TRUE; + } + break; + + case SCANCODE_LEFT_SHIFT_BREAK: + if (!Extended) { + ConsoleIn->Shift = FALSE; + ConsoleIn->LeftShift = FALSE; + } else { + ConsoleIn->SysReq = FALSE; + } + break; + case SCANCODE_RIGHT_SHIFT_BREAK: + if (!Extended) { + ConsoleIn->Shift = FALSE; + ConsoleIn->RightShift = FALSE; + } + break; + + case SCANCODE_LEFT_LOGO_MAKE: + ConsoleIn->LeftLogo = TRUE; + break; + case SCANCODE_LEFT_LOGO_BREAK: + ConsoleIn->LeftLogo = FALSE; + break; + case SCANCODE_RIGHT_LOGO_MAKE: + ConsoleIn->RightLogo = TRUE; + break; + case SCANCODE_RIGHT_LOGO_BREAK: + ConsoleIn->RightLogo = FALSE; + break; + case SCANCODE_MENU_MAKE: + ConsoleIn->Menu = TRUE; + break; + case SCANCODE_MENU_BREAK: + ConsoleIn->Menu = FALSE; + break; + case SCANCODE_SYS_REQ_MAKE: + if (Extended) { + ConsoleIn->SysReq = TRUE; + } + break; + case SCANCODE_CAPS_LOCK_MAKE: + ConsoleIn->CapsLock = (BOOLEAN)!ConsoleIn->CapsLock; + UpdateStatusLights (ConsoleIn); + break; + case SCANCODE_NUM_LOCK_MAKE: + ConsoleIn->NumLock = (BOOLEAN)!ConsoleIn->NumLock; + UpdateStatusLights (ConsoleIn); + break; + case SCANCODE_SCROLL_LOCK_MAKE: + ConsoleIn->ScrollLock = (BOOLEAN)!ConsoleIn->ScrollLock; + UpdateStatusLights (ConsoleIn); + break; } - break; - - case SCANCODE_LEFT_SHIFT_BREAK: - if (!Extended) { - ConsoleIn->Shift = FALSE; - ConsoleIn->LeftShift = FALSE; + // + // If this is above the valid range, ignore it + // + if (ScanCode >= SCANCODE_MAX_MAKE) { + continue; } else { - ConsoleIn->SysReq = FALSE; - } - break; - case SCANCODE_RIGHT_SHIFT_BREAK: - if (!Extended) { - ConsoleIn->Shift = FALSE; - ConsoleIn->RightShift = FALSE; + break; } - break; - - case SCANCODE_LEFT_LOGO_MAKE: - ConsoleIn->LeftLogo = TRUE; - break; - case SCANCODE_LEFT_LOGO_BREAK: - ConsoleIn->LeftLogo = FALSE; - break; - case SCANCODE_RIGHT_LOGO_MAKE: - ConsoleIn->RightLogo = TRUE; - break; - case SCANCODE_RIGHT_LOGO_BREAK: - ConsoleIn->RightLogo = FALSE; - break; - case SCANCODE_MENU_MAKE: - ConsoleIn->Menu = TRUE; - break; - case SCANCODE_MENU_BREAK: - ConsoleIn->Menu = FALSE; - break; - case SCANCODE_SYS_REQ_MAKE: - if (Extended) { - ConsoleIn->SysReq = TRUE; - } - case SCANCODE_CAPS_LOCK_MAKE: - ConsoleIn->CapsLock = (BOOLEAN)!ConsoleIn->CapsLock; - UpdateStatusLights (ConsoleIn); - break; - - case SCANCODE_NUM_LOCK_MAKE: - ConsoleIn->NumLock = (BOOLEAN)!ConsoleIn->NumLock; - UpdateStatusLights (ConsoleIn); - break; - - case SCANCODE_SCROLL_LOCK_MAKE: - ConsoleIn->ScrollLock = (BOOLEAN)!ConsoleIn->ScrollLock; - UpdateStatusLights (ConsoleIn); - break; - } - // - // If this is a BREAK Key or above the valid range, ignore it - // - if (ScanCode >= SCANCODE_MAX_MAKE) { - continue; } else { - break; + // + // Store the last 2 available byte to check if it is Pause key + // + ScanCode = (UINT16) (ScancodeArr[ScancodeArrPos] + (ScancodeArr[ScancodeArrPos - 1] << 8)); + if (ScanCode == SCANCODE_PAUSE_MAKE) { + break; + } } } diff --git a/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.h b/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.h index 7cf90caa6f..cf311d8d76 100644 --- a/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.h +++ b/IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.h @@ -182,6 +182,8 @@ InstallPs2KeyboardDriver ( #define SCANCODE_SYS_REQ_MAKE 0x37 #define SCANCODE_MAX_MAKE 0x60 +#define SCANCODE_PAUSE_MAKE 0x1D45 + #define KEYBOARD_STATUS_REGISTER_HAS_OUTPUT_DATA BIT0 ///< 0 - Output register has no data; 1 - Output register has data #define KEYBOARD_STATUS_REGISTER_HAS_INPUT_DATA BIT1 ///< 0 - Input register has no data; 1 - Input register has data #define KEYBOARD_STATUS_REGISTER_SYSTEM_FLAG BIT2 ///< Set to 0 after power on reset