MyTetra Share
Делитесь знаниями!
Descriptors
Время создания: 13.02.2018 15:27
Раздел: Electronics - Theory - USB

Все устройства USB имеют иерархию дескрипторов, которые описывают информацию для хоста – такую, как например что это за устройство, кто его изготовил, какую версию USB поддерживает устройство, какими способами устройство может быть сконфигурировано, количество конечных точек и их типы и т. д.


Наиболее общие дескрипторы USB следующие:


  • Дескрипторы устройства
  • Дескрипторы конфигурации
  • Дескрипторы интерфейса
  • Дескрипторы конечной точки
  • Строковые дескрипторы


Первые 4 вида дескрипторов должны обязательно присутствовать в USB устройстве.



Конечные точки объединяются в интерфейс. Каждому интерфейсу соответствует драйвер операционной системы (ОС) хоста. Некоторые устройства могут иметь несколько интерфейсов, которые могут функционировать одновременно. Телефонный аппарат VOIP может иметь интерфейс клавиатуры и аудио интерфейс, тогда ОС хоста будет использовать 2 различных драйвера, для каждого интерфейса. А прикладная программа, будет взаимодействовать с этими драйверами для функционирования. Несколько интерфейсов, могут объединяться в конфигурацию. У USB устройства может быть несколько конфигураций, но не может быть активными несколько конфигураций одновременно, возможно переключение между конфигурациями.


Дескриптор устройства (device descriptor) может быть только один для устройства USB. Дескриптор устройства включает в себя такую информацию, как поддерживаемую устройством ревизию USB, Product ID (PID, идентификатор продукта), Vendor ID (VID, идентификатор производителя), используемые для загрузки соответствующего устройству драйвера, и количество возможных конфигураций устройства. Число конфигураций указывает, сколько имеется ответвлений по дескрипторам конфигурации.


Дескриптор конфигурации (configuration descriptor) указывает величину потребляемой мощности от шины, питается ли устройство от собственного источника (self powered) либо от шины USB (bus powered) и количество интерфейсов, которые есть у конфигурации. Когда устройство проходит энумерацию, хост читает дескриптор устройства и принимает решение, какую конфигурацию применить. Хост может разрешить только какую-то одну из конфигураций.


Например, возможно существование конфигурации с высоким потреблением мощности от шины, и есть конфигурация с собственным источником питания. Если устройство подсоединено к хосту-десктопу с сетевым блоком питания, драйвер может выбрать конфигурацию с высоким потреблением мощности от шины, несмотря на то, что устройство подключено к собственному источнику, а в случае подсоединения к хосту-ноутбуку (при питании его от аккумулятора) драйвер может принудительно выбрать конфигурацию с собственным блоком питания, что потребует от пользователя обязательного подключения внешнего блока питания для USB-устройств.


Параметры настройки конфигураций не ограничены различиями мощности. Каждая конфигурация может быть настроена на одинаковое питание, но иметь разные интерфейсы или наборы конечных точек. Однако нужно отметить, что изменение конфигурации требует, чтобы вся деятельность по каждой конечной точке остановилась. В то время как USB предлагает эту возможность, у очень немногих устройств есть больше чем 1 конфигурация.



Дескриптор интерфейса можно рассматривать как заголовок или группирование конечных точек в функциональную группу, выполняющую единственную особенность (feature) устройства. Например у Вас может быть многофункциональное устройство факса/сканера/принтера. Дескриптор интерфейса 1 может описывать конечные точки функции факса, дескриптор интерфейса 2 может описывать функцию сканера, и дескриптор интерфейса 3 может описывать функцию принтера. В отличие от дескриптора конфигурации, здесь нет ограничений на количество одновременно разрешенных интерфейсов. У устройства могут быть 1 или много интерфейсов, разрешенных одновременно.


Дескрипторы интерфейса имеют поле bInterfaceNumber, указывающее номер интерфейса, и поле bAlternateSetting, которое разрешает интерфейсу поменять установки на лету. Например, у Вас есть устройство с двумя интерфейсами – интерфейс 1 и интерфейс 2. У интерфейса 1 поле bInterfaceNumber установлено в 0, что показывает – это первый дескриптор интерфейса, и поле bAlternativeSetting, установленное в 0. У интерфейса 2 поле bInterfaceNumber установлено в 1, что показывает - это второй интерфейс, и поле bAlternativeSetting установленное в 0 (значение по умолчанию). Мы могли бы добавить сюда другой дескриптор, у которого поле bInterfaceNumber также установлено в 1 (показывает, что это второй интерфейс), но на этот раз поле bAlternativeSetting установлено в 1, что показывает – дескриптор интерфейса может иметь альтернативную настройку, взятую из другого описателя интерфейса 2.


Когда эта конфигурация разрешена, используются первые два дескриптора интерфейса, у которых поле bAlternativeSettings равно 0. Однако во время работы хост может послать запрос SetInterface, направленный на интерфейс с номером 1 (второй интерфейс) с альтернативной настройкой 1, что разрешает другой дескриптор интерфейса.



Это дает преимущество при использовании двух конфигураций – мы можем передавать данные через интерфейс 0, и в то же время менять настройки конечной точки, связанной с интерфейсом 1, не мешая работе интерфейса 0.


Каждый дескриптор конечной точки используется для указания типа передачи, направления, интервала опроса (polling interval) и максимального размера пакета для каждой конечной точки. Конечная точка 0 всегда подразумевается по умолчанию точкой для управления, и поэтому она не имеет дескриптора.




Композиция дескрипторов USB

Все дескрипторы имеют общий формат. Первый байт указывает длину дескриптора в байтах, второй байт показывает тип дескриптора. Если длина описателя будет меньшей, чем определено в спецификации, то главный компьютер должен проигнорировать его. Однако, если размер больше ожидаемого, хост будет игнорировать дополнительные байты, и будет искать следующий дескриптор в конце возвращенной действительной длины.


Смещ.

Поле

Размер

Значение

Описание

0

bLength

1

Число

Размер дескриптора в байтах

1

bDescriptionType

1

Константа

Тип дескриптора

2

...

n

 

Начало параметров дескриптора



Дескрипторы устройства

Дескриптор устройства для устройства USB представляет само устройство в целом. Как следствие – устройство USB может иметь только один дескриптор устройства. Этот дескриптор указывает некоторые основные (несомненно важные) сведения об устройстве, такие как поддерживаемая версия USB, максимальный размер пакета, идентификаторы ID вендора и продукта (VID и PID) и количество возможных конфигураций, которые может иметь устройство. Формат дескриптора устройства показан далее.


Смещ.

Поле

Размер

Значение

Описание

0

bLength

1

Число

Размер дескриптора в байтах (для дескриптора устройства размер 18 байт)

1

bDescriptorType

1

Константа

Тип - Device Descriptor (0x01)

2

bcdUSB

2

BCD

Номер спецификации USB, с которой совместимо устройство.

4

bDeviceClass

1

Class
(класс)

Код класса (назначается организацией USB Org)
Если равно 0, то каждый интерфейс указывает свой собственный код класса.
Если равен 0xFF, то код класса определяется вендором.
Иначе поле содержит код стандартного класса.

5

bDeviceSubClass

1

SubClass
(подкласс)

Код подкласса (назначается организацией USB Org)

6

bDeviceProtocol

1

Протокол

Код протокола (назначается организацией USB Org)

7

bMaxPacketSize

1

Число

Максимальный размер пакета для конечной точки 0. Допустимые размеры 8, 16, 32, 64

8

idVendor

2

ID

Vendor ID, VID (назначается организацией USB Org)

10

idProduct

2

ID

Product ID, PID (назначается организацией - производителем)

12

bcdDevice

2

BCD

Device Release Number (номер версии устройства)

14

iManufacturer

1

Индекс

Индекс строки, описывающей производителя

15

iProduct

1

Индекс

Индекс строки, описывающей продукт

16

iSerialNumber

1

Индекс

Индекс строки, содержащей серийный номер

17

bNumConfigurations

1

Целое
(Integer)

Количество возможных конфигураций

  • Поле bcdUSB сообщает о самой высокой версии USB, которая поддерживается устройством. Величина кодируется в формате binary coded decimal (BCD, десятичное число, закодированное в двоичном формате) 0xJJMN, где JJ старшая часть номера версии, M младшая часть версии, и N младшая часть подверсии.Например,USB 2.0 кодируется как 0x0200, USB 1.1 как 0x0110 и USB 1.0 как 0x0100.
  • Поля bDeviceClass, bDeviceSubClass и bDeviceProtocol используются операционной системой для того, чтобы подобрать драйвер класса (class driver) для Вашего устройства. Обычно только bDeviceClass установлен на уровне устройства. Большинство спецификаций класса хочет идентифицировать себя на уровне интерфейса, в результате bDeviceClass установлен в 0x00. Это позволяет одному устройству поддерживать несколько классов.
  • Поле bMaxPacketSize сообщает максимальный размер пакета для конечной точки 0. Все устройства USB должны поддерживать конечную точку 0.
  • Поля  idVendor и idProduct используются операционной системой для нахождения драйвера для устройства, их также использует программа (ПО хоста), работающая с USB-устройством. Vendor ID назначается организацией USB-IF.
  • Поле bcdDevice имеет тот же формат, что и поле bcdUSB, и используется для предоставления номера версии устройства. Его значение присваивается разработчиком устройства USB.
  • Три строковых дескриптора существуют для предоставления подробной информации о производителе, продукте и серийном номере. Нет обязательных требований по наличию строковых дескрипторов. Если строковых дескрипторов нет, должен использоваться нулевой индекс.
  • Поле bNumConfigurations задает количество конфигураций устройства, которые оно поддерживает на текущей скорости.




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

Устройство USB может иметь несколько различных конфигураций, хотя большинство устройств просты и имеют только одну конфигурацию. Дескриптор конфигурации указывает, как устройство запитывается, какое у него максимальное энергопотребление, количество интерфейсов, которое имеет устройство. Поэтому для устройства возможно иметь 2 конфигурации – одну для питания от шины, другую для питания от основного (внешнего) источника. Поскольку это – заголовок к дескрипторам интерфейса, возможно также иметь разные конфигурации для различных режимов передачи.

Как только все конфигурации прочитаны и проанализированы хостом, он посылает команду SetConfiguration с ненулевым значением, которое соответствует bConfigurationValue одной из конфигураций. Это используется для выбора нужной конфигурации.


Смещ.

Поле

Размер

Значение

Описание

0

bLength

1

Число

Размер дескриптора в байтах

1

bDescriptorType

1

Константа

Дескриптор конфигурации (0x02)

2

wTotalLength

2

Число

Полная длина возвращаемых данных в байтах

4

bNumInterfaces

1

Число

Количество интерфейсов

5

bConfigurationValue

1

Число

Величина, используемая как аргумент для выбора этой конфигурации

6

iConfiguration

1

Индекс

Индекс строкового дескриптора, описывающего эту конфигурацию

7

bmAttributes

1

Набор бит (Bitmap)

D7 зарезервировано, установлено в 1. (USB 1.0 Bus Powered)
D6 самозапитываемое (Self Powered)
D5 удаленное пробуждение (Remote Wakeup)
D4..0 зарезервировано, установлено в 0.

8

bMaxPower

1

мА

Максимальное энергопотребление в единицах 2 мА


  • Когда дескриптор конфигурации прочитан, он возвращает полное дерево иерархии, которое включает все используемые дескрипторы интерфейсов и дескрипторы конечных точек. Поле  wTotalLength отражает количество байт в иерархии.


  • bNumInterfaces указывает количество интерфейсов, представленных для этой конфигурации.
  • bConfigurationValue используется в запросе SetConfiguration для выбора этой конфигурации.
  • iConfiguration – индекс строкового дескриптора, описывающего конфигурацию в виде, удобном для восприятия человеком.
  • bmAttributes задает параметры питания для конфигурации. Если устройство имеет собственное питание, устанавливается бит D6. Бит D7 ранее использовался в USB 1.0 для указания, что устройство питается от шины, но теперь это делается с помощью поля bMaxPower. Если устройство использует любую мощность, потребляемую от шины, в любом случае – либо это устройство, питаемое от шины, либо имеющее отдельный источник питания – устройство должно сообщить о своей максимальной потребляемой мощности в поле bMaxPower. Устройство может также поддерживать удаленное пробуждение (remote wakeup), которое позволяет устройству пробуждать хост, когда он находится в режиме приостановки.
  • bMaxPower задает максимальную потребляемую мощность устройством от шины USB. Величина указывается в единицах 2 мА. Таким образом, может быть указан максимум потребления примерно 500 мА. Спецификация позволяет устройству, питающемуся от шины, потреблять ток не более 500 мА от провода Vbus. Если устройство теряет внешнее питание (приходящее не от Vbus), оно не должно потреблять больше, чем указано в bMaxPower. Это должно прервать по ошибке любую операцию, которую устройство не может выполнить без внешнего источника питания.




Дескрипторы интерфейса

Дескриптор интерфейса можно рассматривать как заголовок собрание конечных точек, объединенных в функциональную группу для реализации (feature) устройства. Дескриптор интерфейса имеет следующий формат.


Смещ.

Поле

Размер

Значение

Описание

0

bLength

1

Число

Размер дескриптора в байтах (9 байт)

1

bDescriptorType

1

Константа

Дескриптор интерфейса (0x04)

2

bInterfaceNumber

1

Число

Индекс (порядковый номер) интерфейса

3

bAlternateSetting

1

Число

Величина, используемая для выбора альтернативной установки

4

bNumEndpoints

1

Число

Количество конечных точек, используемых в интерфейсе

5

bInterfaceClass

1

Класс

Код класса (назначается организацией, следящей за стандартами USB)

6

bInterfaceSubClass

1

Подкласс (SubClass)

Код подкласса (назначается организацией, следящей за стандартами USB)

7

bInterfaceProtocol

1

Протокол

Код протокола (назначается организацией, следящей за стандартами USB)

8

iInterface

1

Индекс

Индекс строкового дескриптора, описывающего этот интерфейс

  • bInterfaceNumber показывает индекс дескриптора интерфейса. Он указывается относительно нуля, и инкрементируется на 1 для каждого нового дескриптора интерфейса.
  • bAlternativeSetting может использоваться для задания alternative interfaces (альтернативных интерфейсов). Эти альтернативные интерфейсы могут быть выбраны запросом Set Interface.
  • bNumEndpoints показывает количество конечных точек, используемых в интерфейсе. Эта величина должна быть указана без учета конечной точки 0. Поле bNumEndpoints используется для указания количества идущих далее дескрипторов конечных точек.
  • bInterfaceClass, bInterfaceSubClass и bInterfaceProtocol может использоваться для указания поддерживаемых классов - HID, коммуникационное устройство, mass storage (устройство хранения информации) и т. д. Это позволяет многим устройствам использовать драйверы класса (встроенные в операционную систему) – при этом отпадает необходимость в написании специального отдельного драйвера для Вашего устройства.
  • iInterface используется для строкового описателя интерфейса.




Дескрипторы конечной точки

Дескрипторы конечной точки используются для описания конечных точек, отличных от конечной точки 0. Конечная точка 0 всегда используется как конечная точка управления, и она конфигурируется сразу автоматически, даже перед запросом информации всех дескрипторов. Хост использует информацию, полученную из описателей конечных точек, чтобы определить требования по полосе пропускания шины.


Смещ.

Поле

Размер

Значение

Описание

0

bLength

1

Число

Размер дескриптора в байтах (7 байт)

1

bDescriptorType

1

Константа

Дескриптор конечной точки (0x05)

2

bEndpointAddress

1

Конечная точка

Адрес конечной точки
биты 0..3 номер конечной точки
биты 4..6 зарезервированы, установлены в 0
бит 7 направление 0 = Out, 1 = In (для конечных точек игнорируется)

3

bmAttributes

1

Набор бит (Bitmap)

биты 0..1 тип передачи
00 = Control
01 = Isochronous
10 = Bulk
11 = Interrupt
биты 2..7 зарезервированы. Если конечная точка изохронная, то:
биты 3..2 = тип синхронизации (режим Iso)
00 = No Synchronisation
01 = Asynchronous
10 = Adaptive
11 = Synchronous
биты 5..4 = тип использования Usage Type (режим Iso)
00 = конечная точка данных
01 = конечная точка обратной связи (Feedback Endpoint)
10 = явная конечная точка обратной связи данных (Explicit Feedback Data Endpoint)
11 = зарезервировано

4

wMaxPacketSize

2

Число

Максимальный размер пакета этой конечной точки, подходящий для отправки или приема

6

bInterval

1

Число

Интервал для того, чтобы опросить передачи данных конечной точки. Указывается в количестве фреймов. Поле игнорируется для конечных точек Bulk и Control. Для конечных точек Isochronous должно быть равно 1 и для конечных точек interrupt может лежать в диапазоне 1..255.

  • bEndpointAddress индицирует, какую конечную точку описывает этот дескриптор.
  • bmAttributes указывает тип передачи. Это могут быть передачи Control, Interrupt, Isochronous или Bulk. Если указана контрольная точка изохронного типа, могут быть выбраны дополнительные атрибуты, такие как синхронизация и типы использования.
  • wMaxPacketSize указывают максимальный размер полезной нагрузки в байтах для этой конечной точки.
  • bInterval используется, чтобы определить интервал опроса определенных передач. Единицы измерения – фреймы, что для устройств low/full speed составляет 1 мс, и для high speed устройств – 125 мкс.




Строковые дескрипторы

Строковые дескрипторы предоставляют информацию в формате, удобном для чтения человеком, и их указывать необязательно. Если строковые дескрипторы не используются, поле индекса строки дескриптора должно быть установлено в 0, что указывает на отсутствие строкового дескриптора.

Строки закодированы в формате Unicode, и разрабатываемое устройство USB может быть изготовлено с поддержкой многих языков. Строка с индексом 0 должна вернуть список поддерживаемых языков. Список ID языков для USB может быть найден в документе Universal Serial Bus Language Identifiers (LANGIDs) version 1.0.


Смещ.

Поле

Размер

Значение

Описание

0

bLength

1

Число

Размер дескриптора в байтах

1

bDescriptorType

1

Константа

Строковый дескриптор (0x03)

2

wLANGID[0]

2

Число

Код поддерживаемого языка 0
(например 0x0409 Английский - United States)

4

wLANGID[1]

2

Число

Код поддерживаемого языка 1
(например 0x0c09 Английский – Австралия)

n

wLANGID[x]

2

Число

Код поддерживаемого языка x
(например 0x0407 Немецкий - стандартный)

Вышеупомянутый строковый дескриптор показывает формат строкового дескриптора 0. Хост должен прочитать этот дескриптор, чтобы определить, какие языки поддерживаются устройством. Если язык поддерживается, хост может запросом Get Descriptor(String) сослаться на него путем отсылки ID языка в поле wIndex.

Все последующие строки имеют формат:


Смещ.

Поле

Размер

Значение

Описание

0

bLength

1

Число

Размер дескриптора в байтах

1

bDescriptorType

1

Constant

Строковый дескриптор (0x03)

2

bString

n

Unicode

Строка, закодированная в Unicode




Дескриптор репорта

Строковые дескрипторы предоставляют информацию в формате, удобном для чтения человеком, и их указывать необязательно. Если строковые дескрипторы не используются, поле индекса строки дескриптора должно быть установлено в 0, что указывает на отсутствие строкового дескриптора.




 
MyTetra Share v.0.53
Яндекс индекс цитирования