X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FUefiUsbLib%2FUsbDxeLib.c;h=b1fcbc50970fc5e9bd27cd5cefc624f8395a64ff;hb=c3c9892c3b4dafd1d0ccdc8e5e017d80e8c4361e;hp=90b0fd3ea5cc29233723f5ee269a5c5a1fd897ec;hpb=d35be2a434d347c0ff112f89c120a5c8a79c89a7;p=mirror_edk2.git diff --git a/MdePkg/Library/UefiUsbLib/UsbDxeLib.c b/MdePkg/Library/UefiUsbLib/UsbDxeLib.c index 90b0fd3ea5..b1fcbc5097 100644 --- a/MdePkg/Library/UefiUsbLib/UsbDxeLib.c +++ b/MdePkg/Library/UefiUsbLib/UsbDxeLib.c @@ -1,34 +1,47 @@ /** @file -Copyright (c) 2004 - 2007, 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. - - Common Dxe Libarary for USB + 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. **/ -#include +#include "UefiUsbLibInternal.h" /** - Usb Get Descriptor - - @param UsbIo EFI_USB_IO_PROTOCOL - @param Value Device Request Value - @param Index Device Request Index - @param DescriptorLength Descriptor Length - @param Descriptor Descriptor buffer to contain result - @param Status Transfer Status - - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + 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 @@ -44,9 +57,9 @@ UsbGetDescriptor ( { 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)); @@ -60,7 +73,7 @@ UsbGetDescriptor ( UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), Descriptor, DescriptorLength, Status @@ -69,18 +82,26 @@ UsbGetDescriptor ( /** - Usb Set Descriptor - - @param UsbIo EFI_USB_IO_PROTOCOL - @param Value Device Request Value - @param Index Device Request Index - @param DescriptorLength Descriptor Length - @param Descriptor Descriptor buffer to set - @param Status Transfer Status - - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + 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 @@ -96,9 +117,9 @@ UsbSetDescriptor ( { 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)); @@ -112,7 +133,7 @@ UsbSetDescriptor ( UsbIo, &DevReq, EfiUsbDataOut, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), Descriptor, DescriptorLength, Status @@ -121,46 +142,56 @@ UsbSetDescriptor ( /** - Usb Get Device Interface + 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 EFI_USB_IO_PROTOCOL - @param Index Interface index value - @param AltSetting Alternate setting - @param 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. - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval 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 UsbGetInterface ( IN EFI_USB_IO_PROTOCOL *UsbIo, - IN UINT16 Index, - OUT UINT8 *AltSetting, + 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_REQ_GET_INTERFACE; - DevReq.Index = Index; + DevReq.Index = Interface; DevReq.Length = 1; return UsbIo->UsbControlTransfer ( UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, - AltSetting, + PcdGet32 (PcdUsbTransferTimeoutValue), + AlternateSetting, 1, Status ); @@ -168,46 +199,51 @@ UsbGetInterface ( /** - Usb Set Device Interface + 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 EFI_USB_IO_PROTOCOL - @param InterfaceNo Interface Number - @param AltSetting Alternate setting - @param 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. - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + @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 InterfaceNo, - IN UINT16 AltSetting, + 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_REQ_SET_INTERFACE; - DevReq.Value = AltSetting; - DevReq.Index = InterfaceNo; - + DevReq.Value = AlternateSetting; + DevReq.Index = Interface; return UsbIo->UsbControlTransfer ( UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status @@ -216,30 +252,40 @@ UsbSetInterface ( /** - Usb Get Device Configuration + Get the device configuration. - @param UsbIo EFI_USB_IO_PROTOCOL - @param ConfigValue Config Value - @param Status Transfer Status + 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(). - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + @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 UINT8 *ConfigValue, + 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)); @@ -251,8 +297,8 @@ UsbGetConfiguration ( UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, - ConfigValue, + PcdGet32 (PcdUsbTransferTimeoutValue), + ConfigurationValue, 1, Status ); @@ -260,42 +306,48 @@ UsbGetConfiguration ( /** - Usb Set Device Configuration + Set the device configuration. - @param UsbIo EFI_USB_IO_PROTOCOL - @param Value Configuration Value to set - @param 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(). - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + @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 Value, + 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_REQ_SET_CONFIG; - DevReq.Value = Value; + DevReq.Value = ConfigurationValue; return UsbIo->UsbControlTransfer ( UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status @@ -304,24 +356,33 @@ UsbSetConfiguration ( /** - Usb Set Device Feature - - @param UsbIo EFI_USB_IO_PROTOCOL - @param Recipient Interface/Device/Endpoint - @param Value Request value - @param Target Request Index - @param Status Transfer status - - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + 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 UINTN Recipient, + IN USB_TYPES_DEFINITION Recipient, IN UINT16 Value, IN UINT16 Target, OUT UINT32 *Status @@ -329,9 +390,8 @@ UsbSetFeature ( { 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)); @@ -348,6 +408,9 @@ UsbSetFeature ( case USB_TARGET_ENDPOINT: DevReq.RequestType = USB_DEV_SET_FEATURE_REQ_TYPE_E; break; + + default: + break; } // // Fill device request, see USB1.1 spec @@ -361,7 +424,7 @@ UsbSetFeature ( UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status @@ -370,24 +433,33 @@ UsbSetFeature ( /** - Usb Clear Device Feature - - @param UsbIo EFI_USB_IO_PROTOCOL - @param Recipient Interface/Device/Endpoint - @param Value Request value - @param Target Request Index - @param Status Transfer status - - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + 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 UINTN Recipient, + IN USB_TYPES_DEFINITION Recipient, IN UINT16 Value, IN UINT16 Target, OUT UINT32 *Status @@ -395,9 +467,9 @@ UsbClearFeature ( { 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)); @@ -414,6 +486,9 @@ UsbClearFeature ( case USB_TARGET_ENDPOINT: DevReq.RequestType = USB_DEV_CLEAR_FEATURE_REQ_TYPE_E; break; + + default: + break; } // // Fill device request, see USB1.1 spec @@ -427,7 +502,7 @@ UsbClearFeature ( UsbIo, &DevReq, EfiUsbNoData, - TIMEOUT_VALUE, + PcdGet32 (PcdUsbTransferTimeoutValue), NULL, 0, Status @@ -436,34 +511,44 @@ UsbClearFeature ( /** - Usb Get Device Status - - @param UsbIo EFI_USB_IO_PROTOCOL - @param Recipient Interface/Device/Endpoint - @param Target Request index - @param DevStatus Device status - @param Status Transfer status - - @retval EFI_INVALID_PARAMETER Parameter is error - @retval EFI_SUCCESS Success - @retval EFI_TIMEOUT Device has no response + 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 UINTN Recipient, + IN USB_TYPES_DEFINITION Recipient, IN UINT16 Target, - OUT UINT16 *DevStatus, + 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)); @@ -480,6 +565,9 @@ UsbGetStatus ( case USB_TARGET_ENDPOINT: DevReq.RequestType = USB_DEV_GET_STATUS_REQ_TYPE_E; break; + + default: + break; } // // Fill device request, see USB1.1 spec @@ -493,32 +581,40 @@ UsbGetStatus ( UsbIo, &DevReq, EfiUsbDataIn, - TIMEOUT_VALUE, - DevStatus, + PcdGet32 (PcdUsbTransferTimeoutValue), + DeviceStatus, 2, Status ); } - /** - Clear endpoint stall + Clear halt feature of the specified usb endpoint. - @param UsbIo EFI_USB_IO_PROTOCOL - @param EndpointNo Endpoint Number - @param 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(). - @retval EFI_NOT_FOUND Can't find the Endpoint - @retval EFI_DEVICE_ERROR Hardware error - @retval EFI_SUCCESS Success + @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 EndpointNo, + IN UINT8 Endpoint, OUT UINT32 *Status ) { @@ -527,9 +623,12 @@ UsbClearEndpointHalt ( 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 + // First search the endpoint descriptor for that endpoint addr // Result = UsbIo->UsbGetInterfaceDescriptor ( UsbIo, @@ -549,7 +648,7 @@ UsbClearEndpointHalt ( continue; } - if (EndpointDescriptor.EndpointAddress == EndpointNo) { + if (EndpointDescriptor.EndpointAddress == Endpoint) { break; } }