LINUX.ORG.RU

Не работает режим Xbox360 у Mobapad Huben M9S

 , ,


2

2

Купил геймпад. С ПК работает либо по проводу, либо через Bluetooth-донгл, что шел в комплекте (нельзя использовать как адаптер). Протестил на Windows, работает как надо, на сочетание клавиш есть переключение между режимами Xbox360 (2 led лампочки горят на геймпаде) и Bluetooth Gamepad (3led). Пошел в Arch Linux, где геймпад без всяких xpad, xpadneo, xboxdrv определялся как MOBAPAD-M9s (3led) и не меняется сочетанием на Xbox360. Всё бы ничего, но не работает кнопка Home(Guide) и вибрация. Поэтому начал поочередно пробовать разные варианты драйверов, описанные выше. xpadneo и xpad вообще никак не воспринимают геймпад, а xboxdrv с параметрами

xboxdrv --evdev /dev/input/by-id/usb-SHANWAN_Android_Gamepad-event-joystick --mimic-xpad 

создает геймпад /dev/input/js1 типа xbox360, который не видит никаких нажатий. js0 же, что работал, тоже перестает работать. При подключении dmesg пишет:

[<    5,622433>] usb 1-1: new full-speed USB device number 17 using xhci_hcd
[<    0,432074>] usb 1-1: unable to read config index 0 descriptor/start: -71
[<    0,000011>] usb 1-1: can't read configurations, error -71
[<    0,604570>] usb 1-1: new full-speed USB device number 18 using xhci_hcd
[<    0,397257>] usb 1-1: New USB device found, idVendor=0079, idProduct=181c, bcdDevice= 1.00
[<    0,000007>] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[<    0,000002>] usb 1-1: Product: MOBAPAD-M9s
[<    0,021041>] input: MOBAPAD-M9s as /devices/pci0000:00/0000:00:01.3/0000:02:00.0/usb1/1-1/1-1:1.0/0003:0079:181C.0014/input/input51
[<    0,000189>] hid-generic 0003:0079:181C.0014: input,hidraw3: USB HID v1.10 Gamepad [MOBAPAD-M9s] on usb-0000:02:00.0-1/input0
[<    0,006393>] input: MOBAPAD-M9s System Control as /devices/pci0000:00/0000:00:01.3/0000:02:00.0/usb1/1-1/1-1:1.1/0003:0079:181C.0015/input/input52
[<    0,054858>] input: MOBAPAD-M9s Consumer Control as /devices/pci0000:00/0000:00:01.3/0000:02:00.0/usb1/1-1/1-1:1.1/0003:0079:181C.0015/input/input53
[<    0,000114>] hid-generic 0003:0079:181C.0015: input,hidraw4: USB HID v1.01 Device [MOBAPAD-M9s] on usb-0000:02:00.0-1/input1

usb-devices:

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 18 Spd=12   MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0079 ProdID=181c Rev=01.00
S:  Product=MOBAPAD-M9s
C:  #Ifs= 2 Cfg#= 1 Atr=80 MxPwr=350mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=02(O) Atr=03(Int.) MxPS=  32 Ivl=10ms
E:  Ad=81(I) Atr=03(Int.) MxPS=  32 Ivl=8ms
I:  If#= 1 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=83(I) Atr=03(Int.) MxPS=  32 Ivl=10ms

lsusb:

 |__ Port 001: Dev 018, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        ID 0079:181c DragonRise Inc. 
    |__ Port 001: Dev 018, If 1, Class=Human Interface Device, Driver=usbhid, 12M
        ID 0079:181c DragonRise Inc. 

Пробовал различные махинации с /sys/module/usbhid/drivers/usb:usbhid/unbind и /sys/module/xpad/drivers/usb:xpad/new_id, но изменений не произошло. Делал modprobe xpad modprobe hid_xpadneo и наоборот убирал их, ну, а геймпад как не работал в режиме xbox360, так и не работает. Хочу уточнить, что vendorId и productId при подключении через донгл такой же, но название меняется с MOBAPAD-M9s на Shanwan Android Gamepad. Есть ли вообще вероятность как-то исправить ситуацию или лучше сразу отказаться от гейминга на данном геймпаде в Linux?

Нажал в браузере не кнопку Home геймпада и произошел переход на домашнуюю страницу. Посмотрел, что за кнопка нажимается через xev и выдало:

KeyPress event, serial 44, synthetic NO, window 0x5200001,
    root 0x1db, subw 0x0, time 2208415, (841,333), root:(891,457),
    state 0x10, keycode 180 (keysym 0x1008ff18, XF86HomePage), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

Перемещено Zhbert из games



Последнее исправление: superlinuxfedora (всего исправлений: 1)

Не сношай мозг себе и другим. Купи оригинальный Xbox-ый геймпад и гоняй в «подставь название любимой игры».

Кстати, на моем контроллере Xbox Series Carbon Black вибрация тоже не работает, но я не страдаю по этому поводу.

basilic
()
Последнее исправление: basilic (всего исправлений: 1)
18 декабря 2023 г.

Проделывал те же самые махинации с теми же самыми результатами. Тот же самый USB ID, однако геймпад продавался (в DNS) как iPEGA PG-SW038C (700—1300₽).

Проброс геймпада в Windows 10 в VMware Workstation не помог (а вот если бы смог USB-контроллер пробросить, тогда бы заработал как Xbox-овый).


Если геймпад войдет в режим Android-а, тогда он будет в нём вечно, пока питание ему не отрубят. Типа режим закэшился в геймпаде.

Как сделать Xbox-овый режим

  1. Выключить комп (systemctl suspend не считается).
  2. Подключить геймпад (можно хоть к хабу монитора; кстати, иногда USB-хаб у выключенного монитора включен).
  3. Включить комп, в lsusb будет ID 045e:028e Microsoft Corp. Xbox360 Controller
  4. Можно sudo reboot’ить, и всё так же: «Xbox 360 Controller». Это потому что геймпад ни разу в своей текущей жизни (смертью считается отключение питания) не становился «Android gamepad», а поэтому UEFI снова удается инициализировать его как надо. А если перед sudo reboot геймпад находился в режиме Switch Pro, тогда UEFI его опять как Xbox 360 Controller заинитит (видимо порядок: Switch Pro > Xbox 360 > Android).

На 3-м шаге становится понятно, что проблема — в инициализации геймпада. А инициализирует в Линуксе кто? usbcore. Поэтому usbhid, hid-generic, т.п. — тут вообще не при чем. И поэтому проброс в Windows 10 мне не помог, ведь программе VMware Workstation пробрасывать надо устройство с конкретным USB ID, который узнается только во время инициализации устройства, которая идет не по плану и даунгрейдит геймпад. Поэтому бессмысленно было мне экспериментировать с /sys/module/usbhid/parameters/quirks

В режиме Xbox 360 опрос (bInterval) согласно lsusb — 4 мс (250 Гц), а не 10 мс (100 Гц); и xboxdrv работает из коробки.

Еще заметил потом, что в dmesg «Device Number» меняется после ошибки (инкрементится). То есть с точки зрения usbcore, в порт пытались пихнуть одно устройство, а потом совершенно другое.

Когда у меня появится доступ к настоящей Винде, тогда посмотрю как это Винда так особо инитит геймпад, а смотреть буду с помощью каких-то USBTrace и USB Analyzer, которые нагулил.

Как сделать режим Switch Pro

На 20-й час мучений обнаружил, что можно дебагить USB bus’ы, и затем нашел как выискивать посылаемые геймпадом USB IDы:

Для этого в lsusb (без всяких -v) надо посмотреть номер bus’а (к которому подключен геймпад) и вписать его вместо 99999 тут (и без начальных 00):

sudo ls /sys/kernel/debug/usb >/dev/null 2>&1 || sudo mount -t debugfs none_debugs /sys/kernel/debug
sudo modprobe usbmon
sudo /bin/grep --line-buffered -Po '(?<=0 0 18 = .{18}).{8}' /sys/kernel/debug/usb/usbmon/99999u | /bin/sed -E 's/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/\2\1:\4\3/'

Тут grep берет предпредпоследнюю колонку у строки содержащей «0 0 18 =»; а sed превращает делает BbAaDdCc -> AaBbCcDd два раза.

В моем случае геймпад пытался сначала представиться с USB ID = 057e:2009 (Switch Pro), но Линукс нафиг посылал за какую-то ошибку (не понял какую), поэтому геймпад решил представиться по-другому — с USB ID 0079:181c (Android).

Следовательно, я сделал это (флаг i нашел ручным брутфорсом):

echo -n "057e:2009:i" | sudo tee /sys/module/usbcore/parameters/quirks 

а затем переподключил геймпад, и у меня появились вибрация, гироскоп и акселерометр (проверил оба в antimicrox); опрос согласно lsusb -v снизился с 10 мс (100 Гц) до 8 мс (125 Гц); и раскладка перестала быть Xbox-овой, поэтому пришлось добавить в /etc/environment

SDL_GAMECONTROLLERCONFIG="030056fb7e050000092000002000680314068201a05a5caf023b,Xbox 360 Controller,platform:Linux,a:b1,b:b0,x:b3,y:b2,back:b4,start:b6,guide:b5,leftshoulder:b9,rightshoulder:b10,leftstick:b7,rightstick:b8,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:b11,dpleft:b13,dpdown:b12,dpright:b14,"

и перезагрузиться. Значение это я сгенерил в antimicrox, там кнопка в нижнем левом углу. Поменял только a, b, x, y; и переименовал (было «Nintendo Switch Pro Controller»).

Вибрацию проверил с помощью sudo fftest /dev/input/by-id/usb-Nintendo_Co.__Ltd._Pro_Controller_000000000001-event-joystick , а потом в играх.

Так как всё работает, добавил уже в сам GRUB: usbcore.quirks="057e:2009:i"

Флаг i = USB_QUIRK_DEVICE_QUALIFIER (device cannot handle device_qualifier descriptor requests)

А в dmesg как раз были жалобы про descriptorы.

Все флаги: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/7.7_release_notes/kernel_parameters_changes (так-то потом ввели еще флаг o (USB_QUIRK_HUB_SLOW_RESET), но это для хабов).

Две закономерности: Если есть g, то геймпад бесконечно перезагружается (ибо g означает ждать аж 2000 мс). Иначе если если есть флаг i, то работает. Я перепробовал многие комбинации флагов, но это ничего не меняло вообще.

Если флаг i не помогает, тогда стоит попробовать еще k и ki (не забывая переподключать геймпад). Если что, единственное полноценное софтварное переподключение — это отбиндить, а затем забиндить нужный usb bus (а это неприятно).

Минусы режима Switch Pro у моего геймпада, по сравнению с Xbox’овым:

  1. xboxdrv не юзабелен. xboxdrv работает только с --event /dev/input/by-id/usb-Nintendo_Co.__Ltd._Pro_Controller_000000000001-event-joystick, а это вроде означает, что надо перезапускать xboxdrv после переподключения геймпада. xboxdrv не убирает настоящий геймпад (из-за чего игры думают, что игроков 2, а синглплеерные игнорят xboxdrv); клавиши/стики не забиндены никакие по умолчанию; самое главное: используемый xboxdrv’ом модуль hid-nintendo (и программа evtest) не правильно считывает положение правого стика по оси X (а вот sdl2-jstest — правильно, ибо SDL2 сырое читает с /dev/hidraw№).

  2. SDL_HIDAPI_DISABLE_LIBUSB=1 надо добавить в /etc/environment, не знаю хорошо это или плохо. Если этого не сделать, тогда забирает SDL2 у usbhid геймпад, из-за чего исчезают js№ и event№ в /dev/input/, /dev/hidraw№. Соответствующий код — в src/hidapi/libusb/hid.c. То есть SDL2 умеет быть (user-space) драйвером с помощью libusb.

  3. Опрос в 2 раза реже, чем у режима Xbox 360. 8 мс (125 Гц). Однако опрос ≠ настоящая задержка, которая всяко большущая у моего дешёвого геймпада.

  4. В journalctl -f заметил, что зачем-то делается setfactl -b /dev/hidraw4 и проваливается. Оказалось, что это /usr/lib/udev/rules.d/89-joycond.rules, который # Keep steam from accessing hidraw for pro controller. Удалил этот файл, добавил его путь в чёрный список в /etc/pacman.conf, затем sudo udevadm control --reload-rules && sudo udevadm trigger. Это починило Steam (не надо больше переподключать геймпад после запуска Steam).

  5. Все 4 лампочки горят то постоянно, то дискотека. Это исправил с помощью quirk’а (костыля) HID_QUIRK_ALWAYS_POLL (1 << 10 == 1024 == 0x400):

sleep 3; sudo modprobe -r usbhid ; sleep 4 ; sudo modprobe -v usbhid "quirks=0x057e:0x2009:0x400"

(и в GRUB добавил usbhid.quirks="0x057e:0x2009:0x400") (не путать usbhid и usbcore).

  1. Я засуспендил комп, и стали у лампочек дискотека и геймпад перезагружаться каждые 10 секунд. Пришлось выткнуть провод. Причем подключен геймпад был к выключенному монитору.
arzeth_
()

Всё. Я разобрался.

В любом случае в GRUB надо параметры у ядра usbcore.quirks="057e:2009:i" и опционально (чтобы лампы меньше мигали в режиме Switch Pro) usbhid.quirks="0x057e:0x2009:0x400" (а еще SDL_HIDAPI_DISABLE_LIBUSB=1 в /etc/environment опционально)

А чтобы «даунгрейдился» со Switch Pro до Xbox 360 надо:

  1. Добавить
blacklist hid_nintendo

в /etc/modprobe.d/blacklist.conf

  1. Но ядро не пользуется папкой /etc/modprobe.d напрямую. Оно берет эту папку из initramfs. Поэтому надо пересоздать файл initramfs. Я это сделал по-дурацки: sudo pacman -S mkinitcpio. Либо можно вроде бы sudo mkinitcpio -P

  2. Перезагрузиться.

Отныне после подключения геймпада в lsusb можно наблюдать первые 2 секунды:

057e:2009 Nintendo Co., Ltd Switch Pro Controller

который через 2 секунды исчезает,

а еще через 2 секунды появляется уже:

ID 045e:028e Microsoft Corp. Xbox360 Controller

А если попадется игра требующая гироскоп (для управления камерой или донаведения камеры; или если сильно шевелишь геймпад, тогда тебя обнаружит монстр в хорроре), тогда:

  1. modprobe hid_nintendo
  2. и переподключить геймпад.

А если опять захочется режим Xbox 360, тогда:

  1. modprobe -r hid_nintendo
  2. и переподключить геймпад.
arzeth_
()
Ответ на: комментарий от arzeth_

Я подключил геймпад при уже запущенной игре, а он остался в режиме Switch (должна была смена на X360), поэтому пришлось создать файл /etc/udev/rules.d/10-disallow-generic-driver-for-switch.rules

# When   
# 1. a gamepad is multi-mode (Switch, X360, PC) and defaults to USB ID 057e:2009
# AND at the same time
# 2. `hid-nintendo` module can't be loaded (blacklisted or not compiled)
# AND at the same time
# 3. there's already a launched game that immediately grabs a gamepad,
#
# Then if you connect such gamepad, it would stay in "Switch Pro" mode,
# but using the fallback `hid-generic` module
# which would result in no vibration/etc despite still being listed as a "Switch Pro Controller".

# But by notifying the gamepad that we abandon to use it as an HID,
# it automatically downgrades to "Xbox 360 Controller" mode.
SUBSYSTEM=="hid", DRIVER=="hid-generic", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="2009", RUN="/bin/sh -c 'echo $id:1.0 > /sys/bus/usb/drivers/usbhid/unbind'"

и sudo udevadm control --reload-rules && sudo udevadm trigger

А еще: в играх от первого лица было нереально на кого-либо навести. Это я исправил с помощью отрицательного deadzone (что вызвало автовращение камеры, которое исправил с помощью --axis-sensitivity).

S=0.5; sudo xboxdrv -d --type xbox360 --silent --axis-sensitivity "X1=$S,Y1=$S,Y2=$S,X2=$S" --device-name 'Microsoft Xbox 360 Controller' --force-feedback --deadzone -2000 --mimic-xpad

В Steam’е (а то, что он предлагает — альтернатива xboxdrv’у) можно вроде тоже настроить отрицательный deadzone.


И оказывается не надо переподключать геймпад после modprobe -r hid_nintendo (чтобы сменить полноценный Switch режим на X360)

arzeth_
()
Ответ на: комментарий от t184256

Поиграть успел или на этом вечер кончился?

Ну вообще я до этого 13 месяцев играл на этом дешёвом геймпаде, но не в игры, где метко целиться, а в Sundered (метроидвания), Valiant Hearts (квест-платформер), Party Hard 2, Spider Man Remastered (2022), Dead Island 1 Remastered (включил автоприцел). Нормально было.

После того, как несколько дней назад спустя год я наконец-то настроил его по-нормальному, я пока успел только часов ~11 в Children of Morta (очень хороший рогалик; что удивительно — иранский), там я все пещерные, затем пустынные уровни закончил. Всё-таки с вибрацией интересней играть. И час поналаживал стики (перебирал параметры xboxdrv), играя в Quake 1 (vkquake).

Зачем вы только берете эти ёбапады?

  1. Решил сэкономить.
  2. С 2010 до 2012 у меня был Xbox 360 Elite, и мне нравился его комплектный геймпад. Помню, что почти как мышью мог метко наводить на головы (без auto-aim) в GTA 4 и Halo 3. И мне стало любопытно, а правда ли всякие 1000-рублёвые могут быть хуже, если они так же выглядят. И если правда, то чем именно хуже. И я тогда решил, что познав это, смогу более качественные геймпады потом выбирать. Вообще я хотел снова иксбоксовый геймпад, но я начитался в отзывах про элитовский за 17000₽ про их частый брак и то, что быстро ломаются.
  3. Дурацкая причина: у многих других был дешёвый геймпад, и у меня пусть тоже побывает.
  4. Любопытно было насколько влияет отрицательно дешёвый/плохой геймпад на впечатления от игры.
  5. Я хотел лепестки сзади, чтобы никогда не тянуться до A/B/X/Y, а их не было у MS геймпада за 7000₽. Я читал, что лепестки суперудобны. А вот свою дешёвку я выбрал, ибо имеет лепестки — 2 штуки. Правда, оказалось, что у меня не лепестки, а две очень громкие круглые кнопки, которые с силою надо нажимать (на грани юзабельности). Еще у меня по бокам бракованные 2 доп. кнопки, до которых слишком сложно дотянуться.

Лишь недавно до меня дошло, что надо было видеообзоры посмотреть перед покупкой. Вот я посмотрел https://www.youtube.com/watch?v=LwxzZCQlYN0 (10 минут видео) — 8BitDo Ultimate — популярный и за 4000₽, однако имеет дурацкую форму рукояток (примерно как у меня), и имеет те же проблемы с крестовиною, что у моей дешёвки. После этого видео, у меня появилось подозрение, что именно из-за формы рукояток мне сложно пальцы располагать одновременно на правом стике и соседней «A».

В конце этого месяца выйдет GuliKit KK3 MAX https://gulikit.com/productinfo/1130420.html ($80 в США), я сейчас о нём мечтаю.

arzeth_
()
18 марта 2024 г.
Ответ на: комментарий от arzeth_

Я уже подзабил на это, пересел на игры с геймпадом на Windows, но вдруг увидел ваш ответ, задебажил получаемые USB ID, получил 045e:028e, добавил в параметры rEFInd usbhid.quirks=045e:028e:i и, наконец, система видит геймпад как Xbox 360, все функции работают. Правда не вышло сделать режим Nintendo Pro, но оно мне и не нужно. Спасибо огромное за ваш ответ!

superlinuxfedora
() автор топика
Ответ на: комментарий от basilic

8bitdo Ultimate пусть лучше берёт, там и 2,4 ГГц, и блютуз, и джойстики на датчиках Холла, которые не поплывут никогда. Да и вообще он удобнее в руках лежит. Говорю со знанием дела, потому что сам этой штукой пользуюсь. Под онтопиком через 2,4 ГГц работает хорошо, блютуз не проверял.

Mobutu_Sese_Seko
()
Ответ на: комментарий от DumLemming

Датчики холла, Bluetooth подключение в том числе по свистку, механические кнопки (довольно приятно нажимаются), турбо режим с Нинтендо контроллера, 2 программируемые кнопки сзади, 2 режима нажатия курков. Понять не могу что тут говеного. Если вот только костыльная работа в режиме Xbox на Линуксе.

superlinuxfedora
() автор топика