domingo, 20 de mayo de 2012

Fabricar una microSD para arrancar el IGEPv2


= Que es el IGEPv2 =

El IGEPv2 board es una placa embebida muy parecida a la conocida Beagle board, pero con 512MB de memoria RAM y 512MB de NAND flash (en lugar de los 256 de la Beagle). Esta placa lleva una CPU muy rápida (un ARM Cortex A8, OMAP 3530 que corre a 720MHz), y una GPU PowerVR SGX530 a 110MHz que permite correr un servidor de X de manera eficiente. Ademas cuenta con puertos de I/O de audio estéreo, salida de video DVI-D usando HDMI (720p HD), ethernet RJ45, microSD, USB host/device y conectividad inalámbrica WiFi y Bluetooth.



Teniendo en cuenta que su tamaño es aproximadamente el mismo que el de una tarjeta de crédito, y que su consumo es de solo 5W, se trata de una placa muy apetecible para montar sistemas embebidos de todo tipo. La limitación aquí ya no viene dada por las capacidades de la placa, sino por la de tu propia imaginación...

Por el reducido consumo, yo lo usaré como servidor en Internet dedicado las 24h. Pero es solo una idea de las muchas que seguro se te ocurren: cámaras de vídeo vigilancia, receptores de GPS, TPV táctiles, lectores de tarjetas, cajeros automáticos, control de domótica, robots inteligentes, señalización de autopistas, videoconsolas, centro de datos multimedia, etc. etc. etc.

Es un hardware diseñado y fabricado íntegramente en Barcelona por la empresa catalana ISEE, que lo vende a un precio de 188€. Tratándose de un producto nacional, de una calidad excelente, y tal como están las cosas en este país con esta maldita crisis, merece la pena destacar a una empresa nacional que continua invirtiendo en I+D, y desarrollando tecnología puntera a nivel internacional.

= Material necesario para trabajar con el IGEPv2 =

Además del IGEPv2, necesitas material adicional para trabajar con la placa: un alimentador de 5V y un cable para el puerto serie de debug con conector plano (que también vende el fabricante). Una tarjeta microSD de al menos 2GB, un lector de tarjetas microSD, y si tu PC no tiene conector de puerto serie DB9 (lo habitual en estos días), un conversor de USB a DB9. También es necesario un conversor NULL MODEM (para cruzar las señales Tx y Rx). Sería ideal que el conversor de USB a DB9 ya fuera NULL MODEM (de esa manera nos evitamos comprar el conversor NULL MODEM), aunque yo no he encontrado ninguno de estos en el mercado.




= El arranque del IGEPv2 =

En general, los procesadores OMAP35xx pueden arrancar desde una microSD.

El IGEPv2 (basado en el OMAP35xx) usa la tarjeta microSD como el dispositivo de arranque de mas alta prioridad, lo que significa que el procesador intenta arrancar desde la microSD antes que intentar arrancar desde cualquier otro dispositivo (desde la NAND flash).

El procesador intenta cargar un archivo llamado MLO, que reside en la primera partición de la tarjeta microSD, y que también se conoce como x-loader. El procesador solamente carga y ejecuta el programa MLO e ignora el resto. El x-loader (MLO) pasa a ejecutarse por el procesador. Ya es responsabilidad del x-loader que el arranque continúe cargando un kernel, un bootloader (u-boot), o cualquier otra cosa.



= Fabricación de la microSD para arrancar el IGEPv2 =

La tarjeta microSD debe reconfigurarse con unas características determinadas para que puedas usarla para arrancar el IGEPv2:
  • Una geometría particular (heads, sectors, cilindros)
  • Dos particiones primarias (una de msdos 'boot' y otra de linux 'rootfs').

= Definir la geometría y las particiones en la microSD =

Mucho cuidado! Usaremos /dev/sde como fichero dispositivo para la microSD, pero ten en cuenta que este nombre de fichero dispositivo lo decide el kernel cuando detecta un nuevo dispositivo conectado al sistema, por lo que asegúrate de confirmar este valor antes de continuar (comando dmesg), o en caso contrario podrías dañar tu equipo completamente. Avisado quedas.

Borra la tabla de particiones:

    $ sudo dd if=/dev/zero of=/dev/sde bs=1024 count=1024

Arranca el fdisk sobre el dispositivo de la microSD con los flag -u=cylinders (para establecer unidades en cilindros) y -c=dos (para establecer el modo de compatibilidad DOS), ya que por defecto es NONDOS y la microSD que genera no funciona correctamente.

    $ sudo fdisk -u=cylinders -c=dos /dev/sde

Borra todas las particiones creadas en esa tarjeta SD:

    Command (m for help): [d]
    Selected partition 1

Printa la geometría actual de la tarjeta microSD:

    Orden (m para obtener ayuda): p
    Disco /dev/sde: 4035 MB, 4035969024 bytes
    125 cabezas, 62 sectores/pista, 1017 cilindros
    Unidades = cilindros de 7750 * 512 = 3968000 bytes
    Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
    Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Identificador de disco: 0x000a6737

La geometría de la tarjeta microSD debe ser esta:
  • 255 heads
  • 63 sectors/track
  • CCC cilindros
El numero de cilindros (valor CCC) se calcula de esta manera:

    4035969024 / 255 / 63 / 512 = 490.677734375

En este caso, CCC=490 (es decir, se trunca, no se redondea)

Como vemos en el listado obtenido antes, nuestra tarjeta microSD no tiene estos parámetros de geometría, por lo que tenemos que cambiarlos. Para establecer los valores calculados, entra en el modo extendido:

    Orden (m para obtener ayuda): x
    Orden avanzada (m para obtener ayuda): h
    Número de cabezas (1-256, valor predeterminado 125): 255
 
    Orden avanzada (m para obtener ayuda): s
    Número de sectores (1-63, valor predeterminado 62): 63
    Atención: estableciendo desplazamiento de sector para compatibilidad con DOS

    Orden avanzada (m para obtener ayuda): c
    Número de cilindros (1-1048576, valor predeterminado 1017): 490 (CCC)

Vuelve al modo normal, y printa el trabajo realizado:

    Orden avanzada (m para obtener ayuda): r

    Orden (m para obtener ayuda): p

    Disco /dev/sde: 4035 MB, 4035969024 bytes
    255 cabezas, 63 sectores/pista, 490 cilindros
    Unidades = cilindros de 16065 * 512 = 8225280 bytes
    Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
    Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Identificador de disco: 0x000a6737

Crea ahora la partición primaria de 'boot'

    Orden (m para obtener ayuda): n

    Acción de la orden
    e   Partición extendida
       p   Partición primaria (1-4)
    p
    Número de partición (1-4): 1
    Primer cilindro (1-490, valor predeterminado 1):
    Se está utilizando el valor predeterminado 1
    Último cilindro, +cilindros o +tamaño{K,M,G} (1-490, valor predeterminado 490): +8

    Orden (m para obtener ayuda): t
    Se ha seleccionado la partición 1
    Código hexadecimal (escriba L para ver los códigos): c
    Se ha cambiado el tipo de sistema de la partición 1 por c (W95 FAT32 (LBA))

Marca la partición de 'boot' como bootable:

    Orden (m para obtener ayuda): a
    Número de partición (1-4): 1

Ahora crea la partición primaria del 'rootfs':

    Orden (m para obtener ayuda): n
    Acción de la orden
    e   Partición extendida
       p   Partición primaria (1-4)
    p
    Número de partición (1-4): 2
    Primer cilindro (52-490, valor predeterminado 52):
    Se está utilizando el valor predeterminado 52
    Último cilindro, +cilindros o +tamaño{K,M,G} (52-490, valor predeterminado 490):
    Se está utilizando el valor predeterminado 490

El trabajo realizado hasta ahora debe visualizarse de esta manera:

    Orden (m para obtener ayuda): p

    Disco /dev/sde: 4035 MB, 4035969024 bytes
    255 cabezas, 63 sectores/pista, 490 cilindros
    Unidades = cilindros de 16065 * 512 = 8225280 bytes
    Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
    Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Identificador de disco: 0x4b4b1fee

    Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
    /dev/sde1   *           1           9       72261    c  W95 FAT32 (LBA)
    /dev/sde2              10         490     3863632+  83  Linux

Por último, graba y sal:

    Orden (m para obtener ayuda): w
    ¡Se ha modificado la tabla de particiones!
    Llamando a ioctl() para volver a leer la tabla de particiones.
    ATENCIÓN: Si ha creado o modificado alguna de las
    particiones DOS 6.x, consulte la página man de fdisk
    para ver información adicional.
    Se están sincronizando los discos.


= Formatear las particiones =

Antes de continuar, asegúrate de desmontar las dos particiones recién creadas, ya que a veces el auto montado las monta automáticamente, y ahora mismo no es lo que deseamos (comando umount). Después haz lo siguiente:

Formatea la partición de boot (label 'boot'):

    $ sudo mkfs.msdos -F 32 /dev/sde1 -n boot
    mkfs.msdos 3.0.7 (24 Dec 2009)

Formatea la partición del rootfs (label 'rootfs'):

    $ sudo mkfs.ext4 -L rootfs /dev/sde2
    mke2fs 1.41.11 (14-Mar-2010)
    Etiqueta del sistema de ficheros=rootfs
    Tipo de SO: Linux
    Tamaño del bloque=4096 (bitácora=2)
    Tamaño del fragmento=4096 (bitácora=2)
    Stride=0 blocks, Stripe width=0 blocks
    241920 nodos-i, 965908 bloques
    48295 bloques (5.00%) reservados para el superusuario
    Primer bloque de datos=0
    Número máximo de bloques del sistema de ficheros=989855744
    30 bloque de grupos
    32768 bloques por grupo, 32768 fragmentos por grupo
    8064 nodos-i por grupo
    Respaldo del superbloque guardado en los bloques:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

    Escribiendo las tablas de nodos-i: hecho
    Creating journal (16384 blocks): hecho
    Escribiendo superbloques y la información contable del sistema de ficheros: hecho

    Este sistema de ficheros se revisará automáticamente cada 37 montajes o
    180 días, lo que suceda primero.  Utilice tune2fs -c o -i para cambiarlo.

Con esto ya tienes lista la tarjeta microSD para arrancar el IGEPv2.


= Trabajo pendiente =

En la partición 'boot' hay que copiar 3 ficheros:
  • MLO: el binario del x-loader
  • igep.ini: un fichero de configuración proporcionado por ISEE
  • zImage: la imagen del kernel que deseamos arrancar.
Y en la particion 'rootfs' hay que meter:
  • El rootfs descomprimido (aplicaciones del userspace).
De momento dejaremos estas tareas pendientes para el próximo articulo del blog. Si te ha gustado lo que has aprendido en este articulo, continua atento en los próximos días!

Visitas:

Seguidores