|
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 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:
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.
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.
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:
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:
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:
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)).
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).
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.
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.
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.
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.
#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
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);
}
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.
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!
Publicado en el número 87 de Linux Gazette,Febrero de 2003