Probando el marco digital Parrot DF3120 (parte 2)

En el anterior artículo explicaba cómo instalar linux en el marco digital Parrot DF3120. En este explicaré cómo generar el toolchain para poder crear programas que funcionen en el marco digital. De paso crearemos una versión de la imagen más moderna para nuestro marco. El artículo original que lo explicaba es este, pero está desfasado y hay que hacer retoques para que funcione bien.

Lo voy a hacer todo desde mi linux Ubuntu 11.10, por lo que es posible que algunas cosas haya que modificarlas si usáis otra distribución.

Lo primero es instalarse usa serie de paquetes que son necesarios para que todo el proceso sea correcto:

Después hay que bajarse minifs con el git:

A continuación hay que hacer un par de modificaciones:

  • Edita el fichero minifs/conf/board/df3120/config_busybox.conf y reemplaza la línea # CONFIG_CHMOD is not set por CONFIG_CHMOD=y
  • Edita el fichero minifs/conf/packages/05crosstools.sh y reemplaza la línea hset libtool url «http://ftp.gnu.org/gnu/libtool/libtool-2.4.2.tar.gz» por hset libtool url «http://ftp.gnu.org/gnu/libtool/libtool-2.4.tar.gz»
  • Edita el fichero minifs/conf/packages/11graphical.sh y reemplaza la línea hset libpng url «ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.4.8.tar.bz2» por hset libpng url «ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.4.9.tar.bz2»

Después ya podemos ejecutar el script de la siguiente forma (Puede tardar varios minutos):

Ahora vemos que entre otras cosas se han creado dos ficheros en el directorio build-df3120, un .img y un .plt. Pues bien con ellos hay que volver a hacer lo mismo que comentaba en el anterior artículo. Si todo ha ido bien veremos la nueva versión del firmware donde lo más destacado es que aparecen los mensajes de arranque:

Ahora vamos a compilar nuestro primer programa, y cómo no, tenía que ser un Hola Mundo:

Copiamos el código que aparece arriba y lo guardamos en un fichero llamado holamundo.c. Después ejecutamos el siguiente comando:

Esto habrá generado un fichero ejecutable llamado holamundo, pero ¿cómo lo subimos al marco para ejecutarlo?. Pues bien entre otros comandos el marco tiene dos, el tftp y wget para descargar ficheros mediante el protocolo tftp y http respectivamente, por tanto hay que instalar un servidor web o tftpd en nuestra máquina linux.

Servidor web apache:

Servidor tftp: Instrucciones

Si hemos optado por el servidor web sólo hay que copiar el fichero holamundo al directorio /var/www. Si la elección ha sido tftpd entonces hay que copiar el fichero holamundo al directorio que se haya configurado.

Ahora tenemos que descargarlo desde el marco digital. Hacemos un telnet como explicaba en el anterior artículo. En el firmware actual todo el disco está montado como sólo lectura, por lo que tendremos que remontarlo como escritura también de la siguiente forma:

Ahora nos vamos al directorio /tmp y descargamos el programa.

Para tftp el comando sería:

Para wget el comando sería:

Ahora que tenemos el fichero, hay que darle permisos de ejecución y finalmente ejecutarlo:

Obtendremos esto:

Ya hemos compilado nuestro primer programa y lo hemos hecho funcionar, pero claro, nos interesa que se pueda dibujar en la pantalla algo para ver cómo se ve en el marco. Lo primero que hay que saber es que la pantalla tiene asignado el dispositivo /dev/fb0 y que lo que tenemos que conseguir es acceder a su memoria para escribir directamente los colores. Esto se consigue de la siguiente forma:

Con la función open abrimos el dispositivo como lectura/escritura:

Con la función ioctl recibimos en una estructura información sobre la pantalla:

Con la función mmap obtenemos el buffer de la memoria de vídeo para leerlo y escribir en el:

Ahora sólo queda dibujar los bytes en la memoria para que se vean reflejados como pixeles en la pantalla. Al poder representar la pantalla 64k colores estos se codifican a RGB mediante 16 bit con el formato 5-6-5 (rrrrrggggggbbbbb). Así el rojo es 1111100000000000 (0xF800), el verde es 0000011111100000 (0x07E0) y el azul es 0000000000011111 (0x001F). Por tanto cada pixel en la pantalla ocupa 16 bits.

Para probar todo esto he creado un programa que muestra un cuadro verde rebotando por el marco usando la técnica de doble buffer para evitar parpadeos:

Que ejecutándolo quedaría así:

En un próximo artículo explicaré como acceder a la interfaz con SDL, comunicarse con bluetooth mediante RFCOMM y obtener los valores de los botones traseros y del inclinómetro.

Edición 12/02/2012:

1º artículo

3º artículo

25 comentarios en “Probando el marco digital Parrot DF3120 (parte 2)

  1. heli

    ¡Que máquina! Como se nota que lo mio es el hardware, llevo todo el fin de semana sin poder compilar correctamente la toolchain bajo SuSe 12.1 de 64 bits.
    A ver si con tu tutorial lo consigo.

    Responder
    1. admin Autor

      Por lo visto los tutoriales estan un poco desfasados (Hay más funcionalidades de las que comentan) y han añadido nuevas cosas y usado otras que no vienen en las guías (programas a instalar y versiones de paquetes). Por eso lo he ido recopilando aquí. Ya me dirás si al final lo conseguiste.

      Responder
  2. heli

    Para configurar uboot para 32 MB hay que modificar unos comentarios en:
    minifs/build-df3120/uboot/include/configs/df3120h
    #define PHYS_SDRAM_1_SIZE 0x00800000 /* 8Mb */
    // #define PHYS_SDRAM_1_SIZE 0x02000000 /* 32Mb */
    Tambien hay una linea al final:
    #define CONFIG_EXTRA_ENV_SETTINGS
    que podria usarse para redirigir stdout a otro stream que no sea usb0
    (framebuffer?)

    Responder
    1. admin Autor

      Fantástico. Ahora si que se puede usar todo el potencial del marco. Lástima que en mi caso no tenga herramientars para desoldar el chip de memoria para sustituirlo por otro.

      Responder
  3. doragasu

    Impresionante tutorial, ¡has matado de 1 tiro la creación del toolchain, el paso de archivos y la escritura de gráficos como está mandado (con doble buffer) en la pantalla!

    Y el siguiente tuto del Bluetooth se me antoja también un indispensable.

    Yo he recibido ayer mis 2 marcos, pero no he tenido mucho tiempo para trastear. En un rato que tuve he sustituido el chip de SDRAM que trae por un MT48LC16M16A2P-75, y el marco sigue arrancando, con lo que intuyo que la modificación ha ido bien. Eso sí, aún no me he puesto con el software, a ver si cuando pueda me pongo y os cuento a ver si van esos 32 MB.

    Responder
  4. doragasu

    He seguido el tutorial para compilar la distro, y tras ejecutar el minifs_build.sh, después de un buen rato, el script acaba sin errores, pero dentro del directorio build-df3120 no está ni el .plf ni el .img (ni en ningún otro subdirectorio, he buscado con find).

    El toolchain se compila bien (puedo ejecutar el compilador cruzado), y dentro del directorio build-df3120 hay muchos subdirectorios con cosas compiladas, pero nada del plf ni de la imagen.

    ¿Alguna sugerencia?

    Responder
  5. doragasu

    Ya he dado con el error, pero ni idea de cómo solucionarlo. Al hacer el configure de libglib, me da este error:

    checking for glib-compile-schemas… no
    configure: error: Could not find a glib-compile-schemas in your PATH

    PD: Perdón por inundar los comentarios con mis dudas.

    Responder
    1. admin Autor

      No te preocupes por exponer tus dudas, esto sirve para otra gente que viene detrás y tenga el mismo problema. Hiciste el sudo apt-get install libglib2.0-dev?

      Responder
  6. doragasu

    En efecto ya tenía instalado de antes el paquete libglib2.0-dev, pero probé a reinstalarlo por si acaso y no solucionó nada.

    He probado a repetir todo el proceso en una distro Ubuntu 11.10, y ha compilado perfecto. Creo que es un problema con Ubuntu 10.10, que no incluye el binario glib-compile-schemas. También probé a copiar este binario «a pelo» en mi PC y pasa con éxito la fase de configuración, pero falla al compilar con este error:

    http://pastebin.com/FT1mxFYL

    Creo que va siendo hora de actualizar mi Ubuntu 10.10…

    Responder
    1. admin Autor

      Es bueno saber que hay que tener una versión reciente para hacerlo funcionar. ¿El Ubuntu que usaste y que te funcionó era de 64 o de 32 bit?

      Responder
  7. doragasu

    El que falló fue Ubuntu 10.10 64 bits.
    El que funcionó fue Ubuntu 11.10 64 bits.

    Mientras buscaba por Google para intentar averiguar algo, vi gente que tenía también ese problema con Ubuntu 10.10 para compilar otros paquetes que nada tienen que ver con esto, debe ser un problema de esa versión en concreto.

    Responder
  8. doragasu

    Sigo con los problemas 🙁
    He logrado que el sistema arranque con el u-boot preparado para 8MB, pero cuando modifico la linea correspondiente a la RAM de 32MB, recompilo u-boot y lo actualizo, no logro que arranque, se queda la pantalla negra. Si vuelvo a recompilar para 8MB, arranca sin problemas. Lo único que cambio son estas 2 líneas, dejándolas así:

    //#define PHYS_SDRAM_1_SIZE 0x00800000 /* 8 MB */
    #define PHYS_SDRAM_1_SIZE 0x02000000 /* 32 MB */

    ¿Alguien podría pasarme un .plf preparado para 32MB que sepa que funciona?

    Responder
  9. heli

    Hola, yo tembien he sufrido mucho con la toolchain. La he compilado con ubuntu 11.10 32 bits sin problemas (despues de ir instalando los paquetes que faltaban). Con SuSe 12.1 x64 también, pero no me gusta esta versión. Con SuSe 11.4 x64 tuve que instalar las libtools de la versión 12.1 (modificando los repositorios de soft.)
    Pese a todo no he podido arrancar correctamente el linux en el marco, kernel panic y otros errores, probaré el tema del formato de la SD con ext3 y crear la partición.
    En cuanto a la modificación y ampliación de memoria, en el directorio del uboot hay un fichero .S con una línea comentada que podría ser necesaria también para usar los 32M. Se trata de la inicialización del hardware de la unidad de gestión de memoria.
    EL mecanizado de la tapa trasera con taladritos queda muy bien:
    https://picasaweb.google.com/helitp/MarcoParrot?authuser=0&feat=directlink

    Seguiré probando el firmware…

    Responder
  10. doragasu

    He estado investigando el tema de la SDRAM, y parece que el tema de conseguir los 32MB RAM funcionando no es tan sencillo como parecía.

    Después de 2 tardes enteras haciendo pruebas con u-boot, modificando la rutina que configura la SDRAM (lowlevel_init.S en board/df3120), me daba la impresión de que la rutina no se ejecutaba. Probé a borrarla entera y para mi sorpresa Linux seguía arrancando bien en el modo 8MB. La conclusión es que esta rutina no estaba haciendo nada. Me conecté al IRC al canal #df3120 y allí me confirmaron que si usas el bootloader de Parrot, este inicializa la SDRAM a 8MB y cuando carga u-boot ya está en la SDRAM, por lo que no puede reconfigurarla. ¿Soluciones al problema? Hay 2 opciones:

    1.- Usando un programador JTAG, eliminar el bootloader de Parrot y reemplazarlo por u-boot. Tiene el problema de que se pierde la funcionalidad de marco, y la facilidad de actualizar u-boot con el cable USB.
    2.- Mantener el bootloader de Parrot, pero modificar u-boot, para que cuando se cargue, se copie a la SRAM interna de 4KB de la CPU, y se ejecute desde ahí, pudiendo entonces reconfigurar la SDRAM.

    La opción 2 se escapa a mis posibilidades (supongo que requiere bastantes conocimientos de ensamblador de ARM). Para la opción 1, tengo uno de estos (http://code.google.com/p/opendous/wiki/JTAG) que supongo que valdrá, pero nunca lo he usado y no me vendría mal un tutorial. Si alguno sabéis de uno, avisad.

    Responder
  11. David

    Muchas gracias, usando tus instrucciones de base he conseguido que funcione todo, e incluso juguetear un poco con SDL…

    Quedo con ganas de la tercera parte, sobre todo el tema de los botones, que no se de donde coger el evento (si me adelantas alguna pista…)

    Gracias!

    Responder
    1. admin Autor

      Hola

      Me temo que es algo complicado de explicar en un comentario. A grandes rasgos consiste en abrir con open el fichero /dev/mem, configurar unos bits para que los GPIO sean entradas y leer esos bits a continuación, todo dentro de ese segmento de memoria. Estoy todavía probando cosas ya que no conozco el dispositivo ni sus posibilidades y carencias, por el momento tengo problemas con el bluetooth para crear un puerto serie con spp.

      De todas formas si quieres un códgido que funciona mira esto: http://rflk.googlecode.com/svn-history/r9/trunk/sw/lib/gpio-s3c2410/gpio.c

      Después de compilarlo y de subirlo al marco ejecuta esto:
      gpio F2=Z
      gpio F3=Z
      gpio F4=Z

      Ahora pulsa cualquiera de los 3 botones de la parte de atrás y sin soltarlo ejecuta gpio sin parámetros, verás en la lista del puerto F que hay dos «1» y un «0», el «0» es el botón que has pulsado y los «1» son los botones que no has pulsado.

      Responder
  12. fabien

    muy buen tuto!! asi falta algo asi, yo tengo una pandboard y he realizo algo muy parecido has probado algo asi ? conoces la pandaboard ?te la recomiendo. me gustario activarles los GPOIs pero no he podido

    Responder

Responder a doragasu Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *