mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-30 12:43:41 +01:00
685 lines
27 KiB
C
685 lines
27 KiB
C
|
/** @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 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
@par Revision Reference:
|
||
|
This Protocol was introduced in UEFI Specification 2.5.
|
||
|
|
||
|
**/
|
||
|
|
||
|
#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 One or more of the following conditions is TRUE:
|
||
|
BufferSize is NULL.
|
||
|
*BufferSize is not 0 and Buffer is NULL.
|
||
|
Id in invalid.
|
||
|
@retval EFI_DEVICE_ERROR The physical device reported an error.
|
||
|
@retval EFI_BUFFER_TOO_SMALL The buffer is too small to hold the buffer.
|
||
|
*BufferSize has been updated with the size needed 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
|
||
|
|