HID-дескриптор
HID-дескриптор — это структура данных, используемая в протоколе HID (Human Interface Device — устройство взаимодействия с человеком), которая описывает возможности и формат обмена информацией между HID-устройством (например, клавиатурой, мышью, джойстиком) и хост-контроллером (компьютером, игровой приставкой). HID-дескриптор представляет собой набор байтов, который определяет, какие типы данных передаёт устройство (например, нажатия клавиш, перемещения курсора, показания датчиков), в каком порядке и с какой точностью. Он является обязательным элементом любого HID-устройства и загружается хостом в процессе перечисления (enumeration) при подключении.
История и стандартизация
Протокол HID был разработан в конце 1990-х годов как часть спецификации USB (Universal Serial Bus). Первая версия спецификации HID вышла в 1996 году, а затем была включена в стандарт USB-IF (USB Implementers Forum). HID-дескриптор стал ключевым нововведением, позволившим унифицировать взаимодействие с разнообразными устройствами ввода без необходимости установки драйверов для каждого типа. Впоследствии протокол HID был адаптирован для других интерфейсов, таких как Bluetooth (через профиль HID Over GATT) и I²C.
Стандарт HID определяет не только формат дескриптора, но и набор предопределённых типов данных (usage), которые могут быть описаны в нём. Эти типы регламентируются в документе «HID Usage Tables», публикуемом USB-IF. Дескриптор позволяет хосту динамически узнавать возможности устройства, что обеспечивает plug-and-play совместимость.
Структура HID-дескриптора
HID-дескриптор состоит из последовательности элементов (items), каждый из которых имеет определённый тип и длину. Элементы могут быть короткими (1 байт заголовка + до 2 байт данных) или длинными (1 байт заголовка + до 65535 байт данных). Основные типы элементов:
- Main items — определяют структуру отчёта (report): Input, Output, Feature, Collection, End Collection.
- Global items — задают глобальные параметры, такие как размер поля (Report Size), количество полей (Report Count), минимальное и максимальное значения (Logical Minimum, Logical Maximum), физические единицы (Physical Minimum, Physical Maximum), идентификатор отчёта (Report ID).
- Local items — задают локальные свойства, такие как тип использования (Usage), страницу использования (Usage Page), строку описания (String Index).
Каждый отчёт (report) — это блок данных, который устройство отправляет хосту (Input report) или получает от хоста (Output report). Дескриптор описывает, как биты в отчёте интерпретируются: какие поля соответствуют кнопкам, осям, датчикам, и какова их разрядность.
Пример упрощённого дескриптора для мыши
`` Usage Page (Generic Desktop) Usage (Mouse) Collection (Application) Usage (Pointer) Collection (Physical) Usage Page (Buttons) Usage Minimum (Button 1) Usage Maximum (Button 3) Logical Minimum (0) Logical Maximum (1) Report Count (3) Report Size (1) Input (Data,Var,Abs) Report Count (1) Report Size (5) Input (Const) Usage Page (Generic Desktop) Usage (X) Usage (Y) Logical Minimum (-127) Logical Maximum (127) Report Size (8) Report Count (2) Input (Data,Var,Rel) End Collection End Collection ``
В этом примере дескриптор описывает: 3 кнопки (битовые поля), 5 бит константы (заполнитель), и два 8-битных поля для относительных перемещений по осям X и Y.
Типы HID-дескрипторов
В рамках спецификации HID существует несколько типов дескрипторов, которые могут быть запрошены хостом:
- HID Descriptor — основной дескриптор, содержащий информацию о версии HID, стране (country code) и количестве дополнительных дескрипторов.
- Report Descriptor — собственно описание отчётов, как описано выше.
- Physical Descriptor — описывает физические характеристики устройства (например, силу сопротивления для джойстика с обратной связью). Используется редко.
- String Descriptor — необязательный дескриптор, содержащий текстовые строки (например, название производителя).
Применение
HID-дескрипторы используются в широком спектре устройств:
- Клавиатуры и мыши — наиболее распространённые HID-устройства. Дескриптор для клавиатуры обычно описывает массив из 6 или 8 байт для кодов клавиш, а также модификаторы (Ctrl, Shift и т.д.).
- Джойстики и геймпады — дескриптор может описывать множество осей (X, Y, Z, поворот) и десятки кнопок.
- Сенсорные панели и дигитайзеры — описывают абсолютные координаты, давление, наклон пера.
- Медиа-пульты и пульты ДУ — используют HID для передачи команд управления мультимедиа.
- Сканеры штрих-кодов — часто эмулируют клавиатуру, используя стандартный HID-дескриптор клавиатуры.
- Медицинские устройства — некоторые мониторы пациентов и пульты управления используют HID для передачи данных.
Преимущества и недостатки
Преимущества
- Универсальность — один протокол поддерживает тысячи типов устройств без драйверов.
- Гибкость — дескриптор может описывать произвольные комбинации кнопок, осей и датчиков.
- Простота реализации — для хоста достаточно обработать дескриптор и интерпретировать отчёты.
Недостатки
- Ограниченная пропускная способность — HID не предназначен для передачи больших объёмов данных (например, аудио или видео).
- Сложность отладки — некорректно составленный дескриптор может привести к неправильной интерпретации данных хостом.
- Отсутствие стандартизации для сложных устройств — например, для игровых рулей с обратной связью производители часто используют проприетарные расширения.
Критика и ограничения
Основная критика HID-дескрипторов связана с тем, что они не поддерживают динамическое изменение структуры отчёта после перечисления. Если устройство может отправлять разные типы данных в зависимости от режима, это требует использования нескольких Report ID, что усложняет дескриптор. Кроме того, для устройств с высокой частотой опроса (например, игровых мышей с частотой 1000 Гц) накладные расходы на обработку дескриптора могут быть значительными.
В некоторых случаях производители устройств, особенно в Китае, используют нестандартные или неполные HID-дескрипторы, что приводит к несовместимости с некоторыми операционными системами. Для решения этой проблемы Microsoft и другие компании разработали рекомендации по валидации дескрипторов.
Интересные факты
- HID-дескриптор может быть длиной от нескольких десятков байт (для простой мыши) до нескольких килобайт (для сложных джойстиков с обратной связью).
- Спецификация HID допускает использование вложенных коллекций (Collection), что позволяет описывать сложные иерархии, например, несколько сенсорных точек на тачпаде.
- В операционной системе Windows существует встроенный инструмент «HID Descriptor Viewer» (часть Windows Driver Kit), который позволяет анализировать дескрипторы подключенных устройств.
- HID-дескрипторы используются не только для устройств ввода, но и для некоторых устройств вывода, например, светодиодных индикаторов на клавиатурах (через Output report).
Источники
- Universal Serial Bus (USB) HID Specification, Version 1.11, USB Implementers Forum, 2001.
- HID Usage Tables, Version 1.5, USB Implementers Forum, 2021.
- Microsoft Corporation. «HID Descriptor Overview», Windows Driver Kit Documentation.
- Axelson, J. «USB Complete: The Developer’s Guide», 5th Edition, Lakeview Research, 2015.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →