USB

Устройства человеко-машинного интерфейса (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 (принимается один байт данных).



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