]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c
Update to support EFI_SIMPLE_INPUT_EX protocol
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2KeyboardDxe / Ps2KbdCtrller.c
index c4f1ee1780ee54a4d03896f80e2943b031d84d89..26e40d6bea9c9f53c36f092e01e213e824e93086 100644 (file)
@@ -85,16 +85,6 @@ KeyboardWaitForValue (
   IN UINT8                   Value\r
   );\r
 \r
-STATIC\r
-EFI_STATUS\r
-UpdateStatusLights (\r
-  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
-  );\r
-\r
-//\r
-// Global variables\r
-//\r
-\r
 STATIC struct {\r
   UINT8  ScanCode;\r
   UINT16  EfiScanCode;\r
@@ -613,6 +603,24 @@ ConvertKeyboardScanCodeToEfiKey[] = {
     0x00,\r
     0x00\r
   },\r
+  {\r
+    0x5B,  //Left LOGO\r
+    SCAN_NULL,\r
+    0x00,\r
+    0x00\r
+  },  \r
+  {\r
+    0x5C,  //Right LOGO\r
+    SCAN_NULL,\r
+    0x00,\r
+    0x00\r
+  },  \r
+  {\r
+    0x5D,  //Menu key\r
+    SCAN_NULL,\r
+    0x00,\r
+    0x00\r
+  },    \r
   {\r
     TABLE_END,\r
     TABLE_END,\r
@@ -1316,7 +1324,6 @@ Returns:
 \r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 UpdateStatusLights (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
@@ -1550,19 +1557,55 @@ Returns:
       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
     case SCANCODE_CAPS_LOCK_MAKE:\r
       ConsoleIn->CapsLock = (BOOLEAN)!ConsoleIn->CapsLock;\r
       UpdateStatusLights (ConsoleIn);\r
@@ -1588,12 +1631,6 @@ Returns:
     }\r
   }\r
   //\r
-  // If this is the SysRq, ignore it\r
-  //\r
-  if (Extended && ScanCode == 0x37) {\r
-    return EFI_NOT_READY;\r
-  }\r
-  //\r
   // Treat Numeric Key Pad "/" specially\r
   //\r
   if (Extended && ScanCode == 0x35) {\r
@@ -1609,6 +1646,14 @@ Returns:
       ConsoleIn->Key.ScanCode = ConvertKeyboardScanCodeToEfiKey[Index].EfiScanCode;\r
       if (ConsoleIn->Shift) {\r
         ConsoleIn->Key.UnicodeChar = ConvertKeyboardScanCodeToEfiKey[Index].ShiftUnicodeChar;\r
+        //\r
+        // Need not return associated shift state if a class of printable characters that\r
+        // are normally adjusted by shift modifiers. e.g. Shift Key + 'f' key = 'F'\r
+        //\r
+        if (ConsoleIn->Key.UnicodeChar >= 'A' && ConsoleIn->Key.UnicodeChar <= 'Z') {\r
+          ConsoleIn->LeftShift  = FALSE;\r
+          ConsoleIn->RightShift = FALSE;\r
+        }\r
       } else {\r
         ConsoleIn->Key.UnicodeChar = ConvertKeyboardScanCodeToEfiKey[Index].UnicodeChar;\r
       }\r
@@ -1655,6 +1700,43 @@ Returns:
     return EFI_NOT_READY;\r
   }\r
 \r
+  //\r
+  // Save the Shift/Toggle state\r
+  //\r
+  if (ConsoleIn->Ctrl) {\r
+    ConsoleIn->KeyState.KeyShiftState  |= (Extended == TRUE) ? EFI_RIGHT_CONTROL_PRESSED : EFI_LEFT_CONTROL_PRESSED;\r
+  }                                    \r
+  if (ConsoleIn->Alt) {                \r
+    ConsoleIn->KeyState.KeyShiftState  |= (Extended == TRUE) ? EFI_RIGHT_ALT_PRESSED : EFI_LEFT_ALT_PRESSED;\r
+  }                                    \r
+  if (ConsoleIn->LeftShift) {          \r
+    ConsoleIn->KeyState.KeyShiftState  |= EFI_LEFT_SHIFT_PRESSED;\r
+  }                                    \r
+  if (ConsoleIn->RightShift) {         \r
+    ConsoleIn->KeyState.KeyShiftState  |= EFI_RIGHT_SHIFT_PRESSED;\r
+  }                                    \r
+  if (ConsoleIn->LeftLogo) {           \r
+    ConsoleIn->KeyState.KeyShiftState  |= EFI_LEFT_LOGO_PRESSED;\r
+  }                                    \r
+  if (ConsoleIn->RightLogo) {          \r
+    ConsoleIn->KeyState.KeyShiftState  |= EFI_RIGHT_LOGO_PRESSED;\r
+  }                                    \r
+  if (ConsoleIn->Menu) {               \r
+    ConsoleIn->KeyState.KeyShiftState  |= EFI_MENU_KEY_PRESSED;\r
+  }                                    \r
+  if (ConsoleIn->SysReq) {             \r
+    ConsoleIn->KeyState.KeyShiftState  |= EFI_SYS_REQ_PRESSED;\r
+  }  \r
+  if (ConsoleIn->CapsLock) {\r
+    ConsoleIn->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;\r
+  }\r
+  if (ConsoleIn->NumLock) {\r
+    ConsoleIn->KeyState.KeyToggleState |= EFI_NUM_LOCK_ACTIVE;\r
+  }\r
+  if (ConsoleIn->ScrollLock) {\r
+    ConsoleIn->KeyState.KeyToggleState |= EFI_SCROLL_LOCK_ACTIVE;\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1855,6 +1937,12 @@ Returns:
   ConsoleIn->CapsLock   = FALSE;\r
   ConsoleIn->NumLock    = FALSE;\r
   ConsoleIn->ScrollLock = FALSE;\r
+  ConsoleIn->LeftShift  = FALSE;\r
+  ConsoleIn->RightShift = FALSE;\r
+  ConsoleIn->LeftLogo   = FALSE;\r
+  ConsoleIn->RightLogo  = FALSE;\r
+  ConsoleIn->Menu       = FALSE;\r
+  ConsoleIn->SysReq     = FALSE;  \r
 \r
   //\r
   // For reseting keyboard is not mandatory before booting OS and sometimes keyboard responses very slow,\r
@@ -2040,8 +2128,8 @@ Returns:
 \r
   @param[in]  BiosKeyboardPrivate   Keyboard Private Data Structure\r
 \r
-  @retval              TRUE                                                            Keyboard in System.\r
-  @retval              FALSE                                                           Keyboard not in System.\r
+  @retval     TRUE                  Keyboard in System.\r
+  @retval     FALSE                 Keyboard not in System.\r
 **/\r
 BOOLEAN\r
 EFIAPI\r