Uno de los principales problemas que nos encontramos es lo que voy a llamar 'nodocumentación'. En ultima estancia, es una consecuencia del paso del tiempo y entiendo que lo provoca, entre muchas cosas, la documentación obsoleta, los textos a medias, el desconocimiento mayoritario y la escasa documentación de los propios desarrolladores. Por supuesto, ni que decir que en castellano prácticamente nada de nada. Menos mal que hay buenos amigos para realizar todas las pruebas.
Las pruebas han estado realizadas sobre Debian Woody con núcleo 2.4.8 sobre un portátil clónico pIII 1000 con un dispositivo FIR integrado. Por lo tanto, es muy muy probable que surjan todo tipo de problemas con IR sobre serie con SIR. Toda esa modalidad no la he probado, aun así espero que el documento pueda servir de base de la que partir para las diferentes pruebas. Por supuesto, si conseguís hacer funcionar este modo y la manera de proceder es diferente a lo que aquí va a aparecer, estaría muy bien que facilitarais las pruebas para completar el documento.
Bueno, lo primero es preparar el nícleo. He decidido no poner la opción
básica, sino mas bien la completa, por si el dispositivo que usáis utiliza un
driver que no es el estándar FIR o SIR. He dejado fuera también los controladores para
Toshiba y para IR sobre USB. No me acuerdo ahora muy bien por qué lo hice
:(.
La configuración quedaría pues:
# CONFIG_PACKET=y # Para poder usar irdadump # # IrDA (infrared) support # CONFIG_IRDA=m CONFIG_IRLAN=m CONFIG_IRNET=m CONFIG_IRCOMM=m CONFIG_IRDA_ULTRA=y CONFIG_IRDA_OPTIONS=y CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y CONFIG_IRDA_DEBUG=y # # Infrared-port device drivers # CONFIG_IRTTY_SIR=m CONFIG_IRPORT_SIR=m CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m CONFIG_TEKRAM_DONGLE=m CONFIG_GIRBIL_DONGLE=m CONFIG_LITELINK_DONGLE=m CONFIG_OLD_BELKIN_DONGLE=m # CONFIG_USB_IRDA is not set CONFIG_NSC_FIR=m # CONFIG_WINBOND_FIR is not set # CONFIG_TOSHIBA_FIR is not set CONFIG_SMC_IRCC_FIR=m # CONFIG_ALI_FIR is not set
Encontraremos en /dev/:
crw-r----- 1 root root 161, 0 Nov 4 18:03 /dev/ircomm0 crw-rw---- 1 root root 161, 1 Oct 5 11:20 /dev/ircomm1 crw-rw---- 1 root root 161, 16 Oct 5 11:20 /dev/irlpt0 crw-rw---- 1 root root 161, 17 Oct 5 11:20 /dev/irlpt1
En caso de que no estén creados:
mknod /dev/ircomm0 c 161 0 mknod /dev/ircomm1 c 161 1 mknod /dev/irlpt0 c 161 16 mknod /dev/irlpt1 c 161 17 mknod /dev/irnet c 10 187 chmod 666 /dev/ir*
En los antiguos núcleos olvidaros del ircomm0, que he leído en diferentes listas que no venían con esos nombres.
Los módulos los tenemos situados en dos directorios, uno corresponde a lo que sería la base con los protocolos, mientras que el otro directorio son los controladores específicos.
En /lib/modules/2.4.8/kernel/net/irda encontramos el paquete básico:
drwxr-xr-x 2 root root 4096 Oct 18 00:28 ircomm -rw-r--r-- 1 root root 228921 Oct 18 00:28 irda.o drwxr-xr-x 2 root root 4096 Oct 18 00:28 irlan -rw-r--r-- 1 root root 57134 Oct 18 00:28 irlan.o drwxr-xr-x 2 root root 4096 Oct 18 00:28 irnet
Expandimos todo:
-rw-r--r-- 1 root root 228921 Oct 18 00:28 irda.o -rw-r--r-- 1 root root 57134 Oct 18 00:28 irlan.o ircomm: total 76 drwxr-xr-x 2 root root 4096 Oct 18 00:28 . drwxr-xr-x 5 root root 4096 Oct 18 00:28 .. -rw-r--r-- 1 root root 43645 Oct 18 00:28 ircomm-tty.o -rw-r--r-- 1 root root 21539 Oct 18 00:28 ircomm.o irlan: total 68 drwxr-xr-x 2 root root 4096 Oct 18 00:28 . drwxr-xr-x 5 root root 4096 Oct 18 00:28 .. -rw-r--r-- 1 root root 57134 Oct 18 00:28 irlan.o irnet: total 44 drwxr-xr-x 2 root root 4096 Oct 18 00:28 . drwxr-xr-x 5 root root 4096 Oct 18 00:28 .. -rw-r--r-- 1 root root 35539 Oct 18 00:28 irnet.o
irnet.o es para poder cargar una pila TCP/IP y así poder conectar dos Linux.
Mientras, por otro lado, en /lib/modules/2.4.8/kernel/drivers/net/irda tenemos:
-rw-r--r-- 1 root root 3768 Oct 18 00:27 actisys.o -rw-r--r-- 1 root root 2612 Oct 18 00:27 esi.o -rw-r--r-- 1 root root 3456 Oct 18 00:27 girbil.o -rw-r--r-- 1 root root 14164 Oct 18 00:27 irport.o -rw-r--r-- 1 root root 13484 Oct 18 00:27 irtty.o -rw-r--r-- 1 root root 2980 Oct 18 00:27 litelink.o -rw-r--r-- 1 root root 21820 Oct 18 00:27 nsc-ircc.o -rw-r--r-- 1 root root 2648 Oct 18 00:27 old_belkin.o -rw-r--r-- 1 root root 12160 Oct 18 00:27 smc-ircc.o -rw-r--r-- 1 root root 4596 Oct 18 00:27 tekram.o
Ahora hacen falta los paquetes necesarios. Necesitamos instalar unos paquetes
En Debian se denominan asíbásicos imprescindibles:
El primero (irda-common) nos permite instalar y configurar lo que es el stack irda, encontraremos pues en el paquete:
y los respectivos ficheros en el /etc:
¡ojo!, sobre Debian solo. En otras distribuciones no se si se llaman de esa forma
En el segundo (irda-tools) se instalan todas las herramientas:
CONFIG_PACKET=y (activado) en el núcleo o no funcionarán.
Una vez instalados los paquetes hay que empezar a retocar por todos los sitios. Esto me llevó bastante. Vamos a ver..
Lo primero es llamar la atención sobre el /etc/irda.conf. No sé si en otras distribuciones o bien para otros controladores pasará igual, pero sobre NSC/FIR en Debian, ese archivo es gilipollo. No sé para qué sirve. De hecho, os pego el fichero para que veáis que mis últimas pruebas eran ya descaradas y absolutamente todo, después de realizar las operaciones que os indico mas adelante, funcionaba perfectamente.
annapurna:~# cat /etc/irda.conf #irda.conf Version: 1.0 IRDADEV=/deV/mierda DONGLE=none DISCOVERY=-s ENABLE=no # if you don't need to start irattach, set "no" annapurna:~#
Después de esto, el irda ha seguido funcionando ?¿?¿?
En el modules.conf (o conf.modules, según distribuciones) hay que añadir, lo pongo todo y lo que no os haga falta lo quitáis:
alias tty-ldisc-11 irtty alias char-major-161 ircomm-tty alias char-major-60 ircomm_tty alias char-major-61 lirc_sir alias irda-dongle-0 tekram alias irda-dongle-1 esi alias irda-dongle-2 actisys alias irda-dongle-3 actisys alias irda-dongle-4 girbil alias irda-dongle-5 litelink alias irda-dongle-6 airport alias irda-dongle-7 old_belkin # Esto por si usais un dispositivo serie y hay que meterle la configuración # options smc-ircc ircc_irq= ircc_dma= # Esto es para FIR. # options nsc-ircc dongle_id=0x09 alias irda0 nsc-ircc # Esto creo que es para los Toshiba # options toshoboe max_baud= # alias irda0 toshoboe # options w83977af_ir io= io2= irq= qos_mtt_bits= # alias irda0 w83977af_ir #IRNET Module alias char-major-10-187 irnet
DEBIAN: En Debian (Woody?) tendréis que modificarlo en el /etc/modutils y añadir un fichero "irda" (por ejemplo) que contenga estas lineas. Recomendado: man update-modules.
Seguimos. Lo importante ahora es determinar si el núcleo sabe qué dispositivo IR tenemos. Una de las herramientas instaladas es "findchip", que nos viene como anillo al dedo:
annapurna:~# findchip -v Found NSC PC87338 Controller at 0x398, DevID=0x0b, Rev. 2 SIR Base 0x2f8, FIR Base 0x2f8 IRQ = 3, DMA = 0 Enabled: yes, Suspended: no UART compatible: yes Half duplex delay = 0 us annapurna:~#
¡Ole!.. ahí está, tengo un "NSC". Pero antes de instalar nada viene el
quebradero de cabeza por excelencia.
Esto es IMPORTANTE:
Como vemos, el NSC nos lo detecta en:
FIR Base 0x2f8 IRQ = 3, DMA = 0
Si caemos en la cuenta, ejecutamos 'setserial /dev/ttyS1' y:
/dev/ttyS1, UART: 16550?, Port: 0x02f8, IRQ: 3
¡Coincide!. Pues bien:
¡¡¡¡NO ES POSIBLE TENER EL SERIE Y EL NSCIR INTEGRADO UTILIZANDO LO MISMO!!!! |
La jugada es cambiar el uart a "none" para evitar conflictos y que funcione. En algunas listas incluso recomiendan poner todo a "none". No sé, la verdad, con el uart a mí me bastó. La forma es la siguiente:
setserial /dev/ttyS1 uart none (en nuestro caso)
DEBIAN: Para tenerlo definitivo, lo que hacemos es que en el /etc/serial.conf comentamos la línea original y modificamos por la nuestra:
#/dev/ttyS1 uart 16550A port 0x02f8 irq 3 baud_base 115200 spd_normal skip_test /dev/ttyS1 uart none port 0x02f8 irq 3 baud_base 115200
Una vez modificado el modules.conf y el serial.conf, entonces nos preparamos para la instalación de los módulos. Lo mas rápido es hacer lo siguiente:
La utilidad irattach (man irattach) permitía asignar la stack IR a un puerto serie. En dispositivos conectados al serie debería ser algo como (no lo he probado):
irattach /dev/ttyS1 -s 1 Que se supone carga la pila IR sobre SIR (serial).
Sin embargo, para nuestro NSC de tipo FIR vamos a probar con:
irattach irda0 -s 1 (jejejejejeje!)
NOTA: En el howto (Ingles) dice que no hace falta usar irattach para dispositivos FIR. Hacerme caso y usar irattach si podéis.
Si el truco del almendruco funciona a la primera, tenemos en /var/log/syslog:
annapurna irattach: executing: /sbin/modprobe irda0 annapurna kernel: irda_init() annapurna kernel: irlmp_init() annapurna kernel: nsc-ircc, Found chip at base=0x398 annapurna kernel: nsc-ircc, driver loaded (Dag Brattli) annapurna kernel: IrDA: Registered device irda0 annapurna kernel: nsc-ircc, Found dongle: Sharp RY5HD01 annapurna irattach: executing: 'echo 1 > /proc/sys/net/irda/discovery' annapurna irattach: Starting device irda0 annapurna irattach: executing: 'echo annapurna > /proc/sys/net/irda/devname' annapurna kernel: irlmp_register_client_R17f18bfb() annapurna kernel: irlap_change_speed(), setting speed to 9600
y desde donde se ejecutó el irattach nos aparece:
annapurna:~# irattach irda0 -s 1 1.1 Tue Nov 9 15:30:55 1999 Dag Brattli annapurna:/etc# nsc-ircc, Found chip at base=0x398 nsc-ircc, driver loaded (Dag Brattli) IrDA: Registered device irda0 nsc-ircc, Found dongle: Sharp RY5HD01 annapurna:~#
Esta línea: annapurna kernel: irlap_change_speed(), setting speed to 9600
parece que vaya a darnos problemas. Sin embargo los programas de la Palm reajustan la velocidad. No queda registrado en ningún lado, pero he probado a sincronizar a 9600 y luego he cambiado el pilotrate a 57600 y la diferencia es considerable. Y en segundo lugar, la transmisión a móviles parece mucho mas firme y efectiva si no modifico nada que si toco de aquí y de allá.
Comentar que en el /proc, justo donde nos dice el syslog, tenemos diferentes parámetros que nos dan información o se pueden variar.
-rw-r--r-- 1 root root 0 Nov 6 01:45 debug -rw-r--r-- 1 root root 0 Nov 6 01:45 devname -rw-r--r-- 1 root root 0 Nov 6 01:45 discovery -rw-r--r-- 1 root root 0 Nov 6 01:45 discovery_slots -rw-r--r-- 1 root root 0 Nov 6 01:45 discovery_timeout -rw-r--r-- 1 root root 0 Nov 6 01:45 fast_poll_increase -rw-r--r-- 1 root root 0 Nov 6 01:45 max_baud_rate -rw-r--r-- 1 root root 0 Nov 6 01:45 max_inactive_time -rw-r--r-- 1 root root 0 Nov 6 01:45 slot_timeout
En el caso de que no vaya el irattach a la primera, puede ser por un millón y medio de motivos XD. Un punto desde donde empezar a probar combinaciones es justo los parámetros de configuración en el modules.conf. De esta forma, ejecutamos el findchip, vemos los parámetros y rellenamos las líneas:
para SMC (SIR):
options smc-ircc ircc_irq= ircc_dma=
para NSC (FIR:)
options nsc-ircc dongle_id=0x09
La otra opcion es no tirar de irattach hasta que no consolidemos cada uno de los lkms que se deberían cargar. Una posible respuesta la encontramos probando los módulos uno por uno con el orden adecuado.
El primero a cargar es el irda.o. Eso seguro.
El segundo es el controlador para el dispositivo. Normalmente los módulos admiten opciones que no tenemos porque ir adivinando. Lógicamente, las del smc.ircc y el nsc-ircc son intuitivas porque os he pegado las opciones que incorporan en el modules.conf de arriba.
En caso de que tengáis que tirar de otro controlador/módulo/lkm (todo es lo mismo) os recomiendo el comando 'modinfo', con el cual sabréis exactamente por donde podréis jugar con el modulo. Si aplicamos lo dicho tenemos:
annapurna:~# modinfo nsc-ircc filename: /lib/modules/2.4.8/kernel/drivers/net/irda/nsc-ircc.o description: "NSC IrDA Device Driver" author: "Dag Brattli <dagb@cs.uit.no> license: <none> parm: qos_mtt_bits int, description "Minimum Turn Time" parm: io int array (min = 1, max = 4), description "Base I/O addresses" parm: irq int array (min = 1, max = 4), description "IRQ lines" parm: dma int array (min = 1, max = 4), description "DMA channels" parm: dongle_id int, description "Type-id of used dongle" annapurna:~# modinfo smc-ircc filename: /lib/modules/2.4.8/kernel/drivers/net/irda/smc-ircc.o description: "SMC IrCC controller driver" author: "Thomas Davis <tadavis@jps.net> license: <none> parm: ircc_dma int, description "DMA channel" parm: ircc_irq int, description "IRQ line"
En el nsc-ircc el tema del dongle no sé muy bien de donde lo sacaba. Se supone que Found dongle: Sharp RY5HD01 tiene un id que es un decimal entero, pero no sé donde se mira.
En el caso de haberlo hecho funcionar, enhorabuena. Ya tienes el IrLAP instalado sobre el que cargar el resto de protocolos de nivel superior, importantísimos de cara a comunicar in dispositivo IR con otro.
A modo de confirmación, una vez hayáis configurado todo (aquellos que hayáis tenido que elegir el camino de 'ir a mano' acordaros de un "ifconfig irda0 up") deberíais ver lo siguiente:
annapurna:~# ifconfig eth0 Link encap:Ethernet HWaddr 00:40:D0:1A:F0:41 inet addr:192.168.2.5 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3262 errors:0 dropped:0 overruns:0 frame:0 TX packets:868 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:822625 (803.3 Kb) TX bytes:66494 (64.9 Kb) Interrupt:11 Base address:0x1800 irda0 Link encap:IrLAP HWaddr 10:1e:45:b7 UP RUNNING NOARP MTU:2048 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:4151 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:8 RX bytes:0 (0.0 b) TX bytes:131053 (127.9 Kb) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:425 errors:0 dropped:0 overruns:0 frame:0 TX packets:425 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:80135 (78.2 Kb) TX bytes:80135 (78.2 Kb)
¡Ahí esta nuestro amigo!. Nuestro Linux esta casi listo.
Es una pena que de los mil caminos (configuraciones) que hay hasta llegar aquí, solo haya podido probar uno. Para el resto de configuraciones es necesario un trabajo que debéis de realizar. Por supuesto, si conseguís algo me lo mandáis documentado para añadirlo al documento. Mi intención es siempre aportar el máximo, pero para este pobre administrador de turno no le es factible adquirir mas de lo que ahora mismo posee. Por no tener no tengo ni móvil con IR.
Para terminar con lo que sería la "parte común a todos los dispositivos", vamos a preparar el sistema para interconectarse a los diferentes periféricos. Para ello a todo lo anterior hay que añadir:
modprobe ircomm-tty (que nos cargará además el ircomm.o)
modprobe irport
En definitiva, tenemos cargado:
nsc-ircc 14036 1 irport 7240 0 (unused) ircomm-tty 31680 0 ircomm 14396 0 [ircomm-tty] irda 150848 1 [nsc-ircc irport ircomm-tty ircomm]
El ircomm nos carga un protocolo de nivel superior sobre el IrLAP, que se utiliza para la comunicación de dispositivos y emular el puerto COM. Me remito a mi descripción del protocolo en el capitulo anterior
El ircomm-tty es una versión mas actualizada (mas o menos) del irtty. La diferencia parece estar en que uno está implementado sobre IrCOMM y el otro es mas genérico. De hecho, si nos fijamos en la info proporcionada por el módulo, apenas encontramos diferencias:
annapurna:~# modinfo ircomm-tty |grep description: description: "IrCOMM serial TTY driver" annapurna:~# modinfo irtty |grep description: description: "IrDA TTY device driver"
Sobre el irport..mmm:
annapurna:~# modinfo irport |grep description: description: "Half duplex serial driver for IrDA SIR mode"
Bien, ya tenemos todo preparado.