Торговый павильон купить торговыи павильон.
В USB принята иерархия дескрипторов, описывающих все свойства устройств. Стандартные дескрипторы USB начинаются с байта длины дескриптора, за которым следует байт, определяющий тип дескриптора.
Дескрипторы от устройств хост получает по запросам 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 | Строка байтов |
Контроллер хаба является программно-видимым устройством USB, взаимодействуя с которым хост управляет конфигурированием устройств и соединениями на шине. Как и всякое устройство USB, контроллер хаба имеет набор дескрипторов, его описывающих. Для хабов определен специальный класс устройств (класс 09, подкласс 00). Интерфейс хаба (кроме обязательной нулевой контрольной точки) содержит конечную точку типа Interrupt-IN для информирования хоста о смене состояния. Управление хабом в целом и его портами выполняется с помощью специальных запросов к точке EP0. Их описание в табл.
Повторитель хаба обеспечивает динамические соединения между портами для трансляции пакетов и сигналов возобновления. В состоянии покоя повторителя все порты работают на прием и ожидают признака начала кадра или сигнала возобновления. По этим событиям устанавливается то или иное соединение портов (см. рисунок ниже).
В трансляции пакетов участвуют только разрешенные порты (восходящий разрешен всегда). Если какой-либо разрешенный порт обнаружил начало пакета, то устанавливается соединение в соответствии с рисунком б или в, и повторитель транслирует пакет, дожидаясь его конца (признака EOP). По концу пакета повторитель опять переходит в состояние покоя. Из рисунков видно, что нисходящий трафик транслируется широковещательно. Восходящий трафик транслируется сугубо направленно, так, что его «видят» только хабы, расположенные в цепочке от устройства к хосту, но не другие устройства.
Сигнал возобновления (resume) транслируется несколько иначе. С восходящего порта сигнал resume транслируется во все нисходящие порты, кроме запрещенных и селективно приостановленных. Сигнал resume, обнаруженный на нисходящем разрешенном порте, подхватывается хабом и транслируется в восходящий порт и во все нисходящие порты (включая и порт-источник сигнала), кроме запрещенных и селективно приостановленных. С селективно приостановленного порта сигнал возобновления подхватывается и транслируется обратно только в этот же порт, после чего хаб завершает сигнализацию возобновления (LS-EOP) и переводит порт в разрешенное состояние.
Спецификация интерфейса «открытого» хост-контроллера OpenHCI (OHCI) разработана компаниями Compaq, Microsoft и National Semiconductor и описана в документе «Open Host Controller Interface Specification for USB». Версия 1.0a этого документа опубликована в 1999 году. Контроллер OHC, как и UHC, предназначен для поддержки скоростей FS/LS. Однако аппаратные средства OHC берут на себя большую часть забот планирования, разгружая ЦП от рутины постоянной обработки дескрипторов. Контроллер OHC оперирует дескрипторами конечных точек и дескрипторами передач.
Дескрипторы конечных точек ED (Endpoint Descriptor) создаются для всех сконфигурированных конечных точек всех подключенных устройств. Эти дескрипторы размещаются в памяти и связываются между собой; конфигурация связей задает порядок их обслуживания хост-контроллером. Дескриптор конечной точки описывает ее полный адрес и направление, тип, допустимый размер пакета, скорость, состояние точки и дескриптора, указатели на очереди передач, связанных с данной точкой, указатель на дескриптор следующей точки. Для всех точек управления (Control) и всех точек передач массивов (Bulk) создаются отдельные цепочки ED, на начала этих цепочек указывают специальные регистры OHC. Дескрипторы точек периодических передач организуются в «поваленное» двоичное дерево (см. рисунок ниже), в «ветвях» которого размещаются дескрипторы точек прерываний, а в «стволе» — дескрипторы точек прерываний с минимальным интервалом обслуживания и все дескрипторы точек изохронных передач. У дерева имеются 32 конечных ветви, проход по дереву осуществляется от конечных ветвей к стволу. В каждом из 32 смежных кадров вход осуществляется со своей ветви. Для этого в OHC имеется регистр базового адреса HCCA (Host Controller Communication Area, область коммуникаций хост-контроллера), указывающий на ветвь с номером 0, и счетчик кадров, 5 младших бит которого задают номер ветви входа для очередного кадра. Таким образом, через каждую ветвь пятого уровня (конечного) обработчик дескрипторов проходит 1 раз за 32 кадра (T = 32 мс), четвертого — 1 раз за 16 кадров (T = 16 мс), для третьего уровня — T = 8 мс, для второго — T = 4 мс, для первого — T = 2 мс, для нулевого (ствола) — T = 1 мс.
Дескрипторы передач TD (Transfer Descriptor), в отличие от TD UHC, для OHC действительно описывают передачи USB. Каждая передача может разбиваться на несколько транзакций, и это разбиение выполняет хост-контроллер исходя из размера пакета, установленного в дескрипторе конечной точки. Буфер данных для передачи может располагаться в одной или двух физических страницах памяти, возможно, разрозненных. В виртуальном пространстве логических адресов буфер должен быть непрерывной областью. Размер передачи может достигать 8 Кбайт, но если буфер начинается не с начала страницы, то допустимый размер передачи сократится (в худшем случае до 4097 байт). Дескрипторы передач собираются в очереди, которые прикрепляются к дескрипторам конечных точек.
Хост-контроллер OHC имеет таймеры, с помощью которых он осуществляет планирование транзакций в кадре. После SOF контроллер начинает обход цепочки ED для управляющих передач и выполняет столько из них, сколько успеет за время T1. Далее он начинает обход дерева периодических передач, от n-й конечной ветви до ствола, пока не пройдет по всем встретившимся ED. Если у него еще остается время в кадре, он снова берется за непериодические передачи (Bulk и Control). Отработанные (успешно или снятые по превышению порога ошибок) дескрипторы контроллер собирает в специальную очередь обработанных дескрипторов Done Queue, откуда их без труда извлекает драйвер. Контроллер может вырабатывать прерывания по завершению обработки TD, причем с заданной (для каждого TD) задержкой (или не вырабатывать запрос). Контроллер OHC имеет регистр для подстройки частоты кадров. В контроллер входит и корневой хаб на 2 или более порта.
Контроллер OHC, как и UHC, обычно является активным устройством PCI (Bus Master), но по сравнению с UHC наделен большим интеллектом. В контроллере предусмотрена поддержка контроллера клавиатуры и мыши (KBC) с помощью прерываний SMI, но, в отличие от UHC, в OHC имеются и специальные регистры, упрощающие задачу эмуляции.
Аудиоустройства с точки зрения USB представляют собой, как правило, композитные устройства, содержащие набор независимых интерфейсов. Путь любого аудиосигнала в аудиоустройстве начинается с входного терминала (Input Terminal) и заканчивается на выходном терминале (Output Terminal). Между терминалами могут находиться различные модули (Unit), осуществляющие какие-то преобразования и соединения.
Терминалы могут быть различных типов:
Всеми этими терминалами требуется управлять по шине USB; для них имеются дескрипторы, описывающие их управляемые свойства.
Модули (units), которые располагаются пути аудиосигнала, могут выполнять самые разнообразные функции: коммутация, регулировка уровня, микширование, панорамирование, фильтрация, реверберация и все возможные эффекты, которые стали легко реализуемыми с применением цифровой формы обработки сигналов. Для этих модулей введен подкласс 01 — AUDIOCONTROL, тоже со своими специфическими дескрипторами и запросами.
С аудиоустройствами тесно связаны и MIDI-устройства, являющиеся приемниками или источниками потоков MIDIсообщений. Для них введен подкласс 03 — MIDISTREAMING со своими специфическими дескрипторами и запросами. MIDIустройство USB может выступать как в роли простого конвертора интерфейсов (выполнять доставку сообщений между хостом и MIDI-разъемами на устройстве), так и MIDI-синтезатора, преобразующего MIDI-сообщения в аудиопотоки. При этом обрабатываться могут сообщения как с внешних разъемов, так и с шины USB. Синтезатор MIDI с точки зрения аудиоустройства является встроенным входным терминалом. Он поставляет аудиопоток, дальнейший путь которого определяется аудиоустройством (через интерфейсы подклассов 01 и 02).
Транзакции прерываний и передач массивов на шине выглядят одинаково. Здесь используются все механизмы управления потоком, надежной доставки и сигнализации, описанные выше. Инициализация переключателей (Toggle Bit) в устройстве и конечной точке контроля последовательности пакетов выполняется следующим образом:
Отметим, что по спецификациям USB транзакции прерываний могут использоваться как для ввода данных, так и для их вывода по запросу. Правда, случаи вывода по прерываниям рассматриваются не так подробно, как это имеет место для более привычного ввода. Ввод/вывод через транзакции Interrupt привлекателен возможностью получения и почти гарантированной скорости (не принимая в расчет ошибок передачи), и гарантированной доставки.