Определение пути HID для устройства USB HID с использованием libhid в Linux - PullRequest
2 голосов
/ 30 июня 2009

Мне интересно использовать 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 для этого отчета о входных и выходных данных, это будет огромной помощью.

Спасибо.

1 Ответ

1 голос
/ 07 июля 2009

После долгих проб и ошибок я так и не смог заставить libhid работать с дескриптором отчета для моего целевого устройства. Я обнаружил, что HID Device Interface (hiddev) работал очень хорошо, и на самом деле его было очень легко понять. Существует хорошая справка PDF для hiddev , которую я настоятельно рекомендую. Также был очень полезен включаемый файл hiddev.h в / usr / include / linux. В Ubuntu 8.04 интерфейс hiddev работал «из коробки» без дополнительной настройки.

Надеюсь, это поможет следующему человеку, у которого возникнут проблемы с подключением устройства HID к хосту Linux.

Примечание. Ссылка, предоставленная мною выше для файла .PDF, похоже, исчезла. Я разместил копию файла .PDF здесь . Это бесплатная служба обмена файлами, поэтому вам нужно будет выдержать несколько рекламных объявлений, чтобы загрузить ее.

...