Как запросить дескриптор отчета USB HID с устройств HID с помощью UsbDeviceConnection на Android - PullRequest
0 голосов
/ 31 августа 2018

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

Мне удалось получить фактические входные данные от устройств HID с помощью bulkTransfer.

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

Какие значения я должен передать в controlTransfer, чтобы получить дескриптор отчета USB HID, чтобы я мог начать анализировать, какие кнопки имеют устройства и какие байты им назначены? Или вы не должны использовать controlTransfer для получения дескриптора отчета HID? Я новичок в работе с USB.

1 Ответ

0 голосов
/ 23 октября 2018

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

UsbDeviceConnection.controlTransfer требуется 7 переменных:

  • Тип запроса
  • Запрос
  • Значение запроса
  • Индекс запроса
  • Выходной буфер
  • Размер буфера
  • Время ожидания

Тип запроса описывает направление, тип и получателя перевода. В этом случае мы хотим прочитать (1), используя стандартную (00) передачу, и мы хотим запросить интерфейс (00001). Мы хотим запросить интерфейс, потому что HID - это интерфейс устройства. Итак, 0b10000001 или 0x81.

Запрос описывает наш конкретный запрос. Мы ищем HID отчет Дескриптор и GET_DESCRIPTOR определяется как 0x06 спецификацией.

Значение запроса состоит из типа дескриптора в качестве старшего байта и индекса интерфейса в качестве младшего байта. Тип дескриптора в нашем случае - HID Report или 0x22 (это из спецификации HID, а именно дескрипторов классов). Индекс интерфейса такой же, как индекс запроса ниже. В моем случае это было 0x00, но ваш может быть другим. Комбинируя старший и младший бит, мы получаем 0x2200 для нашего значения запроса.

Индекс запроса указывает, какой интерфейс вы запрашиваете. Если HID является единственным интерфейсом устройства, то это будет 0x00. В противном случае вам придется проверить дескриптор конфигурации на предмет доступных типов интерфейсов и их индексов.

Выходной буфер - это пространство, выделенное для возврата транзакции, и его размер должен быть определен размером буфера, как описано ниже.

Размер буфера описывает количество байтов в дескрипторе отчета. Это значение указывается в дескрипторе конфигурации в дескрипторе класса HID (bDescriptorType = 0x21) и является значением 8-го байта (wDescriptorLength) из общего количества 9. В моем случае это значение было 104.

Тайм-аут - это количество миллисекунд, после которого нужно сдаться. Я использовал 2000.

Соединяя это, UsbDeviceConnection.controlTranfer(0x81, 0x06, 0x2200, 0x00, byte[] buffer, 104, 2000).

https://www.beyondlogic.org/usbnutshell/usb6.shtml дает превосходный обзор битовых полей, используемых в controlTransfer, проверьте его, если хотите больше контекста.

https://eleccelerator.com/usbdescreqparser/ - чрезвычайно полезный инструмент для понимания дескрипторов USB и HID, и он может быть более проницательным, чем чтение спецификаций и только API.

...