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:
eric_tian
2007-11-14 07:08:55 +00:00
parent a8779537f3
commit 8ae0b360f5
13 changed files with 2793 additions and 5 deletions

View File

@@ -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 (