Дескриптор USB
Устройство USB рассказывает о себе хосту не произвольным текстом, а набором стандартных структур — дескрипторов. По ним хост узнаёт, кто производитель, какой нужен драйвер, сколько тока требуется и какие есть каналы обмена.
Обновлено Редакция GAW
Дескриптор (descriptor) — стандартная структура данных, которой устройство USB описывает себя хосту. Все дескрипторы начинаются одинаково: первый байт — длина (bLength), второй — тип (bDescriptorType). Хост читает их запросом GET_DESCRIPTOR во время перечисления и по ним решает, какой драйвер загрузить и какую конфигурацию включить.
Основные типы по USB 2.0
| Тип | Код | Что описывает |
|---|---|---|
| Устройство (DEVICE) | 1 | устройство в целом: версия USB, класс, VID, PID, число конфигураций |
| Конфигурация (CONFIGURATION) | 2 | набор интерфейсов, питание, потребляемый ток |
| Строка (STRING) | 3 | текст: производитель, изделие, серийный номер |
| Интерфейс (INTERFACE) | 4 | одна функция устройства, её класс и число точек |
| Конечная точка (ENDPOINT) | 5 | адрес, направление и тип передачи конечной точки |
Иерархия
У устройства один дескриптор устройства и одна или несколько конфигураций. Конфигурация содержит интерфейсы, интерфейс — ноль или больше конечных точек. Для нулевой точки дескриптора нет: её размер пакета указан прямо в дескрипторе устройства (поле bMaxPacketSize0 — 8, 16, 32 или 64 байта).
Запрос дескриптора конфигурации возвращает целый блок: саму конфигурацию и вслед за ней все дескрипторы её интерфейсов и конечных точек. Его полную длину сообщает поле wTotalLength. Поле bMaxPower указывает, какой ток устройство возьмёт от шины в этой конфигурации, в единицах по 2 мА: значение 50 означает 100 мА.
Идентификаторы и строки
Поля idVendor и idProduct дескриптора устройства — это VID и PID: первый назначает USB-IF, второй — сам производитель. Названия производителя и изделия хранятся отдельно, в строковых дескрипторах в Юникоде, а дескриптор устройства содержит только их номера.
Не путать с дескриптором файла в операционной системе — это номер открытого файла, к USB он отношения не имеет.
Частые вопросы
Что содержит дескриптор устройства USB?
Версию USB (bcdUSB), класс устройства, наибольший размер пакета нулевой конечной точки, идентификаторы VID и PID, версию изделия, номера строк с названием производителя, изделия и серийным номером и число конфигураций. Это 18 байт, и у устройства он один.
Почему хост читает дескриптор конфигурации дважды?
Хост заранее не знает его полной длины. Запрос дескриптора конфигурации возвращает его вместе со всеми дескрипторами интерфейсов и конечных точек, а общую длину этого блока сообщает поле wTotalLength. По разд. 9.4.3, если запрошено меньше байт, чем длина дескриптора, устройство вернёт только начало. Поэтому хост может сначала прочитать короткое начало, узнать wTotalLength, а потом запросить блок целиком.
Как посмотреть дескрипторы устройства?
В Linux — командой lsusb -v: она выводит дескрипторы устройства, конфигураций, интерфейсов и конечных точек. В Windows часть полей, например VID и PID, видна в свойствах устройства в диспетчере устройств, а полный разбор показывают специальные утилиты просмотра USB.
Источники
- USB-IF. Universal Serial Bus Specification, Revision 2.0 (пакет usb_20_20250603) — табл. 9-5: типы дескрипторов DEVICE 1, CONFIGURATION 2, STRING 3, INTERFACE 4, ENDPOINT 5; разд. 9.6.1, табл. 9-8: у устройства один дескриптор устройства, поля bLength … bNumConfigurations (смещения 0–17), bMaxPacketSize0 — только 8, 16, 32 или 64, на High Speed — 64; idVendor назначает USB-IF, idProduct — производитель; iManufacturer, iProduct, iSerialNumber — индексы строк; разд. 9.6.3, табл. 9-10: у устройства одна или несколько конфигураций, у конфигурации — интерфейсы, у интерфейса — ноль или больше конечных точек; wTotalLength; bMaxPower в единицах 2 мА; разд. 9.4.3: запрос дескриптора конфигурации возвращает её вместе со всеми дескрипторами интерфейсов и точек; если wLength меньше длины дескриптора, возвращается только его начало; разд. 9.6.6: для точки 0 дескриптора нет; разд. 9.6.7: строки в Юникоде
- USB-IF. Defined Class Codes — код класса — три байта (Base Class, SubClass, Protocol) в дескрипторе устройства или в дескрипторах интерфейсов; 00h в дескрипторе устройства — класс задаётся в интерфейсах
Нашли ошибку?