Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Дескриптор связи USB (IAD) позволяет устройству группировать интерфейсы, принадлежащие функции. В этой статье описывается, как драйвер клиента может определить, содержит ли устройство IAD для функции.
Спецификация универсальной последовательной шины версии 2.0 не поддерживает группирование нескольких интерфейсов составного устройства в одной функции. Однако рабочая группа USB-устройств (DWG) создала классы USB-устройств, которые позволяют выполнять функции с несколькими интерфейсами. Форум разработчиков USB выпустил уведомление об инженерных изменениях (ECN), которое определяет механизм группировки интерфейсов.
ECN задает дескриптор USB, называемый дескриптором ассоциации интерфейсов (IAD), который позволяет производителям оборудования определять группировки интерфейсов. Классы устройств, которые, скорее всего, используют IAD:
- Спецификация класса видео USB (код класса — 0x0E)
- Спецификация USB аудиокласса (код класса — 0x01)
- Спецификация класса USB Bluetooth (код класса — 0xE0)
Как использовать устройства IAD
В следующих подразделах описываются сведения о том, как использовать IAD.
Составные устройства, сигнализирующие Windows о IAD в встроенном ПО
Производители составных устройств обычно назначают значение нуля классу устройства (bDeviceClass), подклассу (bDeviceSubClass) и протоколу (bDeviceProtocol) в дескрипторе устройства, как указано в спецификации универсальной последовательной шины. Производитель может связать каждый отдельный интерфейс с различным классом устройств и протоколом.
Основная команда USB-IF разработала специальный набор классов и код протокола, который уведомляет операционную систему о наличии одного или нескольких идентификаторов IAD в встроенном ПО устройства. Дескриптор устройства должен иметь значения, которые отображаются в следующей таблице, или операционная система не обнаруживает идентификаторы IAD устройства или группирует интерфейсы устройства правильно.
| Поле дескриптора устройства | Обязательное значение |
|---|---|
| bDeviceClass | 0xEF |
| bDeviceSubClass | 0x02 |
| bDeviceProtocol | 0x01 |
Значения кода уведомляют версии Windows, которые не поддерживают IAD, об необходимости установки драйвера шины специального назначения, который правильно идентифицирует устройство. Без этих кодов в дескрипторе устройства система может не перечислить устройство или устройство может работать неправильно.
Устройство может иметь несколько IAD. Каждый IAD должен находиться непосредственно перед интерфейсами в группе интерфейсов, описываемой IAD.
Класс функций (bFunctionClass), подкласс (bFunctionSubclassClass) и поля протокола (bFunctionProtocol) IAD должны содержать значения, указанные классом USB-устройства, описывающим интерфейсы в функции.
Поля класса и подкласса IAD не требуются для сопоставления полей классов и подклассов интерфейсов в коллекции интерфейсов, описываемых IAD. Корпорация Майкрософт рекомендует, чтобы первый интерфейс коллекции содержит поля класса и подкласса, соответствующие полям класса и подкласса IAD. В следующей таблице указывается, какие поля должны соответствовать.
| Поле IAD | Соответствующее поле интерфейса |
|---|---|
| bFunctionClass | bInterfaceClass |
| bFunctionSubclassClass | bInterfaceSubClass |
Поле bFirstInterface iAD указывает номер первого интерфейса в функции. Поле bInterfaceCount iAD указывает, сколько интерфейсов находятся в коллекции интерфейсов. Интерфейсы в коллекции интерфейсов IAD должны быть смежными (в списке номеров интерфейса не может быть пробелов), поэтому количество с первым номером интерфейса достаточно, чтобы указать все интерфейсы в коллекции.
Доступ к содержимому IAD
Клиентские драйверы не могут напрямую получить доступ к дескрипторам IAD. Уведомление о внесении изменений в инженерные данные IAD (ECN) указывает, что IAD должны быть включены в сведения о конфигурации, возвращаемые устройствами при получении запроса от программного обеспечения хоста на дескриптор конфигурации (GetDescriptor configuration). Программное обеспечение узла не может непосредственно получить IAD с помощью запроса GetDescriptor.
Однако клиентские драйверы могут запрашивать у родительского драйвера USB-устройства идентификаторы оборудования устройства, а аппаратные идентификаторы устройства содержат встроенную информацию о полях IAD.
Пример дескриптора ассоциации USB интерфейса
В этом разделе показан макет дескриптора для составного USB-устройства. Пример устройства имеет две функции:
Функция класса Видео
Дескриптор связи интерфейса (IAD) определяет эту функцию. Функция содержит два интерфейса: интерфейс ноль (0) и интерфейс один (1).
Система создает аппаратные и совместимые идентификаторы (ID) для функции, как описано в Поддержке класса беспроводного мобильного коммуникационного устройства. После того как ОС соответствует соответствующему INF-файлу, система загружает стек драйверов видеокласса.
Функция устройства ввода человека (HID)
Эта функция содержит только интерфейс 2 (два).
Система создает аппаратные и совместимые идентификаторы для функции, как описано в разделе Перечисление коллекций интерфейсов на составных устройствах USB. После того как ОС находит нужный INF-файл, система загружает драйвер класса устройства ввода человека (HID).
Дескриптор выглядит следующим образом:
Дескриптор устройства
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
Дескриптор конфигурации
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)
Дескриптор ассоциации интерфейса
BYTE bLength 0x08
BYTE bDescriptorType 0x0B
BYTE bFirstInterface 0x00
BYTE bInterfaceCount 0x02
BYTE bFunctionClass 0x0E
BYTE bFunctionSubClass 0x03
BYTE bFunctionProtocol 0x00
BYTE iFunction 0x04
Дескриптор интерфейса управления видео
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
Дескриптор класса управления видео
. . . .
. . . .
. . . .
Дескриптор конечной точки управления видео
. . . .
. . . .
. . . .
Дескриптор интерфейса потоковой передачи видео
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
Дескриптор класса потоковой передачи видео
. . . .
. . . .
. . . .
Дескриптор конечной точки потоковой передачи видео
. . . .
. . . .
. . . .
Дескриптор интерфейса устройства ввода человека (HID)
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
. . . .
. . . .
. . . .
Дескриптор конечной точки HID
. . . .
. . . .
. . . .