diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.h')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.h | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.h b/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.h new file mode 100644 index 00000000..a08c0aaa --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.h @@ -0,0 +1,326 @@ +/** @file + Function prototype for USB Keyboard Driver. + +Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _EFI_KEYBOARD_H_ +#define _EFI_KEYBOARD_H_ + + +#include "EfiKey.h" + +#define USB_KEYBOARD_KEY_COUNT 105 + +#define USB_KEYBOARD_LANGUAGE_STR_LEN 5 // RFC4646 Language Code: "en-US" +#define USB_KEYBOARD_DESCRIPTION_STR_LEN (16 + 1) // Description: "English Keyboard" + +#pragma pack (1) +typedef struct { + // + // This 4-bytes total array length is required by PreparePackageList() + // + UINT32 Length; + + // + // Keyboard Layout package definition + // + EFI_HII_PACKAGE_HEADER PackageHeader; + UINT16 LayoutCount; + + // + // EFI_HII_KEYBOARD_LAYOUT + // + UINT16 LayoutLength; + EFI_GUID Guid; + UINT32 LayoutDescriptorStringOffset; + UINT8 DescriptorCount; + EFI_KEY_DESCRIPTOR KeyDescriptor[USB_KEYBOARD_KEY_COUNT]; + UINT16 DescriptionCount; + CHAR16 Language[USB_KEYBOARD_LANGUAGE_STR_LEN]; + CHAR16 Space; + CHAR16 DescriptionString[USB_KEYBOARD_DESCRIPTION_STR_LEN]; +} USB_KEYBOARD_LAYOUT_PACK_BIN; +#pragma pack() +/** + Uses USB I/O to check whether the device is a USB keyboard device. + + @param UsbIo Pointer to a USB I/O protocol instance. + + @retval TRUE Device is a USB keyboard device. + @retval FALSE Device is a not USB keyboard device. + +**/ +BOOLEAN +IsUSBKeyboard ( + IN EFI_USB_IO_PROTOCOL *UsbIo + ); + +/** + Initialize USB keyboard device and all private data structures. + + @param UsbKeyboardDevice The USB_KB_DEV instance. + + @retval EFI_SUCCESS Initialization is successful. + @retval EFI_DEVICE_ERROR Keyboard initialization failed. + +**/ +EFI_STATUS +InitUSBKeyboard ( + IN OUT USB_KB_DEV *UsbKeyboardDevice + ); + +/** + Initialize USB keyboard layout. + + This function initializes Key Convertion Table for the USB keyboard device. + It first tries to retrieve layout from HII database. If failed and default + layout is enabled, then it just uses the default layout. + + @param UsbKeyboardDevice The USB_KB_DEV instance. + + @retval EFI_SUCCESS Initialization succeeded. + @retval EFI_NOT_READY Keyboard layout cannot be retrieve from HII + database, and default layout is disabled. + @retval Other Fail to register event to EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group. + +**/ +EFI_STATUS +InitKeyboardLayout ( + OUT USB_KB_DEV *UsbKeyboardDevice + ); + +/** + Destroy resources for keyboard layout. + + @param UsbKeyboardDevice The USB_KB_DEV instance. + +**/ +VOID +ReleaseKeyboardLayoutResources ( + IN OUT USB_KB_DEV *UsbKeyboardDevice + ); + +/** + Handler function for USB keyboard's asynchronous interrupt transfer. + + This function is the handler function for USB keyboard's asynchronous interrupt transfer + to manage the keyboard. It parses the USB keyboard input report, and inserts data to + keyboard buffer according to state of modifier keys and normal keys. Timer for repeat key + is also set accordingly. + + @param Data A pointer to a buffer that is filled with key data which is + retrieved via asynchronous interrupt transfer. + @param DataLength Indicates the size of the data buffer. + @param Context Pointing to USB_KB_DEV instance. + @param Result Indicates the result of the asynchronous interrupt transfer. + + @retval EFI_SUCCESS Asynchronous interrupt transfer is handled successfully. + @retval EFI_DEVICE_ERROR Hardware error occurs. + +**/ +EFI_STATUS +EFIAPI +KeyboardHandler ( + IN VOID *Data, + IN UINTN DataLength, + IN VOID *Context, + IN UINT32 Result + ); + +/** + Handler for Delayed Recovery event. + + This function is the handler for Delayed Recovery event triggered + by timer. + After a device error occurs, the event would be triggered + with interval of EFI_USB_INTERRUPT_DELAY. EFI_USB_INTERRUPT_DELAY + is defined in USB standard for error handling. + + @param Event The Delayed Recovery event. + @param Context Points to the USB_KB_DEV instance. + +**/ +VOID +EFIAPI +USBKeyboardRecoveryHandler ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +/** + Retrieves a USB keycode after parsing the raw data in keyboard buffer. + + This function parses keyboard buffer. It updates state of modifier key for + USB_KB_DEV instancem, and returns keycode for output. + + @param UsbKeyboardDevice The USB_KB_DEV instance. + @param KeyCode Pointer to the USB keycode for output. + + @retval EFI_SUCCESS Keycode successfully parsed. + @retval EFI_NOT_READY Keyboard buffer is not ready for a valid keycode + +**/ +EFI_STATUS +USBParseKey ( + IN OUT USB_KB_DEV *UsbKeyboardDevice, + OUT UINT8 *KeyCode + ); + +/** + Converts USB Keycode ranging from 0x4 to 0x65 to EFI_INPUT_KEY. + + @param UsbKeyboardDevice The USB_KB_DEV instance. + @param KeyCode Indicates the key code that will be interpreted. + @param KeyData A pointer to a buffer that is filled in with + the keystroke information for the key that + was pressed. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER KeyCode is not in the range of 0x4 to 0x65. + @retval EFI_INVALID_PARAMETER Translated EFI_INPUT_KEY has zero for both ScanCode and UnicodeChar. + @retval EFI_NOT_READY KeyCode represents a dead key with EFI_NS_KEY_MODIFIER + @retval EFI_DEVICE_ERROR Keyboard layout is invalid. + +**/ +EFI_STATUS +UsbKeyCodeToEfiInputKey ( + IN USB_KB_DEV *UsbKeyboardDevice, + IN UINT8 KeyCode, + OUT EFI_KEY_DATA *KeyData + ); + + +/** + Create the queue. + + @param Queue Points to the queue. + @param ItemSize Size of the single item. + +**/ +VOID +InitQueue ( + IN OUT USB_SIMPLE_QUEUE *Queue, + IN UINTN ItemSize + ); + +/** + Destroy the queue + + @param Queue Points to the queue. +**/ +VOID +DestroyQueue ( + IN OUT USB_SIMPLE_QUEUE *Queue + ); + + +/** + Check whether the queue is empty. + + @param Queue Points to the queue. + + @retval TRUE Queue is empty. + @retval FALSE Queue is not empty. + +**/ +BOOLEAN +IsQueueEmpty ( + IN USB_SIMPLE_QUEUE *Queue + ); + + +/** + Check whether the queue is full. + + @param Queue Points to the queue. + + @retval TRUE Queue is full. + @retval FALSE Queue is not full. + +**/ +BOOLEAN +IsQueueFull ( + IN USB_SIMPLE_QUEUE *Queue + ); + + +/** + Enqueue the item to the queue. + + @param Queue Points to the queue. + @param Item Points to the item to be enqueued. + @param ItemSize Size of the item. +**/ +VOID +Enqueue ( + IN OUT USB_SIMPLE_QUEUE *Queue, + IN VOID *Item, + IN UINTN ItemSize + ); + + +/** + Dequeue a item from the queue. + + @param Queue Points to the queue. + @param Item Receives the item. + @param ItemSize Size of the item. + + @retval EFI_SUCCESS Item was successfully dequeued. + @retval EFI_DEVICE_ERROR The queue is empty. + +**/ +EFI_STATUS +Dequeue ( + IN OUT USB_SIMPLE_QUEUE *Queue, + OUT VOID *Item, + IN UINTN ItemSize + ); + +/** + Handler for Repeat Key event. + + This function is the handler for Repeat Key event triggered + by timer. + After a repeatable key is pressed, the event would be triggered + with interval of USBKBD_REPEAT_DELAY. Once the event is triggered, + following trigger will come with interval of USBKBD_REPEAT_RATE. + + @param Event The Repeat Key event. + @param Context Points to the USB_KB_DEV instance. + +**/ +VOID +EFIAPI +USBKeyboardRepeatHandler ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +/** + Sets USB keyboard LED state. + + @param UsbKeyboardDevice The USB_KB_DEV instance. + +**/ +VOID +SetKeyLED ( + IN USB_KB_DEV *UsbKeyboardDevice + ); + +/** + Initialize the key state. + + @param UsbKeyboardDevice The USB_KB_DEV instance. + @param KeyState A pointer to receive the key state information. +**/ +VOID +InitializeKeyState ( + IN USB_KB_DEV *UsbKeyboardDevice, + OUT EFI_KEY_STATE *KeyState + ); + +#endif |