Где искать значения для создания дескриптора USB HID?


10

Я пытаюсь немного научиться создавать дескриптор USB HID в C для проекта USB PIC32, который я хочу попробовать.

Я скачал документ Таблицы использования HID с http://www.usb.org/developers/hidpage/ и пытаюсь выяснить, где указаны фактические значения для различных элементов в дескрипторе HID.

Позвольте мне объяснить с выдержкой из образца, на который я смотрю:

ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={{
  0x05,0x01,        // USAGE_PAGE (Generic Desktop)
  0x09,0x05,        // USAGE (Game Pad)
  0xA1,0x01,        // COLLECTION (Application)
  0x15,0x00,        //   LOGICAL_MINIMUM(0)
  0x25,0x01,        //   LOGICAL_MAXIMUM(1)
  0x35,0x00,        //   PHYSICAL_MINIMUM(0)
  0x45,0x01,        //   PHYSICAL_MAXIMUM(1)
  // ...

Из приведенного выше примера ясно, что массив BYTE состоит из пар ключ / значение, если можно так назвать. Например, 2-я строка: 0x05,0x01 обозначает ключ 0x05, который является страницей использования , а 0x01 - это значение, обозначающее Generic Desktop.

Я пытаюсь выяснить, где эти значения указаны в PDF-документе таблицы использования HID. Например, я не могу найти ссылку, что

USAGE_PAGE == 0x05

и например

COLLECTION == 0xA1

Я пытался найти PDF для 0xA1, безрезультатно. Единственный способ узнать, что это за значения, - это посмотреть комментарии к примеру или воспользоваться инструментом дескриптора USB по ссылке выше.

Мне просто интересно, неужели я совершенно безумен за то, что пропустил эту справочную документацию ключ / значение?

В сети есть множество примеров, например, следующая ссылка: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Но даже это ссылается на множество строковых значений, таких как END_COLLECTION == 0xc0

Где я могу найти ссылку на эти значения? Что мне не хватает?


Похоже, мне придется использовать инструмент USB Descriptor для создания дескриптора HID. :)
josef.van.niekerk

Ответы:


20

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

Формат дескриптора находится в документе « Определение класса устройства для HID » по предоставленной вами ссылке на usb.org.

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

Например, в отношении 0xA1: введите описание изображения здесь

Вы можете видеть, что двоичный префикс 1010_00nnуказывает, что это коллекция, а постфикс nnnn_nn01указывает, что он имеет длину 1 байт. Затем последующий байт интерпретируется как тип коллекции, в данном случае типа Application. Затем он устанавливает контекст, в котором интерпретируются дополнительные байты, пока синтаксический анализатор дескриптора HID не увидит другой тег коллекции или маркер конца коллекции.

Вы можете видеть, что END COLLECTIONуказано как 0b1100_00nn, с nnигнорированием. Это откуда 0xC0исходит.

Вы также можете начать видеть, как строятся другие аргументы. Например, LOGICAL MINIMUMэто0x25 или 0b0010_0101. Из этого мы можем видеть , что у нас есть данные-длину 0bnnnn_nn01, или один байт, а спецификатор для LOGICAL MINIMUMIS0b0010_01nn

введите описание изображения здесь

Структура USAGE PAGEдескриптора такая же. Команда для выбора страницы использования является 0000_01nn, и nnnn_nn01указывает , что 1 байт длиной. Я предполагаю, что, поскольку в документации указано, что страницы использования являются 32-битными, предполагается, что верхние биты равны нулю или выводятся из другой части документации. Я на самом деле не знаю, как они указаны.

Существует хорошая страница различных констант HID здесь .

И более свежая версия из источников BSD здесь (Спасибо, @crazysim!) (Последняя HEAD , может не длиться).


Как раз то, что мне было нужно. Большое спасибо за глубокий ответ. Это действительно очень помогает! ;)
josef.van.niekerk

1
@ josef.van.niekerk - Нет проблем. Прошло некоторое время, прежде чем я копался в стандартах USB, и они настолько непрозрачны, насколько я помню.
Коннор Вольф

Я прошу прощения за могилу, но ссылка на USB.org больше не работает.
Роб ван дер Веер

1
@RobvanderVeer должен быть исправлен сейчас.
hoosierEE

1
Следует ли заменить эту «хорошую страницу с различными константами HID» на более позднюю версию этого файла из источников FreeBSD? ?
Crazysim
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.