]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c
Change functional static variable to Global variable. No STATIC modifier is recommend...
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2KeyboardDxe / Ps2KbdCtrller.c
index 4ade1e340c693b4ecca735a9c726b3002388000b..7fa0fb4d21a21cb6d17087a31094a2ab3199def9 100644 (file)
@@ -13,42 +13,34 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
-//\r
-// Include common header file for this module.\r
-//\r
 #include "Ps2Keyboard.h"\r
 \r
 //\r
 // Function declarations\r
 //\r
-STATIC\r
 UINT8\r
 KeyReadDataRegister (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
   );\r
 \r
-STATIC\r
 VOID\r
 KeyWriteDataRegister (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   );\r
 \r
-STATIC\r
 VOID\r
 KeyWriteCommandRegister (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   );\r
 \r
-STATIC\r
 VOID\r
 KeyboardError (\r
   IN KEYBOARD_CONSOLE_IN_DEV*ConsoleIn,\r
   IN CHAR16                 *ErrMsg // should be a unicode string\r
   );\r
 \r
-STATIC\r
 EFI_STATUS\r
 GetScancodeBufHead (\r
   KEYBOARD_CONSOLE_IN_DEV  *ConsoleIn,\r
@@ -56,7 +48,6 @@ GetScancodeBufHead (
   OUT UINT8                *Buf\r
   );\r
 \r
-STATIC\r
 EFI_STATUS\r
 PopScancodeBufHead (\r
   KEYBOARD_CONSOLE_IN_DEV  *ConsoleIn,\r
@@ -64,38 +55,25 @@ PopScancodeBufHead (
   OUT UINT8                *Buf\r
   );\r
 \r
-STATIC\r
 EFI_STATUS\r
 KeyboardWrite (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   );\r
 \r
-STATIC\r
 EFI_STATUS\r
 KeyboardCommand (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   );\r
 \r
-STATIC\r
 EFI_STATUS\r
 KeyboardWaitForValue (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   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
+struct {\r
   UINT8  ScanCode;\r
   UINT16  EfiScanCode;\r
   CHAR16  UnicodeChar;\r
@@ -613,6 +591,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
@@ -625,28 +621,23 @@ ConvertKeyboardScanCodeToEfiKey[] = {
 //\r
 // The WaitForValue time out\r
 //\r
-STATIC UINTN  mWaitForValueTimeOut = KEYBOARD_WAITFORVALUE_TIMEOUT;\r
+UINTN  mWaitForValueTimeOut = KEYBOARD_WAITFORVALUE_TIMEOUT;\r
 \r
-STATIC\r
-UINT8\r
-KeyReadDataRegister (\r
-  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
-  )\r
-/*++\r
+BOOLEAN          mEnableMouseInterface;\r
 \r
-Routine Description:\r
-\r
-  GC_TODO: Add function description\r
-\r
-Arguments:\r
+/**\r
+  Read data register \r
 \r
-  ConsoleIn - GC_TODO: add argument description\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
 \r
-Returns:\r
+  @return return the value \r
 \r
-  GC_TODO: add return values\r
+**/\r
+UINT8\r
+KeyReadDataRegister (\r
+  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
+  )\r
 \r
---*/\r
 {\r
   EFI_ISA_IO_PROTOCOL                 *IsaIo;\r
   UINT8                               Data;\r
@@ -667,28 +658,19 @@ Returns:
   return Data;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Write data register\r
+\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  @param Data      value wanted to be written\r
+\r
+**/\r
 VOID\r
 KeyWriteDataRegister (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ConsoleIn - GC_TODO: add argument description\r
-  Data      - GC_TODO: add argument description\r
-\r
-Returns:\r
 \r
-  GC_TODO: add return values\r
-\r
---*/\r
 {\r
   EFI_ISA_IO_PROTOCOL                 *IsaIo;\r
 \r
@@ -710,25 +692,18 @@ Returns:
   //\r
 }\r
 \r
+/**\r
+  Read status register\r
+\r
+  @param ConsoleIn  Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+\r
+  @return value in status register\r
+\r
+**/\r
 UINT8\r
 KeyReadStatusRegister (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ConsoleIn - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
-  GC_TODO: add return values\r
-\r
---*/\r
 {\r
   EFI_ISA_IO_PROTOCOL                 *IsaIo;\r
   UINT8                               Data;\r
@@ -750,28 +725,19 @@ Returns:
 \r
 }\r
 \r
-STATIC\r
+/**\r
+  Write command register \r
+\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  @param Data      The value wanted to be written\r
+\r
+**/\r
+\r
 VOID\r
 KeyWriteCommandRegister (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ConsoleIn - GC_TODO: add argument description\r
-  Data      - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
-  GC_TODO: add return values\r
-\r
---*/\r
 {\r
   EFI_ISA_IO_PROTOCOL                 *IsaIo;\r
 \r
@@ -790,25 +756,18 @@ Returns:
 \r
 }\r
 \r
-STATIC\r
+/**\r
+  Display error message\r
+\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  @param ErrMsg    Unicode string of error message\r
+  \r
+**/\r
 VOID\r
 KeyboardError (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN CHAR16                  *ErrMsg\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Display error message\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-// GC_TODO:    ConsoleIn - add argument and description to function comment\r
-// GC_TODO:    ErrMsg - add argument and description to function comment\r
 {\r
   ConsoleIn->KeyboardErr = TRUE;\r
 \r
@@ -818,30 +777,24 @@ Returns:
   //\r
 }\r
 \r
-VOID\r
-EFIAPI\r
-KeyboardTimerHandler (\r
-  IN EFI_EVENT    Event,\r
-  IN VOID         *Context\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   Timer event handler: read a series of scancodes from 8042\r
   and put them into memory scancode buffer.\r
   it read as much scancodes to either fill\r
   the memory buffer or empty the keyboard buffer.\r
   It is registered as running under TPL_NOTIFY\r
 \r
-Arguments:\r
-\r
-  Event - The timer event\r
-  Context - A KEYBOARD_CONSOLE_IN_DEV pointer\r
+  @param Event - The timer event\r
+  @param Context - A KEYBOARD_CONSOLE_IN_DEV pointer\r
 \r
-Returns:\r
+**/\r
+VOID\r
+EFIAPI\r
+KeyboardTimerHandler (\r
+  IN EFI_EVENT    Event,\r
+  IN VOID         *Context\r
+  )\r
 \r
---*/\r
 {\r
   UINT8                   Data;\r
   EFI_TPL                 OldTpl;\r
@@ -934,34 +887,23 @@ Returns:
   return ;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Read several bytes from the scancode buffer without removing them.\r
+  This function is called to see if there are enough bytes of scancode\r
+  representing a single key.\r
+\r
+  @param Count - Number of bytes to be read\r
+  @param Buf - Store the results\r
+\r
+  @retval EFI_SUCCESS success to scan the keyboard code\r
+  @retval EFI_NOT_READY invalid parameter\r
+**/\r
 EFI_STATUS\r
 GetScancodeBufHead (\r
   KEYBOARD_CONSOLE_IN_DEV    *ConsoleIn,\r
   IN UINT32                  Count,\r
   OUT UINT8                  *Buf\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Read several bytes from the scancode buffer without removing them.\r
-  This function is called to see if there are enough bytes of scancode\r
-  representing a single key.\r
-\r
-Arguments:\r
-\r
-  Count - Number of bytes to be read\r
-  Buf - Store the results\r
-\r
-Returns:\r
-\r
-  EFI_STATUS\r
-\r
---*/\r
-// GC_TODO:    ConsoleIn - add argument and description to function comment\r
-// GC_TODO:    EFI_NOT_READY - add return value to function comment\r
-// GC_TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   UINT32  Index;\r
   UINT32  Pos;\r
@@ -997,33 +939,23 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
+/**\r
+\r
+  Read & remove several bytes from the scancode buffer.\r
+  This function is usually called after GetScancodeBufHead()\r
+\r
+  @param Count - Number of bytes to be read\r
+  @param Buf - Store the results\r
+\r
+  @retval EFI_SUCCESS success to scan the keyboard code\r
+  @retval EFI_NOT_READY invalid parameter\r
+**/\r
 EFI_STATUS\r
 PopScancodeBufHead (\r
   KEYBOARD_CONSOLE_IN_DEV   *ConsoleIn,\r
   IN UINT32                 Count,\r
   OUT UINT8                 *Buf\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Read & remove several bytes from the scancode buffer.\r
-  This function is usually called after GetScancodeBufHead()\r
-\r
-Arguments:\r
-\r
-  Count - Number of bytes to be read\r
-  Buf - Store the results\r
-\r
-Returns:\r
-\r
-  EFI_STATUS\r
-\r
---*/\r
-// GC_TODO:    ConsoleIn - add argument and description to function comment\r
-// GC_TODO:    EFI_NOT_READY - add return value to function comment\r
-// GC_TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   UINT32  Index;\r
 \r
@@ -1060,28 +992,22 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Read key value \r
+\r
+  @param ConsoleIn - Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  @param Data      - Pointer to outof buffer for keeping key value\r
+\r
+  @retval EFI_TIMEOUT Status resigter time out\r
+  @retval EFI_SUCCESS Success to read keyboard\r
+\r
+**/\r
 EFI_STATUS\r
 KeyboardRead (\r
   IN KEYBOARD_CONSOLE_IN_DEV  *ConsoleIn,\r
   OUT UINT8                   *Data\r
   )\r
-/*++\r
 \r
-Routine Description:\r
-\r
-  GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ConsoleIn - GC_TODO: add argument description\r
-  Data      - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
-  EFI_TIMEOUT - GC_TODO: Add description for return value\r
-  EFI_SUCCESS - GC_TODO: Add description for return value\r
-\r
---*/\r
 {\r
   UINT32  TimeOut;\r
   UINT32  RegFilled;\r
@@ -1109,29 +1035,21 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
+/**\r
+  write key to keyboard\r
+\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  @param Data      value wanted to be written\r
+\r
+  @retval EFI_TIMEOUT - GC_TODO: Add description for return value\r
+  @retval EFI_SUCCESS - GC_TODO: Add description for return value\r
+\r
+**/\r
 EFI_STATUS\r
 KeyboardWrite (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ConsoleIn - GC_TODO: add argument description\r
-  Data      - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
-  EFI_TIMEOUT - GC_TODO: Add description for return value\r
-  EFI_SUCCESS - GC_TODO: Add description for return value\r
-\r
---*/\r
 {\r
   UINT32  TimeOut;\r
   UINT32  RegEmptied;\r
@@ -1162,30 +1080,21 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Issue keyboard command\r
+\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  @param Data      The buff holding the command \r
+\r
+  @retval EFI_TIMEOUT Keyboard is not ready to issuing \r
+  @retval EFI_SUCCESS Success to issue keyboard command\r
+\r
+**/\r
 EFI_STATUS\r
 KeyboardCommand (\r
   IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
   IN UINT8                   Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  GC_TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ConsoleIn - GC_TODO: add argument description\r
-  Data      - GC_TODO: add argument description\r
-\r
-Returns:\r
-\r
-  EFI_TIMEOUT - GC_TODO: Add description for return value\r
-  EFI_TIMEOUT - GC_TODO: Add description for return value\r
-  EFI_SUCCESS - GC_TODO: Add description for return value\r
-\r
---*/\r
 {\r
   UINT32  TimeOut;\r
   UINT32  RegEmptied;\r
@@ -1233,32 +1142,23 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
-EFI_STATUS\r
-KeyboardWaitForValue (\r
-  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
-  IN UINT8                   Value\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   wait for a specific value to be presented on\r
   8042 Data register by keyboard and then read it,\r
   used in keyboard commands ack\r
 \r
-Arguments:\r
-\r
-  ConsoleIn - The KEYBOARD_CONSOLE_IN_DEV instance pointer\r
-  Value - The value to be waited for\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  @param Value     the value wanted to be waited.\r
 \r
-Returns:\r
-\r
-  EFI_STATUS\r
-\r
---*/\r
-// GC_TODO:    EFI_SUCCESS - add return value to function comment\r
-// GC_TODO:    EFI_TIMEOUT - add return value to function comment\r
+  @retval EFI_TIMEOUT Fail to get specific value in given time\r
+  @retval EFI_SUCCESS Success to get specific value in given time.\r
+  \r
+**/\r
+EFI_STATUS\r
+KeyboardWaitForValue (\r
+  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
+  IN UINT8                   Value\r
+  )\r
 {\r
   UINT8   Data;\r
   UINT32  TimeOut;\r
@@ -1316,24 +1216,19 @@ Returns:
 \r
 }\r
 \r
-STATIC\r
-EFI_STATUS\r
-UpdateStatusLights (\r
-  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   Show keyboard status lights according to\r
   indicators in ConsoleIn.\r
 \r
-Arguments:\r
-\r
-Returns:\r
+  @param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
+  \r
+  @return status\r
 \r
---*/\r
-// GC_TODO:    ConsoleIn - add argument and description to function comment\r
+**/\r
+EFI_STATUS\r
+UpdateStatusLights (\r
+  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
+  )\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       Command;\r
@@ -1374,28 +1269,21 @@ Returns:
   return Status;\r
 }\r
 \r
-EFI_STATUS\r
-KeyGetchar (\r
-  IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   Get scancode from scancode buffer\r
   and translate into EFI-scancode and unicode defined by EFI spec\r
   The function is always called in TPL_NOTIFY\r
 \r
-Arguments:\r
+  @param ConsoleIn KEYBOARD_CONSOLE_IN_DEV instance pointer\r
 \r
-  ConsoleIn - KEYBOARD_CONSOLE_IN_DEV instance pointer\r
+  @retval EFI_NOT_READY - Input from console not ready yet.\r
+  @retval EFI_SUCCESS   - Function executed successfully.\r
 \r
-Returns:\r
-\r
-  EFI_NOT_READY - Input from console not ready yet.\r
-  EFI_SUCCESS   - Function executed successfully.\r
-\r
---*/\r
+**/\r
+EFI_STATUS\r
+KeyGetchar (\r
+  IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
+  )\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       ScanCode;\r
@@ -1550,19 +1438,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 +1512,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 +1527,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
@@ -1622,6 +1548,16 @@ Returns:
           ConsoleIn->Key.UnicodeChar = ConvertKeyboardScanCodeToEfiKey[Index].UnicodeChar;\r
         }\r
       }\r
+      //\r
+      // Translate the CTRL-Alpha characters to their corresponding control value (ctrl-a = 0x0001 through ctrl-Z = 0x001A)\r
+      //\r
+      if (ConsoleIn->Ctrled) {\r
+        if (ConsoleIn->Key.UnicodeChar >= 'a' && ConsoleIn->Key.UnicodeChar <= 'z') {\r
+          ConsoleIn->Key.UnicodeChar = (UINT16) (ConsoleIn->Key.UnicodeChar - 'a' + 1);\r
+        } else if (ConsoleIn->Key.UnicodeChar >= 'A' && ConsoleIn->Key.UnicodeChar <= 'Z') {\r
+          ConsoleIn->Key.UnicodeChar = (UINT16) (ConsoleIn->Key.UnicodeChar - 'A' + 1);\r
+        }\r
+      }\r
 \r
       break;\r
     }\r
@@ -1645,44 +1581,70 @@ 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
-EFI_STATUS\r
-InitKeyboard (\r
-  IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
-  IN BOOLEAN                     ExtendedVerification\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   Perform 8042 controller and keyboard Initialization\r
   If ExtendedVerification is TRUE, do additional test for\r
   the keyboard interface\r
 \r
-Arguments:\r
+  @param ConsoleIn - KEYBOARD_CONSOLE_IN_DEV instance pointer\r
+  @param ExtendedVerification - indicates a thorough initialization\r
 \r
-  ConsoleIn - KEYBOARD_CONSOLE_IN_DEV instance pointer\r
-  ExtendedVerification - indicates a thorough initialization\r
-\r
-Returns:\r
-\r
-  EFI_STATUS\r
-\r
---*/\r
-// GC_TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// GC_TODO:    EFI_SUCCESS - add return value to function comment\r
-// GC_TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
+  @retval EFI_DEVICE_ERROR Fail to init keyboard\r
+  @retval EFI_SUCCESS      Success to init keyboard\r
+**/\r
+EFI_STATUS\r
+InitKeyboard (\r
+  IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,\r
+  IN BOOLEAN                     ExtendedVerification\r
+  )\r
 {\r
   EFI_STATUS              Status;\r
   EFI_STATUS              Status1;\r
   UINT8                   CommandByte;\r
-  STATIC BOOLEAN          EnableMouseInterface;\r
   EFI_PS2_POLICY_PROTOCOL *Ps2Policy;\r
 \r
   Status                = EFI_SUCCESS;\r
-  EnableMouseInterface  = TRUE;\r
+  mEnableMouseInterface  = TRUE;\r
 \r
   //\r
   // Get Ps2 policy to set this\r
@@ -1742,9 +1704,9 @@ Returns:
     // Test the mouse enabling bit\r
     //\r
     if (CommandByte & 0x20) {\r
-      EnableMouseInterface = FALSE;\r
+      mEnableMouseInterface = FALSE;\r
     } else {\r
-      EnableMouseInterface = TRUE;\r
+      mEnableMouseInterface = TRUE;\r
     }\r
 \r
   } else {\r
@@ -1790,7 +1752,7 @@ Returns:
     //\r
     // Don't enable mouse interface later\r
     //\r
-    EnableMouseInterface = FALSE;\r
+    mEnableMouseInterface = FALSE;\r
 \r
   }\r
 \r
@@ -1845,6 +1807,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
@@ -1969,7 +1937,7 @@ Returns:
   //\r
 Done:\r
 \r
-  if (EnableMouseInterface) {\r
+  if (mEnableMouseInterface) {\r
     //\r
     // Enable mouse interface\r
     //\r
@@ -1988,26 +1956,18 @@ Done:
 \r
 }\r
 \r
-EFI_STATUS\r
-DisableKeyboard (\r
-  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   Disable the keyboard interface of the 8042 controller\r
 \r
-Arguments:\r
+  @param ConsoleIn   - the device instance\r
 \r
-  ConsoleIn   - the device instance\r
+  @return status of issuing disable command\r
 \r
-Returns:\r
-\r
-  EFI_STATUS\r
-\r
---*/\r
-// GC_TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
+**/\r
+EFI_STATUS\r
+DisableKeyboard (\r
+  IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn\r
+  )\r
 {\r
   EFI_STATUS  Status;\r
 \r
@@ -2028,10 +1988,10 @@ Returns:
   If Keyboard receives 0xF4, it will respond with 'ACK'. If it doesn't respond, the device\r
   should not be in system.\r
 \r
-  @param[in]  BiosKeyboardPrivate   Keyboard Private Data Structure\r
+  @param[in]  ConsoleIn             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
@@ -2072,3 +2032,4 @@ CheckKeyboardConnect (
 \r
   return TRUE;\r
 }\r
+\r