]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Bus/Usb/UsbMouse/Dxe/usbmouse.c
Retiring the ANT/JAVA build and removing the older EDK II packages that required...
[mirror_edk2.git] / EdkModulePkg / Bus / Usb / UsbMouse / Dxe / usbmouse.c
diff --git a/EdkModulePkg/Bus/Usb/UsbMouse/Dxe/usbmouse.c b/EdkModulePkg/Bus/Usb/UsbMouse/Dxe/usbmouse.c
deleted file mode 100644 (file)
index a3fc6c7..0000000
+++ /dev/null
@@ -1,988 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2006, 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
-#include "usbmouse.h"\r
-#include "mousehid.h"\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
-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
-\r
-  Routine Description:\r
-    Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
-    that has UsbHcProtocol installed will be supported.\r
-\r
-  Arguments:\r
-    This                - Protocol instance pointer.\r
-    Controller         - Handle of device to test\r
-    RemainingDevicePath - Not used\r
-\r
-  Returns:\r
-    EFI_SUCCESS         - This driver supports this device.\r
-    EFI_UNSUPPORTED     - This driver does not support this device.\r
-\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
-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
-\r
-  Routine Description:\r
-    Starting the Usb Bus Driver\r
-\r
-  Arguments:\r
-    This                - Protocol instance pointer.\r
-    Controller          - Handle of device to test\r
-    RemainingDevicePath - Not used\r
-\r
-  Returns:\r
-    EFI_SUCCESS         - This driver supports this device.\r
-    EFI_UNSUPPORTED     - This driver does not support this device.\r
-    EFI_DEVICE_ERROR    - This driver cannot be started due to device\r
-                          Error\r
-    EFI_OUT_OF_RESOURCES- Can't allocate memory resources\r
-    EFI_ALREADY_STARTED - Thios driver has been started\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
-      (EFI_PERIPHERAL_MOUSE | EFI_P_EC_INTERFACE_ERROR)\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
-    (EFI_PERIPHERAL_MOUSE | EFI_P_PC_ENABLE)\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
-    AddUnicodeString (\r
-      "eng",\r
-      gUsbMouseComponentName.SupportedLanguages,\r
-      &UsbMouseDevice->ControllerNameTable,\r
-      (CHAR16 *) L"Generic Usb Mouse"\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
-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
-\r
-  Routine Description:\r
-    Stop this driver on ControllerHandle. Support stoping any child handles\r
-    created by this driver.\r
-\r
-  Arguments:\r
-    This              - Protocol instance pointer.\r
-    Controller        - Handle of device to stop driver on\r
-    NumberOfChildren  - Number of Children in the ChildHandleBuffer\r
-    ChildHandleBuffer - List of handles for the children we need to stop.\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_DEVICE_ERROR\r
-    others\r
-\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
-    (EFI_PERIPHERAL_MOUSE | EFI_P_PC_DISABLE)\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
-BOOLEAN\r
-IsUsbMouse (\r
-  IN  EFI_USB_IO_PROTOCOL     *UsbIo\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Tell if a Usb Controller is a mouse\r
-\r
-  Arguments:\r
-    UsbIo              - Protocol instance pointer.\r
-\r
-  Returns:\r
-    TRUE              - It is a mouse\r
-    FALSE             - It is not a mouse\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
-STATIC\r
-EFI_STATUS\r
-InitializeUsbMouseDevice (\r
-  IN  USB_MOUSE_DEV           *UsbMouseDev\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Initialize the Usb Mouse Device.\r
-\r
-  Arguments:\r
-    UsbMouseDev         - Device instance to be initialized\r
-\r
-  Returns:\r
-    EFI_SUCCESS         - Success\r
-    EFI_DEVICE_ERROR    - Init error.\r
-    EFI_OUT_OF_RESOURCES- Can't allocate memory\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
-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
-  Routine Description:\r
-    It is called whenever there is data received from async interrupt\r
-    transfer.\r
-\r
-  Arguments:\r
-    Data            - Data received.\r
-    DataLength      - Length of Data\r
-    Context         - Passed in context\r
-    Result          - Async Interrupt Transfer result\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_DEVICE_ERROR\r
-\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
-      (EFI_PERIPHERAL_MOUSE | EFI_P_EC_INPUT_ERROR)\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
-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
-\r
-  Routine Description:\r
-    Get the mouse state, see SIMPLE POINTER PROTOCOL.\r
-\r
-  Arguments:\r
-    This              - Protocol instance pointer.\r
-    MouseState        - Current mouse state\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-    EFI_DEVICE_ERROR\r
-    EFI_NOT_READY\r
-\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
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-UsbMouseReset (\r
-  IN EFI_SIMPLE_POINTER_PROTOCOL    *This,\r
-  IN BOOLEAN                        ExtendedVerification\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Reset the mouse device, see SIMPLE POINTER PROTOCOL.\r
-\r
-  Arguments:\r
-    This                  - Protocol instance pointer.\r
-    ExtendedVerification  - Ignored here/\r
-\r
-  Returns:\r
-    EFI_SUCCESS\r
-\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
-    (EFI_PERIPHERAL_MOUSE | EFI_P_PC_RESET)\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
-STATIC\r
-VOID\r
-EFIAPI\r
-UsbMouseWaitForInput (\r
-  IN  EFI_EVENT               Event,\r
-  IN  VOID                    *Context\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Event notification function for SIMPLE_POINTER.WaitForInput event\r
-  Signal the event if there is input from mouse\r
-\r
-Arguments:\r
-  Event    - Wait Event\r
-  Context  - Passed parameter to event handler\r
-Returns:\r
-  VOID\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
-VOID\r
-EFIAPI\r
-USBMouseRecoveryHandler (\r
-  IN    EFI_EVENT    Event,\r
-  IN    VOID         *Context\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Timer handler for Delayed Recovery timer.\r
-\r
-  Arguments:\r
-    Event   -  The Delayed Recovery event.\r
-    Context -  Points to the USB_KB_DEV instance.\r
-\r
-  Returns:\r
-\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
-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
-\r
-  Routine Description:\r
-    Report Status Code in Usb Bot Driver\r
-\r
-  Arguments:\r
-    DevicePath  - Use this to get Device Path\r
-    CodeType    - Status Code Type\r
-    CodeValue   - Status Code Value\r
-\r
-  Returns:\r
-    None\r
-\r
---*/\r
-{\r
-\r
-  REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
-    CodeType,\r
-    Value,\r
-    DevicePath\r
-    );\r
-}\r