Дескриптор сопоставления интерфейса USB

Дескриптор ассоциации интерфейса 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). Программное обеспечение узла не может получать идентификаторы IAD напрямую с помощью запроса GetDescriptor.

Однако клиентские драйверы могут запрашивать у родительского драйвера USB-устройства идентификаторы оборудования (ID), а идентификаторы оборудования устройства содержат внедренные сведения о полях IAD.

Пример дескриптора связи с интерфейсом USB

В этом разделе показан макет дескриптора для составного USB-устройства. Пример устройства имеет две функции:

Функция класса Video

Дескриптор ассоциации интерфейса (IAD) определяет эту функцию. Функция содержит два интерфейса: интерфейс нуль (0) и интерфейс один (1).

Система создает аппаратные и совместимые идентификаторы (ID) для функции, как описано в разделе Поддержка класса устройств беспроводной мобильной связи. После того как ОС соответствует соответствующему INF-файлу, система загружает стек драйверов класса видео.

Функция устройства ввода человека (HID)

Эта функция содержит только интерфейс 2 (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

    . . . .
    . . . .
    . . . .