add UsbMouseSimulateTouchPad driver to verify the correction of dispatching AbsolutePointer event of consplitter
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4297 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -56,6 +56,23 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gConSplitterSimplePoi
|
||||
"en"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gConSplitterAbsolutePointerComponentName = {
|
||||
ConSplitterComponentNameGetDriverName,
|
||||
ConSplitterAbsolutePointerComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gConSplitterAbsolutePointerComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) ConSplitterComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) ConSplitterAbsolutePointerComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
@@ -128,6 +145,17 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mConSplitterSimplePointer
|
||||
}
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mConSplitterAbsolutePointerControllerNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
(CHAR16 *)L"Primary Absolute Pointer Device"
|
||||
},
|
||||
{
|
||||
NULL,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mConSplitterConOutControllerNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
@@ -422,6 +450,91 @@ ConSplitterSimplePointerComponentNameGetControllerName (
|
||||
);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by an EFI Driver.
|
||||
|
||||
Arguments:
|
||||
This - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
ControllerHandle - The handle of a controller that the driver specified by
|
||||
This is managing. This handle specifies the controller
|
||||
whose name is to be returned.
|
||||
ChildHandle - The handle of the child controller to retrieve the name
|
||||
of. This is an optional parameter that may be NULL. It
|
||||
will be NULL for device drivers. It will also be NULL
|
||||
for a bus drivers that wish to retrieve the name of the
|
||||
bus controller. It will not be NULL for a bus driver
|
||||
that wishes to retrieve the name of a child controller.
|
||||
Language - A pointer to RFC3066 language identifier.
|
||||
This is the language of the controller name
|
||||
that that the caller is requesting, and it must match one
|
||||
of the languages specified in SupportedLanguages. The
|
||||
number of languages supported by a driver is up to the
|
||||
driver writer.
|
||||
ControllerName - A pointer to the Unicode string to return. This Unicode
|
||||
string is the name of the controller specified by
|
||||
ControllerHandle and ChildHandle in the language
|
||||
specified by Language from the point of view of the
|
||||
driver specified by This.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - The Unicode string for the user readable name in the
|
||||
language specified by Language for the driver
|
||||
specified by This was returned in DriverName.
|
||||
EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
|
||||
EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid
|
||||
EFI_HANDLE.
|
||||
EFI_INVALID_PARAMETER - Language is NULL.
|
||||
EFI_INVALID_PARAMETER - ControllerName is NULL.
|
||||
EFI_UNSUPPORTED - The driver specified by This is not currently
|
||||
managing the controller specified by
|
||||
ControllerHandle and ChildHandle.
|
||||
EFI_UNSUPPORTED - The driver specified by This does not support the
|
||||
language specified by Language.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer;
|
||||
//
|
||||
// here ChildHandle is not an Optional parameter.
|
||||
//
|
||||
if (ChildHandle == NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
ControllerHandle,
|
||||
&gEfiAbsolutePointerProtocolGuid,
|
||||
(VOID **) &AbsolutePointer,
|
||||
NULL,
|
||||
ControllerHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mConSplitterAbsolutePointerControllerNameTable,
|
||||
ControllerName,
|
||||
(BOOLEAN)(This == &gConSplitterAbsolutePointerComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
|
@@ -76,6 +76,27 @@ STATIC TEXT_IN_SPLITTER_PRIVATE_DATA mConIn = {
|
||||
(EFI_SIMPLE_POINTER_PROTOCOL **) NULL,
|
||||
0,
|
||||
|
||||
{
|
||||
ConSplitterAbsolutePointerReset,
|
||||
ConSplitterAbsolutePointerGetState,
|
||||
(EFI_EVENT) NULL,
|
||||
(EFI_ABSOLUTE_POINTER_MODE *) NULL
|
||||
},
|
||||
|
||||
{
|
||||
0, //AbsoluteMinX
|
||||
0, //AbsoluteMinY
|
||||
0, //AbsoluteMinZ
|
||||
0x10000, //AbsoluteMaxX
|
||||
0x10000, //AbsoluteMaxY
|
||||
0x10000, //AbsoluteMaxZ
|
||||
0 //Attributes
|
||||
},
|
||||
0,
|
||||
(EFI_ABSOLUTE_POINTER_PROTOCOL **) NULL,
|
||||
0,
|
||||
FALSE,
|
||||
|
||||
FALSE,
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
@@ -240,6 +261,18 @@ EFI_DRIVER_BINDING_PROTOCOL gConSplitterSimplePointerDriverBinding = {
|
||||
NULL
|
||||
};
|
||||
|
||||
//
|
||||
// Driver binding instance for Absolute Pointer protocol
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gConSplitterAbsolutePointerDriverBinding = {
|
||||
ConSplitterAbsolutePointerDriverBindingSupported,
|
||||
ConSplitterAbsolutePointerDriverBindingStart,
|
||||
ConSplitterAbsolutePointerDriverBindingStop,
|
||||
0xa,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
EFI_DRIVER_BINDING_PROTOCOL gConSplitterConOutDriverBinding = {
|
||||
ConSplitterConOutDriverBindingSupported,
|
||||
ConSplitterConOutDriverBindingStart,
|
||||
@@ -300,6 +333,16 @@ InitializeConSplitter(
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||
ImageHandle,
|
||||
SystemTable,
|
||||
&gConSplitterAbsolutePointerDriverBinding,
|
||||
NULL,
|
||||
&gConSplitterAbsolutePointerComponentName,
|
||||
&gConSplitterAbsolutePointerComponentName2
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||
ImageHandle,
|
||||
SystemTable,
|
||||
@@ -386,6 +429,8 @@ Returns:
|
||||
&mConIn.TextInEx,
|
||||
&gEfiSimplePointerProtocolGuid,
|
||||
&mConIn.SimplePointer,
|
||||
&gEfiAbsolutePointerProtocolGuid,
|
||||
&mConIn.AbsolutePointer,
|
||||
&gEfiPrimaryConsoleInDeviceGuid,
|
||||
NULL,
|
||||
NULL
|
||||
@@ -554,6 +599,28 @@ Returns:
|
||||
|
||||
InitializeListHead (&ConInPrivate->NotifyList);
|
||||
|
||||
//
|
||||
// Allocate Buffer and Create Event for Absolute Pointer and Simple Pointer Protocols
|
||||
//
|
||||
ConInPrivate->AbsolutePointer.Mode = &ConInPrivate->AbsolutePointerMode;
|
||||
|
||||
Status = ConSplitterGrowBuffer (
|
||||
sizeof (EFI_ABSOLUTE_POINTER_PROTOCOL *),
|
||||
&ConInPrivate->AbsolutePointerListCount,
|
||||
(VOID **) &ConInPrivate->AbsolutePointerList
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_NOTIFY_WAIT,
|
||||
TPL_NOTIFY,
|
||||
ConSplitterAbsolutePointerWaitForInput,
|
||||
ConInPrivate,
|
||||
&ConInPrivate->AbsolutePointer.WaitForInput
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
ConInPrivate->SimplePointer.Mode = &ConInPrivate->SimplePointerMode;
|
||||
|
||||
@@ -787,6 +854,36 @@ Returns:
|
||||
);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Absolute Pointer Supported Check
|
||||
|
||||
Arguments:
|
||||
This - Pointer to protocol.
|
||||
ControllerHandle - Controller handle.
|
||||
RemainingDevicePath - Remaining device path.
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_STATUS
|
||||
|
||||
--*/
|
||||
{
|
||||
return ConSplitterSupported (
|
||||
This,
|
||||
ControllerHandle,
|
||||
&gEfiAbsolutePointerProtocolGuid
|
||||
);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterConOutDriverBindingSupported (
|
||||
@@ -1021,6 +1118,49 @@ Returns:
|
||||
return ConSplitterSimplePointerAddDevice (&mConIn, SimplePointer);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Start ConSplitter on ControllerHandle, and create the virtual
|
||||
agrogated console device on first call Start for a ConIn handle.
|
||||
|
||||
Arguments:
|
||||
This - Pointer to protocol.
|
||||
ControllerHandle - Controller handle.
|
||||
RemainingDevicePath - Remaining device path.
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_ERROR if a AbsolutePointer protocol is not started.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer;
|
||||
|
||||
Status = ConSplitterStart (
|
||||
This,
|
||||
ControllerHandle,
|
||||
mConIn.VirtualHandle,
|
||||
&gEfiAbsolutePointerProtocolGuid,
|
||||
&gEfiAbsolutePointerProtocolGuid,
|
||||
(VOID **) &AbsolutePointer
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
return ConSplitterAbsolutePointerAddDevice (&mConIn, AbsolutePointer);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterConOutDriverBindingStart (
|
||||
@@ -1341,6 +1481,51 @@ Returns:
|
||||
return ConSplitterSimplePointerDeleteDevice (&mConIn, SimplePointer);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
(Standard DriverBinding Protocol Stop() function)
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer;
|
||||
|
||||
if (NumberOfChildren == 0) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Status = ConSplitterStop (
|
||||
This,
|
||||
ControllerHandle,
|
||||
mConIn.VirtualHandle,
|
||||
&gEfiAbsolutePointerProtocolGuid,
|
||||
&gEfiAbsolutePointerProtocolGuid,
|
||||
(VOID **) &AbsolutePointer
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Delete this console input device's data structures.
|
||||
//
|
||||
return ConSplitterAbsolutePointerDeleteDevice (&mConIn, AbsolutePointer);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterConOutDriverBindingStop (
|
||||
@@ -1729,6 +1914,83 @@ Returns:
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
ConSplitterAbsolutePointerAddDevice (
|
||||
IN TEXT_IN_SPLITTER_PRIVATE_DATA *Private,
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_OUT_OF_RESOURCES
|
||||
EFI_SUCCESS
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// If the Absolute Pointer List is full, enlarge it by calling growbuffer().
|
||||
//
|
||||
if (Private->CurrentNumberOfAbsolutePointers >= Private->AbsolutePointerListCount) {
|
||||
Status = ConSplitterGrowBuffer (
|
||||
sizeof (EFI_ABSOLUTE_POINTER_PROTOCOL *),
|
||||
&Private->AbsolutePointerListCount,
|
||||
(VOID **) &Private->AbsolutePointerList
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Add the new text-in device data structure into the Text In List.
|
||||
//
|
||||
Private->AbsolutePointerList[Private->CurrentNumberOfAbsolutePointers] = AbsolutePointer;
|
||||
Private->CurrentNumberOfAbsolutePointers++;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
ConSplitterAbsolutePointerDeleteDevice (
|
||||
IN TEXT_IN_SPLITTER_PRIVATE_DATA *Private,
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Returns:
|
||||
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
UINTN Index;
|
||||
//
|
||||
// Remove the specified text-in device data structure from the Text In List,
|
||||
// and rearrange the remaining data structures in the Text In List.
|
||||
//
|
||||
for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
|
||||
if (Private->AbsolutePointerList[Index] == AbsolutePointer) {
|
||||
for (Index = Index; Index < Private->CurrentNumberOfAbsolutePointers - 1; Index++) {
|
||||
Private->AbsolutePointerList[Index] = Private->AbsolutePointerList[Index + 1];
|
||||
}
|
||||
|
||||
Private->CurrentNumberOfAbsolutePointers--;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ConSplitterGrowMapTable (
|
||||
@@ -3325,8 +3587,6 @@ ConSplitterTextInUnregisterKeyNotify (
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterSimplePointerReset (
|
||||
@@ -3552,6 +3812,198 @@ Returns:
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Absolute Pointer Protocol functions
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerReset (
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Resets the pointer device hardware.
|
||||
|
||||
Arguments:
|
||||
This - Protocol instance pointer.
|
||||
ExtendedVerification - Driver may perform diagnostics on reset.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - The device was reset.
|
||||
EFI_DEVICE_ERROR - The device is not functioning correctly and could
|
||||
not be reset.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS ReturnStatus;
|
||||
TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
|
||||
UINTN Index;
|
||||
|
||||
Private = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_ABSOLUTE_POINTER_THIS (This);
|
||||
|
||||
Private->AbsoluteInputEventSignalState = FALSE;
|
||||
|
||||
if (Private->CurrentNumberOfAbsolutePointers == 0) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
//
|
||||
// return the worst status met
|
||||
//
|
||||
for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
|
||||
Status = Private->AbsolutePointerList[Index]->Reset (
|
||||
Private->AbsolutePointerList[Index],
|
||||
ExtendedVerification
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ReturnStatus = Status;
|
||||
}
|
||||
}
|
||||
|
||||
return ReturnStatus;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerGetState (
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *This,
|
||||
IN OUT EFI_ABSOLUTE_POINTER_STATE *State
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Retrieves the current state of a pointer device.
|
||||
|
||||
Arguments:
|
||||
This - Protocol instance pointer.
|
||||
State - A pointer to the state information on the pointer device.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - The state of the pointer device was returned in State..
|
||||
EFI_NOT_READY - The state of the pointer device has not changed since the last call to
|
||||
GetState().
|
||||
EFI_DEVICE_ERROR - A device error occurred while attempting to retrieve the pointer
|
||||
device's current state.
|
||||
--*/
|
||||
{
|
||||
TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS ReturnStatus;
|
||||
UINTN Index;
|
||||
EFI_ABSOLUTE_POINTER_STATE CurrentState;
|
||||
|
||||
|
||||
Private = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_ABSOLUTE_POINTER_THIS (This);
|
||||
if (Private->PasswordEnabled) {
|
||||
//
|
||||
// If StdIn Locked return not ready
|
||||
//
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
|
||||
Private->AbsoluteInputEventSignalState = FALSE;
|
||||
|
||||
State->CurrentX = 0;
|
||||
State->CurrentY = 0;
|
||||
State->CurrentZ = 0;
|
||||
State->ActiveButtons = 0;
|
||||
|
||||
//
|
||||
// if no physical pointer device exists, return EFI_NOT_READY;
|
||||
// if any physical pointer device has changed state,
|
||||
// return the state and EFI_SUCCESS.
|
||||
//
|
||||
ReturnStatus = EFI_NOT_READY;
|
||||
for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
|
||||
|
||||
Status = Private->AbsolutePointerList[Index]->GetState (
|
||||
Private->AbsolutePointerList[Index],
|
||||
&CurrentState
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if (ReturnStatus == EFI_NOT_READY) {
|
||||
ReturnStatus = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
State->ActiveButtons = CurrentState.ActiveButtons;
|
||||
|
||||
if (!(Private->AbsolutePointerMode.AbsoluteMinX == 0 && Private->AbsolutePointerMode.AbsoluteMaxX == 0)) {
|
||||
State->CurrentX = CurrentState.CurrentX;
|
||||
}
|
||||
if (!(Private->AbsolutePointerMode.AbsoluteMinY == 0 && Private->AbsolutePointerMode.AbsoluteMaxY == 0)) {
|
||||
State->CurrentY = CurrentState.CurrentY;
|
||||
}
|
||||
if (!(Private->AbsolutePointerMode.AbsoluteMinZ == 0 && Private->AbsolutePointerMode.AbsoluteMaxZ == 0)) {
|
||||
State->CurrentZ = CurrentState.CurrentZ;
|
||||
}
|
||||
|
||||
} else if (Status == EFI_DEVICE_ERROR) {
|
||||
ReturnStatus = EFI_DEVICE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return ReturnStatus;
|
||||
}
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerWaitForInput (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
This event agregates all the events of the pointer devices in the splitter.
|
||||
If the ConIn is password locked then return.
|
||||
If any events of physical pointer devices are signaled, signal the pointer
|
||||
splitter event. This will cause the calling code to call
|
||||
ConSplitterAbsolutePointerGetState ().
|
||||
|
||||
Arguments:
|
||||
Event - The Event assoicated with callback.
|
||||
Context - Context registered when Event was created.
|
||||
|
||||
Returns:
|
||||
None
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
|
||||
UINTN Index;
|
||||
|
||||
Private = (TEXT_IN_SPLITTER_PRIVATE_DATA *) Context;
|
||||
if (Private->PasswordEnabled) {
|
||||
//
|
||||
// If StdIn Locked return not ready
|
||||
//
|
||||
return ;
|
||||
}
|
||||
|
||||
//
|
||||
// if AbsoluteInputEventSignalState is flagged before,
|
||||
// and not cleared by Reset() or GetState(), signal it
|
||||
//
|
||||
if (Private->AbsoluteInputEventSignalState) {
|
||||
gBS->SignalEvent (Event);
|
||||
return ;
|
||||
}
|
||||
//
|
||||
// if any physical console input device has key input, signal the event.
|
||||
//
|
||||
for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
|
||||
Status = gBS->CheckEvent (Private->AbsolutePointerList[Index]->WaitForInput);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->SignalEvent (Event);
|
||||
Private->AbsoluteInputEventSignalState = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterTextOutReset (
|
||||
|
@@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Protocol/GraphicsOutput.h>
|
||||
#include <Guid/PrimaryConsoleInDevice.h>
|
||||
#include <Protocol/SimplePointer.h>
|
||||
#include <Protocol/AbsolutePointer.h>
|
||||
#include <Protocol/SimpleTextOut.h>
|
||||
#include <Guid/ConsoleInDevice.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
@@ -47,6 +48,8 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterConInComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gConSplitterSimplePointerDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gConSplitterSimplePointerComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterSimplePointerComponentName2;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gConSplitterAbsolutePointerComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterAbsolutePointerComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gConSplitterConOutDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gConSplitterConOutComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterConOutComponentName2;
|
||||
@@ -89,6 +92,7 @@ typedef struct _TEXT_IN_EX_SPLITTER_NOTIFY {
|
||||
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
||||
LIST_ENTRY NotifyEntry;
|
||||
} TEXT_IN_EX_SPLITTER_NOTIFY;
|
||||
|
||||
typedef struct {
|
||||
UINT64 Signature;
|
||||
EFI_HANDLE VirtualHandle;
|
||||
@@ -111,6 +115,13 @@ typedef struct {
|
||||
EFI_SIMPLE_POINTER_PROTOCOL **PointerList;
|
||||
UINTN PointerListCount;
|
||||
|
||||
EFI_ABSOLUTE_POINTER_PROTOCOL AbsolutePointer;
|
||||
EFI_ABSOLUTE_POINTER_MODE AbsolutePointerMode;
|
||||
UINTN CurrentNumberOfAbsolutePointers;
|
||||
EFI_ABSOLUTE_POINTER_PROTOCOL **AbsolutePointerList;
|
||||
UINTN AbsolutePointerListCount;
|
||||
BOOLEAN AbsoluteInputEventSignalState;
|
||||
|
||||
BOOLEAN PasswordEnabled;
|
||||
CHAR16 Password[MAX_STD_IN_PASSWORD];
|
||||
UINTN PwdIndex;
|
||||
@@ -368,6 +379,111 @@ ConSplitterStdErrDriverBindingStop (
|
||||
)
|
||||
;
|
||||
|
||||
//
|
||||
// Driver binding functions
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
ConSplitterAbsolutePointerAddDevice (
|
||||
IN TEXT_IN_SPLITTER_PRIVATE_DATA *Private,
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer
|
||||
)
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
ConSplitterAbsolutePointerDeleteDevice (
|
||||
IN TEXT_IN_SPLITTER_PRIVATE_DATA *Private,
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *AbsolutePointer
|
||||
)
|
||||
;
|
||||
|
||||
//
|
||||
// Absolute Pointer protocol interfaces
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerReset (
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Resets the pointer device hardware.
|
||||
|
||||
Arguments:
|
||||
This - Protocol instance pointer.
|
||||
ExtendedVerification - Driver may perform diagnostics on reset.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - The device was reset.
|
||||
EFI_DEVICE_ERROR - The device is not functioning correctly and could
|
||||
not be reset.
|
||||
|
||||
--*/
|
||||
;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerGetState (
|
||||
IN EFI_ABSOLUTE_POINTER_PROTOCOL *This,
|
||||
IN OUT EFI_ABSOLUTE_POINTER_STATE *State
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Retrieves the current state of a pointer device.
|
||||
|
||||
Arguments:
|
||||
This - Protocol instance pointer.
|
||||
State - A pointer to the state information on the pointer device.
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - The state of the pointer device was returned in State..
|
||||
EFI_NOT_READY - The state of the pointer device has not changed since the last call to
|
||||
GetState().
|
||||
EFI_DEVICE_ERROR - A device error occurred while attempting to retrieve the pointer
|
||||
device's current state.
|
||||
--*/
|
||||
;
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerWaitForInput (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
;
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
@@ -573,6 +689,16 @@ ConSplitterSimplePointerComponentNameGetControllerName (
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ConSplitterAbsolutePointerComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
;
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
|
@@ -77,6 +77,7 @@
|
||||
gEfiSimpleTextOutProtocolGuid # PROTOCOL ALWAYS_PRODUCED
|
||||
gEfiGraphicsOutputProtocolGuid # PROTOCOL ALWAYS_PRODUCED
|
||||
gEfiUgaDrawProtocolGuid # PROTOCOL ALWAYS_PRODUCED
|
||||
gEfiAbsolutePointerProtocolGuid # PROTOCOL ALWAYS_PRODUCED
|
||||
|
||||
[FeaturePcd.common]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport
|
||||
|
Reference in New Issue
Block a user