Programa de desarrolladores de e-readers bqDentro del programa para desarrolladores que acabamos de lanzar, empezamos por publicar una versión especial abierta de nuestro último firmware 4.2.0. Esta edición de firmware para desarrolladores convierte tu e-reader en un dispositivo abierto para tu libre desarrollo. Este firmware te ofrece acceso total al sistema Linux que corre en el dispositivo y te permite modificar el software del sistema y crear nuevas aplicaciones.

Dicho firmware es compatible con los siguientes modelos:

  • Cervantes Touch
  • Fnac Touch
  • Cervantes Touch Light
  • Fnac Touch Plus

Instalación del firmware para desarrolladores

Requisitos previos

  1. Registro en el programa de desarrolladores. Para poder asegurar que podemos seguir ofreciendo el soporte y garantía adecuada para nuestros dispositivos, vamos a empezar distribuyendo esta versión de software para desarrolladores bajo un programa especial. Si estás interesado en participar usando el dispositivo que has adquirido contacta con nosotros en: programa.desarrolladores@bqreaders.com.
  2. Cuenta de usuario en tienda. Simplemente necesitas un usuario asociado a la tienda de tu dispositivo. Una vez que hayas contactado con nosotros, tu dispositivo será autorizado en nuestra base de datos para que puedas instalar este firmware especial para desarrolladores en tu dispositivo y mantendrás su garantía.

Proceso de instalación

Después de haber solicitado el acceso al firmware de desarrolladores has de seguir este proceso para la instalación:

  1. Descarga el paquete de instalación del firmware de desarrolladores.
  2. Copia en la raíz de tu microSD el directorio bqupdate contenido en el archivo descargado.
  3. Crea un fichero de nombre I_WANT_TO_BE_A_HACKER y escribe en este archivo el número de serie de tu dispositivo con el siguiente formato: SN-ABCDE12345 ( p.e: para el S/N E606722CB03884 debes escribir SN-E606722CB03884 en el fichero)No se debe dar ninguna extensión al fichero, simplemente editarlo como texto plano.
  4. Copia el fichero I_WANT_TO_BE_A_HACKER a la raíz de tu tarjeta microSD.
  5. Inserta tu microSD en el dispositivo y deberá aparecer un dialogo para autorizar la instalación del firmware para desarrolladores en el dispositivo. Recibirás un mensaje indicando que la autorización ha sido correcta.
  6. Tras la autorización con éxito, apaga el dispositivo.
  7. Enciende el dispositivo y mantén presionado el botón Home mientras el dispositivo se está encendiendo.
No prestes atención al primer aviso en la autorización del dispositivo para la descarga si indica la pérdida de garantía, esto es simplemente una errata del diálogo en la versión 4.2.0. La garantía de tu dispositivo se mantiene.

Funcionalidades limitadas

El firmware para desarrolladores tiene cierta funcionalidad limitada por motivos de licencias y seguridad:

  • Todos los libros comprados en tu tienda asociada serán eliminados del dispositivo y no serán accesibles para proteger los derechos de autor, sin embargo, todos ellos seguirán disponibles en cualquiera de tus otros dispositivos o en tu e-Reader si restauras el firmware estándar. Los archivos almacenados en la memoria interna y la microSD se mantendrán.
  • Las funciones relacionadas con los diccionarios no estarán habilitadas.
  • No se recibirán notificaciones de las nuevas actualizaciones disponibles.

Restauración del firmware estándar

Si deseas restaurar el firmware estándar, con funcionalidad completa y acceso restringido al sistema, simplemente necesitas el firmware de restauración. El procedimiento es el habitual, copia el directorio bqupdate en la raíz de tu tarjeta microSD, insértala en tu dispositivo y enciende el dispositivo manteniendo el botón de Home pulsado. Asegúrate de mantener solamente el botón de Home y soltar el de Power tan pronto como se encienda la luz verde del dispositivo, si mantienes ambos pulsados lo que se intentará es arrancar usando la microSD en vez de la actualización.

Ten en cuenta que el proceso de restauración requiere de mucho más tiempo que una actualización manual normal, puede llegar a tardar alrededor de unos 40 minutos. Es una operación muy crítica y es realmente importante esperar hasta que el proceso haya finalizado sin apagar el dispositivo, la luz verde del dispositivo se mantendrá parpadeando durante el proceso. Para asegurarte de que el dispositivo no se apaga por falta de batería durante el proceso te recomendamos conectarlo al cargador.

Advertencia. Toda la memoria interna será formateada y se perderán todos los archivos almacenados en ella, el dispositivo volverá a su estado de fabrica y los libros almacenados por el usuario se perderán. Por lo tanto, considera hacer backup de tus archivos personales.

Advertencia. Necesitas mantener intacta la partición de rescue (mmcblk0p2) para poder usar el proceso de restauración estándar. Si has borrado o dañado esta partición necesitarías ejecutar el siguiente proceso de restaurado manualmente:
1. Arranca el dispositivo usando la microSD (Puedes ver como en el apartado más abajo).
2. Extrae manualmente el binario restore original.img de la imagen del fichero de la imagen de restaurado usando el keyring.
3. Ejecuta ./restore original.img.

Reinstalación del firmware de desarrolladores

Una vez has instalado el firmware para desarrolladores puedes reinstalar fácilmente este mismo firmware. Para ello, descarga el paquete de reinstalación de firmware de desarrolladores y sigue el procedimiento habitual descrito en el apartado anterior.

Funciones adicionales en firmware para desarrolladores

Acceso Telnet al dispositivo

El acceso Telnet al dispositivo se puede activar desde el menú “Ajustes” -> “Development Options”. Una vez activado, podrás acceder por Telnet a tu dispositivo, vía Wi-Fi o USB si lo has activado como interfaz de red (ver en el siguiente punto cómo hacerlo).

La contraseña de root estará vacía por defecto, así que recomendamos fijar una nueva contraseña (si planeas usar Telnet sobre Wi-Fi también recomendamos instalar ssh).

Interfaz de red a traves del USB

Se puede configurar el puerto USB del dispositivo como un interfaz de red desde el menú “Ajustes” -> “Development Options”Si activas esta opción, el dispositivo configurará una red en el interfaz usb0 con IP 192.168.4.1. Configura el interfaz usb0 de tu PC con otra IP del mismo rango (p.e: 192.168.4.2) y podrás acceder al dispositivo por Telnet a través de este interfaz sin necesidad de conectar el dispositivo a Wi-Fi.

Arranque de un sistema externo almacenado en la MicroSD

El firmware de desarrolladores te permite arrancar un sistema contenido en la microSD en lugar del que esta almacenado en la memoria interna. Este sistema recomendado para que puedas probar nuevos desarrollos, ya que podrás hacerlo sin riesgos manteniendo el sistema de la memoria interna intacto para su uso como e-reader. Para arrancar un sistema contenido en la microSD debes seguir los siguientes pasos:

  1. Formatea la primera partición de tu microSD con formato ext3.
  2. Copia un sistema de ficheros funcional en la partición creada (p.e: una copia del sistema ficheros de la memoria interna, puedes descargarlo de aquí).
  3. Copia una imagen de kernel valida con path /boot/uImage (el kernel de base esta directamente incluido en el rootfs del paso anterior).
  4. Inserta la SD en el dispositivo.
  5. Enciende el dispositivo mantenido pulsado el botón Power + botón Home hasta que el arranque se haya completado. Si el sistema externo usado es una copia de nuestro rootfs podrás confirmar que se está arrancando desde la microSD al tener la imagen de arranque de la aplicación de lectura un icono adicional de SD.

Advertencia. Es realmente importante mantener ambos botones presionados en el paso 5, si solamente se mantiene pulsado el botón “Home durante el arranque inicial se lanzará un intento de actualización en vez del arranque desde la microSD.

Comandos útiles

De cara a poder correr tus propias aplicaciones sin interferencia de la aplicación principal de lectura puedes usar los siguiente comandos:

  1. stopapp.sh. Este script parará la aplicación de lectura.
  2. restart.sh. Este script reiniciará la aplicación de lectura.

Mapa de memoria en el dispositivo y precauciones

Los  primeros 10MB de la memoria interna están reservados para datos críticos de bajo nivel directamente ligados al dispositivo específico. Datos como los siguientes se almacenan en este sector de memoria:

  • uboot. El binario necesario para arrancar el sistema. La corrupción de esta información provocará la imposibilidad de arrancar el dispositivo y requiere un difícil arreglo.
  • Numero de serie.
  • Información asociada al hardware.
  • Datos individuales asociados a las propiedades de la pantalla. La corrupción de esta información puede llevar a un mal funcionamiento parcial o total de la pantalla de tinta electrónica. En ocasiones, irrecuperable a un 100%.

Instalación del compilador cruzado

Dado que la arquitectura hardware del dispositivo está basada en ARM, tanto para el desarrollo del Kernel como de la aplicación es necesario poder crear ejecutables ARM compilando usando hardware x86.

En sistemas Ubuntu puedes encontrar un compilador cruzado compatible en el universo de archivos Ubuntu, por lo tanto un simple sudo apt-get install g++-arm-linux-gnueabi gcc-arm-linux-gnueabi debería ser suficiente para instalarlo.

En sistemas Debian el compilador cruzado necesario no es parte de la distribución actualmente, pero es parte del subproyecto Emdebian. Sigue las instrucciones en la wiki oficial  para instalar los paquetes necesarios: http://wiki.debian.org/EmdebianToolchain#Get_the_binaries

Para cualquier otra distribución puedes usar una toolchain genérica de Linaro: https://launchpad.net/linaro-toolchain-binaries/trunk/2012.04/+download/gcc-linaro-arm-linux-gnueabi-2012.04-20120426_linux.tar.bz2

Desarrollo del Kernel

Puedes encontrar todo el código fuente del kernel en https://bitbucket.org/mundoreader/linux-e60622.

El código correcto para crear un kernel funcional para el dispositivo está contenido en la rama topic/fixes. Para uso simple, como compilar el kernel, puedes hacer checkout de la rama de manera normal, pero para acceder a todas las funcionalidades de esta rama es recomendable el uso de topgit. El árbol completo de las ramas es el siguiente:

topic/fixes                        - Fixes propios sobre lo demás
    \- topic/backports             - Backports de funcionalidades de mainline (> 2.6.35)
            \- e60622_2.6.35       - Rama base del eReader
                     \- imx_2.6.35 - Rama base de Freescale para i.MX5 SoCs

 

Puedes encontrar un fichero .config funcional en el directorio base de las fuentes del kernel. Por lo tanto, los comandos de compilación cruzada estándar deberían ser suficientes para construir una nueva imagen de kernel:

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules

 

El kernel debe tener formato uImage para que el u-boot lo pueda reconocer.

Para que el u-boot arranque el nuevo kernel, cópialo a la carpeta /boot de la primera partición de tu sistema (por ejemplo en la uSD), sobrescribiendo el fichero uImage que se encuentre allí.

Sistema base

El sistema base  es una distribución Debian Wheezy para ARM, así que puedes instalar nuevo software fácilmente usando apt-get.

Recomendamos encarecidamente mantener el firmware interno como está y hacer todos los cambios y modificaciones en una microSD externa bootable que sea una copia del sistema original. Si aún te planteas instalar software con apt en el firmware interno puede necesitar expandir la partición de root de /var como una partición separada con espacio suficiente para datos de apt.

La conectividad del sistema está provista por connmanSi no quieres usar el interfaz proporcionado por la aplicación de lectura para conectar a una red Wi-Fi también lo puedes hacer a través de los comandos proporcionados por connman o el interfaz dbus.

Developing applications

Tienes distintas opciones para crear tus propias aplicaciones:

  • Usar Qt junto con los plugins ya proporcionados. Ésta es la manera más sencilla y recomendada para empezar.
  • Instala Xorg y hacer desarrollo en X ”customizado”. Necesitarás modificar el soporte del driver para el framebuffer.
  • Otras opciones (fb directo, gtk con fb, wayland/weston…)

Para poder enlazar tus aplicaciones probablemente necesites ciertas librerías y cabeceras. Puedes generar todo esto usando debian multistrap o copiándolo desde el sistema de ficheros del dispositivo. Sin embargo, por si no quieres tomarte estas molestias, la manera más sencilla es descargarte el sdk pre-generado que hemos preparado. Este SDK incluye algunas librerías de utilidades para hacer el desarrollo de aplicaciones más fácil.

Desarrollo de aplicaciones Qt para el dispositivo

Dependencias

Para compilar aplicaciones Qt ejecutables en tu dispositivo necesitas configurar estas variables de entorno para que el qmake use el compilador cruzado y enlace a las librerías Qt para ARM.

export ROOTFS=/path/to/your/rootfs-sdk/
export QTDIR=$ROOTFS/usr
export QMAKESPEC=$QTDIR/mkspecs/linux-arm-gnueabi-g++/

Hardware abstraction layer (Capa de Abstracción Hardware)

Para facilitar tu desarrollo puedes enlazar tus aplicaciones con la librería libbqHAL.so que proporciona cierta abstracción del hardware para funciones como la pantalla (la gestión de pantalla es bastante peliaguda en dispositivos de tinta electrónica), almacenamiento, consumo, batería, luz, etc… para usar esta librería simplemente incluye las cabeceras del SDK y llama a la inicialización estática de los módulos:

Screen::staticInit();
Storage::staticInit();
Power::staticInit();
Wifi::staticInit();
Battery::staticInit();
DeviceInfo::staticInit();

Una vez hecho esto, puedes acceder a sus funciones, por ejemplo:

FrontLight::getInstance()->setEnabled(false);

bqQtHelloWorld

Puedes descargar el ejemplo de bqQtHelloWorld bitBuckethttps://bitbucket.org/mundoreader/bqqthelloworld. Éste es un buen comienzo para empezar tu desarrollo en Qt. En esta simple aplicación encontrarás ejemplos de uso de algunas funciones hardware: encendido y apagado de frontlight, lectura de nivel de batería, refresco de pantalla y envío del dispositivo a modo de reposo. Además incluye los scripts para el compilado y la ejecución en el dispositivo.

Running Qt applications on the device

Antes de ejecutar aplicaciones Qt en el dispositivo es necesario fijar algunas variables de entorno para Qttslib (la librería que gestiona los eventos táctiles):

export QWS_DISPLAY=einkfb
export QWS_MOUSE_PROTO=tslib:/dev/input/event1
export QT_QWS_FONTDIR=/usr/lib/fonts
export QWS_KEYBOARD=eb600keypad:/dev/input/event0
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/usr/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/arm-linux-gnueabi/ts0/
export POINTERCAL_FILE=/usr/etc/pointercal

Creación de firmware personalizado

Si eres un gran desarrollador y has conseguido interesantes aplicaciones que quieres compartir con otros desarrolladores y usuarios, puedes empaquetarlas como una imagen del firmware que será instalable.

Para crear esta imagen :

  1. Empaqueta el sistema de ficheros de root en un archivo tar.gz.
  2. Usa gpg para encriptar y firmar este archivo usando la firma hackers-keyring-host.tar.gz y obtendrás la imagen.
  3. Coloca la imagen encriptada y su firma  en una carpeta llamada bqupdate con los nombres update.img update.asc respectivamente.
  4. Comprime la carpeta bqupdate a un zip.
  5. Comparte el fichero con la comunidad (smile).