44 IN EFI_HANDLE ImageHandle,
45 IN EFI_SYSTEM_TABLE *SystemTable
50 Status = EfiLibInstallDriverBindingComponentName2 (
58 ASSERT_EFI_ERROR (Status);
77 IN EFI_DRIVER_BINDING_PROTOCOL *This,
78 IN EFI_HANDLE Controller,
79 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
83 EFI_USB_IO_PROTOCOL *UsbIo;
88 Status =
gBS->OpenProtocol (
90 &gEfiUsbIoProtocolGuid,
92 This->DriverBindingHandle,
94 PcdGetBool (PcdUsbKbDriverTakePrecedence)
95 ? EFI_OPEN_PROTOCOL_GET_PROTOCOL
96 : EFI_OPEN_PROTOCOL_BY_DRIVER
98 if (EFI_ERROR (Status)) {
106 Status = EFI_SUCCESS;
109 Status = EFI_UNSUPPORTED;
114 &gEfiUsbIoProtocolGuid,
115 This->DriverBindingHandle,
142 IN EFI_DRIVER_BINDING_PROTOCOL *This,
143 IN EFI_HANDLE Controller,
144 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
148 EFI_USB_IO_PROTOCOL *UsbIo;
150 UINT8 EndpointNumber;
151 EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
154 UINT8 PollingInterval;
159 OldTpl =
gBS->RaiseTPL (TPL_CALLBACK);
163 Status =
gBS->OpenProtocol (
165 &gEfiUsbIoProtocolGuid,
167 This->DriverBindingHandle,
169 EFI_OPEN_PROTOCOL_BY_DRIVER
171 if (PcdGetBool (PcdUsbKbDriverTakePrecedence)) {
172 if (Status == EFI_ACCESS_DENIED) {
173 Status =
gBS->DisconnectController (
178 if (EFI_ERROR (Status)) {
182 Status =
gBS->OpenProtocol (
184 &gEfiUsbIoProtocolGuid,
186 This->DriverBindingHandle,
188 EFI_OPEN_PROTOCOL_BY_DRIVER
193 if (EFI_ERROR (Status)) {
197 UsbKeyboardDevice = AllocateZeroPool (
sizeof (
USB_KB_DEV));
198 if (UsbKeyboardDevice == NULL) {
205 Status =
gBS->OpenProtocol (
209 This->DriverBindingHandle,
211 EFI_OPEN_PROTOCOL_GET_PROTOCOL
214 if (EFI_ERROR (Status)) {
221 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
223 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_ENABLE),
230 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
232 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT),
236 UsbKeyboardDevice->
UsbIo = UsbIo;
247 UsbIo->UsbGetInterfaceDescriptor (
258 for (Index = 0; Index < EndpointNumber; Index++) {
259 UsbIo->UsbGetEndpointDescriptor (
265 if (((EndpointDescriptor.Attributes & (BIT0 | BIT1)) == USB_ENDPOINT_INTERRUPT) &&
266 ((EndpointDescriptor.EndpointAddress & USB_ENDPOINT_DIR_IN) != 0))
282 EFI_ERROR_CODE | EFI_ERROR_MINOR,
283 (EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED)
288 Status = EFI_UNSUPPORTED;
292 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
294 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DETECTED),
308 InitializeListHead (&UsbKeyboardDevice->
NotifyList);
310 Status =
gBS->CreateEvent (
311 EVT_TIMER | EVT_NOTIFY_SIGNAL,
317 if (!EFI_ERROR (Status)) {
321 if (EFI_ERROR (Status)) {
325 Status =
gBS->CreateEvent (
333 if (EFI_ERROR (Status)) {
337 Status =
gBS->CreateEvent (
344 if (EFI_ERROR (Status)) {
348 Status =
gBS->CreateEvent (
355 if (EFI_ERROR (Status)) {
366 Status =
gBS->InstallMultipleProtocolInterfaces (
368 &gEfiSimpleTextInProtocolGuid,
370 &gEfiSimpleTextInputExProtocolGuid,
374 if (EFI_ERROR (Status)) {
380 if (EFI_ERROR (Status)) {
381 gBS->UninstallMultipleProtocolInterfaces (
383 &gEfiSimpleTextInProtocolGuid,
385 &gEfiSimpleTextInputExProtocolGuid,
399 if (EFI_ERROR (Status)) {
400 gBS->UninstallMultipleProtocolInterfaces (
402 &gEfiSimpleTextInProtocolGuid,
404 &gEfiSimpleTextInputExProtocolGuid,
418 Status = UsbIo->UsbAsyncInterruptTransfer (
428 if (EFI_ERROR (Status)) {
429 gBS->UninstallMultipleProtocolInterfaces (
431 &gEfiSimpleTextInProtocolGuid,
433 &gEfiSimpleTextInputExProtocolGuid,
445 L
"Generic Usb Keyboard",
452 L
"Generic Usb Keyboard",
456 gBS->RestoreTPL (OldTpl);
458 if (PcdGetBool (PcdEnableDisconnectOnExitBootServicesInUsbKbDriver)) {
459 Status =
gBS->CreateEvent (
460 EVT_SIGNAL_EXIT_BOOT_SERVICES,
466 ASSERT_EFI_ERROR (Status);
479 if (UsbKeyboardDevice->
SimpleInput.WaitForKey != NULL) {
493 FreePool (UsbKeyboardDevice);
494 UsbKeyboardDevice = NULL;
498 &gEfiUsbIoProtocolGuid,
499 This->DriverBindingHandle,
504 gBS->RestoreTPL (OldTpl);
527 IN EFI_DRIVER_BINDING_PROTOCOL *This,
528 IN EFI_HANDLE Controller,
529 IN UINTN NumberOfChildren,
530 IN EFI_HANDLE *ChildHandleBuffer
534 EFI_SIMPLE_TEXT_INPUT_PROTOCOL *SimpleInput;
537 Status =
gBS->OpenProtocol (
539 &gEfiSimpleTextInProtocolGuid,
540 (VOID **)&SimpleInput,
541 This->DriverBindingHandle,
543 EFI_OPEN_PROTOCOL_GET_PROTOCOL
545 if (EFI_ERROR (Status)) {
546 return EFI_UNSUPPORTED;
549 Status =
gBS->OpenProtocol (
551 &gEfiSimpleTextInputExProtocolGuid,
553 This->DriverBindingHandle,
555 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
557 if (EFI_ERROR (Status)) {
558 return EFI_UNSUPPORTED;
566 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
568 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DISABLE),
575 UsbKeyboardDevice->
UsbIo->UsbAsyncInterruptTransfer (
576 UsbKeyboardDevice->
UsbIo,
587 &gEfiUsbIoProtocolGuid,
588 This->DriverBindingHandle,
592 if ( !PcdGetBool (PcdEnableDisconnectOnExitBootServicesInUsbKbDriver)
597 Status =
gBS->UninstallMultipleProtocolInterfaces (
599 &gEfiSimpleTextInProtocolGuid,
601 &gEfiSimpleTextInputExProtocolGuid,
615 if (PcdGetBool (PcdEnableDisconnectOnExitBootServicesInUsbKbDriver)) {
631 FreePool (UsbKeyboardDevice);
655 OUT EFI_KEY_DATA *KeyData
658 if (KeyData == NULL) {
659 return EFI_INVALID_PARAMETER;
663 ZeroMem (&KeyData->Key, sizeof (KeyData->Key));
665 return EFI_NOT_READY;
668 Dequeue (&UsbKeyboardDevice->EfiKeyQueue, KeyData, sizeof (*KeyData));
691 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
692 IN BOOLEAN ExtendedVerification
700 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
702 (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_RESET),
710 if (!ExtendedVerification) {
711 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
713 (EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_CLEAR_BUFFER),
730 if (EFI_ERROR (Status)) {
731 return EFI_DEVICE_ERROR;
753 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
754 OUT EFI_INPUT_KEY *Key
759 EFI_KEY_DATA KeyData;
770 if (EFI_ERROR (Status)) {
777 if ((KeyData.Key.ScanCode == CHAR_NULL) && (KeyData.Key.UnicodeChar == SCAN_NULL)) {
785 if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) {
786 if ((KeyData.Key.UnicodeChar >= L
'a') && (KeyData.Key.UnicodeChar <= L
'z')) {
787 KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L
'a' + 1);
788 }
else if ((KeyData.Key.UnicodeChar >= L
'A') && (KeyData.Key.UnicodeChar <= L
'Z')) {
789 KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L
'A' + 1);
793 CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
814 EFI_KEY_DATA KeyData;
822 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
837 sizeof (EFI_KEY_DATA)
839 if ((KeyData.Key.ScanCode == SCAN_NULL) && (KeyData.Key.UnicodeChar == CHAR_NULL)) {
844 gBS->SignalEvent (Event);
851 gBS->RestoreTPL (OldTpl);
870 EFI_KEY_DATA KeyData;
878 Status =
USBParseKey (UsbKeyboardDevice, &KeyCode);
879 if (EFI_ERROR (Status)) {
887 if (EFI_ERROR (Status)) {
916 gBS->DisconnectController (
934 IN OUT LIST_ENTRY *NotifyList
940 if (NotifyList == NULL) {
941 return EFI_INVALID_PARAMETER;
944 while (!IsListEmpty (NotifyList)) {
945 Link = GetFirstNode (NotifyList);
947 RemoveEntryList (Link);
948 FreePool (NotifyNode);
966 IN EFI_KEY_DATA *RegsiteredData,
967 IN EFI_KEY_DATA *InputData
970 ASSERT (RegsiteredData != NULL && InputData != NULL);
972 if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
973 (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar))
981 if ((RegsiteredData->KeyState.KeyShiftState != 0) &&
982 (RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState))
987 if ((RegsiteredData->KeyState.KeyToggleState != 0) &&
988 (RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState))
1025 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
1026 IN BOOLEAN ExtendedVerification
1035 if (EFI_ERROR (Status)) {
1036 return EFI_DEVICE_ERROR;
1039 UsbKeyboardDevice->
KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
1040 UsbKeyboardDevice->
KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
1062 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
1063 OUT EFI_KEY_DATA *KeyData
1068 if (KeyData == NULL) {
1069 return EFI_INVALID_PARAMETER;
1094 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
1095 IN EFI_KEY_TOGGLE_STATE *KeyToggleState
1100 if (KeyToggleState == NULL) {
1101 return EFI_INVALID_PARAMETER;
1106 if (((UsbKeyboardDevice->
KeyState.KeyToggleState & EFI_TOGGLE_STATE_VALID) != EFI_TOGGLE_STATE_VALID) ||
1107 ((*KeyToggleState & EFI_TOGGLE_STATE_VALID) != EFI_TOGGLE_STATE_VALID))
1109 return EFI_UNSUPPORTED;
1116 UsbKeyboardDevice->
ScrollOn = FALSE;
1118 UsbKeyboardDevice->
CapsOn = FALSE;
1121 if ((*KeyToggleState & EFI_SCROLL_LOCK_ACTIVE) == EFI_SCROLL_LOCK_ACTIVE) {
1122 UsbKeyboardDevice->
ScrollOn = TRUE;
1125 if ((*KeyToggleState & EFI_NUM_LOCK_ACTIVE) == EFI_NUM_LOCK_ACTIVE) {
1129 if ((*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == EFI_CAPS_LOCK_ACTIVE) {
1130 UsbKeyboardDevice->
CapsOn = TRUE;
1133 if ((*KeyToggleState & EFI_KEY_STATE_EXPOSED) == EFI_KEY_STATE_EXPOSED) {
1139 UsbKeyboardDevice->
KeyState.KeyToggleState = *KeyToggleState;
1166 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
1167 IN EFI_KEY_DATA *KeyData,
1168 IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
1169 OUT VOID **NotifyHandle
1175 LIST_ENTRY *NotifyList;
1178 if ((KeyData == NULL) || (NotifyHandle == NULL) || (KeyNotificationFunction == NULL)) {
1179 return EFI_INVALID_PARAMETER;
1189 for (Link = GetFirstNode (NotifyList);
1190 !IsNull (NotifyList, Link);
1191 Link = GetNextNode (NotifyList, Link))
1193 CurrentNotify = CR (
1201 *NotifyHandle = CurrentNotify;
1211 if (NewNotify == NULL) {
1212 return EFI_OUT_OF_RESOURCES;
1220 *NotifyHandle = NewNotify;
1238 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
1239 IN VOID *NotificationHandle
1245 LIST_ENTRY *NotifyList;
1247 if (NotificationHandle == NULL) {
1248 return EFI_INVALID_PARAMETER;
1257 for (Link = GetFirstNode (NotifyList);
1258 !IsNull (NotifyList, Link);
1259 Link = GetNextNode (NotifyList, Link))
1261 CurrentNotify = CR (
1267 if (CurrentNotify == NotificationHandle) {
1273 FreePool (CurrentNotify);
1281 return EFI_INVALID_PARAMETER;
1299 EFI_KEY_DATA KeyData;
1301 LIST_ENTRY *NotifyList;
1315 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
1320 gBS->RestoreTPL (OldTpl);
1321 if (EFI_ERROR (Status)) {
1325 for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
VOID UsbKbFreeAppleKeyMapDb(IN USB_KB_DEV *UsbKeyboardDevice)
VOID UsbKbLocateAppleKeyMapDb(IN USB_KB_DEV *UsbKeyboardDevice)
EFI_DRIVER_BINDING_PROTOCOL gUsbKeyboardDriverBinding
EFI_STATUS USBKeyboardReadKeyStrokeWorker(IN OUT USB_KB_DEV *UsbKeyboardDevice, OUT EFI_KEY_DATA *KeyData)
EFI_STATUS EFIAPI USBKeyboardDriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
VOID EFIAPI KeyNotifyProcessHandler(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS EFIAPI USBKeyboardUnregisterKeyNotify(IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN VOID *NotificationHandle)
EFI_STATUS EFIAPI USBKeyboardResetEx(IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN BOOLEAN ExtendedVerification)
VOID EFIAPI USBKeyboardExitBootServices(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS EFIAPI USBKeyboardRegisterKeyNotify(IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_DATA *KeyData, IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, OUT VOID **NotifyHandle)
EFI_STATUS EFIAPI USBKeyboardDriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer)
EFI_STATUS EFIAPI USBKeyboardDriverBindingEntryPoint(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
VOID EFIAPI USBKeyboardWaitForKey(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS EFIAPI USBKeyboardSetState(IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_TOGGLE_STATE *KeyToggleState)
VOID EFIAPI USBKeyboardTimerHandler(IN EFI_EVENT Event, IN VOID *Context)
STATIC BOOLEAN mExitingBootServices
EFI_STATUS EFIAPI USBKeyboardDriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
EFI_STATUS KbdFreeNotifyList(IN OUT LIST_ENTRY *NotifyList)
EFI_STATUS EFIAPI USBKeyboardReset(IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, IN BOOLEAN ExtendedVerification)
EFI_STATUS EFIAPI USBKeyboardReadKeyStrokeEx(IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, OUT EFI_KEY_DATA *KeyData)
EFI_STATUS EFIAPI USBKeyboardReadKeyStroke(IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, OUT EFI_INPUT_KEY *Key)
BOOLEAN IsKeyRegistered(IN EFI_KEY_DATA *RegsiteredData, IN EFI_KEY_DATA *InputData)
#define USB_KB_DEV_SIGNATURE
#define USB_KB_DEV_FROM_THIS(a)
#define USB_KB_CONSOLE_IN_EX_NOTIFY_SIGNATURE
#define TEXT_INPUT_EX_USB_KB_DEV_FROM_THIS(a)
#define KEYBOARD_TIMER_INTERVAL
EFI_STATUS EFIAPI KeyboardHandler(IN VOID *Data, IN UINTN DataLength, IN VOID *Context, IN UINT32 Result)
VOID SetKeyLED(IN USB_KB_DEV *UsbKeyboardDevice)
VOID DestroyQueue(IN OUT USB_SIMPLE_QUEUE *Queue)
EFI_STATUS InitUSBKeyboard(IN OUT USB_KB_DEV *UsbKeyboardDevice)
EFI_STATUS Dequeue(IN OUT USB_SIMPLE_QUEUE *Queue, OUT VOID *Item, IN UINTN ItemSize)
VOID ReleaseKeyboardLayoutResources(IN OUT USB_KB_DEV *UsbKeyboardDevice)
EFI_STATUS USBParseKey(IN OUT USB_KB_DEV *UsbKeyboardDevice, OUT UINT8 *KeyCode)
VOID InitQueue(IN OUT USB_SIMPLE_QUEUE *Queue, IN UINTN ItemSize)
VOID Enqueue(IN OUT USB_SIMPLE_QUEUE *Queue, IN VOID *Item, IN UINTN ItemSize)
VOID InitializeKeyState(IN USB_KB_DEV *UsbKeyboardDevice, OUT EFI_KEY_STATE *KeyState)
BOOLEAN IsUSBKeyboard(IN EFI_USB_IO_PROTOCOL *UsbIo)
EFI_STATUS UsbKeyCodeToEfiInputKey(IN USB_KB_DEV *UsbKeyboardDevice, IN UINT8 KeyCode, OUT EFI_KEY_DATA *KeyData)
EFI_STATUS InitKeyboardLayout(OUT USB_KB_DEV *UsbKeyboardDevice)
BOOLEAN IsQueueEmpty(IN USB_SIMPLE_QUEUE *Queue)
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gUsbKeyboardComponentName
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gUsbKeyboardComponentName2
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_GUID gEfiDevicePathProtocolGuid
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn
EFI_EVENT KeyNotifyProcessEvent
EFI_HANDLE ControllerHandle
EFI_USB_ENDPOINT_DESCRIPTOR IntEndpointDescriptor
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleInputEx
USB_SIMPLE_QUEUE UsbKeyQueue
EFI_USB_IO_PROTOCOL * UsbIo
EFI_UNICODE_STRING_TABLE * ControllerNameTable
EFI_EVENT ExitBootServicesEvent
USB_SIMPLE_QUEUE EfiKeyQueue
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleInput
USB_SIMPLE_QUEUE EfiKeyQueueForNotify
BOOLEAN IsSupportPartialKey
EFI_DEVICE_PATH_PROTOCOL * DevicePath
EFI_EVENT DelayedRecoveryEvent
EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
VOID * Buffer[MAX_KEY_ALLOWED+1]