BeagleBoard hacking (I)

(Si a esto se le puede llamar “hacking”)

Introducción y todo eso

La historia va más o menos así: Hasta hace poco no he tenido contacto con microcontroladores ni con la programación a nivel de máquina de verdad. Yo le echo la culpa al plan de estudios, ya que no se ve casi casi nada sobre estas cosas. Parece que entrenan a la gente ya directamente para que trabaje en consultorías, pero esto es otro tema.

Como ha resultado gustarme un montón este tema y parece que mi carrera profesional va a ir tirando por ese campo, es hora de que aproveche cada rato libre que tenga para hacer chapucillas y experimentos con micros, para recuperar el tiempo perdido. Es una lástima también que sea un terreno menos accesible que otros como la construcción de software de escritorio, aplicaciones web o bases de datos, ya que para aprender realmente a manejar un micro necesitas cierto material hardware, que en muchos casos no es ni siquiera asequible para un pobretico estudiante.

El caso es que ahora sí que dispongo de material, ganas y tiempo (más o menos). Tengo una placa de evaluación AT91EB40A que me dejó Jesús y que viene de lujo para aprender a hacer cosas sobre el ARM7TDMI y a manejar dispositivos y todas esas cosas. También estoy en medio de un proyecto sencillito con un PIC para controlar una matriz de 8×8 leds como si fuera una pantalla. Es una chulería porque así aprendo también a hacer mis propias placas de circuito impreso, entre otras cosas.

El cacharro

Y luego tengo la Beagle, que tiene el inconveniente de que no es una placa orientada al aprendizaje de estos chanchullos a bajo nivel, sino que está hecha para meterle un sistema operativo como Linux y programar sobre eso. Para empezar, el OMAP3 es una bestia de micro (el manual ronda las 3500 páginas), y los dispositivos de la placa no son tan fáciles de manejar como los de las placas de evaluación porque se controlan muchos de ellos a través de otros chips de apoyo, como el TPS65950. Pero algo se puede hacer, y todo es ponerse con un poco de paciencia. Además estoy aprendiendo un montón.

Metiéndonos en harina

Bien, lo que pretendo es ir escribiendo en el blog los experimentillos que voy haciendo, porque si no se me acabarán olvidando. Y si le sirven a alguien, pues mejor todavía. De todas formas, muchas de las cosas que pondré están sacadas del trabajo de otras personas que he encontrado por ahí.

Si dios quiere y tengo tiempo, la idea es hacer un experimento sencillo en la Beagle (por ejemplo, encender leds de la placa y recoger el estado de un botón) de varias formas, desde el nivel más bajo posible, en ensamblador y sin sistema operativo, hasta llegar al nivel de usuario en Linux.

Así que esta primera parte tratará lo más sencillo de todo: Cacharrear con los leds y el botón USER de la placa desde linux y al nivel más alto posible.

Ingredientes

Antes de nada, vamos a suponer que tenemos todas las cosas siguientes:

  • Una BeagleBoard
  • Un Linux instalado en ella. Yo estoy utilizando Debian
  • Alguna forma de acceder a una shell en el Linux de la placa. Yo conecto a través del puerto serie con el PC, pero se puede utilizar un teclado y un monitor en la placa directamente.
  • Manual de la BeagleBoard:  BeagleBoard System Reference Manual (se puede encontrar en beagleboard.org)
  • Manual del OMAP3530 (ojo, bicharraco de manual):  SPRUF98D (se puede encontrar en la web de Texas Instruments)

Detalles a tener en cuenta

Para poder hacer este experimento en concreto es necesario activar una opción del kernel llamada “CONFIG_GPIO_SYSFS”. Mirad a ver si la teneis activada. Si no lo está, habrá que compilar un kernel con esa opción. Cosas de la vida.

El meollo

Bien, cumplidos los requisitos anteiores vamos a ver qué podemos cacharrear con la placa. Como he dicho antes, hay unos cuantos dispositivos de la placa conectados directamente a GPIOs del micro. Entre ellos están los leds 0 y 1, y el botón USER. El puerto de expansión es todo gpios, pero para ver los resultados de activarlos y desactivarlos ahí habría que pinchar algo (un led nos vale).

Empezamos por los leds. Con el SO que le tengo yo instalada a la placa, una vez que este está en marcha, uno de los leds se pone a parpadear constantemente. Como molesta, vamos a ver cómo se puede apagar.

Como esta primera parte es para explicar cómo hacer estas cosas en espacio de usuario sin mancharse mucho, vamos a hacer uso del sysfs. El kernel de linux, si está configurado para ello, nos exporta amablemente a este sistema de archivos virtual muchas de las interfaces necesarias para toquetear el hardware. En nuestro caso, hay unos directorios que son /sys/class/led/beagleboard::usr0 y /sys/class/led/beagleboard::usr1 a través de los cuales podemos manejar esos dos leds a través de unos pseudoarchivos.

Por ejemplo, queremos apagar el led0 o, al menos, cambiar el modo de conmutación. Pues si miramos en un archivo llamado trigger dentro del directorio del led0 y vemos que la salida es algo así:

none mmc0 [heartbeat]

Es decir, que tiene 3 modos de encendido: “None” se supone que es para que no se encienda, “mmc0” para que se encienda cuando se hacen transferencias desde o hacia la tarjeta de memoria, y “heartbeat” que es el que está seleccionado, pues para que parpadee como los latidos de un corazón.

Así que si queremos apagarlo lo único que hay que hacer es cambiar el modo de encendido (en este caso a “none”). Lo podemos hacer así de simple:

echo “none” > trigger

La abstracción que nos proporciona el kernel nos permite olvidarnos de los detalles del hardware y hacer este tipo de operaciones así de sencillo, como escribir o leer en un archivo.

¿Y el directorio del botón USER dónde está? Esto es otra cosa. Los gpio de los leds 0 y 1 (gpio 149 y 150 respectivamente) están, por decirlo de algún modo, “reclamados” por el kernel. Pero el gpio 7, que es el del botón, no se está usando de momento. Sin embargo, podemos pedirle al kernel que nos exporte una interfaz en el sysfs para manejarlo.

Esto se hace en el directorio /sys/class/gpio. Entre otras cosas, hay allí un par de archivos llamados “export” y “unexport” que sirven precisamente para eso. Nosotros queremos acceder al gpio7, así que hacemos lo siguiente:

echo 7 > export

Y el kernel nos dará un nuevo directorio llamado gpio7 a través del cual podemos configurar y consultar el botón USER. Por ejemplo, podemos ver que dentro de ese directorio hay un archivo “value”. Si este archivo lo consultamos sin pulsar el botón:

cat value

nos devolverá 0, pero si repetimos la operación con el botón pulsado nos devolverá 1. Así, sin tener que meternos a programar módulos del kernel ni drivers, podemos utilizar esto para utilizar el estado del botón en una aplicación sencilla (mediante polling):

#include <stdio.h>
#include <unistd.h>

int main(void)
{
        int state = '0';
        FILE *fd;
        int read;
        unsigned int usecs = 100000;

        while(1) {
                fd = fopen("/sys/class/gpio/gpio7/value", "r");
                read = fgetc(fd);
                fclose(fd);
                if(read != state) {
                        if(read == '1') {
                                printf("Boton pulsado\n");
                                state = '1';
                        }
                        else {
                                printf("Boton soltado\n");
                                state = '0';
                        }
                }
                usleep(usecs);
        }
}

Lógicamente, el polling no es la técnica más eficaz. Pero en otras entregas del minicurso este veremos si dios quiere, cómo hacer estas cosas como los hombres. Es decir, con interrupciones a nivel de kernel. Un saludete

Anuncios

1 comentario »

  1. ayudita said

    Veo que eres todo un artista con la bleagle, yo al contrario que tu me estoy volviendo tarumba.

    Aun estoy metiendo un linux en mi caso el ubuntu 10.4 fat 16 y ext3/4 y no me sale shell lo ultimo que me sale es lo de “mounted” cuando monta el filesystem y he probado con algun script y ninguno me termina de funcionar bien todos me fallan en algo.

    Si me pasaras un script o algo que meta el SO de una vez estaría genial o alguna aplicación que lo haga tipo “instaler en usb” pero para este cacharo.

    Sé queda aquí:

    [ 3.792358] EXT3-fs: barriers not enabled

    [ 8.311248] EXT3-fs (mmcblk0p2):

    [ 8.314575] kjournald starting. Commit interval 5 seconds

    [ 8.320404] recovery complete

    [ 8.464691] EXT3-fs (mmcblk0p2): mounted filesystem with ordered data mode

RSS feed for comments on this post

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: