Signed-off-by: Feng Tian <feng.tian@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14819 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			771 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			771 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
|     Usb Bus Driver Binding and Bus IO Protocol.
 | |
| 
 | |
| Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef _EFI_USB_BUS_H_
 | |
| #define _EFI_USB_BUS_H_
 | |
| 
 | |
| 
 | |
| #include <Uefi.h>
 | |
| 
 | |
| #include <Protocol/Usb2HostController.h>
 | |
| #include <Protocol/UsbHostController.h>
 | |
| #include <Protocol/UsbIo.h>
 | |
| #include <Protocol/DevicePath.h>
 | |
| 
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/UefiDriverEntryPoint.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/DevicePathLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| #include <Library/ReportStatusCodeLib.h>
 | |
| 
 | |
| 
 | |
| #include <IndustryStandard/Usb.h>
 | |
| 
 | |
| typedef struct _USB_DEVICE     USB_DEVICE;
 | |
| typedef struct _USB_INTERFACE  USB_INTERFACE;
 | |
| typedef struct _USB_BUS        USB_BUS;
 | |
| typedef struct _USB_HUB_API    USB_HUB_API;
 | |
| 
 | |
| 
 | |
| #include "UsbUtility.h"
 | |
| #include "UsbDesc.h"
 | |
| #include "UsbHub.h"
 | |
| #include "UsbEnumer.h"
 | |
| 
 | |
| //
 | |
| // USB bus timeout experience values
 | |
| //
 | |
| 
 | |
| #define USB_MAX_LANG_ID           16
 | |
| #define USB_MAX_INTERFACE         16
 | |
| #define USB_MAX_DEVICES           128
 | |
| 
 | |
| #define USB_BUS_1_MILLISECOND     1000
 | |
| 
 | |
| //
 | |
| // Roothub and hub's polling interval, set by experience,
 | |
| // The unit of roothub is 100us, means 100ms as interval, and
 | |
| // the unit of hub is 1ms, means 64ms as interval.
 | |
| //
 | |
| #define USB_ROOTHUB_POLL_INTERVAL (100 * 10000U)
 | |
| #define USB_HUB_POLL_INTERVAL     64
 | |
| 
 | |
| //
 | |
| // Wait for port stable to work, refers to specification
 | |
| // [USB20-9.1.2]
 | |
| //
 | |
| #define USB_WAIT_PORT_STABLE_STALL  (100 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Wait for port statue reg change, set by experience
 | |
| //
 | |
| #define USB_WAIT_PORT_STS_CHANGE_STALL (100)
 | |
| 
 | |
| //
 | |
| // Wait for set device address, refers to specification
 | |
| // [USB20-9.2.6.3, it says 2ms]
 | |
| //
 | |
| #define USB_SET_DEVICE_ADDRESS_STALL   (2 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Wait for retry max packet size, set by experience
 | |
| //
 | |
| #define USB_RETRY_MAX_PACK_SIZE_STALL  (100 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Wait for hub port power-on, refers to specification
 | |
| // [USB20-11.23.2]
 | |
| //
 | |
| #define USB_SET_PORT_POWER_STALL       (2 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Wait for port reset, refers to specification
 | |
| // [USB20-7.1.7.5, it says 10ms for hub and 50ms for
 | |
| // root hub]
 | |
| //
 | |
| // According to USB2.0, Chapter 11.5.1.5 Resetting,
 | |
| // the worst case for TDRST is 20ms
 | |
| //
 | |
| #define USB_SET_PORT_RESET_STALL       (20 * USB_BUS_1_MILLISECOND)
 | |
| #define USB_SET_ROOT_PORT_RESET_STALL  (50 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Wait for port recovery to accept SetAddress, refers to specification
 | |
| // [USB20-7.1.7.5, it says 10 ms for TRSTRCY]
 | |
| //
 | |
| #define USB_SET_PORT_RECOVERY_STALL    (10 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Wait for clear roothub port reset, set by experience
 | |
| //
 | |
| #define USB_CLR_ROOT_PORT_RESET_STALL  (20 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Wait for set roothub port enable, set by experience
 | |
| //
 | |
| #define USB_SET_ROOT_PORT_ENABLE_STALL (20 * USB_BUS_1_MILLISECOND)
 | |
| 
 | |
| //
 | |
| // Send general device request timeout.
 | |
| // 
 | |
| // The USB Specification 2.0, section 11.24.1 recommends a value of
 | |
| // 50 milliseconds.  We use a value of 500 milliseconds to work
 | |
| // around slower hubs and devices.
 | |
| //
 | |
| #define USB_GENERAL_DEVICE_REQUEST_TIMEOUT 500
 | |
| 
 | |
| //
 | |
| // Send clear feature request timeout, set by experience
 | |
| //
 | |
| #define USB_CLEAR_FEATURE_REQUEST_TIMEOUT  10
 | |
| 
 | |
| //
 | |
| // Bus raises TPL to TPL_NOTIFY to serialize all its operations
 | |
| // to protect shared data structures.
 | |
| //
 | |
| #define  USB_BUS_TPL               TPL_NOTIFY
 | |
| 
 | |
| #define  USB_INTERFACE_SIGNATURE   SIGNATURE_32 ('U', 'S', 'B', 'I')
 | |
| #define  USB_BUS_SIGNATURE         SIGNATURE_32 ('U', 'S', 'B', 'B')
 | |
| 
 | |
| #define USB_BIT(a)                  ((UINTN)(1 << (a)))
 | |
| #define USB_BIT_IS_SET(Data, Bit)   ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
 | |
| 
 | |
| #define USB_INTERFACE_FROM_USBIO(a) \
 | |
|           CR(a, USB_INTERFACE, UsbIo, USB_INTERFACE_SIGNATURE)
 | |
| 
 | |
| #define USB_BUS_FROM_THIS(a) \
 | |
|           CR(a, USB_BUS, BusId, USB_BUS_SIGNATURE)
 | |
| 
 | |
| //
 | |
| // Used to locate USB_BUS
 | |
| // UsbBusProtocol is the private protocol.
 | |
| // gEfiCallerIdGuid will be used as its protocol guid.
 | |
| //
 | |
| typedef struct _EFI_USB_BUS_PROTOCOL {
 | |
|   UINT64                    Reserved;
 | |
| } EFI_USB_BUS_PROTOCOL;
 | |
| 
 | |
| 
 | |
| //
 | |
| // Stands for the real USB device. Each device may
 | |
| // has several seperately working interfaces.
 | |
| //
 | |
| struct _USB_DEVICE {
 | |
|   USB_BUS                   *Bus;
 | |
| 
 | |
|   //
 | |
|   // Configuration information
 | |
|   //
 | |
|   UINT8                     Speed;
 | |
|   UINT8                     Address;
 | |
|   UINT32                    MaxPacket0;
 | |
| 
 | |
|   //
 | |
|   // The device's descriptors and its configuration
 | |
|   //
 | |
|   USB_DEVICE_DESC           *DevDesc;
 | |
|   USB_CONFIG_DESC           *ActiveConfig;
 | |
| 
 | |
|   UINT16                    LangId [USB_MAX_LANG_ID];
 | |
|   UINT16                    TotalLangId;
 | |
| 
 | |
|   UINT8                     NumOfInterface;
 | |
|   USB_INTERFACE             *Interfaces [USB_MAX_INTERFACE];
 | |
| 
 | |
|   //
 | |
|   // Parent child relationship
 | |
|   //
 | |
|   EFI_USB2_HC_TRANSACTION_TRANSLATOR Translator;
 | |
| 
 | |
|   UINT8                     ParentAddr;
 | |
|   USB_INTERFACE             *ParentIf;
 | |
|   UINT8                     ParentPort;       // Start at 0
 | |
|   UINT8                     Tier;
 | |
|   BOOLEAN                   DisconnectFail;
 | |
| };
 | |
| 
 | |
| //
 | |
| // Stands for different functions of USB device
 | |
| //
 | |
| struct _USB_INTERFACE {
 | |
|   UINTN                     Signature;
 | |
|   USB_DEVICE                *Device;
 | |
|   USB_INTERFACE_DESC        *IfDesc;
 | |
|   USB_INTERFACE_SETTING     *IfSetting;
 | |
| 
 | |
|   //
 | |
|   // Handles and protocols
 | |
|   //
 | |
|   EFI_HANDLE                Handle;
 | |
|   EFI_USB_IO_PROTOCOL       UsbIo;
 | |
|   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | |
|   BOOLEAN                   IsManaged;
 | |
| 
 | |
|   //
 | |
|   // Hub device special data
 | |
|   //
 | |
|   BOOLEAN                   IsHub;
 | |
|   USB_HUB_API               *HubApi;
 | |
|   UINT8                     NumOfPort;
 | |
|   EFI_EVENT                 HubNotify;
 | |
| 
 | |
|   //
 | |
|   // Data used only by normal hub devices
 | |
|   //
 | |
|   USB_ENDPOINT_DESC         *HubEp;
 | |
|   UINT8                     *ChangeMap;
 | |
| 
 | |
|   //
 | |
|   // Data used only by root hub to hand over device to
 | |
|   // companion UHCI driver if low/full speed devices are
 | |
|   // connected to EHCI.
 | |
|   //
 | |
|   UINT8                     MaxSpeed;
 | |
| };
 | |
| 
 | |
| //
 | |
| // Stands for the current USB Bus
 | |
| //
 | |
| struct _USB_BUS {
 | |
|   UINTN                     Signature;
 | |
|   EFI_USB_BUS_PROTOCOL      BusId;
 | |
| 
 | |
|   //
 | |
|   // Managed USB host controller
 | |
|   //
 | |
|   EFI_HANDLE                HostHandle;
 | |
|   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | |
|   EFI_USB2_HC_PROTOCOL      *Usb2Hc;
 | |
|   EFI_USB_HC_PROTOCOL       *UsbHc;
 | |
| 
 | |
|   //
 | |
|   // Recorded the max supported usb devices.
 | |
|   // XHCI can support up to 255 devices.
 | |
|   // EHCI/UHCI/OHCI supports up to 127 devices.
 | |
|   //
 | |
|   UINT32                    MaxDevices;
 | |
|   //
 | |
|   // An array of device that is on the bus. Devices[0] is
 | |
|   // for root hub. Device with address i is at Devices[i].
 | |
|   //
 | |
|   USB_DEVICE                *Devices[256];
 | |
| 
 | |
|   //
 | |
|   // USB Bus driver need to control the recursive connect policy of the bus, only those wanted
 | |
|   // usb child device will be recursively connected.
 | |
|   //
 | |
|   // WantedUsbIoDPList tracks the Usb child devices which user want to recursivly fully connecte,
 | |
|   // every wanted child device is stored in a item of the WantedUsbIoDPList, whose structrure is
 | |
|   // DEVICE_PATH_LIST_ITEM
 | |
|   //
 | |
|   LIST_ENTRY                WantedUsbIoDPList;
 | |
| 
 | |
| };
 | |
| 
 | |
| //
 | |
| // USB Hub Api
 | |
| //
 | |
| struct _USB_HUB_API{
 | |
|   USB_HUB_INIT                Init;
 | |
|   USB_HUB_GET_PORT_STATUS     GetPortStatus;
 | |
|   USB_HUB_CLEAR_PORT_CHANGE   ClearPortChange;
 | |
|   USB_HUB_SET_PORT_FEATURE    SetPortFeature;
 | |
|   USB_HUB_CLEAR_PORT_FEATURE  ClearPortFeature;
 | |
|   USB_HUB_RESET_PORT          ResetPort;
 | |
|   USB_HUB_RELEASE             Release;
 | |
| };
 | |
| 
 | |
| #define USB_US_LAND_ID   0x0409
 | |
| 
 | |
| #define DEVICE_PATH_LIST_ITEM_SIGNATURE     SIGNATURE_32('d','p','l','i')
 | |
| typedef struct _DEVICE_PATH_LIST_ITEM{
 | |
|   UINTN                                 Signature;
 | |
|   LIST_ENTRY                            Link;
 | |
|   EFI_DEVICE_PATH_PROTOCOL              *DevicePath;
 | |
| } DEVICE_PATH_LIST_ITEM;
 | |
| 
 | |
| typedef struct {
 | |
|   USB_CLASS_DEVICE_PATH           UsbClass;
 | |
|   EFI_DEVICE_PATH_PROTOCOL        End;
 | |
| } USB_CLASS_FORMAT_DEVICE_PATH;
 | |
| 
 | |
| /**
 | |
|   Free a DEVICE_PATH_LIST_ITEM list.
 | |
| 
 | |
|   @param  UsbIoDPList            a DEVICE_PATH_LIST_ITEM list pointer.
 | |
| 
 | |
|   @retval EFI_INVALID_PARAMETER  If parameters are invalid, return this value.
 | |
|   @retval EFI_SUCCESS            If free operation is successful, return this value.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusFreeUsbDPList (
 | |
|   IN     LIST_ENTRY                                 *UsbIoDPList
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Store a wanted usb child device info (its Usb part of device path) which is indicated by
 | |
|   RemainingDevicePath in a Usb bus which  is indicated by UsbBusId.
 | |
| 
 | |
|   @param  UsbBusId               Point to EFI_USB_BUS_PROTOCOL interface.
 | |
|   @param  RemainingDevicePath    The remaining device patch.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Add operation is successful.
 | |
|   @retval EFI_INVALID_PARAMETER  The parameters are invalid.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusAddWantedUsbIoDP (
 | |
|   IN EFI_USB_BUS_PROTOCOL         *UsbBusId,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Check whether a usb child device is the wanted device in a bus.
 | |
| 
 | |
|   @param  Bus     The Usb bus's private data pointer.
 | |
|   @param  UsbIf   The usb child device inferface.
 | |
| 
 | |
|   @retval True    If a usb child device is the wanted device in a bus.
 | |
|   @retval False   If a usb child device is *NOT* the wanted device in a bus.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| UsbBusIsWantedUsbIO (
 | |
|   IN USB_BUS                 *Bus,
 | |
|   IN USB_INTERFACE           *UsbIf
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Recursively connnect every wanted usb child device to ensure they all fully connected.
 | |
|   Check all the child Usb IO handles in this bus, recursively connecte if it is wanted usb child device.
 | |
| 
 | |
|   @param  UsbBusId                  Point to EFI_USB_BUS_PROTOCOL interface.
 | |
| 
 | |
|   @retval EFI_SUCCESS               Connect is done successfully.
 | |
|   @retval EFI_INVALID_PARAMETER     The parameter is invalid.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusRecursivelyConnectWantedUsbIo (
 | |
|   IN EFI_USB_BUS_PROTOCOL         *UsbBusId
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   USB_IO function to execute a control transfer. This
 | |
|   function will execute the USB transfer. If transfer
 | |
|   successes, it will sync the internal state of USB bus
 | |
|   with device state.
 | |
| 
 | |
|   @param  This                   The USB_IO instance
 | |
|   @param  Request                The control transfer request
 | |
|   @param  Direction              Direction for data stage
 | |
|   @param  Timeout                The time to wait before timeout
 | |
|   @param  Data                   The buffer holding the data
 | |
|   @param  DataLength             Then length of the data
 | |
|   @param  UsbStatus              USB result
 | |
| 
 | |
|   @retval EFI_INVALID_PARAMETER  The parameters are invalid
 | |
|   @retval EFI_SUCCESS            The control transfer succeded.
 | |
|   @retval Others                 Failed to execute the transfer
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoControlTransfer (
 | |
|   IN  EFI_USB_IO_PROTOCOL     *This,
 | |
|   IN  EFI_USB_DEVICE_REQUEST  *Request,
 | |
|   IN  EFI_USB_DATA_DIRECTION  Direction,
 | |
|   IN  UINT32                  Timeout,
 | |
|   IN  OUT VOID                *Data,      OPTIONAL
 | |
|   IN  UINTN                   DataLength, OPTIONAL
 | |
|   OUT UINT32                  *UsbStatus
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Execute a bulk transfer to the device endpoint.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  Endpoint               The device endpoint.
 | |
|   @param  Data                   The data to transfer.
 | |
|   @param  DataLength             The length of the data to transfer.
 | |
|   @param  Timeout                Time to wait before timeout.
 | |
|   @param  UsbStatus              The result of USB transfer.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The bulk transfer is OK.
 | |
|   @retval EFI_INVALID_PARAMETER  Some parameters are invalid.
 | |
|   @retval Others                 Failed to execute transfer, reason returned in
 | |
|                                  UsbStatus.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoBulkTransfer (
 | |
|   IN  EFI_USB_IO_PROTOCOL *This,
 | |
|   IN  UINT8               Endpoint,
 | |
|   IN  OUT VOID            *Data,
 | |
|   IN  OUT UINTN           *DataLength,
 | |
|   IN  UINTN               Timeout,
 | |
|   OUT UINT32              *UsbStatus
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Execute a synchronous interrupt transfer.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  Endpoint               The device endpoint.
 | |
|   @param  Data                   The data to transfer.
 | |
|   @param  DataLength             The length of the data to transfer.
 | |
|   @param  Timeout                Time to wait before timeout.
 | |
|   @param  UsbStatus              The result of USB transfer.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The synchronous interrupt transfer is OK.
 | |
|   @retval EFI_INVALID_PARAMETER  Some parameters are invalid.
 | |
|   @retval Others                 Failed to execute transfer, reason returned in
 | |
|                                  UsbStatus.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoSyncInterruptTransfer (
 | |
|   IN  EFI_USB_IO_PROTOCOL *This,
 | |
|   IN  UINT8               Endpoint,
 | |
|   IN  OUT VOID            *Data,
 | |
|   IN  OUT UINTN           *DataLength,
 | |
|   IN  UINTN               Timeout,
 | |
|   OUT UINT32              *UsbStatus
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Queue a new asynchronous interrupt transfer, or remove the old
 | |
|   request if (IsNewTransfer == FALSE).
 | |
| 
 | |
|   @param  This                   The USB_IO instance.
 | |
|   @param  Endpoint               The device endpoint.
 | |
|   @param  IsNewTransfer          Whether this is a new request, if it's old, remove
 | |
|                                  the request.
 | |
|   @param  PollInterval           The interval to poll the transfer result, (in ms).
 | |
|   @param  DataLength             The length of perodic data transfer.
 | |
|   @param  Callback               The function to call periodicaly when transfer is
 | |
|                                  ready.
 | |
|   @param  Context                The context to the callback.
 | |
| 
 | |
|   @retval EFI_SUCCESS            New transfer is queued or old request is removed.
 | |
|   @retval EFI_INVALID_PARAMETER  Some parameters are invalid.
 | |
|   @retval Others                 Failed to queue the new request or remove the old
 | |
|                                  request.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoAsyncInterruptTransfer (
 | |
|   IN EFI_USB_IO_PROTOCOL              *This,
 | |
|   IN UINT8                            Endpoint,
 | |
|   IN BOOLEAN                          IsNewTransfer,
 | |
|   IN UINTN                            PollInterval,       OPTIONAL
 | |
|   IN UINTN                            DataLength,         OPTIONAL
 | |
|   IN EFI_ASYNC_USB_TRANSFER_CALLBACK  Callback,           OPTIONAL
 | |
|   IN VOID                             *Context            OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Execute a synchronous isochronous transfer.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  DeviceEndpoint         The device endpoint.
 | |
|   @param  Data                   The data to transfer.
 | |
|   @param  DataLength             The length of the data to transfer.
 | |
|   @param  UsbStatus              The result of USB transfer.
 | |
| 
 | |
|   @retval EFI_UNSUPPORTED        Currently isochronous transfer isn't supported.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoIsochronousTransfer (
 | |
|   IN  EFI_USB_IO_PROTOCOL *This,
 | |
|   IN  UINT8               DeviceEndpoint,
 | |
|   IN  OUT VOID            *Data,
 | |
|   IN  UINTN               DataLength,
 | |
|   OUT UINT32              *Status
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Queue an asynchronous isochronous transfer.
 | |
| 
 | |
|   @param  This                   The USB_IO instance.
 | |
|   @param  DeviceEndpoint         The device endpoint.
 | |
|   @param  Data                   The data to transfer.
 | |
|   @param  DataLength             The length of perodic data transfer.
 | |
|   @param  IsochronousCallBack    The function to call periodicaly when transfer is
 | |
|                                  ready.
 | |
|   @param  Context                The context to the callback.
 | |
| 
 | |
|   @retval EFI_UNSUPPORTED        Currently isochronous transfer isn't supported.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoAsyncIsochronousTransfer (
 | |
|   IN EFI_USB_IO_PROTOCOL              *This,
 | |
|   IN UINT8                            DeviceEndpoint,
 | |
|   IN OUT VOID                         *Data,
 | |
|   IN UINTN                            DataLength,
 | |
|   IN EFI_ASYNC_USB_TRANSFER_CALLBACK  IsochronousCallBack,
 | |
|   IN VOID                             *Context              OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Retrieve the device descriptor of the device.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  Descriptor             The variable to receive the device descriptor.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The device descriptor is returned.
 | |
|   @retval EFI_INVALID_PARAMETER  The parameter is invalid.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoGetDeviceDescriptor (
 | |
|   IN  EFI_USB_IO_PROTOCOL       *This,
 | |
|   OUT EFI_USB_DEVICE_DESCRIPTOR *Descriptor
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Return the configuration descriptor of the current active configuration.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  Descriptor             The USB configuration descriptor.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The active configuration descriptor is returned.
 | |
|   @retval EFI_INVALID_PARAMETER  Some parameter is invalid.
 | |
|   @retval EFI_NOT_FOUND          Currently no active configuration is selected.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoGetActiveConfigDescriptor (
 | |
|   IN  EFI_USB_IO_PROTOCOL       *This,
 | |
|   OUT EFI_USB_CONFIG_DESCRIPTOR *Descriptor
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Retrieve the active interface setting descriptor for this USB IO instance.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  Descriptor             The variable to receive active interface setting.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The active interface setting is returned.
 | |
|   @retval EFI_INVALID_PARAMETER  Some parameter is invalid.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoGetInterfaceDescriptor (
 | |
|   IN  EFI_USB_IO_PROTOCOL           *This,
 | |
|   OUT EFI_USB_INTERFACE_DESCRIPTOR  *Descriptor
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Retrieve the endpoint descriptor from this interface setting.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  Index                  The index (start from zero) of the endpoint to
 | |
|                                  retrieve.
 | |
|   @param  Descriptor             The variable to receive the descriptor.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The endpoint descriptor is returned.
 | |
|   @retval EFI_INVALID_PARAMETER  Some parameter is invalid.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoGetEndpointDescriptor (
 | |
|   IN  EFI_USB_IO_PROTOCOL         *This,
 | |
|   IN  UINT8                       Index,
 | |
|   OUT EFI_USB_ENDPOINT_DESCRIPTOR *Descriptor
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Retrieve the supported language ID table from the device.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  LangIDTable            The table to return the language IDs.
 | |
|   @param  TableSize              The size, in bytes, of the table LangIDTable.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The language ID is return.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoGetSupportedLanguages (
 | |
|   IN  EFI_USB_IO_PROTOCOL *This,
 | |
|   OUT UINT16              **LangIDTable,
 | |
|   OUT UINT16              *TableSize
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Retrieve an indexed string in the language of LangID.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
|   @param  LangID                 The language ID of the string to retrieve.
 | |
|   @param  StringIndex            The index of the string.
 | |
|   @param  String                 The variable to receive the string.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The string is returned.
 | |
|   @retval EFI_NOT_FOUND          No such string existed.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoGetStringDescriptor (
 | |
|   IN  EFI_USB_IO_PROTOCOL   *This,
 | |
|   IN  UINT16                LangID,
 | |
|   IN  UINT8                 StringIndex,
 | |
|   OUT CHAR16                **String
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Reset the device, then if that succeeds, reconfigure the
 | |
|   device with its address and current active configuration.
 | |
| 
 | |
|   @param  This                   The USB IO instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The device is reset and configured.
 | |
|   @retval Others                 Failed to reset the device.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbIoPortReset (
 | |
|   IN EFI_USB_IO_PROTOCOL  *This
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Install Usb Bus Protocol on host controller, and start the Usb bus.
 | |
| 
 | |
|   @param This                    The USB bus driver binding instance.
 | |
|   @param Controller              The controller to check.
 | |
|   @param RemainingDevicePath     The remaining device patch.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The controller is controlled by the usb bus.
 | |
|   @retval EFI_ALREADY_STARTED    The controller is already controlled by the usb bus.
 | |
|   @retval EFI_OUT_OF_RESOURCES   Failed to allocate resources.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusBuildProtocol (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | |
|   IN EFI_HANDLE                   Controller,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   The USB bus driver entry pointer.
 | |
| 
 | |
|   @param ImageHandle       The driver image handle.
 | |
|   @param SystemTable       The system table.
 | |
| 
 | |
|   @return EFI_SUCCESS      The component name protocol is installed.
 | |
|   @return Others           Failed to init the usb driver.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusDriverEntryPoint (
 | |
|   IN EFI_HANDLE           ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE     *SystemTable
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Check whether USB bus driver support this device.
 | |
| 
 | |
|   @param  This                   The USB bus driver binding protocol.
 | |
|   @param  Controller             The controller handle to check.
 | |
|   @param  RemainingDevicePath    The remaining device path.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The bus supports this controller.
 | |
|   @retval EFI_UNSUPPORTED        This device isn't supported.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusControllerDriverSupported (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | |
|   IN EFI_HANDLE                   Controller,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Start to process the controller.
 | |
| 
 | |
|   @param  This                   The USB bus driver binding instance.
 | |
|   @param  Controller             The controller to check.
 | |
|   @param  RemainingDevicePath    The remaining device patch.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The controller is controlled by the usb bus.
 | |
|   @retval EFI_ALREADY_STARTED    The controller is already controlled by the usb
 | |
|                                  bus.
 | |
|   @retval EFI_OUT_OF_RESOURCES   Failed to allocate resources.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusControllerDriverStart (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | |
|   IN EFI_HANDLE                   Controller,
 | |
|   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Stop handle the controller by this USB bus driver.
 | |
| 
 | |
|   @param  This                   The USB bus driver binding protocol.
 | |
|   @param  Controller             The controller to release.
 | |
|   @param  NumberOfChildren       The child of USB bus that opened controller
 | |
|                                  BY_CHILD.
 | |
|   @param  ChildHandleBuffer      The array of child handle.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The controller or children are stopped.
 | |
|   @retval EFI_DEVICE_ERROR       Failed to stop the driver.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UsbBusControllerDriverStop (
 | |
|   IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | |
|   IN EFI_HANDLE                   Controller,
 | |
|   IN UINTN                        NumberOfChildren,
 | |
|   IN EFI_HANDLE                   *ChildHandleBuffer
 | |
|   );
 | |
| 
 | |
| extern EFI_USB_IO_PROTOCOL            mUsbIoProtocol;
 | |
| extern EFI_DRIVER_BINDING_PROTOCOL    mUsbBusDriverBinding;
 | |
| extern EFI_COMPONENT_NAME_PROTOCOL    mUsbBusComponentName;
 | |
| extern EFI_COMPONENT_NAME2_PROTOCOL   mUsbBusComponentName2;
 | |
| 
 | |
| #endif
 |