3 Copyright (c) 2004 - 2007, Intel Corporation
\r
4 All rights reserved. This program and the accompanying materials
\r
5 are licensed and made available under the terms and conditions of the BSD License
\r
6 which accompanies this distribution. The full text of the license may be found at
\r
7 http://opensource.org/licenses/bsd-license.php
\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
\r
21 #include "UsbMouse.h"
\r
23 #include <Library/DebugLib.h>
\r
24 #include <IndustryStandard/Usb.h>
\r
27 #include "usbmouse.h"
\r
28 #include "mousehid.h"
\r
32 // Driver model protocol interface
\r
36 USBMouseDriverBindingEntryPoint (
\r
37 IN EFI_HANDLE ImageHandle,
\r
38 IN EFI_SYSTEM_TABLE *SystemTable
\r
43 USBMouseDriverBindingSupported (
\r
44 IN EFI_DRIVER_BINDING_PROTOCOL *This,
\r
45 IN EFI_HANDLE Controller,
\r
46 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
\r
51 USBMouseDriverBindingStart (
\r
52 IN EFI_DRIVER_BINDING_PROTOCOL *This,
\r
53 IN EFI_HANDLE Controller,
\r
54 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
\r
59 USBMouseDriverBindingStop (
\r
60 IN EFI_DRIVER_BINDING_PROTOCOL *This,
\r
61 IN EFI_HANDLE Controller,
\r
62 IN UINTN NumberOfChildren,
\r
63 IN EFI_HANDLE *ChildHandleBuffer
\r
66 EFI_GUID gEfiUsbMouseDriverGuid = {
\r
67 0x290156b5, 0x6a05, 0x4ac0, {0xb8, 0x0, 0x51, 0x27, 0x55, 0xad, 0x14, 0x29}
\r
70 EFI_DRIVER_BINDING_PROTOCOL gUsbMouseDriverBinding = {
\r
71 USBMouseDriverBindingSupported,
\r
72 USBMouseDriverBindingStart,
\r
73 USBMouseDriverBindingStop,
\r
85 IN EFI_USB_IO_PROTOCOL *UsbIo
\r
90 InitializeUsbMouseDevice (
\r
91 IN USB_MOUSE_DEV *UsbMouseDev
\r
97 UsbMouseWaitForInput (
\r
103 // Mouse interrupt handler
\r
108 OnMouseInterruptComplete (
\r
110 IN UINTN DataLength,
\r
122 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
\r
123 OUT EFI_SIMPLE_POINTER_STATE *MouseState
\r
130 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
\r
131 IN BOOLEAN ExtendedVerification
\r
135 // Driver start here
\r
139 USBMouseDriverBindingEntryPoint (
\r
140 IN EFI_HANDLE ImageHandle,
\r
141 IN EFI_SYSTEM_TABLE *SystemTable
\r
145 Routine Description:
\r
146 Entry point for EFI drivers.
\r
149 ImageHandle - EFI_HANDLE
\r
150 SystemTable - EFI_SYSTEM_TABLE
\r
157 return EfiLibInstallAllDriverProtocols (
\r
160 &gUsbMouseDriverBinding,
\r
162 &gUsbMouseComponentName,
\r
170 Test to see if this driver supports ControllerHandle. Any ControllerHandle
\r
171 that has UsbHcProtocol installed will be supported.
\r
173 @param This Protocol instance pointer.
\r
174 @param Controller Handle of device to test
\r
175 @param RemainingDevicePath Not used
\r
177 @retval EFI_SUCCESS This driver supports this device.
\r
178 @retval EFI_UNSUPPORTED This driver does not support this device.
\r
183 USBMouseDriverBindingSupported (
\r
184 IN EFI_DRIVER_BINDING_PROTOCOL *This,
\r
185 IN EFI_HANDLE Controller,
\r
186 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
\r
189 EFI_STATUS OpenStatus;
\r
190 EFI_USB_IO_PROTOCOL *UsbIo;
\r
193 OpenStatus = gBS->OpenProtocol (
\r
195 &gEfiUsbIoProtocolGuid,
\r
197 This->DriverBindingHandle,
\r
199 EFI_OPEN_PROTOCOL_BY_DRIVER
\r
201 if (EFI_ERROR (OpenStatus) && (OpenStatus != EFI_ALREADY_STARTED)) {
\r
202 return EFI_UNSUPPORTED;
\r
205 if (OpenStatus == EFI_ALREADY_STARTED) {
\r
206 return EFI_ALREADY_STARTED;
\r
210 // Use the USB I/O protocol interface to see the Controller is
\r
211 // the Mouse controller that can be managed by this driver.
\r
213 Status = EFI_SUCCESS;
\r
214 if (!IsUsbMouse (UsbIo)) {
\r
215 Status = EFI_UNSUPPORTED;
\r
218 gBS->CloseProtocol (
\r
220 &gEfiUsbIoProtocolGuid,
\r
221 This->DriverBindingHandle,
\r
229 Starting the Usb Bus Driver
\r
231 @param This Protocol instance pointer.
\r
232 @param Controller Handle of device to test
\r
233 @param RemainingDevicePath Not used
\r
235 @retval EFI_SUCCESS This driver supports this device.
\r
236 @retval EFI_UNSUPPORTED This driver does not support this device.
\r
237 @retval EFI_DEVICE_ERROR This driver cannot be started due to device Error
\r
238 EFI_OUT_OF_RESOURCES- Can't allocate memory
\r
240 @retval EFI_ALREADY_STARTED Thios driver has been started
\r
245 USBMouseDriverBindingStart (
\r
246 IN EFI_DRIVER_BINDING_PROTOCOL *This,
\r
247 IN EFI_HANDLE Controller,
\r
248 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
\r
252 EFI_USB_IO_PROTOCOL *UsbIo;
\r
253 EFI_USB_ENDPOINT_DESCRIPTOR *EndpointDesc;
\r
254 USB_MOUSE_DEV *UsbMouseDevice;
\r
255 UINT8 EndpointNumber;
\r
257 UINT8 EndpointAddr;
\r
258 UINT8 PollingInterval;
\r
261 UsbMouseDevice = NULL;
\r
262 Status = EFI_SUCCESS;
\r
264 Status = gBS->OpenProtocol (
\r
266 &gEfiUsbIoProtocolGuid,
\r
268 This->DriverBindingHandle,
\r
270 EFI_OPEN_PROTOCOL_BY_DRIVER
\r
272 if (EFI_ERROR (Status)) {
\r
276 UsbMouseDevice = AllocateZeroPool (sizeof (USB_MOUSE_DEV));
\r
277 if (UsbMouseDevice == NULL) {
\r
278 Status = EFI_OUT_OF_RESOURCES;
\r
282 UsbMouseDevice->UsbIo = UsbIo;
\r
284 UsbMouseDevice->Signature = USB_MOUSE_DEV_SIGNATURE;
\r
286 UsbMouseDevice->InterfaceDescriptor = AllocatePool (sizeof (EFI_USB_INTERFACE_DESCRIPTOR));
\r
287 if (UsbMouseDevice->InterfaceDescriptor == NULL) {
\r
288 Status = EFI_OUT_OF_RESOURCES;
\r
292 EndpointDesc = AllocatePool (sizeof (EFI_USB_ENDPOINT_DESCRIPTOR));
\r
293 if (EndpointDesc == NULL) {
\r
294 Status = EFI_OUT_OF_RESOURCES;
\r
298 // Get the Device Path Protocol on Controller's handle
\r
300 Status = gBS->OpenProtocol (
\r
302 &gEfiDevicePathProtocolGuid,
\r
303 (VOID **) &UsbMouseDevice->DevicePath,
\r
304 This->DriverBindingHandle,
\r
306 EFI_OPEN_PROTOCOL_GET_PROTOCOL
\r
309 if (EFI_ERROR (Status)) {
\r
313 // Get interface & endpoint descriptor
\r
315 UsbIo->UsbGetInterfaceDescriptor (
\r
317 UsbMouseDevice->InterfaceDescriptor
\r
320 EndpointNumber = UsbMouseDevice->InterfaceDescriptor->NumEndpoints;
\r
322 for (Index = 0; Index < EndpointNumber; Index++) {
\r
323 UsbIo->UsbGetEndpointDescriptor (
\r
329 if ((EndpointDesc->Attributes & 0x03) == 0x03) {
\r
332 // We only care interrupt endpoint here
\r
334 UsbMouseDevice->IntEndpointDescriptor = EndpointDesc;
\r
338 if (UsbMouseDevice->IntEndpointDescriptor == NULL) {
\r
340 // No interrupt endpoint, then error
\r
342 Status = EFI_UNSUPPORTED;
\r
346 Status = InitializeUsbMouseDevice (UsbMouseDevice);
\r
347 if (EFI_ERROR (Status)) {
\r
348 MouseReportStatusCode (
\r
349 UsbMouseDevice->DevicePath,
\r
350 EFI_ERROR_CODE | EFI_ERROR_MINOR,
\r
351 PcdGet32 (PcdStatusCodeValueMouseInterfaceError)
\r
357 UsbMouseDevice->SimplePointerProtocol.GetState = GetMouseState;
\r
358 UsbMouseDevice->SimplePointerProtocol.Reset = UsbMouseReset;
\r
359 UsbMouseDevice->SimplePointerProtocol.Mode = &UsbMouseDevice->Mode;
\r
361 Status = gBS->CreateEvent (
\r
364 UsbMouseWaitForInput,
\r
366 &((UsbMouseDevice->SimplePointerProtocol).WaitForInput)
\r
368 if (EFI_ERROR (Status)) {
\r
372 Status = gBS->InstallProtocolInterface (
\r
374 &gEfiSimplePointerProtocolGuid,
\r
375 EFI_NATIVE_INTERFACE,
\r
376 &UsbMouseDevice->SimplePointerProtocol
\r
379 if (EFI_ERROR (Status)) {
\r
380 Status = EFI_DEVICE_ERROR;
\r
385 // After Enabling Async Interrupt Transfer on this mouse Device
\r
386 // we will be able to get key data from it. Thus this is deemed as
\r
387 // the enable action of the mouse
\r
390 MouseReportStatusCode (
\r
391 UsbMouseDevice->DevicePath,
\r
393 PcdGet32 (PcdStatusCodeValueMouseEnable)
\r
397 // submit async interrupt transfer
\r
399 EndpointAddr = UsbMouseDevice->IntEndpointDescriptor->EndpointAddress;
\r
400 PollingInterval = UsbMouseDevice->IntEndpointDescriptor->Interval;
\r
401 PacketSize = (UINT8) (UsbMouseDevice->IntEndpointDescriptor->MaxPacketSize);
\r
403 Status = UsbIo->UsbAsyncInterruptTransfer (
\r
409 OnMouseInterruptComplete,
\r
413 if (!EFI_ERROR (Status)) {
\r
415 UsbMouseDevice->ControllerNameTable = NULL;
\r
418 gUsbMouseComponentName.SupportedLanguages,
\r
419 &UsbMouseDevice->ControllerNameTable,
\r
420 L"Generic Usb Mouse"
\r
423 return EFI_SUCCESS;
\r
427 // If submit error, uninstall that interface
\r
429 Status = EFI_DEVICE_ERROR;
\r
430 gBS->UninstallProtocolInterface (
\r
432 &gEfiSimplePointerProtocolGuid,
\r
433 &UsbMouseDevice->SimplePointerProtocol
\r
437 if (EFI_ERROR (Status)) {
\r
438 gBS->CloseProtocol (
\r
440 &gEfiUsbIoProtocolGuid,
\r
441 This->DriverBindingHandle,
\r
445 if (UsbMouseDevice != NULL) {
\r
446 if (UsbMouseDevice->InterfaceDescriptor != NULL) {
\r
447 gBS->FreePool (UsbMouseDevice->InterfaceDescriptor);
\r
450 if (UsbMouseDevice->IntEndpointDescriptor != NULL) {
\r
451 gBS->FreePool (UsbMouseDevice->IntEndpointDescriptor);
\r
454 if ((UsbMouseDevice->SimplePointerProtocol).WaitForInput != NULL) {
\r
455 gBS->CloseEvent ((UsbMouseDevice->SimplePointerProtocol).WaitForInput);
\r
458 gBS->FreePool (UsbMouseDevice);
\r
459 UsbMouseDevice = NULL;
\r
468 Stop this driver on ControllerHandle. Support stoping any child handles
\r
469 created by this driver.
\r
471 @param This Protocol instance pointer.
\r
472 @param Controller Handle of device to stop driver on
\r
473 @param NumberOfChildren Number of Children in the ChildHandleBuffer
\r
474 @param ChildHandleBuffer List of handles for the children we need to stop.
\r
476 @return EFI_SUCCESS
\r
477 @return EFI_DEVICE_ERROR
\r
483 USBMouseDriverBindingStop (
\r
484 IN EFI_DRIVER_BINDING_PROTOCOL *This,
\r
485 IN EFI_HANDLE Controller,
\r
486 IN UINTN NumberOfChildren,
\r
487 IN EFI_HANDLE *ChildHandleBuffer
\r
491 USB_MOUSE_DEV *UsbMouseDevice;
\r
492 EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
\r
493 EFI_USB_IO_PROTOCOL *UsbIo;
\r
496 // Get our context back.
\r
498 Status = gBS->OpenProtocol (
\r
500 &gEfiSimplePointerProtocolGuid,
\r
501 (VOID **) &SimplePointerProtocol,
\r
502 This->DriverBindingHandle,
\r
504 EFI_OPEN_PROTOCOL_GET_PROTOCOL
\r
507 if (EFI_ERROR (Status)) {
\r
508 return EFI_UNSUPPORTED;
\r
511 UsbMouseDevice = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (SimplePointerProtocol);
\r
513 gBS->CloseProtocol (
\r
515 &gEfiSimplePointerProtocolGuid,
\r
516 This->DriverBindingHandle,
\r
520 UsbIo = UsbMouseDevice->UsbIo;
\r
523 // Uninstall the Asyn Interrupt Transfer from this device
\r
524 // will disable the mouse data input from this device
\r
526 MouseReportStatusCode (
\r
527 UsbMouseDevice->DevicePath,
\r
529 PcdGet32 (PcdStatusCodeValueMouseDisable)
\r
533 // Delete Mouse Async Interrupt Transfer
\r
535 UsbIo->UsbAsyncInterruptTransfer (
\r
537 UsbMouseDevice->IntEndpointDescriptor->EndpointAddress,
\r
539 UsbMouseDevice->IntEndpointDescriptor->Interval,
\r
545 gBS->CloseEvent (UsbMouseDevice->SimplePointerProtocol.WaitForInput);
\r
547 if (UsbMouseDevice->DelayedRecoveryEvent) {
\r
548 gBS->CloseEvent (UsbMouseDevice->DelayedRecoveryEvent);
\r
549 UsbMouseDevice->DelayedRecoveryEvent = 0;
\r
552 Status = gBS->UninstallProtocolInterface (
\r
554 &gEfiSimplePointerProtocolGuid,
\r
555 &UsbMouseDevice->SimplePointerProtocol
\r
557 if (EFI_ERROR (Status)) {
\r
561 gBS->CloseProtocol (
\r
563 &gEfiUsbIoProtocolGuid,
\r
564 This->DriverBindingHandle,
\r
568 gBS->FreePool (UsbMouseDevice->InterfaceDescriptor);
\r
569 gBS->FreePool (UsbMouseDevice->IntEndpointDescriptor);
\r
571 if (UsbMouseDevice->ControllerNameTable) {
\r
572 FreeUnicodeStringTable (UsbMouseDevice->ControllerNameTable);
\r
575 gBS->FreePool (UsbMouseDevice);
\r
577 return EFI_SUCCESS;
\r
583 Tell if a Usb Controller is a mouse
\r
585 @param UsbIo Protocol instance pointer.
\r
587 @retval TRUE It is a mouse
\r
588 @retval FALSE It is not a mouse
\r
593 IN EFI_USB_IO_PROTOCOL *UsbIo
\r
597 EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
\r
600 // Get the Default interface descriptor, now we only
\r
601 // suppose it is interface 1
\r
603 Status = UsbIo->UsbGetInterfaceDescriptor (
\r
605 &InterfaceDescriptor
\r
608 if (EFI_ERROR (Status)) {
\r
612 if ((InterfaceDescriptor.InterfaceClass == CLASS_HID) &&
\r
613 (InterfaceDescriptor.InterfaceSubClass == SUBCLASS_BOOT) &&
\r
614 (InterfaceDescriptor.InterfaceProtocol == PROTOCOL_MOUSE)
\r
624 Initialize the Usb Mouse Device.
\r
626 @param UsbMouseDev Device instance to be initialized
\r
628 @retval EFI_SUCCESS Success
\r
629 @retval EFI_DEVICE_ERROR Init error. EFI_OUT_OF_RESOURCES- Can't allocate
\r
635 InitializeUsbMouseDevice (
\r
636 IN USB_MOUSE_DEV *UsbMouseDev
\r
639 EFI_USB_IO_PROTOCOL *UsbIo;
\r
642 EFI_USB_HID_DESCRIPTOR MouseHidDesc;
\r
645 UsbIo = UsbMouseDev->UsbIo;
\r
648 // Get HID descriptor
\r
650 Status = UsbGetHidDescriptor (
\r
652 UsbMouseDev->InterfaceDescriptor->InterfaceNumber,
\r
656 if (EFI_ERROR (Status)) {
\r
661 // Get Report descriptor
\r
663 if (MouseHidDesc.HidClassDesc[0].DescriptorType != 0x22) {
\r
664 return EFI_UNSUPPORTED;
\r
667 ReportDesc = AllocateZeroPool (MouseHidDesc.HidClassDesc[0].DescriptorLength);
\r
668 if (ReportDesc == NULL) {
\r
669 return EFI_OUT_OF_RESOURCES;
\r
672 Status = UsbGetReportDescriptor (
\r
674 UsbMouseDev->InterfaceDescriptor->InterfaceNumber,
\r
675 MouseHidDesc.HidClassDesc[0].DescriptorLength,
\r
679 if (EFI_ERROR (Status)) {
\r
680 gBS->FreePool (ReportDesc);
\r
685 // Parse report descriptor
\r
687 Status = ParseMouseReportDescriptor (
\r
690 MouseHidDesc.HidClassDesc[0].DescriptorLength
\r
693 if (EFI_ERROR (Status)) {
\r
694 gBS->FreePool (ReportDesc);
\r
698 if (UsbMouseDev->NumberOfButtons >= 1) {
\r
699 UsbMouseDev->Mode.LeftButton = TRUE;
\r
702 if (UsbMouseDev->NumberOfButtons > 1) {
\r
703 UsbMouseDev->Mode.RightButton = TRUE;
\r
706 UsbMouseDev->Mode.ResolutionX = 8;
\r
707 UsbMouseDev->Mode.ResolutionY = 8;
\r
708 UsbMouseDev->Mode.ResolutionZ = 0;
\r
710 // Here we just assume interface 0 is the mouse interface
\r
712 UsbGetProtocolRequest (
\r
718 if (Protocol != BOOT_PROTOCOL) {
\r
719 Status = UsbSetProtocolRequest (
\r
725 if (EFI_ERROR (Status)) {
\r
726 gBS->FreePool (ReportDesc);
\r
727 return EFI_DEVICE_ERROR;
\r
732 // Set indefinite Idle rate for USB Mouse
\r
734 UsbSetIdleRequest (
\r
741 gBS->FreePool (ReportDesc);
\r
743 if (UsbMouseDev->DelayedRecoveryEvent) {
\r
744 gBS->CloseEvent (UsbMouseDev->DelayedRecoveryEvent);
\r
745 UsbMouseDev->DelayedRecoveryEvent = 0;
\r
748 Status = gBS->CreateEvent (
\r
749 EVT_TIMER | EVT_NOTIFY_SIGNAL,
\r
751 USBMouseRecoveryHandler,
\r
753 &UsbMouseDev->DelayedRecoveryEvent
\r
756 return EFI_SUCCESS;
\r
761 It is called whenever there is data received from async interrupt
\r
764 @param Data Data received.
\r
765 @param DataLength Length of Data
\r
766 @param Context Passed in context
\r
767 @param Result Async Interrupt Transfer result
\r
769 @return EFI_SUCCESS
\r
770 @return EFI_DEVICE_ERROR
\r
776 OnMouseInterruptComplete (
\r
778 IN UINTN DataLength,
\r
783 USB_MOUSE_DEV *UsbMouseDevice;
\r
784 EFI_USB_IO_PROTOCOL *UsbIo;
\r
785 UINT8 EndpointAddr;
\r
788 UsbMouseDevice = (USB_MOUSE_DEV *) Context;
\r
789 UsbIo = UsbMouseDevice->UsbIo;
\r
791 if (Result != EFI_USB_NOERROR) {
\r
793 // Some errors happen during the process
\r
795 MouseReportStatusCode (
\r
796 UsbMouseDevice->DevicePath,
\r
797 EFI_ERROR_CODE | EFI_ERROR_MINOR,
\r
798 PcdGet32 (PcdStatusCodeValueMouseInputError)
\r
801 if ((Result & EFI_USB_ERR_STALL) == EFI_USB_ERR_STALL) {
\r
802 EndpointAddr = UsbMouseDevice->IntEndpointDescriptor->EndpointAddress;
\r
804 UsbClearEndpointHalt (
\r
811 UsbIo->UsbAsyncInterruptTransfer (
\r
813 UsbMouseDevice->IntEndpointDescriptor->EndpointAddress,
\r
822 UsbMouseDevice->DelayedRecoveryEvent,
\r
824 EFI_USB_INTERRUPT_DELAY
\r
826 return EFI_DEVICE_ERROR;
\r
829 if (DataLength == 0 || Data == NULL) {
\r
830 return EFI_SUCCESS;
\r
833 UsbMouseDevice->StateChanged = TRUE;
\r
836 // Check mouse Data
\r
838 UsbMouseDevice->State.LeftButton = (BOOLEAN) (*(UINT8 *) Data & 0x01);
\r
839 UsbMouseDevice->State.RightButton = (BOOLEAN) (*(UINT8 *) Data & 0x02);
\r
840 UsbMouseDevice->State.RelativeMovementX += *((INT8 *) Data + 1);
\r
841 UsbMouseDevice->State.RelativeMovementY += *((INT8 *) Data + 2);
\r
843 if (DataLength > 3) {
\r
844 UsbMouseDevice->State.RelativeMovementZ += *((INT8 *) Data + 3);
\r
847 return EFI_SUCCESS;
\r
853 IN EFI_MOUSE_STATE *MouseState
\r
856 Aprint("(%x: %x, %x)\n",
\r
857 MouseState->ButtonStates,
\r
865 Get the mouse state, see SIMPLE POINTER PROTOCOL.
\r
867 @param This Protocol instance pointer.
\r
868 @param MouseState Current mouse state
\r
870 @return EFI_SUCCESS
\r
871 @return EFI_DEVICE_ERROR
\r
872 @return EFI_NOT_READY
\r
879 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
\r
880 OUT EFI_SIMPLE_POINTER_STATE *MouseState
\r
883 USB_MOUSE_DEV *MouseDev;
\r
885 if (MouseState == NULL) {
\r
886 return EFI_DEVICE_ERROR;
\r
889 MouseDev = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This);
\r
891 if (!MouseDev->StateChanged) {
\r
892 return EFI_NOT_READY;
\r
898 sizeof (EFI_SIMPLE_POINTER_STATE)
\r
902 // Clear previous move state
\r
904 MouseDev->State.RelativeMovementX = 0;
\r
905 MouseDev->State.RelativeMovementY = 0;
\r
906 MouseDev->State.RelativeMovementZ = 0;
\r
908 MouseDev->StateChanged = FALSE;
\r
910 return EFI_SUCCESS;
\r
915 Reset the mouse device, see SIMPLE POINTER PROTOCOL.
\r
917 @param This Protocol instance pointer.
\r
918 @param ExtendedVerification Ignored here/
\r
920 @return EFI_SUCCESS
\r
927 IN EFI_SIMPLE_POINTER_PROTOCOL *This,
\r
928 IN BOOLEAN ExtendedVerification
\r
931 USB_MOUSE_DEV *UsbMouseDevice;
\r
933 UsbMouseDevice = USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This);
\r
935 MouseReportStatusCode (
\r
936 UsbMouseDevice->DevicePath,
\r
938 PcdGet32 (PcdStatusCodeValueMouseReset)
\r
943 &UsbMouseDevice->State,
\r
944 sizeof (EFI_SIMPLE_POINTER_STATE)
\r
946 UsbMouseDevice->StateChanged = FALSE;
\r
948 return EFI_SUCCESS;
\r
953 Event notification function for SIMPLE_POINTER.WaitForInput event
\r
954 Signal the event if there is input from mouse
\r
956 @param Event Wait Event
\r
957 @param Context Passed parameter to event handler
\r
964 UsbMouseWaitForInput (
\r
965 IN EFI_EVENT Event,
\r
969 USB_MOUSE_DEV *UsbMouseDev;
\r
971 UsbMouseDev = (USB_MOUSE_DEV *) Context;
\r
974 // Someone is waiting on the mouse event, if there's
\r
975 // input from mouse, signal the event
\r
977 if (UsbMouseDev->StateChanged) {
\r
978 gBS->SignalEvent (Event);
\r
984 Timer handler for Delayed Recovery timer.
\r
986 @param Event The Delayed Recovery event.
\r
987 @param Context Points to the USB_KB_DEV instance.
\r
993 USBMouseRecoveryHandler (
\r
994 IN EFI_EVENT Event,
\r
998 USB_MOUSE_DEV *UsbMouseDev;
\r
999 EFI_USB_IO_PROTOCOL *UsbIo;
\r
1001 UsbMouseDev = (USB_MOUSE_DEV *) Context;
\r
1003 UsbIo = UsbMouseDev->UsbIo;
\r
1005 UsbIo->UsbAsyncInterruptTransfer (
\r
1007 UsbMouseDev->IntEndpointDescriptor->EndpointAddress,
\r
1009 UsbMouseDev->IntEndpointDescriptor->Interval,
\r
1010 UsbMouseDev->IntEndpointDescriptor->MaxPacketSize,
\r
1011 OnMouseInterruptComplete,
\r
1018 Report Status Code in Usb Bot Driver
\r
1020 @param DevicePath Use this to get Device Path
\r
1021 @param CodeType Status Code Type
\r
1022 @param CodeValue Status Code Value
\r
1028 MouseReportStatusCode (
\r
1029 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
\r
1030 IN EFI_STATUS_CODE_TYPE CodeType,
\r
1031 IN EFI_STATUS_CODE_VALUE Value
\r
1034 REPORT_STATUS_CODE_WITH_DEVICE_PATH (
\r