PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

USB

Устройства USB

Структура устройства с интерфейсом USB

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

Все протокольные и сигнальные функции USB обеспечивает блок последовательного интерфейса, SIE (Serial Interface Engine). В сторону USB блок SIE «смотрит» своим портом USB (комплектом приемопередатчиков). Блок SIE занимается последовательным приемом и передачей пакетов, выполняя подсчеты и проверки CRC, вставку битов (bit stuffing) при передаче и их удаление при приеме, кодирование NRZI, проверку форматов, отработку подтверждений и отслеживание корректной последовательности пакетов. С функциональной частью устройства блок SIE обменивается только «чистыми» пользовательскими данными. SIE сигнализирует о приходе очередного пакета к той или иной конечной точке, принимает от функциональной части данные к выдаче (вводу по запросу хоста), сообщает о выполнении этой операции. Количество и тип поддерживаемых конечных точек зависят от реализации SIE. Самые сложные в плане поддержки — точки типа Control, по этой причине многие устройства USB поддерживают лишь одну (обязательную) управляющую точку — EP0. С каждой поддерживаемой точкой в SIE связана буферная память, объем которой должен соответствовать максимальному размеру пакета, заявленному в дескрипторе точки. Блок SIE ведает и всеми дескрипторами (они размещаются в его локальной памяти) — сообщает их хосту по запросам, устанавливает конфигурацию и альтернативные установки. SIE отрабатывает и все запросы хоста, стандартные и специфические (управляет конечными точками, организует засыпание и пробуждение).

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

Как правило, периферийные устройства с USB имеют встроенный микроконтроллер, который и является источником и приемником информации, посылаемой через конечные точки. Микроконтроллер должен подчиняться указаниям от шины — выполнять сброс и приостановку по сигналам от порта, отрабатывать установки конфигурации и интерфейсов. Запросы управления стандартными свойствами (остановка и разблокирование точек, разрешение посылки удаленного пробуждения) доходят до контроллера опосредованно — в первую очередь их отрабатывает SIE.

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

 

Постовой: Полезные заметки по настройке компьютера.



Состояния устройств

Устройство USB должно поддерживать все состояния, определенные спецификацией:

  • «Подключено» (Attached State) — устройство подключено к хабу, но питание от шины не подано, устройство не может никак себя проявить и не управляемо хостом. Если питание от шины не используется (даже для SIE), то это состояние отсутствует;
  • «Запитано» (Powered State) — устройство подключено к порту и ему подано питание, устройство может заявить о себе, подтягивая резистором линию D+ или D- к шине питания. Это промежуточная ступенька к «дежурному» состоянию;
  • «Дежурное» состояние (Default State) по включению питания, подключению к порту или по сбросу от порта: устройство имеет нулевой адрес (USB Default Address) и отзывается только на обращения к EP0, потребляет от шины не более 100 мА;
  • «Адресовано» (Addressed State) — запросом Set_Address ему назначен уникальный адрес на шине (1–127), но отзывается только на обращения к EP0, потребляет от шины не более 100 мА;
  • «Сконфигурировано» (Configured State) — запросом Set_Configuration выбрана конфигурация, устройство отзывается на обращения ко всем точкам, описанным в данной конфигурации, и может потреблять от шины заявленный ток. При необходимости можно изменять альтернативные установки интерфесов запросом Set_Interface;
  • «Приостановлено» (Suspended Mode) — устройство подключено, запитано (хотя бы по минимуму), но приостановлено (прекращение активности порта, к которому оно подключено). Ему до приостановки мог быть назначен адрес и установлена конфигурация, однако хост не может использовать функции этого устройства, пока не будет выполнено возобновление (resume), которое вернет устройство в состояние, бывшее до приостановки. В этом состоянии устройство может подать сигнал удаленного пробуждения, если оно обладает этой возможностью и хост разрешил ее использовать.

USB поддерживает динамическое конфигурирование, отслеживая подключение и отключение устройств. USB позволяет идентифицировать подключаемые устройства, определять их потребности в ресурсах (полоса пропускания, питание от шины), выбирать нужную конфигурацию и управлять устройствами, что обеспечивает полную поддержку PnP. Для этих целей определены «правила поведения» подключаемых устройств, система дескрипторов и стандартные управляющие запросы к устройствам. Ключевую роль в системе PnP играют хабы, позволяющие селективно управлять работой подсоединенных к ним сегментов шины, что требуется на этапе конфигурирования. В процессе работы шины постоянно идет процесс нумерации (enumeration) устройств, отслеживающий изменения физической топологии.



Автоматическое конфигурирование

Все устройства подключаются через порты хабов. Хабы определяют подключение и отключение устройств к своим портам (см. главу 14) и сообщают состояние портов по запросу от контроллера. Хост своим управляющим запросом Port_Reset к хабу выполняет сброс и разрешает работу порта (одного!), на котором обнаружено новое подключение. При начальном подключении или после сброса устройство находится в «дежурном» состоянии (Default State) — отзывается только на обращения по основному каналу сообщений (EP0) и имеет нулевой адрес (USB Default Address). Таким образом, обращаясь к устройству по нулевому адресу, хост взаимодействует только с одним новоподключенным устройством. Хост стандартными запросами считывает дескрипторы этого устройства и назначает ему уникальный адрес на шине (1–127). Таким образом хост заполняет свой перечень подключенных устройств. По назначении уникального адреса устройство переходит в состояние «адресовано» (Addressed State), но его прикладное функционирование пока еще не разрешено. Полноценная работа устройства (прикладной обмен с хостом, полное потребление питания от шины) возможна только после управляющего запроса от хоста Set_Configuration, выбирающего конфигурацию из числа доступных — устройство переходит в состояние «сконфигурировано» (Configured State).

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

Когда устройство отключается, хаб автоматически запрещает соответствующий порт и сообщает об отключении хосту, который удаляет сведения о данном устройстве из всех рабочих структур данных (но не из реестра Windows!). Если отключается устройство-функция, уведомление посылается заинтересованному ПО. Если отключается хаб, процесс удаления выполняется для всех подключенных к нему устройств.



Идентификация и классификация устройств

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

В дескрипторе устройства имеются 2-байтные поля, идентифицирующие устройство в целом:

  • idVendor — идентификатор производителя (VID — Vendor Id), назначаемый USB-IF;
  • idProduct и bcdDevice — идентификатор продукта (PID — Product Id) и его версии (DID — Device Id), определяются производителем.

Кроме того, здесь могут присутствовать ссылки на строковые дескрипторы, в которых содержатся текстовые названия изготовителя и устройства, а также его серийный номер. Эти текстовые описания имеют произвольную длину и формат (но кодируются в UNICODE), на эти строковые дескрипторы указывают индексы в полях iManufacturer, iProduct и iSerialNumber.

Для определения назначения, возможностей и протоколов, поддерживаемых устройством и его отдельными интерфейсами, в его дескрипторах указываются коды класса, подкласса и протокола. Коды класса, подкласса и протокола имеют непосредственное отношение к интерфейсам — по ним могут быть подобраны (операционной системой автоматически) подходящий драйвер и клиентское приложение. Эти коды содержатся в дескрипторах интерфейсов, поддерживаемых устройством. «Штатные» коды в диапазоне 01h–FEh назначает USB-IF, но только для уже стандартизованных устройств. Значение 00h означает отсутствие определения, FFh отдано для специфического назначения разработчикам и производителям устройств. Сообщение штатного кода обязывает устройство соответствовать стандартным требованиям, предъявляемым к интерфейсам с указанным протоколом для заданного класса и подкласса, в том числе и выполнять все специфические запросы и сообщать специфические дескрипторы, если таковые имеются. При этом допускается и расширение возможностей устройства. Для связывания нестандартного устройства со своим драйвером используются идентификаторы VID и PID.

Коды класса, подкласса и протокола присутствуют не только в дескрипторах интерфейсов, но и в дескрипторе устройства. Здесь нулевой код класса означает, что устройство состоит из набора независимых интерфейсов, каждому из которых может быть назначен свой код класса, подкласса и протокола. При этом и подкласс и протокол устройства тоже нулевые (то есть устройство в целом стандартно охарактеризовать нельзя). «Штатный» код класса устройства означает, что его интерфейсы не являются независимыми (агрегированные интерфейсы). При этом код подкласса (тоже от USB-IF) является дополнительным квалификатором. «Штатный» код протокола означает, что устройство поддерживает все протоколы, требуемые для устройства данного класса и подкласса. Нулевой код протокола устройства означает, что протоколы могут быть определены только для отдельных интерфейсов.

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

 

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

Подкласс Протокол (точки, используемые интерфейсом)
Класс 01 — аудиоустройства
01 — AUDIOCONTROL, управляемый модуль аудиообработки (регулятор, фильтр, микшер, ревербератор…)
02 — AUDIOSTREAMING, устройство-приемник или источник аудиопотока
03 — MIDISTREAMING, устройство-приемник или источник потока MIDI-сообщений
00 — протокол не определен
Класс 03 — человеко-машинный интерфейс (HID-устройства)
01 — устройства, используемые при загрузке ОС 01 — клавиатура
02 — мышь
Класс 07 — принтеры
01 — передача к принтеру данных, используя любые языки описания страниц (PCL), применяемые в принтерах с традиционными интерфейсами, и прием информации о состоянии 01 — однонаправленный (EP0, Bulk-OUT)
02 — двунаправленный (EP0, Bulk-OUT, Bulk-IN)
03 — двунаправленный IEEE 1284.4 (EP0, Bulk-OUT, Bulk-IN)
Класс 08 — устройства хранения данных (mass storage)
01 — сокращенный набор команд (RBC — Reduced Block Commands), типично для устройств на флэш-памяти, но этот набор команд могут использовать любые устройства хранения
02 — SFF8020i, MMC-2 (ATAPI), типично для CD/DVD-устройств
03 — QIC-157 (ленточные устройства)
04 — UFI, типично для НГМД
05 — SFF8070i, типично для НГМД
06 — прозрачная передача команд SCSI
00 — CBI-транспорт с прерываниями (EP0, Bulk-OUT, Bulk-IN, Interrupt-IN)
01 — CBI-транспорт без прерываний (EP0, Bulk-OUT, Bulk-IN, Interrupt-IN), только для FS
50h — BO-транспорт (Bulk-OUT, Bulk-IN, EP0)
Класс 09h — хабы
00 — деления на подклассы нет 00 — хаб USB 1.x;
01 — хаб USB 2.0 с одним транслятором транзакций;
02 — хаб USB 2.0 с множеством трансляторов транзакций
Класс 0Eh — видеоустройства
01 —VIDEOCONTROL, управляемое устройство видеообработки
02 — VIDEOSTREAMING, устройство-приемник или источник видеопотока
03 — VIDEO_INTERFACE_COLLECTION, набор связанных интерфейсов видеоустройств
00 — протокол не определен


Дескрипторы

В 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 Строка байтов