Я пытаюсь немного научиться создавать дескриптор 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 довольно ужасная. Он страдает от чрезмерного обобщения, когда они пытаются сделать все настолько общим и общим, что трудно перейти из документации в какое-либо конкретное приложение.
Формат дескриптора находится в документе « Определение класса устройства для 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 MINIMUM
IS0b0010_01nn
Структура
USAGE PAGE
дескриптора такая же. Команда для выбора страницы использования является0000_01nn
, иnnnn_nn01
указывает , что 1 байт длиной. Я предполагаю, что, поскольку в документации указано, что страницы использования являются 32-битными, предполагается, что верхние биты равны нулю или выводятся из другой части документации. Я на самом деле не знаю, как они указаны.Существует хорошая страница различных констант HID здесь .
И более свежая версия из источников BSD здесь (Спасибо, @crazysim!) (Последняя HEAD , может не длиться).
источник