Де я шукаю значення для створення дескриптора HID USB?


10

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

Я завантажив документ із таблиць користування 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 складається з пар ключів / значень, якщо я можу це так назвати. Наприклад, другий рядок: 0x05,0x01 вказує ключ 0x05, який є сторінкою використання , а 0x01 - значення, що вказує на загальний робочий стіл

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

USAGE_PAGE == 0x05

і, наприклад

COLLECTION == 0xA1

Я спробував пошукати PDF в 0xA1, результатів немає. Єдиний спосіб, коли я можу з’ясувати, що таке значення, - це або переглянувши коментарі прикладу, або використовуючи інструмент USB Descriptor за посиланням вище.

Мені просто цікаво, чи я цілком готовий пропустити цю довідкову документацію про ключ / значення?

В Інтернеті є безліч прикладів, як-от, наприклад, наступне посилання: 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 MINIMUMє0b0010_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.