/** * @file UsbDescriptors.h * @brief Functions to read USB Interface and Capabilities descriptors * * Copyright (c) 2018-2019, DisplayLink (UK) Ltd. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #ifndef USB_DESCRIPTORS_H_ #define USB_DESCRIPTORS_H_ /** Type of the Direct Framebuffer capability descriptor. This is a vendor specific USB descriptor for DisplayLink. @see NR-140082 Section 3.5 **/ #define DESCRIPTOR_TYPE_DIRECTFB_CAPABILITY 0x5e /** Identifiers for capabllity keys @see NR-140082 Section 3.2 **/ /** Key for Capabilities 1 - See section 3.2.1 **/ #define CAPABILITIES1_KEY 0x0 /** Lengths for capabllity fields **/ #define CAPABILITIES1_LENGTH 0x4 /** Bits for the capability bitmask Capabilities1 **/ /** This is the first capability defined for the protocol. It represents the mode of operation as of initial release. If a device ever breaks compatibility with this initial release, it will cease to support CapabilityBaseProtocol. **/ #define CAPABILITIES1_BASE_PROTOCOL (1 << 0) /** Idealised VendorDescriptor which is the result of parsing vendor descriptor from device. **/ typedef struct { UINT32 Capabilities1; } VendorDescriptor; #pragma pack(push, 1) typedef struct { UINT16 Key; /** Really of type enum DescrptorKeys */ UINT8 Length; UINT8 Value[]; } DescriptorKLV; typedef struct { UINT8 Length; UINT8 Type; UINT16 CapabilityVersion; UINT8 CapabilityLength; UINT8 Klv[]; } VendorDescriptorGeneric; #pragma pack(pop) EFI_STATUS UsbDisplayLinkGetInterfaceDescriptor ( IN EFI_USB_IO_PROTOCOL *UsbIo, EFI_USB_INTERFACE_DESCRIPTOR* InterfaceDescriptor, UINT8 index ); EFI_STATUS ReadCapabilitiesDescriptor (IN EFI_USB_IO_PROTOCOL *UsbIo, VOID* Buffer, UINT16 Length); /** Parse data in buffer to a VendorDescriptor, if possible. @param Data Buffer @param Length Length of buffer @retval EFI_SUCCESS The descriptor was parsed successfully @retval EFI_UNSUPPORTED Simple Pointer Protocol is not installed on Controller. **/ EFI_STATUS UsbDisplayLinkParseCapabilitiesDescriptor ( CONST IN VOID* Data, IN UINTN Length, OUT VendorDescriptor* Descriptor ); /** Decide if binding may proceed, given capabilities @retval TRUE Binding may proceed @retval FALSE Binding is not possible **/ BOOLEAN UsbDisplayLinkCapabilitiesSufficientToBind ( CONST IN VendorDescriptor* Descriptor ); #endif // USB_DESCRIPTORS_H_