Gamepads en Linux y en general... desencantado...

Taller de hardware y cacharreo general de aparatos eléctricos y electrónicos que no tengan un sitio propio.
Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2967
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 68 veces
Gracias recibidas: 322 veces
Contactar:

Gamepads en Linux y en general... desencantado...

Mensajepor zup » 20 Jul 2021, 17:44

Esto tiene mucho de liberar frustración, perdón por el rollaco...

La historia empieza (más bien se ha vuelto intensa) a raíz de que le he comprado un gamepad a mi hijo para el portátil (reciclado con Linux) que le hemos dedicado. El gamepad en concreto es un Nacon GC-100, un gamepad estilo Xbox 360 con cable.

El gamepad en cuestión tiene detrás un interruptor curioso (y creo que muy útil): en una posición el gamepad se presenta como un dispositivo HID y en otro como un XInput. Ahí empieza a complicarse la vida: en modo HID, los botones están mapeados de una manera totalmente diferente a la de XInput. Por otro lado, el módulo xpad (que se encarga de los pads de Xbox en Linux) no reconoce el mando.

QUEJA 1: Modificar xpad.c para que reconozca mi mando es trivial; es más complicado mandar el parche para arriba y que lo incluyan en el kernel (aunque ya lo he hecho previamente). El problema es que probando el mando con LEGO Batman 2, descubrí que los botones X e Y están al revés. No parece un problema del mando, en Windows mi mando oficial de Xbox y el Nacon tienen el mismo mapeado.

Tengo que averiguar si esto es un fallo en xpad, en wine o un bug extraño en LEGO Batman 2... lo que en sí ya es un desafío. Si alguien tiene un mando oficial de Xbox con cable, me gustaría saber si tiene el mismo problema.

QUEJA 2: Cuando uso mi mando en Linux en modo HID, no tengo vibración (pendiente de comprobar si hay vibración en Windows, aunque lo dudo). Mi idea era hacer también un parche en alguno de los módulos que soportan vibración... pero no hay manera de localizar los drivers para mi mando (parece que no los distribuyen, al estar soportado por los drivers de Microsoft), así que no tendo ni idea de a qué se parece ni si admite comandos de vibración en modo HID. Así que ahora mismo no sé cómo ni si se puede meter soporte para vibración en modo HID en Linux.

(Curiosidad: hace años compré un mando Thrustmaster, lo incluí en la lista de mandos "autorizados" en el módulo adecuado... y por semejante tontería me han puesto en los créditos de Linux como desarrollador del núcleo <XX )

QUEJA 3: Recordando ese gamepad Thrustmaster y pensando en los extraños mapeos de botones de los gamepad... ODIO que todo esto no esté estandarizado. HID parece definir el modo de comunicación, pero no la posición física de los botones... por lo que si enchufas mandos de tres marcas diferentes en cualquier equipo tienes casi garantizado que va a haber un mínimo de dos mapeados diferentes.

Al parecer, Linux está intentando estandarizar eso en sus módulos. Ahora quieren llamar a los botones NORTE/SUR/ESTE/OESTE en vez de A, B, X, Y. Eso está bien porque describe la ubicación física del botón en vez de su número... pero no está demasiado extendido y habrá multitud de mandos que NO se actualicen a este estándar (por no hablar de que los mandos genéricos manejados por HID no tendrán esto). Por no hablar de que esto solo sirve para los mandos con cuatro botones a la derecha (p.ej.: Xbox o SNES)... habría que ver qué botón correspondería a ESTE en un mando de Megadrive.

QUEJA 4: Por todo esto, sería una gran idea que los sistemas incluyeran de serie algún tipo de mapeador de botones. Aunque hay paquetes tanto para Windows como para Linux, no es extraño (sobre todo en Windows) que dejen de funcionar al actualizar, o que el sistema proteste porque intentas instalar un controlador no firmado.

QUEJA 5: ¿Estaba patentada la distribución de botones del controlador de SNES? Siempre me ha chirriado que SNES y Xbox utilicen la denominación A, B, X, Y... con las letras en diferentes botones. Esto lleva a cierta "dislexia" si usas un mando de Xbox con un emulador de SNES... la X no solo no marca el lugar, sino que está adrede en un sitio diferente.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
Yomes
MSX Turbo R
MSX Turbo R
Mensajes: 365
Registrado: 04 Oct 2009, 21:55
Sistema Favorito: PC
primer_sistema: PC
consola_favorita: Nintendo SNES
Primera consola: Nintendo GameBoy
Gracias dadas: 374 veces
Gracias recibidas: 34 veces

Re: Gamepads en Linux y en general... desencantado...

Mensajepor Yomes » 20 Jul 2021, 19:18

Ufff... Yo llevo tendiendo todos esos problemas, y más, tanto en Windows como en Linux, con todos los mandos y adaptadores que se me han cruzado en el camino.

Lo de la vibración siempre, siempre es un problema.
Para empezar, en DirectInput (y su equivalente en Linux... del que no recuerdo el nombre) no es estándar. Cada fabricante lo incorpora a su manera en sus drivers, y cada programa los reconoce también como le viene (Steam, ePSXe...). En Linux nunca he conseguido que funcione con ninguno de mis mandos ni adaptadores (tengo 3 ó 4 de PSX/PS2 a USB). Curiosamente, en Emuelec me funciona bastante bien con los mismos adaptadores y sin tocar nada (bueno, excepto que sólo usa un mismo motor para todo, en vez de usar los dos motores por separado).
En XInput (el estándar de los mandos de XBox) suele funcionar... después de trastear un rato con xboxdrv para que acepte que del dev_ven_ de un mando genérico compatible corresponde con uno de XBox (pondré lo que me ha funcionado a mí en un sopiler al final del post, porque tiene tela...).

Lo del mapeado es otro dolor. Si sólo tienes un mando, pues configuras cada juego, emulador o programa a tu gusto y listo. Si tienes ms de un mando, pues te toca reconfigurarlo todo cada vez. Pero vamos, eso es así en Windows, en Linux y en AmigaOS, si nos ponemos.

Y lo de la disposición de botones Nintendo vs Microsoft, de hecho viene por la vieja pelea Nintendo vs Sega. Ya en su momento, la NES tenía los botones A y B al contrario que la Master System (o viceversa). XBox heredó los controles de Dreamcast (A, B, X e Y), que eran justo los opuestos a los de SNES.
La verdad, considerando que el estándar más habitual hoy día es XInput, no entiendo por qué los programas tienden a esperar la disposición de SNES (sin ir más lejos, EmuElec la usa, y además no permite cambiarla sin desajustar el control de todos los emuladores integrados).
Y ojo cuidao, que los de PlayStation van a su bola, pero siempre estará la batalla entre controles orientales y occidentales (X y O en la misma posición... con funciones invertidas).

Ah, yo estoy usando dos mandos Logitech F710, que también tienen el interruptor para cambiar entre DirectInput y XInput. Suelo ponerlos en XInput, porque la vibración da menos problemas y los gatillos L1 y R1 son analógicos (en modo DirectInput ser consideran o botones digitales o ejes de un joystick, por lo que son más complicados de configurar), así que sé lo problemáticos que puede ser. :lol:

Cómo resolví la vibración de mandos genéricos en Linux (creo recordar que en Ubuntu 20.04):
Spoiler: Mostrar
Ojo, donde pone 0e6f:0413 es sólo para el mando que tengo yo. Para averiguar cuál es el correcto, habría que mirarlo con un lsusb.
Y el usuario, obviamente, será el del sistema (en mi caso, yomes).

1º Editar el archivo:
sudo nano /etc/modprobe.d/blacklist.conf
2º Añadir al final del documento:
blacklist xpad
3º Desactivar el driver:
sudo rmmod xpad
4º Comprobar que está desactivado:
lsmod | grep xpad
No debería mostrar nada...
5º Añadir al usuario:
sudo adduser yomes input
6º Activar los drivers:
modprobe uinput
modprobe joydev
7º Ejecutar el driver:
sudo xboxdrv --device-by-id 0e6f:0413 --type xbox360 -R

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2967
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 68 veces
Gracias recibidas: 322 veces
Contactar:

Re: Gamepads en Linux y en general... desencantado...

Mensajepor zup » 21 Jul 2021, 10:23

Bueno, avanzando un poco...
- Subimos la apuesta. No solo X e Y me aparecen invertidos en Wine, sino que LT y RT no funcionan.
- Acerca de X e Y, no es un bug de LEGO Batman (pasa en otros programas). Tampoco parece ser un bug de xpad, ya que el orden de los botones A/B/X/Y es el mismo en Windows que en Linux (0/1/2/3). Me faltaría ejecutar un programa que me diga qué número de botón estoy pulsando en Wine para confirmar que el bug está en Wine.
- Si uso winetricks y le pongo xinput... el mando deja de funcionar en Wine :shock:
- Acerca de LT y RT, parece ser que el driver de Windows mapea ambos botones a un solo eje, mientras que el driver de Linux los trata como separados. Pero la teoría no tiene mucha base, ya que incluso estando separados, el eje debería moverse cuando pulso el trigger correspondiente.

Yomes escribió:Lo de la vibración siempre, siempre es un problema.
Para empezar, en DirectInput (y su equivalente en Linux... del que no recuerdo el nombre) no es estándar. Cada fabricante lo incorpora a su manera en sus drivers, y cada programa los reconoce también como le viene (Steam, ePSXe...).

Por lo que he visto en las especificaciones, la vibración nunca ha estado presente en HID. Como bien dices, depende de que instales los drivers correctos... si no tienes drivers y lo dejas a su bola, Windows lo reconocerá pero no tendrás vibración.

En Linux funciona parecido, esto es lo que he observado (probablemente esté mal)...
- Linux lee la ID del dispositivo USB, y su especificaciones.
- Si no tiene clase asignada o es propietaria, intentará buscar un módulo que coincida con la ID del dispositivo. Este es el caso de los mandos de Xbox, que van a parar al módulo xpad.c... o si lo metes en la blacklist acabarán sin reconocerse (y usarás xboxdrv).
- Si reconoce su clase, intentará cargar un módulo genérico (hid-core) para manejarlo. En muchos mandos, la cosa acaba aquí... y hid-core no tiene soporte para vibración.
- Peeero... hid-core tiene una blacklist. Si la ID se encuentra aquí, se buscará otro módulo que se haga cargo del mando. En el caso de mi Thrustmaster DualTrigger 3-in-1, éste módulo es hid-tmff... que SÍ soporta vibración.

Yomes escribió:En Linux nunca he conseguido que funcione con ninguno de mis mandos ni adaptadores (tengo 3 ó 4 de PSX/PS2 a USB).

De los mandos que tengo, el Nacon en modo Xinput, el Thrustmaster DualTrigger 3-in-1 y el único adaptador a PS/2 que tengo tienen todos vibración (probado con fftest).

Mi adaptador es un EMS DualShooter II (según el paquete) o EMS USB2 (según la web), con la ID 0B43:0003. Es un adaptador que me salió algo caro porque lo compré específicamente para manejar pads de baile. La característica especial es que mapea la cruceta analógica (que habitualmente son ejes) a botones... parece una tontería, pero si son ejes no puedes pisar arriba/abajo a la vez. Al margen de esto, el problema que tengo con él ahora es que no tiene drivers para sistemas de 64 bits :(

Yomes escribió:En XInput (el estándar de los mandos de XBox) suele funcionar... después de trastear un rato con xboxdrv para que acepte que del dev_ven_ de un mando genérico compatible corresponde con uno de XBox (pondré lo que me ha funcionado a mí en un sopiler al final del post, porque tiene tela...).

Bueno, la idea era meterlo en xpad para que el cacharro funcione sin instalar nada más. xboxdrv tiene sus ventajas, como el mapeador, pero le veo dos problemas:
- Su sistema de compilación está basado en python 2... por lo que en algunas distribuciones no se compila correctamente.
- Parece un poco abandonado.

El tema es que si parcheo xboxdrv para que reconozca mi gamepad directamente (sin hacer scripts), también tendría que hacer un parche para que compile en distribuciones python 3... y como no parece muy activo no tengo seguridad de que ambos parches se incorporen a los fuentes oficiales y acaben en los repositorios de paquetes de las distribuciones.

Yomes escribió:Y lo de la disposición de botones Nintendo vs Microsoft, de hecho viene por la vieja pelea Nintendo vs Sega. Ya en su momento, la NES tenía los botones A y B al contrario que la Master System (o viceversa). XBox heredó los controles de Dreamcast (A, B, X e Y), que eran justo los opuestos a los de SNES.

Como curiosidad, tengo dos gamepads USB con la forma de SNES y de diferentes fabricantes... y los dos tienen diferentes distribuciones de botones (en uno el botón B es el 1 y en el otro el 2). Ni usando la misma carcasa se ponen de acuerdo.

Yomes escribió:Ah, yo estoy usando dos mandos Logitech F710, que también tienen el interruptor para cambiar entre DirectInput y XInput.

Creo que ese fue uno de los primeros mandos no Microsoft y compatibles con XInput que se lanzaron. No lo compré (acabé con uno inalámbrico de Xbox 360) porque me parecía caro y estaba un poco mosqueado con la calidad de los gamepads de Logitech.

Está soportado directamente en xpad... ¿puedes comprobarme que los botones están todos bien ordenados tanto en xboxdrv como en xpad? Me interesan especialmente X/Y y los gatillos.

El programa que utilizo para comprobarlo (a falta de un opción mejor) es el xInput Controller Tester. Para no deshacer todos los cambios que tienes en tu distribución, puedes usar una live que incluya wine (p.ej.: Knoppix).
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
Yomes
MSX Turbo R
MSX Turbo R
Mensajes: 365
Registrado: 04 Oct 2009, 21:55
Sistema Favorito: PC
primer_sistema: PC
consola_favorita: Nintendo SNES
Primera consola: Nintendo GameBoy
Gracias dadas: 374 veces
Gracias recibidas: 34 veces

Re: Gamepads en Linux y en general... desencantado...

Mensajepor Yomes » 21 Jul 2021, 13:35

Ufff... Muchas cosas, vayamos por partes.
zup escribió:Bueno, avanzando un poco...
- Si uso winetricks y le pongo xinput... el mando deja de funcionar en Wine :shock:
- Acerca de LT y RT, parece ser que el driver de Windows mapea ambos botones a un solo eje, mientras que el driver de Linux los trata como separados. Pero la teoría no tiene mucha base, ya que incluso estando separados, el eje debería moverse cuando pulso el trigger correspondiente.

Recuerdo haber trasteado con eso en su momento y tuve que instalar xinput en la unidad virtual de Wine para que funcionara.
Yo uso PlayOnLinux, y fue tan fácil como añadir el "componente". Sé que lo hace a través de Winetricks, pero la interfaz es distinta.
Ahora no tengo nada de eso instalado (hace algo más de un año cambié de Ubuntu a Debian y no he estado jugando en el ordenador), pero recuerdo que me funcionó a la primera con un mando genérico de XBox360.
zup escribió:En Linux funciona parecido, esto es lo que he observado (probablemente esté mal)...
- Linux lee la ID del dispositivo USB, y su especificaciones.
- Si no tiene clase asignada o es propietaria, intentará buscar un módulo que coincida con la ID del dispositivo. Este es el caso de los mandos de Xbox, que van a parar al módulo xpad.c... o si lo metes en la blacklist acabarán sin reconocerse (y usarás xboxdrv).
- Si reconoce su clase, intentará cargar un módulo genérico (hid-core) para manejarlo. En muchos mandos, la cosa acaba aquí... y hid-core no tiene soporte para vibración.
- Peeero... hid-core tiene una blacklist. Si la ID se encuentra aquí, se buscará otro módulo que se haga cargo del mando. En el caso de mi Thrustmaster DualTrigger 3-in-1, éste módulo es hid-tmff... que SÍ soporta vibración.

Pues ya sabes más que yo. :lol:
Por cierto, desde hace años tengo un Thrustmaster DualTrigger 2-in-1 (USB y PS2) y nunca me ha funcionado la vibración en Linux, pero sí en Windows (con el driver del fabricante) y PS2.
zup escribió:
Yomes escribió:En Linux nunca he conseguido que funcione con ninguno de mis mandos ni adaptadores (tengo 3 ó 4 de PSX/PS2 a USB).

De los mandos que tengo, el Nacon en modo Xinput, el Thrustmaster DualTrigger 3-in-1 y el único adaptador a PS/2 que tengo tienen todos vibración (probado con fftest).

Yo he trasteado bastante con fftest en todos mis mandos (HID) y el resultado es siempre el mismo: ninguno en absoluto. En Windows lo he conseguido con aquellos para los que he conseguido drivers... y no siempre.
zup escribió:Bueno, la idea era meterlo en xpad para que el cacharro funcione sin instalar nada más. xboxdrv tiene sus ventajas, como el mapeador, pero le veo dos problemas:
- Su sistema de compilación está basado en python 2... por lo que en algunas distribuciones no se compila correctamente.
- Parece un poco abandonado.

El tema es que si parcheo xboxdrv para que reconozca mi gamepad directamente (sin hacer scripts), también tendría que hacer un parche para que compile en distribuciones python 3... y como no parece muy activo no tengo seguridad de que ambos parches se incorporen a los fuentes oficiales y acaben en los repositorios de paquetes de las distribuciones.

Eso ya me supera. Yo lo instalé de los repositorios de Ubuntu y funcionó, es todo lo que sé.
zup escribió:Como curiosidad, tengo dos gamepads USB con la forma de SNES y de diferentes fabricantes... y los dos tienen diferentes distribuciones de botones (en uno el botón B es el 1 y en el otro el 2). Ni usando la misma carcasa se ponen de acuerdo.

Es uno de los fallos del estándar HID: la asignación de botones depende del fabricante. He visto incluso mandos que consideran la cruceta como botones individuales, o como dos ejes analógicos (sin serlo), o los botones A, B, X, Y como una segunda cruceta. Es un caos, y creo que por eso se han vuelto tan populares los basados en XInput.
zup escribió:
Yomes escribió:Ah, yo estoy usando dos mandos Logitech F710, que también tienen el interruptor para cambiar entre DirectInput y XInput.

Creo que ese fue uno de los primeros mandos no Microsoft y compatibles con XInput que se lanzaron. No lo compré (acabé con uno inalámbrico de Xbox 360) porque me parecía caro y estaba un poco mosqueado con la calidad de los gamepads de Logitech.

Bueno, la cruceta es un poco pesturra, pero por lo demás van genial: son cómodos, los joysticks tienen buen recorrido (esto es, van dando valores del 0 al 255 regularmente, y no sólo en una parte del recorrido, como pasa con muchos mandos baratos), las pilas me han estado durando alrededor de un año...
Luego está el problema de que el dongle USB al que se conectan consume tan poco que muchos equipos desactivan la alimentación USB a los pocos minutos porque creen que no hay nada conectado. La solución ha sido conectarlos a un HUB de los que llevan luz para que drene más corriente y el equipo no lo desactive. :lol:
Yo los compré por eBay (por separado), y me salieron por 12 y 15€, si no recuerdo mal. No he encontrado mandos originales de XBox360 con el dongle USB por menos de 40... y sin él no sirven en PC.
zup escribió:Está soportado directamente en xpad... ¿puedes comprobarme que los botones están todos bien ordenados tanto en xboxdrv como en xpad? Me interesan especialmente X/Y y los gatillos.

El programa que utilizo para comprobarlo (a falta de un opción mejor) es el xInput Controller Tester. Para no deshacer todos los cambios que tienes en tu distribución, puedes usar una live que incluya wine (p.ej.: Knoppix).

Ahora no tengo tiempo de ponerme a trastear. Esta tarde, o quizá mañana, lo intentaré. No hay problemas con la configuración de mi equipo: ahora mismo no tengo instalado ningún mando.

Avatar de Usuario
Yomes
MSX Turbo R
MSX Turbo R
Mensajes: 365
Registrado: 04 Oct 2009, 21:55
Sistema Favorito: PC
primer_sistema: PC
consola_favorita: Nintendo SNES
Primera consola: Nintendo GameBoy
Gracias dadas: 374 veces
Gracias recibidas: 34 veces

Re: Gamepads en Linux y en general... desencantado...

Mensajepor Yomes » 21 Jul 2021, 15:23

Al final he sacado un rato a mediodía. Me pongo a ello. Estoy usando uno de mis F710 en modo XInput.

- Usando el módulo xpad en el lado de Linux, jstest-gtk muestra el mando y todo parece ir bien (si bien este programa no muestra la disposición de los botones). Los gatillos analógicos (LT y RT) son considerados ejes de un joystick, partiendo el valor 0 de la esquina superior izquierda.
Tras instalar xinput en una unidad virtual de Wine, desde el panel de control me reconoce el mando perfectamente, pero no funciona la vibración. El Xinput Controller Test no detecta el mando.

- Usando el módulo xboxdrv (con las instrucciones que puse en el spoiler), jstest-gtk muestra el mando y todo parece ir bien. Los gatillos analógicos (LT y RT) son considerados "elevadores" (ejes independientes, no parte de un joystick).
En Wine, desde el panel de control me reconoce el mando perfectamente pero el gatillo derecho tiene un comportamiento extraño: en modo "event" no hay ninguna reacción, y en modo "js" actúa sobre el mismo eje que el joystick izquierdo vertical. En la pestaña ForceFeedback no aparece siquiera el mando.
El Xinput Controller Test hace cosas muy raras:
  • Los botones A, B, X e Y están bien mapeados.
  • El eje vertical izquierdo mueve también el horizontal derecho.
  • El joystick izquierdo... ¿cómo lo explico? Si lo muevo en diagonal, de inferior izquierda a superior derecha, mueve el eje vertical de arriba a abajo (encima, invertido). En cualquier otra dirección no hace nada.
  • El gatillo izquierdo controla el eje vertical del joystick derecho, y el gatillo derecho controla el horizontal, partiendo siempre de la esquina superior izquierda.
  • Los botones Start y Select controlan los gatillos izquiedo y derecho, respectivamente.
Después de cerrarlo he caído en la cuenta de que no había probado los botones L3 y R3. Lo abro de nuevo y... Ahora tiene un comportamiento completamente distinto. Parece que esté mapeando los controles según cambia el viento. ](*,)

Vamos, un auténtico desastre.

Avatar de Usuario
GXY
Amiga 1200
Amiga 1200
Mensajes: 1445
Registrado: 05 Oct 2013, 08:21
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Sony PlayStation 1
Gracias dadas: 36 veces
Gracias recibidas: 119 veces

Re: Gamepads en Linux y en general... desencantado...

Mensajepor GXY » 21 Jul 2021, 22:49

ya en windows lo de los pads es una tocada de webs considerable, pues en linux sera aun peor.

el "estandar no estandar" en PC desde hace años es el mando de xbox (el de X360, principalmente) tanto en disposicion de los botones como en funciones... pero luego cada fabricante hace lo que le sale de los huevos.

quereis leer una buena? el pad que viene con la caja android nvidia shield. para usarlo, el controlador necesario es el de la grafica (que por supuesto, tiene que ser nvidia). nvidia no ha querido hacer un driver independiente para que puedas utilizar su mando en un PC. por supuesto, alguien se curro un hack, el cual medio funciona.

no. ni hay estandar ni lo va a haber. no lo ha hecho ni microsoft que llevan haciendo pads para consola 20 años y desde hace 15 años son los "estandar" en windows.
RetroPescando... :mrgreen:

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2967
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 68 veces
Gracias recibidas: 322 veces
Contactar:

Re: Gamepads en Linux y en general... desencantado...

Mensajepor zup » 22 Jul 2021, 10:10

Siguiendo con el tema...

No sé dónde está el problema, pero creo que está más allá de mi alcance. Después de un par de sesiones de pruebas, he llegado a estas conclusiones:
- xpad.c (incluido mi parche) funcionan (casi) tal y como se espera de ellos. El único problema es que xpad entrega los dos gatillos como ejes independientes, mientras que el driver de windows a veces los "fusiona" en un solo eje. Supongo que en cuanto eche un ojo a la documentación correcta, enviaré el parche a kernel.org.
- Aunque no hace falta modificar xboxdrv para que funcione con mi mando, le echaré un ojo (con eso se evita escribir una línea de comandos kilométrica).
- El problema de los controles "descolocados" lo provoca Wine, más concretamente XInput en Wine. Aunque al ejecutar el panel de control de Wine los botones aparecen donde deben, cuando entra en juego XInput se descolocan. Imagino que esto es debido a que Wine intenta emular un mando XInput con lo que tenga enchufado (un poco como x360ce), y reparte los controles como le da la gana. En los dos equipos en los que lo he probado (Wine 4 y Wine 5), cambia el comportamiento. Me pregunto si habrá alguna manera de cambiar ese mapeado...
- Cada vez que he instalado xinput en wine, el mando falla miserablemente.

En fin, en otro orden de cosas...
Yomes escribió:Por cierto, desde hace años tengo un Thrustmaster DualTrigger 2-in-1 (USB y PS2) y nunca me ha funcionado la vibración en Linux, pero sí en Windows (con el driver del fabricante) y PS2.

Mirando en el fuente de hid-tmff.c, ese mando SÍ debería tener vibración. El módulo reconoce la ID 044f:b320, si al conectarlo y hacer lsmod no ves hid-tmff por ninguna parte, intenta cargarlo a mano.

Yomes escribió:Yo he trasteado bastante con fftest en todos mis mandos (HID) y el resultado es siempre el mismo: ninguno en absoluto. En Windows lo he conseguido con aquellos para los que he conseguido drivers... y no siempre.

Por lo que he visto, depende del dispositivo que uses. Si vas a /dev/input, verás que existe un js0; si vas a /dev/input/by-id se ven DOS dispositivos. Uno de ellos lee los datos con jstest pero no tiene vibración, el otro (creo que el que se apellida event) lee datos y tiene vibración. /dev/js0 es un enlace a uno de los dos, y en principio debería ser al "bueno"... por si las moscas usa fftest en los dispositivos de /dev/input/by-id a ver si te funciona (Wine parece pillar el correcto, en el panel de control me ha funcionado la vibración).

Yomes escribió:Yo los compré por eBay (por separado), y me salieron por 12 y 15€, si no recuerdo mal. No he encontrado mandos originales de XBox360 con el dongle USB por menos de 40... y sin él no sirven en PC.

¿Estamos hablando de los mismos mandos? Logitech lanzó una versión muy recortada (F310, sin vibración y con cable) que sí estaba algo más barata, pero la F710 estaba carísima (al menos nueva). A mí los mandos de Xbox 360 me salieron por unos 40€ con dongle (nuevos), aunque ahora uso uno de Xbox One con un pincho bluetooth genérico.

Yomes escribió:Al final he sacado un rato a mediodía. Me pongo a ello. (...)

Son exactamente los mismos síntomas que he tenido por aquí (salvo lo de los botones movidos que solo me pasa en uno de los equipos de prueba). Como he dicho, a mi me parece un tema de Wine/XInput... tengo que probar a ver qué pasa con un Wine 6... si encuentro una distro live que lo soporte.

Acerca de cómo se presentan los controles:
Esto ha surgido en la discusión, lo cuento tal y como lo veo:
- X/Y como analógicos (incluso en crucetas): Tradicionalmente, X e Y han sido analógicos en el mundo del PC y esto ha sido portado tanto a USB HID como a XInput. Todos los programas esperan encontrar un eje X y un eje Y que devuelve valores analógicos, y esto es lo que hay. Tampoco es mucho problema... si tienes una cruceta que es digital, pues haces que tu mando devuelva uno de tres valores (izquierda-centro-derecha); desde el punto de vista del programador puedes poner que si X > 10000, vas a la derecha (ese 10000 sería una zona muerta en el centro, tunearla puede ser un arte) y te vale tanto para crucetas como para sticks.
- Crucetas como botones separados: En PC lo he visto solo cuando ya hay un dispositivo X/Y (=un stick) en el mando, y casi siempre aplicado a pads de baile. En los pads de baile hay flechas arriba, abajo, izquierda y derecha (que suelen presentarse como una cruceta), y el jugador habitualmente tiene dos pies. De vez en cuando, en pantalla aparecen combinaciones de dos direcciones opuestas (p.ej.: arriba y abajo) para pisar a la vez... si la cruceta fuera analógica no habría forma de determinar la diferencia entre no pisado y ambas pisadas a la vez. De acuerdo que es una configuración muy específica para un grupo minoritario de usuarios, pero viendo un vídeo del Dance Dance Revolution se puede ver la lógica.
- Gatillos juntos/separados: Gatillos juntos tiene sentido en un simulador de vuelo, donde los puedes usar como timón; gatillos separados es lo mejor para juegos de coches donde puedes tener acelerador y freno separados y activarlos simultáneamente. No sé hasta qué punto Microsoft ha decidido por nosotros (en el panel de control los dos gatillos aparecen como juntos)... en Linux (usando xboxdrv) puedes elegir cómo quieres que se vean.
- XInput como paso atrás: Y es que lo es. Aunque no se puede negar que ha estandarizado la disposición de botones tanto en juegos como en mandos, reduce sustancialmente la cantidad de ejes/botones que se pueden usar. Antes de XInput, ya existían joysticks HOTAS con más ejes y botones de los que permite XInput. Supongo que, mientras exista DirectInput, los simuladores de vuelo seguirán usandolo... y cuando desaparezca, habrá dispositivos que se presentarán como varios gamepads de Xbox y serán una pesadilla de configurar.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
Yomes
MSX Turbo R
MSX Turbo R
Mensajes: 365
Registrado: 04 Oct 2009, 21:55
Sistema Favorito: PC
primer_sistema: PC
consola_favorita: Nintendo SNES
Primera consola: Nintendo GameBoy
Gracias dadas: 374 veces
Gracias recibidas: 34 veces

Re: Gamepads en Linux y en general... desencantado...

Mensajepor Yomes » 22 Jul 2021, 15:27

Pues tendría que mirar varias de las cosas que apuntas, pero hoy no será un buen día, así que... Bueno, todo se andará. Gracias por la información.

Sí, los que tengo son ambos F710, inalámbricos y con vibración. Los compré por eBay de segunda mano, a particulares, y ambos vinieron usados pero en perfecto estado. Estuve bastante tiempo buscando y filtrando anuncios, y ya se sabe: el que la sigue la persigue. :lol:
Reconozco que con los de XBox no busqué tanto tiempo, pero sí que eran bastante caros. De hehco, tengo uno original con el joystick estropeado y pensaba buscarle un dongle para poder repararlo y quedármelo, pero no encontré ninguno a un precio decente.

Por cierto, no entiendo cómo es posible que Emuelec (que no deja de ser un Linux) y otras distros similares (P.Ej.: Lakka en PC), reconozca todos los mandos que le he puesto sin problemas, con vibración y sin tener que pelear con configuraciones ignotas y módulos y drivers y hechizos y encantamientos. Enchufar, asignar botones y a funcionar. ¿No se podría sacar de ahí la información necesaria para que funcionaran en otras distribuciones?

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2967
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 68 veces
Gracias recibidas: 322 veces
Contactar:

Re: Gamepads en Linux y en general... desencantado...

Mensajepor zup » 22 Jul 2021, 19:49

Pues, hay tres razones por las que no es así (a nivel de kernel):
a) Como dicen en los vídeos que le gusta ver a mi mujer... "aquí no hacemos esas cosas".
b) Se me ocurren una maneras de hacerlo, pero no creo que sea buena idea.
c) Técnicamente, lo que haces en esas distribuciones no es un tema del kernel.

Me explico:

a) El trabajo de un driver es simplemente comunicar un dispositivo. En el caso del driver de un mando, el driver lee el estado del mando mediante el protocolo adecuado (HID, XInput, gameport, bluetooth... lo que sea) e informa al kernel de su estado. Si ve que el botón 0 está pulsado, pues le dice al kernel que lo está. Por una parte, no es trabajo del driver (sobre todo en los genéricos) saber la ubicación física del botón 0; por otra parte, un driver tampoco debería falsear los datos que entrega el dispositivo (por ejemplo, remapeando los botones). Esto es así en Linux y en Microsoftlandia.

b) Quizás se podría impementar un fichero de configuración externo a los módulos para remapear botones y ejes. El problema es que habría que poner funciones para leerlo en toooodos los módulos que encuentres en el directorio drivers/input/joystick, y en algunos de drivers/hid.

Esto tiene dos problemas: el primero es que tendrías que tener montones de configuraciones almacenadas (y teniendo en cuenta que algunos dispositivos chinorris reutilizan las ID de USB, algunos serían identificados de manera incorrecta); el segundo es que para eso ya hay programas que remapean ejes y botones y hacen bien el trabajo.

c) Lo primero de todo es recordar algo evidente... Linux ha avanzado mucho de unos años a esta parte. La lista de dispositivos que se enchufan al ordenador y funcionan sin invocar a satanás es ahora mucho mayor que hace años. La primera vez que hice experimentos con Linux (con mi 486), casi había que seleccionar el hardware para hacer funcionar Linux; desde hace 10 años a esta parte es raro que algo no funcione a la primera... y muchas veces si no funciona a la primera, al menos funciona parcialmente (y tocando algún fichero de configuración lo terminas de meter en vereda).

El hecho de que el hardware te funcione en Emuelec, significa que está soportado en el kernel... si en otra distribución no funciona (p.ej.: Debian suele ir algo por detrás) es cuestión de esperar a que actualicen esos paquetes. Pero lo realmente importante es que creo que tanto emuelec como Lakka están basadas en libretro.

Libretro es una librería que es una angel y un puto demonio a la vez. Por una parte (y esto es lo que te afecta), libretro ofrece a los programas una interfaz consistente y común tanto de entrada como de salida. Cuando tú asignas los botones para tu mando, en alguna parte de las configuraciones de libretro se guarda esta información; al ser un sistema de entrada común para todos los emuladores, cualquier programa basado en libretro leerá esta información y la usará... de repente, mágicamente, todos los programas funcionan bien.

Aquí hay un pequeñísimo problema... si tu programa no está basado en libretro, esto no le influye y usará los mapeos que le mande el driver o la que le venga en gana (por defecto, en fichero de configuración, configurado a través de menú). El "truco" de emuelec, lakka o retropie es que prácticamente todos los emuladores y juegos que incluyen son basados en libretro. Si en un linux normal quisieras instalar Doom, buscarías prboom o gzdoom... aquí te vas a encontrar lr-doom (un port de doom a... exactamente, libretro). Lo mismo para lr-mame, lr-dosbox y compañía.

En ese sentido, libretro es un ángel que viene a salvarnos de la dificultad de configurar todos los emuladores (como si no lo hiciéramos en Windows o en Mac); y es un puñetero demonio en el sentido de que no todos los ports a libretro son de alta calidad... es de comprender que algunos programadores estén negros porque les preguntan por bugs que en sus emuladores no existen y son cuestión del port de turno.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
Yomes
MSX Turbo R
MSX Turbo R
Mensajes: 365
Registrado: 04 Oct 2009, 21:55
Sistema Favorito: PC
primer_sistema: PC
consola_favorita: Nintendo SNES
Primera consola: Nintendo GameBoy
Gracias dadas: 374 veces
Gracias recibidas: 34 veces

Re: Gamepads en Linux y en general... desencantado...

Mensajepor Yomes » 23 Jul 2021, 02:32

Vaya, pues me ha quedado bastante más claro. ¡Gracias!


Volver a “Taller general”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados