Геймпад для Linux - нет событий ввода

806
lHart

Я пытаюсь использовать геймпад под Linux (ядро 4.16.10), и я не получаю никаких входных событий из него.

Устройство, поддельный контроллер xbox 360, похоже, обнаружен, как dmesgкажется, сообщает:

#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 

Я пробовал с обоими evdevи joystickдрайверами:

# /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 

Тем не менее, я не могу получить какие-либо входные события ни с jstestни, ни evtest(как с правами root, так и без root). То же самое с xboxdrvкстати.

usbmonполучает данные только при подключении и отключении контроллера. При нажатии кнопок ничего не сообщается.

Но evdevобнаруживает несколько возможных событий:

# 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) 

Бонус с usbmon отчетом Wireshark и csv с аналогом windows: https://filebin.net/n416mszk1155zbjb (извините, но txt-версии не нужны)

Кто-нибудь есть идеи или привести, чтобы найти решение этой проблемы?

Спасибо,

1
Вы подключали устройство дважды за время вывода `dmesg`? Устройство отключается, а затем снова подключается с разными идентификаторами, что, по меньшей мере, странно и может указывать на аппаратную проблему. Первый вариант, по-видимому, разрешает доступ HID, устройство hidraw все еще доступно? Если вы ничего не видите на входном уровне (с помощью `evtest`), следующим шагом будет просмотр уровня HID, а затем уровня USB. dirkt 6 лет назад 0
Хм, хороший улов! Я думаю, что воссоединяется с целью лгать об устройстве (от планшета PS3 / PC до планшета X-box 360). Является ли это возможным? В любом случае, устройство hidraw недоступно. : / Есть ли способ справиться с таким поведением? lHart 6 лет назад 0
Прочтите `usbmon`, посмотрите, вообще ли вы получаете события USB от устройства (в воплощении X-box 360). Также, пожалуйста, обновите вопрос с частью `поддерживаемых событий 'с момента запуска` evtest` (от имени root); Судя по X-журналу, * что-то *, по крайней мере, работает. dirkt 6 лет назад 0
Я добавил выводы usbmon и evdev в основной пост. lHart 6 лет назад 0

1 ответ на вопрос

0
dirkt

Если вы не получаете никакого трафика USB при нажатии кнопок, что-то на оборудовании не работает должным образом.

Либо оборудование неисправно, либо оно должно быть должным образом инициализировано во время фазы, когда оно объявляет себя как SHANWAN PS3/PC, или, возможно, в воплощении, поскольку Microsoft X-Box 360 padоно ожидает команды инициализации драйвером Windows, которые драйвер Linux не предоставляет.

Следующим шагом будет подключение его к компьютеру с соответствующим драйвером Windows, посмотрите, работает ли он там. Если нет, верните его; если да, то просмотрите USB-трафик (для этого есть инструменты Windows, Google), чтобы узнать, как его инициализировать.

редактировать

Я все еще не понимаю беспорядок с этими двумя устройствами (и не было времени, чтобы рассмотреть это подробно). Однако видно, что в Windows перед отправкой ключевых событий происходит следующий обмен:

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

Под Linux появляется только первая строка; Там никогда не бывает ответа. Это может быть отсутствующая инициализация (или что-то еще).

Глядя на это, я обнаружил, что xpadэто драйвер ядра, который преобразует события HID во входные события, я не вижу по вашему dmesgизвлечению, загружается ли он. В двойке посоветуйтесь с lsmod. (Хотя я не смог найти эти последовательности во время быстрой проверки источника).

Также, похоже, есть библиотека пользовательского пространства, см., Например, здесь, которая, кажется, работает лучше, чем драйвер ядра, так что это тоже стоит попробовать.

Hum. Работает без проблем под окнами. И, похоже, ведет себя так же (отключите, а затем снова подключите). Не так много выходных сообщений, которые предшествуют циклу обработки событий, - это некоторые (необработанные) `01 03 02`, которые также присутствуют в linux. Но что может быть интересным в Linux, так это то, что, используя wireshark, я обнаружил, что последние сообщения являются `PORT_SUSPEND` (затем в). Это нормально? lHart 6 лет назад 0
Чтобы угадать, что происходит, мне нужен полный протокол рабочего взаимодействия под Windows, начиная с момента его подключения, а также взаимодействия с Linux. Может быть какая-то странность драйвера Linux, которая подходит для оригинала, но не для этой копии ... dirkt 6 лет назад 0
Большое спасибо за Вашу помощь. Я добавил журналы USB-взаимодействий. Я надеюсь, что форматы файлов в порядке. lHart 6 лет назад 0
Обновление: `xpad` указан в` lsmod`, и проблема та же, что и в `xboxdrv`. ;) lHart 6 лет назад 0

Похожие вопросы