/** @file Common Utility Header for SetupMouse ;****************************************************************************** ;* Copyright (c) 2012 - 2021, Insyde Software Corp. All Rights Reserved. ;* ;* You may not reproduce, distribute, publish, display, perform, modify, adapt, ;* transmit, broadcast, present, recite, release, license or otherwise exploit ;* any part of this publication in any form, by any means, without the prior ;* written permission of Insyde Software Corporation. ;* ;****************************************************************************** */ #ifndef _SETUP_MOUSE_H #define _SETUP_MOUSE_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //[-start-210913-Dongxu0016-modify]// #ifdef LCFC_SUPPORT #define MOUSE_RESOLUTION 0xA00 #else #define MOUSE_RESOLUTION 0x1400 #endif //[-end-210913-Dongxu0016-modify]// #define TICKS_PER_MS 10000U #define TICKS_PER_SECOND 10000000U // // Too small value (<= 10ms) will cause I2C bus master timer callback cannot be trigger. // Please keep MOUSE_TIMER is larger than 10 ms // #define MOUSE_TIMER (20 * TICKS_PER_MS) #define SETUP_MOUSE_SIGNATURE SIGNATURE_32('S','t','p','m') #define STATE_BUFFER_SIZE 32 typedef struct _POINTER_PROTOCOL_INFO_DATA { UINTN Attributes; VOID *PointerProtocol; } POINTER_PROTOCOL_INFO_DATA; #define ATTRIBUTE_BIT_SIMPLE_OR_ABSOLUTE (1 << 0) // Bit 0 #define ATTRIBUTE_VALUE_SIMPLE (0 << 0) // Bit 0 clear #define ATTRIBUTE_VALUE_ABSOLUTE (1 << 0) // Bit 0 set typedef struct _POINTER_PROTOCOL_INFO { UINTN Count; POINTER_PROTOCOL_INFO_DATA Data[1]; } POINTER_PROTOCOL_INFO; typedef struct { BOOLEAN Visible; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Image; RECT ImageRc; } IMAGE_INFO; typedef struct { UINT32 Signature; LIST_ENTRY Link; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; UINT32 BytesPerScanLine; EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT OrgBlt; EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT OriginalBlt; EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE OriginalSetMode; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BlendBuffer; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *CheckBuffer; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FillLine; IMAGE_INFO Screen; RECT InvalidateRc; //[-start-210806-FLINT00014-remove]// //[-start-211109-FLINT00029-modify]// #ifdef LCFC_SUPPORT EFI_DEVICE_PATH_PROTOCOL *DevicePath; #endif //[-end-211109-FLINT00029-modify]// //[-end-210806-FLINT00014-remove]// } GOP_ENTRY; #define GOP_ENTRY_SIGNATURE SIGNATURE_32 ('G', 'O', 'P', 'E') #define GOP_ENTRY_FROM_THIS(a) CR (a, GOP_ENTRY, Link, GOP_ENTRY_SIGNATURE); typedef struct _SETUP_MOUSE_KEYBOARD SETUP_MOUSE_KEYBOARD; typedef struct { UINT32 CurrentX; UINT32 CurrentY; UINT32 CurrentZ; BOOLEAN LButton; BOOLEAN RButton; } SETUP_MOUSE_STATE; #define SETUP_MOUSE_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('S', 'C', 'E', 'N') #define SETUP_MOUSE_KEYBOARD_CONSOLE_IN_EX_NOTIFY_FROM_THIS(a) CR (a, SETUP_MOUSE_KEYBOARD_CONSOLE_IN_EX_NOTIFY, Link, SETUP_MOUSE_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE); typedef struct { UINTN Signature; LIST_ENTRY Link; EFI_KEY_DATA KeyData; EFI_KEY_NOTIFY_FUNCTION KeyNotifyFn; } SETUP_MOUSE_KEYBOARD_CONSOLE_IN_EX_NOTIFY; typedef struct { UINT32 Signature; EFI_HANDLE Handle; EFI_SETUP_MOUSE_PROTOCOL SetupMouse; POINTER_PROTOCOL_INFO *PointerProtocolInfo; LIST_ENTRY GopList; EFI_LOCK SetupMouseLock; EFI_EVENT MouseHotplugEvent; EFI_EVENT TouchHotplugEvent; EFI_EVENT GopHotplugEvent; //[-start-210806-FLINT00014-remove]// //[-start-211109-FLINT00029-modify]// #ifdef LCFC_SUPPORT EFI_EVENT EdidActiveHotplugEvent; #endif //[-end-211109-FLINT00029-modify]// //[-end-210806-FLINT00014-remove]// // // SetupMouse data // BOOLEAN IsStart; BOOLEAN HaveRawData; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *CheckBuffer; BOOLEAN IsCsmEnabled; BOOLEAN NeedSyncFrameBuffer; EFI_IMAGE_START OrgStartImage; // // Cursor data // MOUSE_CURSOR_RANGE MouseRange; BOOLEAN LButton, RButton; IMAGE_INFO Cursor; BOOLEAN HideCursorWhenTouch; BOOLEAN HideCursor; UINT32 SaveCursorX; UINT32 SaveCursorY; // // Keyboard data // SETUP_MOUSE_KEYBOARD *KeyboardData; IMAGE_INFO Keyboard; KEYBOARD_ATTRIBUTES SaveKeyboardAttributes; // // Setup Mouse state queue buffer // SETUP_MOUSE_STATE State[STATE_BUFFER_SIZE]; UINTN BufferIn; UINTN BufferOut; EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *SimpleTextInputEx; EFI_INPUT_READ_KEY_EX OrgReadKeyStrokeEx; EFI_EVENT CheckReadKeyEvent; EFI_EVENT DisableCheckReadKeyEvent; UINTN NoReadKeyCount; BOOLEAN FirstIn; BOOLEAN FirstDisplayKB; BOOLEAN ReadKeyFlag; BOOLEAN InStartImage; //BOOLEAN SetupMouseIsStart; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_SIMPLE_POINTER_PROTOCOL *SimplePointer; EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer; } PRIVATE_MOUSE_DATA; extern PRIVATE_MOUSE_DATA *mPrivate; #define SETUP_MOUSE_DEV_FROM_THIS(a) \ CR(a, PRIVATE_MOUSE_DATA, SetupMouse, SETUP_MOUSE_SIGNATURE) // // Keyboard State in BDA // #define BDA_QUALIFIER_STAT 0x417 typedef struct { UINT8 RightShift : 1; UINT8 LeftShift : 1; UINT8 Ctrl : 1; UINT8 Alt : 1; UINT8 ScrollLock : 1; UINT8 NumLock : 1; UINT8 CapsLock : 1; UINT8 Insert : 1; } QUALIFIER_STAT; // // Setup Mouse services // EFI_STATUS EFIAPI SetupMouseStart ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse ); EFI_STATUS EFIAPI SetupMouseClose ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse ); EFI_STATUS EFIAPI QueryState ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, OUT UINTN *X, OUT UINTN *Y, OUT BOOLEAN *LeftButton, OUT BOOLEAN *RightButton ); EFI_STATUS EFIAPI StartKeyboard ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN UINTN X, IN UINTN Y ); EFI_STATUS EFIAPI InternalStartKeyboard ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN UINTN X, IN UINTN Y ); EFI_STATUS EFIAPI CloseKeyboard ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse ); EFI_STATUS InternalCloseKeyboard ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse ); EFI_STATUS EFIAPI SetupMouseSetMode ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN EFI_SETUP_MOUSE_SCREEN_MODE Mode ); EFI_STATUS EFIAPI SetupMouseSetKeyboardAttributes ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN KEYBOARD_ATTRIBUTES *KeyboardState ); EFI_STATUS EFIAPI SetupMouseSetMouseAttributes ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN MOUSE_ATTRIBUTES *MouseAttributes ); EFI_STATUS EFIAPI SetupMouseGetMouseAttributes ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, OUT MOUSE_ATTRIBUTES *MouseAttributes ); EFI_STATUS EFIAPI SetupMouseGetKeyboardAttributes ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN KEYBOARD_ATTRIBUTES *KeyboardState ); EFI_STATUS InternalSetupMouseSetKeyboardAttributes ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN KEYBOARD_ATTRIBUTES *KeyboardState ); EFI_STATUS InternalSetupMouseGetKeyboardAttributes ( IN EFI_SETUP_MOUSE_PROTOCOL *SetupMouse, IN KEYBOARD_ATTRIBUTES *KeyboardState ); // // Setup Mouse event function // VOID EFIAPI ProcessMouse ( IN EFI_EVENT Event, IN VOID *Context ); EFI_STATUS UpdateKeyboardStateByBDA ( VOID ); EFI_STATUS EFIAPI SetupMouseScreenBlt ( IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN UINTN SourceX, IN UINTN SourceY, IN UINTN DestinationX, IN UINTN DestinationY, IN UINTN Width, IN UINTN Height, IN UINTN Delta OPTIONAL ); // // SetupMouse Misc function // EFI_STATUS GetStartOffset ( IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, OUT UINTN *OffsetX, OUT UINTN *OffsetY ); EFI_STATUS InitializeCursor ( IN PRIVATE_MOUSE_DATA *Private ); VOID DestroyCursor ( IN PRIVATE_MOUSE_DATA *Private ); EFI_STATUS ProcessKeyboard ( VOID ); EFI_STATUS RenderImage ( IN PRIVATE_MOUSE_DATA *Private, IN GOP_ENTRY *GopEntry, IN BOOLEAN NeedSyncScreen ); VOID HideImage ( IN IMAGE_INFO *ImageInfo ); VOID MoveImage ( IN IMAGE_INFO *ImageInfo, IN UINTN X, IN UINTN Y ); VOID RenderImageForAllGop ( IN PRIVATE_MOUSE_DATA *Private ); VOID DestroyImage ( IN IMAGE_INFO *ImageInfo ); UINTN GetStringWidth ( IN CHAR16 *String ); EFI_STATUS SetupMouseDrawText ( IN IMAGE_INFO *ImageInfo, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *TextColor, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackgroundColor, IN EFI_STRING String, IN RECT *TextRc, IN UINT16 FontSize ); VOID SyncScreenImage ( IN PRIVATE_MOUSE_DATA *Private, IN GOP_ENTRY *GopEntry, IN RECT *Rc, OUT BOOLEAN *ImageIsSame ); VOID InvalidateImage ( IN PRIVATE_MOUSE_DATA *Private, IN IMAGE_INFO *ImageInfo ); VOID InvalidateRect ( IN PRIVATE_MOUSE_DATA *Private, IN RECT *Rect ); VOID ShowImage ( IN IMAGE_INFO *ImageInfo ); EFI_STATUS InternalSetCursorPos ( IN UINTN X, IN UINTN Y ); EFI_STATUS SetupMouseShowBitmap( IN RECT *DstRc, IN RECT *Scale9Grid, IN UINT16 ImageId ); VOID AcquireSetupMouseLock ( PRIVATE_MOUSE_DATA *Private ); VOID ReleaseSetupMouseLock ( PRIVATE_MOUSE_DATA *Private ); EFI_STATUS EFIAPI SetCursorPos ( IN UINTN X, IN UINTN Y ); #endif