alder_lake_bios/Insyde/InsydeModulePkg/Universal/UserInterface/SetupMouseDxe/SetupMouse.h

506 lines
12 KiB
C

/** @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 <Uefi.h>
#include <Library/UefiLib.h>
#include <Uefi/UefiSpec.h>
#include <Library/BaseLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/HiiDbLib.h>
#include <Library/HiiStringLib.h>
#include <Library/HiiConfigAccessLib.h>
#include <Library/DebugLib.h>
#include <Library/RectLib.h>
#include <Library/BitBltLib.h>
#include <Protocol/HiiDatabase.h>
#include <Protocol/PciIo.h>
#include <Protocol/DevicePath.h>
#include <Protocol/SimplePointer.h>
#include <Protocol/AbsolutePointer.h>
#include <Protocol/GraphicsOutput.h>
#include <Protocol/EdidActive.h>
#include <Protocol/EdidDiscovered.h>
#include <Protocol/SetupMouse.h>
#include <Protocol/ConsoleControl.h>
#include <Protocol/HiiImage.h>
#include <Guid/MdeModuleHii.h>
#include <InternalFormRepresentation.h>
//[-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