mirror of https://github.com/acidanthera/audk.git
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:
parent
4ff492c312
commit
e812318638
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue