diff options
Diffstat (limited to 'roms/edk2/MdePkg/Library/UefiUsbLib')
-rw-r--r-- | roms/edk2/MdePkg/Library/UefiUsbLib/Hid.c | 482 | ||||
-rw-r--r-- | roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.inf | 43 | ||||
-rw-r--r-- | roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.uni | 17 | ||||
-rw-r--r-- | roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLibInternal.h | 24 | ||||
-rw-r--r-- | roms/edk2/MdePkg/Library/UefiUsbLib/UsbDxeLib.c | 665 |
5 files changed, 1231 insertions, 0 deletions
diff --git a/roms/edk2/MdePkg/Library/UefiUsbLib/Hid.c b/roms/edk2/MdePkg/Library/UefiUsbLib/Hid.c new file mode 100644 index 000000000..1d6555271 --- /dev/null +++ b/roms/edk2/MdePkg/Library/UefiUsbLib/Hid.c @@ -0,0 +1,482 @@ +/** @file
+
+ The library provides USB HID Class standard and specific requests defined
+ in USB HID Firmware Specification 7 section : Requests.
+
+ Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "UefiUsbLibInternal.h"
+
+//
+// Hid RequestType Bits specifying characteristics of request.
+// Valid values are 10100001b (0xa1) or 00100001b (0x21).
+// The following description:
+// 7 Data transfer direction
+// 0 = Host to device
+// 1 = Device to host
+// 6..5 Type
+// 1 = Class
+// 4..0 Recipient
+// 1 = Interface
+//
+
+/**
+ Get the descriptor of the specified USB HID interface.
+
+ Submit a USB get HID descriptor request for the USB device specified by UsbIo
+ and Interface and return the HID descriptor in HidDescriptor.
+ If UsbIo is NULL, then ASSERT().
+ If HidDescriptor is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the HID interface on the USB target.
+ @param HidDescriptor The pointer to the USB HID descriptor that was retrieved from
+ the specified USB target and interface. Type EFI_USB_HID_DESCRIPTOR
+ is defined in the MDE Package Industry Standard include file Usb.h.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetHidDescriptor (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ OUT EFI_USB_HID_DESCRIPTOR *HidDescriptor
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT(UsbIo != NULL);
+ ASSERT(HidDescriptor != NULL);
+
+ Request.RequestType = USB_HID_GET_DESCRIPTOR_REQ_TYPE;
+ Request.Request = USB_REQ_GET_DESCRIPTOR;
+ Request.Value = (UINT16) (USB_DESC_TYPE_HID << 8);
+ Request.Index = Interface;
+ Request.Length = (UINT16) sizeof (EFI_USB_HID_DESCRIPTOR);
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ HidDescriptor,
+ sizeof (EFI_USB_HID_DESCRIPTOR),
+ &Status
+ );
+
+ return Result;
+
+}
+
+/**
+ Get the report descriptor of the specified USB HID interface.
+
+ Submit a USB get HID report descriptor request for the USB device specified by
+ UsbIo and Interface and return the report descriptor in DescriptorBuffer.
+ If UsbIo is NULL, then ASSERT().
+ If DescriptorBuffer is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the report interface on the USB target.
+ @param DescriptorLength The size, in bytes, of DescriptorBuffer.
+ @param DescriptorBuffer A pointer to the buffer to store the report class descriptor.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed because the
+ buffer specified by DescriptorLength and DescriptorBuffer
+ is not large enough to hold the result of the request.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetReportDescriptor (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ IN UINT16 DescriptorLength,
+ OUT UINT8 *DescriptorBuffer
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (DescriptorBuffer != NULL);
+
+ //
+ // Fill Device request packet
+ //
+ Request.RequestType = USB_HID_GET_DESCRIPTOR_REQ_TYPE;
+ Request.Request = USB_REQ_GET_DESCRIPTOR;
+ Request.Value = (UINT16) (USB_DESC_TYPE_REPORT << 8);
+ Request.Index = Interface;
+ Request.Length = DescriptorLength;
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ DescriptorBuffer,
+ DescriptorLength,
+ &Status
+ );
+
+ return Result;
+
+}
+
+/**
+ Get the HID protocol of the specified USB HID interface.
+
+ Submit a USB get HID protocol request for the USB device specified by UsbIo
+ and Interface and return the protocol retrieved in Protocol.
+ If UsbIo is NULL, then ASSERT().
+ If Protocol is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the report interface on the USB target.
+ @param Protocol A pointer to the protocol for the specified USB target.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetProtocolRequest (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ OUT UINT8 *Protocol
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Protocol != NULL);
+
+ //
+ // Fill Device request packet
+ //
+ Request.RequestType = USB_HID_CLASS_GET_REQ_TYPE;
+ Request.Request = EFI_USB_GET_PROTOCOL_REQUEST;
+ Request.Value = 0;
+ Request.Index = Interface;
+ Request.Length = 1;
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ Protocol,
+ sizeof (UINT8),
+ &Status
+ );
+
+ return Result;
+}
+
+
+
+/**
+ Set the HID protocol of the specified USB HID interface.
+
+ Submit a USB set HID protocol request for the USB device specified by UsbIo
+ and Interface and set the protocol to the value specified by Protocol.
+ If UsbIo is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the report interface on the USB target.
+ @param Protocol The protocol value to set for the specified USB target.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbSetProtocolRequest (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ IN UINT8 Protocol
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT (UsbIo != NULL);
+
+ //
+ // Fill Device request packet
+ //
+ Request.RequestType = USB_HID_CLASS_SET_REQ_TYPE;
+ Request.Request = EFI_USB_SET_PROTOCOL_REQUEST;
+ Request.Value = Protocol;
+ Request.Index = Interface;
+ Request.Length = 0;
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbNoData,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ NULL,
+ 0,
+ &Status
+ );
+ return Result;
+}
+
+
+/**
+ Set the idle rate of the specified USB HID report.
+
+ Submit a USB set HID report idle request for the USB device specified by UsbIo,
+ Interface, and ReportId, and set the idle rate to the value specified by Duration.
+ If UsbIo is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the report interface on the USB target.
+ @param ReportId The identifier of the report to retrieve.
+ @param Duration The idle rate to set for the specified USB target.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbSetIdleRequest (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ IN UINT8 ReportId,
+ IN UINT8 Duration
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT (UsbIo != NULL);
+ //
+ // Fill Device request packet
+ //
+ Request.RequestType = USB_HID_CLASS_SET_REQ_TYPE;
+ Request.Request = EFI_USB_SET_IDLE_REQUEST;
+ Request.Value = (UINT16) ((Duration << 8) | ReportId);
+ Request.Index = Interface;
+ Request.Length = 0;
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbNoData,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ NULL,
+ 0,
+ &Status
+ );
+ return Result;
+}
+
+
+/**
+ Get the idle rate of the specified USB HID report.
+
+ Submit a USB get HID report idle request for the USB device specified by UsbIo,
+ Interface, and ReportId, and return the ide rate in Duration.
+ If UsbIo is NULL, then ASSERT().
+ If Duration is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the report interface on the USB target.
+ @param ReportId The identifier of the report to retrieve.
+ @param Duration A pointer to the idle rate retrieved from the specified USB target.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetIdleRequest (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ IN UINT8 ReportId,
+ OUT UINT8 *Duration
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Duration != NULL);
+ //
+ // Fill Device request packet
+ //
+ Request.RequestType = USB_HID_CLASS_GET_REQ_TYPE;
+ Request.Request = EFI_USB_GET_IDLE_REQUEST;
+ Request.Value = ReportId;
+ Request.Index = Interface;
+ Request.Length = 1;
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ Duration,
+ 1,
+ &Status
+ );
+
+ return Result;
+}
+
+
+
+/**
+ Set the report descriptor of the specified USB HID interface.
+
+ Submit a USB set HID report request for the USB device specified by UsbIo,
+ Interface, ReportId, and ReportType, and set the report descriptor using the
+ buffer specified by ReportLength and Report.
+ If UsbIo is NULL, then ASSERT().
+ If Report is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the report interface on the USB target.
+ @param ReportId The identifier of the report to retrieve.
+ @param ReportType The type of report to retrieve.
+ @param ReportLength The size, in bytes, of Report.
+ @param Report A pointer to the report descriptor buffer to set.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbSetReportRequest (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ IN UINT8 ReportId,
+ IN UINT8 ReportType,
+ IN UINT16 ReportLen,
+ IN UINT8 *Report
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Report != NULL);
+
+ //
+ // Fill Device request packet
+ //
+ Request.RequestType = USB_HID_CLASS_SET_REQ_TYPE;
+ Request.Request = EFI_USB_SET_REPORT_REQUEST;
+ Request.Value = (UINT16) ((ReportType << 8) | ReportId);
+ Request.Index = Interface;
+ Request.Length = ReportLen;
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbDataOut,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ Report,
+ ReportLen,
+ &Status
+ );
+
+ return Result;
+}
+
+
+/**
+ Get the report descriptor of the specified USB HID interface.
+
+ Submit a USB get HID report request for the USB device specified by UsbIo,
+ Interface, ReportId, and ReportType, and return the report in the buffer
+ specified by Report.
+ If UsbIo is NULL, then ASSERT().
+ If Report is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The index of the report interface on the USB target.
+ @param ReportId The identifier of the report to retrieve.
+ @param ReportType The type of report to retrieve.
+ @param ReportLength The size, in bytes, of Report.
+ @param Report A pointer to the buffer to store the report descriptor.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed because the
+ buffer specified by ReportLength and Report is not
+ large enough to hold the result of the request.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetReportRequest (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Interface,
+ IN UINT8 ReportId,
+ IN UINT8 ReportType,
+ IN UINT16 ReportLen,
+ OUT UINT8 *Report
+ )
+{
+ UINT32 Status;
+ EFI_STATUS Result;
+ EFI_USB_DEVICE_REQUEST Request;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Report != NULL);
+
+ //
+ // Fill Device request packet
+ //
+ Request.RequestType = USB_HID_CLASS_GET_REQ_TYPE;
+ Request.Request = EFI_USB_GET_REPORT_REQUEST;
+ Request.Value = (UINT16) ((ReportType << 8) | ReportId);
+ Request.Index = Interface;
+ Request.Length = ReportLen;
+
+ Result = UsbIo->UsbControlTransfer (
+ UsbIo,
+ &Request,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ Report,
+ ReportLen,
+ &Status
+ );
+
+ return Result;
+}
diff --git a/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.inf b/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.inf new file mode 100644 index 000000000..bb483b922 --- /dev/null +++ b/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.inf @@ -0,0 +1,43 @@ +## @file
+# Uefi Usb Library instance.
+#
+# This library instance provides most usb APIs to support the Hid requests defined in
+# Usb Hid 1.1 spec and the standard requests defined in Usb 1.1 spec.
+#
+# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = UefiUsbLib
+ MODULE_UNI_FILE = UefiUsbLib.uni
+ FILE_GUID = 87eb5df9-722a-4241-ad7f-370d0b3a56d7
+ MODULE_TYPE = UEFI_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = UefiUsbLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
+
+
+#
+# VALID_ARCHITECTURES = IA32 X64 EBC
+#
+
+[Sources]
+ UefiUsbLibInternal.h
+ Hid.c
+ UsbDxeLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ DebugLib
+ BaseMemoryLib
+ PcdLib
+
+[Pcd]
+ gEfiMdePkgTokenSpaceGuid.PcdUsbTransferTimeoutValue ## CONSUMES
+
diff --git a/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.uni b/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.uni new file mode 100644 index 000000000..c0ebeaf20 --- /dev/null +++ b/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLib.uni @@ -0,0 +1,17 @@ +// /** @file
+// Uefi Usb Library instance.
+//
+// This library instance provides most usb APIs to support the Hid requests defined in
+// Usb Hid 1.1 spec and the standard requests defined in Usb 1.1 spec.
+//
+// Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+// **/
+
+
+#string STR_MODULE_ABSTRACT #language en-US "UEFI USB Library instance"
+
+#string STR_MODULE_DESCRIPTION #language en-US "This library instance provides most USB APIs to support the HID requests defined in the USB HID 1.1 specification and the standard requests defined in the USB 1.1 specification."
+
diff --git a/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLibInternal.h b/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLibInternal.h new file mode 100644 index 000000000..5909d96e9 --- /dev/null +++ b/roms/edk2/MdePkg/Library/UefiUsbLib/UefiUsbLibInternal.h @@ -0,0 +1,24 @@ +/** @file
+
+ Common header file shared by all source files.
+
+ This file includes package header files, library classes and protocol, PPI & GUID definitions.
+
+ Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef _UEFI_USB_LIB_INTERNAL_H_
+#define _UEFI_USB_LIB_INTERNAL_H_
+
+#include <Uefi.h>
+
+#include <Library/UefiUsbLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+
+#include <IndustryStandard/Usb.h>
+
+
+#endif
diff --git a/roms/edk2/MdePkg/Library/UefiUsbLib/UsbDxeLib.c b/roms/edk2/MdePkg/Library/UefiUsbLib/UsbDxeLib.c new file mode 100644 index 000000000..e75df8d04 --- /dev/null +++ b/roms/edk2/MdePkg/Library/UefiUsbLib/UsbDxeLib.c @@ -0,0 +1,665 @@ +/** @file
+
+ The library provides the USB Standard Device Requests defined
+ in Usb specification 9.4 section.
+
+ Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "UefiUsbLibInternal.h"
+
+
+/**
+ Get the descriptor of the specified USB device.
+
+ Submit a USB get descriptor request for the USB device specified by UsbIo, Value,
+ and Index, and return the descriptor in the buffer specified by Descriptor.
+ The status of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If Descriptor is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Value The device request value.
+ @param Index The device request index.
+ @param DescriptorLength The size, in bytes, of Descriptor.
+ @param Descriptor A pointer to the descriptor buffer to get.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed because the
+ buffer specified by DescriptorLength and Descriptor
+ is not large enough to hold the result of the request.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error. The transfer
+ status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetDescriptor (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT16 Value,
+ IN UINT16 Index,
+ IN UINT16 DescriptorLength,
+ OUT VOID *Descriptor,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Descriptor != NULL);
+ ASSERT (Status != NULL);
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ DevReq.RequestType = USB_DEV_GET_DESCRIPTOR_REQ_TYPE;
+ DevReq.Request = USB_REQ_GET_DESCRIPTOR;
+ DevReq.Value = Value;
+ DevReq.Index = Index;
+ DevReq.Length = DescriptorLength;
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ Descriptor,
+ DescriptorLength,
+ Status
+ );
+}
+
+
+/**
+ Set the descriptor of the specified USB device.
+
+ Submit a USB set descriptor request for the USB device specified by UsbIo,
+ Value, and Index, and set the descriptor using the buffer specified by DesriptorLength
+ and Descriptor. The status of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If Descriptor is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Value The device request value.
+ @param Index The device request index.
+ @param DescriptorLength The size, in bytes, of Descriptor.
+ @param Descriptor A pointer to the descriptor buffer to set.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbSetDescriptor (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT16 Value,
+ IN UINT16 Index,
+ IN UINT16 DescriptorLength,
+ IN VOID *Descriptor,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Descriptor != NULL);
+ ASSERT (Status != NULL);
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ DevReq.RequestType = USB_DEV_SET_DESCRIPTOR_REQ_TYPE;
+ DevReq.Request = USB_REQ_SET_DESCRIPTOR;
+ DevReq.Value = Value;
+ DevReq.Index = Index;
+ DevReq.Length = DescriptorLength;
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbDataOut,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ Descriptor,
+ DescriptorLength,
+ Status
+ );
+}
+
+
+/**
+ Get the interface setting of the specified USB device.
+
+ Submit a USB get interface request for the USB device specified by UsbIo,
+ and Interface, and place the result in the buffer specified by AlternateSetting.
+ The status of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If AlternateSetting is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The interface index value.
+ @param AlternateSetting A pointer to the alternate setting to be retrieved.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetInterface (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT16 Interface,
+ OUT UINT16 *AlternateSetting,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (AlternateSetting != NULL);
+ ASSERT (Status != NULL);
+
+ *AlternateSetting = 0;
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ DevReq.RequestType = USB_DEV_GET_INTERFACE_REQ_TYPE;
+ DevReq.Request = USB_REQ_GET_INTERFACE;
+ DevReq.Index = Interface;
+ DevReq.Length = 1;
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ AlternateSetting,
+ 1,
+ Status
+ );
+}
+
+
+/**
+ Set the interface setting of the specified USB device.
+
+ Submit a USB set interface request for the USB device specified by UsbIo, and
+ Interface, and set the alternate setting to the value specified by AlternateSetting.
+ The status of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Interface The interface index value.
+ @param AlternateSetting The alternate setting to be set.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_SUCCESS The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbSetInterface (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT16 Interface,
+ IN UINT16 AlternateSetting,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Status != NULL);
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ DevReq.RequestType = USB_DEV_SET_INTERFACE_REQ_TYPE;
+ DevReq.Request = USB_REQ_SET_INTERFACE;
+ DevReq.Value = AlternateSetting;
+ DevReq.Index = Interface;
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbNoData,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ NULL,
+ 0,
+ Status
+ );
+}
+
+
+/**
+ Get the device configuration.
+
+ Submit a USB get configuration request for the USB device specified by UsbIo
+ and place the result in the buffer specified by ConfigurationValue. The status
+ of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If ConfigurationValue is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param ConfigurationValue A pointer to the device configuration to be retrieved.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetConfiguration (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ OUT UINT16 *ConfigurationValue,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (ConfigurationValue != NULL);
+ ASSERT (Status != NULL);
+
+ *ConfigurationValue = 0;
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ DevReq.RequestType = USB_DEV_GET_CONFIGURATION_REQ_TYPE;
+ DevReq.Request = USB_REQ_GET_CONFIG;
+ DevReq.Length = 1;
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ ConfigurationValue,
+ 1,
+ Status
+ );
+}
+
+
+/**
+ Set the device configuration.
+
+ Submit a USB set configuration request for the USB device specified by UsbIo
+ and set the device configuration to the value specified by ConfigurationValue.
+ The status of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param ConfigurationValue The device configuration value to be set.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbSetConfiguration (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT16 ConfigurationValue,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Status != NULL);
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ DevReq.RequestType = USB_DEV_SET_CONFIGURATION_REQ_TYPE;
+ DevReq.Request = USB_REQ_SET_CONFIG;
+ DevReq.Value = ConfigurationValue;
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbNoData,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ NULL,
+ 0,
+ Status
+ );
+}
+
+
+/**
+ Set the specified feature of the specified device.
+
+ Submit a USB set device feature request for the USB device specified by UsbIo,
+ Recipient, and Target to the value specified by Value. The status of the
+ transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Recipient The USB data recipient type (i.e. Device, Interface, Endpoint).
+ Type USB_TYPES_DEFINITION is defined in the MDE Package Industry
+ Standard include file Usb.h.
+ @param Value The value of the feature to be set.
+ @param Target The index of the device to be set.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbSetFeature (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN USB_TYPES_DEFINITION Recipient,
+ IN UINT16 Value,
+ IN UINT16 Target,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Status != NULL);
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ switch (Recipient) {
+
+ case USB_TARGET_DEVICE:
+ DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_D;
+ break;
+
+ case USB_TARGET_INTERFACE:
+ DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_I;
+ break;
+
+ case USB_TARGET_ENDPOINT:
+ DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_E;
+ break;
+
+ default:
+ break;
+ }
+ //
+ // Fill device request, see USB1.1 spec
+ //
+ DevReq.Request = USB_REQ_SET_FEATURE;
+ DevReq.Value = Value;
+ DevReq.Index = Target;
+
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbNoData,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ NULL,
+ 0,
+ Status
+ );
+}
+
+
+/**
+ Clear the specified feature of the specified device.
+
+ Submit a USB clear device feature request for the USB device specified by UsbIo,
+ Recipient, and Target to the value specified by Value. The status of the transfer
+ is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Recipient The USB data recipient type (i.e. Device, Interface, Endpoint).
+ Type USB_TYPES_DEFINITION is defined in the MDE Package Industry Standard
+ include file Usb.h.
+ @param Value The value of the feature to be cleared.
+ @param Target The index of the device to be cleared.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbClearFeature (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN USB_TYPES_DEFINITION Recipient,
+ IN UINT16 Value,
+ IN UINT16 Target,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Status != NULL);
+
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ switch (Recipient) {
+
+ case USB_TARGET_DEVICE:
+ DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_D;
+ break;
+
+ case USB_TARGET_INTERFACE:
+ DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_I;
+ break;
+
+ case USB_TARGET_ENDPOINT:
+ DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E;
+ break;
+
+ default:
+ break;
+ }
+ //
+ // Fill device request, see USB1.1 spec
+ //
+ DevReq.Request = USB_REQ_CLEAR_FEATURE;
+ DevReq.Value = Value;
+ DevReq.Index = Target;
+
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbNoData,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ NULL,
+ 0,
+ Status
+ );
+}
+
+
+/**
+ Get the status of the specified device.
+
+ Submit a USB device get status request for the USB device specified by UsbIo,
+ Recipient, and Target and place the result in the buffer specified by DeviceStatus.
+ The status of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If DeviceStatus is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Recipient The USB data recipient type (i.e. Device, Interface, Endpoint).
+ Type USB_TYPES_DEFINITION is defined in the MDE Package Industry Standard
+ include file Usb.h.
+ @param Target The index of the device to be get the status of.
+ @param DeviceStatus A pointer to the device status to be retrieved.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+
+**/
+EFI_STATUS
+EFIAPI
+UsbGetStatus (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN USB_TYPES_DEFINITION Recipient,
+ IN UINT16 Target,
+ OUT UINT16 *DeviceStatus,
+ OUT UINT32 *Status
+ )
+{
+ EFI_USB_DEVICE_REQUEST DevReq;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (DeviceStatus != NULL);
+ ASSERT (Status != NULL);
+
+ ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST));
+
+ switch (Recipient) {
+
+ case USB_TARGET_DEVICE:
+ DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_D;
+ break;
+
+ case USB_TARGET_INTERFACE:
+ DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_I;
+ break;
+
+ case USB_TARGET_ENDPOINT:
+ DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_E;
+ break;
+
+ default:
+ break;
+ }
+ //
+ // Fill device request, see USB1.1 spec
+ //
+ DevReq.Request = USB_REQ_GET_STATUS;
+ DevReq.Value = 0;
+ DevReq.Index = Target;
+ DevReq.Length = 2;
+
+ return UsbIo->UsbControlTransfer (
+ UsbIo,
+ &DevReq,
+ EfiUsbDataIn,
+ PcdGet32 (PcdUsbTransferTimeoutValue),
+ DeviceStatus,
+ 2,
+ Status
+ );
+}
+
+
+/**
+ Clear halt feature of the specified usb endpoint.
+
+ Retrieve the USB endpoint descriptor specified by UsbIo and EndPoint.
+ If the USB endpoint descriptor can not be retrieved, then return EFI_NOT_FOUND.
+ If the endpoint descriptor is found, then clear the halt feature of this USB endpoint.
+ The status of the transfer is returned in Status.
+ If UsbIo is NULL, then ASSERT().
+ If Status is NULL, then ASSERT().
+
+ @param UsbIo A pointer to the USB I/O Protocol instance for the specific USB target.
+ @param Endpoint The endpoint address.
+ @param Status A pointer to the status of the transfer.
+
+ @retval EFI_SUCCESS The request executed successfully.
+ @retval EFI_TIMEOUT A timeout occurred executing the request.
+ @retval EFI_DEVICE_ERROR The request failed due to a device error.
+ The transfer status is returned in Status.
+ @retval EFI_NOT_FOUND The specified USB endpoint descriptor can not be found
+
+**/
+EFI_STATUS
+EFIAPI
+UsbClearEndpointHalt (
+ IN EFI_USB_IO_PROTOCOL *UsbIo,
+ IN UINT8 Endpoint,
+ OUT UINT32 *Status
+ )
+{
+ EFI_STATUS Result;
+ EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
+ EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
+ UINT8 Index;
+
+ ASSERT (UsbIo != NULL);
+ ASSERT (Status != NULL);
+
+ ZeroMem (&EndpointDescriptor, sizeof (EFI_USB_ENDPOINT_DESCRIPTOR));
+ //
+ // First search the endpoint descriptor for that endpoint addr
+ //
+ Result = UsbIo->UsbGetInterfaceDescriptor (
+ UsbIo,
+ &InterfaceDescriptor
+ );
+ if (EFI_ERROR (Result)) {
+ return Result;
+ }
+
+ for (Index = 0; Index < InterfaceDescriptor.NumEndpoints; Index++) {
+ Result = UsbIo->UsbGetEndpointDescriptor (
+ UsbIo,
+ Index,
+ &EndpointDescriptor
+ );
+ if (EFI_ERROR (Result)) {
+ continue;
+ }
+
+ if (EndpointDescriptor.EndpointAddress == Endpoint) {
+ break;
+ }
+ }
+
+ if (Index == InterfaceDescriptor.NumEndpoints) {
+ //
+ // No such endpoint
+ //
+ return EFI_NOT_FOUND;
+ }
+
+ Result = UsbClearFeature (
+ UsbIo,
+ USB_TARGET_ENDPOINT,
+ USB_FEATURE_ENDPOINT_HALT,
+ EndpointDescriptor.EndpointAddress,
+ Status
+ );
+
+ return Result;
+}
|