G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!
Diversión con Simputer y Linux Embebido
Por Pramode C.E
Traducción al español por José Gregorio Del Sol Cobos
el día 3 de Marzo 2003, para La Gaceta de Linux

 

Diversión con Simputer y Linux Embebido

El Simputer es un dispositivo manual basado en una CPU StrongArm, funcionandocon Linux. Desarrollado originalmente por profesores del Instituto Indio de Ciencia (Indian Institute of Science) en Bangalore, el dispositivo tiene el objetivo social de llevar la computación y la conectividad al alcance de las comunidades rurales. Este artículo proporciona una introduccióna la programamción del Simputer (y de dispositivos manuales similares, basados en ARM -hay muchos de ellos en el mercado). Se espera del lector que tenga alguna experienciaprogramando sobre Linux. Aviso: trato de describir las cosas que he hecho en mi Simputer sin problemas -si siguiendo mis instrucciones su aparatoempieza a echar humo, ¡yo no me haré responsable!

Hardware/Software

El dispositivo está basado en una CPU StrongArm de Intel (SA-1110). El tamaño de la memoria Flash puede ser bien de 16 Mb, bien de 32,y el de la RAM, de 32 o de 64. Los periféricos incluyen:

  1. Puertos USB esclavo y maestro.
  2. Puerto de serie estándar.
  3. Puerto de comunicación para infrarrojos.
  4. Lector de tarjetas SmartCard.

Algunas de estas características se hacen disponibles medianteuna ranura de expansión en la unidad. El suministrode energía puede ser mediante baterías recargables o mediantecorriente alterna externa.

El Simputer se basa en GNU/Linux, y la versión 2.4.18 del núcleo (con algunos parches) funciona bien. La unidad viene provista de los binarios del sistema X-Window y unas cuantas utilidades sencillas. Se pueden obtener más detalles en la página web del proyecto en www.simputer.org.

Encendido

No tiene mayor problema, basta presionar el botón de encendido. Ustedverá una pequeña imagen de Tux moviéndose y en unos cuantos segundostendrá las X funcionando. La pantalla LCD es sensible al tacto y puedeusar un pequeño lápiz óptico (los más avezados usan las uñas de los dedos)para seleccionar aplicaciones y moverse por la interfaz gráfica. Siquiere tener entrada por teclado, prepárese para algunas agónicas manipulaciones usando el lápiz y un "teclado blando", que no es más queun programa de interfaz gráfica desde el cual puede seleccionar letras sueltas y otros símbolos.

Esperando a la bash

Las GUIs (Interfaces Gráficas de Usuario) son para los niños. No estás satisfecho hasta que ves el viejo y fiable símbolo de la bash. Bueno, pues no tiene usted que intentarlo mucho. El Simputer tiene un puerto serie: enchufe en él el cable que viene con la unidad, y el otro extremo va a un puerto libre en su host Linux (en mi caso /dev/ttyS1). Ahora lance un programa de comunicación (yo uso "minicom"). Primero ha de configurar el programa para que use /dev/ttyS1 con una velocidad de comunicación de 115200 (según dice el manual del Simputer; si está usando un asistente similar, no tiene por qué ser la misma), y formatear 8N1, y con los controles de flujo del hardware y el software deshabilitados. Hacer esto con minicom es muy sencillo: llámelo como:

minicom -m -s

Una vez acabada la configuración, simplemente escriba:

minicom -m

y prepárese para la sorpresa. Inmediatamente verá el símbolo para identificarse. Debería poder meter un nombre de usuario/clave y entrar, así como ejecutar comandos sencillos como "ls", "ps", etc. Incluso podrá usar "vi".

Si usted no está familiarizado con la ejecución de programas de comunicación en Linux, se puede estar preguntando qué ocurrió realmente. No mucho: es magia Unix estándar. Un programa en el Simputer vigila el puerto serie (el puerto serie del Simputer, llamado ttySA0). Cuando se ejecuta minicom en el PC bajo Linux, se establece una conexión con ese programa, que le envía a usted un prompt para la identificación por la línea, lee su respuesta, le autentifica y lanza una shell con la que usted puede interactuar a través de la línea.

Una vez que minicom inicializa el puerto serie en el extremo del PC, usted puede interactuar con el Simputer mediante scipts. Se explota la idea de que el programa ejecutado en el Simputer está esperando los datos provinientes de la línea serie: al programa no le importa que los datos vengan del propio minicom o de un script. Puede intentar el siguiente experimento:

  1. Abra dos consolas (en el Pc Linux)
  2. Ejecute minicom en una consola, entrando en el Simputer
  3. En la otra consola, escriba "echo ls > /dev/ttyS1"
  4. Vuelva a la primera consola: comprobará que el comando "ls" se ha ejecutado en el Simputer.

Instalando el trabajo en red por USB

El Simputer viene con un puerto USB esclavo. Usted puede establecer un enlace TCP/IP entre su Pc Linux y el Simputer vía esa interfaz USB. He aquí los pasos que debería dar:

  1. Asegúrese de que tiene una distribución Linux reciente (la Red Hat 7.3 es bastante buena).
  2. Enchufe un extremo del cable USB en el puerto USB esclavo del Simputer, y después inicie el Simputer.
  3. Inicie su PC Linux. NO conecte el otro extremo del cable USB a su PC aún. Identifíquese como superusuario (root) en el PC.
  4. Ejecute el comando "insmod usbnet" para cargar un módulo del núcleo que habilita la conectividad USB en el PC Linux. Verifique que el módulo se ha cargado mediante "lsmod".
  5. Ahora inserte el otro extremo del cable USB en un puerto libre del PC Linux. El subsistema USB en el núcleo de Linux debería ser capaz de detectar el nuevo dispositivo. En mi PC Linux, obtuve los siguientes mensajes del núcleo inmediatamente después de enchufar el cable USB (mensajes que se pueden ver ejecutando el comando "dmesg"):
usb.c: registered new driver usbnet 

     (usb.c: registrado nuevo driver usbnet)
hub.c: USB new device connect on bus1/1, assigned device number 3
     (hub.c: nuevo dispositivo USB conectado al bus1/1, asignado el número de dispositivo 3)
usb.c: ignoring set_interface for dev 3, iface 0, alt 0
     (usb.c: ignorando set_interface para dev 3, iface 0, alt 0)
usb0: register usbnet 001/003, Linux Device
     (usb0: registrar usbnet 001/003, Dispositivo Linux).

Después de llegar hasta aquí, debe ejecutar unos cuantos comandos más:

  • Ejecute "ifconfig usb0 192.9.200.1", lo cual asignará una dirección IP a la interfaz USB en el PC Linux.
  • Usando "minicom" y el cable serie proporcionado, identifíquese en el Simputer como root. Después ejecute el comando "ipconfig usbf 192.9.200.2" en el Simputer.
  • Intente "ping 192.9.200.2" en el PC Linux. Si ve los paquetes de ping corriendo, felicidades. ¡Ha instalado con éxito el enlace TCP/IP! Ahora usted puede hacer telnet o ftp al Simputer a través de este enlace TCP/IP.

    Hola, Simputer

    Es hora de empezar el verdadero trabajo. Su compilador de C (gcc)genera normalmente código "nativo", o sea, código que se ejecuta en elmicroprocesador sobre el que se ejecuta el propio gcc, a menudo unaCPU de Intel (o clon). Si usted desea que su programa se ejecute en el Simputer(que está basado en un microprocesador StrongArm), el código máquinagenerado por gcc será incomprensible para la CPU StrongArm: su gccdebería ser un compilador cruzado. Si descarga el código fuente de gcc(preferiblemente 2.95.2), junto con las "binutils", deberá ser capaz de configurarlo y compilarlo de modo que se obtenga un compilador cruzado(que se podría invocar como arm-linux-gcc, por ejemplo). Esto podría pareceralgo peligroso si lo está haciendo por vez primera; el vendedor de suasistente digital debería proporcionarle un CD con las herramientas necesariasprecompiladas: es recomendable que lo use (pero si usted está metidoseriamente en el desarrollo embebido, debería tratar de descargar las herramientas y construirlas usted mismo).

    Asumiendo que usted tiene ejecutándose arm-linux-gcc, puede escribir un sencillo programa "Hola, Simputer", compilarlo en un a.out, ftp-arlo al Simputery ejecutarlo (estaría bien tener una consola de ftp en su Pc Linux y otra de telnet;tan pronto como compile el código puede subirlo y ejecutarlo desde la consola de telnet (observe que debe haberle dado permiso de ejecución al código ftp-ado haciendo "chmod u+x a.out" en el Simputer)).

    Una nota sobre el núcleo del Linux de Arm

    El núcleo de Linux es muy portable: todas las dependencias de máquinasestán aisladas en directorios bajo el subdirectorio "arch" (que estádirectamente bajo la raíz del árbol de la fuente del núcleo, es decir, /usr/src/linux).Encontrará un diectorio llamado "arm" debajo de "arch". Es el directorioque contiene el código del núcleo de Linux específico para la CPU de ARM.

    El porte de ARM a Linux fue iniciado por Russell King. La arquitectura ARMes muy popular en el mundillo "embebido" y hay MUCHAS máquinas diferentescon nombres fantásticos como Itsy, Assabet, Lart, Shannon, etc., que usantodas ellas la CPU StrongArm (también parece haber otro tipo de procesadores ARM,lo que hace una mezcla muy grande). Hay diferencias menores en la arquitectura de estasmáquinas que hacen necesario hacer "ajustes para máquina específica" para que elnúcleo trabaje en cada una de ellas. Los ajustes para la mayoría de ellas estándisponibles en el propio núcleo estándar, y usted sólo tiene que elegirel tipo de máquina efectivo durante la configuración del núcleo paratener todo en orden. Pero para hacer las cosas un poco más confusas conel Simputer, parece que los ajustes para la especificación inicial del Simputer,han ido al código del núcleo de ARM, pero los vendedores que están fabricandoy vendiendo el dispositivo parecen estarlo haciendo de acuerdo a una especificación modificada, y los parches requeridos para hacer funcionar el núcleo enestas configuraciones modificadas no están aún integrados en el árbol del núcleoprincipal. Sin embargo, esto no es realmente un problema, puesto que su proveedorle dará los parches (que pronto podrían estar dentro del núcleo oficial).

    Obtener la fuente del núcleo y construirlo

    Usted se puede descargar ls fuente del núcleo 2.4.18 desde el espejo ftp del núcleo de Linux más cercano. Necesitará el archivo "patch-2.4.18-rmk4" (que se puede obtener del sitio ftp de Linux de ARM ftp.arm.linux.org.uk). Podría necesitar también un parche proporcionado por el vendedor, "patch-2.4.18-rmk4-vendorstring". Todos esos ficheros se copian en el directorio /usr/local/src.

    1. Primero, extraiga la distribución del núcleo principal ejecutando "tar xvfz kernel-2.4.18.tar.gz"
    2. Obtendrá un directorio llamado "linux". Cambie a este directorio y ejecute "patch -p1 < ../patch-2.4.18-rmk4".
    3. Ahora aplique el parche proporcionado por el vendedor. Ejecute "patch -p1 < ../patch-2.4.18-rmk4-vendorstring".

    Ahora, el núcleo está preparado para configurarse y ser construido. Antes, tiene que examinar el archivo Makefile del nivel superior (bajo /usr/local/src/linux), y hacer dos cambios. Habrá una línea de la forma:

    ARCH :=<un-montón-de-cosas>

    cerca del comienzo. Cámbiela a

    ARCH := arm

    Tiene que hacer un cambio más. Observe que el Makefile define:

    AS= ($CROSS_COMPILE)as
    LD= ($CROSS_COMPILE)ld
    CC= ($CROSS_COMPILE)gcc
    

    Ve que el símbolo CROSS_COMPILE está igualado a la cadena vacía. Durante la compilación normal, esto dará como resultado que AS estará definido como "as", CC como "gcc" y así con todo lo de más, que es lo que queremos. Pero cuando hagamos compilaciones cruzadas, usaremos arm-linux-gcc, arm-linux-ld, arm-linux-as, etc. Así que usted tiene que igualar CROSS_COMPILE conla cadena arm-linux-, es decir, en el Makefile debe introducir:

    CROSS_COMPILE= arm-linux-

    Una vez que incorpore estos cambios al Makefile, usted ya puede empezar a configurar el núcleo ejecutando "make menuconfig" (observe que es posible hacerlo sin modificar el Makefile: ejecute "make menuconfig ARCH=arm"). Puede que tenga que hacer algunos ajustes aquí, y después construir efectivamente el núcleo sin error. No necesitará modificar la mayoría de las cosas, los valores por defecto son aceptables.

    1. Tiene que escoger como tipo de sistema el sistema SA1100 basado en ARM y después elegir la implementación SA11x0 como "Simputer(Clr)" (o algo así, dependiendo de su máquina). Yo había habilitado también el soporte para la función SA11x0 USB, el soporte para el enlace de red SA11x0 USB y la emulación del dispositivo de caracteres SA11x0 USB).
    2. Bajo Dispositivos de carácter->Drivers serie, habilité el soporte para el puerto serie SA1100 y el soporte para la consola sobre el puerto serie y puse la tasa de baudios a 115200 (usted puede necesitar una tasa diferente para su máquina).
    3. En Dispositivo de caracteres, los relojes de tiempo real de SA1100 y de Simpuetr están habilitados.
    4. En Drivers de consola, la Consola de texto VGa está deshabilitada.
    5. En Instalación general, la cadena de comando del núcleo estándar está puesta como "root=/dev/mtdblock2 quite". Esto puede ser diferente para su máquina.

    Cuando el proceso de configuración esté terminado usted puede ejecutar

    make zImage

    y en unos pocos minutos, usted debería tener un archivo "zImage" en arch/arm/boot. Éste es su nuevo núcleo.

    Ejecutando el nuevo núcleo

    Describo el modo más fácil de tener el núcleo listo y funcionando.

    Igual que en su Pc Linux tendrá LILO o Grub como gestor de arranque, el asistente también tendrá un gestor de arranque almacenado en su memoria no volátil. En el caso del Simputer, este gestor se llama "blob" (que supongo que es el gestor de arranque desarrollado para el Proyecto de Terminal de Radio Avanzada con Linux, "L.A.R.T.", en inglés). Tan pronto como encienda la máquina, el gestor de arranque empieza a funcionar. Si usted empieza el minicom en su PC Linux, mantiene pulsada la tecla "intro" y enciende el dispositivo, entonces, el gestor de arranque, en lugar de continuar con el inicio del núcleo almacenado en la memoria flash del dispositivo, comenzará a interactuar con usted a través de un prompt que se parecerá a éste:

    blob>

    En ese prompt usted puede escribir:

    blob>download kernel

    que resulta en que blob esperará a que mande una imagen del núcleo a través del puerto serie. Ahora en el PC Linux, debería escribir el comando:

    uuencode zImage /dev/stdout > /dev/ttyS1

    Esto enviará una imagen del núcleo a través del puerto COM, que será leída y almacenada por el gestor de arranque en la RAM del dispositivo. Cuando termine este proceso, usted es devuelto al prompt del gestor de arranque. Sólo tiene que escribir:

    blob> boot

    y el gestor de arranque ejecutará el núcleo que usted justo acaba de compilar y descargar.

    Un poquito de "hackeo" del núcleo

    ¿Qué tiene de bueno un nuevo dispositivo si no puedes "hackear" un poquito el núcleo? Mi siguiente paso después de compilar y ejecutar un nuevo núcleo es comprobar cómo compilar y ejecutar módulos del núcleo. He aquí un sencillo programa llamado "a.c":

    #include <linux/module.h>
    #include <linux/init.h>
    
    /* Just a simple module */
    
    int 
    init_module(void) 
    { 
       printk("loading module...\n");
       return 0;
    }
    
    void 
    cleanup_module(void) 
    { 
       printk("cleaning up ...\n");
    }
    

    Tiene que compilarlo desde la línea decomandos:

    arm-linux-gcc -c -O -DMODULE -D__KERNEL__ a.c -I/usr/local/src/linux-2.4.18/include

    Puede enviar el resultado "a.o" al Simputer vía ftp y cargarlo en el núcleo mediante:

    insmod ./a.o

    Puede quitar el módulo mediante:

    rmmod a

    Manejando las interrupciones

    Después de ejecutar el programa anterior, empecé a investigar la fuente del núcleo para identificar el segmento de código más simple que demostrara algún tipo de acceso físico al hardware, y lo encontré en el driver de la clave hard. El Simputer tieen pequeños botones que actúan como las teclas de los cursores al presionarlos. Estos botones parecen estar conectados a los apliques de E/S de propósito general de la CPU ARM (que también se pueden configurar como fuentes de interrupciones, si mi recuerdo sobre el manual de StrongArm es correcto). Escribir un módulo del núcleo que responda cuando esas teclas sean presionadas es algo muy sencillo - aquí es un pequeño programa que sólo es una versión modificada y adecuada del driver mencionado -. Tú presionas el botón de la flecha derecha, y se genera una interrupción que resulta en que se ejecuta el manejador de interrupciones. El nuestro simplemente escribe un mensaje en pantalla y no hace nada más. Antes de insertar el módulo, debemos asegurarnos de que el núcleo del asistente no incorpora el código del driver de botón por defecto, y debería bastar con mirar en /proc/interrupts.

    Compile el siguiente programa mostrado más abajo en un fichero objeto (igual que hicimos con el programa previo), cárguelo usando "insmod", pruebe /proc/interrupts para verificar que se ha introducido la línea de interrupción. Al presioanr el botón se debería llamar al manejador de interrupciones, y cambiar también la cuenta de interrupciones mostrada en /proc/interrupts.

    
    #include <linux/module.h>
    #include <linux/ioport.h>
    #include <linux/sched.h>
    #include <asm-arm/irq.h>
    #include <asm/io.h>
    
    static void 
    key_handler(int irq, void *dev_id, struct pt_regs *regs)
    {
      printk("IRQ %d called\n", irq);
    }
    
    static int  
    init_module(void)
    {
      unsigned int res = 0;
      printk("Hai, Key getting ready\n");
      set_GPIO_IRQ_edge(GPIO_GPIO12, GPIO_FALLING_EDGE);
      res = request_irq(IRQ_GPIO12, key_handler, SA_INTERRUPT,
      "Right Arrow Key", NULL);
      if(res) {
         printk("Could Not Register irq %d\n", IRQ_GPIO12);
         return res;
       }
      return res ;
    }
    
    static void 
    cleanup_module(void)
    {
      printk("cleanup called\n");
      free_irq(IRQ_GPIO12, NULL);
    }
    

    Trabajo futuro

    Un asistente manual basado en Linux ofrece un montón de oportunidades para la diversión seria. A medida que aprenda más sobre el dispositivo, intentaré compartir mis hallazgos con los lectores.

    Referencias

    1. Página web del Proyecto Simputer
    2. Simputerland  y   PicoPeta - información sobre las actividades de desarrollo del Simputer de compañías que están fabricando y vendiendo el producto.
    3. Página web del proyecto Arm Linux
    4. Página web del Proyecto Lart. Muchos recursos buenos aquí. Usted podría desear comprobar el enlace "Clock Scaling" de este sitio. El escalaje de reloj te permite cambiar la velocidad de reloj del procesador al vuelo, lo cual es útil para ahorrar energía de las baterías.

     

    [BIO] Soy profesor en el IC Software de Kerala, India. Me habría gustado convertirme en químico orgánico, pero hago lo segundo mejor posible, como es ¡jugar con Linux y enseñar a programar!


    Copyright © 2003, Pramode C.E. Licencia de copia http://www.linuxgazette.com/copying.html
    Publicado en el número 87 de Linux Gazette,Febrero de 2003