X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FUefiUsbLib%2FUsbDxeLib.c;h=b22a8294a4904b016ebd0ac6d072bb3a18cf8fbe;hb=881813d7a93d9009c873515b043c41c4554779e4;hp=6686291aa2eda746212fc284f6ef43d00f4d6c9f;hpb=7bc232b2072cac6adf3f6d1ad0c09bbb506422bb;p=mirror_edk2.git diff --git a/MdePkg/Library/UefiUsbLib/UsbDxeLib.c b/MdePkg/Library/UefiUsbLib/UsbDxeLib.c index 6686291aa2..b22a8294a4 100644 --- a/MdePkg/Library/UefiUsbLib/UsbDxeLib.c +++ b/MdePkg/Library/UefiUsbLib/UsbDxeLib.c @@ -1,35 +1,51 @@ -/*++ +/** @file -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + The library provides the USB Standard Device Requests defined + in Usb specification 9.4 section. + + Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are + licensed and made available under the terms and conditions of + the BSD License which accompanies this distribution. The full + text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - Module Name: +**/ - UsbDxeLib.c +#include "UefiUsbLibInternal.h" - Abstract: - Common Dxe Libarary for USB +/** + Get the descriptor of the specified USB device. - Revision History + 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. -// -// Include common header file for this module. -// -#include "CommonHeader.h" + @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. -// -// Get Device Descriptor -// +**/ EFI_STATUS +EFIAPI UsbGetDescriptor ( IN EFI_USB_IO_PROTOCOL *UsbIo, IN UINT16 Value, @@ -38,37 +54,17 @@ UsbGetDescriptor ( OUT VOID *Descriptor, OUT UINT32 *Status ) -/*++ - -Routine Description: - - Usb Get Descriptor - -Arguments: - - UsbIo - EFI_USB_IO_PROTOCOL - Value - Device Request Value - Index - Device Request Index - DescriptorLength - Descriptor Length - Descriptor - Descriptor buffer to contain result - Status - Transfer Status -Returns: - EFI_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response - ---*/ { EFI_USB_DEVICE_REQUEST DevReq; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + 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_DEV_GET_DESCRIPTOR; + DevReq.Request = USB_REQ_GET_DESCRIPTOR; DevReq.Value = Value; DevReq.Index = Index; DevReq.Length = DescriptorLength; @@ -77,16 +73,39 @@ Returns: UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), Descriptor, DescriptorLength, Status ); } -// -// Set Device Descriptor -// + + +/** + 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, @@ -95,37 +114,17 @@ UsbSetDescriptor ( IN VOID *Descriptor, OUT UINT32 *Status ) -/*++ - -Routine Description: - - Usb Set Descriptor - -Arguments: - - UsbIo - EFI_USB_IO_PROTOCOL - Value - Device Request Value - Index - Device Request Index - DescriptorLength - Descriptor Length - Descriptor - Descriptor buffer to set - Status - Transfer Status -Returns: - EFI_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response - ---*/ { EFI_USB_DEVICE_REQUEST DevReq; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + 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_DEV_SET_DESCRIPTOR; + DevReq.Request = USB_REQ_SET_DESCRIPTOR; DevReq.Value = Value; DevReq.Index = Index; DevReq.Length = DescriptorLength; @@ -134,284 +133,289 @@ Returns: UsbIo, &DevReq, EfiUsbDataOut, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), Descriptor, DescriptorLength, Status ); } -// -// Get device Interface -// -EFI_STATUS -UsbGetDeviceInterface ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - IN UINT16 Index, - OUT UINT8 *AltSetting, - OUT UINT32 *Status - ) -/*++ - -Routine Description: - Usb Get Device Interface +/** + Get the interface setting of the specified USB device. -Arguments: + 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(). - UsbIo - EFI_USB_IO_PROTOCOL - Index - Interface index value - AltSetting - Alternate setting - Status - Trasnsfer status + @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. -Returns: + @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_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response - - ---*/ +**/ +EFI_STATUS +EFIAPI +UsbGetInterface ( + IN EFI_USB_IO_PROTOCOL *UsbIo, + IN UINT16 Interface, + OUT UINT16 *AlternateSetting, + OUT UINT32 *Status + ) { EFI_USB_DEVICE_REQUEST DevReq; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + 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_DEV_GET_INTERFACE; - DevReq.Index = Index; + DevReq.Request = USB_REQ_GET_INTERFACE; + DevReq.Index = Interface; DevReq.Length = 1; return UsbIo->UsbControlTransfer ( UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, - AltSetting, + PcdGet32 (PcdUsbTransferTimeoutValue), + AlternateSetting, 1, Status ); } -// -// Set device interface -// -EFI_STATUS -UsbSetDeviceInterface ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - IN UINT16 InterfaceNo, - IN UINT16 AltSetting, - OUT UINT32 *Status - ) -/*++ -Routine Description: - Usb Set Device Interface +/** + Set the interface setting of the specified USB device. -Arguments: + 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(). - UsbIo - EFI_USB_IO_PROTOCOL - InterfaceNo - Interface Number - AltSetting - Alternate setting - Status - Trasnsfer status + @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. -Returns: + @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_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response - ---*/ +**/ +EFI_STATUS +EFIAPI +UsbSetInterface ( + IN EFI_USB_IO_PROTOCOL *UsbIo, + IN UINT16 Interface, + IN UINT16 AlternateSetting, + OUT UINT32 *Status + ) { EFI_USB_DEVICE_REQUEST DevReq; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + ASSERT (UsbIo != NULL); + ASSERT (Status != NULL); ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST)); DevReq.RequestType = USB_DEV_SET_INTERFACE_REQ_TYPE; - DevReq.Request = USB_DEV_SET_INTERFACE; - DevReq.Value = AltSetting; - DevReq.Index = InterfaceNo; - + DevReq.Request = USB_REQ_SET_INTERFACE; + DevReq.Value = AlternateSetting; + DevReq.Index = Interface; return UsbIo->UsbControlTransfer ( UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status ); } -// -// Get device configuration -// -EFI_STATUS -UsbGetDeviceConfiguration ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - OUT UINT8 *ConfigValue, - OUT UINT32 *Status - ) -/*++ -Routine Description: - Usb Get Device Configuration +/** + Get the device configuration. -Arguments: + 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(). - UsbIo - EFI_USB_IO_PROTOCOL - ConfigValue - Config Value - Status - Transfer Status + @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. -Returns: + @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_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response - ---*/ +**/ +EFI_STATUS +EFIAPI +UsbGetConfiguration ( + IN EFI_USB_IO_PROTOCOL *UsbIo, + OUT UINT16 *ConfigurationValue, + OUT UINT32 *Status + ) { EFI_USB_DEVICE_REQUEST DevReq; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + 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_DEV_GET_CONFIGURATION; + DevReq.Request = USB_REQ_GET_CONFIG; DevReq.Length = 1; return UsbIo->UsbControlTransfer ( UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, - ConfigValue, + PcdGet32 (PcdUsbTransferTimeoutValue), + ConfigurationValue, 1, Status ); } -// -// Set device configuration -// -EFI_STATUS -UsbSetDeviceConfiguration ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - IN UINT16 Value, - OUT UINT32 *Status - ) -/*++ - -Routine Description: - Usb Set Device Configuration -Arguments: +/** + Set the device configuration. - UsbIo - EFI_USB_IO_PROTOCOL - Value - Configuration Value to set - Status - Transfer status + 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(). -Returns: + @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. - EFI_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response + @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; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + ASSERT (UsbIo != NULL); + ASSERT (Status != NULL); ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST)); DevReq.RequestType = USB_DEV_SET_CONFIGURATION_REQ_TYPE; - DevReq.Request = USB_DEV_SET_CONFIGURATION; - DevReq.Value = Value; - + DevReq.Request = USB_REQ_SET_CONFIG; + DevReq.Value = ConfigurationValue; + return UsbIo->UsbControlTransfer ( UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status ); } -// -// Set Device Feature -// -EFI_STATUS -UsbSetDeviceFeature ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - IN EFI_USB_RECIPIENT Recipient, - IN UINT16 Value, - IN UINT16 Target, - OUT UINT32 *Status - ) -/*++ -Routine Description: - Usb Set Device Feature +/** + Set the specified feature of the specified device. -Arguments: + 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(). - UsbIo - EFI_USB_IO_PROTOCOL - Recipient - Interface/Device/Endpoint - Value - Request value - Target - Request Index - Status - Transfer status + @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. -Returns: - - EFI_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response + @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; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + ASSERT (UsbIo != NULL); + ASSERT (Status != NULL); ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST)); switch (Recipient) { - case EfiUsbDevice: - DevReq.RequestType = 0x00; + 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 EfiUsbInterface: - DevReq.RequestType = 0x01; + case USB_TARGET_ENDPOINT: + DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_E; break; - case EfiUsbEndpoint: - DevReq.RequestType = 0x02; + default: break; } // // Fill device request, see USB1.1 spec // - DevReq.Request = USB_DEV_SET_FEATURE; + DevReq.Request = USB_REQ_SET_FEATURE; DevReq.Value = Value; DevReq.Index = Target; @@ -420,71 +424,76 @@ Returns: UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status ); } -// -// Clear Device Feature -// -EFI_STATUS -UsbClearDeviceFeature ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - IN EFI_USB_RECIPIENT Recipient, - IN UINT16 Value, - IN UINT16 Target, - OUT UINT32 *Status - ) -/*++ -Routine Description: - Usb Clear Device Feature +/** + Clear the specified feature of the specified device. -Arguments: + 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(). - UsbIo - EFI_USB_IO_PROTOCOL - Recipient - Interface/Device/Endpoint - Value - Request value - Target - Request Index - Status - Transfer status + @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. -Returns: - - EFI_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response + @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; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + ASSERT (UsbIo != NULL); + ASSERT (Status != NULL); + ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST)); switch (Recipient) { - case EfiUsbDevice: - DevReq.RequestType = 0x00; + 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 EfiUsbInterface: - DevReq.RequestType = 0x01; + case USB_TARGET_ENDPOINT: + DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E; break; - case EfiUsbEndpoint: - DevReq.RequestType = 0x02; + default: break; } // // Fill device request, see USB1.1 spec // - DevReq.Request = USB_DEV_CLEAR_FEATURE; + DevReq.Request = USB_REQ_CLEAR_FEATURE; DevReq.Value = Value; DevReq.Index = Target; @@ -493,71 +502,77 @@ Returns: UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status ); } -// -// Get Device Status -// -EFI_STATUS -UsbGetDeviceStatus ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - IN EFI_USB_RECIPIENT Recipient, - IN UINT16 Target, - OUT UINT16 *DevStatus, - OUT UINT32 *Status - ) -/*++ -Routine Description: - Usb Get Device Status +/** + Get the status of the specified device. -Arguments: + 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(). - UsbIo - EFI_USB_IO_PROTOCOL - Recipient - Interface/Device/Endpoint - Target - Request index - DevStatus - Device status - Status - Transfer status + @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. -Returns: - - EFI_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response + @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; - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } + ASSERT (UsbIo != NULL); + ASSERT (DeviceStatus != NULL); + ASSERT (Status != NULL); ZeroMem (&DevReq, sizeof (EFI_USB_DEVICE_REQUEST)); switch (Recipient) { - case EfiUsbDevice: - DevReq.RequestType = 0x80; + 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 EfiUsbInterface: - DevReq.RequestType = 0x81; + case USB_TARGET_ENDPOINT: + DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_E; break; - case EfiUsbEndpoint: - DevReq.RequestType = 0x82; + default: break; } // // Fill device request, see USB1.1 spec // - DevReq.Request = USB_DEV_GET_STATUS; + DevReq.Request = USB_REQ_GET_STATUS; DevReq.Value = 0; DevReq.Index = Target; DevReq.Length = 2; @@ -566,98 +581,51 @@ Returns: UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, - DevStatus, + PcdGet32 (PcdUsbTransferTimeoutValue), + DeviceStatus, 2, Status ); } -// -// Usb Get String -// -EFI_STATUS -UsbGetString ( - IN EFI_USB_IO_PROTOCOL *UsbIo, - IN UINT16 LangID, - IN UINT8 Index, - IN VOID *Buf, - IN UINTN BufSize, - OUT UINT32 *Status - ) -/*++ - -Routine Description: - Usb Get String -Arguments: +/** + Clear halt feature of the specified usb endpoint. - UsbIo - EFI_USB_IO_PROTOCOL - LangID - Language ID - Index - Request index - Buf - Buffer to store string - BufSize - Buffer size - Status - Transfer status + 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(). -Returns: - - EFI_INVALID_PARAMETER - Parameter is error - EFI_SUCCESS - Success - EFI_TIMEOUT - Device has no response - ---*/ -{ - UINT16 Value; + @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. - if (UsbIo == NULL) { - return EFI_INVALID_PARAMETER; - } - // - // Fill value, see USB1.1 spec - // - Value = (UINT16) ((USB_DT_STRING << 8) | Index); - - return UsbGetDescriptor ( - UsbIo, - Value, - LangID, - (UINT16) BufSize, - Buf, - Status - ); -} + @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 EndpointNo, + IN UINT8 Endpoint, OUT UINT32 *Status ) -/*++ - -Routine Description: - - Clear endpoint stall - -Arguments: - - UsbIo - EFI_USB_IO_PROTOCOL - EndpointNo - Endpoint Number - Status - Transfer Status - -Returns: - - EFI_NOT_FOUND - Can't find the Endpoint - EFI_DEVICE_ERROR - Hardware error - EFI_SUCCESS - Success - ---*/ { 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 seach the endpoint descriptor for that endpoint addr @@ -680,7 +648,7 @@ Returns: continue; } - if (EndpointDescriptor.EndpointAddress == EndpointNo) { + if (EndpointDescriptor.EndpointAddress == Endpoint) { break; } } @@ -692,10 +660,10 @@ Returns: return EFI_NOT_FOUND; } - Result = UsbClearDeviceFeature ( + Result = UsbClearFeature ( UsbIo, - EfiUsbEndpoint, - EfiUsbEndpointHalt, + USB_TARGET_ENDPOINT, + USB_FEATURE_ENDPOINT_HALT, EndpointDescriptor.EndpointAddress, Status );