summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Bus
diff options
context:
space:
mode:
authorRuiyu Ni <ruiyu.ni@intel.com>2016-01-29 16:03:05 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2016-02-03 16:00:08 +0800
commit09c777c6a7f7afedd87cd92bf4feafc6e566949a (patch)
treebbcc4dab459c18570c6aec6eab9a3c62f62758a6 /MdeModulePkg/Bus
parentc1a1980675facc6c18b77c4aba01012c416577a3 (diff)
downloadedk2-platforms-09c777c6a7f7afedd87cd92bf4feafc6e566949a.tar.xz
MdeModulePkg/UsbAbsPointer:Fix GetState() to return absolute value
Fix UsbMouseAbsolutePointer driver GetState() interface to return absolute value instead of relative value. The driver is ported from UsbMouse driver. The GetState of SimplePointer protocol returns relative value but the GetState of AbsolutePointer protocol should return absolute value. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com>
Diffstat (limited to 'MdeModulePkg/Bus')
-rw-r--r--MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c b/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c
index 42e696fcc9..bf3d853807 100644
--- a/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c
+++ b/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c
@@ -1,7 +1,7 @@
/** @file
USB Mouse Driver that manages USB mouse and produces Absolute Pointer Protocol.
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -673,7 +673,15 @@ InitializeUsbMouseDevice (
UsbMouseAbsolutePointerDev->Mode.AbsoluteMinY = 0;
UsbMouseAbsolutePointerDev->Mode.AbsoluteMinZ = 0;
UsbMouseAbsolutePointerDev->Mode.Attributes = 0x3;
-
+
+ //
+ // Let the cursor's starting position is in the center of the screen.
+ //
+ UsbMouseAbsolutePointerDev->State.CurrentX =
+ (UsbMouseAbsolutePointerDev->Mode.AbsoluteMaxX + UsbMouseAbsolutePointerDev->Mode.AbsoluteMinX) / 2;
+ UsbMouseAbsolutePointerDev->State.CurrentY =
+ (UsbMouseAbsolutePointerDev->Mode.AbsoluteMaxY + UsbMouseAbsolutePointerDev->Mode.AbsoluteMinY) / 2;
+
//
// Set boot protocol for the USB mouse.
// This driver only supports boot protocol.
@@ -819,13 +827,28 @@ OnMouseInterruptComplete (
// 2 0 to 7 Y displacement
// 3 to n 0 to 7 Device specific (optional)
//
- UsbMouseAbsolutePointerDevice->State.CurrentX += *((INT8 *) Data + 1);
- UsbMouseAbsolutePointerDevice->State.CurrentY += *((INT8 *) Data + 2);
-
+ UsbMouseAbsolutePointerDevice->State.ActiveButtons = *(UINT8 *) Data & (BIT0 | BIT1 | BIT2);
+
+ UsbMouseAbsolutePointerDevice->State.CurrentX =
+ MIN (
+ MAX ((INT64) UsbMouseAbsolutePointerDevice->State.CurrentX + *((INT8 *) Data + 1),
+ (INT64) UsbMouseAbsolutePointerDevice->Mode.AbsoluteMinX),
+ (INT64) UsbMouseAbsolutePointerDevice->Mode.AbsoluteMaxX
+ );
+ UsbMouseAbsolutePointerDevice->State.CurrentY =
+ MIN (
+ MAX ((INT64) UsbMouseAbsolutePointerDevice->State.CurrentY + *((INT8 *) Data + 2),
+ (INT64) UsbMouseAbsolutePointerDevice->Mode.AbsoluteMinY),
+ (INT64) UsbMouseAbsolutePointerDevice->Mode.AbsoluteMaxY
+ );
if (DataLength > 3) {
- UsbMouseAbsolutePointerDevice->State.CurrentZ += *((INT8 *) Data + 3);
+ UsbMouseAbsolutePointerDevice->State.CurrentZ =
+ MIN (
+ MAX ((INT64) UsbMouseAbsolutePointerDevice->State.CurrentZ + *((INT8 *) Data + 1),
+ (INT64) UsbMouseAbsolutePointerDevice->Mode.AbsoluteMinZ),
+ (INT64) UsbMouseAbsolutePointerDevice->Mode.AbsoluteMaxZ
+ );
}
- UsbMouseAbsolutePointerDevice->State.ActiveButtons = *(UINT8 *) Data & (BIT0 | BIT1);
return EFI_SUCCESS;
}
@@ -873,14 +896,6 @@ GetMouseAbsolutePointerState (
sizeof (EFI_ABSOLUTE_POINTER_STATE)
);
- //
- // Clear previous move state
- //
- MouseAbsolutePointerDev->State.CurrentX = 0;
- MouseAbsolutePointerDev->State.CurrentY = 0;
- MouseAbsolutePointerDev->State.CurrentZ = 0;
- MouseAbsolutePointerDev->State.ActiveButtons = 0;
-
MouseAbsolutePointerDev->StateChanged = FALSE;
return EFI_SUCCESS;
@@ -922,6 +937,15 @@ UsbMouseAbsolutePointerReset (
&UsbMouseAbsolutePointerDevice->State,
sizeof (EFI_ABSOLUTE_POINTER_STATE)
);
+
+ //
+ // Let the cursor's starting position is in the center of the screen.
+ //
+ UsbMouseAbsolutePointerDevice->State.CurrentX =
+ (UsbMouseAbsolutePointerDevice->Mode.AbsoluteMaxX + UsbMouseAbsolutePointerDevice->Mode.AbsoluteMinX) / 2;
+ UsbMouseAbsolutePointerDevice->State.CurrentY =
+ (UsbMouseAbsolutePointerDevice->Mode.AbsoluteMaxY + UsbMouseAbsolutePointerDevice->Mode.AbsoluteMinY) / 2;
+
UsbMouseAbsolutePointerDevice->StateChanged = FALSE;
return EFI_SUCCESS;