2 Stimmen

Ermitteln des HID-Pfads für USB-HID-Geräte mit libhid unter Linux

Ich bin daran interessiert, libhid zu verwenden, um auf ein benutzerdefiniertes HID-Gerät zuzugreifen, das wir auf einem PIC-Mikrocontroller entwickeln. Es ist mir gelungen, den test_libhid-Code zum Laufen zu bringen. Die Anweisungen zum Lesen und Schreiben auf Geräte mit dieser Bibliothek sind als Kommentare im test_libhid-Code enthalten.

Ich habe versucht, die dokumentierten Techniken zum Lesen und Schreiben zu befolgen, aber bisher ist es mir nicht gelungen, das Gerät zu lesen oder zu beschreiben. Ich vermute, dass der Grund dafür darin liegt, dass der Berichtsdeskriptor für das Gerät ein 64-Byte-Array sowohl für die Eingangs- als auch für die Ausgangsdatenberichte angibt.

Ich habe die Details im Abschnitt Device Class Definition for HID von usb.org gelesen, und ich denke, dass ich verstehe, wie Deskriptoren im Allgemeinen funktionieren und wie sie in HID-Pfade übersetzt werden, aber meine Versuche, Daten auf dem Gerät zu lesen und zu schreiben, sind fehlgeschlagen.

Ich habe überprüft, dass das Gerät unter Windows funktioniert, also scheint mein Problem auf der Linux-Seite zu liegen. Ich denke nicht, dass es eine Rolle spielen sollte, aber ich sollte anmerken, dass ich derzeit in einer virtuellen VMWare-Maschine arbeite, die mit Ubuntu 8.04 Server

Kann mir jemand sagen, wie ich den HID-Pfad für den folgenden Berichtsdeskriptor (erzeugt von lsusb -vvv) angeben kann?

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

Wenn ich das Programm test_libhid ausführe, wird der Parse-Baum als 64 identische Einträge ausgegeben, die wie folgt aussehen:

path: 0xff000001.0x00000000; type: 0x80

Dies sind vermutlich die Eingaben. Auf diese Liste folgen weitere 64 Einträge, die wie folgt aussehen:

path: 0xff000001.0x00000000; type: 0x90

Ich habe auf der libhid-Mailingliste gepostet, aber dort gab es in letzter Zeit nicht viel Aktivität, also dachte ich, dass ich meine Frage hier stellen würde. Wenn jemand eine Anleitung geben kann, wie der HID-Pfad für diesen Eingabe- und Ausgabebericht angegeben werden sollte, wäre das eine enorme Hilfe.

Merci.

2voto

Steve Hawkins Punkte 1433

Nach vielen Versuchen und Irrtümern konnte ich libhid nie dazu bringen, mit dem Berichtsdeskriptor für mein Zielgerät zu arbeiten. Ich fand jedoch heraus, dass die HID-Geräteschnittstelle (hiddev) sehr gut funktionierte und eigentlich sehr leicht zu verstehen war. Es gibt eine gute PDF-Referenz für hiddev die ich sehr empfehlen kann. Auch die Include-Datei hiddev.h in /usr/include/linux war sehr hilfreich. In Ubuntu 8.04 funktionierte die hiddev-Schnittstelle "out of the box", ohne dass eine zusätzliche Konfiguration erforderlich war.

Hoffentlich hilft dies dem nächsten, der Probleme hat, sein HID-Gerät an einen Linux-Host anzuschließen.

Hinweis: Der Link, den ich für die PDF-Datei oben angegeben habe, scheint verschwunden zu sein. Ich habe eine Kopie der .PDF-Datei hier . Es handelt sich um einen kostenlosen Dateifreigabedienst, so dass Sie einige Werbeeinblendungen in Kauf nehmen müssen, um das Programm herunterladen zu können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X