]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Rename file to use recommended file naming conventions.
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 10 Mar 2008 23:16:04 +0000 (23:16 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 10 Mar 2008 23:16:04 +0000 (23:16 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4818 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c [new file with mode: 0644]
MdeModulePkg/Bus/Usb/UsbMouseDxe/usbmouse.c [deleted file]

diff --git a/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c b/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c
new file mode 100644 (file)
index 0000000..7e7893e
--- /dev/null
@@ -0,0 +1,1047 @@
+/** @file\r
+\r
+Copyright (c) 2004 - 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+  Module Name:\r
+\r
+    UsbMouse.c\r
+\r
+  Abstract:\r
+\r
+\r
+**/\r
+\r
+#include "UsbMouse.h"\r
+\r
+#include <Library/DebugLib.h>\r
+#include <IndustryStandard/Usb.h>\r
+\r
+\r
+#include "usbmouse.h"\r
+#include "mousehid.h"\r
+\r
+//\r
+// Prototypes\r
+// Driver model protocol interface\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingEntryPoint (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingSupported (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingStart (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
+  IN  EFI_HANDLE                    Controller,\r
+  IN  UINTN                         NumberOfChildren,\r
+  IN  EFI_HANDLE                    *ChildHandleBuffer\r
+  );\r
+\r
+EFI_GUID  gEfiUsbMouseDriverGuid = {\r
+  0x290156b5, 0x6a05, 0x4ac0, {0xb8, 0x0, 0x51, 0x27, 0x55, 0xad, 0x14, 0x29}\r
+};\r
+\r
+EFI_DRIVER_BINDING_PROTOCOL gUsbMouseDriverBinding = {\r
+  USBMouseDriverBindingSupported,\r
+  USBMouseDriverBindingStart,\r
+  USBMouseDriverBindingStop,\r
+  0xa,\r
+  NULL,\r
+  NULL\r
+};\r
+\r
+//\r
+// helper functions\r
+//\r
+STATIC\r
+BOOLEAN\r
+IsUsbMouse (\r
+  IN  EFI_USB_IO_PROTOCOL     *UsbIo\r
+  );\r
+\r
+STATIC\r
+EFI_STATUS\r
+InitializeUsbMouseDevice (\r
+  IN  USB_MOUSE_DEV           *UsbMouseDev\r
+  );\r
+\r
+STATIC\r
+VOID\r
+EFIAPI\r
+UsbMouseWaitForInput (\r
+  IN  EFI_EVENT               Event,\r
+  IN  VOID                    *Context\r
+  );\r
+\r
+//\r
+// Mouse interrupt handler\r
+//\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+OnMouseInterruptComplete (\r
+  IN  VOID        *Data,\r
+  IN  UINTN       DataLength,\r
+  IN  VOID        *Context,\r
+  IN  UINT32      Result\r
+  );\r
+\r
+//\r
+// Mouse Protocol\r
+//\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+GetMouseState (\r
+  IN   EFI_SIMPLE_POINTER_PROTOCOL  *This,\r
+  OUT  EFI_SIMPLE_POINTER_STATE     *MouseState\r
+  );\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UsbMouseReset (\r
+  IN EFI_SIMPLE_POINTER_PROTOCOL    *This,\r
+  IN BOOLEAN                        ExtendedVerification\r
+  );\r
+\r
+//\r
+// Driver start here\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingEntryPoint (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Entry point for EFI drivers.\r
+\r
+  Arguments:\r
+   ImageHandle - EFI_HANDLE\r
+   SystemTable - EFI_SYSTEM_TABLE\r
+  Returns:\r
+    EFI_SUCCESS\r
+    others\r
+\r
+--*/\r
+{\r
+  return EfiLibInstallDriverBindingComponentName2 (\r
+           ImageHandle,\r
+           SystemTable,\r
+           &gUsbMouseDriverBinding,\r
+           ImageHandle,\r
+           &gUsbMouseComponentName,\r
+           &gUsbMouseComponentName2\r
+           );\r
+}\r
+\r
+\r
+/**\r
+  Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
+  that has UsbHcProtocol installed will be supported.\r
+\r
+  @param  This                  Protocol instance pointer.\r
+  @param  Controller            Handle of device to test\r
+  @param  RemainingDevicePath   Not used\r
+\r
+  @retval EFI_SUCCESS           This driver supports this device.\r
+  @retval EFI_UNSUPPORTED       This driver does not support this device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingSupported (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  )\r
+{\r
+  EFI_STATUS          OpenStatus;\r
+  EFI_USB_IO_PROTOCOL *UsbIo;\r
+  EFI_STATUS          Status;\r
+\r
+  OpenStatus = gBS->OpenProtocol (\r
+                      Controller,\r
+                      &gEfiUsbIoProtocolGuid,\r
+                      (VOID **) &UsbIo,\r
+                      This->DriverBindingHandle,\r
+                      Controller,\r
+                      EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                      );\r
+  if (EFI_ERROR (OpenStatus) && (OpenStatus != EFI_ALREADY_STARTED)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (OpenStatus == EFI_ALREADY_STARTED) {\r
+    return EFI_ALREADY_STARTED;\r
+  }\r
+\r
+  //\r
+  // Use the USB I/O protocol interface to see the Controller is\r
+  // the Mouse controller that can be managed by this driver.\r
+  //\r
+  Status = EFI_SUCCESS;\r
+  if (!IsUsbMouse (UsbIo)) {\r
+    Status = EFI_UNSUPPORTED;\r
+  }\r
+\r
+  gBS->CloseProtocol (\r
+        Controller,\r
+        &gEfiUsbIoProtocolGuid,\r
+        This->DriverBindingHandle,\r
+        Controller\r
+        );\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Starting the Usb Bus Driver\r
+\r
+  @param  This                  Protocol instance pointer.\r
+  @param  Controller            Handle of device to test\r
+  @param  RemainingDevicePath   Not used\r
+\r
+  @retval EFI_SUCCESS           This driver supports this device.\r
+  @retval EFI_UNSUPPORTED       This driver does not support this device.\r
+  @retval EFI_DEVICE_ERROR      This driver cannot be started due to device Error\r
+                                EFI_OUT_OF_RESOURCES- Can't allocate memory\r
+                                resources\r
+  @retval EFI_ALREADY_STARTED   Thios driver has been started\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingStart (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  EFI_USB_IO_PROTOCOL         *UsbIo;\r
+  EFI_USB_ENDPOINT_DESCRIPTOR *EndpointDesc;\r
+  USB_MOUSE_DEV               *UsbMouseDevice;\r
+  UINT8                       EndpointNumber;\r
+  UINT8                       Index;\r
+  UINT8                       EndpointAddr;\r
+  UINT8                       PollingInterval;\r
+  UINT8                       PacketSize;\r
+\r
+  UsbMouseDevice  = NULL;\r
+  Status          = EFI_SUCCESS;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  Controller,\r
+                  &gEfiUsbIoProtocolGuid,\r
+                  (VOID **) &UsbIo,\r
+                  This->DriverBindingHandle,\r
+                  Controller,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ErrorExit;\r
+  }\r
+\r
+  UsbMouseDevice = AllocateZeroPool (sizeof (USB_MOUSE_DEV));\r
+  if (UsbMouseDevice == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ErrorExit;\r
+  }\r
+\r
+  UsbMouseDevice->UsbIo               = UsbIo;\r
+\r
+  UsbMouseDevice->Signature           = USB_MOUSE_DEV_SIGNATURE;\r
+\r
+  UsbMouseDevice->InterfaceDescriptor = AllocatePool (sizeof (EFI_USB_INTERFACE_DESCRIPTOR));\r
+  if (UsbMouseDevice->InterfaceDescriptor == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ErrorExit;\r
+  }\r
+\r
+  EndpointDesc = AllocatePool (sizeof (EFI_USB_ENDPOINT_DESCRIPTOR));\r
+  if (EndpointDesc == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ErrorExit;\r
+  }\r
+  //\r
+  // Get the Device Path Protocol on Controller's handle\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Controller,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID **) &UsbMouseDevice->DevicePath,\r
+                  This->DriverBindingHandle,\r
+                  Controller,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto ErrorExit;\r
+  }\r
+  //\r
+  // Get interface & endpoint descriptor\r
+  //\r
+  UsbIo->UsbGetInterfaceDescriptor (\r
+          UsbIo,\r
+          UsbMouseDevice->InterfaceDescriptor\r
+          );\r
+\r
+  EndpointNumber = UsbMouseDevice->InterfaceDescriptor->NumEndpoints;\r
+\r
+  for (Index = 0; Index < EndpointNumber; Index++) {\r
+    UsbIo->UsbGetEndpointDescriptor (\r
+            UsbIo,\r
+            Index,\r
+            EndpointDesc\r
+            );\r
+\r
+    if ((EndpointDesc->Attributes & 0x03) == 0x03) {\r
+\r
+      //\r
+      // We only care interrupt endpoint here\r
+      //\r
+      UsbMouseDevice->IntEndpointDescriptor = EndpointDesc;\r
+    }\r
+  }\r
+\r
+  if (UsbMouseDevice->IntEndpointDescriptor == NULL) {\r
+    //\r
+    // No interrupt endpoint, then error\r
+    //\r
+    Status = EFI_UNSUPPORTED;\r
+    goto ErrorExit;\r
+  }\r
+\r
+  Status = InitializeUsbMouseDevice (UsbMouseDevice);\r
+  if (EFI_ERROR (Status)) {\r
+    MouseReportStatusCode (\r
+      UsbMouseDevice->DevicePath,\r
+      EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
+      PcdGet32 (PcdStatusCodeValueMouseInterfaceError)\r
+      );\r
+\r
+    goto ErrorExit;\r
+  }\r
+\r
+  UsbMouseDevice->SimplePointerProtocol.GetState  = GetMouseState;\r
+  UsbMouseDevice->SimplePointerProtocol.Reset     = UsbMouseReset;\r
+  UsbMouseDevice->SimplePointerProtocol.Mode      = &UsbMouseDevice->Mode;\r
+\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_WAIT,\r
+                  TPL_NOTIFY,\r
+                  UsbMouseWaitForInput,\r
+                  UsbMouseDevice,\r
+                  &((UsbMouseDevice->SimplePointerProtocol).WaitForInput)\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ErrorExit;\r
+  }\r
+\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &Controller,\r
+                  &gEfiSimplePointerProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  &UsbMouseDevice->SimplePointerProtocol\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto ErrorExit;\r
+  }\r
+\r
+  //\r
+  // After Enabling Async Interrupt Transfer on this mouse Device\r
+  // we will be able to get key data from it. Thus this is deemed as\r
+  // the enable action of the mouse\r
+  //\r
+\r
+  MouseReportStatusCode (\r
+    UsbMouseDevice->DevicePath,\r
+    EFI_PROGRESS_CODE,\r
+    PcdGet32 (PcdStatusCodeValueMouseEnable)\r
+    );\r
+\r
+  //\r
+  // submit async interrupt transfer\r
+  //\r
+  EndpointAddr    = UsbMouseDevice->IntEndpointDescriptor->EndpointAddress;\r
+  PollingInterval = UsbMouseDevice->IntEndpointDescriptor->Interval;\r
+  PacketSize      = (UINT8) (UsbMouseDevice->IntEndpointDescriptor->MaxPacketSize);\r
+\r
+  Status = UsbIo->UsbAsyncInterruptTransfer (\r
+                    UsbIo,\r
+                    EndpointAddr,\r
+                    TRUE,\r
+                    PollingInterval,\r
+                    PacketSize,\r
+                    OnMouseInterruptComplete,\r
+                    UsbMouseDevice\r
+                    );\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+\r
+    UsbMouseDevice->ControllerNameTable = NULL;\r
+    AddUnicodeString2 (\r
+      "eng",\r
+      gUsbMouseComponentName.SupportedLanguages,\r
+      &UsbMouseDevice->ControllerNameTable,\r
+      L"Generic Usb Mouse",\r
+      TRUE\r
+      );\r
+    AddUnicodeString2 (\r
+      "en",\r
+      gUsbMouseComponentName2.SupportedLanguages,\r
+      &UsbMouseDevice->ControllerNameTable,\r
+      L"Generic Usb Mouse",\r
+      FALSE\r
+      );\r
+\r
+\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // If submit error, uninstall that interface\r
+  //\r
+  Status = EFI_DEVICE_ERROR;\r
+  gBS->UninstallProtocolInterface (\r
+        Controller,\r
+        &gEfiSimplePointerProtocolGuid,\r
+        &UsbMouseDevice->SimplePointerProtocol\r
+        );\r
+\r
+ErrorExit:\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->CloseProtocol (\r
+          Controller,\r
+          &gEfiUsbIoProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          Controller\r
+          );\r
+\r
+    if (UsbMouseDevice != NULL) {\r
+      if (UsbMouseDevice->InterfaceDescriptor != NULL) {\r
+        gBS->FreePool (UsbMouseDevice->InterfaceDescriptor);\r
+      }\r
+\r
+      if (UsbMouseDevice->IntEndpointDescriptor != NULL) {\r
+        gBS->FreePool (UsbMouseDevice->IntEndpointDescriptor);\r
+      }\r
+\r
+      if ((UsbMouseDevice->SimplePointerProtocol).WaitForInput != NULL) {\r
+        gBS->CloseEvent ((UsbMouseDevice->SimplePointerProtocol).WaitForInput);\r
+      }\r
+\r
+      gBS->FreePool (UsbMouseDevice);\r
+      UsbMouseDevice = NULL;\r
+    }\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Stop this driver on ControllerHandle. Support stoping any child handles\r
+  created by this driver.\r
+\r
+  @param  This                  Protocol instance pointer.\r
+  @param  Controller            Handle of device to stop driver on\r
+  @param  NumberOfChildren      Number of Children in the ChildHandleBuffer\r
+  @param  ChildHandleBuffer     List of handles for the children we need to stop.\r
+\r
+  @return EFI_SUCCESS\r
+  @return EFI_DEVICE_ERROR\r
+  @return others\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+USBMouseDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
+  IN  EFI_HANDLE                    Controller,\r
+  IN  UINTN                         NumberOfChildren,\r
+  IN  EFI_HANDLE                    *ChildHandleBuffer\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  USB_MOUSE_DEV               *UsbMouseDevice;\r
+  EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;\r
+  EFI_USB_IO_PROTOCOL         *UsbIo;\r
+\r
+  //\r
+  // Get our context back.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Controller,\r
+                  &gEfiSimplePointerProtocolGuid,\r
+                  (VOID **) &SimplePointerProtocol,\r
+                  This->DriverBindingHandle,\r
+                  Controller,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  UsbMouseDevice = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (SimplePointerProtocol);\r
+\r
+  gBS->CloseProtocol (\r
+        Controller,\r
+        &gEfiSimplePointerProtocolGuid,\r
+        This->DriverBindingHandle,\r
+        Controller\r
+        );\r
+\r
+  UsbIo = UsbMouseDevice->UsbIo;\r
+\r
+  //\r
+  // Uninstall the Asyn Interrupt Transfer from this device\r
+  // will disable the mouse data input from this device\r
+  //\r
+  MouseReportStatusCode (\r
+    UsbMouseDevice->DevicePath,\r
+    EFI_PROGRESS_CODE,\r
+    PcdGet32 (PcdStatusCodeValueMouseDisable)\r
+    );\r
+\r
+  //\r
+  // Delete Mouse Async Interrupt Transfer\r
+  //\r
+  UsbIo->UsbAsyncInterruptTransfer (\r
+          UsbIo,\r
+          UsbMouseDevice->IntEndpointDescriptor->EndpointAddress,\r
+          FALSE,\r
+          UsbMouseDevice->IntEndpointDescriptor->Interval,\r
+          0,\r
+          NULL,\r
+          NULL\r
+          );\r
+\r
+  gBS->CloseEvent (UsbMouseDevice->SimplePointerProtocol.WaitForInput);\r
+\r
+  if (UsbMouseDevice->DelayedRecoveryEvent) {\r
+    gBS->CloseEvent (UsbMouseDevice->DelayedRecoveryEvent);\r
+    UsbMouseDevice->DelayedRecoveryEvent = 0;\r
+  }\r
+\r
+  Status = gBS->UninstallProtocolInterface (\r
+                  Controller,\r
+                  &gEfiSimplePointerProtocolGuid,\r
+                  &UsbMouseDevice->SimplePointerProtocol\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  gBS->CloseProtocol (\r
+        Controller,\r
+        &gEfiUsbIoProtocolGuid,\r
+        This->DriverBindingHandle,\r
+        Controller\r
+        );\r
+\r
+  gBS->FreePool (UsbMouseDevice->InterfaceDescriptor);\r
+  gBS->FreePool (UsbMouseDevice->IntEndpointDescriptor);\r
+\r
+  if (UsbMouseDevice->ControllerNameTable) {\r
+    FreeUnicodeStringTable (UsbMouseDevice->ControllerNameTable);\r
+  }\r
+\r
+  gBS->FreePool (UsbMouseDevice);\r
+\r
+  return EFI_SUCCESS;\r
+\r
+}\r
+\r
+\r
+/**\r
+  Tell if a Usb Controller is a mouse\r
+\r
+  @param  UsbIo                 Protocol instance pointer.\r
+\r
+  @retval TRUE                  It is a mouse\r
+  @retval FALSE                 It is not a mouse\r
+\r
+**/\r
+BOOLEAN\r
+IsUsbMouse (\r
+  IN  EFI_USB_IO_PROTOCOL     *UsbIo\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_USB_INTERFACE_DESCRIPTOR  InterfaceDescriptor;\r
+\r
+  //\r
+  // Get the Default interface descriptor, now we only\r
+  // suppose it is interface 1\r
+  //\r
+  Status = UsbIo->UsbGetInterfaceDescriptor (\r
+                    UsbIo,\r
+                    &InterfaceDescriptor\r
+                    );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return FALSE;\r
+  }\r
+\r
+  if ((InterfaceDescriptor.InterfaceClass == CLASS_HID) &&\r
+      (InterfaceDescriptor.InterfaceSubClass == SUBCLASS_BOOT) &&\r
+      (InterfaceDescriptor.InterfaceProtocol == PROTOCOL_MOUSE)\r
+      ) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+\r
+/**\r
+  Initialize the Usb Mouse Device.\r
+\r
+  @param  UsbMouseDev           Device instance to be initialized\r
+\r
+  @retval EFI_SUCCESS           Success\r
+  @retval EFI_DEVICE_ERROR      Init error. EFI_OUT_OF_RESOURCES- Can't allocate\r
+                                memory\r
+\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+InitializeUsbMouseDevice (\r
+  IN  USB_MOUSE_DEV           *UsbMouseDev\r
+  )\r
+{\r
+  EFI_USB_IO_PROTOCOL     *UsbIo;\r
+  UINT8                   Protocol;\r
+  EFI_STATUS              Status;\r
+  EFI_USB_HID_DESCRIPTOR  MouseHidDesc;\r
+  UINT8                   *ReportDesc;\r
+\r
+  UsbIo = UsbMouseDev->UsbIo;\r
+\r
+  //\r
+  // Get HID descriptor\r
+  //\r
+  Status = UsbGetHidDescriptor (\r
+            UsbIo,\r
+            UsbMouseDev->InterfaceDescriptor->InterfaceNumber,\r
+            &MouseHidDesc\r
+            );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Get Report descriptor\r
+  //\r
+  if (MouseHidDesc.HidClassDesc[0].DescriptorType != 0x22) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  ReportDesc = AllocateZeroPool (MouseHidDesc.HidClassDesc[0].DescriptorLength);\r
+  if (ReportDesc == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Status = UsbGetReportDescriptor (\r
+            UsbIo,\r
+            UsbMouseDev->InterfaceDescriptor->InterfaceNumber,\r
+            MouseHidDesc.HidClassDesc[0].DescriptorLength,\r
+            ReportDesc\r
+            );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->FreePool (ReportDesc);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Parse report descriptor\r
+  //\r
+  Status = ParseMouseReportDescriptor (\r
+            UsbMouseDev,\r
+            ReportDesc,\r
+            MouseHidDesc.HidClassDesc[0].DescriptorLength\r
+            );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->FreePool (ReportDesc);\r
+    return Status;\r
+  }\r
+\r
+  if (UsbMouseDev->NumberOfButtons >= 1) {\r
+    UsbMouseDev->Mode.LeftButton = TRUE;\r
+  }\r
+\r
+  if (UsbMouseDev->NumberOfButtons > 1) {\r
+    UsbMouseDev->Mode.RightButton = TRUE;\r
+  }\r
+\r
+  UsbMouseDev->Mode.ResolutionX = 8;\r
+  UsbMouseDev->Mode.ResolutionY = 8;\r
+  UsbMouseDev->Mode.ResolutionZ = 0;\r
+  //\r
+  // Here we just assume interface 0 is the mouse interface\r
+  //\r
+  UsbGetProtocolRequest (\r
+    UsbIo,\r
+    0,\r
+    &Protocol\r
+    );\r
+\r
+  if (Protocol != BOOT_PROTOCOL) {\r
+    Status = UsbSetProtocolRequest (\r
+              UsbIo,\r
+              0,\r
+              BOOT_PROTOCOL\r
+              );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      gBS->FreePool (ReportDesc);\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Set indefinite Idle rate for USB Mouse\r
+  //\r
+  UsbSetIdleRequest (\r
+    UsbIo,\r
+    0,\r
+    0,\r
+    0\r
+    );\r
+\r
+  gBS->FreePool (ReportDesc);\r
+\r
+  if (UsbMouseDev->DelayedRecoveryEvent) {\r
+    gBS->CloseEvent (UsbMouseDev->DelayedRecoveryEvent);\r
+    UsbMouseDev->DelayedRecoveryEvent = 0;\r
+  }\r
+\r
+  Status = gBS->CreateEvent (\r
+                  EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  USBMouseRecoveryHandler,\r
+                  UsbMouseDev,\r
+                  &UsbMouseDev->DelayedRecoveryEvent\r
+                  );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  It is called whenever there is data received from async interrupt\r
+  transfer.\r
+\r
+  @param  Data                  Data received.\r
+  @param  DataLength            Length of Data\r
+  @param  Context               Passed in context\r
+  @param  Result                Async Interrupt Transfer result\r
+\r
+  @return EFI_SUCCESS\r
+  @return EFI_DEVICE_ERROR\r
+\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+OnMouseInterruptComplete (\r
+  IN  VOID        *Data,\r
+  IN  UINTN       DataLength,\r
+  IN  VOID        *Context,\r
+  IN  UINT32      Result\r
+  )\r
+{\r
+  USB_MOUSE_DEV       *UsbMouseDevice;\r
+  EFI_USB_IO_PROTOCOL *UsbIo;\r
+  UINT8               EndpointAddr;\r
+  UINT32              UsbResult;\r
+\r
+  UsbMouseDevice  = (USB_MOUSE_DEV *) Context;\r
+  UsbIo           = UsbMouseDevice->UsbIo;\r
+\r
+  if (Result != EFI_USB_NOERROR) {\r
+    //\r
+    // Some errors happen during the process\r
+    //\r
+    MouseReportStatusCode (\r
+      UsbMouseDevice->DevicePath,\r
+      EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
+      PcdGet32 (PcdStatusCodeValueMouseInputError)\r
+      );\r
+\r
+    if ((Result & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {\r
+      EndpointAddr = UsbMouseDevice->IntEndpointDescriptor->EndpointAddress;\r
+\r
+      UsbClearEndpointHalt (\r
+        UsbIo,\r
+        EndpointAddr,\r
+        &UsbResult\r
+        );\r
+    }\r
+\r
+    UsbIo->UsbAsyncInterruptTransfer (\r
+            UsbIo,\r
+            UsbMouseDevice->IntEndpointDescriptor->EndpointAddress,\r
+            FALSE,\r
+            0,\r
+            0,\r
+            NULL,\r
+            NULL\r
+            );\r
+\r
+    gBS->SetTimer (\r
+          UsbMouseDevice->DelayedRecoveryEvent,\r
+          TimerRelative,\r
+          EFI_USB_INTERRUPT_DELAY\r
+          );\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  if (DataLength == 0 || Data == NULL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  UsbMouseDevice->StateChanged = TRUE;\r
+\r
+  //\r
+  // Check mouse Data\r
+  //\r
+  UsbMouseDevice->State.LeftButton  = (BOOLEAN) (*(UINT8 *) Data & 0x01);\r
+  UsbMouseDevice->State.RightButton = (BOOLEAN) (*(UINT8 *) Data & 0x02);\r
+  UsbMouseDevice->State.RelativeMovementX += *((INT8 *) Data + 1);\r
+  UsbMouseDevice->State.RelativeMovementY += *((INT8 *) Data + 2);\r
+\r
+  if (DataLength > 3) {\r
+    UsbMouseDevice->State.RelativeMovementZ += *((INT8 *) Data + 3);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/*\r
+STATIC VOID\r
+PrintMouseState(\r
+    IN  EFI_MOUSE_STATE *MouseState\r
+    )\r
+{\r
+    Aprint("(%x: %x, %x)\n",\r
+        MouseState->ButtonStates,\r
+        MouseState->dx,\r
+        MouseState->dy\r
+        );\r
+}\r
+*/\r
+\r
+/**\r
+  Get the mouse state, see SIMPLE POINTER PROTOCOL.\r
+\r
+  @param  This                  Protocol instance pointer.\r
+  @param  MouseState            Current mouse state\r
+\r
+  @return EFI_SUCCESS\r
+  @return EFI_DEVICE_ERROR\r
+  @return EFI_NOT_READY\r
+\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+GetMouseState (\r
+  IN   EFI_SIMPLE_POINTER_PROTOCOL  *This,\r
+  OUT  EFI_SIMPLE_POINTER_STATE     *MouseState\r
+  )\r
+{\r
+  USB_MOUSE_DEV *MouseDev;\r
+\r
+  if (MouseState == NULL) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  MouseDev = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This);\r
+\r
+  if (!MouseDev->StateChanged) {\r
+    return EFI_NOT_READY;\r
+  }\r
+\r
+  CopyMem (\r
+    MouseState,\r
+    &MouseDev->State,\r
+    sizeof (EFI_SIMPLE_POINTER_STATE)\r
+    );\r
+\r
+  //\r
+  // Clear previous move state\r
+  //\r
+  MouseDev->State.RelativeMovementX = 0;\r
+  MouseDev->State.RelativeMovementY = 0;\r
+  MouseDev->State.RelativeMovementZ = 0;\r
+\r
+  MouseDev->StateChanged            = FALSE;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Reset the mouse device, see SIMPLE POINTER PROTOCOL.\r
+\r
+  @param  This                  Protocol instance pointer.\r
+  @param  ExtendedVerification  Ignored here/\r
+\r
+  @return EFI_SUCCESS\r
+\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+UsbMouseReset (\r
+  IN EFI_SIMPLE_POINTER_PROTOCOL    *This,\r
+  IN BOOLEAN                        ExtendedVerification\r
+  )\r
+{\r
+  USB_MOUSE_DEV       *UsbMouseDevice;\r
+\r
+  UsbMouseDevice  = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This);\r
+\r
+  MouseReportStatusCode (\r
+    UsbMouseDevice->DevicePath,\r
+    EFI_PROGRESS_CODE,\r
+    PcdGet32 (PcdStatusCodeValueMouseReset)\r
+\r
+    );\r
+\r
+  ZeroMem (\r
+    &UsbMouseDevice->State,\r
+    sizeof (EFI_SIMPLE_POINTER_STATE)\r
+    );\r
+  UsbMouseDevice->StateChanged = FALSE;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Event notification function for SIMPLE_POINTER.WaitForInput event\r
+  Signal the event if there is input from mouse\r
+\r
+  @param  Event                 Wait Event\r
+  @param  Context               Passed parameter to event handler\r
+ VOID\r
+\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+UsbMouseWaitForInput (\r
+  IN  EFI_EVENT               Event,\r
+  IN  VOID                    *Context\r
+  )\r
+{\r
+  USB_MOUSE_DEV *UsbMouseDev;\r
+\r
+  UsbMouseDev = (USB_MOUSE_DEV *) Context;\r
+\r
+  //\r
+  // Someone is waiting on the mouse event, if there's\r
+  // input from mouse, signal the event\r
+  //\r
+  if (UsbMouseDev->StateChanged) {\r
+    gBS->SignalEvent (Event);\r
+  }\r
+}\r
+\r
+\r
+/**\r
+  Timer handler for Delayed Recovery timer.\r
+\r
+  @param  Event                 The Delayed Recovery event.\r
+  @param  Context               Points to the USB_KB_DEV instance.\r
+\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+USBMouseRecoveryHandler (\r
+  IN    EFI_EVENT    Event,\r
+  IN    VOID         *Context\r
+  )\r
+{\r
+  USB_MOUSE_DEV       *UsbMouseDev;\r
+  EFI_USB_IO_PROTOCOL *UsbIo;\r
+\r
+  UsbMouseDev = (USB_MOUSE_DEV *) Context;\r
+\r
+  UsbIo       = UsbMouseDev->UsbIo;\r
+\r
+  UsbIo->UsbAsyncInterruptTransfer (\r
+          UsbIo,\r
+          UsbMouseDev->IntEndpointDescriptor->EndpointAddress,\r
+          TRUE,\r
+          UsbMouseDev->IntEndpointDescriptor->Interval,\r
+          UsbMouseDev->IntEndpointDescriptor->MaxPacketSize,\r
+          OnMouseInterruptComplete,\r
+          UsbMouseDev\r
+          );\r
+}\r
+\r
+\r
+/**\r
+  Report Status Code in Usb Bot Driver\r
+\r
+  @param  DevicePath            Use this to get Device Path\r
+  @param  CodeType              Status Code Type\r
+  @param  CodeValue             Status Code Value\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+MouseReportStatusCode (\r
+  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
+  IN EFI_STATUS_CODE_TYPE      CodeType,\r
+  IN EFI_STATUS_CODE_VALUE     Value\r
+  )\r
+{\r
+  REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
+    CodeType,\r
+    Value,\r
+    DevicePath\r
+    );\r
+}\r
diff --git a/MdeModulePkg/Bus/Usb/UsbMouseDxe/usbmouse.c b/MdeModulePkg/Bus/Usb/UsbMouseDxe/usbmouse.c
deleted file mode 100644 (file)
index 7e7893e..0000000
+++ /dev/null
@@ -1,1047 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:\r
-\r
-    UsbMouse.c\r
-\r
-  Abstract:\r
-\r
-\r
-**/\r
-\r
-#include "UsbMouse.h"\r
-\r
-#include <Library/DebugLib.h>\r
-#include <IndustryStandard/Usb.h>\r
-\r
-\r
-#include "usbmouse.h"\r
-#include "mousehid.h"\r
-\r
-//\r
-// Prototypes\r
-// Driver model protocol interface\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingEntryPoint (\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
-  IN  EFI_HANDLE                    Controller,\r
-  IN  UINTN                         NumberOfChildren,\r
-  IN  EFI_HANDLE                    *ChildHandleBuffer\r
-  );\r
-\r
-EFI_GUID  gEfiUsbMouseDriverGuid = {\r
-  0x290156b5, 0x6a05, 0x4ac0, {0xb8, 0x0, 0x51, 0x27, 0x55, 0xad, 0x14, 0x29}\r
-};\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gUsbMouseDriverBinding = {\r
-  USBMouseDriverBindingSupported,\r
-  USBMouseDriverBindingStart,\r
-  USBMouseDriverBindingStop,\r
-  0xa,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-//\r
-// helper functions\r
-//\r
-STATIC\r
-BOOLEAN\r
-IsUsbMouse (\r
-  IN  EFI_USB_IO_PROTOCOL     *UsbIo\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-InitializeUsbMouseDevice (\r
-  IN  USB_MOUSE_DEV           *UsbMouseDev\r
-  );\r
-\r
-STATIC\r
-VOID\r
-EFIAPI\r
-UsbMouseWaitForInput (\r
-  IN  EFI_EVENT               Event,\r
-  IN  VOID                    *Context\r
-  );\r
-\r
-//\r
-// Mouse interrupt handler\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-OnMouseInterruptComplete (\r
-  IN  VOID        *Data,\r
-  IN  UINTN       DataLength,\r
-  IN  VOID        *Context,\r
-  IN  UINT32      Result\r
-  );\r
-\r
-//\r
-// Mouse Protocol\r
-//\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-GetMouseState (\r
-  IN   EFI_SIMPLE_POINTER_PROTOCOL  *This,\r
-  OUT  EFI_SIMPLE_POINTER_STATE     *MouseState\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbMouseReset (\r
-  IN EFI_SIMPLE_POINTER_PROTOCOL    *This,\r
-  IN BOOLEAN                        ExtendedVerification\r
-  );\r
-\r
-//\r
-// Driver start here\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingEntryPoint (\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Entry point for EFI drivers.\r
-\r
-  Arguments:\r
-   ImageHandle - EFI_HANDLE\r
-   SystemTable - EFI_SYSTEM_TABLE\r
-  Returns:\r
-    EFI_SUCCESS\r
-    others\r
-\r
---*/\r
-{\r
-  return EfiLibInstallDriverBindingComponentName2 (\r
-           ImageHandle,\r
-           SystemTable,\r
-           &gUsbMouseDriverBinding,\r
-           ImageHandle,\r
-           &gUsbMouseComponentName,\r
-           &gUsbMouseComponentName2\r
-           );\r
-}\r
-\r
-\r
-/**\r
-  Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
-  that has UsbHcProtocol installed will be supported.\r
-\r
-  @param  This                  Protocol instance pointer.\r
-  @param  Controller            Handle of device to test\r
-  @param  RemainingDevicePath   Not used\r
-\r
-  @retval EFI_SUCCESS           This driver supports this device.\r
-  @retval EFI_UNSUPPORTED       This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  )\r
-{\r
-  EFI_STATUS          OpenStatus;\r
-  EFI_USB_IO_PROTOCOL *UsbIo;\r
-  EFI_STATUS          Status;\r
-\r
-  OpenStatus = gBS->OpenProtocol (\r
-                      Controller,\r
-                      &gEfiUsbIoProtocolGuid,\r
-                      (VOID **) &UsbIo,\r
-                      This->DriverBindingHandle,\r
-                      Controller,\r
-                      EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                      );\r
-  if (EFI_ERROR (OpenStatus) && (OpenStatus != EFI_ALREADY_STARTED)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (OpenStatus == EFI_ALREADY_STARTED) {\r
-    return EFI_ALREADY_STARTED;\r
-  }\r
-\r
-  //\r
-  // Use the USB I/O protocol interface to see the Controller is\r
-  // the Mouse controller that can be managed by this driver.\r
-  //\r
-  Status = EFI_SUCCESS;\r
-  if (!IsUsbMouse (UsbIo)) {\r
-    Status = EFI_UNSUPPORTED;\r
-  }\r
-\r
-  gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiUsbIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Starting the Usb Bus Driver\r
-\r
-  @param  This                  Protocol instance pointer.\r
-  @param  Controller            Handle of device to test\r
-  @param  RemainingDevicePath   Not used\r
-\r
-  @retval EFI_SUCCESS           This driver supports this device.\r
-  @retval EFI_UNSUPPORTED       This driver does not support this device.\r
-  @retval EFI_DEVICE_ERROR      This driver cannot be started due to device Error\r
-                                EFI_OUT_OF_RESOURCES- Can't allocate memory\r
-                                resources\r
-  @retval EFI_ALREADY_STARTED   Thios driver has been started\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_USB_IO_PROTOCOL         *UsbIo;\r
-  EFI_USB_ENDPOINT_DESCRIPTOR *EndpointDesc;\r
-  USB_MOUSE_DEV               *UsbMouseDevice;\r
-  UINT8                       EndpointNumber;\r
-  UINT8                       Index;\r
-  UINT8                       EndpointAddr;\r
-  UINT8                       PollingInterval;\r
-  UINT8                       PacketSize;\r
-\r
-  UsbMouseDevice  = NULL;\r
-  Status          = EFI_SUCCESS;\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiUsbIoProtocolGuid,\r
-                  (VOID **) &UsbIo,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    goto ErrorExit;\r
-  }\r
-\r
-  UsbMouseDevice = AllocateZeroPool (sizeof (USB_MOUSE_DEV));\r
-  if (UsbMouseDevice == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ErrorExit;\r
-  }\r
-\r
-  UsbMouseDevice->UsbIo               = UsbIo;\r
-\r
-  UsbMouseDevice->Signature           = USB_MOUSE_DEV_SIGNATURE;\r
-\r
-  UsbMouseDevice->InterfaceDescriptor = AllocatePool (sizeof (EFI_USB_INTERFACE_DESCRIPTOR));\r
-  if (UsbMouseDevice->InterfaceDescriptor == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ErrorExit;\r
-  }\r
-\r
-  EndpointDesc = AllocatePool (sizeof (EFI_USB_ENDPOINT_DESCRIPTOR));\r
-  if (EndpointDesc == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ErrorExit;\r
-  }\r
-  //\r
-  // Get the Device Path Protocol on Controller's handle\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &UsbMouseDevice->DevicePath,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ErrorExit;\r
-  }\r
-  //\r
-  // Get interface & endpoint descriptor\r
-  //\r
-  UsbIo->UsbGetInterfaceDescriptor (\r
-          UsbIo,\r
-          UsbMouseDevice->InterfaceDescriptor\r
-          );\r
-\r
-  EndpointNumber = UsbMouseDevice->InterfaceDescriptor->NumEndpoints;\r
-\r
-  for (Index = 0; Index < EndpointNumber; Index++) {\r
-    UsbIo->UsbGetEndpointDescriptor (\r
-            UsbIo,\r
-            Index,\r
-            EndpointDesc\r
-            );\r
-\r
-    if ((EndpointDesc->Attributes & 0x03) == 0x03) {\r
-\r
-      //\r
-      // We only care interrupt endpoint here\r
-      //\r
-      UsbMouseDevice->IntEndpointDescriptor = EndpointDesc;\r
-    }\r
-  }\r
-\r
-  if (UsbMouseDevice->IntEndpointDescriptor == NULL) {\r
-    //\r
-    // No interrupt endpoint, then error\r
-    //\r
-    Status = EFI_UNSUPPORTED;\r
-    goto ErrorExit;\r
-  }\r
-\r
-  Status = InitializeUsbMouseDevice (UsbMouseDevice);\r
-  if (EFI_ERROR (Status)) {\r
-    MouseReportStatusCode (\r
-      UsbMouseDevice->DevicePath,\r
-      EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
-      PcdGet32 (PcdStatusCodeValueMouseInterfaceError)\r
-      );\r
-\r
-    goto ErrorExit;\r
-  }\r
-\r
-  UsbMouseDevice->SimplePointerProtocol.GetState  = GetMouseState;\r
-  UsbMouseDevice->SimplePointerProtocol.Reset     = UsbMouseReset;\r
-  UsbMouseDevice->SimplePointerProtocol.Mode      = &UsbMouseDevice->Mode;\r
-\r
-  Status = gBS->CreateEvent (\r
-                  EVT_NOTIFY_WAIT,\r
-                  TPL_NOTIFY,\r
-                  UsbMouseWaitForInput,\r
-                  UsbMouseDevice,\r
-                  &((UsbMouseDevice->SimplePointerProtocol).WaitForInput)\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    goto ErrorExit;\r
-  }\r
-\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &Controller,\r
-                  &gEfiSimplePointerProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &UsbMouseDevice->SimplePointerProtocol\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    Status = EFI_DEVICE_ERROR;\r
-    goto ErrorExit;\r
-  }\r
-\r
-  //\r
-  // After Enabling Async Interrupt Transfer on this mouse Device\r
-  // we will be able to get key data from it. Thus this is deemed as\r
-  // the enable action of the mouse\r
-  //\r
-\r
-  MouseReportStatusCode (\r
-    UsbMouseDevice->DevicePath,\r
-    EFI_PROGRESS_CODE,\r
-    PcdGet32 (PcdStatusCodeValueMouseEnable)\r
-    );\r
-\r
-  //\r
-  // submit async interrupt transfer\r
-  //\r
-  EndpointAddr    = UsbMouseDevice->IntEndpointDescriptor->EndpointAddress;\r
-  PollingInterval = UsbMouseDevice->IntEndpointDescriptor->Interval;\r
-  PacketSize      = (UINT8) (UsbMouseDevice->IntEndpointDescriptor->MaxPacketSize);\r
-\r
-  Status = UsbIo->UsbAsyncInterruptTransfer (\r
-                    UsbIo,\r
-                    EndpointAddr,\r
-                    TRUE,\r
-                    PollingInterval,\r
-                    PacketSize,\r
-                    OnMouseInterruptComplete,\r
-                    UsbMouseDevice\r
-                    );\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-\r
-    UsbMouseDevice->ControllerNameTable = NULL;\r
-    AddUnicodeString2 (\r
-      "eng",\r
-      gUsbMouseComponentName.SupportedLanguages,\r
-      &UsbMouseDevice->ControllerNameTable,\r
-      L"Generic Usb Mouse",\r
-      TRUE\r
-      );\r
-    AddUnicodeString2 (\r
-      "en",\r
-      gUsbMouseComponentName2.SupportedLanguages,\r
-      &UsbMouseDevice->ControllerNameTable,\r
-      L"Generic Usb Mouse",\r
-      FALSE\r
-      );\r
-\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // If submit error, uninstall that interface\r
-  //\r
-  Status = EFI_DEVICE_ERROR;\r
-  gBS->UninstallProtocolInterface (\r
-        Controller,\r
-        &gEfiSimplePointerProtocolGuid,\r
-        &UsbMouseDevice->SimplePointerProtocol\r
-        );\r
-\r
-ErrorExit:\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiUsbIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
-\r
-    if (UsbMouseDevice != NULL) {\r
-      if (UsbMouseDevice->InterfaceDescriptor != NULL) {\r
-        gBS->FreePool (UsbMouseDevice->InterfaceDescriptor);\r
-      }\r
-\r
-      if (UsbMouseDevice->IntEndpointDescriptor != NULL) {\r
-        gBS->FreePool (UsbMouseDevice->IntEndpointDescriptor);\r
-      }\r
-\r
-      if ((UsbMouseDevice->SimplePointerProtocol).WaitForInput != NULL) {\r
-        gBS->CloseEvent ((UsbMouseDevice->SimplePointerProtocol).WaitForInput);\r
-      }\r
-\r
-      gBS->FreePool (UsbMouseDevice);\r
-      UsbMouseDevice = NULL;\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Stop this driver on ControllerHandle. Support stoping any child handles\r
-  created by this driver.\r
-\r
-  @param  This                  Protocol instance pointer.\r
-  @param  Controller            Handle of device to stop driver on\r
-  @param  NumberOfChildren      Number of Children in the ChildHandleBuffer\r
-  @param  ChildHandleBuffer     List of handles for the children we need to stop.\r
-\r
-  @return EFI_SUCCESS\r
-  @return EFI_DEVICE_ERROR\r
-  @return others\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-USBMouseDriverBindingStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
-  IN  EFI_HANDLE                    Controller,\r
-  IN  UINTN                         NumberOfChildren,\r
-  IN  EFI_HANDLE                    *ChildHandleBuffer\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  USB_MOUSE_DEV               *UsbMouseDevice;\r
-  EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;\r
-  EFI_USB_IO_PROTOCOL         *UsbIo;\r
-\r
-  //\r
-  // Get our context back.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiSimplePointerProtocolGuid,\r
-                  (VOID **) &SimplePointerProtocol,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  UsbMouseDevice = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (SimplePointerProtocol);\r
-\r
-  gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiSimplePointerProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
-\r
-  UsbIo = UsbMouseDevice->UsbIo;\r
-\r
-  //\r
-  // Uninstall the Asyn Interrupt Transfer from this device\r
-  // will disable the mouse data input from this device\r
-  //\r
-  MouseReportStatusCode (\r
-    UsbMouseDevice->DevicePath,\r
-    EFI_PROGRESS_CODE,\r
-    PcdGet32 (PcdStatusCodeValueMouseDisable)\r
-    );\r
-\r
-  //\r
-  // Delete Mouse Async Interrupt Transfer\r
-  //\r
-  UsbIo->UsbAsyncInterruptTransfer (\r
-          UsbIo,\r
-          UsbMouseDevice->IntEndpointDescriptor->EndpointAddress,\r
-          FALSE,\r
-          UsbMouseDevice->IntEndpointDescriptor->Interval,\r
-          0,\r
-          NULL,\r
-          NULL\r
-          );\r
-\r
-  gBS->CloseEvent (UsbMouseDevice->SimplePointerProtocol.WaitForInput);\r
-\r
-  if (UsbMouseDevice->DelayedRecoveryEvent) {\r
-    gBS->CloseEvent (UsbMouseDevice->DelayedRecoveryEvent);\r
-    UsbMouseDevice->DelayedRecoveryEvent = 0;\r
-  }\r
-\r
-  Status = gBS->UninstallProtocolInterface (\r
-                  Controller,\r
-                  &gEfiSimplePointerProtocolGuid,\r
-                  &UsbMouseDevice->SimplePointerProtocol\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiUsbIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
-\r
-  gBS->FreePool (UsbMouseDevice->InterfaceDescriptor);\r
-  gBS->FreePool (UsbMouseDevice->IntEndpointDescriptor);\r
-\r
-  if (UsbMouseDevice->ControllerNameTable) {\r
-    FreeUnicodeStringTable (UsbMouseDevice->ControllerNameTable);\r
-  }\r
-\r
-  gBS->FreePool (UsbMouseDevice);\r
-\r
-  return EFI_SUCCESS;\r
-\r
-}\r
-\r
-\r
-/**\r
-  Tell if a Usb Controller is a mouse\r
-\r
-  @param  UsbIo                 Protocol instance pointer.\r
-\r
-  @retval TRUE                  It is a mouse\r
-  @retval FALSE                 It is not a mouse\r
-\r
-**/\r
-BOOLEAN\r
-IsUsbMouse (\r
-  IN  EFI_USB_IO_PROTOCOL     *UsbIo\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  EFI_USB_INTERFACE_DESCRIPTOR  InterfaceDescriptor;\r
-\r
-  //\r
-  // Get the Default interface descriptor, now we only\r
-  // suppose it is interface 1\r
-  //\r
-  Status = UsbIo->UsbGetInterfaceDescriptor (\r
-                    UsbIo,\r
-                    &InterfaceDescriptor\r
-                    );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return FALSE;\r
-  }\r
-\r
-  if ((InterfaceDescriptor.InterfaceClass == CLASS_HID) &&\r
-      (InterfaceDescriptor.InterfaceSubClass == SUBCLASS_BOOT) &&\r
-      (InterfaceDescriptor.InterfaceProtocol == PROTOCOL_MOUSE)\r
-      ) {\r
-    return TRUE;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-\r
-/**\r
-  Initialize the Usb Mouse Device.\r
-\r
-  @param  UsbMouseDev           Device instance to be initialized\r
-\r
-  @retval EFI_SUCCESS           Success\r
-  @retval EFI_DEVICE_ERROR      Init error. EFI_OUT_OF_RESOURCES- Can't allocate\r
-                                memory\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-InitializeUsbMouseDevice (\r
-  IN  USB_MOUSE_DEV           *UsbMouseDev\r
-  )\r
-{\r
-  EFI_USB_IO_PROTOCOL     *UsbIo;\r
-  UINT8                   Protocol;\r
-  EFI_STATUS              Status;\r
-  EFI_USB_HID_DESCRIPTOR  MouseHidDesc;\r
-  UINT8                   *ReportDesc;\r
-\r
-  UsbIo = UsbMouseDev->UsbIo;\r
-\r
-  //\r
-  // Get HID descriptor\r
-  //\r
-  Status = UsbGetHidDescriptor (\r
-            UsbIo,\r
-            UsbMouseDev->InterfaceDescriptor->InterfaceNumber,\r
-            &MouseHidDesc\r
-            );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Get Report descriptor\r
-  //\r
-  if (MouseHidDesc.HidClassDesc[0].DescriptorType != 0x22) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  ReportDesc = AllocateZeroPool (MouseHidDesc.HidClassDesc[0].DescriptorLength);\r
-  if (ReportDesc == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Status = UsbGetReportDescriptor (\r
-            UsbIo,\r
-            UsbMouseDev->InterfaceDescriptor->InterfaceNumber,\r
-            MouseHidDesc.HidClassDesc[0].DescriptorLength,\r
-            ReportDesc\r
-            );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (ReportDesc);\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Parse report descriptor\r
-  //\r
-  Status = ParseMouseReportDescriptor (\r
-            UsbMouseDev,\r
-            ReportDesc,\r
-            MouseHidDesc.HidClassDesc[0].DescriptorLength\r
-            );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (ReportDesc);\r
-    return Status;\r
-  }\r
-\r
-  if (UsbMouseDev->NumberOfButtons >= 1) {\r
-    UsbMouseDev->Mode.LeftButton = TRUE;\r
-  }\r
-\r
-  if (UsbMouseDev->NumberOfButtons > 1) {\r
-    UsbMouseDev->Mode.RightButton = TRUE;\r
-  }\r
-\r
-  UsbMouseDev->Mode.ResolutionX = 8;\r
-  UsbMouseDev->Mode.ResolutionY = 8;\r
-  UsbMouseDev->Mode.ResolutionZ = 0;\r
-  //\r
-  // Here we just assume interface 0 is the mouse interface\r
-  //\r
-  UsbGetProtocolRequest (\r
-    UsbIo,\r
-    0,\r
-    &Protocol\r
-    );\r
-\r
-  if (Protocol != BOOT_PROTOCOL) {\r
-    Status = UsbSetProtocolRequest (\r
-              UsbIo,\r
-              0,\r
-              BOOT_PROTOCOL\r
-              );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      gBS->FreePool (ReportDesc);\r
-      return EFI_DEVICE_ERROR;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Set indefinite Idle rate for USB Mouse\r
-  //\r
-  UsbSetIdleRequest (\r
-    UsbIo,\r
-    0,\r
-    0,\r
-    0\r
-    );\r
-\r
-  gBS->FreePool (ReportDesc);\r
-\r
-  if (UsbMouseDev->DelayedRecoveryEvent) {\r
-    gBS->CloseEvent (UsbMouseDev->DelayedRecoveryEvent);\r
-    UsbMouseDev->DelayedRecoveryEvent = 0;\r
-  }\r
-\r
-  Status = gBS->CreateEvent (\r
-                  EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
-                  TPL_NOTIFY,\r
-                  USBMouseRecoveryHandler,\r
-                  UsbMouseDev,\r
-                  &UsbMouseDev->DelayedRecoveryEvent\r
-                  );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  It is called whenever there is data received from async interrupt\r
-  transfer.\r
-\r
-  @param  Data                  Data received.\r
-  @param  DataLength            Length of Data\r
-  @param  Context               Passed in context\r
-  @param  Result                Async Interrupt Transfer result\r
-\r
-  @return EFI_SUCCESS\r
-  @return EFI_DEVICE_ERROR\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-OnMouseInterruptComplete (\r
-  IN  VOID        *Data,\r
-  IN  UINTN       DataLength,\r
-  IN  VOID        *Context,\r
-  IN  UINT32      Result\r
-  )\r
-{\r
-  USB_MOUSE_DEV       *UsbMouseDevice;\r
-  EFI_USB_IO_PROTOCOL *UsbIo;\r
-  UINT8               EndpointAddr;\r
-  UINT32              UsbResult;\r
-\r
-  UsbMouseDevice  = (USB_MOUSE_DEV *) Context;\r
-  UsbIo           = UsbMouseDevice->UsbIo;\r
-\r
-  if (Result != EFI_USB_NOERROR) {\r
-    //\r
-    // Some errors happen during the process\r
-    //\r
-    MouseReportStatusCode (\r
-      UsbMouseDevice->DevicePath,\r
-      EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
-      PcdGet32 (PcdStatusCodeValueMouseInputError)\r
-      );\r
-\r
-    if ((Result & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {\r
-      EndpointAddr = UsbMouseDevice->IntEndpointDescriptor->EndpointAddress;\r
-\r
-      UsbClearEndpointHalt (\r
-        UsbIo,\r
-        EndpointAddr,\r
-        &UsbResult\r
-        );\r
-    }\r
-\r
-    UsbIo->UsbAsyncInterruptTransfer (\r
-            UsbIo,\r
-            UsbMouseDevice->IntEndpointDescriptor->EndpointAddress,\r
-            FALSE,\r
-            0,\r
-            0,\r
-            NULL,\r
-            NULL\r
-            );\r
-\r
-    gBS->SetTimer (\r
-          UsbMouseDevice->DelayedRecoveryEvent,\r
-          TimerRelative,\r
-          EFI_USB_INTERRUPT_DELAY\r
-          );\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  if (DataLength == 0 || Data == NULL) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  UsbMouseDevice->StateChanged = TRUE;\r
-\r
-  //\r
-  // Check mouse Data\r
-  //\r
-  UsbMouseDevice->State.LeftButton  = (BOOLEAN) (*(UINT8 *) Data & 0x01);\r
-  UsbMouseDevice->State.RightButton = (BOOLEAN) (*(UINT8 *) Data & 0x02);\r
-  UsbMouseDevice->State.RelativeMovementX += *((INT8 *) Data + 1);\r
-  UsbMouseDevice->State.RelativeMovementY += *((INT8 *) Data + 2);\r
-\r
-  if (DataLength > 3) {\r
-    UsbMouseDevice->State.RelativeMovementZ += *((INT8 *) Data + 3);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/*\r
-STATIC VOID\r
-PrintMouseState(\r
-    IN  EFI_MOUSE_STATE *MouseState\r
-    )\r
-{\r
-    Aprint("(%x: %x, %x)\n",\r
-        MouseState->ButtonStates,\r
-        MouseState->dx,\r
-        MouseState->dy\r
-        );\r
-}\r
-*/\r
-\r
-/**\r
-  Get the mouse state, see SIMPLE POINTER PROTOCOL.\r
-\r
-  @param  This                  Protocol instance pointer.\r
-  @param  MouseState            Current mouse state\r
-\r
-  @return EFI_SUCCESS\r
-  @return EFI_DEVICE_ERROR\r
-  @return EFI_NOT_READY\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-GetMouseState (\r
-  IN   EFI_SIMPLE_POINTER_PROTOCOL  *This,\r
-  OUT  EFI_SIMPLE_POINTER_STATE     *MouseState\r
-  )\r
-{\r
-  USB_MOUSE_DEV *MouseDev;\r
-\r
-  if (MouseState == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  MouseDev = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This);\r
-\r
-  if (!MouseDev->StateChanged) {\r
-    return EFI_NOT_READY;\r
-  }\r
-\r
-  CopyMem (\r
-    MouseState,\r
-    &MouseDev->State,\r
-    sizeof (EFI_SIMPLE_POINTER_STATE)\r
-    );\r
-\r
-  //\r
-  // Clear previous move state\r
-  //\r
-  MouseDev->State.RelativeMovementX = 0;\r
-  MouseDev->State.RelativeMovementY = 0;\r
-  MouseDev->State.RelativeMovementZ = 0;\r
-\r
-  MouseDev->StateChanged            = FALSE;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Reset the mouse device, see SIMPLE POINTER PROTOCOL.\r
-\r
-  @param  This                  Protocol instance pointer.\r
-  @param  ExtendedVerification  Ignored here/\r
-\r
-  @return EFI_SUCCESS\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbMouseReset (\r
-  IN EFI_SIMPLE_POINTER_PROTOCOL    *This,\r
-  IN BOOLEAN                        ExtendedVerification\r
-  )\r
-{\r
-  USB_MOUSE_DEV       *UsbMouseDevice;\r
-\r
-  UsbMouseDevice  = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This);\r
-\r
-  MouseReportStatusCode (\r
-    UsbMouseDevice->DevicePath,\r
-    EFI_PROGRESS_CODE,\r
-    PcdGet32 (PcdStatusCodeValueMouseReset)\r
-\r
-    );\r
-\r
-  ZeroMem (\r
-    &UsbMouseDevice->State,\r
-    sizeof (EFI_SIMPLE_POINTER_STATE)\r
-    );\r
-  UsbMouseDevice->StateChanged = FALSE;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Event notification function for SIMPLE_POINTER.WaitForInput event\r
-  Signal the event if there is input from mouse\r
-\r
-  @param  Event                 Wait Event\r
-  @param  Context               Passed parameter to event handler\r
- VOID\r
-\r
-**/\r
-STATIC\r
-VOID\r
-EFIAPI\r
-UsbMouseWaitForInput (\r
-  IN  EFI_EVENT               Event,\r
-  IN  VOID                    *Context\r
-  )\r
-{\r
-  USB_MOUSE_DEV *UsbMouseDev;\r
-\r
-  UsbMouseDev = (USB_MOUSE_DEV *) Context;\r
-\r
-  //\r
-  // Someone is waiting on the mouse event, if there's\r
-  // input from mouse, signal the event\r
-  //\r
-  if (UsbMouseDev->StateChanged) {\r
-    gBS->SignalEvent (Event);\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Timer handler for Delayed Recovery timer.\r
-\r
-  @param  Event                 The Delayed Recovery event.\r
-  @param  Context               Points to the USB_KB_DEV instance.\r
-\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-USBMouseRecoveryHandler (\r
-  IN    EFI_EVENT    Event,\r
-  IN    VOID         *Context\r
-  )\r
-{\r
-  USB_MOUSE_DEV       *UsbMouseDev;\r
-  EFI_USB_IO_PROTOCOL *UsbIo;\r
-\r
-  UsbMouseDev = (USB_MOUSE_DEV *) Context;\r
-\r
-  UsbIo       = UsbMouseDev->UsbIo;\r
-\r
-  UsbIo->UsbAsyncInterruptTransfer (\r
-          UsbIo,\r
-          UsbMouseDev->IntEndpointDescriptor->EndpointAddress,\r
-          TRUE,\r
-          UsbMouseDev->IntEndpointDescriptor->Interval,\r
-          UsbMouseDev->IntEndpointDescriptor->MaxPacketSize,\r
-          OnMouseInterruptComplete,\r
-          UsbMouseDev\r
-          );\r
-}\r
-\r
-\r
-/**\r
-  Report Status Code in Usb Bot Driver\r
-\r
-  @param  DevicePath            Use this to get Device Path\r
-  @param  CodeType              Status Code Type\r
-  @param  CodeValue             Status Code Value\r
-\r
-  @return None\r
-\r
-**/\r
-VOID\r
-MouseReportStatusCode (\r
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
-  IN EFI_STATUS_CODE_TYPE      CodeType,\r
-  IN EFI_STATUS_CODE_VALUE     Value\r
-  )\r
-{\r
-  REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
-    CodeType,\r
-    Value,\r
-    DevicePath\r
-    );\r
-}\r