#include "Ps2Keyboard.h"\r
\r
struct {\r
- UINT8 ScanCode; ///< follows value defined in Scan Code Set1\r
+ UINT16 ScanCode; ///< follows value defined in Scan Code Set1\r
UINT16 EfiScanCode;\r
CHAR16 UnicodeChar;\r
CHAR16 ShiftUnicodeChar;\r
SCAN_NULL,\r
0x0000,\r
0x0000\r
- }, \r
+ }, \r
+ {\r
+ 0x1D45, //Pause key\r
+ SCAN_PAUSE,\r
+ 0x0000,\r
+ 0x0000\r
+ }, \r
{\r
TABLE_END,\r
TABLE_END,\r
)\r
{\r
EFI_STATUS Status;\r
- UINT8 ScanCode;\r
+ UINT16 ScanCode;\r
BOOLEAN Extended;\r
+ BOOLEAN Extended1;\r
UINTN Index;\r
EFI_KEY_DATA KeyData;\r
LIST_ENTRY *Link;\r
//\r
UINT8 ScancodeArr[4];\r
UINT32 ScancodeArrPos;\r
- //\r
- // point to the current position in ScancodeArr\r
- //\r
-\r
- Extended = FALSE;\r
- ScancodeArrPos = 0;\r
\r
//\r
// Check if there are enough bytes of scancode representing a single key\r
// available in the buffer\r
//\r
while (TRUE) {\r
-\r
+ Extended = FALSE;\r
+ Extended1 = FALSE;\r
Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 1, ScancodeArr);\r
+ //\r
+ // point to the current position in ScancodeArr\r
+ //\r
ScancodeArrPos = 0;\r
if (EFI_ERROR (Status)) {\r
return ;\r
// if present, ignore them\r
//\r
if (ScancodeArr[ScancodeArrPos] == SCANCODE_EXTENDED1) {\r
-\r
+ Extended1 = TRUE;\r
Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 2, ScancodeArr);\r
ScancodeArrPos = 1;\r
\r
if (EFI_ERROR (Status)) {\r
return ;\r
}\r
-\r
- PopScancodeBufHead (&ConsoleIn->ScancodeQueue, 3, ScancodeArr);\r
- return ;\r
}\r
//\r
// if we reach this position, scancodes for a key is in buffer now,pop them\r
if (EFI_ERROR (Status)) {\r
return ;\r
}\r
- //\r
- // store the last available byte, this byte of scancode will be checked\r
- //\r
- ScanCode = ScancodeArr[ScancodeArrPos];\r
\r
- //\r
- // Check for special keys and update the driver state.\r
- //\r
- switch (ScanCode) {\r
-\r
- case SCANCODE_CTRL_MAKE:\r
- ConsoleIn->Ctrl = TRUE;\r
- break;\r
-\r
- case SCANCODE_CTRL_BREAK:\r
- ConsoleIn->Ctrl = FALSE;\r
- break;\r
-\r
- case SCANCODE_ALT_MAKE:\r
- ConsoleIn->Alt = TRUE;\r
- break;\r
-\r
- case SCANCODE_ALT_BREAK:\r
- ConsoleIn->Alt = FALSE;\r
- break;\r
-\r
- case SCANCODE_LEFT_SHIFT_MAKE:\r
- if (!Extended) {\r
- ConsoleIn->Shift = TRUE;\r
- ConsoleIn->LeftShift = TRUE;\r
- } \r
- break;\r
- case SCANCODE_RIGHT_SHIFT_MAKE:\r
- if (!Extended) {\r
- ConsoleIn->Shift = TRUE;\r
- ConsoleIn->RightShift = TRUE;\r
+ if (!Extended1) {\r
+ //\r
+ // store the last available byte, this byte of scancode will be checked\r
+ //\r
+ ScanCode = ScancodeArr[ScancodeArrPos];\r
+ \r
+ //\r
+ // Check for special keys and update the driver state.\r
+ //\r
+ switch (ScanCode) {\r
+ \r
+ case SCANCODE_CTRL_MAKE:\r
+ ConsoleIn->Ctrl = TRUE;\r
+ break;\r
+ \r
+ case SCANCODE_CTRL_BREAK:\r
+ ConsoleIn->Ctrl = FALSE;\r
+ break;\r
+ \r
+ case SCANCODE_ALT_MAKE:\r
+ ConsoleIn->Alt = TRUE;\r
+ break;\r
+ \r
+ case SCANCODE_ALT_BREAK:\r
+ ConsoleIn->Alt = FALSE;\r
+ break;\r
+ \r
+ case SCANCODE_LEFT_SHIFT_MAKE:\r
+ if (!Extended) {\r
+ ConsoleIn->Shift = TRUE;\r
+ ConsoleIn->LeftShift = TRUE;\r
+ } \r
+ break;\r
+ case SCANCODE_RIGHT_SHIFT_MAKE:\r
+ if (!Extended) {\r
+ ConsoleIn->Shift = TRUE;\r
+ ConsoleIn->RightShift = TRUE;\r
+ }\r
+ break;\r
+ \r
+ case SCANCODE_LEFT_SHIFT_BREAK:\r
+ if (!Extended) {\r
+ ConsoleIn->Shift = FALSE;\r
+ ConsoleIn->LeftShift = FALSE;\r
+ } else {\r
+ ConsoleIn->SysReq = FALSE;\r
+ } \r
+ break;\r
+ case SCANCODE_RIGHT_SHIFT_BREAK:\r
+ if (!Extended) {\r
+ ConsoleIn->Shift = FALSE;\r
+ ConsoleIn->RightShift = FALSE;\r
+ }\r
+ break;\r
+ \r
+ case SCANCODE_LEFT_LOGO_MAKE:\r
+ ConsoleIn->LeftLogo = TRUE;\r
+ break; \r
+ case SCANCODE_LEFT_LOGO_BREAK:\r
+ ConsoleIn->LeftLogo = FALSE;\r
+ break; \r
+ case SCANCODE_RIGHT_LOGO_MAKE:\r
+ ConsoleIn->RightLogo = TRUE;\r
+ break;\r
+ case SCANCODE_RIGHT_LOGO_BREAK:\r
+ ConsoleIn->RightLogo = FALSE;\r
+ break; \r
+ case SCANCODE_MENU_MAKE:\r
+ ConsoleIn->Menu = TRUE;\r
+ break;\r
+ case SCANCODE_MENU_BREAK:\r
+ ConsoleIn->Menu = FALSE;\r
+ break; \r
+ case SCANCODE_SYS_REQ_MAKE:\r
+ if (Extended) {\r
+ ConsoleIn->SysReq = TRUE;\r
+ }\r
+ break;\r
+ case SCANCODE_CAPS_LOCK_MAKE:\r
+ ConsoleIn->CapsLock = (BOOLEAN)!ConsoleIn->CapsLock;\r
+ UpdateStatusLights (ConsoleIn);\r
+ break;\r
+ case SCANCODE_NUM_LOCK_MAKE:\r
+ ConsoleIn->NumLock = (BOOLEAN)!ConsoleIn->NumLock;\r
+ UpdateStatusLights (ConsoleIn);\r
+ break;\r
+ case SCANCODE_SCROLL_LOCK_MAKE:\r
+ ConsoleIn->ScrollLock = (BOOLEAN)!ConsoleIn->ScrollLock;\r
+ UpdateStatusLights (ConsoleIn);\r
+ break;\r
}\r
- break;\r
-\r
- case SCANCODE_LEFT_SHIFT_BREAK:\r
- if (!Extended) {\r
- ConsoleIn->Shift = FALSE;\r
- ConsoleIn->LeftShift = FALSE;\r
+ //\r
+ // If this is above the valid range, ignore it\r
+ //\r
+ if (ScanCode >= SCANCODE_MAX_MAKE) {\r
+ continue;\r
} else {\r
- ConsoleIn->SysReq = FALSE;\r
- } \r
- break;\r
- case SCANCODE_RIGHT_SHIFT_BREAK:\r
- if (!Extended) {\r
- ConsoleIn->Shift = FALSE;\r
- ConsoleIn->RightShift = FALSE;\r
- }\r
- break;\r
-\r
- case SCANCODE_LEFT_LOGO_MAKE:\r
- ConsoleIn->LeftLogo = TRUE;\r
- break; \r
- case SCANCODE_LEFT_LOGO_BREAK:\r
- ConsoleIn->LeftLogo = FALSE;\r
- break; \r
- case SCANCODE_RIGHT_LOGO_MAKE:\r
- ConsoleIn->RightLogo = TRUE;\r
- break;\r
- case SCANCODE_RIGHT_LOGO_BREAK:\r
- ConsoleIn->RightLogo = FALSE;\r
- break; \r
- case SCANCODE_MENU_MAKE:\r
- ConsoleIn->Menu = TRUE;\r
- break;\r
- case SCANCODE_MENU_BREAK:\r
- ConsoleIn->Menu = FALSE;\r
- break; \r
- case SCANCODE_SYS_REQ_MAKE:\r
- if (Extended) {\r
- ConsoleIn->SysReq = TRUE;\r
+ break;\r
}\r
- case SCANCODE_CAPS_LOCK_MAKE:\r
- ConsoleIn->CapsLock = (BOOLEAN)!ConsoleIn->CapsLock;\r
- UpdateStatusLights (ConsoleIn);\r
- break;\r
-\r
- case SCANCODE_NUM_LOCK_MAKE:\r
- ConsoleIn->NumLock = (BOOLEAN)!ConsoleIn->NumLock;\r
- UpdateStatusLights (ConsoleIn);\r
- break;\r
-\r
- case SCANCODE_SCROLL_LOCK_MAKE:\r
- ConsoleIn->ScrollLock = (BOOLEAN)!ConsoleIn->ScrollLock;\r
- UpdateStatusLights (ConsoleIn);\r
- break;\r
- }\r
- //\r
- // If this is a BREAK Key or above the valid range, ignore it\r
- //\r
- if (ScanCode >= SCANCODE_MAX_MAKE) {\r
- continue;\r
} else {\r
- break;\r
+ //\r
+ // Store the last 2 available byte to check if it is Pause key\r
+ //\r
+ ScanCode = (UINT16) (ScancodeArr[ScancodeArrPos] + (ScancodeArr[ScancodeArrPos - 1] << 8));\r
+ if (ScanCode == SCANCODE_PAUSE_MAKE) {\r
+ break;\r
+ }\r
}\r
}\r
\r