USB

Дескрипторы

В USB принята иерархия дескрипторов, описывающих все свойства устройств. Стандартные дескрипторы USB начинаются с байта длины дескриптора, за которым следует байт, определяющий тип дескриптора.

  • дескриптор устройства, Device Descriptor (тип 1), описывающий устройство в целом (версия USB, класс, производитель, модель, протокол, число возможных конфигураций). Для HS-устройств общее описание дополняется дескриптором-квалификатором, Device Qualfier Descriptor (тип 6), в котором указывается, сколько у устройства будет конфигураций при работе на иной скорости (дескриптор устройства относится к той скорости, на которой устройство работает в данный момент);
  • дескрипторы конфигурации, Configuration Descriptor, (тип 2), описывающие число интерфейсов, атрибуты (способ питания и возможность генерации удаленного пробуждения) и мощность, потребляемую от шины в каждой конфигурации для текущей скорости. Для HS-устройств имеются и дескрипторы конфигураций для иной скорости, Other Speed Configuration Descriptor (тип 7), описывающие те же параметры с тем же форматом;
  • дескрипторы интерфейсов, Interface Descriptor (тип 4), для каждого из интерфейсов, доступных в указанной конфигурации, сообщает число прикладных конечных точек, класс и протокол интерфейса. В конфигурации может быть несколько альтернативных вариантов (alternate settings) данного интерфейса, каждому из которых соответствует свой дескриптор интерфейса. Первичным интерфейсом (primary interface) называют нулевой альтернативный вариант (alternate settings = 0);
  • дескрипторы конечных точек, Endpoint Descriptor (тип 5) определяют номер и направление точки, атрибуты (тип передач), максимальный размер поля данных и интервал обслуживания (для точек периодических передач);
  • строковые дескрипторы, String Descriptor (тип 3) — необязательные текстовые строки информации, которые могут отображаться хостом. Ссылки (однобайтные индексы) на строковые дескрипторы имеются в дескрипторах устройства, конфигураций и интерфейсов. Нулевое значение индекса означает отсутствие строкового дескриптора для данной структуры. Строки состоят из 2-байтных символов UNICODE, явного терминатора строки нет — конец определяется по длине, заявленной в заголовке дескриптора. Строковые дескрипторы могут присутствовать в устройствах на разных языках; для выбора нужного дескриптора в запросе кроме индекса указывается и 16-битный идентификатор языка (LanguageID). Строковый дескриптор, вызываемый по нулевому индексу (с любым кодом языка), в своем теле содержит список поддерживаемых идентификаторов языка. Значения LanguageID для некоторых языков:
         - русский — 0419h;
         - английский (США) — 0409h;
         - английский (Великобритания) — 0809h;
         - белорусский — 0423h;
         - украинский — 0422h;
  • специфические дескрипторы, Class-Specific Descriptor, могут использоваться в устройствах определенных классов. Так, например, для хабов имеется дескриптор интерфейса питания, Interface Power (тип 8). Специфические дескрипторы также должны начинаться с поля длины и типа.

Дескрипторы от устройств хост получает по запросам Get_Descriptor, указав тип дескриптора. Таким способом можно явно запросить дескриптор устройства (и квалификатор), дескриптор конфигурации (для текущей и иной скорости) и дескриптор строки (а также дескриптор OTG). Дескрипторы интерфейсов и конечных точек по отдельности не адресуются, они пристраиваются «хвостом» к дескриптору конфигурации. Возможность чтения всех имеющихся дескрипторов обязательна для всех устройств, дополнительно может поддерживаться и запись дескрипторов (запросом Set_Descriptor). Положительный ответ устройства на транзакцию записи дескриптора означает, что он принят и устройство будет подчиниться его свойствам.

По запросу дескриптора конфигурации устройство выдает целую цепочку дескрипторов, начинающуюся с собственно дескриптора конфигурации. За ней для каждого доступного интерфейса следует дескриптор первичного интерфейса и его конечных точек, за которым следуют все альтернативные варианты со своими конечными точками. Общая длина всего описания конфигурации заранее не известна, она указывается в поле wTotalLength дескриптора конфигурации. Так что для получения конфигурации сначала выполняют запрос, указав длину собственно дескриптора конфигурации (9, хотя достаточно и 4), а потом его повторяют с длиной, прочитанной из данного поля.

В приведенных ниже таблицах и описаниях перед мнемоническими названиями полей префикс b означает байт, w — двухбайтное слово, bm — битовую карту, i — целое число (однобайтный индекс), bcd — неупакованный BCD-формат, id — идентификатор (не число). Отметим, что в пакетах слово передается младшим байтом вперед, так что обращение к слову, размещенному в памяти хоста, будет естественным для процессоров x86 (младший байт по меньшему адресу) и не требует перестановки байтов.

Таблица. Дескриптор устройства

Смещение Поле Длина Содержание
0 bLength 1 Длина дескриптора (18)
1 bDescriptorType 1 Тип дескриптора (1)
2 bcdUSB 2 Версия спецификации USB в BCD-формате (0200h означает USB 2.0)
4 bDeviceClass 1 Код класса устройства
5 bDeviceSubClass 1 Код подкласса устройства
6 bDeviceProtocol 1 Код подкласса устройства
7 bMaxPacketSize0 1 Максимальный размер пакета для EP0 (8, 16, 32 или 64)
8 idVendor 2 Идентификатор производителя (Vendor ID)
10 idProduct 2 Идентификатор продукта (Product ID)
12 bcdDevice 2

Версия устройства в BCD-формате

14 iManufacturer 1 Индекс строкового дескриптора производителя
15 iProduct 1 Индекс строкового дескриптора продукта
16 iSerialNumber 1 Индекс строкового дескриптора серийного номера
17 bNumConfigurations 1 Число возможных конфигураций устройства на данной скорости

 

Таблица. Дескриптор-квалификатор устройства

Смещение Поле Длина Содержание
0 bLength 1 Длина дескриптора (10)
1 bDescriptorType 1 Тип дескриптора (10)
2 bcdUSB 2 Версия спецификации USB в BCD-формате (0200h означает USB 2.0)
4 bDeviceClass 1 Код класса устройства
5 bDeviceSubClass 1 Код подкласса устройства
6 bDeviceProtocol 1 Код подкласса устройства
7 bMaxPacketSize0 1 Максимальный размер пакета для EP0 на иной скорости
8 bNumConfigurations 1 Число возможных конфигураций устройства на иной скорости
9 bReserved 1 Резерв (0)

 

 Таблица. Дескрипторы конфигурации

Смещение Поле Длина Содержание
0 bLength 1 Размер данного дескриптора (9)
1 bDescriptorType 1 Тип дескриптора (2 или 7)
2 wTotalLength 2 Общее число байтов полного описания данной конфигурации
4 bNumInterfaces 1 Число поддерживаемых интерфейсов
5 bConfigurationValue 1 Номер конфигурации
6 iConfiguration 1 Индекс строкового дескриптора конфигурации
8 bmAttributes 1 Атрибуты (характеристики конфигурации: D7: резерв (1) D6: Selfpowered — возможность автономного питания D5: Remote Wakeup — способность генерации удаленного пробуждения D4...0: резерв (0)
9 bMaxPower 1 Максимальный ток потребления от шины в рабочем режиме в единицах по 2 мА

 

Таблица. Дескриптор интерфейса

Смещение Поле Длина Содержание
0  bLength  1  Размер данного дескриптора (9)
1  bDescriptorType  1  Тип дескриптора (4)
2  bInterfaceNumber  1  Номер интерфейса
3  bAlternateSetting  1  Номер альтернативной установки
4  bNumEndpoints  1  Число конечных точек, используемых интерфейсом (исключая EP0)
5  bInterfaceClass  1  Класс интерфейса
6  bInterfaceSubClass  1  Подласс интерфейса
7  bInterfaceProtocol  1  Код протокола
8  iInterface  1  Индекс строкового дескриптора интерфейса

 

Таблица. Дескриптор конечной точки

Смещение Поле Длина Содержание
0 bLength 1 Размер дескриптора (7)
1 bDescriptorType 1 Тип дескриптора (5)
2 bEndpointAddress 1 Адрес точки:
Биты [3:0] — номер точки;
Биты[6:4] — резерв (0);
Бит 7 — направление (игнорируется для EP0):
0 = OUT, 1 = IN
3 bmAttributes 1 Атрибуты точки:
Биты [1:0] — тип точки: 00 = Control,
01 = Isochronous, 10 = Bulk, 11 = Interrupt;
Биты [5:2] используются только для изохронных
точек, для остальных резерв (0):
Биты [3:2] — тип синхронизации: 00 = нет
синхронизации, 01 = асинхронная, 10 = адаптивная,
11 = синхронная;
Биты [5:4] — тип использования: 00 = данные,
01 = обратная связь, 10 = данные
с предоставлением неявной обратной связи,
11 = резерв
4 wMaxPacketSize 2 Биты [10:0] — максимальный размер пакета;
Биты [12:11] — число дополнительных транзакций
в микрокадре, только для широкополосных точек,
для остальных — резерв (0);
Биты [15:13] — резерв (0)
6 bInterval 1 Для точек периодических транзакций — интервал
обслуживания (см. главу 11), для HSточек
непериодического вывода — допустимая частота
посылки NAK

 

Таблица. Строковый дескриптор

Смещение Поле Длина Содержание
0 bLength 1 Размер дескриптора (N+2)
1 bDescriptorType 1 Тип дескриптора (3)
2 bString N Строка байтов


Sitelinkx by eXtro-media.de
Яндекс.Метрика