]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg: Add UEFI2.5 USB Function I/O protocol definitions
authorFeng Tian <feng.tian@intel.com>
Tue, 5 May 2015 07:29:56 +0000 (07:29 +0000)
committererictian <erictian@Edk2>
Tue, 5 May 2015 07:29:56 +0000 (07:29 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Feng Tian <feng.tian@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17295 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Include/Protocol/UsbFunctionIo.h [new file with mode: 0644]
MdePkg/MdePkg.dec

diff --git a/MdePkg/Include/Protocol/UsbFunctionIo.h b/MdePkg/Include/Protocol/UsbFunctionIo.h
new file mode 100644 (file)
index 0000000..4422567
--- /dev/null
@@ -0,0 +1,683 @@
+/** @file
+  The USB Function Protocol provides an I/O abstraction for a USB Controller
+  operating in Function mode (also commonly referred to as Device, Peripheral,
+  or Target mode) and the mechanisms by which the USB Function can communicate
+  with the USB Host. It is used by other UEFI drivers or applications to
+  perform data transactions and basic USB controller management over a USB
+  Function port.
+
+  This simple protocol only supports USB 2.0 bulk transfers on systems with a
+  single configuration and a single interface. It does not support isochronous
+  or interrupt transfers, alternate interfaces, or USB 3.0 functionality.
+  Future revisions of this protocol may support these or additional features.
+
+  Copyright (c) 2015, 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 __USB_FUNCTION_IO_H__
+#define __USB_FUNCTION_IO_H__
+
+#include <Protocol/UsbIo.h>
+
+#define EFI_USBFN_IO_PROTOCOL_GUID \
+    { \
+      0x32d2963a, 0xfe5d, 0x4f30, {0xb6, 0x33, 0x6e, 0x5d, 0xc5, 0x58, 0x3, 0xcc} \
+    }
+
+typedef struct _EFI_USBFN_IO_PROTOCOL  EFI_USBFN_IO_PROTOCOL;
+
+#define EFI_USBFN_IO_PROTOCOL_REVISION 0x00010001
+
+typedef enum _EFI_USBFN_PORT_TYPE {
+  EfiUsbUnknownPort = 0,
+  EfiUsbStandardDownstreamPort,
+  EfiUsbChargingDownstreamPort,
+  EfiUsbDedicatedChargingPort,
+  EfiUsbInvalidDedicatedChargingPort
+} EFI_USBFN_PORT_TYPE;
+
+typedef struct {
+  EFI_USB_INTERFACE_DESCRIPTOR         *InterfaceDescriptor;
+  EFI_USB_ENDPOINT_DESCRIPTOR          **EndpointDescriptorTable;
+} EFI_USB_INTERFACE_INFO;
+
+typedef struct {
+  EFI_USB_CONFIG_DESCRIPTOR            *ConfigDescriptor;
+  EFI_USB_INTERFACE_INFO               **InterfaceInfoTable;
+} EFI_USB_CONFIG_INFO;
+
+typedef struct {
+  EFI_USB_DEVICE_DESCRIPTOR            *DeviceDescriptor;
+  EFI_USB_CONFIG_INFO                  **ConfigInfoTable;
+} EFI_USB_DEVICE_INFO;
+
+typedef enum _EFI_USB_ENDPOINT_TYPE {
+  UsbEndpointControl = 0x00,
+  //UsbEndpointIsochronous = 0x01,
+  UsbEndpointBulk = 0x02,
+  //UsbEndpointInterrupt = 0x03
+} EFI_USB_ENDPOINT_TYPE;
+
+typedef enum _EFI_USBFN_DEVICE_INFO_ID {
+  EfiUsbDeviceInfoUnknown = 0,
+  EfiUsbDeviceInfoSerialNumber,
+  EfiUsbDeviceInfoManufacturerName,
+  EfiUsbDeviceInfoProductName
+} EFI_USBFN_DEVICE_INFO_ID;
+
+typedef enum _EFI_USBFN_ENDPOINT_DIRECTION {
+  EfiUsbEndpointDirectionHostOut = 0,
+  EfiUsbEndpointDirectionHostIn,
+  EfiUsbEndpointDirectionDeviceTx = EfiUsbEndpointDirectionHostIn,
+  EfiUsbEndpointDirectionDeviceRx = EfiUsbEndpointDirectionHostOut
+} EFI_USBFN_ENDPOINT_DIRECTION;
+
+typedef enum _EFI_USBFN_MESSAGE {
+  //
+  // Nothing
+  //
+  EfiUsbMsgNone = 0,
+  //
+  // SETUP packet is received, returned Buffer contains
+  // EFI_USB_DEVICE_REQUEST struct
+  //
+  EfiUsbMsgSetupPacket,
+  //
+  // Indicates that some of the requested data has been received from the
+  // host. It is the responsibility of the class driver to determine if it
+  // needs to wait for any remaining data. Returned Buffer contains
+  // EFI_USBFN_TRANSFER_RESULT struct containing endpoint number, transfer
+  // status and count of bytes received.
+  //
+  EfiUsbMsgEndpointStatusChangedRx,
+  //
+  // Indicates that some of the requested data has been transmitted to the
+  // host. It is the responsibility of the class driver to determine if any
+  // remaining data needs to be resent. Returned Buffer contains
+  // EFI_USBFN_TRANSFER_RESULT struct containing endpoint number, transfer
+  // status and count of bytes sent.
+  //
+  EfiUsbMsgEndpointStatusChangedTx,
+  //
+  // DETACH bus event signaled
+  //
+  EfiUsbMsgBusEventDetach,
+  //
+  // ATTACH bus event signaled
+  //
+  EfiUsbMsgBusEventAttach,
+  //
+  // RESET bus event signaled
+  //
+  EfiUsbMsgBusEventReset,
+  //
+  // SUSPEND bus event signaled
+  //
+  EfiUsbMsgBusEventSuspend,
+  //
+  // RESUME bus event signaled
+  //
+  EfiUsbMsgBusEventResume,
+  //
+  // Bus speed updated, returned buffer indicated bus speed using
+  // following enumeration named EFI_USB_BUS_SPEED
+  //
+  EfiUsbMsgBusEventSpeed
+} EFI_USBFN_MESSAGE;
+
+typedef enum _EFI_USBFN_TRANSFER_STATUS {
+  UsbTransferStatusUnknown = 0,
+  UsbTransferStatusComplete,
+  UsbTransferStatusAborted,
+  UsbTransferStatusActive,
+  UsbTransferStatusNone
+} EFI_USBFN_TRANSFER_STATUS;
+
+typedef struct _EFI_USBFN_TRANSFER_RESULT {
+  UINTN                         BytesTransferred;
+  EFI_USBFN_TRANSFER_STATUS     TransferStatus;
+  UINT8                         EndpointIndex;
+  EFI_USBFN_ENDPOINT_DIRECTION  Direction;
+  VOID                          *Buffer;
+} EFI_USBFN_TRANSFER_RESULT;
+
+typedef enum _EFI_USB_BUS_SPEED {
+  UsbBusSpeedUnknown = 0,
+  UsbBusSpeedLow,
+  UsbBusSpeedFull,
+  UsbBusSpeedHigh,
+  UsbBusSpeedSuper,
+  UsbBusSpeedMaximum = UsbBusSpeedSuper
+} EFI_USB_BUS_SPEED;
+
+typedef union _EFI_USBFN_MESSAGE_PAYLOAD {
+  EFI_USB_DEVICE_REQUEST       udr;
+  EFI_USBFN_TRANSFER_RESULT    utr;
+  EFI_USB_BUS_SPEED            ubs;
+} EFI_USBFN_MESSAGE_PAYLOAD;
+
+typedef enum _EFI_USBFN_POLICY_TYPE {
+  EfiUsbPolicyUndefined = 0,
+  EfiUsbPolicyMaxTransactionSize,
+  EfiUsbPolicyZeroLengthTerminationSupport,
+  EfiUsbPolicyZeroLengthTermination
+} EFI_USBFN_POLICY_TYPE;
+
+/**
+  Returns information about what USB port type was attached.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[out] PortType          Returns the USB port type.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to
+                                process this request or there is no USB port
+                                attached to the device.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_DETECT_PORT) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+     OUT EFI_USBFN_PORT_TYPE           *PortType
+  );
+
+/**
+  Configures endpoints based on supplied device and configuration descriptors.
+
+  Assuming that the hardware has already been initialized, this function configures
+  the endpoints using the device information supplied by DeviceInfo, activates the
+  port, and starts receiving USB events.
+
+  This function must ignore the bMaxPacketSize0field of the Standard Device Descriptor
+  and the wMaxPacketSize field of the Standard Endpoint Descriptor that are made
+  available through DeviceInfo.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[out] DeviceInfo        A pointer to EFI_USBFN_DEVICE_INFO instance.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to lack of
+                                resources.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_CONFIGURE_ENABLE_ENDPOINTS) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+     OUT EFI_USB_DEVICE_INFO           *DeviceInfo
+  );
+
+/**
+  Returns the maximum packet size of the specified endpoint type for the supplied
+  bus speed.
+
+  If the BusSpeed is UsbBusSpeedUnknown, the maximum speed the underlying controller
+  supports is assumed.
+
+  This protocol currently does not support isochronous or interrupt transfers. Future
+  revisions of this protocol may eventually support it.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOLinstance.
+  @param[in]  EndpointType      Endpoint type as defined as EFI_USB_ENDPOINT_TYPE.
+  @param[in]  BusSpeed          Bus speed as defined as EFI_USB_BUS_SPEED.
+  @param[out] MaxPacketSize     The maximum packet size, in bytes, of the specified
+                                endpoint type.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_GET_ENDPOINT_MAXPACKET_SIZE) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+  IN     EFI_USB_ENDPOINT_TYPE         EndpointType,
+  IN     EFI_USB_BUS_SPEED             BusSpeed,
+     OUT UINT16                        *MaxPacketSize
+  );
+
+/**
+  Returns device specific information based on the supplied identifier as a Unicode string.
+
+  If the supplied Buffer isn't large enough, or is NULL, the method fails with
+  EFI_BUFFER_TOO_SMALL and the required size is returned through BufferSize. All returned
+  strings are in Unicode format.
+
+  An Id of EfiUsbDeviceInfoUnknown is treated as an invalid parameter.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOLinstance.
+  @param[in]  Id                The requested information id.
+
+
+  @param[in]  BufferSize        On input, the size of the Buffer in bytes. On output, the
+                                amount of data returned in Buffer in bytes.
+  @param[out] Buffer            A pointer to a buffer to returnthe requested information
+                                as a Unicode string.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_BUFFER_TOO_SMALL  Supplied buffer isn't large enough to hold the request string.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_GET_DEVICE_INFO) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+  IN     EFI_USBFN_DEVICE_INFO_ID      Id,
+  IN OUT UINTN                         *BufferSize,
+     OUT VOID                          *Buffer OPTIONAL
+);
+
+/**
+  Returns the vendor-id and product-id of the device.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[out] Vid               Returned vendor-id of the device.
+  @param[out] Pid               Returned product-id of the device.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_NOT_FOUND         Unable to return the vendor-id or the product-id.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_GET_VENDOR_ID_PRODUCT_ID) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+     OUT UINT16                        *Vid,
+     OUT UINT16                        *Pid
+);
+
+/**
+  Aborts the transfer on the specified endpoint.
+
+  This function should fail with EFI_INVALID_PARAMETER if the specified direction
+  is incorrect for the endpoint.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]  EndpointIndex     Indicates the endpoint on which the ongoing transfer
+                                needs to be canceled.
+  @param[in]  Direction         Direction of the endpoint.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_ABORT_TRANSFER) (
+  IN  EFI_USBFN_IO_PROTOCOL            *This,
+  IN  UINT8                            EndpointIndex,
+  IN  EFI_USBFN_ENDPOINT_DIRECTION     Direction
+);
+
+/**
+  Returns the stall state on the specified endpoint.
+
+  This function should fail with EFI_INVALID_PARAMETER if the specified direction
+  is incorrect for the endpoint.
+
+  @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]      EndpointIndex Indicates the endpoint.
+  @param[in]      Direction     Direction of the endpoint.
+  @param[in, out] State         Boolean, true value indicates that the endpoint
+                                is in a stalled state, false otherwise.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_GET_ENDPOINT_STALL_STATE) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+  IN     UINT8                         EndpointIndex,
+  IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
+  IN OUT BOOLEAN                       *State
+);
+
+/**
+  Sets or clears the stall state on the specified endpoint.
+
+  This function should fail with EFI_INVALID_PARAMETER if the specified direction
+  is incorrect for the endpoint.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]  EndpointIndex     Indicates the endpoint.
+  @param[in]  Direction         Direction of the endpoint.
+  @param[in]  State             Requested stall state on the specified endpoint.
+                                True value causes the endpoint to stall; false
+                                value clears an existing stall.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_SET_ENDPOINT_STALL_STATE) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+  IN     UINT8                         EndpointIndex,
+  IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
+  IN OUT BOOLEAN                       *State
+);
+
+/**
+  This function is called repeatedly to get information on USB bus states,
+  receive-completion and transmit-completion events on the endpoints, and
+  notification on setup packet on endpoint 0.
+
+  A class driver must call EFI_USBFN_IO_PROTOCOL.EventHandler()repeatedly
+  to receive updates on the transfer status and number of bytes transferred
+  on various endpoints.
+
+  @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[out]     Message       Indicates the event that initiated this notification.
+  @param[in, out] PayloadSize   On input, the size of the memory pointed by
+                                Payload. On output, the amount ofdata returned
+                                in Payload.
+  @param[out]     Payload       A pointer to EFI_USBFN_MESSAGE_PAYLOAD instance
+                                to return additional payload for current message.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+  @retval EFI_BUFFER_TOO_SMALL  The Supplied buffer is not large enough to hold
+                                the message payload.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_EVENTHANDLER) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+     OUT EFI_USBFN_MESSAGE             *Message,
+  IN OUT UINTN                         *PayloadSize,
+     OUT EFI_USBFN_MESSAGE_PAYLOAD     *Payload
+);
+
+/**
+  This function handles transferring data to or from the host on the specified
+  endpoint, depending on the direction specified.
+
+  A class driver must call EFI_USBFN_IO_PROTOCOL.EventHandler() repeatedly to
+  receive updates on the transfer status and the number of bytes transferred on
+  various endpoints. Upon an update of the transfer status, the Buffer field of
+  the EFI_USBFN_TRANSFER_RESULT structure (as described in the function description
+  for EFI_USBFN_IO_PROTOCOL.EventHandler()) must be initialized with the Buffer
+  pointer that was supplied to this method.
+
+  The overview of the call sequence is illustrated in the Figure 54.
+
+  This function should fail with EFI_INVALID_PARAMETER if the specified direction
+  is incorrect for the endpoint.
+
+  @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]      EndpointIndex Indicates the endpoint on which TX or RX transfer
+                                needs to take place.
+  @param[in]      Direction     Direction of the endpoint.
+  @param[in, out] BufferSize    If Direction is EfiUsbEndpointDirectionDeviceRx:
+                                  On input, the size of the Bufferin bytes.
+                                  On output, the amount of data returned in Buffer
+                                  in bytes.
+                                If Direction is EfiUsbEndpointDirectionDeviceTx:
+                                  On input, the size of the Bufferin bytes.
+                                  On output, the amount of data transmitted in bytes.
+  @param[in, out] Buffer        If Direction is EfiUsbEndpointDirectionDeviceRx:
+                                  The Buffer to return the received data.
+                                If Directionis EfiUsbEndpointDirectionDeviceTx:
+                                  The Buffer that contains the data to be transmitted.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_TRANSFER) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+  IN     UINT8                         EndpointIndex,
+  IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
+  IN OUT UINTN                         *BufferSize,
+  IN OUT VOID                          *Buffer
+);
+
+/**
+  Returns the maximum supported transfer size.
+
+  Returns the maximum number of bytes that the underlying controller can accommodate
+  in a single transfer.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[out] MaxTransferSize   The maximum supported transfer size, in bytes.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_NOT_READY         The physical device is busy or not ready to process
+                                this request.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_GET_MAXTRANSFER_SIZE) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+     OUT UINTN                         *MaxTransferSize
+  );
+
+/**
+  Allocates a transfer buffer of the specified sizethat satisfies the controller
+  requirements.
+
+  The AllocateTransferBuffer() function allocates a memory region of Size bytes and
+  returns the address of the allocated memory that satisfies the underlying controller
+  requirements in the location referenced by Buffer.
+
+  The allocated transfer buffer must be freed using a matching call to
+  EFI_USBFN_IO_PROTOCOL.FreeTransferBuffer()function.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]  Size              The number of bytes to allocate for the transfer buffer.
+  @param[out] Buffer            A pointer to a pointer to the allocated buffer if the
+                                call succeeds; undefined otherwise.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_OUT_OF_RESOURCES  The requested transfer buffer could not be allocated.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_ALLOCATE_TRANSFER_BUFFER) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+  IN     UINTN                         Size,
+     OUT VOID                          **Buffer
+  );
+
+/**
+  Deallocates the memory allocated for the transfer buffer by the
+  EFI_USBFN_IO_PROTOCOL.AllocateTransferBuffer() function.
+
+  The EFI_USBFN_IO_PROTOCOL.FreeTransferBuffer() function deallocates the
+  memory specified by Buffer. The Buffer that is freed must have been allocated
+  by EFI_USBFN_IO_PROTOCOL.AllocateTransferBuffer().
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]  Buffer            A pointer to the transfer buffer to deallocate.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_FREE_TRANSFER_BUFFER) (
+  IN  EFI_USBFN_IO_PROTOCOL         *This,
+  IN  VOID                          *Buffer
+  );
+
+/**
+  This function supplies power to the USB controller if needed and initializes
+  the hardware and the internal data structures. The port must not be activated
+  by this function.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_START_CONTROLLER) (
+  IN  EFI_USBFN_IO_PROTOCOL         *This
+  );
+
+/**
+  This function stops the USB hardware device.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_STOP_CONTROLLER) (
+  IN  EFI_USBFN_IO_PROTOCOL         *This
+  );
+
+/**
+  This function sets the configuration policy for the specified non-control
+  endpoint.
+
+  This function can only be called before EFI_USBFN_IO_PROTOCOL.StartController()
+  or after EFI_USBFN_IO_PROTOCOL.StopController() has been called.
+
+  @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]  EndpointIndex     Indicates the non-control endpoint for which the
+                                policy needs to be set.
+  @param[in]  Direction         Direction of the endpoint.
+  @param[in]  PolicyType        Policy type the user is trying to set for the
+                                specified non-control endpoint.
+  @param[in]  BufferSize        The size of the Bufferin bytes.
+  @param[in]  Buffer            The new value for the policy parameter that
+                                PolicyType specifies.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The physical device reported an error.
+  @retval EFI_UNSUPPORTED       Changing this policy value is not supported.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_SET_ENDPOINT_POLICY) (
+  IN  EFI_USBFN_IO_PROTOCOL         *This,
+  IN  UINT8                         EndpointIndex,
+  IN  EFI_USBFN_ENDPOINT_DIRECTION  Direction,
+  IN  EFI_USBFN_POLICY_TYPE         PolicyType,
+  IN  UINTN                         BufferSize,
+  IN  VOID                          *Buffer
+  );
+
+/**
+  This function sets the configuration policy for the specified non-control
+  endpoint.
+
+  This function can only be called before EFI_USBFN_IO_PROTOCOL.StartController()
+  or after EFI_USBFN_IO_PROTOCOL.StopController() has been called.
+
+  @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
+  @param[in]      EndpointIndex Indicates the non-control endpoint for which the
+                                policy needs to be set.
+  @param[in]      Direction     Direction of the endpoint.
+  @param[in]      PolicyType    Policy type the user is trying to retrieve for
+                                the specified non-control endpoint.
+  @param[in, out] BufferSize    On input, the size of Bufferin bytes. On output,
+                                the amount of data returned in Bufferin bytes.
+  @param[in, out] Buffer        A pointer to a buffer to return requested endpoint
+                                policy value.
+
+  @retval EFI_SUCCESS           The function returned successfully.
+  @retval EFI_INVALID_PARAMETER A parameter is invalid.
+  @retval EFI_DEVICE_ERROR      The specified policy value is not supported.
+  @retval EFI_BUFFER_TOO_SMALL  Supplied buffer is not large enough to hold requested
+                                policy value.
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_USBFN_IO_GET_ENDPOINT_POLICY) (
+  IN     EFI_USBFN_IO_PROTOCOL         *This,
+  IN     UINT8                         EndpointIndex,
+  IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
+  IN     EFI_USBFN_POLICY_TYPE         PolicyType,
+  IN OUT UINTN                         *BufferSize,
+  IN OUT VOID                          *Buffer
+  );
+
+///
+/// The EFI_USBFN_IO_PROTOCOL provides basic data transactions and basic USB
+/// controller management for a USB Function port.
+///
+struct _EFI_USBFN_IO_PROTOCOL {
+  UINT32                                    Revision;
+  EFI_USBFN_IO_DETECT_PORT                  DetectPort;
+  EFI_USBFN_IO_CONFIGURE_ENABLE_ENDPOINTS   ConfigureEnableEndpoints;
+  EFI_USBFN_IO_GET_ENDPOINT_MAXPACKET_SIZE  GetEndpointMaxPacketSize;
+  EFI_USBFN_IO_GET_DEVICE_INFO              GetDeviceInfo;
+  EFI_USBFN_IO_GET_VENDOR_ID_PRODUCT_ID     GetVendorIdProductId;
+  EFI_USBFN_IO_ABORT_TRANSFER               AbortTransfer;
+  EFI_USBFN_IO_GET_ENDPOINT_STALL_STATE     GetEndpointStallState;
+  EFI_USBFN_IO_SET_ENDPOINT_STALL_STATE     SetEndpointStallState;
+  EFI_USBFN_IO_EVENTHANDLER                 EventHandler;
+  EFI_USBFN_IO_TRANSFER                     Transfer;
+  EFI_USBFN_IO_GET_MAXTRANSFER_SIZE         GetMaxTransferSize;
+  EFI_USBFN_IO_ALLOCATE_TRANSFER_BUFFER     AllocateTransferBuffer;
+  EFI_USBFN_IO_FREE_TRANSFER_BUFFER         FreeTransferBuffer;
+  EFI_USBFN_IO_START_CONTROLLER             StartController;
+  EFI_USBFN_IO_STOP_CONTROLLER              StopController;
+  EFI_USBFN_IO_SET_ENDPOINT_POLICY          SetEndpointPolicy;
+  EFI_USBFN_IO_GET_ENDPOINT_POLICY          GetEndpointPolicy;
+};
+
+extern EFI_GUID gEfiUsbFunctionIoProtocolGuid;
+
+#endif
+
index 12d5b96679d1f007245e99327eb2fad3d7c61521..d8291e10eebf7d0eba97149d49812638bcd0aad6 100644 (file)
   ## Include/Protocol/SmartCardEdge.h\r
   gEfiSmartCardEdgeProtocolGuid        = { 0xd317f29b, 0xa325, 0x4712, {0x9b, 0xf1, 0xc6, 0x19, 0x54, 0xdc, 0x19, 0x8c }}\r
 \r
+  ## Include/Protocol/UsbFunctionIo.h\r
+  gEfiUsbFunctionIoProtocolGuid        = { 0x32d2963a, 0xfe5d, 0x4f30, {0xb6, 0x33, 0x6e, 0x5d, 0xc5, 0x58, 0x3, 0xcc }}\r
+\r
 #\r
 # [Error.gEfiMdePkgTokenSpaceGuid]\r
 #   0x80000001 | Invalid value provided.\r