Problema con LIRC y dos receptores infrarojos

Imagen de masbv
0 puntos

Buenos días foreros!

Veréis, tengo un Lubuntu (v12.10) y estoy terminando de configurarlo como HTPC con XBMC. No soy experto en Linux, pero intento defenderme googleando y gracias a foros como este que son de gran ayuda. Ahora estoy teniendo un problema con la configuración de LIRC, a ver si me podéis ayudar.

La idea es utilizar el XBMC con un mando MCE (de philips) a través de un receptor IR USB propio. Configuré LIRC fácilmente con dpkg y al principio, todo funcionaba perfecto.

El problema es que ahora he configurado una sintonizadora de TV (Asus MyCinema 3100 plus v2, con los drivers de http://linuxtv.org/), que casualmente lleva incorporado otro receptor IR en el propio dispositivo.

Pues bien: al iniciar el equipo, de forma aleatoria, lirc se asocia a veces al receptor USB y otras al de la sintonizadora. Cuando lo hace con aquél primero no hay problema, el mando funciona perfectamente con XBMC:

htpc@HTPC:~$ dmesg | grep lirc
[    6.027142] lirc_dev: IR Remote Control driver registered, major 249
[    6.032698] rc rc0: lirc_dev: driver ir-lirc-codec (mceusb) registered at minor = 0
[    6.051070] rc rc1: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 1

Sin embargo, cuando se asocia primero con el receptor de la sintonizadora, el mando no funciona correctamente:

htpc@HTPC:~$ dmesg | grep lirc
[    3.856598] lirc_dev: IR Remote Control driver registered, major 249
[    3.858550] rc rc0: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0
[    4.368922] rc rc1: lirc_dev: driver ir-lirc-codec (mceusb) registered at minor = 1

Buscando por el foro de XBMC encontré este caso idéntico al mío:
http://forum.xbmc.org/showthread.php?tid=123867

Tal y como recomiendan ahí, he probado a incluir el módulo dvb_usb_rtl28xxu en el blacklist en /etc/modprobe.d. Si lo hago, el mando funciona perfecto. El problema, en mi caso, es que ese módulo controla no sólo el receptor IR de la sintonizadora sino todo el hardware de la misma, por lo que así la sintonizadora no funciona en absoluto.

htpc@HTPC:~$ lsmod | grep dvb_usb
dvb_usb_rtl28xxu       23889  20
dvb_usb_v2             24043  1 dvb_usb_rtl28xxu
rc_core                26668  15 rc_rc6_mce,mceusb,ir_lirc_codec,lirc_dev,ir_mce_kbd_decoder,ir_sanyo_decoder,ir_sony_decoder,ir_jvc_decoder,ir_rc6_decoder,ir_rc5_decoder,ir_nec_decoder,dvb_usb_rtl28xxu,dvb_usb_v2
rtl2830                17872  1 dvb_usb_rtl28xxu
dvb_core              106123  3 rtl2832,dvb_usb_v2,rtl2830

¿Alguien conoce alguna forma de hacer que no se produzca esta condición de carrera y que carge mceusb siempre en primer lugar??
¿O alguna otra forma de que lirc "ignore" el receptor IR de la sintonizadora para que no se produzca el conflicto?

No sé si es suficiente con la información que aporto. Si necesitáis más información, decídmelo y la subo.

Muchísimas gracias por vuestra atención.

Imagen de masbv
+1
0
-1

Bueno, finalmente conseguí encontrar una solución (bastante sencilla, por cierto :)). La comparto por si alguien tiene un problema parecido en algún momento:

En el fichero de configuración de LIRC tenía configurado el control remoto con el dispositivo "/dev/lirc0", como se puede ver en /etc/lirc/hardware.conf:

# /etc/lirc/hardware.conf
#
#Chosen Remote Control
REMOTE="Windows Media Center Transceivers/Remotes (all)"
REMOTE_MODULES="lirc_dev mceusb"
REMOTE_DRIVER=""
REMOTE_DEVICE="/dev/lirc0"
REMOTE_SOCKET=""
REMOTE_LIRCD_CONF="mceusb/lircd.conf.mceusb"
REMOTE_LIRCD_ARGS=""
...

En el arranque, el sistema asociaba /dev/lirc0 con uno de los receptores de infrarojos disponibles (el USB o el de la sintonizadora) y /dev/lirc1 con el otro. El problema, como comentaba en el post inicial, es que esa asociación no siempre era la misma. El receptor USB que deseaba utilizar a veces era /dev/lirc0 y a veces /dev/lirc1.

Como alguno se imaginará, la solución más sencilla era utilizar udev (el gestor de dispositivos) para crear un "dispositivo simbólico" que no cambiara de nombre y que apuntara al dispositivo correcto (lirc0 o lirc1) en cada momento. La pista me la dió un compañero de trabajo que me habló de udev, que yo hasta ahora no conocía. Hay muchas guías y manuales de como crear y configurar reglas para udev. Yo seguí esta:

Udev (Español)

Lo primero era obtener los atributos específicos de mi receptor (que en ese momento estaba conectado como /dev/lirc1) utilizando el comando:

htpc@HTPC:~$ udevadm info -a -n /dev/lirc1

De ahí se obtienen los atributos que necesitamos. En mi caso utilicé idVendor e idProduct, que son únicos del dispositivo.

KERNEL=="lirc1"
SUBSYSTEM=="lirc"
...
SUBSYSTEMS=="usb"
...
ATTRS{idVendor}=="0471"
ATTRS{idProduct}=="060c"

Ahora sólo hay que crear un fichero en "/etc/udev/rules.d" con el nombre que queramos y extensión ".rules" (por ejemplo "90-lirc.rules") y añadir la regla siguiente, que lo único que hace es crear un dispositivo simbólico de nombre "lirc-mceremote" (es recomendable poner un nombre descriptivo) que apunta a lirc0 o lirc1 dependiendo de donde esté en ese momento el dispositivo con ese idProduct e idVendor:

KERNEL=="lirc[0-9]*", SUBSYSTEM=="lirc", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0471", ATTRS{idProduct}=="060c", SYMLINK+="lirc-mceremote"

Y por ultimo, solo quedaba editar /etc/lirc/hardware.conf para indicar que debe usar siempre el dispositivo "/dev/lirc-mceremote" :

# /etc/lirc/hardware.conf
#
#Chosen Remote Control
REMOTE="Windows Media Center Transceivers/Remotes (all)"
REMOTE_MODULES="lirc_dev mceusb"
REMOTE_DRIVER=""
REMOTE_DEVICE="/dev/lirc-mceremote"
REMOTE_SOCKET=""
REMOTE_LIRCD_CONF="mceusb/lircd.conf.mceusb"
REMOTE_LIRCD_ARGS=""
...

Y voilá!! Ahora funciona todo a la perfección.
Espero que os sirva de ayuda. ;)

+1
0
-1