2007-07-11 10:47:37 +02:00
|
|
|
/** @file
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
Manage Usb Descriptor List
|
|
|
|
|
2007-07-11 10:47:37 +02:00
|
|
|
Copyright (c) 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.
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#ifndef _USB_DESCRIPTOR_H_
|
|
|
|
#define _USB_DESCRIPTOR_H_
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
typedef enum {
|
2007-07-17 03:48:09 +02:00
|
|
|
USB_MAX_INTERFACE_SETTING = 8
|
2008-07-09 12:02:26 +02:00
|
|
|
}USB_INTERFACE_SETTING_MAX;
|
2007-07-11 10:47:37 +02:00
|
|
|
|
|
|
|
//
|
|
|
|
// The RequestType in EFI_USB_DEVICE_REQUEST is composed of
|
|
|
|
// three fields: One bit direction, 2 bit type, and 5 bit
|
|
|
|
// target.
|
|
|
|
//
|
|
|
|
#define USB_REQUEST_TYPE(Dir, Type, Target) \
|
|
|
|
((UINT8)((((Dir) == EfiUsbDataIn ? 0x01 : 0) << 7) | (Type) | (Target)))
|
|
|
|
|
|
|
|
//
|
|
|
|
// A common header for usb standard descriptor.
|
|
|
|
// Each stand descriptor has a length and type.
|
|
|
|
//
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef struct {
|
|
|
|
UINT8 Len;
|
|
|
|
UINT8 Type;
|
|
|
|
} USB_DESC_HEAD;
|
|
|
|
#pragma pack()
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// Each USB device has a device descriptor. Each device may
|
|
|
|
// have several configures. Each configure contains several
|
|
|
|
// interfaces. Each interface may have several settings. Each
|
|
|
|
// setting has several endpoints.
|
|
|
|
//
|
|
|
|
// EFI_USB_..._DESCRIPTOR must be the first member of the
|
|
|
|
// structure.
|
|
|
|
//
|
|
|
|
typedef struct {
|
|
|
|
EFI_USB_ENDPOINT_DESCRIPTOR Desc;
|
|
|
|
UINT8 Toggle;
|
|
|
|
} USB_ENDPOINT_DESC;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
EFI_USB_INTERFACE_DESCRIPTOR Desc;
|
|
|
|
USB_ENDPOINT_DESC **Endpoints;
|
|
|
|
} USB_INTERFACE_SETTING;
|
|
|
|
|
|
|
|
//
|
|
|
|
// An interface may have several settings. Use a
|
|
|
|
// fixed max number of settings to simplify code.
|
|
|
|
// It should sufice in most environments.
|
|
|
|
//
|
|
|
|
typedef struct {
|
|
|
|
USB_INTERFACE_SETTING* Settings[USB_MAX_INTERFACE_SETTING];
|
|
|
|
UINTN NumOfSetting;
|
|
|
|
UINT8 ActiveIndex; // Index of active setting
|
|
|
|
} USB_INTERFACE_DESC;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
EFI_USB_CONFIG_DESCRIPTOR Desc;
|
|
|
|
USB_INTERFACE_DESC **Interfaces;
|
|
|
|
} USB_CONFIG_DESC;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
EFI_USB_DEVICE_DESCRIPTOR Desc;
|
|
|
|
USB_CONFIG_DESC **Configs;
|
|
|
|
} USB_DEVICE_DESC;
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
USB standard control transfer support routine. This
|
|
|
|
function is used by USB device. It is possible that
|
|
|
|
the device's interfaces are still waiting to be
|
|
|
|
enumerated.
|
|
|
|
|
|
|
|
@param UsbDev The usb device.
|
|
|
|
@param Direction The direction of data transfer.
|
|
|
|
@param Type Standard / class specific / vendor specific.
|
|
|
|
@param Target The receiving target.
|
|
|
|
@param Request Which request.
|
|
|
|
@param Value The wValue parameter of the request.
|
|
|
|
@param Index The wIndex parameter of the request.
|
|
|
|
@param Buf The buffer to receive data into / transmit from.
|
|
|
|
@param Length The length of the buffer.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The control request is executed.
|
|
|
|
@retval EFI_DEVICE_ERROR Failed to execute the control transfer.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
EFI_STATUS
|
|
|
|
UsbCtrlRequest (
|
|
|
|
IN USB_DEVICE *UsbDev,
|
|
|
|
IN EFI_USB_DATA_DIRECTION Direction,
|
|
|
|
IN UINTN Type,
|
|
|
|
IN UINTN Target,
|
|
|
|
IN UINTN Request,
|
|
|
|
IN UINT16 Value,
|
|
|
|
IN UINT16 Index,
|
|
|
|
IN OUT VOID *Buf,
|
|
|
|
IN UINTN Length
|
|
|
|
);
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
Return the max packet size for endpoint zero. This function
|
|
|
|
is the first function called to get descriptors during bus
|
|
|
|
enumeration.
|
|
|
|
|
|
|
|
@param UsbDev The usb device.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The max packet size of endpoint zero is retrieved.
|
|
|
|
@retval EFI_DEVICE_ERROR Failed to retrieve it.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
EFI_STATUS
|
|
|
|
UsbGetMaxPacketSize0 (
|
|
|
|
IN USB_DEVICE *UsbDev
|
|
|
|
);
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
Free a device descriptor with its configurations.
|
|
|
|
|
|
|
|
@param DevDesc The device descriptor.
|
|
|
|
|
|
|
|
@return None.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
VOID
|
|
|
|
UsbFreeDevDesc (
|
|
|
|
IN USB_DEVICE_DESC *DevDesc
|
|
|
|
);
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
Retrieve the indexed string for the language. It requires two
|
|
|
|
steps to get a string, first to get the string's length. Then
|
|
|
|
the string itself.
|
|
|
|
|
|
|
|
@param UsbDev The usb device.
|
|
|
|
@param StringIndex The index of the string to retrieve.
|
|
|
|
@param LangId Language ID.
|
|
|
|
|
|
|
|
@return The created string descriptor or NULL.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
EFI_USB_STRING_DESCRIPTOR*
|
|
|
|
UsbGetOneString (
|
|
|
|
IN USB_DEVICE *UsbDev,
|
|
|
|
IN UINT8 StringIndex,
|
|
|
|
IN UINT16 LangId
|
|
|
|
);
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
Build the whole array of descriptors. This function must
|
|
|
|
be called after UsbGetMaxPacketSize0 returns the max packet
|
|
|
|
size correctly for endpoint 0.
|
|
|
|
|
|
|
|
@param UsbDev The Usb device.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The descriptor table is build.
|
|
|
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the descriptor.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
EFI_STATUS
|
|
|
|
UsbBuildDescTable (
|
|
|
|
IN USB_DEVICE *UsbDev
|
|
|
|
);
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
Set the device's address.
|
|
|
|
|
|
|
|
@param UsbDev The device to set address to.
|
|
|
|
@param Address The address to set.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The device is set to the address.
|
|
|
|
@retval Others Failed to set the device address.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
EFI_STATUS
|
|
|
|
UsbSetAddress (
|
|
|
|
IN USB_DEVICE *UsbDev,
|
|
|
|
IN UINT8 Address
|
|
|
|
);
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
Set the device's configuration. This function changes
|
|
|
|
the device's internal state. UsbSelectConfig changes
|
|
|
|
the Usb bus's internal state.
|
|
|
|
|
|
|
|
@param UsbDev The USB device to set configure to.
|
|
|
|
@param ConfigIndex The configure index to set.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The device is configured now.
|
|
|
|
@retval Others Failed to set the device configure.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
EFI_STATUS
|
|
|
|
UsbSetConfig (
|
|
|
|
IN USB_DEVICE *UsbDev,
|
|
|
|
IN UINT8 ConfigIndex
|
|
|
|
);
|
|
|
|
|
2008-07-09 12:02:26 +02:00
|
|
|
/**
|
|
|
|
Usb UsbIo interface to clear the feature. This is should
|
|
|
|
only be used by HUB which is considered a device driver
|
|
|
|
on top of the UsbIo interface.
|
|
|
|
|
|
|
|
@param UsbIo The UsbIo interface.
|
|
|
|
@param Target The target of the transfer: endpoint/device.
|
|
|
|
@param Feature The feature to clear.
|
|
|
|
@param Index The wIndex parameter.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The device feature is cleared.
|
|
|
|
@retval Others Failed to clear the feature.
|
|
|
|
|
|
|
|
**/
|
2007-07-11 10:47:37 +02:00
|
|
|
EFI_STATUS
|
|
|
|
UsbIoClearFeature (
|
|
|
|
IN EFI_USB_IO_PROTOCOL *UsbIo,
|
|
|
|
IN UINTN Target,
|
|
|
|
IN UINT16 Feature,
|
|
|
|
IN UINT16 Index
|
|
|
|
);
|
|
|
|
#endif
|