]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update PS/2 keyboard driver to return scan code for Pause key.
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 16 May 2011 02:00:34 +0000 (02:00 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 16 May 2011 02:00:34 +0000 (02:00 +0000)
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

IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c
IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.h

index fa0f53b7422065aa6f30b752278af52b1de0c6b7..93fdf6d94f4dd0373052aaf69e142838b1064aea 100644 (file)
@@ -15,7 +15,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "Ps2Keyboard.h"\r
 \r
 struct {\r
-  UINT  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
@@ -549,7 +549,13 @@ ConvertKeyboardScanCodeToEfiKey[] = {
     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
@@ -1152,8 +1158,9 @@ KeyGetchar (
   )\r
 {\r
   EFI_STATUS                     Status;\r
-  UINT                         ScanCode;\r
+  UINT16                         ScanCode;\r
   BOOLEAN                        Extended;\r
+  BOOLEAN                        Extended1;\r
   UINTN                          Index;\r
   EFI_KEY_DATA                   KeyData;\r
   LIST_ENTRY                     *Link;\r
@@ -1163,20 +1170,18 @@ KeyGetchar (
   //\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
@@ -1195,7 +1200,7 @@ KeyGetchar (
     // 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
@@ -1209,9 +1214,6 @@ KeyGetchar (
       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
@@ -1220,104 +1222,114 @@ KeyGetchar (
     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
index 7cf90caa6f19acc54dc17bc5d872b120f42d209a..cf311d8d76d7ee1695533ffdc8b32d25ff6a781a 100644 (file)
@@ -182,6 +182,8 @@ InstallPs2KeyboardDriver (
 #define SCANCODE_SYS_REQ_MAKE           0x37\r
 #define SCANCODE_MAX_MAKE               0x60\r
 \r
+#define SCANCODE_PAUSE_MAKE             0x1D45\r
+\r
 #define KEYBOARD_STATUS_REGISTER_HAS_OUTPUT_DATA     BIT0        ///< 0 - Output register has no data; 1 - Output register has data\r
 #define KEYBOARD_STATUS_REGISTER_HAS_INPUT_DATA      BIT1        ///< 0 - Input register has no data;  1 - Input register has data\r
 #define KEYBOARD_STATUS_REGISTER_SYSTEM_FLAG         BIT2        ///< Set to 0 after power on reset\r