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
This commit is contained in:
vanjeff 2011-05-16 02:00:34 +00:00
parent 4ff492c312
commit e812318638
2 changed files with 121 additions and 107 deletions

View File

@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include "Ps2Keyboard.h" #include "Ps2Keyboard.h"
struct { struct {
UINT8 ScanCode; ///< follows value defined in Scan Code Set1 UINT16 ScanCode; ///< follows value defined in Scan Code Set1
UINT16 EfiScanCode; UINT16 EfiScanCode;
CHAR16 UnicodeChar; CHAR16 UnicodeChar;
CHAR16 ShiftUnicodeChar; CHAR16 ShiftUnicodeChar;
@ -549,7 +549,13 @@ ConvertKeyboardScanCodeToEfiKey[] = {
SCAN_NULL, SCAN_NULL,
0x0000, 0x0000,
0x0000 0x0000
}, },
{
0x1D45, //Pause key
SCAN_PAUSE,
0x0000,
0x0000
},
{ {
TABLE_END, TABLE_END,
TABLE_END, TABLE_END,
@ -1152,8 +1158,9 @@ KeyGetchar (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT8 ScanCode; UINT16 ScanCode;
BOOLEAN Extended; BOOLEAN Extended;
BOOLEAN Extended1;
UINTN Index; UINTN Index;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
LIST_ENTRY *Link; LIST_ENTRY *Link;
@ -1163,20 +1170,18 @@ KeyGetchar (
// //
UINT8 ScancodeArr[4]; UINT8 ScancodeArr[4];
UINT32 ScancodeArrPos; 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 // Check if there are enough bytes of scancode representing a single key
// available in the buffer // available in the buffer
// //
while (TRUE) { while (TRUE) {
Extended = FALSE;
Extended1 = FALSE;
Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 1, ScancodeArr); Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 1, ScancodeArr);
//
// point to the current position in ScancodeArr
//
ScancodeArrPos = 0; ScancodeArrPos = 0;
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return ; return ;
@ -1195,7 +1200,7 @@ KeyGetchar (
// if present, ignore them // if present, ignore them
// //
if (ScancodeArr[ScancodeArrPos] == SCANCODE_EXTENDED1) { if (ScancodeArr[ScancodeArrPos] == SCANCODE_EXTENDED1) {
Extended1 = TRUE;
Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 2, ScancodeArr); Status = GetScancodeBufHead (&ConsoleIn->ScancodeQueue, 2, ScancodeArr);
ScancodeArrPos = 1; ScancodeArrPos = 1;
@ -1209,9 +1214,6 @@ KeyGetchar (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return ; return ;
} }
PopScancodeBufHead (&ConsoleIn->ScancodeQueue, 3, ScancodeArr);
return ;
} }
// //
// if we reach this position, scancodes for a key is in buffer now,pop them // if we reach this position, scancodes for a key is in buffer now,pop them
@ -1220,104 +1222,114 @@ KeyGetchar (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return ; return ;
} }
//
// store the last available byte, this byte of scancode will be checked
//
ScanCode = ScancodeArr[ScancodeArrPos];
// if (!Extended1) {
// Check for special keys and update the driver state. //
// // store the last available byte, this byte of scancode will be checked
switch (ScanCode) { //
ScanCode = ScancodeArr[ScancodeArrPos];
case SCANCODE_CTRL_MAKE:
ConsoleIn->Ctrl = TRUE; //
break; // Check for special keys and update the driver state.
//
case SCANCODE_CTRL_BREAK: switch (ScanCode) {
ConsoleIn->Ctrl = FALSE;
break; case SCANCODE_CTRL_MAKE:
ConsoleIn->Ctrl = TRUE;
case SCANCODE_ALT_MAKE: break;
ConsoleIn->Alt = TRUE;
break; case SCANCODE_CTRL_BREAK:
ConsoleIn->Ctrl = FALSE;
case SCANCODE_ALT_BREAK: break;
ConsoleIn->Alt = FALSE;
break; case SCANCODE_ALT_MAKE:
ConsoleIn->Alt = TRUE;
case SCANCODE_LEFT_SHIFT_MAKE: break;
if (!Extended) {
ConsoleIn->Shift = TRUE; case SCANCODE_ALT_BREAK:
ConsoleIn->LeftShift = TRUE; ConsoleIn->Alt = FALSE;
} break;
break;
case SCANCODE_RIGHT_SHIFT_MAKE: case SCANCODE_LEFT_SHIFT_MAKE:
if (!Extended) { if (!Extended) {
ConsoleIn->Shift = TRUE; ConsoleIn->Shift = TRUE;
ConsoleIn->RightShift = 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; //
// If this is above the valid range, ignore it
case SCANCODE_LEFT_SHIFT_BREAK: //
if (!Extended) { if (ScanCode >= SCANCODE_MAX_MAKE) {
ConsoleIn->Shift = FALSE; continue;
ConsoleIn->LeftShift = FALSE;
} else { } else {
ConsoleIn->SysReq = FALSE; break;
}
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;
}
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 { } 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;
}
} }
} }

View File

@ -182,6 +182,8 @@ InstallPs2KeyboardDriver (
#define SCANCODE_SYS_REQ_MAKE 0x37 #define SCANCODE_SYS_REQ_MAKE 0x37
#define SCANCODE_MAX_MAKE 0x60 #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_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_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 #define KEYBOARD_STATUS_REGISTER_SYSTEM_FLAG BIT2 ///< Set to 0 after power on reset