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

заправка картриджей canon ip1900. Живые елки с доставкой доставка живых елок.

USB

Применение шины USB

Применение USB

Благодаря универсальности и способности эффективно передавать разнородный трафик шина USB применяется для подключения к PC самых разнообразных устройств. Она призвана заменить традиционные порты PC — COM и LPT, а также порты игрового адаптера и интерфейса MIDI. Спецификация USB 2.0 позволяет говорить и о подключении традиционных «клиентов» шин ATA и SCSI, а также захвате части ниши применения шины FireWire. Привлекательность USB придает возможность подключения/отключения устройств на ходу и возможность их использования практически сразу, без перезагрузки ОС. Удобна и возможность подключения большого количества (до 127) устройств к одной шине, правда, при наличии хабов. Хост-контроллер интегрирован во все современные системные платы. Выпускаются и карты расширения с контроллерами USB (обычно для шины PCI). Некоторое время повсеместное применение USB сдерживалось недостаточной активностью разработчиков ПО (производителей оборудования): просматривая перечни устройств, можно было видеть, что для всех указывается поддержка в Windows 98/SE/ME, а вот в графах Linux, MacOS, Unix и даже Windows 2000/NT часто стоят неприятные пометки N/A (Not Allowed — «не дозволено»). В настоящее время ситуация меняется (теперь возникают проблемы поиска драйверов для Windows 9x), но вопросы совместимости ПО иногда доставляют дополнительные хлопоты.

Для того чтобы система USB заработала, необходимо, чтобы были загружены драйверы хост-контроллера (или контроллеров, если их несколько). При подключении устройства к шине USB ОС Windows выдает сообщение «Обнаружено новое устройство» и, если устройство подключается впервые, предлагает загрузить для него драйверы. Многие модели устройств уже известны системе, и драйверы входят в дистрибутив ОС. Однако может потребоваться и драйвер изготовителя устройства, который должен входить в комплект поставки устройства, или его придется искать в Сети. К сожалению, не все драйверы работают корректно — «сырой» драйвер начальной версии, возможно, потребуется заменить более «правильным», чтобы устройство нормально опознавалось и хорошо работало. Но это общее горе пользователей любых устройств, а не только устройств для шины USB.

Перечислим основные области применения USB:

  • устройства ввода — клавиатуры, мыши, трекболы, планшетные указатели и т. п. Здесь USB предоставляет единый интерфейс для различных устройств. Целесообразность использования USB для клавиатуры в настольных ПК пока не очевидна (порты клавиатуры и мыши PS/2 есть на всех системных платах), хотя в паре с мышью USB (подключаемой к порту хаба, встроенного в клавиатуру) сокращается количество кабелей, тянущихся от системного блока к столу пользователя;
  • принтеры. USB 1.1 обеспечивает почти ту же скорость, что и LPT-порт в режиме ECP, но при использовании USB не возникает проблем с длиной кабеля и подключением нескольких принтеров к одному компьютеру (правда, требуются хабы). USB 2.0 позволит ускорить печать в режиме высокого разрешения за счет сокращения времени на передачу больших массивов данных. Однако существует проблема со старым ПО, которое непосредственно работает с LPTпортом на уровне регистров, — на принтер USB оно печатать не сможет;
  • сканеры. Применение USB позволяет отказаться от контроллеров SCSI или от занятия LPT-порта. USB 2.0 при этом позволяет еще и повысить скорость передачи данных;
  • аудиоустройства — колонки, микрофоны, головные телефоны (наушники). USB позволяет передавать потоки аудиоданных, достаточные для обеспечения самого высокого качества. Передача в цифровом виде от самого источника сигнала (микрофона со встроенным преобразователем и адаптером) до приемника и цифровая обработка в хост-компьютере позволяют избавиться от наводок, свойственных аналоговой передаче аудиосигналов. Использование USB-аудиокомпонентов позволяет в ряде случаев избавиться и от звуковой карты компьютера—аудиокодек (АЦП и ЦАП) выводится за пределы компьютера, а все функции обработки сигналов (микшер, эквалайзер и т. п.) реализуются центральным процессором чисто программно. Аудиоустройства могут и не иметь собственных колонок и микрофона, а ограничиться преобразователями и стандартными гнездами («джеками») для подключения обычных аналоговых устройств;
  • музыкальные синтезаторы и MIDI-контроллеры с интерфейсом USB. Шина USB позволяет компьютеру обрабатывать потоки множества каналов MIDI (пропускная способность традиционного интерфейса MIDI уже гораздо ниже возможностей компьютера);
  • фото- и видеокамеры. USB 1.1 позволяет передавать статические изображения любого разрешения за приемлемое время, а также передавать поток видеоданных (живое видео) с достаточной (25–30 кадров/с) частотой кадров только с невысоким разрешением или сильным сжатием данных, от которого, естественно, страдает качество изображения. USB 2.0 теоретически позволяет передавать поток видеоданных высокого разрешения без сжатия (и потери качества). С интерфейсом USB выпускают как камеры, так и устройства захвата видеосигнала и TV-тюнеры;
  • коммуникации. С интерфейсом USB выпускают разнообразные модемы, включая кабельные и xDSL, адаптеры высокоскоростной инфракрасной связи (IrDA FIR) — шина позволяет преодолеть предел скорости COM-порта (115,2 Кбит/с), не увеличивая загрузку центрального процессора. Выпускаются и сетевые адаптеры Ethernet, подключаемые к компьютеру по USB. Непосредственно (без дополнительных устройств) портами USB соединить между собой даже два компьютера нельзя — на одной шине может присутствовать лишь один хост-контроллер. Специальное устройство для связи пары компьютеров выглядит как «таблетка», врезанная в кабель USB с двумя вилками типа «A» на концах. Объединяющее устройство (USB Link) может располагаться и на системной плате компьютера, с выходом на внешний разъем, — в этом случае компьютеры соединяются просто кабелем, подключаемым к рядовому порту USB одного компьютера и порту USB Link другого. Коммуникационное ПО USB Link позволяет даже строить сеть на основе цепочки соединений по USB. Для соединения нескольких компьютеров в локальную сеть выпускаются специальные устройства, выполняющие коммутацию пакетов между компьютерами. Объединение более двух компьютеров осложняется и топологическими ограничениями USB: длина одного сегмента кабеля не должна превышать 5 м, а использовать хабы для увеличения дальности неэффективно (каждый хаб дает всего 5 м дополнительного расстояния);
  • преобразователи интерфейсов позволяют через порт USB, имеющийся теперь практически на всех компьютерах, подключать устройства с самыми разнообразными интерфейсами: Centronics и IEEE 1284 (LPT-порты), RS-232C (эмуляция UART 16550A — основы COM-портов) и другие последовательные интерфейсы (RS-422, RS-485, V.35...), эмуляторы портов клавиатуры и даже игрового порта, переходники на шину ATA, ISA, PC Card и любые другие, для которых достаточно производительности. Здесь USB становится палочкойвыручалочкой, когда встает проблема подключения к отсутствующему LPT или COM-порту, например, в блокнотном ПК, да и в других ситуациях. При этом ПО преобразователя может обеспечить эмуляцию классического варианта «железа» стандартных портов IBM PC, но только под управлением ОС защищенного режима. Приложение MS-DOS может обращаться к устройствам по адресам ввода-вывода, памяти, прерываниями, каналами DMA, но только из сеанса MS-DOS, открытого в ОС с поддержкой USB (чаще это Windows). При загрузке «голой» MS-DOS «палочка-выручалочка» не работает. Преобразователи интерфейсов позволяют продлить жизнь устройствам с традиционными интерфейсами, изживаемыми из PC спецификациями PC’99 и PC’2001. Скорость передачи данных через конвертер USB — LPT может оказаться даже выше, чем у реального LPT-порта, работающего в режиме SPP. Однако если подключаемое устройство требует интенсивного диалогового обмена (чередований коротких операций ввода и вывода) с ПО, подключение через USB будет работать медленно;
  • устройства хранения — жесткие диски, устройства чтения и записи CD и DVD, стримеры — при использовании USB 1.1 получают скорость передачи, соизмеримую со скоростью их подключения к LPT, но более удобный интерфейс (как аппаратный, так и программный). При переходе на USB 2.0 скорость передачи данных становится соизмеримой с ATA и SCSI, а ограничений по количеству устройств достичь трудно. Особенно интересно использование USB для электронных устройств энергонезависимого хранения (на флэш-памяти) — такой накопитель может быть весьма компактным (размером с брелок для ключей) и емким (от десятка мегабайт до гигабайта и более). Логически эти накопители могут представляться различным образом: просто как устройства хранения (USB Mass Storage, рассмотренные далее) или же как устройства считывания флэшкарт (например, Smart Media Card Reader, хотя у них и нет отделяемой SMCкарты). Выпускаются устройства для мобильного подключения накопителей с интерфейсом ATA-ATAPI — по сути, это лишь преобразователи интерфейсов, помещенные в коробку-отсек формата 5” или 3,5”, а иногда выполненные прямо в корпусе разъема ATA. Имеются и устройства чтения-записи карт SmartMedia Card, CompactFlash Card и других типов флэш-карт, в которые можно вставлять соответствующие носители;
  • игровые устройства — джойстики всех видов (от «палочек» до автомобильных рулей), пульты с разнообразными датчиками (непрерывными и дискретными) и исполнительными механизмами (почему бы не сделать кресло автогонщика с вибраторами и качалками?) — подключаются унифицированным способом. При этом исключается ресурсопожирающий интерфейс старого игрового адаптера (упраздненного уже в спецификации PC’99);
  • телефоны — аналоговые и цифровые (ISDN). Подключение телефонного аппарата позволяет превратить компьютер в секретаря с функциями автодозвона, автоответчика, охраны и т. п.;
  • мониторы — здесь шина USB используется для управления параметрами монитора. Монитор сообщает системе свой тип и возможности (параметры синхронизации) — это делалось и без USB по шине DDC. Однако USB-мониторы позволяют системе устанавливать параметры монитора. Регулировки яркости, контраста, цветовой температуры и т. п. могут теперь выполняться программно, а не только кнопками на лицевой панели монитора. В мониторы, как правило, встраивают хабы. Это весьма полезно, поскольку настольную периферию не всегда удобно включать в «подстольный» системный блок;
  • электронные ключи — устройства с любым уровнем интеллектуальности защиты — могут быть выполнены в корпусе вилок USB. Они гораздо компактнее аналогичных устройств для COM- и LPT-портов.

Конечно же, перечисленными классами устройств сфера применения шины USB не ограничивается.

На современных системных платах имеется встроенный хост-контроллер USB; для плат, выпускаемых с 2002–2003 годов, характерно наличие контроллера USB 2.0 (EHC) с несколькими контроллерами-компаньонами (чаще UHC). Типовое число портов — четыре и более (раньше минимумом было два). В случае поддержки USB 2.0 эти порты могут быть как равноправными (поддерживать подключение на любой скорости), так и выделенными (часть — только HS, часть — FS/LS). Часть портов выводится на внешние разъемы системного блока непосредственно, остальные выводятся на штырьковые разъемы, расположенные на системной плате. К этим промежуточным разъемам внешние разъемы подключаются через кабели«выкидыши». К сожалению, на многих корпусах системного блока отсутствует штатное место для разъемов USB с лицевой стороны, что делает подключение устройств неудобным. Эта проблема решается установкой разъемов на заглушки для 5” или 3,5”отсеков.


ВНИМАНИЕ!
Из-за ошибок при подключении кабеля-«выкидыша» на дополнительных внешних разъемах могут оказаться перепутанными цепи +5V и GND. Из-за такой ошибки подключаемое устройство, питающееся от шины (например, флэш-память), может выйти из строя (сгореть).


Хабы USB выпускаются как в виде отдельных устройств, так и встраиваются в периферийные устройства (клавиатуры, мониторы). Как правило, хабы питаются от сети переменного тока (они должны питать подключаемые устройства). Выпускают и хабы, устанавливаемые внутрь системного блока компьютера и питающиеся от его блока питания. Такие хабы дешевле внешних и не требуют дополнительной питающей розетки. Один из вариантов исполнения — установка хаба на скобку, монтируемую в окно для дополнительных разъемов. Доступ к их разъемам со «спины» системного блока не очень удобен для пользователей. Другой вариант — хаб, устанавливаемый в 3-дюймовый отсек. Его разъемы легко доступны, индикаторы состояния портов хорошо видны, но не всегда удобны кабели, выходящие с передней панели системного блока. С другой стороны, для подключения электронных ключей (если их приходится часто менять) или миниатюрных накопителей этот вариант — самый удобный.

Выпускаются вспомогательные устройства USB, увеличивающие дальность связи (distance extender). Простейший вариант — это обычный 5-метровый кабель USB, на одном конце которого обычная вилка «A», а на другом — миниатюрный однопортовый хаб с гнездом «B». При необходимости между устройством USB и корневым хабом можно использовать цепочку из 5 таких удлинителей, что дает дальность 25 м плюс длина кабеля устройства (до 5 м). Другой вариант — пара устройств, соединяемых между собой обычным кабелем «витая пара» категории 5 (или даже оптоволокном), включаемая между периферийным устройством и корневым хабом. Дальнее (от хоста) устройство этого удлинителя может быть и хабом на несколько портов. К сожалению, увеличение дистанции упирается в ограничения на время задержки сигнала, свойственные протоколу шины USB, и максимально достижимое расстояние составляет 200 футов (около 60 м). Уже с удлинителем на 50 м дополнительные хабы недопустимы — задержка сигнала в кабеле «съедает» лимиты, отпущенные хабам в спецификации USB. Но даже и эта длина позволяет расширить сферу применения USB, например, для удаленного видеонаблюдения. Утверждения изготовителей о достижимой дальности 100 м (а на оптике и до 500 м!) вызывают некоторое недоверие, поскольку ограничения дальности в спецификации USB жестко ограничено установками тайм-аутов ожидания ответа, а быстрее света сигналы в кабелях разогнать не удается.

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



Принтеры USB

Класс и протоколы принтеров с интерфейсом USB определены документом «Universal Serial Bus Device Class Definition for Printing Devices», первая версия которого появилась в 1997 году, версия 1.1 — в 2000 г. Протоколы определены с учетом обеспечения легкого перехода от традиционных интерфейсов принтера: последовательного (RS-232, RS-422) и параллельного (однонаправленного Centronics или двунаправленного IEEE 1284). Подключение принтера USB эмулирует его подключение к LPT-порту в режиме SPP или двунаправленном (IEEE 1284). Классовое определение USB принтера не затрагивает данные, передаваемые принтеру: это может быть любой язык описания страниц (PDL — Page Descriptor Language). Принтеры могут работать только на скоростях FS или HS (на низкой скорости в USB нет передач массивов).

Принтер имеет все стандартные дескрипторы устройства USB, специфических классовых дескрипторов нет. В дескрипторе устройства принтер сообщает нулевые коды класса, подкласса и протокола. Принтер имеет по крайней мере одну конфигурацию; в конфигурации имеется один интерфейс. На уровне интерфейса для принтеров определен класс 07 подкласс 01. Код протокола определяется выбранной альтернатиной установки интерфейса:

  • однонаправленный (Unidirectional) интерфейс: данные на принтер передаются через конечную точку типа Bulk-OUT; состояние от принтера в формате, принятом для параллельного порта (3 значимых бита регистра состояния LPT-порта) передается по классово-специфическому запросу Get_Port_Status через EP0. Этому варианту интерфейса соответствует код протокола 01;
  • двунаправленный (Bi-Directional) интерфейс: данные на принтер передаются через конечную точку типа Bulk-OUT; состояние от принтера передается через конечную точку типа Bulk-IN. Здесь также доступно получение состояния (3 бита) по запросу Get_Port_Status через EP0. Этому варианту интерфейса соответствует код протокола 02;
  • двунаправленный интерфейс с доставкой данных по логическим каналам в соответствии с IEEE 1284.4 (IEEE 1284.4 compatible Bi-directional Interface), введенный в версии 1.1. Модель обмена та же, что и у предыдущего. Этому варианту интерфейса соответствует код протокола 03.

В принтере используется (кроме нулевой) только одна конечная точка для вывода данных (Bulk-OUT), для двунаправленного интерфейса — еще и Bulk-IN для получения данных обратного канала (состояния).

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

По запросу Get_Device_Id принтер возвращает строку данных (Capabilities String), описывающих его в формате и синтаксисе, определенном в IEEE-1284. В запросе в поле wValue указывается номер интересующей конфигурации, старший байт wIndex задает номер интерфейса (0), младший — номер альтернативной установки. Возвращаемая строка начинается с 2-байтного поля длины всей строки (старший байт — первый), за которой идет собственно идентификатор.

Таблица. Классовые запросы к принтерам

Запрос bmRequestType bRequest
Get_Device_Id 10100001b 0
Get_Port_Status 10100001b 1
Soft_Reset 00100011b 2

По запросу Get_Port_Status принтер возвращает байт состояния, аналогичный байту состояния LPT-порта. Здесь значимы только 3 бита (остальные — нули):

  • бит 3 (Not Error), признак ошибки: 1 — нет ошибки, 0 — есть;
  • бит 4 (Select), признак выбранности принтера: 1 — выбран (доступен), 0 — нет;
  • бит 5 (Paper Empty), признак конца бумаги: 1 — нет бумаги, 0 — есть.

По запросу Soft_Reset принтер очищает свой буфер данных, переходит в исходное состояние, переводит в исходное состояние и разблокирует (если они были остановлены) конечные точки. На его состояние в плане интерфейса USB (адресован, сконфигурирован) этот сброс не влияет.

Для работы с USB-принтером следует считать дескриптор устройства и дескрипторы всех возможных конфигураций, выбрать конфигурацию и требуемую альтернативную установку интерфейса. При работе с двунаправленным интерфейсом некоторое неудобство вызывает тип конечной точки обратного канала (Bulk): запрос данных о состоянии принтера, который делает драйвер, будет «висеть» до срабатывания тайм-аута драйвера, если принтеру «нечего сказать». Формальное определение результатов запроса Get_Port_Status (по крайней мере, согласно спецификации версии 1.1) не позволяет судить о наличии данных в обратном канале. Однако, вспоминая работу LPT-порта, которую эмулирует подключение по USB, можно предположить, что признаком наличия данных обратного канала будет бит 3 (Not Error). В LPT-порту этот бит представляет текущее состояние сигнала Error#, который во всех режимах IEEE 1284 (исключая режим совместимости с SPP) используется для сигнализации наличия данных обратного канала.



Устройства хранения данных

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

Таблица. Классовые запросы к устройствам хранения

Запрос bmRequestType bRequest Применимость для протоколов
Get_Max_Lun 10100001b FEh 50h
Bulk-Only_Mass_Storage_Reset 00100001b FFh 50h
ADSC 00100001b 00 00, 01

Протокол Bulk-Only-транспорт (код 50h) применяется в устройствах хранения со скоростями FS и HS, он рекомендован для всех новых разработок. Этот протокол обеспечивает взаимную синхронизацию устройства и хоста, используя никак не синхронизируемые (системой USB) потоки независимых каналов Bulk-IN и Bulk-OUT через пару соответствующих точек. Кроме того, используются два классовых запроса для определения числа доступных логических устройств и сброса интерфейса.

По запросу Get_Max_LUN устройство возвращает байт с максимальным возможным номером логического устройства (LUN, нумерация с нуля). В запросе в поле wIndex указывается номер интерфейса, wLength = 1.

По запросу Bulk-Only_Mass_Storage_Reset выполняется сброс интерфейса, указанного в поле wIndex: точки Bulk-IN и Bulk-OUT разблокируются, переключатель (Toggle Bit) устанавливается в положение DATA0, интерфейс переводится в состояние ожидания команды, все предыдущие запросы сбрасываются.

Блоки команд и состояний распознаются в последовательности пакетов по фиксированной длине пакета (они всегда ложатся точно в один пакет), сигнатурам и соответствию содержимого полей соглашениям (проверяются и нули в резервных полях). Командный блок длиной до 16 байтов позволяет транспортировать любые наборы команд, используемые в устройствах хранения с традиционными интерфейсами (ATA/ATAPI, SCSI и другие). Протокол передачи команд и данных работает следующим образом:

  • хост посылает командный блок CBW (Command Block Wrapper) «в обертке» — пакет фиксированной длины (31 байт), включающий:
  1. 4-байтную сигнатуру (dCBWSignature = 43425355h);
  2. 4-байтный тег (dCBWTag), который служит для пометки и идентификации ответного блока состояния;
  3. 4-байтное поле длины передаваемых данных (dCBWDataTransferLength);
  4. байт флагов (bmCBWFlags), в котором используется лишь бит 7, указывающий направление передачи данных остальные биты — нули;
  5. байт с 4-битным номером логического устройства, к которому обращается данный командный блок (bCBWLUN в битах [3:0], остальные биты — нули);
  6. байт длины командного блока (bCBWCBLength в битах [4:0], допустимо 1–16,
  7. собственно командный блок (CBWCB) длиной от 1 до 16 байт и заполнитель, доводящий длину этого поля до 16 байт;
  • устройство подтверждает успех приема ACK’ом, анализирует пакет и, если «обертка» корректна и командный блок действителен, выполняет прием или передачу заказанного блока данных. Обмен данными инициирует хост в соответствии с посланной командой (данные могут и не предполагаться, тогда указывается их нулевая длина);
  • на каждый командный блок (после успешного исполнения или отвергая его) устройство отвечает блоком состояния CSW в аналогичной «обертке» — 13-байтным пакетом, содержащим:
  1. 4-байтную сигнатуру (dCSWSignature = 53425355h);
  2. 4-байтный тег (dCSWTag), привязывающий этот ответ к конкретному командному блоку;
  3. 4-байтное поле (dCSWDataResidue), в котором указывается разность между заказанным (и переданным) количеством данных и количеством, реально отработанным устройством;
  4. байт состояния (bCSWStatus) выполнения команды: 00 — успешно, 01 — отказ (failed), 02 — фазовая ошибка (нарушение последовательности команд и данных).

Если устройство получает недопустимый командный пакет, оно его отвергает соответствующим CSW (с байтом состояния 01). На каждый выпущенный командный пакет хост должен получить ответ — состояние с тем же тегом (теги назначает хост, устройство ими только метит ответ). Фазовая ошибка (нарушение этой последовательности) отрабатывается с помощью классового запроса «сброс интерфейса», передаваемого через EP0, — интерфейс переходит в исходное состояние (готов принять командный блок). Этим же сбросом устраняется возможная блокировка конечных точек.

Протокол Control-Bulk-Interrupt (CBI, коды 00 и 01) предназначен только для FSустройств, для новых разработок он не рекомендуется, на HS его применение не допускается. Для доставки команд служит классовый запрос ADSC (Access_Device_Specific_Command), передаваемый через точку EP0 (Основной канал сообщений). Для доставки данных используются точки Bulk-IN и Bulk-OUT. Через эти же точки (включая и EP0) передается и информация о состоянии завершения команды; в протоколе с кодом 00 для передачи состояний выделяется дополнительная точка Interrupt-IN с длиной пакета 2 байта.

Командный блок передается в фазе данных транзакции управления, реализующей запрос ADSC. В запросе в поле wIndex указывается номер интерфейса, wLength — длина командного блока. Положительное подтверждение (ACK) на стадии состояния означает, что команда успешно принята (этот ответ может быть задержан на неопределенное время посылкой NACK’ов).

Состояние выполнения команды может передаваться несколькими способами:

  • по прерыванию: когда у устройства есть что сообщит о состоянии выполнения команды, оно в транзакции с точкой Interrupt-IN возвращает два байта, трактовка которых зависит от подкласса устройства;
  • по основному каналу сообщений — устройство в фазе завершения может ответить пакетом STALL, что будет означать отвергнутую команду. Уточнить состояние можно, послав соответствующую команду, предполагающую получение состояния в фазе данных через точку Bulk-IN;
  • по каналу передачи данных: обнаружив ошибку в процессе выполнения команды, устройство на очередную транзакцию Bulk-IN/OUT ответит пакетом STALL. Уточнить состояние можно будет, послав следующий командный блок (предварительно разблокировав точки запросом Clear_EP_Halt).

Данные передаются пакетами через точки Bulk-IN и Bulk-OUT, укороченный пакет служит признаком конца блока данных. Хост и устройство отслеживают соответствие объема передаваемых данных запрошенному в команде. В случае обнаружения несоответствия устройство может сигнализировать об этом передачей состояния через точку Interrupt-IN или через ответ STALL в транзакциях передачи данных.

Сброс устройства можно выполнить, послав в запросе ADSC специальный командный блок с содержимым 1D, 04, FF, FF, FF... По этой команде устройство предпримет попытку безопасного прекращения текущей операции, очистит все буферы и очереди. После этого хост должен выполнить запросы Clear_EP_Halt, чтобы разблокировать точки и привести в исходное состояние переключатели Toggle Bit. Сброс через порт USB (по запросу к хабу) во время исполнения команды чреват потерей данных.

Прерывания (точка Interrupt-IN) используются только для протокола 00. На каждый посланный ADSC хост ждет прерывание; если устройство ответит на ADSC условием STALL, то для этой команды прерывание уже не ожидается. Если у устройства есть непереданный запрос прерывания, а хост посылает уже следующий ADSC, то прежний запрос прерывания устройство аннулирует.



Устройства человеко-машинного интерфейса (HID-устройства)

К классу HID (Human Interface Device) относятся устройства, обеспечивающие интерфейс между человеком и компьютером:

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

Для этих устройств характерен небольшой объем передаваемых данных, возникающих для компьютера спонтанно (асинхронно), и умеренные требования к задержке обслуживания. К данному классу относятся и иные устройства с похожим характером данных (считыватели штрихкода, термометры, вольтметры и т. п.). Подробно данный класс описан в документе Device Class Definition for Human Interface Devices (HID), в 2001 году вышла его версия 1.11. Класс HID допускает работу устройств на любой скорости шины USB.

Деление на подклассы учитывает только необходимость поддержки данного устройства на этапе загрузки. Специальный код протокола выделяет только клавиатуру и мышь — стандартные устройства ввода.

С HID-устройствами хост обменивается сообщениями-рапортами (report), которые могут быть трех типов (Report Type):

  • тип 1 — ввод (Input) от устройства;
  • тип 2 — вывод (Output) в устройство;
  • тип 3 — управление свойствами (Feature).

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

Интерфейс HID-устройства обеспечивает двунаправленный обмен рапортами между устройством и драйвером. В нем имеется:

  • обязательный двунаправленный канал (через EP0) для вывода рапортов и ввода по опросу (полинг);
  • обязательный однонаправленный канал асинхронного ввода рапортов по прерываниям (от устройства к его драйверу через точку Interrupt-IN);
  • необязательный канал вывода по прерываниям; если у устройства имеется точка Interrupt-OUT, то выводные рапорты передаются по ней.

HID-устройства имеют специальный классовый HID-дескриптор, ссылающийся на дескриптор рапортов и набор физических дескрипторов (указываются тип и длина этих дескрипторов, что позволяет получить их по запросу Get_Descriptor).

Дескриптор рапорта представляет собой сложную структуру, описывающую передаваемые данные: назначение (ввод, вывод или управление свойствами), использование, диапазон допустимых значений, размер… Эта информация нужна драйверу HID-устройств, разбирающему (и собирающему) рапорты. Драйвер содержит модуль Item Parser, разбирающий, какому приложению следует передать тот или иной рапорт. Без должного дескриптора рапорта приложение рапорт ни принять, ни послать не сможет.

Набор физических дескрипторов описывает, какой частью тела человек воздействует на тот или иной орган управления. Эти дескрипторы необязательны и сообщаются не многими устройствами; они вносят дополнительные сложности в описание, хотя позволяют приложениям точнее использовать те или иные органы.

HID-устройства поддерживают все стандартные запросы к устройствам и специфические запросы, приведенные в таблице.

Таблица. Классовые запросы к HID-устройствам

Запрос bmRequestType bRequest
Get_Report 10100001 01
Get_Idle 10100001 02
Get_Protocol 10100001 03
Set_Report 00100001 09
Set_Idle 00100001 0A
Set_Protocol 00100001 0B

Запросы Get_Report и Set_Report служат для приема и передачи рапортов через EP0. Здесь в поле wValue старший байт задает тип рапорта, младший — его идентификатор. В поле wIndex задается номер интерфейса, поле wLength задает длину рапорта, который передается в фазе данных.

Запрос Set_Idle позволяет управлять подачей рапортов по каналу прерываний в случае отсутствия изменений состояния рапортуемых величин. Здесь в поле wValue старший байт задает длительность молчания в покое (idle duration), младший — идентификатор рапорта. В поле wIndex задается номер интерфейса, поле wLength = 0 (фаза данных отсутствует). Если задана нулевая длительность, то устройство будет передавать рапорты только в случае изменений состояния (что требуется, например, для клавиатуры). Ненулевое значение трактуется как длительность интервала (в 4-миллисекундных единицах), в течение которого точка Interrupt-IN отвечает на опросы NAK’ами, если нет изменений состояния. Так, например, можно уменьшить поток «пустых» данных опроса устройств-указателей (мыши или джойстика), не теряя быстроты реакции на события (задаваемая длительность и bInterval, задающий частоту опроса точки Interrupt-IN, независимы).

Запрос Get_Idle позволяет считать текущее значение длительности для рапорта, идентификатор которого задан в младшем байте поля wValue. В поле wIndex задается номер интерфейса, поле wLength = 1 (принимается один байт данных).

Запрос Set_Protocol (только для устройств, участвующих в начальной загрузке) позволяет переключать протокол работы устройства. Тип протокола задается в поле wValue: 0 — протокол (упрощенный), используемый при загрузке (Boot Protocol); 1 — нормальный протокол рапортов (Report Protocol). В поле wIndex задается номер интерфейса, поле wLength = 0.

Запрос Get_Protocol позволяет определить текущий протокол. В поле wIndex задается номер интерфейса, поле wLength=1 (принимается один байт данных).



Аудиоустройства

Аудиоустройства с точки зрения USB представляют собой, как правило, композитные устройства, содержащие набор независимых интерфейсов. Путь любого аудиосигнала в аудиоустройстве начинается с входного терминала (Input Terminal) и заканчивается на выходном терминале (Output Terminal). Между терминалами могут находиться различные модули (Unit), осуществляющие какие-то преобразования и соединения.

Терминалы могут быть различных типов:

  • USB-терминал — подключение к шине USB, с помощью которого через конечные точки (как правило, изохронные) осуществляется доставка потоков аудиоданных от хоста к устройству (входной терминал) или от устройства к хосту (выходной терминал). Для интерфейсов USB-терминалов определен подкласс 02 — AUDIOSTREAMING со своими специфическими дескрипторами, описывающими способ доставки (и синхронизации) и формат потока;
  • входные (оконечные) терминалы: устройства для записи звуков — встроенные в устройства или внешне подключаемые микрофоны различных типов, наборы микрофонов для пространственной записи (каждой разновидности назначен свой код типа)
  • выходные (оконечные) терминалы: устройства для воспроизведения звуков — колонки разных типов, наушники;
  • двунаправленные (оконечные) терминалы: телефонные трубки и головные телефонные гарнитуры, без эхоподавления и с ним;
  • телефонные терминалы: устройства подключения к телефонной сети и миниАТС;
  • внешние терминалы: аналоговые и цифровые входы и выходы различных стандартов и форматов, включая интерфейсы S/PDIF и потоки аудиоданных, передаваемые по шине IEEE 1394;
  • встроенные терминалы: проигрыватели грампластинок, CD, DVD, звуковое сопровождение TV и видеомагнитофонов, приемники (радио, телевизионные, спутниковые), устройства аналоговой и цифровой звукозаписи, радиопередатчики, синтезаторы, измерительные генераторы сигналов.

Всеми этими терминалами требуется управлять по шине USB; для них имеются дескрипторы, описывающие их управляемые свойства.

Модули (units), которые располагаются пути аудиосигнала, могут выполнять самые разнообразные функции: коммутация, регулировка уровня, микширование, панорамирование, фильтрация, реверберация и все возможные эффекты, которые стали легко реализуемыми с применением цифровой формы обработки сигналов. Для этих модулей введен подкласс 01 — AUDIOCONTROL, тоже со своими специфическими дескрипторами и запросами.

С аудиоустройствами тесно связаны и MIDI-устройства, являющиеся приемниками или источниками потоков MIDIсообщений. Для них введен подкласс 03 — MIDISTREAMING со своими специфическими дескрипторами и запросами. MIDIустройство USB может выступать как в роли простого конвертора интерфейсов (выполнять доставку сообщений между хостом и MIDI-разъемами на устройстве), так и MIDI-синтезатора, преобразующего MIDI-сообщения в аудиопотоки. При этом обрабатываться могут сообщения как с внешних разъемов, так и с шины USB. Синтезатор MIDI с точки зрения аудиоустройства является встроенным входным терминалом. Он поставляет аудиопоток, дальнейший путь которого определяется аудиоустройством (через интерфейсы подклассов 01 и 02).