Twin USB Joystick

Me compré hace unos días joysticks bastante baratos, u$s9.50 el par (claro que esto me enteré después de pedir dos -que el vendedor entendió que eran dos pares- y felizmente ahora tengo cuatro). El tema es que en mi Ubuntu Feisty Fawn 7.04 (nunca voy a entender la numeración que ubuntu le pone a sus versiones) no andaba. En realidad andaba “más o menos”. Lo que ocurría fundamentalmente era que me lo reconocía como uno solo en lugar de dos. El joystick es raro, de uno de ellos sale un cable que se conecta al segundo y de éste aparte sale el cable usb (o sea, dos joysticks un usb). Indignado por esta falencia y casi al punto de venderlo (a mis amigos con Windows les habían gustado bastante xD) intenté arreglarlo… Y lo mejor es que pude :D Ahora cuento más o menos cómo hice.
Primero que todo leí este INCREÍBLE documento The Linux Kernel Module Programming Guide hasta el capítulo 7 (este cap seguro que también es interesante pero con lo anterior ya me sirvió para lo que quería, después lo leo). Y después Tincho me pasó un post de un flaco que tenía un problema igual pero para otro tipo de joystick pero que la solución terminó siendo la misma. El post de este flaco es Hardware: SmartJoy Dual Plus USB adapter, de hecho van a encontar unas preguntas mías al final de cosas que no me salían en el camino :P.
Un par de cosas de mi entorno donde este parche SI anda.

  • fijarse en la config con la que fue creado el kernel si el módulo usbhid fue compilado como tal o integrado al kernel (en mi máquina lo hice con cat /boot/config-2.6.20-15-generic | grep CONFIG_USB_HID, y por suerte estaba el =m que me fue indicando que era posible reemplazarlo, al menos de la manera que iba aprendiendo)
  • en algún módulo que tengamos seguro fijemenos el vermagic, en mi caso usé modinfo usbhid que tiene que ser igual al uname -r + EXTRAVERSION seteada en el makefile de los sources (grep EXTRAVERSION /usr/src/linux-source-2.6.20/Makefile) si esto no es igual probablemente no tengamos los sources posta del kernel que estamos corriendo

Después de esto copié el directorio de los drivers que necesitaba a mi entorno de desarrollo local. El driver está en /usr/src/linux-source-2.6.20/drivers/usb/input y ajustamos el makefile para no independizarnos de las variables que fueron utilizadas en la compilación posta de todo el sistema. Ésto se hace mirando el Makefile y el config del kernel y reemplazando las variables a mano del Makefile del módulo. Mi Makefile en el entorno de desarrollo quedó

usbhid-objs := hid-core.o
usbhid-objs += hiddev.o

obj-m += usbhid.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Después de esto se aplica mi parchecito que lo subí al launchpad de Ubuntu en https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/111146. Solo queda correr make y si todo sale bien tenemos un usbhid.ko. Sacamos el que está cargado en el kernel #rmmod usbhid y agregamos el nuestro #insmod usbhid.ko.
Enchufás el joystick y vas a ver que en /dev/input ahora están los dos, el /j0 y el /j1 :-D
Espero que a alguien le sea útil y cualquier sugerencia es bienvenida.
Salud!

edit: prestar atención a los comentarios de mi bugreport en launchpad que muestran un módulo mucho más complejo que le agrega incluso forcefeedback a estos joy, yo todavía no lo probé

Advertisements

4 Responses

  1. bueno soy onitenchime podrias ayudar es que estoy barado con este conector usb para el pad de psx el mio se ve igual al del flaco del post en ingles pero como que es de diferente proveedorya he montado un post en ubuntu-es pidiendo ayuda en el cual esta relacionado este post http://www.ubuntu-es.org/index.php?q=node/50020#comment-123745tambien ley lo del flaco aquel pero soy PT y pues no he entendido muy bien sobre todo la parte del parche ,que se supone ahy que hacer con el creo un archivo de texto .sh y lo ./ejecuto o donde lo pongo ,,,.,.,.,no sera posible que me des el modulo .ko ya compilado para que pueda darle sudo insmod de por si creo que andamos con la misma version de kernel bueno gracias

  2. como sea :P

  3. Muy interesante, yo no consigo hacer funcionar mi Wingman Rumblepad.Siento el espectáculo dantesto

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s