X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FBus%2FIsa%2FPs2KeyboardDxe%2FPs2KbdTextIn.c;h=835f33cfa800e656f116ccf84c4d042fe83a8957;hp=04e3365f9e6d8533b28c4002c19fb86d257e66d0;hb=HEAD;hpb=3652f9902fc07c0d26bd1ce0492870b8de979809 diff --git a/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c b/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c index 04e3365f9e..b1ab17af37 100644 --- a/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c +++ b/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c @@ -2,18 +2,11 @@ Routines implements SIMPLE_TEXT_IN protocol's interfaces based on 8042 interfaces provided by Ps2KbdCtrller.c. -Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ - #include "Ps2Keyboard.h" /** @@ -26,10 +19,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ BOOLEAN IsEfikeyBufEmpty ( - IN EFI_KEY_QUEUE *Queue + IN EFI_KEY_QUEUE *Queue ) { - return (BOOLEAN) (Queue->Head == Queue->Tail); + return (BOOLEAN)(Queue->Head == Queue->Tail); } /** @@ -43,19 +36,21 @@ IsEfikeyBufEmpty ( **/ EFI_STATUS PopEfikeyBufHead ( - IN EFI_KEY_QUEUE *Queue, - OUT EFI_KEY_DATA *KeyData OPTIONAL + IN EFI_KEY_QUEUE *Queue, + OUT EFI_KEY_DATA *KeyData OPTIONAL ) { if (IsEfikeyBufEmpty (Queue)) { return EFI_NOT_READY; } + // // Retrieve and remove the values // if (KeyData != NULL) { CopyMem (KeyData, &Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA)); } + Queue->Head = (Queue->Head + 1) % KEYBOARD_EFI_KEY_MAX_COUNT; return EFI_SUCCESS; } @@ -68,8 +63,8 @@ PopEfikeyBufHead ( **/ VOID PushEfikeyBufTail ( - IN EFI_KEY_QUEUE *Queue, - IN EFI_KEY_DATA *KeyData + IN EFI_KEY_QUEUE *Queue, + IN EFI_KEY_DATA *KeyData ) { if ((Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT == Queue->Head) { @@ -78,12 +73,13 @@ PushEfikeyBufTail ( // PopEfikeyBufHead (Queue, NULL); } + CopyMem (&Queue->Buffer[Queue->Tail], KeyData, sizeof (EFI_KEY_DATA)); Queue->Tail = (Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT; } /** - Judge whether is a registed key + Judge whether is a registered key @param RegsiteredData A pointer to a buffer that is filled in with the keystroke state data for the key that was registered. @@ -91,7 +87,7 @@ PushEfikeyBufTail ( state data for the key that was pressed. @retval TRUE Key be pressed matches a registered key. - @retval FLASE Match failed. + @retval FALSE Match failed. **/ BOOLEAN @@ -104,29 +100,32 @@ IsKeyRegistered ( ASSERT (RegsiteredData != NULL && InputData != NULL); if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) || - (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) { + (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) + { return FALSE; } // // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored. // - if (RegsiteredData->KeyState.KeyShiftState != 0 && - RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) { + if ((RegsiteredData->KeyState.KeyShiftState != 0) && + (RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState)) + { return FALSE; } - if (RegsiteredData->KeyState.KeyToggleState != 0 && - RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) { + + if ((RegsiteredData->KeyState.KeyToggleState != 0) && + (RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState)) + { return FALSE; } return TRUE; - } /** Reads the next keystroke from the input device. The WaitForKey Event can - be used to test for existance of a keystroke via WaitForEvent () call. + be used to test for existence of a keystroke via WaitForEvent () call. @param ConsoleInDev Ps2 Keyboard private structure @param KeyData A pointer to a buffer that is filled in with the keystroke @@ -134,7 +133,7 @@ IsKeyRegistered ( @retval EFI_SUCCESS The keystroke information was returned. - @retval EFI_NOT_READY There was no keystroke data availiable. + @retval EFI_NOT_READY There was no keystroke data available. @retval EFI_DEVICE_ERROR The keystroke information was not returned due to hardware errors. @retval EFI_INVALID_PARAMETER KeyData is NULL. @@ -142,13 +141,13 @@ IsKeyRegistered ( **/ EFI_STATUS KeyboardReadKeyStrokeWorker ( - IN KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev, - OUT EFI_KEY_DATA *KeyData + IN KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev, + OUT EFI_KEY_DATA *KeyData ) { - EFI_STATUS Status; - EFI_TPL OldTpl; + EFI_STATUS Status; + EFI_TPL OldTpl; if (KeyData == NULL) { return EFI_INVALID_PARAMETER; @@ -165,6 +164,10 @@ KeyboardReadKeyStrokeWorker ( Status = EFI_DEVICE_ERROR; } else { Status = PopEfikeyBufHead (&ConsoleInDev->EfiKeyQueue, KeyData); + if (Status == EFI_NOT_READY) { + ZeroMem (&KeyData->Key, sizeof (KeyData->Key)); + InitializeKeyState (ConsoleInDev, &KeyData->KeyState); + } } gBS->RestoreTPL (OldTpl); @@ -187,9 +190,9 @@ KeyboardEfiReset ( IN BOOLEAN ExtendedVerification ) { - EFI_STATUS Status; - KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; - EFI_TPL OldTpl; + EFI_STATUS Status; + KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; + EFI_TPL OldTpl; ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This); if (ConsoleIn->KeyboardErr) { @@ -234,6 +237,7 @@ KeyboardEfiReset ( ConsoleIn->DevicePath ); } + // // Report the status If keyboard is locked // @@ -263,9 +267,9 @@ KeyboardReadKeyStroke ( OUT EFI_INPUT_KEY *Key ) { - EFI_STATUS Status; - KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; - EFI_KEY_DATA KeyData; + EFI_STATUS Status; + KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; + EFI_KEY_DATA KeyData; ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This); @@ -282,21 +286,23 @@ KeyboardReadKeyStroke ( if (EFI_ERROR (Status)) { return Status; } + // // If it is partial keystroke, skip it. // - if (KeyData.Key.ScanCode == SCAN_NULL && KeyData.Key.UnicodeChar == CHAR_NULL) { + if ((KeyData.Key.ScanCode == SCAN_NULL) && (KeyData.Key.UnicodeChar == CHAR_NULL)) { continue; } + // // Translate the CTRL-Alpha characters to their corresponding control value // (ctrl-a = 0x0001 through ctrl-Z = 0x001A) // if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) { - if (KeyData.Key.UnicodeChar >= L'a' && KeyData.Key.UnicodeChar <= L'z') { - KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'a' + 1); - } else if (KeyData.Key.UnicodeChar >= L'A' && KeyData.Key.UnicodeChar <= L'Z') { - KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'A' + 1); + if ((KeyData.Key.UnicodeChar >= L'a') && (KeyData.Key.UnicodeChar <= L'z')) { + KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'a' + 1); + } else if ((KeyData.Key.UnicodeChar >= L'A') && (KeyData.Key.UnicodeChar <= L'Z')) { + KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'A' + 1); } } @@ -310,21 +316,21 @@ KeyboardReadKeyStroke ( Signal the event if there is key available @param Event the event object - @param Context waitting context + @param Context waiting context **/ VOID EFIAPI KeyboardWaitForKey ( - IN EFI_EVENT Event, - IN VOID *Context + IN EFI_EVENT Event, + IN VOID *Context ) { - EFI_TPL OldTpl; - KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; - EFI_KEY_DATA KeyData; + EFI_TPL OldTpl; + KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; + EFI_KEY_DATA KeyData; - ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *) Context; + ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *)Context; // // Enter critical section @@ -335,7 +341,7 @@ KeyboardWaitForKey ( if (!ConsoleIn->KeyboardErr) { // - // WaitforKey doesn't suppor the partial key. + // WaitforKey doesn't support the partial key. // Considering if the partial keystroke is enabled, there maybe a partial // keystroke in the queue, so here skip the partial keystroke and get the // next key from the queue @@ -346,10 +352,11 @@ KeyboardWaitForKey ( &(ConsoleIn->EfiKeyQueue.Buffer[ConsoleIn->EfiKeyQueue.Head]), sizeof (EFI_KEY_DATA) ); - if (KeyData.Key.ScanCode == SCAN_NULL && KeyData.Key.UnicodeChar == CHAR_NULL) { + if ((KeyData.Key.ScanCode == SCAN_NULL) && (KeyData.Key.UnicodeChar == CHAR_NULL)) { PopEfikeyBufHead (&ConsoleIn->EfiKeyQueue, &KeyData); continue; } + // // if there is pending value key, signal the event. // @@ -357,6 +364,7 @@ KeyboardWaitForKey ( break; } } + // // Leave critical section and return // @@ -374,8 +382,8 @@ KeyboardWaitForKey ( VOID EFIAPI KeyboardWaitForKeyEx ( - IN EFI_EVENT Event, - IN VOID *Context + IN EFI_EVENT Event, + IN VOID *Context ) { @@ -383,7 +391,7 @@ KeyboardWaitForKeyEx ( } /** - Reset the input device and optionaly run diagnostics + Reset the input device and optionally run diagnostics @param This Protocol instance pointer. @param ExtendedVerification Driver may perform diagnostics on reset. @@ -401,7 +409,7 @@ KeyboardEfiResetEx ( ) { - KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; + KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This); @@ -413,7 +421,7 @@ KeyboardEfiResetEx ( /** Reads the next keystroke from the input device. The WaitForKey Event can - be used to test for existance of a keystroke via WaitForEvent () call. + be used to test for existence of a keystroke via WaitForEvent () call. @param This Protocol instance pointer. @@ -421,7 +429,7 @@ KeyboardEfiResetEx ( state data for the key that was pressed. @retval EFI_SUCCESS The keystroke information was returned. - @retval EFI_NOT_READY There was no keystroke data availiable. + @retval EFI_NOT_READY There was no keystroke data available. @retval EFI_DEVICE_ERROR The keystroke information was not returned due to hardware errors. @retval EFI_INVALID_PARAMETER KeyData is NULL. @@ -430,12 +438,12 @@ KeyboardEfiResetEx ( EFI_STATUS EFIAPI KeyboardReadKeyStrokeEx ( - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, - OUT EFI_KEY_DATA *KeyData + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, + OUT EFI_KEY_DATA *KeyData ) { - KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; + KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; if (KeyData == NULL) { return EFI_INVALID_PARAMETER; @@ -467,9 +475,9 @@ KeyboardSetState ( ) { - EFI_STATUS Status; - KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; - EFI_TPL OldTpl; + EFI_STATUS Status; + KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; + EFI_TPL OldTpl; if (KeyToggleState == NULL) { return EFI_INVALID_PARAMETER; @@ -503,12 +511,15 @@ KeyboardSetState ( if ((*KeyToggleState & EFI_SCROLL_LOCK_ACTIVE) == EFI_SCROLL_LOCK_ACTIVE) { ConsoleInDev->ScrollLock = TRUE; } + if ((*KeyToggleState & EFI_NUM_LOCK_ACTIVE) == EFI_NUM_LOCK_ACTIVE) { ConsoleInDev->NumLock = TRUE; } + if ((*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == EFI_CAPS_LOCK_ACTIVE) { ConsoleInDev->CapsLock = TRUE; } + if ((*KeyToggleState & EFI_KEY_STATE_EXPOSED) == EFI_KEY_STATE_EXPOSED) { ConsoleInDev->IsSupportPartialKey = TRUE; } @@ -525,7 +536,6 @@ Exit: gBS->RestoreTPL (OldTpl); return Status; - } /** @@ -542,7 +552,7 @@ Exit: @param NotifyHandle Points to the unique handle assigned to the registered notification. @retval EFI_SUCCESS The notification function was registered successfully. - @retval EFI_OUT_OF_RESOURCES Unable to allocate resources for necesssary data structures. + @retval EFI_OUT_OF_RESOURCES Unable to allocate resources for necessary data structures. @retval EFI_INVALID_PARAMETER KeyData or NotifyHandle or KeyNotificationFunction is NULL. **/ @@ -555,14 +565,14 @@ KeyboardRegisterKeyNotify ( OUT VOID **NotifyHandle ) { - EFI_STATUS Status; - KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; - EFI_TPL OldTpl; - LIST_ENTRY *Link; - KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; - KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify; - - if (KeyData == NULL || NotifyHandle == NULL || KeyNotificationFunction == NULL) { + EFI_STATUS Status; + KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; + EFI_TPL OldTpl; + LIST_ENTRY *Link; + KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; + KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify; + + if ((KeyData == NULL) || (NotifyHandle == NULL) || (KeyNotificationFunction == NULL)) { return EFI_INVALID_PARAMETER; } @@ -586,7 +596,7 @@ KeyboardRegisterKeyNotify ( if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) { if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) { *NotifyHandle = CurrentNotify; - Status = EFI_SUCCESS; + Status = EFI_SUCCESS; goto Exit; } } @@ -595,7 +605,7 @@ KeyboardRegisterKeyNotify ( // // Allocate resource to save the notification function // - NewNotify = (KEYBOARD_CONSOLE_IN_EX_NOTIFY *) AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_EX_NOTIFY)); + NewNotify = (KEYBOARD_CONSOLE_IN_EX_NOTIFY *)AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_EX_NOTIFY)); if (NewNotify == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Exit; @@ -606,8 +616,8 @@ KeyboardRegisterKeyNotify ( CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA)); InsertTailList (&ConsoleInDev->NotifyList, &NewNotify->NotifyEntry); - *NotifyHandle = NewNotify; - Status = EFI_SUCCESS; + *NotifyHandle = NewNotify; + Status = EFI_SUCCESS; Exit: // @@ -615,7 +625,6 @@ Exit: // gBS->RestoreTPL (OldTpl); return Status; - } /** @@ -636,11 +645,11 @@ KeyboardUnregisterKeyNotify ( IN VOID *NotificationHandle ) { - EFI_STATUS Status; - KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; - EFI_TPL OldTpl; - LIST_ENTRY *Link; - KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; + EFI_STATUS Status; + KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; + EFI_TPL OldTpl; + LIST_ENTRY *Link; + KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; if (NotificationHandle == NULL) { return EFI_INVALID_PARAMETER; @@ -693,19 +702,19 @@ Exit: VOID EFIAPI KeyNotifyProcessHandler ( - IN EFI_EVENT Event, - IN VOID *Context + IN EFI_EVENT Event, + IN VOID *Context ) { - EFI_STATUS Status; - KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; - EFI_KEY_DATA KeyData; - LIST_ENTRY *Link; - LIST_ENTRY *NotifyList; - KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; - EFI_TPL OldTpl; + EFI_STATUS Status; + KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; + EFI_KEY_DATA KeyData; + LIST_ENTRY *Link; + LIST_ENTRY *NotifyList; + KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; + EFI_TPL OldTpl; - ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *) Context; + ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *)Context; // // Invoke notification functions. @@ -714,7 +723,7 @@ KeyNotifyProcessHandler ( while (TRUE) { // // Enter critical section - // + // OldTpl = gBS->RaiseTPL (TPL_NOTIFY); Status = PopEfikeyBufHead (&ConsoleIn->EfiKeyQueueForNotify, &KeyData); // @@ -724,6 +733,7 @@ KeyNotifyProcessHandler ( if (EFI_ERROR (Status)) { break; } + for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) { CurrentNotify = CR (Link, KEYBOARD_CONSOLE_IN_EX_NOTIFY, NotifyEntry, KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE); if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) { @@ -732,4 +742,3 @@ KeyNotifyProcessHandler ( } } } -