Rohdaten eines "USB Human Interface Device" auslesen/verarbeiten

Post Reply
Message
Author
mr_bunnyman
Posts: 2
Joined: 07. Jul 2009 21:36

Rohdaten eines "USB Human Interface Device" auslesen/verarbeiten

#1 Post by mr_bunnyman »

Hallo Forum,

ich stehe vor einem kleinen Problem, bei dem ich hier ein paar Anregungen erfragen wollte. Kurz gesagt: Ich würde gerne von einem USB-HID (eine 6-Achsen "Space Maus") die Eingabedaten direkt in einem (Userspace)-Programm auswerten können. Mit so einem Ding ist es möglich, alle 6 Freiheitsgrade in einem Eingabegerät zu nutzen. Es gibt Linux Treiber, wenn ich die Space Maus einstecke funktioniert sie direkt als Eingabegerät.

Auf welchem Weg komme ich nun aber an die direkten "Rohdatenpakete"? Mich interessiert statt der jeweiligen Mauszeigergeschwindigkeit in der Richtung eines Freiheitsgrades eher dessen Ableitung/Position -- aber das ist eigentlich nur ein "verrechnen" der Rohdaten. Als normale Maus soll das Ding gar nicht arbeiten, sondern voll meinem Programm gehören. Zu beachten ist, das das Gerät an einem embedded-System betrieben wird, sprich an Infrastruktur so gut wie nichts vorhanden ist (kein X-Server!).

Welche Schnittstelle im System könnte man am besten anzapfen? Wenn das ganze mit möglichst wenig Anpassungen am Kernel möglich ist, umso besser -- spricht im Userspace würd ich gerne bleiben, mit C komme ich halbwegs zurecht. Mit einem USB-Sniffer (usbmon/whireshark) konnte ich schon mal ein bisschen mithorchen, ist natürlich unpraktisch auf Dauer...

Könnte mir jemand Hinweise geben, in welche Richtung, bei welchen Werkzeuge und bei welchen Schnittstellen ich mich am ehesten umgucken könnte?

Um das Bild abzurunden, hier nochmal kurz die Syslogmeldungen für das ein/ausstecken:

Code: Select all

Jun 12 10:30:24 my kernel: [ 3136.177077] usb 1-2: new low speed USB device using uhci_hcd and address 2
Jun 12 10:30:25 my kernel: [ 3136.407889] usb 1-2: configuration #1 chosen from 1 choice
Jun 12 10:30:25 my kernel: [ 3136.561319] usbcore: registered new interface driver hiddev
Jun 12 10:30:25 my kernel: [ 3136.761357] input: 3Dconnexion SpaceNavigator as /devices/pci0000:00/0000:00:1d.0/usb1/1-2/1-2:1.0/input/input9
Jun 12 10:30:25 my kernel: [ 3136.763306] generic-usb 0003:046D:C626.0001: input,hidraw0: USB HID v1.10 Multi-Axis Controller [3Dconnexion SpaceNavigator] on usb-0000:00:1d.0-2/input0
Jun 12 10:30:25 my kernel: [ 3136.763358] usbcore: registered new interface driver usbhid
Jun 12 10:30:25 my kernel: [ 3136.763365] usbhid: v2.6:USB HID core driver
Jun 12 10:31:00 my kernel: [ 3171.594255] usb 1-2: USB disconnect, address 2
Vielen Dank und mit allerbesten Grüßen

Der Bunnyman

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

In /etc/X11/xorg.conf statt /dev/input/mice nur /dev/input/mouse0 (oder1, 2, 3) eintragen, danach wird die Spacemouse von X in Ruhe gelassen. Danach kannst du /dev/input/event5 (oder 1,2,3,4,6, etc.) auslesen, was dir die HID-Events ausgibt. Das Format dieser Events ist dokumentiert und auch für Multi-Achsen-Geräte mit hunderten Knöpfen geeignet. Falls dir das ebenfalls noch zu "gekocht" ist (unwahrscheinlich), kannst du das HID-Treibermodul für dieses Gerät entladen und direkt per libusb die Pakete von USB abgreifen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

mr_bunnyman
Posts: 2
Joined: 07. Jul 2009 21:36

#3 Post by mr_bunnyman »

Danke für die Stichworte!

Nach einem weiteren Tag Recherche habe ich schliesslich einen passenden freien Treiber gefunden, der sehr genau das tut was ich wollte. Die anderen Varianten habe ich mir auch angesehen, bringen aber keine Vorteile. Kleines demoprogramm hab ich schon fertig, das ganze muss jetzt nur noch auf ARM portiert werden... Aber das wird schon, da weis ich zumindest wo ich anfangen muss.

Also einen schönen Abend noch!

Post Reply