USB Joystick als Maus

Kamikaze

Warrior of Sunlight
Teammitglied
Ich habe einen WingMan Extreme Digital 3D, das Ding hat ne Menge Achsen, Knöpfe und anderen Schnickschnack den man zum Freespace spielen brauchen kann. Mit einem Gameport auf USB Adapter der dem Gerät beilag wird der Joystick auch korrekt erkannt und unter /dev/uhid0 wird ein device erzeugt.

Da ich nicht wirklich weiß was ich unter FreeBSD damit machen soll, dachte ich mir ich versuche mal das Ding als Maus zu verwenden.

Mit dem Kommando
# moused -p /dev/uhid0 -t microsoft

Zwinge ich moused das Gerät als serielle Microsoft Maus zu behandeln. Die Einstellung -t auto funktioniert leider nicht, da moused ja nicht dafür gemacht ist mit Joysticks umzugehen.

Jedenfalls führt jede Eingabe mit dem Joystick zu wildem Mausgezucke und Geklicke. Das werte ich mal als Erfolg.

Aber jetzt stehe ich vor dem eigentlichen Problem. Was muss ich mit moused anstellen um ein Joystick Profil zu schreiben um sinnvolle Eingaben mit dem Gerät zu ermöglichen.

  • Es gibt 8 Buttons, das ist ja schonmal was schönes.
  • Dann gibt es 3 Achsen von denen man die ersten 2 für die Steuerung der Maus verwenden kann.
  • Dann gibt es da eine Schubkontrolle, damit könnte man z.B. die Cursorgeschwindigkeit variieren.
  • Dann wäre da noch ein 4 Wege Rundumschalter, den könnte man doch zum Scrollen verwenden.
 
[LoN]Kamikaze schrieb:
Mit dem Kommando
# moused -p /dev/uhid0 -t microsoft

Zwinge ich moused das Gerät als serielle Microsoft Maus zu behandeln. Die Einstellung -t auto funktioniert leider nicht, da moused ja nicht dafür gemacht ist mit Joysticks umzugehen.

Jedenfalls führt jede Eingabe mit dem Joystick zu wildem Mausgezucke und Geklicke. Das werte ich mal als Erfolg.

/dev/random statt /dev/uhid0 hätte ungefähr zum gleichen Erfolg geführt :)

Das geht nicht so einfach. Es gibt z. B. nicht umsonst einen ums(4) Treiber, der HID Geräte der Maus-Klasse unterstützt (bei Abwesenheit von ums(4) im Kernel wird eine USB Maus von uhid(4) erkannt).

[LoN]Kamikaze schrieb:
Aber jetzt stehe ich vor dem eigentlichen Problem. Was muss ich mit moused anstellen um ein Joystick Profil zu schreiben um sinnvolle Eingaben mit dem Gerät zu ermöglichen.

Du müßtest moused beibringen HID reports zu interpretieren. Nähere Informationen gibts auf http://www.usb.org/developers/hidpage/.

Von Interesse dürften darüberhinaus libusbhid(3) zum parsen des HID descriptors und der reports und die sourcen zu ums(4) sein.

Markus
 
Das sieht eigentlich ganz simpel aus. Wenn ich ein paar spezifische Joystickbewegungen aus /dev/uhid0 mitschneide, ist zu erkennen, das der Joystick bei jeder Änderung für jede Achse absolute Positionswerte angibt. Jeder solche Wert wird von einem Byte das die Achse oder den Button eindeutig identifiziert angeführt. Die Werte sind in Mittelstellung einer Achse bei 0. Die Schubkontrolle ist dabei, eine Achse wie jede andere. Der HUD Rundumschalter ist nichts weiter als 4 weitere Buttons. Also hat der Joystick 4 Achsen und 12 Buttons.

Den Zahlensalat in etwas sinnvolles zu parsen scheint da recht banal zu sein. Interessanter wäre es zu wissen wie die von moused unterstützten Protokolle wie microsoft oder mouseman (Logitech) gesprochen werden. Dann könnte man zwischen moused und device einen Parser hängen der den Joystick einfach in ein Mausprotokoll übersetzt, das moused versteht.
 
Ist es im Prinzip auch. libusbhid(3) nimmt dir den größten Teil der Arbeit ab.

Schau dir mal usbhidctl(1) an, was im Prinzip ein Frontend von libusbhid(3) ist:

# usbhidctl -f /dev/uhid0 -r

schmeißt dir den HID Descriptor raus, eine formalisierte Darstellung der Funktionen deines Joysticks und zugleich Vorlage zur Interpretation der Reports.

# usbhidctl -f /dev/uhid0 -l -a

gibt dir den aktuellen Status der einzelnen Funktionen des Joysticks (Achsenstellung, Buttonstatus, etc).

In den Sourcen zu usbhidctl(1) wirst du sehr schnell sehen, wie das funktioniert. Du solltest dir aber noch die HID Spezifikation von usb.org zu Gemüte führen, damit du siehst, wie man den Descriptor interpretiert.
 
Zurück
Oben