Определение пути HID для USB-устройства HID с помощью libhid в Linux
Вопрос
Я заинтересован в использовании libhid для доступа к специальному HID-устройству, которое мы разрабатываем на микроконтроллере PIC.Мне удалось успешно запустить код test_libhid.Инструкции по чтению и записи на устройства, использующие эту библиотеку, представлены в виде комментариев в коде test_libhid.
Я пытался следовать документированным методам чтения и записи, но до сих пор мне не удалось успешно прочитать или записать на устройство.Я подозреваю, что причина может заключаться в том, что дескриптор отчета для устройства определяет массив размером 64 байта как для отчетов о входных, так и о выходных данных.
Я прочитал подробности, содержащиеся в разделе «Определение класса устройства для HID» на сайте usb.org, и думаю, что понимаю, как в целом работают дескрипторы и как они преобразуются в пути HID, но мои попытки читать и записывать данные на устройство не имели успеха. неуспешный.
Я убедился, что устройство работает в Windows, поэтому моя проблема, похоже, связана со стороной Linux.Не думаю, что это имеет значение, но должен отметить, что сейчас я работаю на виртуальной машине VMWare, загруженной сервером Ubuntu 8.04.
Может ли кто-нибудь дать рекомендации о том, как указать путь HID для следующего дескриптора отчета (сгенерированного из lsusb –vvv):
Report Descriptor: (length is 29)
Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
(null)
Item(Local ): Usage, data= [ 0x01 ] 1
(null)
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Local ): Usage Minimum, data= [ 0x01 ] 1
(null)
Item(Local ): Usage Maximum, data= [ 0x40 ] 64
(null)
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x40 ] 64
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Local ): Usage Minimum, data= [ 0x01 ] 1
(null)
Item(Local ): Usage Maximum, data= [ 0x40 ] 64
(null)
Item(Main ): Output, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
Item(Main ): End Collection, data=none
Кроме того, когда я запускаю программу test_libhid, она выгружает дерево разбора в виде 64 одинаковых записей, которые выглядят следующим образом:
path: 0xff000001.0x00000000; type: 0x80
Вероятно, это входные данные.За этим списком следуют еще 64 записи, которые выглядят следующим образом:
path: 0xff000001.0x00000000; type: 0x90
Я отправил сообщение в список рассылки libhid, но в последнее время там не было особой активности, поэтому я решил задать свой вопрос здесь.Если кто-нибудь может дать рекомендации о том, как указать путь HID для этого входного и выходного отчета, это будет огромной помощью.
Спасибо.
Решение
После долгих проб и ошибок мне так и не удалось заставить libhid работать с дескриптором отчета для моего целевого устройства.Я обнаружил, что интерфейс HID-устройства (hiddev) работает очень хорошо и на самом деле его очень легко понять.Есть хороший PDF-ссылка на hiddev что я очень рекомендую.Кроме того, очень полезным оказался включаемый файл hiddev.h в /usr/include/linux.В Ubuntu 8.04 интерфейс hiddev работал «из коробки» без необходимости дополнительной настройки.
Надеюсь, это поможет следующему человеку, у которого возникнут проблемы с подключением своего HID-устройства к хосту Linux.
Примечание:Ссылка, которую я предоставил на файл .PDF выше, похоже, исчезла.я опубликовал копия файла .PDF здесь.Это бесплатный сервис обмена файлами, поэтому вам придется выдержать несколько рекламных объявлений, чтобы его загрузить.