Дескриптор отчета USB HID, несколько отчетов

#usb #hid #descriptor

#usb #hid #дескриптор

Вопрос:

Я пытаюсь эмулировать мультимедийную клавиатуру USB, но застрял в дескрипторе отчета HID. Мне удается определить дескриптор «единого отчета», но затем он застрял, когда я пытаюсь добавить дополнительный идентификатор отчета. Приведенный ниже пример был сведен к минимуму, в конечном приложении я пытаюсь поместить больше данных в один отчет, также выбрана функция отключения звука, чтобы упростить тестирование.

 0x09, 0x01,        // Usage (Consumer Control)
0xA1, 0x01,        // Collection (Application)

0x85, 0x01,        //   Report ID (1)
0x05, 0x0C,        //   Usage Page (Consumer)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1)
0x95, 0x01,        //   Report Count (1)
0x09, 0xE2,        //   Usage (Mute)
0x81, 0x62,        //   Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,Null State)

0x85, 0x02,        //   Report ID (2)
0x05, 0x0C,        //   Usage Page (Consumer)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1)
0x95, 0x01,        //   Report Count (1)
0x09, 0xE2,        //   Usage (Mute)
0x81, 0x62,        //   Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,Null State)
0xC0,              // End Collection
 

В результате, когда я отправил 0x01 0x01 (запрос 1, бит 1), компьютер (Windows) отключил звук, но когда USB-устройство отправило 0x02 0x01 (запрос 2, бит 2) через ту же конечную точку, компьютер проигнорировал его. Я попытался сгруппировать отчеты в логическую коллекцию, но это ничего не меняет.

Как должен выглядеть этот дескриптор?

PS в первом сообщении была очевидная ошибка в дескрипторе (отсутствует объект ввода для отчета № 2), но это было сделано, когда я упростил дескриптор для целей этого вопроса.

Комментарии:

1. Для меня дескриптор выглядит нормально (хотя нет необходимости определять глобальные элементы, такие как логический минимум / макс и размер / количество отчета, если они не изменились). Может быть полезно обновить ваш вопрос с помощью полного дескриптора отчета, других дескрипторов и кода, используемого для отправки отчетов. Кто-то может заметить проблему. Иногда люди забывают обновить длину дескриптора, например, после изменения дескриптора.

Ответ №1:

Случайно я решил проблему. Более того, минимальный пример, показанный выше, не работает, но проблема была такой же, как и в моей полной реализации.

По какой-то причине для Windows каждый отчет должен быть выровнен по 8 битам, иначе последний байт, который является «неполным», не вызывает ожидаемого действия. Решение заключается в добавлении битов выравнивания байтов в отчет.