SCAN_NULL,\r
0x0000,\r
0x0000\r
- }, \r
+ },\r
{\r
0x5C, //Right LOGO\r
SCAN_NULL,\r
0x0000,\r
0x0000\r
- }, \r
+ },\r
{\r
0x5D, //Menu key\r
SCAN_NULL,\r
\r
/**\r
Return the count of scancode in the queue.\r
- \r
+\r
@param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
\r
@return Count of the scancode.\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
+\r
@param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
@param Count Number of bytes to be read\r
@param Buf Store the results\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
- Push one byte to the scancode buffer.\r
-\r
- @param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
- @param Scancode The byte to push.\r
-**/\r
-VOID\r
-PushScancodeBufTail (\r
- IN SCAN_CODE_QUEUE *Queue,\r
- IN UINT8 Scancode\r
- )\r
-{\r
- if (GetScancodeBufCount (Queue) == KEYBOARD_SCAN_CODE_MAX_COUNT - 1) {\r
- return;\r
- }\r
-\r
- Queue->Buffer[Queue->Tail] = Scancode;\r
- Queue->Tail = (Queue->Tail + 1) % KEYBOARD_SCAN_CODE_MAX_COUNT;\r
-}\r
-\r
/**\r
\r
Read & remove several bytes from the scancode buffer.\r
This function is usually called after GetScancodeBufHead()\r
- \r
+\r
@param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
@param Count Number of bytes to be read\r
@param Buf Store the results\r
PopScancodeBufHead (\r
IN SCAN_CODE_QUEUE *Queue,\r
IN UINTN Count,\r
- OUT UINT8 *Buf\r
+ OUT UINT8 *Buf OPTIONAL\r
)\r
{\r
UINTN Index;\r
// Retrieve and remove the values\r
//\r
for (Index = 0; Index < Count; Index++, Queue->Head = (Queue->Head + 1) % KEYBOARD_SCAN_CODE_MAX_COUNT) {\r
- Buf[Index] = Queue->Buffer[Queue->Head];\r
+ if (Buf != NULL) {\r
+ Buf[Index] = Queue->Buffer[Queue->Head];\r
+ }\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Push one byte to the scancode buffer.\r
+\r
+ @param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
+ @param Scancode The byte to push.\r
+**/\r
+VOID\r
+PushScancodeBufTail (\r
+ IN SCAN_CODE_QUEUE *Queue,\r
+ IN UINT8 Scancode\r
+ )\r
+{\r
+ if (GetScancodeBufCount (Queue) == KEYBOARD_SCAN_CODE_MAX_COUNT - 1) {\r
+ PopScancodeBufHead (Queue, 1, NULL);\r
+ }\r
+\r
+ Queue->Buffer[Queue->Tail] = Scancode;\r
+ Queue->Tail = (Queue->Tail + 1) % KEYBOARD_SCAN_CODE_MAX_COUNT;\r
+}\r
+\r
/**\r
Read data register .\r
\r
@param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
\r
- @return return the value \r
+ @return return the value\r
\r
**/\r
UINT8\r
\r
@param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
@param ErrMsg Unicode string of error message\r
- \r
+\r
**/\r
VOID\r
KeyboardError (\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
+ @param Data The buff holding the command\r
\r
- @retval EFI_TIMEOUT Keyboard is not ready to issuing \r
+ @retval EFI_TIMEOUT Keyboard is not ready to issuing\r
@retval EFI_SUCCESS Success to issue keyboard command\r
\r
**/\r
\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
**/\r
EFI_STATUS\r
KeyboardWaitForValue (\r
indicators in ConsoleIn.\r
\r
@param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
- \r
+\r
@return status of updating keyboard register\r
\r
**/\r
//\r
UINT8 ScancodeArr[3];\r
UINT32 ScancodeArrPos;\r
- \r
+\r
//\r
// Check if there are enough bytes of scancode representing a single key\r
// available in the buffer\r
// Check for special keys and update the driver state.\r
//\r
switch (ScanCode) {\r
- \r
+\r
case SCANCODE_CTRL_MAKE:\r
if (Extend0) {\r
ConsoleIn->RightCtrl = TRUE;\r
} else {\r
ConsoleIn->LeftCtrl = TRUE;\r
}\r
- break; \r
+ break;\r
case SCANCODE_CTRL_BREAK:\r
if (Extend0) {\r
ConsoleIn->RightCtrl = FALSE;\r
} else {\r
ConsoleIn->LeftAlt = TRUE;\r
}\r
- break; \r
+ break;\r
case SCANCODE_ALT_BREAK:\r
if (Extend0) {\r
ConsoleIn->RightAlt = FALSE;\r
case SCANCODE_LEFT_SHIFT_MAKE:\r
//\r
// To avoid recognize PRNT_SCRN key as a L_SHIFT key\r
- // because PRNT_SCRN key generates E0 followed by L_SHIFT scan code\r
+ // because PRNT_SCRN key generates E0 followed by L_SHIFT scan code.\r
+ // If it the second byte of the PRNT_ScRN skip it.\r
//\r
if (!Extend0) {\r
ConsoleIn->LeftShift = TRUE;\r
+ break;\r
}\r
- break;\r
+ continue;\r
+\r
case SCANCODE_LEFT_SHIFT_BREAK:\r
if (!Extend0) {\r
ConsoleIn->LeftShift = FALSE;\r
case SCANCODE_RIGHT_SHIFT_BREAK:\r
ConsoleIn->RightShift = FALSE;\r
break;\r
- \r
+\r
case SCANCODE_LEFT_LOGO_MAKE:\r
ConsoleIn->LeftLogo = TRUE;\r
break;\r
break;\r
}\r
}\r
- \r
+\r
//\r
// If this is above the valid range, ignore it\r
//\r
| (ConsoleIn->RightLogo ? EFI_RIGHT_LOGO_PRESSED : 0)\r
| (ConsoleIn->Menu ? EFI_MENU_KEY_PRESSED : 0)\r
| (ConsoleIn->SysReq ? EFI_SYS_REQ_PRESSED : 0)\r
- )\r
- ;\r
+ );\r
KeyData.KeyState.KeyToggleState = (EFI_KEY_TOGGLE_STATE) (EFI_TOGGLE_STATE_VALID\r
| (ConsoleIn->CapsLock ? EFI_CAPS_LOCK_ACTIVE : 0)\r
| (ConsoleIn->NumLock ? EFI_NUM_LOCK_ACTIVE : 0)\r
| (ConsoleIn->ScrollLock ? EFI_SCROLL_LOCK_ACTIVE : 0)\r
- )\r
- ;\r
+ | (ConsoleIn->IsSupportPartialKey ? EFI_KEY_STATE_EXPOSED : 0)\r
+ );\r
+\r
KeyData.Key.ScanCode = SCAN_NULL;\r
KeyData.Key.UnicodeChar = CHAR_NULL;\r
\r
KeyData.Key.ScanCode = ConvertKeyboardScanCodeToEfiKey[Index].EfiScanCode;\r
KeyData.Key.UnicodeChar = ConvertKeyboardScanCodeToEfiKey[Index].UnicodeChar;\r
\r
- if ((ConsoleIn->LeftShift || ConsoleIn->RightShift) && \r
+ if ((ConsoleIn->LeftShift || ConsoleIn->RightShift) &&\r
(ConvertKeyboardScanCodeToEfiKey[Index].UnicodeChar != ConvertKeyboardScanCodeToEfiKey[Index].ShiftUnicodeChar)) {\r
KeyData.Key.UnicodeChar = ConvertKeyboardScanCodeToEfiKey[Index].ShiftUnicodeChar;\r
//\r
KeyData.Key.UnicodeChar = CHAR_NULL;\r
}\r
}\r
+\r
//\r
// If the key can not be converted then just return.\r
//\r
if (KeyData.Key.ScanCode == SCAN_NULL && KeyData.Key.UnicodeChar == CHAR_NULL) {\r
- return ;\r
+ if (!ConsoleIn->IsSupportPartialKey) {\r
+ return ;\r
+ }\r
}\r
\r
//\r
//\r
for (Link = GetFirstNode (&ConsoleIn->NotifyList); !IsNull (&ConsoleIn->NotifyList, Link); Link = GetNextNode (&ConsoleIn->NotifyList, Link)) {\r
CurrentNotify = CR (\r
- Link, \r
- KEYBOARD_CONSOLE_IN_EX_NOTIFY, \r
- NotifyEntry, \r
+ Link,\r
+ KEYBOARD_CONSOLE_IN_EX_NOTIFY,\r
+ NotifyEntry,\r
KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
);\r
- if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) { \r
+ if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) {\r
CurrentNotify->KeyNotificationFn (&KeyData);\r
}\r
}\r
- \r
+\r
//\r
// Translate the CTRL-Alpha characters to their corresponding control value (ctrl-a = 0x0001 through ctrl-Z = 0x001A)\r
//\r
}\r
\r
/**\r
- Perform 8042 controller and keyboard Initialization. \r
+ Perform 8042 controller and keyboard Initialization.\r
If ExtendedVerification is TRUE, do additional test for\r
the keyboard interface\r
\r
ConsoleIn->LeftCtrl = FALSE;\r
ConsoleIn->RightCtrl = FALSE;\r
ConsoleIn->LeftAlt = FALSE;\r
- ConsoleIn->RightAlt = FALSE; \r
+ ConsoleIn->RightAlt = 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
+ ConsoleIn->SysReq = FALSE;\r
\r
+ ConsoleIn->IsSupportPartialKey = FALSE;\r
//\r
// For reseting keyboard is not mandatory before booting OS and sometimes keyboard responses very slow,\r
// and to support KB hot plug, we need to let the InitKB succeed no matter whether there is a KB device connected\r
return (BOOLEAN) (Queue->Head == Queue->Tail);\r
}\r
\r
-\r
-\r
-/**\r
- Push one key data to the EFI key buffer.\r
-\r
- @param Queue Pointer to instance of EFI_KEY_QUEUE.\r
- @param KeyData The key data to push.\r
-**/\r
-VOID\r
-PushEfikeyBufTail (\r
- IN EFI_KEY_QUEUE *Queue,\r
- IN EFI_KEY_DATA *KeyData\r
- )\r
-{\r
- if ((Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT == Queue->Head) {\r
- return;\r
- }\r
- \r
- CopyMem (&Queue->Buffer[Queue->Tail], KeyData, sizeof (EFI_KEY_DATA));\r
- Queue->Tail = (Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT;\r
-}\r
-\r
/**\r
Read & remove one key data from the EFI key buffer.\r
- \r
+\r
@param Queue Pointer to instance of EFI_KEY_QUEUE.\r
@param KeyData Receive the key data.\r
\r
EFI_STATUS\r
PopEfikeyBufHead (\r
IN EFI_KEY_QUEUE *Queue,\r
- OUT EFI_KEY_DATA *KeyData\r
+ OUT EFI_KEY_DATA *KeyData OPTIONAL\r
)\r
{\r
if (IsEfikeyBufEmpty (Queue)) {\r
//\r
// Retrieve and remove the values\r
//\r
- CopyMem (KeyData, &Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA));\r
+ if (KeyData != NULL) {\r
+ CopyMem (KeyData, &Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA));\r
+ }\r
Queue->Head = (Queue->Head + 1) % KEYBOARD_EFI_KEY_MAX_COUNT;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Push one key data to the EFI key buffer.\r
+\r
+ @param Queue Pointer to instance of EFI_KEY_QUEUE.\r
+ @param KeyData The key data to push.\r
+**/\r
+VOID\r
+PushEfikeyBufTail (\r
+ IN EFI_KEY_QUEUE *Queue,\r
+ IN EFI_KEY_DATA *KeyData\r
+ )\r
+{\r
+ if ((Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT == Queue->Head) {\r
+ //\r
+ // If Queue is full, pop the one from head.\r
+ //\r
+ PopEfikeyBufHead (Queue, NULL);\r
+ }\r
+ CopyMem (&Queue->Buffer[Queue->Tail], KeyData, sizeof (EFI_KEY_DATA));\r
+ Queue->Tail = (Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT;\r
+}\r
+\r
/**\r
Judge whether is a registed key\r
\r
- @param RegsiteredData A pointer to a buffer that is filled in with the keystroke \r
+ @param RegsiteredData A pointer to a buffer that is filled in with the keystroke\r
state data for the key that was registered.\r
- @param InputData A pointer to a buffer that is filled in with the keystroke \r
+ @param InputData A pointer to a buffer that is filled in with the keystroke\r
state data for the key that was pressed.\r
\r
@retval TRUE Key be pressed matches a registered key.\r
- @retval FLASE Match failed. \r
- \r
+ @retval FLASE Match failed.\r
+\r
**/\r
BOOLEAN\r
IsKeyRegistered (\r
\r
{\r
ASSERT (RegsiteredData != NULL && InputData != NULL);\r
- \r
+\r
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||\r
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {\r
- return FALSE; \r
- } \r
- \r
+ return FALSE;\r
+ }\r
+\r
//\r
// Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.\r
//\r
if (RegsiteredData->KeyState.KeyShiftState != 0 &&\r
RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {\r
- return FALSE; \r
- } \r
+ return FALSE;\r
+ }\r
if (RegsiteredData->KeyState.KeyToggleState != 0 &&\r
RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {\r
- return FALSE; \r
- } \r
- \r
+ return FALSE;\r
+ }\r
+\r
return TRUE;\r
\r
}\r
\r
/**\r
- Reads the next keystroke from the input device. The WaitForKey Event can \r
+ Reads the next keystroke from the input device. The WaitForKey Event can\r
be used to test for existance of a keystroke via WaitForEvent () call.\r
- \r
+\r
@param ConsoleInDev Ps2 Keyboard private structure\r
- @param KeyData A pointer to a buffer that is filled in with the keystroke \r
+ @param KeyData A pointer to a buffer that is filled in with the keystroke\r
state data for the key that was pressed.\r
\r
- \r
+\r
@retval EFI_SUCCESS The keystroke information was returned.\r
@retval EFI_NOT_READY There was no keystroke data availiable.\r
- @retval EFI_DEVICE_ERROR The keystroke information was not returned due to \r
+ @retval EFI_DEVICE_ERROR The keystroke information was not returned due to\r
hardware errors.\r
- @retval EFI_INVALID_PARAMETER KeyData is NULL. \r
+ @retval EFI_INVALID_PARAMETER KeyData is NULL.\r
\r
**/\r
EFI_STATUS\r
{\r
EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
- \r
+\r
if (KeyData == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
//\r
// Enter critical section\r
//\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
KeyboardTimerHandler (NULL, ConsoleInDev);\r
- \r
+\r
if (ConsoleInDev->KeyboardErr) {\r
Status = EFI_DEVICE_ERROR;\r
} else {\r
Perform 8042 controller and keyboard initialization which implement SIMPLE_TEXT_IN.Reset()\r
\r
@param This Pointer to instance of EFI_SIMPLE_TEXT_INPUT_PROTOCOL\r
- @param ExtendedVerification Indicate that the driver may perform a more \r
- exhaustive verification operation of the device during \r
- reset, now this par is ignored in this driver \r
+ @param ExtendedVerification Indicate that the driver may perform a more\r
+ exhaustive verification operation of the device during\r
+ reset, now this par is ignored in this driver\r
\r
**/\r
EFI_STATUS\r
Retrieve key values for driver user which implement SIMPLE_TEXT_IN.ReadKeyStroke().\r
\r
@param This Pointer to instance of EFI_SIMPLE_TEXT_INPUT_PROTOCOL\r
- @param Key The output buffer for key value \r
+ @param Key The output buffer for key value\r
\r
@retval EFI_SUCCESS success to read key stroke\r
**/\r
EFI_KEY_DATA KeyData;\r
\r
ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);\r
- Status = KeyboardReadKeyStrokeWorker (ConsoleIn, &KeyData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));\r
- return EFI_SUCCESS;\r
\r
+ //\r
+ // Considering if the partial keystroke is enabled, there maybe a partial\r
+ // keystroke in the queue, so here skip the partial keystroke and get the\r
+ // next key from the queue\r
+ //\r
+ while (1) {\r
+ //\r
+ // If there is no pending key, then return.\r
+ //\r
+ Status = KeyboardReadKeyStrokeWorker (ConsoleIn, &KeyData);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ //\r
+ // If it is partial keystroke, skip it.\r
+ //\r
+ if (KeyData.Key.ScanCode == SCAN_NULL && KeyData.Key.UnicodeChar == CHAR_NULL) {\r
+ continue;\r
+ }\r
+ CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));\r
+ return EFI_SUCCESS;\r
+ }\r
}\r
\r
/**\r
{\r
EFI_TPL OldTpl;\r
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
+ EFI_KEY_DATA KeyData;\r
\r
ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *) Context;\r
\r
// Enter critical section\r
//\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
- \r
+\r
KeyboardTimerHandler (NULL, ConsoleIn);\r
\r
if (!ConsoleIn->KeyboardErr) {\r
//\r
- // Someone is waiting on the keyboard event, if there's\r
- // a key pending, signal the event\r
+ // WaitforKey doesn't suppor the partial key.\r
+ // Considering if the partial keystroke is enabled, there maybe a partial\r
+ // keystroke in the queue, so here skip the partial keystroke and get the\r
+ // next key from the queue\r
//\r
- if (!IsEfikeyBufEmpty (&ConsoleIn->EfiKeyQueue)) {\r
+ while (!IsEfikeyBufEmpty (&ConsoleIn->EfiKeyQueue)) {\r
+ CopyMem (\r
+ &KeyData,\r
+ &(ConsoleIn->EfiKeyQueue.Buffer[ConsoleIn->EfiKeyQueue.Head]),\r
+ sizeof (EFI_KEY_DATA)\r
+ );\r
+ if (KeyData.Key.ScanCode == SCAN_NULL && KeyData.Key.UnicodeChar == CHAR_NULL) {\r
+ PopEfikeyBufHead (&ConsoleIn->EfiKeyQueue, &KeyData);\r
+ continue;\r
+ }\r
+ //\r
+ // if there is pending value key, signal the event.\r
+ //\r
gBS->SignalEvent (Event);\r
+ break;\r
}\r
}\r
//\r
@param ExtendedVerification Driver may perform diagnostics on reset.\r
\r
@retval EFI_SUCCESS The device was reset.\r
- @retval EFI_DEVICE_ERROR The device is not functioning properly and could \r
+ @retval EFI_DEVICE_ERROR The device is not functioning properly and could\r
not be reset.\r
\r
**/\r
{\r
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;\r
\r
- ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This); \r
+ ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);\r
\r
return ConsoleInDev->ConIn.Reset (\r
- &ConsoleInDev->ConIn, \r
+ &ConsoleInDev->ConIn,\r
ExtendedVerification\r
);\r
}\r
\r
/**\r
- Reads the next keystroke from the input device. The WaitForKey Event can \r
+ Reads the next keystroke from the input device. The WaitForKey Event can\r
be used to test for existance of a keystroke via WaitForEvent () call.\r
\r
\r
@param This Protocol instance pointer.\r
- @param KeyData A pointer to a buffer that is filled in with the keystroke \r
+ @param KeyData A pointer to a buffer that is filled in with the keystroke\r
state data for the key that was pressed.\r
\r
@retval EFI_SUCCESS The keystroke information was returned.\r
@retval EFI_NOT_READY There was no keystroke data availiable.\r
- @retval EFI_DEVICE_ERROR The keystroke information was not returned due to \r
+ @retval EFI_DEVICE_ERROR The keystroke information was not returned due to\r
hardware errors.\r
- @retval EFI_INVALID_PARAMETER KeyData is NULL. \r
+ @retval EFI_INVALID_PARAMETER KeyData is NULL.\r
\r
**/\r
EFI_STATUS\r
\r
ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);\r
return KeyboardReadKeyStrokeWorker (ConsoleInDev, KeyData);\r
- \r
}\r
\r
/**\r
Set certain state for the input device.\r
\r
@param This Protocol instance pointer.\r
- @param KeyToggleState A pointer to the EFI_KEY_TOGGLE_STATE to set the \r
+ @param KeyToggleState A pointer to the EFI_KEY_TOGGLE_STATE to set the\r
state for the input device.\r
\r
@retval EFI_SUCCESS The device state was set successfully.\r
- @retval EFI_DEVICE_ERROR The device is not functioning correctly and could \r
+ @retval EFI_DEVICE_ERROR The device is not functioning correctly and could\r
not have the setting adjusted.\r
@retval EFI_UNSUPPORTED The device does not have the ability to set its state.\r
- @retval EFI_INVALID_PARAMETER KeyToggleState is NULL. \r
+ @retval EFI_INVALID_PARAMETER KeyToggleState is NULL.\r
\r
-**/ \r
+**/\r
EFI_STATUS\r
EFIAPI\r
KeyboardSetState (\r
if (KeyToggleState == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);\r
\r
//\r
Status = EFI_UNSUPPORTED;\r
goto Exit;\r
}\r
- \r
+\r
//\r
// Update the status light\r
//\r
- ConsoleInDev->ScrollLock = FALSE;\r
- ConsoleInDev->NumLock = FALSE;\r
- ConsoleInDev->CapsLock = FALSE;\r
+ ConsoleInDev->ScrollLock = FALSE;\r
+ ConsoleInDev->NumLock = FALSE;\r
+ ConsoleInDev->CapsLock = FALSE;\r
+ ConsoleInDev->IsSupportPartialKey = FALSE;\r
\r
if ((*KeyToggleState & EFI_SCROLL_LOCK_ACTIVE) == EFI_SCROLL_LOCK_ACTIVE) {\r
ConsoleInDev->ScrollLock = TRUE;\r
- } \r
+ }\r
if ((*KeyToggleState & EFI_NUM_LOCK_ACTIVE) == EFI_NUM_LOCK_ACTIVE) {\r
ConsoleInDev->NumLock = TRUE;\r
}\r
if ((*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == EFI_CAPS_LOCK_ACTIVE) {\r
ConsoleInDev->CapsLock = TRUE;\r
}\r
+ if ((*KeyToggleState & EFI_KEY_STATE_EXPOSED) == EFI_KEY_STATE_EXPOSED) {\r
+ ConsoleInDev->IsSupportPartialKey = TRUE;\r
+ }\r
\r
Status = UpdateStatusLights (ConsoleInDev);\r
if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR; \r
+ Status = EFI_DEVICE_ERROR;\r
}\r
\r
-Exit: \r
+Exit:\r
//\r
// Leave critical section and return\r
//\r
Register a notification function for a particular keystroke for the input device.\r
\r
@param This Protocol instance pointer.\r
- @param KeyData A pointer to a buffer that is filled in with the keystroke \r
+ @param KeyData A pointer to a buffer that is filled in with the keystroke\r
information data for the key that was pressed.\r
- @param KeyNotificationFunction Points to the function to be called when the key \r
- sequence is typed specified by KeyData. \r
- @param NotifyHandle Points to the unique handle assigned to the registered notification. \r
+ @param KeyNotificationFunction Points to the function to be called when the key\r
+ sequence is typed specified by KeyData.\r
+ @param NotifyHandle Points to the unique handle assigned to the registered notification.\r
\r
@retval EFI_SUCCESS The notification function was registered successfully.\r
@retval EFI_OUT_OF_RESOURCES Unable to allocate resources for necesssary data structures.\r
- @retval EFI_INVALID_PARAMETER KeyData or NotifyHandle or KeyNotificationFunction is NULL. \r
- \r
-**/ \r
+ @retval EFI_INVALID_PARAMETER KeyData or NotifyHandle or KeyNotificationFunction is NULL.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
KeyboardRegisterKeyNotify (\r
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;\r
EFI_TPL OldTpl;\r
LIST_ENTRY *Link;\r
- KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; \r
+ KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;\r
KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify;\r
\r
if (KeyData == NULL || NotifyHandle == NULL || KeyNotificationFunction == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);\r
\r
//\r
//\r
for (Link = ConsoleInDev->NotifyList.ForwardLink; Link != &ConsoleInDev->NotifyList; Link = Link->ForwardLink) {\r
CurrentNotify = CR (\r
- Link, \r
- KEYBOARD_CONSOLE_IN_EX_NOTIFY, \r
- NotifyEntry, \r
+ Link,\r
+ KEYBOARD_CONSOLE_IN_EX_NOTIFY,\r
+ NotifyEntry,\r
KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
);\r
- if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) { \r
+ if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {\r
if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {\r
- *NotifyHandle = CurrentNotify->NotifyHandle; \r
+ *NotifyHandle = CurrentNotify->NotifyHandle;\r
Status = EFI_SUCCESS;\r
goto Exit;\r
}\r
}\r
- } \r
- \r
+ }\r
+\r
//\r
// Allocate resource to save the notification function\r
- // \r
+ //\r
NewNotify = (KEYBOARD_CONSOLE_IN_EX_NOTIFY *) AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_EX_NOTIFY));\r
if (NewNotify == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Exit;\r
}\r
\r
- NewNotify->Signature = KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE; \r
+ NewNotify->Signature = KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE;\r
NewNotify->KeyNotificationFn = KeyNotificationFunction;\r
NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;\r
CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA));\r
InsertTailList (&ConsoleInDev->NotifyList, &NewNotify->NotifyEntry);\r
\r
- *NotifyHandle = NewNotify->NotifyHandle; \r
+ *NotifyHandle = NewNotify->NotifyHandle;\r
Status = EFI_SUCCESS;\r
\r
Exit:\r
// Leave critical section and return\r
//\r
gBS->RestoreTPL (OldTpl);\r
- return Status; \r
+ return Status;\r
\r
}\r
\r
/**\r
Remove a registered notification function from a particular keystroke.\r
\r
- @param This Protocol instance pointer. \r
+ @param This Protocol instance pointer.\r
@param NotificationHandle The handle of the notification function being unregistered.\r
\r
- \r
+\r
@retval EFI_SUCCESS The notification function was unregistered successfully.\r
@retval EFI_INVALID_PARAMETER The NotificationHandle is invalid.\r
- \r
-**/ \r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
KeyboardUnregisterKeyNotify (\r
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;\r
EFI_TPL OldTpl;\r
LIST_ENTRY *Link;\r
- KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; \r
+ KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;\r
\r
if (NotificationHandle == NULL) {\r
return EFI_INVALID_PARAMETER;\r
- } \r
+ }\r
\r
if (((KEYBOARD_CONSOLE_IN_EX_NOTIFY *) NotificationHandle)->Signature != KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE) {\r
return EFI_INVALID_PARAMETER;\r
- } \r
- \r
+ }\r
+\r
ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);\r
- \r
+\r
//\r
// Enter critical section\r
//\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY); \r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
for (Link = ConsoleInDev->NotifyList.ForwardLink; Link != &ConsoleInDev->NotifyList; Link = Link->ForwardLink) {\r
CurrentNotify = CR (\r
- Link, \r
- KEYBOARD_CONSOLE_IN_EX_NOTIFY, \r
- NotifyEntry, \r
+ Link,\r
+ KEYBOARD_CONSOLE_IN_EX_NOTIFY,\r
+ NotifyEntry,\r
KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
- ); \r
+ );\r
if (CurrentNotify->NotifyHandle == NotificationHandle) {\r
//\r
// Remove the notification function from NotifyList and free resources\r
//\r
- RemoveEntryList (&CurrentNotify->NotifyEntry); \r
- \r
- gBS->FreePool (CurrentNotify); \r
+ RemoveEntryList (&CurrentNotify->NotifyEntry);\r
+\r
+ gBS->FreePool (CurrentNotify);\r
Status = EFI_SUCCESS;\r
goto Exit;\r
}\r
BOOLEAN LeftAlt;\r
BOOLEAN RightAlt;\r
BOOLEAN LeftShift;\r
- BOOLEAN RightShift; \r
+ BOOLEAN RightShift;\r
BOOLEAN LeftLogo;\r
BOOLEAN RightLogo;\r
BOOLEAN Menu;\r
BOOLEAN NumLock;\r
BOOLEAN ScrollLock;\r
\r
+ BOOLEAN IsSupportPartialKey;\r
//\r
// Queue storing key scancodes\r
//\r
/**\r
The user Entry Point for module Ps2Keyboard. The user code starts with this function.\r
\r
- @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
@param[in] SystemTable A pointer to the EFI System Table.\r
- \r
+\r
@retval EFI_SUCCESS The entry point is executed successfully.\r
@retval other Some error occurs when executing this entry point.\r
\r
#define SCANCODE_LEFT_LOGO_BREAK 0xDB\r
#define SCANCODE_RIGHT_LOGO_MAKE 0x5C\r
#define SCANCODE_RIGHT_LOGO_BREAK 0xDC\r
-#define SCANCODE_MENU_MAKE 0x5D //APPS key defined in Keyboard scan code \r
+#define SCANCODE_MENU_MAKE 0x5D //APPS key defined in Keyboard scan code\r
#define SCANCODE_MENU_BREAK 0xDD\r
#define SCANCODE_SYS_REQ_MAKE 0x37\r
#define SCANCODE_SYS_REQ_BREAK 0xB7\r
indicators in ConsoleIn.\r
\r
@param ConsoleIn Pointer to instance of KEYBOARD_CONSOLE_IN_DEV\r
- \r
+\r
@return status\r
\r
**/\r
Perform 8042 controller and keyboard initialization\r
\r
@param This Pointer to instance of EFI_SIMPLE_TEXT_INPUT_PROTOCOL\r
- @param ExtendedVerification Indicate that the driver may perform a more \r
- exhaustive verification operation of the device during \r
- reset, now this par is ignored in this driver \r
+ @param ExtendedVerification Indicate that the driver may perform a more\r
+ exhaustive verification operation of the device during\r
+ reset, now this par is ignored in this driver\r
\r
**/\r
EFI_STATUS\r
Retrieve key values for driver user.\r
\r
@param This Pointer to instance of EFI_SIMPLE_TEXT_INPUT_PROTOCOL\r
- @param Key The output buffer for key value \r
+ @param Key The output buffer for key value\r
\r
@retval EFI_SUCCESS success to read key stroke\r
**/\r
KeyboardWaitForKeyEx (\r
IN EFI_EVENT Event,\r
IN VOID *Context\r
- ); \r
+ );\r
\r
//\r
// Simple Text Input Ex protocol function prototypes\r
@param ExtendedVerification - Driver may perform diagnostics on reset.\r
\r
@retval EFI_SUCCESS - The device was reset.\r
- @retval EFI_DEVICE_ERROR - The device is not functioning properly and could \r
+ @retval EFI_DEVICE_ERROR - The device is not functioning properly and could\r
not be reset.\r
\r
**/\r
);\r
\r
/**\r
- Reads the next keystroke from the input device. The WaitForKey Event can \r
+ Reads the next keystroke from the input device. The WaitForKey Event can\r
be used to test for existance of a keystroke via WaitForEvent () call.\r
\r
\r
@param This - Protocol instance pointer.\r
- @param KeyData - A pointer to a buffer that is filled in with the keystroke \r
+ @param KeyData - A pointer to a buffer that is filled in with the keystroke\r
state data for the key that was pressed.\r
\r
@retval EFI_SUCCESS - The keystroke information was returned.\r
@retval EFI_NOT_READY - There was no keystroke data availiable.\r
- @retval EFI_DEVICE_ERROR - The keystroke information was not returned due to \r
+ @retval EFI_DEVICE_ERROR - The keystroke information was not returned due to\r
hardware errors.\r
- @retval EFI_INVALID_PARAMETER - KeyData is NULL. \r
+ @retval EFI_INVALID_PARAMETER - KeyData is NULL.\r
\r
**/\r
EFI_STATUS\r
Set certain state for the input device.\r
\r
@param This - Protocol instance pointer.\r
- @param KeyToggleState - A pointer to the EFI_KEY_TOGGLE_STATE to set the \r
+ @param KeyToggleState - A pointer to the EFI_KEY_TOGGLE_STATE to set the\r
state for the input device.\r
\r
@retval EFI_SUCCESS - The device state was set successfully.\r
- @retval EFI_DEVICE_ERROR - The device is not functioning correctly and could \r
+ @retval EFI_DEVICE_ERROR - The device is not functioning correctly and could\r
not have the setting adjusted.\r
@retval EFI_UNSUPPORTED - The device does not have the ability to set its state.\r
- @retval EFI_INVALID_PARAMETER - KeyToggleState is NULL. \r
+ @retval EFI_INVALID_PARAMETER - KeyToggleState is NULL.\r
\r
**/\r
EFI_STATUS\r
Register a notification function for a particular keystroke for the input device.\r
\r
@param This - Protocol instance pointer.\r
- @param KeyData - A pointer to a buffer that is filled in with the keystroke \r
+ @param KeyData - A pointer to a buffer that is filled in with the keystroke\r
information data for the key that was pressed.\r
- @param KeyNotificationFunction - Points to the function to be called when the key \r
- sequence is typed specified by KeyData. \r
- @param NotifyHandle - Points to the unique handle assigned to the registered notification. \r
+ @param KeyNotificationFunction - Points to the function to be called when the key\r
+ sequence is typed specified by KeyData.\r
+ @param NotifyHandle - Points to the unique handle assigned to the registered notification.\r
\r
@retval EFI_SUCCESS - The notification function was registered successfully.\r
@retval EFI_OUT_OF_RESOURCES - Unable to allocate resources for necesssary data structures.\r
- @retval EFI_INVALID_PARAMETER - KeyData or NotifyHandle is NULL. \r
- \r
-**/ \r
+ @retval EFI_INVALID_PARAMETER - KeyData or NotifyHandle is NULL.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
KeyboardRegisterKeyNotify (\r
/**\r
Remove a registered notification function from a particular keystroke.\r
\r
- @param This - Protocol instance pointer. \r
+ @param This - Protocol instance pointer.\r
@param NotificationHandle - The handle of the notification function being unregistered.\r
\r
- \r
+\r
@retval EFI_SUCCESS - The notification function was unregistered successfully.\r
@retval EFI_INVALID_PARAMETER - The NotificationHandle is invalid.\r
- @retval EFI_NOT_FOUND - Can not find the matching entry in database. \r
- \r
-**/ \r
+ @retval EFI_NOT_FOUND - Can not find the matching entry in database.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
KeyboardUnregisterKeyNotify (\r
/**\r
Judge whether is a registed key\r
\r
- @param RegsiteredData A pointer to a buffer that is filled in with the keystroke \r
+ @param RegsiteredData A pointer to a buffer that is filled in with the keystroke\r
state data for the key that was registered.\r
- @param InputData A pointer to a buffer that is filled in with the keystroke \r
+ @param InputData A pointer to a buffer that is filled in with the keystroke\r
state data for the key that was pressed.\r
\r
@retval TRUE Key be pressed matches a registered key.\r
- @retval FLASE Match failed. \r
- \r
+ @retval FLASE Match failed.\r
+\r
**/\r
BOOLEAN\r
IsKeyRegistered (\r
IN EFI_KEY_DATA *RegsiteredData,\r
IN EFI_KEY_DATA *InputData\r
);\r
+\r
#endif\r