#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 битам, иначе последний байт, который является «неполным», не вызывает ожидаемого действия. Решение заключается в добавлении битов выравнивания байтов в отчет.