Перейти к содержанию

Дескриптор 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.

Источники

  1. 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: строки в Юникоде
  2. USB-IF. Defined Class Codes — код класса — три байта (Base Class, SubClass, Protocol) в дескрипторе устройства или в дескрипторах интерфейсов; 00h в дескрипторе устройства — класс задаётся в интерфейсах

Нашли ошибку?