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

1

Я пытаюсь использовать геймпад под 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-версии не нужны)

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

Спасибо,

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

Ответы:

0

Если вы не получаете никакого трафика 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. (Хотя я не смог найти эти последовательности во время быстрой проверки источника).

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

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

У меня та же проблема, но мне удалось определить последовательность инициализации драйвера Windows, и на основе этого я написал скрипт на python, который отправляет необходимые коды на устройство.

Это скрипт, вы должны запустить его с помощью sudo: pyusb-test.py

DN Моддер
источник
Добро пожаловать в Супер пользователя! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Bertieb
Спасибо за это. Это хорошо работает на контроллере Shanwan ака Rexus R2X! Вы сделали мой день! :)
BlackSoil
Большое спасибо! Работает с SHANWAN uRage PC Gamepad, Wired (Хама Вендетта ^ 2)
SzieberthAdam