USB interface association descriptor
USB interface association descriptor (IAD) allows the device to group interfaces that belong to a function. This article describes how a client driver can determine whether the device contains an IAD for a function.
The Universal Serial Bus Specification, revision 2.0, doesn't support grouping more than one interface of a composite device within a single function. However, the USB device working group (DWG) created USB device classes that allow for functions with multiple interfaces. The USB Implementor's Forum issued an engineering change notification (ECN) that defines a mechanism for grouping interfaces.
The ECN specifies a USB descriptor, called the interface association descriptor (IAD), that allows hardware manufacturers to define groupings of interfaces. The device classes that are most likely to use IADs include:
- USB video class specification (class code - 0x0E)
- USB audio class specification (class code - 0x01)
- USB Bluetooth class specification (class code - 0xE0)
How to use IADs
The following subsections describe information about how to use IADs.
Composite devices alerting Windows of IADs in firmware
Manufacturers of composite devices typically assign a value of zero to the device class (bDeviceClass), subclass (bDeviceSubClass), and protocol (bDeviceProtocol) fields in the device descriptor, as specified by the Universal Serial Bus Specification. The manufacturer can associate each individual interface with a different device class and protocol.
The USB-IF core team has devised a special class and protocol code set that notifies the operating system that one or more IADs are present in device firmware. A device descriptor must have the values that appear in the following table or the operating system doesn't detect the device's IADs or group the device's interfaces properly.
Device descriptor field | Required value |
---|---|
bDeviceClass | 0xEF |
bDeviceSubClass | 0x02 |
bDeviceProtocol | 0x01 |
The code values alert versions of Windows that don't support IADs to install a special-purpose bus driver that correctly enumerates the device. Without these codes in the device descriptor, the system might fail to enumerate the device, or the device might not work properly.
A device can have more than one IAD. Each IAD must be located immediately before the interfaces in the interface group that the IAD describes.
The function class (bFunctionClass), subclass (bFunctionSubclassClass), and protocol (bFunctionProtocol) fields of the IAD must contain the values specified by the USB device class that describes the interfaces in the function.
The class and subclass fields of the IAD aren't required to match the class and subclass fields of the interfaces in the interface collection that the IAD describes. Microsoft recommends that the first interface of the collection has class and subclass fields that match the class and subclass fields of the IAD. The following table indicates which fields should match.
IAD field | Corresponding interface field |
---|---|
bFunctionClass | bInterfaceClass |
bFunctionSubclassClass | bInterfaceSubClass |
The bFirstInterface field of the IAD indicates the number of the first interface in the function. The bInterfaceCount field of the IAD indicates how many interfaces are in the interface collection. Interfaces in an IAD interface collection must be contiguous (there can be no gaps in the list of interface numbers), and so a count with a first interface number is sufficient to specify all of the interfaces in the collection.
Accessing the contents of an IAD
Client drivers can't access IAD descriptors directly. The IAD engineering change notification (ECN) specifies that IADs must be included in the configuration information that devices return when they receive a request from host software for the configuration descriptor (GetDescriptor configuration). Host software can't retrieve IADs directly with a GetDescriptor request.
However, client drivers can query a USB device's parent driver for the device's hardware identifiers (IDs), and the device's hardware IDs contain embedded information about the fields of the IAD.
USB interface association descriptor example
This section illustrates a descriptor layout for a composite USB device. The example device has two functions:
Video class function
An interface association descriptor (IAD) defines this function. The function contains two interfaces: interface zero (0) and interface one (1).
The system generates hardware and compatible identifiers (IDs) for the function, as described in Support for the Wireless Mobile Communication Device Class. After the OS matches the appropriate INF file, the system loads the video class driver stack.
Human input device (HID) function
This function only contains interface two (2).
The system generates hardware and compatible IDs for the function, as described in Enumeration of Interface Collections on USB Composite Devices. After the OS matches the appropriate INF file, the system loads the human input device (HID) class driver.
The descriptor is as follows:
Device descriptor
BYTE bLength 0x12
BYTE bDescriptorType 0x01
WORD bcdUSB 0x0200
BYTE bDeviceClass 0xEF
BYTE bDeviceSubClass 0x02
BYTE bDeviceProtocol 0x01
BYTE bMaxPacketSize0 0x40
WORD idVendor 0x045E
WORD idProduct 0xFFFF
WORD bcdDevice 0x0100
BYTE iManufacturer 0x01
WORD iProduct 0x02
WORD iSerialNumber 0x02
BYTE bNumConfigurations 0x01
Configuration descriptor
BYTE bLength 0x09
BYTE bDescriptorType 0x02
WORD wTotalLength 0x...
BYTE bNumInterfaces 0x03
BYTE bConfigurationValue 0x01
BYTE iConfiguration 0x01
BYTE bmAttributes 0x80 // (BUS Powered)
BYTE bMaxPower 0x19 // (50 mA)
Interface association descriptor
BYTE bLength 0x08
BYTE bDescriptorType 0x0B
BYTE bFirstInterface 0x00
BYTE bInterfaceCount 0x02
BYTE bFunctionClass 0x0E
BYTE bFunctionSubClass 0x03
BYTE bFunctionProtocol 0x00
BYTE iFunction 0x04
Video control interface descriptor
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x00
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x0E
BYTE bInterfaceSubClass 0x01
BYTE bInterfaceProtocol 0x00
BYTE iInterface 0x05
Video control class-specific descriptor
. . . .
. . . .
. . . .
Video control endpoint descriptor
. . . .
. . . .
. . . .
Video streaming interface descriptor
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x01
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x0E
BYTE bInterfaceSubClass 0x02
BYTE bInterfaceProtocol 0x00
BYTE iInterface 0x06
Video streaming class-specific descriptor
. . . .
. . . .
. . . .
Video streaming endpoint descriptor
. . . .
. . . .
. . . .
Human input devices (HID) interface descriptor
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x02
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x03
BYTE bInterfaceSubClass 0x01
BYTE bInterfaceProtocol 0x01
BYTE iInterface 0x07
HID class-specific descriptor
. . . .
. . . .
. . . .
HID endpoint descriptor
. . . .
. . . .
. . . .