Linux-Gamepad - keine Eingabeereignisse

816
lHart

Ich versuche, ein Gamepad unter Linux zu verwenden (Kernel ist 4.16.10), und ich scheine keine Eingabeereignisse herauszubekommen.

Das Gerät, ein gefälschter Xbox 360-Controller, scheint erkannt dmesgworden zu sein:

#dmesg when pluging in controller  [29505.029981] usb 1-2: new full-speed USB device number 29 using xhci_hcd [29505.158111] usb 1-2: New USB device found, idVendor=2563, idProduct=0575 [29505.158116] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [29505.158119] usb 1-2: Product: PS3/PC Gamepad [29505.158121] usb 1-2: Manufacturer: SHANWAN [29505.160469] input: SHANWAN PS3/PC Gamepad as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/0003:2563:0575.000D/input/input52 [29505.160604] hid-generic 0003:2563:0575.000D: input,hidraw0: USB HID v1.10 Gamepad [SHANWAN PS3/PC Gamepad] on usb-0000:00:14.0-2/input0 [29505.238365] usb 1-2: USB disconnect, device number 29 [29505.845839] usb 1-2: new full-speed USB device number 30 using xhci_hcd [29505.974584] usb 1-2: New USB device found, idVendor=045e, idProduct=028e [29505.974590] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [29505.974594] usb 1-2: Product: Controller [29505.974598] usb 1-2: Manufacturer: SHANWAN [29505.976469] input: Microsoft X-Box 360 pad as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/input/input53 

Ich habe mit beiden evdevund den joystickFahrern versucht :

# /var/log/x-0.log with joystick driver  (II) config/udev: Adding input device Microsoft X-Box 360 pad (/dev/input/event7) (**) Microsoft X-Box 360 pad: Applying InputClass "joystick catchall" (II) Using input driver 'joystick' for 'Microsoft X-Box 360 pad' (**) Microsoft X-Box 360 pad: always reports core events (**) Microsoft X-Box 360 pad (keys): Applying InputClass "joystick catchall" (II) Using input driver 'joystick' for 'Microsoft X-Box 360 pad (keys)' (**) Microsoft X-Box 360 pad (keys): always reports core events (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/input/input55/event7" (II) XINPUT: Adding extended input device "Microsoft X-Box 360 pad (keys)" (type: JOYSTICK, id 18) (**) Option "Device" "/dev/input/event7" (**) Option "StartMouseEnabled" "False" (**) Option "StartKeysEnabled" "False" (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/input/input55/event7" (II) XINPUT: Adding extended input device "Microsoft X-Box 360 pad" (type: JOYSTICK, id 19) (II) Joystick: Microsoft X-Box 360 pad. bus 0x3 vendor 0x45e product 0x28e version 0x110 (II) Joystick: found 8 axes, 11 buttons JOYSTICK: DebugLevel set to 0 (**) Microsoft X-Box 360 pad: (accel) keeping acceleration scheme 1 (**) Microsoft X-Box 360 pad: (accel) acceleration profile 0 (**) Microsoft X-Box 360 pad: (accel) acceleration factor: 2.000 (**) Microsoft X-Box 360 pad: (accel) acceleration threshold: 4  # /var/log/x-0.log with evdev driver  (II) config/udev: removing device Microsoft X-Box 360 pad (II) evdev: Microsoft X-Box 360 pad: Close (II) UnloadModule: "evdev" (II) config/udev: Adding input device SHANWAN PS3/PC Gamepad (/dev/input/js0) (II) No input driver specified, ignoring this device. (II) This device may have been added with another device file. (II) config/udev: Adding input device (unnamed) (/dev/input/event7) (II) No input driver specified, ignoring this device. (II) This device may have been added with another device file. (II) config/udev: Adding input device Microsoft X-Box 360 pad (/dev/input/js0) (**) Microsoft X-Box 360 pad: Applying InputClass "joystick catchall" (II) Using input driver 'evdev' for 'Microsoft X-Box 360 pad' (**) Microsoft X-Box 360 pad: always reports core events (**) evdev: Microsoft X-Box 360 pad: Device: "/dev/input/js0" (EE) evdev: Microsoft X-Box 360 pad: Unable to query fd: Invalid argument (EE) PreInit returned 2 for "Microsoft X-Box 360 pad" (II) UnloadModule: "evdev" (II) config/udev: Adding input device Microsoft X-Box 360 pad (/dev/input/event7) (**) Microsoft X-Box 360 pad: Applying InputClass "joystick catchall" (II) Using input driver 'evdev' for 'Microsoft X-Box 360 pad' (**) Microsoft X-Box 360 pad: always reports core events (**) evdev: Microsoft X-Box 360 pad: Device: "/dev/input/event7" (--) evdev: Microsoft X-Box 360 pad: Vendor 0x45e Product 0x28e (--) evdev: Microsoft X-Box 360 pad: Found absolute axes (--) evdev: Microsoft X-Box 360 pad: Found x and y absolute axes (II) evdev: Microsoft X-Box 360 pad: Forcing relative x/y axes to exist. (II) evdev: Microsoft X-Box 360 pad: Configuring as mouse (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/input/input59/event7" (II) XINPUT: Adding extended input device "Microsoft X-Box 360 pad" (type: MOUSE, id 16) (II) evdev: Microsoft X-Box 360 pad: initialized for absolute axes. (**) Microsoft X-Box 360 pad: (accel) keeping acceleration scheme 1 (**) Microsoft X-Box 360 pad: (accel) acceleration profile 0 (**) Microsoft X-Box 360 pad: (accel) acceleration factor: 2.000 (**) Microsoft X-Box 360 pad: (accel) acceleration threshold: 4 

Ich kann jedoch keine Eingabeereignisse weder mit jstestnoch evtest(sowohl als Root als auch nicht als Root) abrufen. Gleiches mit xboxdrvbtw.

usbmonRuft Daten nur beim Einstecken und Ausstecken des Controllers ab. Beim Drücken von Tasten wird nichts gemeldet.

Aber evdeverkennt sereral mögliche Ereignisse:

# evtest  Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 304 (BTN_SOUTH) Event code 305 (BTN_EAST) Event code 307 (BTN_NORTH) Event code 308 (BTN_WEST) Event code 310 (BTN_TL) Event code 311 (BTN_TR) Event code 314 (BTN_SELECT) Event code 315 (BTN_START) Event code 316 (BTN_MODE) Event code 317 (BTN_THUMBL) Event code 318 (BTN_THUMBR) Event type 3 (EV_ABS) Event code 0 (ABS_X) Value 0 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 1 (ABS_Y) Value 0 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 2 (ABS_Z) Value 0 Min 0 Max 255 Event code 3 (ABS_RX) Value 0 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 4 (ABS_RY) Value 0 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 5 (ABS_RZ) Value 0 Min 0 Max 255 Event code 16 (ABS_HAT0X) Value 0 Min -1 Max 1 Event code 17 (ABS_HAT0Y) Value 0 Min -1 Max 1 Event type 21 (EV_FF) Event code 80 (FF_RUMBLE) Event code 81 (FF_PERIODIC) Event code 88 (FF_SQUARE) Event code 89 (FF_TRIANGLE) Event code 90 (FF_SINE) Event code 96 (FF_GAIN) 

Bonus mit Wiresharks usbmon-Bericht und einem csv mit Windows-Gegenstück: https://filebin.net/n416mszk1155zbjb (Entschuldigung, aber TXT-Versionen sind unbestimmt)

Hat jemand eine Idee oder einen Anhaltspunkt, um eine Lösung für dieses Problem zu finden?

Vielen Dank,

1
Haben Sie das Gerät während der Ausgabe von `dmesg` zweimal angeschlossen? Das Gerät trennt sich und verbindet sich wieder mit anderen IDs, was zumindest ungerade ist und auf ein Hardwareproblem hindeuten kann. Die erste Variante scheint HID-Zugriff zu ermöglichen. Ist das Hidraw-Gerät noch verfügbar? Wenn Sie im Eingangspegel nichts sehen (mit "evtest"), müssen Sie als nächstes den HID-Pegel und dann den USB-Pegel betrachten. dirkt vor 5 Jahren 0
Hmm, schöner Fang! Ich denke, man stellt sich absichtlich wieder auf das Gerät zu lügen (vom PS3 / PC-Pad bis zum X-Box 360-Pad). Ist es möglich? Das Hidraw-Gerät ist jedoch nicht verfügbar. : / Gibt es eine Möglichkeit, mit solchen Verhaltensweisen umzugehen? lHart vor 5 Jahren 0
Lesen Sie unter "usbmon" nach, ob Sie überhaupt USB-Ereignisse vom Gerät erhalten (in der X-box 360-Inkarnation). Aktualisieren Sie bitte auch die Frage mit dem Abschnitt "Unterstützte Ereignisse" ab dem Start von "evtest" (als root). Basierend auf dem X-Protokoll scheint * etwas * zumindest zu funktionieren. dirkt vor 5 Jahren 0
Ich habe im Hauptbeitrag usbmon und evdev hinzugefügt. lHart vor 5 Jahren 0

1 Antwort auf die Frage

0
dirkt

Wenn Sie beim Drücken von Tasten keinen USB-Datenverkehr erhalten, funktioniert ein Teil der Hardware nicht ordnungsgemäß.

Entweder ist die Hardware defekt oder sie muss in der Phase ordnungsgemäß initialisiert werden, in der sie sich als SHANWAN PS3/PCoder möglicherweise in der Inkarnation ankündigt, da Microsoft X-Box 360 padsie Initialisierungsbefehle durch den Windows-Treiber erwartet, die der Linux-Treiber nicht bereitstellt.

Der nächste Schritt wäre das Anschließen an einen Computer mit dem richtigen Windows-Treiber. Überprüfen Sie, ob es dort funktioniert. Wenn nein, schicke es zurück. Wenn ja, prüfen Sie den USB-Datenverkehr (es gibt Windows-Tools dafür, google), um herauszufinden, wie er initialisiert werden soll.

Bearbeiten

Ich verstehe immer noch nicht das Chaos mit den beiden Geräten (und hatte keine Zeit, es detailliert zu betrachten). Man kann jedoch sehen, dass unter Windows der folgende Austausch stattfindet, bevor Schlüsselereignisse gesendet werden:

In: 01 03 02 Out: 01 03 02 In: 02 03 00 Out: In: 03 03 03 Out:  In: 08 03 00 Out:  

Unter Linux wird nur die erste Zeile angezeigt. Es gibt nie eine Antwort. Dies kann die fehlende Initialisierung sein (oder etwas anderes).

Bei der Betrachtung habe ich herausgefunden, dass dies xpadder Kernel-Treiber ist, der die HID-Ereignisse in Eingabeereignisse übersetzt. Ich kann in Ihrem dmesgExtrakt nicht sehen, ob er geladen wird. Überprüfen Sie im Zweifelsfall mit lsmod. (Ich konnte diese Sequenzen jedoch nicht während einer kurzen Überprüfung der Quelle finden.)

Es scheint auch eine Userspace-Bibliothek zu geben, siehe hier, die besser zu funktionieren scheint als der Kernel-Treiber, daher ist dies auch einen Versuch wert.

Summen. Es funktioniert ohne Probleme unter Windows. Und es scheint sich genauso zu verhalten (trennen, dann wieder verbinden). Nicht viele Out-Messages, was einer Event-Schleife vorausgeht, sind einige (rohe) "01 03 02", die auch unter Linux vorhanden zu sein scheinen. Was aber unter Linux interessant sein könnte, ist, dass ich mit Wireshark herausgefunden habe, dass die letzten Meldungen `PORT_SUSPEND` sind (out in). Ist es o.k? lHart vor 5 Jahren 0
Um zu erraten, was los ist, würde ich ein komplettes Protokoll einer funktionierenden Interaktion unter Windows benötigen, vom Einstecken bis zur Linux-Interaktion. Könnte ein Linux-Treiber sein, der für das Original ok ist, aber nicht diese Kopie ... dirkt vor 5 Jahren 0
Vielen Dank für Ihre Hilfe. Ich fügte Protokolle von USB-Interaktionen hinzu. Ich hoffe die Dateiformate sind in Ordnung. lHart vor 5 Jahren 0
Aktualisierung: `xpad` wird in` lsmod` aufgelistet und das Problem ist mit `xboxdrv` dasselbe. ;) lHart vor 5 Jahren 0