Página siguiente Página anterior Índice general

3. PREPARANDO NUESTRO LINUX

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.

3.1 Configuración del Núcleo

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
        

3.2 Instalando el software

Ahora hacen falta los paquetes necesarios. Necesitamos instalar unos paquetes

En Debian se denominan así
básicos imprescindibles:

  • irda-common - IrDA management utilities
  • irda-tools - IrDA handling tools
  • El primero (irda-common) nos permite instalar y configurar lo que es el stack irda, encontraremos pues en el paquete:

  • /usr/sbin/irattach
  • /usr/sbin/findchip
  • y los respectivos ficheros en el /etc:

    ¡ojo!, sobre Debian solo. En otras distribuciones no se si se llaman de esa forma

  • /etc/modutils
  • /etc/modutils/irda
  • /etc/init.d
  • /etc/init.d/irda
  • /etc/irda.conf (-DEBIAN: este es generado después del config)
  • En el segundo (irda-tools) se instalan todas las herramientas:

  • /usr/bin/irdadump
  • /usr/bin/irdaping
  • /usr/bin/irpsion5
  • 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..

    3.3 Configurando el sistema

    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.


    Página siguiente Página anterior Índice general