/** @file Manage Usb Descriptor List Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _USB_DESCRIPTOR_H_ #define _USB_DESCRIPTOR_H_ #define USB_MAX_INTERFACE_SETTING 256 // // 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; UINTN 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; /** 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. **/ 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 ); /** 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. **/ EFI_STATUS UsbGetMaxPacketSize0 ( IN USB_DEVICE *UsbDev ); /** Free a device descriptor with its configurations. @param DevDesc The device descriptor. @return None. **/ VOID UsbFreeDevDesc ( IN USB_DEVICE_DESC *DevDesc ); /** 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. **/ EFI_USB_STRING_DESCRIPTOR * UsbGetOneString ( IN USB_DEVICE *UsbDev, IN UINT8 StringIndex, IN UINT16 LangId ); /** 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. **/ EFI_STATUS UsbBuildDescTable ( IN USB_DEVICE *UsbDev ); /** 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. **/ EFI_STATUS UsbSetAddress ( IN USB_DEVICE *UsbDev, IN UINT8 Address ); /** 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. **/ EFI_STATUS UsbSetConfig ( IN USB_DEVICE *UsbDev, IN UINT8 ConfigIndex ); /** 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. **/ EFI_STATUS UsbIoClearFeature ( IN EFI_USB_IO_PROTOCOL *UsbIo, IN UINTN Target, IN UINT16 Feature, IN UINT16 Index ); #endif