Esta pagina se ve mejor con JavaScript habilitado

Gamepads y Emuladores bajo FreeBSD

 ·  🎃 kr0m

El lanzamiento de FreeBSD 13.0 vino cargado de novedades en cuanto al sistema HID se refiere, además se añadieron varios drivers de gamepads muy conocidos como PS4 y Xbox

En mi caso dispongo de varios gamepads:

XBox One 8BitDo Pro2
Logitech RumblePad2 iBuffalo

Algunos gamepads funcionarán con el driver específico y otros con el genérico hgame , en mi caso todos funcionarán con hgame a excepción del de Xbox One ya que utilizará xb360gp y webcamd .

hgame -> Generic HID game controller (joystick/gamepad) driver
xb360gp -> XBox 360 gamepad driver
webcamd -> Daemon which provide access to USB webcam, USB DVB, USB radio, USB input, USB tablet and more devices

NOTA: Toda la configuración se ha realizado en un sistema FreeBSD 13.1 con el kernel GENERIC, tanto el gamepad de XBoxOne como el 8BitDo son inalámbricos, el primero mediante un adpatador USB y el segundo vía bluetooth, pero no he conseguido que funcionen de forma inalámbrica ninguno de ellos. Otro detalle es que los mandos de XBoxOne, 8bitDo y Logitech soportan vibración pero tampoco he conseguido que funcione ninguno.

Las instrucciones de configuración son las siguientes:


Habilitar el USB-HID y reglas evdev:

Habilitamos el soporte USB-HID en el loader de FreeBSD:

vi /boot/loader.conf

hw.usb.usbhid.enable="1"

Cargamos el módulo correspondiente:

kldload usbhid
sysrc kld_list+=usbhid

Definimos algunas reglas de evdev para que nuestro usuario sea capaz de acceder al dispositivo:

vi /etc/devfs.rules

[system=10]
add path 'usb/*' mode 0660 group operator

[localrules=10]
add path 'input'   mode 0775 group wheel
add path 'input/*' mode 0660 group wheel
sysrc devfs_system_ruleset=“system”
service devfs restart

NOTA: Estas reglas solo son necesarias para los mandos 8BitDo, Logitech y ibuffalo, digámos los mandos genéricos.

Reiniciamos para que aplique los cambios del loader.

shutdown -r now

Herramientas de testeo:

Instalamos algunas herramientas que nos resultarán útiles para comprobar si los gamepads están funcionando correctamente:

pkg install jstest-gtk antimicro

jstest-gtk nos proporcionará de forma sencilla el nombre de los botones y los ejes utilizados, antimicro también pero de una forma mas confusa, pero antimicro tiene una peculiaridad y es que es capaz de mapear botones del mando como si de teclas del teclado se tratase, de este modo podremos jugar con el mando incluso en juegos que no lo soportan.


XBox One:

Este mando es mi preferido sin ninguna duda, es cómodo, los materiales de muy buena calidad y versátil ya que funciona en cualquier sistema operativo de PC y en la propia XBox, este es detectado del siguiente modo por FreeBSD:

dmesg usbconfig
ugen0.9: at usbus0 ugen0.9: at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (500mA)

Para que funcione tan solo debemos cargar el módulo cuse:

kldload cuse
sysrc kld_list+=cuse

Y arrancar webcamd, pero primero lo arrancaremos manualmente para asegurarnos de que no falla nada:

webcamd -d 0.9

webcamd 12588 - - Attached to ugen0.9[0]
webcamd 12588 - - Creating /dev/input/event13
webcamd 12588 - - Creating /dev/input/js0
Ctrl+c

Comprobamos mediante jstest-gtk y antimicro que se detectan las pulsaciones de los botones:

Ahora que estamos seguros de que funciona correctamente lo arrancamos como servicio, Webcamd es llamado de forma automática por evdev pasándole el puerto donde se conectó el gamepad, de este modo funciona de forma dinámica conectemos donde conectemos el gamepad:

sysrc webcamd_enable=YES
service webcamd start


8bitDo pro2:

Este fabricante es muy conocido entre los retro-gamers también es muy buen mando pero su ergonomía no es tan buena como la del mando de XboxOne, este es detectado del siguiente modo por FreeBSD:

dmesg usbconfig
ugen0.2: <8BitDo 8BitDo Pro 2> at usbus0 ugen0.2: <8BitDo 8BitDo Pro 2> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (480mA)

Para este mando será necesario cargar el módulo genérico:

kldload hgame
sysrc kld_list+=hgame

NOTA: El único inconveniente de utilizar el driver genérico es que identificar los botones será un poco mas complicado ya que solo podremos utilizar antimicro.

Comprobamos que se detectan los botones correctamente:


Logitech RumblePad2:

En cuanto al Logitech se trata de un mando muy antiguo, pero que sigue funcionando como el primer día, este es detectado del siguiente modo por FreeBSD:

dmesg usbconfig
ugen0.2: <Logitech Logitech RumblePad 2 USB> at usbus0 ugen0.2: <Logitech Logitech RumblePad 2 USB> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON (500mA)

Este mando también utilizará el módulo genérico, si no lo hemos hecho antes, cargamos el módulo:

kldload hgame
sysrc kld_list+=hgame

NOTA: El único inconveniente de utilizar el driver genérico es que identificar los botones será un poco mas complicado ya que solo podremos utilizar antimicro.

Comprobamos que se detectan los botones correctamente:


iBUFFALO:

Este mando es un tanto especial ya que simula un mando de SuperNintendo, genial para jugar a juegos antiguos 2D.

dmesg usbconfig
ugen0.2: <vendor 0x0583 USB,2-axis 8-button gamepad> at usbus0 ugen0.2: <vendor 0x0583 USB,2-axis 8-button gamepad> at usbus0, cfg=0 md=HOST spd=LOW (1.5Mbps) pwr=ON (100mA)

Este mando también utilizará el módulo genérico, si no lo hemos hecho antes, cargamos el módulo:

kldload hgame
sysrc kld_list+=hgame

NOTA: El único inconveniente de utilizar el driver genérico es que identificar los botones será un poco mas complicado ya que solo podremos utilizar antimicro.

Comprobamos que se detectan los botones correctamente:


NES/SNES/GAMEBOY/GAMEBOY-ADV:

Instalamos Mednafen:

pkg install mednafen

Cargamos la ROM deseada:

mednafen ROM_PATH

Podemos ver que ha detectado los cuatro mandos:

 Initializing joysticks...
  ID: 0xdadcfa337304f38c0004000c00010000 - Logitech RumblePad 2 USB Joystick
  ID: 0x0ea06f86c7f338d00006000b00010000 - Xbox One Controller
  ID: 0x4624938846ca11020002000800000000 - vendor 0x0583 USB,2-axis 8-button gamepad Joystick
  ID: 0xd4b85105fa8dffeb0004000f00010000 - 8BitDo Pro 2 Gamepad

Para mapear los botones tan solo debemos presionar:
ALT+SHIFT+1

Aquí podemos ver como juego sin problemas al magnífico Superm Mario Land 2 con mi iBUFFALO:

Las funcionalidades básicas de Mednafen son:

0-9 -> Select save slot
F5 -> Save
F7 -> Load

NeoGeo:

Para poder jugar a NeoGeo tendremos que bajarnos la BIOS y la versión del juego acorde a esta BIOS, si no hacemos esto MAME no cargará el juego, en estos enlaces podéis encontrar todo lo necesario:
https://archive.org/download/MAME216RomsOnlyMerged
https://archive.org/download/MAME216RomsOnlyMerged/mslug.zip
https://archive.org/download/MAME216RomsOnlyMerged/neogeo.zip

Instalamos MAME y un frontend gráfico:

pkg install mame qmc2

Arrancamos el frontend y configuramos el mando una vez dentro del juego:

qmc2-sdlmame

En esta ocasión he utilizado el 8BitDo:


N64

Instalamos Mupen:

pkg install mupen64plus mupen64plus-plugins mupen64plus-qt

La manera mas sencilla de configurar Mupen es mediante mupen64plus-qt:

mupen64plus-qt

Cargamos la ROM deseada:

mupen64plus ROM_PATH

Mupen por defecto detecta el mando Logitech perfectamente y el iBuffalo parcialmente, mientras que el de Xbox y el 8BitDo son ignorados completamente:

Input: 4 SDL joysticks were found.
Input: N64 Controller #1: Using auto-config with SDL joystick 0 ('Logitech RumblePad 2 USB Joystick')
Input Error: No auto-config found for joystick named 'Xbox One Controller' in InputAutoConfig.ini
Input: N64 Controller #2: Using auto-config with SDL joystick 2 ('vendor 0x0583 USB,2-axis 8-button gamepad Joystick')
Input Error: No auto-config found for joystick named '8BitDo Pro 2 Gamepad' in InputAutoConfig.ini
Input: 2 controller(s) found, 2 plugged in and usable in the emulator

Para que estos mandos funcionen tendremos que averiguar el mapeo de botones y generar los ficheros de configuración de cada uno de ellos, el método es un poco prueba/error hasta dejarlo fino:

vi /usr/local/share/mupen64plus/InputAutoCfg.ini

[Xbox One Controller]
plugged = True
plugin = 2
mouse = False
AnalogDeadzone = 4096,4096
AnalogPeak = 32768,32768
DPad R = axis(6+)
DPad L = axis(6-)
DPad D = axis(7+)
DPad U = axis(7-)
Start = button(7)
Z Trig = axis(2+)
B Button = button(2)
A Button = button(0)
C Button R = axis(3+)
C Button L = axis(3-)
C Button D = axis(4+)
C Button U = axis(4-)
R Trig = button(5)
L Trig = button(5)
Mempak switch =
Rumblepak switch =
X Axis = axis(0-,0+)
Y Axis = axis(1-,1+)
[8BitDo Pro 2 Gamepad]
plugged = True
plugin = 2
mouse = False
AnalogDeadzone = 4096,4096
AnalogPeak = 32768,32768
DPad R = axis(4+)
DPad L = axis(4-)
DPad D = axis(5+)
DPad U = axis(5-)
Start = button(11)
Z Trig = button(8)
B Button = button(4)
A Button = button(1)
C Button R = axis(2+)
C Button L = axis(2-)
C Button D = axis(3+)
C Button U = axis(3-)
R Trig = button(7)
L Trig = button(6)
Mempak switch =
Rumblepak switch =
X Axis = axis(0-,0+)
Y Axis = axis(1-,1+)

Ahora si arrancamos Mupen de nuevo ya están los 4 mandos disponibles:

Input: 4 SDL joysticks were found.
Input: N64 Controller #1: Using auto-config with SDL joystick 0 ('Logitech RumblePad 2 USB Joystick')
Input: N64 Controller #2: Using auto-config with SDL joystick 1 ('Xbox One Controller')
Input: N64 Controller #3: Using auto-config with SDL joystick 2 ('vendor 0x0583 USB,2-axis 8-button gamepad Joystick')
Input: N64 Controller #4: Using auto-config with SDL joystick 3 ('8BitDo Pro 2 Gamepad')
Input: 4 controller(s) found, 4 plugged in and usable in the emulator

NOTA: Mupen se confunde cuando hay muchos mandos conectados, yo he dejado solo el de Xbox y el 8BitDo.

Podéis ver como juego con el mando de Xbox al MarioKart64 uno de los mejores juegos de la historia:

NOTA: Lo he grabado en modo ventana porque por alguna razón ni OBS ni ffmpeg permiten grabar Mupen64 a fullscreen.


PSX

Instalamos el emulador de PSX:

pkg install pcsxr

Los mandos serán reconocidos de forma automática y podremos configurar los botonos desde el propio emulador, en este caso estoy utilizando el 8BitDo:


GAMECUBE/WII

Instalamos el emulador Dolphin:

pkg install dolphin-emu

Los mandos serán reconocidos de forma automática y podremos configurar los botonos desde el propio emulador, en este caso estoy utilizando el mando de Xbox:

NOTA: La grabación del video penaliza bastante, el emulador se mueve bien pero el video grabado parece que funcione un poco peor, además grabar el audio de pulseaudio es complicado en FreeBSD, por supuesto el emulador si que sacaba audio durenta la partida sin problemas.

En Wii la emulación funciona perfectamente pero muchos juegos precisan de movimientos de los mandos originales que con un gamepad tradicional no se pueden emular de forma cómoda.


PSP

Instalamos el emulador:

pkg install ppsspp

En este caso estoy utilizando el mando de Xbox ya que el 8BitDo la cruceta digital no es reconocida por alguna razón, el Logitech no es detectado y el iBuffalo no es el mas idóneo para jugar a la PSP:

Si te ha gustado el artículo puedes invitarme a un RedBull aquí