/** @file Header file for Virtual Keyboard driver. Copyright (c) 2012 - 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _VIRTUAL_KEYBOARD_H_ #define _VIRTUAL_KEYBOARD_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ComponentName.h" // // Global Variables // extern EFI_DRIVER_BINDING_PROTOCOL gVirtualKeyboardDriverBinding; extern EFI_COMPONENT_NAME_PROTOCOL gVirtualKeyboardComponentName; extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2; /// /// Debug raw data points /// #define DEBUG_VK_POINTS DEBUG_INFO /// /// Debug data point scaling /// #define DEBUG_VK_POINT_SCALING DEBUG_INFO /// /// Debug key press /// #define DEBUG_VK_KEYS DEBUG_INFO /// /// Debug routine entry and exit /// #define DEBUG_VK_ROUTINE_ENTRY_EXIT DEBUG_VERBOSE /// /// Display the graphics info /// #define DEBUG_VK_GRAPHICS_INFO DEBUG_INFO /// /// Display the timer entry and exit /// #define DEBUG_VK_TIMER_ENTRY_EXIT DEBUG_VERBOSE /// /// Signature /// #define VK_SIGNATURE SIGNATURE_32 ('V', 'K', 'e', 'y') #define VK_NOTIFY_SIGNATURE SIGNATURE_32 ('V', 'K', 'n', 's') /// /// Poll interval /// #define VK_POLL_INTERVAL (1000 * 1000) /// /// Define the touch timeout in poll intervals /// #define VK_REPEAT_TIMEOUT 5 /// /// TPL used to synchronize add/remove from list /// #define TPL_VK_SYNC TPL_NOTIFY /// /// Dimension of an array ( number of elements ) /// #define DIM(x) ( sizeof ( x ) / sizeof ( x [ 0 ])) /// /// Define Key buffer /// #define MAX_KEY_BUF_SIZE 64 /// /// Define Transparent Weight /// #define TRANSPARENCY_WEIGHT 50 typedef struct _VK_CONTEXT VK_CONTEXT; typedef enum _VK_KEY_TYPE { VkKeyNull = 0x0000 | CHAR_NULL, VkKeyBackspace = 0x0000 | CHAR_BACKSPACE, VkKeyTab = 0x0000 | CHAR_TAB, VkKeyEnter = 0x0000 | CHAR_CARRIAGE_RETURN, VkKeyScanMask = 0x1000, VkKeyEsc = 0x1000 | SCAN_ESC, VkKeyLeft = 0x1000 | SCAN_LEFT, VkKeyRight = 0x1000 | SCAN_RIGHT, VkKeyUp = 0x1000 | SCAN_UP, VkKeyDown = 0x1000 | SCAN_DOWN, VkKeyF1 = 0x1000 | SCAN_F1, VkKeyF2 = 0x1000 | SCAN_F2, VkKeyF3 = 0x1000 | SCAN_F3, VkKeyF4 = 0x1000 | SCAN_F4, VkKeyF5 = 0x1000 | SCAN_F5, VkKeyF6 = 0x1000 | SCAN_F6, VkKeyF7 = 0x1000 | SCAN_F7, VkKeyF8 = 0x1000 | SCAN_F8, VkKeyF9 = 0x1000 | SCAN_F9, VkKeyF10 = 0x1000 | SCAN_F10, VkKeyF11 = 0x1000 | SCAN_F11, VkKeyF12 = 0x1000 | SCAN_F12, VkKeySpecificMask = 0x2000, VkKeyShift = 0x2000 | 0x0000, VkKeyCapslock = 0x2000 | 0x0001, VkKeyTwoPage = 0x2000 | 0x0002, VkKeyTypeMaximum = 0xFFFF } VK_KEY_TYPE; typedef enum _VK_PAGE_TYPE { // // +---+---+---+---+---+---+---+---+---+---+---+ // | q | w | e | r | t | y | u | i | o | p | | ? |F11|F12|Enter| Line 2 // +-----+---+---+---+---+---+---+---+---+---+-+ // | Esc |12#| Space | | | _ | + | | Line 3 // +-----+---+-------------------+---+---+---+-+ // VkPage3, VkPageMaximum } VK_PAGE_TYPE; typedef enum VK_DISPLAY_ATTRIBUTE { VkDisplayAttributeNone, /// No keyboard displayed VkDisplayAttributeFullTop, /// Full keyboard display at top VkDisplayAttributeFullBottom, /// Full keyboard display at bottom VkDisplayAttributeSimpleTop, /// Simple keyboard display at top VkDisplayAttributeSimpleBottom, /// Simple keyboard display at bottom VkDisplayAttributeMaximum } VK_DISPLAY_ATTRIBUTE; typedef struct _VK_STRUCT { UINT16 DisStartX; UINT16 DisStartY; UINT16 DisEndX; UINT16 DisEndY; VK_KEY_TYPE PageFont[VkPageMaximum]; } VK_STRUCT; typedef struct _VK_NOTIFY { UINTN Signature; EFI_KEY_DATA KeyData; EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn; LIST_ENTRY NotifyEntry; } VK_NOTIFY; /// /// Virtual Keyboard context /// struct _VK_CONTEXT { /// /// Structure identification /// UINTN Signature; /// /// Controller Handle /// EFI_HANDLE Controller; /// /// Upper level API /// EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn; /// /// Simple Text In EX /// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx; /// /// Lower level APIs /// EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; /// /// Flag when the last poll indicated a touch event /// BOOLEAN TouchActive; /// /// Time to poll for touch input /// EFI_EVENT TimerEvent; /// /// HII handle to get image data used /// EFI_HII_HANDLE HiiHandle; EFI_HII_IMAGE_EX_PROTOCOL *HiiImageEx; /// /// Keyboard body background buffer information /// EFI_GRAPHICS_OUTPUT_BLT_PIXEL *VkBodyBackgroundBltBuffer; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *VkBodyCompoundBltBuffer; UINTN VkBodyBltSize; UINTN VkBodyBltStartX; UINTN VkBodyBltStartY; UINTN VkBodyBltHeight; UINTN VkBodyBltWidth; BOOLEAN IsBackgroundChanged; /// /// Icon buffer information /// EFI_GRAPHICS_OUTPUT_BLT_PIXEL *IconBltBuffer; UINTN IconBltSize; UINTN IconBltHeight; UINTN IconBltWidth; /// /// Full icon background buffer information /// EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FullIconBackBuffer; UINTN FullIconBackStartX; UINTN FullIconBackStartY; UINTN FullIconBackHeight; UINTN FullIconBackWidth; UINTN FullIconBackSize; BOOLEAN FullIconUpdatedFlag; /// /// Simple icon background buffer information /// EFI_GRAPHICS_OUTPUT_BLT_PIXEL *SimIconBackBuffer; UINTN SimIconBackStartX; UINTN SimIconBackStartY; UINTN SimIconBackHeight; UINTN SimIconBackWidth; UINTN SimIconBackSize; BOOLEAN SimIconUpdatedFlag; /// /// Small Icon /// EFI_IMAGE_INPUT *SmallIcon; /// /// Full Icon /// EFI_IMAGE_INPUT *FullIcon; /// /// Simple Key body /// EFI_IMAGE_INPUT *SimKeyBody; /// /// Digital key body /// EFI_IMAGE_INPUT *DigKeyBody; /// /// Capital Letter Key board /// EFI_IMAGE_INPUT *CapLeKeyBody; /// /// Screen check buffer. /// This is used to check if screen is kept scrolling up. /// EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ScreenCheckBuffer; UINTN ScreenCheckBufferSize; /// /// Key state /// BOOLEAN KeyPressed; /// /// Keyboard display status /// VK_DISPLAY_ATTRIBUTE CurrentKeyboardDisplay; VK_DISPLAY_ATTRIBUTE TargetKeyboardDisplay; /// /// Keyboard icon display status /// BOOLEAN IsIconShowed; UINT8 IconReDrawCheck; /// /// Keyboard body Image address /// Size of KeyboardBodyPtr must larger than mFullKeyboardBody /// UINT32 NumOfKeysInfo; VK_STRUCT KeyboardBodyPtr[50]; /// /// KeyBuffer /// EFI_EVENT KeyNotifyProcessEvent; EFI_KEY_TOGGLE_STATE KeyToggleState; EFI_KEY_DATA Keybuffer[MAX_KEY_BUF_SIZE]; UINT8 KeyStartIndex; UINT8 KeyEndIndex; UINT16 KeyTouchedTimeOut; BOOLEAN IsShiftKeyFlag; BOOLEAN IsCapsLockFlag; BOOLEAN IsSupportPartialKey; BOOLEAN IsRedrawUpdateUI; VK_PAGE_TYPE PageNumber; LIST_ENTRY NotifyList; /// /// Previous X and Y axis Buffer /// UINTN PreviousX; UINTN PreviousY; }; /// /// Locate VK_CONTEXT from protocol /// #define VK_CONTEXT_FROM_PROTOCOL(a) CR (a, VK_CONTEXT, SimpleTextIn, VK_SIGNATURE) #define VK_CONTEXT_FROM_SIMPLETEXTINEX_PROTOCOL(a) CR (a, VK_CONTEXT, SimpleTextInEx, VK_SIGNATURE) #define VK_CONTEXT_FROM_VKBD_PROTOCOL(a) CR (a, VK_CONTEXT, VkbdProtocol, VK_SIGNATURE) /** Start the virtual keyboard driver This routine allocates the necessary resources for the driver. This routine is called by VirtualKeyboardDriverStart to complete the driver initialization. @param[in, out] VkContext Address of an VK_CONTEXT structure @param[in] Controller Handle of device to work with. @retval EFI_SUCCESS Driver API properly initialized **/ EFI_STATUS VkApiStart ( IN OUT VK_CONTEXT *VkContext, IN EFI_HANDLE Controller ); /** Stop the virtual keyboard driver This routine releases the resources allocated by VKApiStart. This routine is called by VirtualKeyboardDriverStop to initiate the driver shutdown. @param[in] VkContext Address of an VK_CONTEXT structure **/ VOID VkApiStop ( IN VK_CONTEXT *VkContext ); /** Resets the input device hardware. The Reset() function resets the input device hardware. As part of initialization process, the firmware/device will make a quick but reasonable attempt to verify that the device is functioning. If the ExtendedVerification flag is TRUE the firmware may take an extended amount of time to verify the device is operating on reset. Otherwise the reset operation is to occur as quickly as possible. The hardware verification process is not defined by this specification and is left up to the platform firmware or driver to implement. @param[in] This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. @param[in] ExtendedVerification Indicates that the driver may perform a more exhaustive verification operation of the device during reset. @retval EFI_SUCCESS The device was reset. @retval EFI_DEVICE_ERROR The device is not functioning correctly and could not be reset. **/ EFI_STATUS EFIAPI VkKeyboardReset ( IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); /** Reads the next keystroke from the input device. The WaitForKey Event can be used to test for existence of a keystroke via WaitForEvent () call. @param[in] This Protocol instance pointer. @param[out] Key Driver may perform diagnostics on reset. @retval EFI_SUCCESS The keystroke information was returned. @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_UNSUPPORTED The device does not support the ability to read keystroke data. **/ EFI_STATUS EFIAPI VkKeyboardReadKeyStroke ( IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, OUT EFI_INPUT_KEY *Key ); /** Resets the input device hardware. The Reset() function resets the input device hardware. As part of initialization process, the firmware/device will make a quick but reasonable attempt to verify that the device is functioning. If the ExtendedVerification flag is TRUE the firmware may take an extended amount of time to verify the device is operating on reset. Otherwise the reset operation is to occur as quickly as possible. The hardware verification process is not defined by this specification and is left up to the platform firmware or driver to implement. @param[in] This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance. @param[in] ExtendedVerification Indicates that the driver may perform a more exhaustive verification operation of the device during reset. @retval EFI_SUCCESS The device was reset. @retval EFI_DEVICE_ERROR The device is not functioning correctly and could not be reset. **/ EFI_STATUS EFIAPI VkKeyboardResetEx ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); /** Reads the next keystroke from the input device. @param[in] This Protocol instance pointer. @param[out] KeyData A pointer to a buffer that is filled in with the keystroke 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 available. @retval EFI_INVALID_PARAMETER This or KeyData is NULL. @retval EFI_UNSUPPORTED The device does not support the ability to read keystroke data. **/ EFI_STATUS EFIAPI VkKeyboardReadKeyStrokeEx ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, OUT EFI_KEY_DATA *KeyData ); /** Set certain state for the input device. @param[in] This Protocol instance pointer. @param[in] KeyToggleState A pointer to the EFI_KEY_TOGGLE_STATE to set the state for the input device. @retval EFI_SUCCESS The device state was set appropriately. @retval EFI_INVALID_PARAMETER This or KeyToggleState is NULL. **/ EFI_STATUS EFIAPI VkKeyboardSetState ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_TOGGLE_STATE *KeyToggleState ); /** Register a notification function for a particular keystroke for the input device. @param[in] This Protocol instance pointer. @param[in] KeyData A pointer to a buffer that is filled in with the keystroke information data for the key that was pressed. @param[in] KeyNotificationFunction Points to the function to be called when the key sequence is typed specified by KeyData. @param[out] 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 necessary data structures. @retval EFI_INVALID_PARAMETER KeyData or NotifyHandle or KeyNotificationFunction is NULL. **/ EFI_STATUS EFIAPI VkKeyboardRegisterKeyNotify ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_DATA *KeyData, IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, OUT EFI_HANDLE *NotifyHandle ); /** Remove a registered notification function from a particular keystroke. @param[in] This Protocol instance pointer. @param[in] NotificationHandle The handle of the notification function being unregistered. @retval EFI_SUCCESS The notification function was unregistered successfully. @retval EFI_INVALID_PARAMETER The NotificationHandle is invalid **/ EFI_STATUS EFIAPI VkKeyboardUnregisterKeyNotify ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_HANDLE NotificationHandle ); /** Draw key board on the display @param[in] VkContext Graphic Protocol for draw the alphabet. @retval EFI_SUCCESS Draw keyboard was done. @retval EFI_UNSUPPORTED Did not get key mapping table. **/ EFI_STATUS DrawKeyboardLayout ( IN VK_CONTEXT *VkContext ); /** Clear the keyboard body @param[in] VkContext Code context. @retval EFI_SUCCESS Clear rectangle is done. **/ EFI_STATUS HideVkBody ( IN VK_CONTEXT *VkContext ); /** Clear the keyboard icon @param[in] VkContext Code context. @retval EFI_SUCCESS Clear rectangle is done. **/ EFI_STATUS HideVkIcon ( IN VK_CONTEXT *VkContext ); /** Use to draw the keyboard icon. @param[in] VkContext Pointer to virtual keyboard's context @param[in] VkImage Image of keyboard to display on the screen. @param[in] Attribute Attribute of keyboard to display on the screen. @retval EFI_SUCCESS ConsoleControl has been flipped to graphics and keyboard icon displayed. @retval EFI_UNSUPPORTED KeyboardFile not found @retval EFI_INVALID_PARAMETER Attribute is unknown. **/ EFI_STATUS EFIAPI DrawVkIcon ( IN VK_CONTEXT *VkContext, IN EFI_IMAGE_INPUT *VkImage, IN VK_DISPLAY_ATTRIBUTE Attribute ); /** Use to draw the keyboard. @param[in] VkContext Pointer to virtual keyboard's context @param[in] VkImage Image of keyboard to display on the screen. @param[in] Attribute Attribute of keyboard to display on the screen. @retval EFI_SUCCESS ConsoleControl has been flipped to graphics and keyboard displayed. @retval EFI_UNSUPPORTED KeyboardFile not found @retval EFI_INVALID_PARAMETER Attribute is unknown. **/ EFI_STATUS EFIAPI DrawVkBody ( IN VK_CONTEXT *VkContext, IN EFI_IMAGE_INPUT *VkImage, IN VK_DISPLAY_ATTRIBUTE Attribute ); /** Get unicode by VkContext->PageNumber and VkContext->KeyboardBodyPtr. @param[in] VkContext Address of an VK_CONTEXT structure. @param[in] KeyItem Key Item. @param[out] FontPtr Follow VkContext->PageNumber to translate font unicode. @retval EFI_SUCCESS Finish translating FontPtr. @retval EFI_INVALID_PARAMETER VkContext or FontPtr is NULL. **/ EFI_STATUS VkGetMappingFont ( IN VK_CONTEXT *VkContext, IN VK_STRUCT KeyItem, OUT UINT32 *FontPtr ); /** This routine is used to check if icon has been cleared. @param[in] VkContext Pointer to virtual keyboard's context @retval EFI_SUCCESS Function completed. **/ EFI_STATUS CheckIconCleared ( IN VK_CONTEXT *VkContext ); /** ConvertCoordinate - Convert the touch panel's coordinate to display's coordinate. @param[in] VkContext Virtual Keyboard context. @param[in] Point The coordinate reported from touch panel. @param[out] TouchX The coordinate X converted to display panel. @param[out] TouchY The coordinate Y converted to display panel.. @retval EFI_SUCCESS Convert success. **/ EFI_STATUS ConvertCoordinate ( IN VK_CONTEXT *VkContext, IN EFI_ABSOLUTE_POINTER_STATE Point, OUT UINT32 *TouchX, OUT UINT32 *TouchY ); /** This routine is used to check if screen has been cleared. @param[in] VkContext Pointer to virtual keyboard's context @retval EFI_SUCCESS Function completed. **/ EFI_STATUS CheckScreenCleared ( IN VK_CONTEXT *VkContext ); /** This routine is used to check if background beneath virtual keyboard has been cleared. @param[in] VkContext Pointer to virtual keyboard's context @retval EFI_SUCCESS Function completed. **/ EFI_STATUS CheckBackgroundChanged ( IN VK_CONTEXT *VkContext ); /** To prevent screen keyboard layout occur scroll up @param[in, out] VkContext Address of an VK_CONTEXT structure. **/ VOID PreventScreenScrollUp ( IN OUT VK_CONTEXT *VkContext ); /** Set the position of character. @param[in] VkContext Address of an VK_CONTEXT structure. @param[in] DestX X position. @param[in] DestY Y position. @retval EFI_SUCCESS Success for the function. @retval Others An unexpected error occurred. **/ EFI_STATUS SetCharacterPosition ( IN VK_CONTEXT *VkContext, IN UINT32 DestX, IN UINT32 DestY ); /** Set the keyboard layout. @param[in] VkContext Graphic Protocol for draw the alphabet. @param[in] Index The layout selected. @retval EFI_SUCCESS Draw keyboard was done. @retval Others An unexpected error occurred. **/ EFI_STATUS KeyboardLayoutHandler ( IN VK_CONTEXT *VkContext, IN UINT32 Index ); /** Save the background blt buffer. @param[in] VkContext Address of an VK_CONTEXT structure. @param[in] BltSize Size of blt. @retval EFI_SUCCESS Success for the function. @retval EFI_OUT_OF_RESOURCES Allocate memory failed. **/ EFI_STATUS EFIAPI SaveVkBodyBackgroundBltBuffer ( IN VK_CONTEXT *VkContext, IN UINTN BltSize ); /** Restore the background blt buffer. @param[in] VkContext Address of an VK_CONTEXT structure. @retval EFI_SUCCESS Success for the function. @retval EFI_UNSUPPORTED Input blt buffer is NULL. @retval Others An unexpected error occurred. **/ EFI_STATUS EFIAPI RestoreVkBodyBackgroundBltBuffer ( IN VK_CONTEXT *VkContext ); /** Save the icon background blt buffer. @param[in] VkContext Address of an VK_CONTEXT structure. @param[in] IconType The icon type. @retval EFI_SUCCESS Success for the function. @retval EFI_OUT_OF_RESOURCES Allocate memory failed. @retval Others An unexpected error occurred. **/ EFI_STATUS EFIAPI SaveVkIconBackgroundBltBuffer ( IN VK_CONTEXT *VkContext, IN VK_DISPLAY_ATTRIBUTE IconType ); #endif