Google+ Room Technology: diciembre 2012

sábado, 8 de diciembre de 2012

Mini2440:SO Android, Jugando con el Kernel.


Uno de las sistemas operativos que soporta el Mini2440 en los cuales  se puede gestionar los recursos de hardware y proveernos servicios de programas de aplicación es Android que esta basando en el kernel de Linux y diseñado especialmente para dispositivos que posean una pantalla táctil.

Uno de los primeros problemas que me encontré al querer instalar Android en el Mini2440 fue que los distribuidores del dispositivo no habían compilado el kernel para soportar mi LCD (dispongo de una LCD W35 240x320),  por lo que no tuve otra opción que googlear un par de noches que estaba libre para poder solucionar mi inconveniente. Por suerte la ayuda no me fue esquiva y encontré la solución, aunque no de un modo muy especifico (me toco unir varias experiencias de otros usuarios). Toda esta ayuda la encontré en los foros de soporte técnico de FriendlyArm (Clic Aqui). Si quieres saber algo mas o tienes una duda, no lo dudes pide apoyo a la comunidad de desarrolladores.

Ahora si tu también tienes un problema similar o quieres simplemente probar suerte con el kernel de Android a lo Chuck Norris te voy a tratar de resumir lo que yo hice en especifico (no me considero un experto en Linux así que cualquier error por favor pido disculpas). Como ya se pueden imaginar sera necesario una PC con Linux y que tenga instalada alguna distribución  en mi caso particular yo tengo Ubuntu 12.04 LTS.
Los pasos a realizar son lo siguientes:
 
                   1.- Descargar el kernel, archivos de sistemas y el compilador cruzado.
                   2.- Instalar las Herramientas necesarias.
                   3.- Instalar el compilador cruzado.
                   4.- Modificando y compilando el kernel.
                   5.- Preparando el sistema de Archivos de Android.
                   6.- Instalación del SO en el Mini2440.

Abrimos una terminal por que todo lo haremos en modo comandos, te recomiendo que si eres novato en Linux leas un poco sobre comandos básicos para que lo que voy a hacer sea un poco mas entendible.
En cuanto a los permisos para ejecutar los comandos les recomiendo hacerlo como root, pero si no tienen permisos para root el comando sudo seria mas que suficiente.

1.- Descargar el kernel, archivos de sistemas y el compilador cruzado. 

-Para descargar el kernel Clic Aqui
-Para descargar el Sistema de Archivos Clic Aqui
-Para el compilador cruzado Clic Aqui

2.- Instalar las herramientas necesarias.

Vamos a necesitar un editor de texto llamado 'Geany', mi elección en este editor se basa en que nos proporciona un interfaz perfecta para crear código en diferentes lenguajes. Para la instalación lo realizamos desde terminal:

                    $sudo apt-get install geany

Debemos tener disponible también la librería Ncurses que es una biblioteca de programación que provee una API que nos permite escribir interfaces basadas en texto (comandos) para la compilación del kernel.  


                   $sudo apt-get install libncurses5-dev

Necesitaremos la herramienta YAFFS que es un sistema de archivos creado para memorias tipo NAND. Para descargarlo Clic Aquí.

3.- Instalar el compilador cruzado.

Antes que nada ¿Para que me va a servir un compilador cruzado? Para poder responder ampliamente a esta pregunta que muchas personas quizás se hayan hecho debemos entender lo que es un cross-compiler.

Un cross-compiler es un compilador capaz de crear código ejecutable para otra plataforma distinta a aquella en la que se ejecuta. Por lo tanto nos servirá de maravilla para crear código para el Mini2440 (la arquitectura del Mini2440 es ARM920T y la de una PC en general es muy diferente), como seria muy difícil crear código dentro del Mini2440 es mejor usar un cross-compiler para hacerlo en una PC común y corriente y después solo ejecutar ese código en la plataforma del ARM.

Nos ubicamos en la carpeta donde se descargo el paquete. En mi caso en la Carpeta Downloads

                     $cd /home/eddie/Downloads/
                     $ls -la 

Debería salirnos una ventana similar:


Ahora descomprimimos los archivos

                     $tar -zxvf arm-linux-gcc-4.3.2.tgz

Tardara un tiempo de descomprimir los archivos. Después de esto ingresamos los siguientes comandos: 

                     $cd usr/local/
                     $mv arm/ /usr/local/
                     $cd ../..
                     $rm -rf  usr/
                     $cd /usr/local/
                     $geany ~/.bashrc

En el ultimo comando lo que hicimos fue abrir con el editor 'Geany' el archivo 'bashrc'. Este archivo contiene toda la configuración de la terminal o bash como quieras llamarlo, que es donde podemos interactuar por medio de texto con la computadora.
El cross-compiler tiene unos comandos adicionales por lo que hay que hacerle saber al terminal donde se encuentran estos comandos para cuando los llamemos sepa ejecutarlos sin problemas, de ahí la necesidad de editar este archivo.
Al final del documento pegamos lo siguiente: "export PATH=$PATH:/usr/local/arm/4.3.2/bin" y después guardamos el archivo.


Para que los cambios se apliquen cerramos el terminal y nuevamente lo abrimos y ponemos lo siguiente:
                     
                     $arm-linux-gcc -v


Si todo esta bien debera salir algo similar a esto: 


4.- Modificando y compilando el Kernel.
                     
Como ya les mencione antes la distribución de Android que proporcionaba la empresa para instalarla en  el Mini2440 no estaba configurada con mi tipo de Pantalla (W35) es decir no estaba el kernel compilado para esta pantalla. Ahora para compilar el kernel para que trabaje con este tipo de pantalla solo hay que realizar los siguientes pasos (El kernel de Android debe estar descargado) :

                    $cd /home/eddie/Downloads/
                    $tar -zxvf android-kernel_20090825.tgz
                    $cd kernel/
                    $geany arch/arm/mach-s3c2440/mach-mini2440.c

Este archivo contiene los tipos de pantalla y sus configuraciones por lo que sera necesario modificar para adaptarlo a la resolución de nuestra pantalla.  En la linea 169 del documento veremos que hay unas resoluciones correspondientes a la pantalla T35 la cual es de 320x240.


Todo esto lo cambiaremos por la siguiente configuración y guardamos los cambios.


Es de esperar que como cambiamos la orientación de la pantalla LCD en el kernel la manera en como responderá la pantalla táctil a las pulsaciones no sera la misma por ello faltaría modificar un archivo mas, ingresamos el siguiente comando:

                   $geany drivers/input/touchscreen/s3c2410_ts.c

En las lineas 99 y 100 del documento haremos los siguientes cambios:

Cambiar esto

Por esto.

Ya hemos hechos los cambios necesarios en el kernel lo que nos toca hacer por ahora es compilar dicho kernel modificado.

                   $cp config_mini2440 .config
                   $make menuconfig

Se nos mostrara el API de Ncurses.


Como ya modificamos el kernel solo salimos de esta interfaz eligiendo <Exit>. Después ingresamos en la terminal:

                    $make zImage

Nota: Es posible que en el ultimo paso les salga un error como "arm-linux-gcc command not found", esto lo arreglamos solo agregando el PATH del cross-compiler al archivo bashrc. Hacer esto solo si no compila el kernel.

Tardara aproximadamente 10 minutos compilar por completo el kernel, una vez listo saldrá esto en la terminal. 


La zImage estara en arch/arm/boot/zImage.

4.- Preparando el Sistema de Archivos de Android. 

En la terminal nos movemos a la carpeta donde descargamos el sistema de archivos y descomprimimos el paquete.

                    $cd /home/eddie/Downloads/
                    $tar -zxvf android-fs_20090825.tgz


La carpeta descomprimida contiene los archivos root del sistema de Android, con un editor de texto abrimos el archivo default:

                    $geany fs/default.prop

Vamos a cambiar estos parámetros:


Por estos:


Ahora descomprimimos el paquete que contiene la YAFFS2

                     $tar -zxvf linux-mkyaffs2image.tgz 
                     $ cp usr/sbin/mkyaffs2image-128M /home/eddie/Downloads/

El comando ultimo copia la YAFFS2 para memorias NAND de 128MB (el Mini2440 que tengo tiene una memoria de ese tamaño, recomiendo verificar la tuya para que puedas copiar el archivo correcto) a la carpeta donde se descomprimió el sistema de archivos fs.

                     $./mkyaffs2image-128M fs/ mini2440W35i_android.img


Deberá salir lo siguiente:


El archivo estara de la carpeta donde descargaste los demás archivos con el nombre: mini2440W35i_android.img

6.- Instalar el SO Android en el Mini2440.

La instalación es similar a la de Linux, recomiendo ver este post para refrescar la memoria.
  1. Poner el switch boot en NOR del Mini2440 mienstras este esta en OFF.
  2. Conectar el cable USB y USB-SERIAL del Mini2440 a una PC que tenga XP.
  3. Abrir el DNW y elegimos CONFIGURATION>>OPTIONS y elegimos el puerto serial correspondiente, un Baud Rate =115200 y Address USB=0X30000000.
  4. Despues Serial Port>>Connect.
  5. Ponemos en ON el switch del Mini2440.
  6. Presionamos x para formatear la memoria.
  7. Presionamos v para transmitir el Supervivi.
  8. Presionamos k para la zImage (kernel).
  9. Presionamos y para el sistema de archivos: mini2440W35i_android.img.
  10. Apagamos el Mini2440 y el swithc de boot lo ponemos en NAND.



miércoles, 5 de diciembre de 2012

Mini2440: SO Linux Instalación

Como ya les había mencionado antes este ARM soporta tres SO diferentes: LINUX, ANDROID y WINDOWS. Por ello en este espacio les mostrare como instalar específicamente Linux con todos los pasos  que yo seguí y los problemas que pueden surgir y como los solucione.

LINUX:
Linux es un SO operativo potente, seguro y gratuito que vio la luz por allá en los inicios de la década de los 90. El kernel que soporta el Mini2440 y que  vamos a utilizar es el 2.6.32.2. Como se sabe el kernel es considerado el corazón del SO que esta encargado de que el software y hardware trabajen juntos de manera armoniosa. 
Ahora la distribución de Linux que usaremos en el Mini2440 sera QTOPIA  2.2.0  (ahora llamado QT EXTENDED). Este SO es una plataforma de aplicaciones para dispositivos como móviles, PDA's, Pockets PC , etc. Desarrollada por TROLLTECH bajo licencia tipo GPL (libre).

Vista del menú de Linux Qtopia.

Ahora si teniendo una idea de con que vamos a tratar estamos listos para portar el SO Qtopia en el Mini2440. Necesitaremos:
        -Un cable serial (en este caso un USB-SERIAL).
        -Una extensión de cable serial de conector tipo  Hembra-Hembra.
        -Un cable USB.
        -Y lógicamente el Mini2440 conectado a  su respectiva fuente de Voltaje.



Lo que si les recomiendo y esto basado en mi propia experiencia es que utilicemos una PC que tenga WINDOWS XP, pues el controlador del cable USB para el Mini2440  solo es compatible para XP, es verdad que es posible utilizar una maquina virtual pero a mi me surgió el siguiente problema: Estaba utilizando VMware pero tenia problemas con la utilización de los puertos USB cuando estaba corriendo XP (tengo una portátil con WINDOWS 7 ), en ocasiones los puertos los reconocía XP y en otras WINDOWS 7 y todo era una caos completo, trate con todas las soluciones posibles que encontraba en Internet pero ninguna dio resultado por lo que opte usar una PC con XP.

Para los controladores del cable USB-SERIAL para XP: Descargar AQUI.
Para los controladores del USB para el Mini2440 para XP Descargar AQUI. También se lo puede descargar de la pagina oficial http://www.friendlyarm.net en la sección de Descargas.

Instalamos los controladores y ahora necesitaremos estos archivos:
         -DNW for XP: Programa para la transferencia de ficheros del PC  al Mini2440.
        -Hay un archivo especial que no es el mismo para todo los Mini2440, hablo del Supervivi. Para identificar cual tenemos solo damos un vistazo al  chip de la memoria NAND que esta cerca de la tarjeta SD y según su serie identificamos el Supervivi correspondiente:



K9F1208 > 64 MB NAND Flash
K9F1G08 > 128 MB NAND Flash
K9F2G08 > 256 MB NAND Flash
K9F8G08 > 1024 MB NAND Flash

El supervivi-64M es para 64MB NAND y el supervivi-128M es para 128MB / 256MB / 1GB NAND. El link descarga para estos archivos esta AQUI.

        -Ahora el kernel de Linux: Con este archivo hay que tener cuidado pues este depende enormemente del tipo de pantalla LCD que disponemos (ya explicare por que, mas tarde en este mismo blog) en mi caso yo dispongo de un LCD W35, recomiendo investigar cual disponen ustedes. En mi caso fue fácil pues la descripción estaba presente en la misma LCD ojala que con uds. sea lo mismo. Igualmente aquí les dejo los archivos para los varios tipos de pantalla LCD en los que esta disponible el Mini2440 (Descargar AQUI).

        -La imagen del SO QTOPIA Descargar AQUI.

Conectamos los cables SERIAL y USB de la PC al Mini2440, para el cable serial se recomienda la extensión para que los conectores se correspondan sin problemas.Una vez conseguido estos archivos ejecutamos el DNW (recomiendo extraerlo del zip).



Nos vamos a CONFIGURATION>OPTIONS y elegimos el puerto serial correspondiente, un Baud Rate=115200 y un Address del USB=0x30000000.



Elegimos SERIAL PORT>CONNECT si todo esta bien aparecerá en la barra de la ventana lo siguiente :[COM3,115200] .



 Seteamos en NOR el switch para el modo del boot, esto mientras esta en OFF el switch de energía (para encontrar el switch por favor revisar la imagen siguiente).



Encendemos el Mini2440 poniendo en ON el switch de energia. En el modo NOR el LCD esta apagado, pero en la barra de estado del DNW si todo esta bien aparecerá [USB:OK].Ademas se desplegara un menú con opciones, en algunas ocasiones este menú no se despliega pero no hay problema mientras la barra de estado muestre lo dicho anteriormente todo estará bien.



Ahora nos tocara formatear la memoria  NAND FLASH donde esta el boot inicial para ello presionamos x. Deberá aparecer los siguiente:



Después presionamos v para subir al Mini2440 el archivo Supervivi. Después de esto nos vamos a USB Port>Transmit y elegimos el supevivi correspondiente en este caso para mi dispositivo supervivi-128M. En algunas ocasiones en el cuadro de dialogo no aparece el archivo que necesitamos, para solucionarlo solo seleccionamos ALL FILES en donde dice TYPE.







Ahora le toca el turno al kernel, presionamos k , inmediatamente USB Port>Transmit y elegimos el archivo imagen correspondiente a la pantalla que tenemos, en mi caso personal el zImageW35



¿Que pasa si eligo una que no corresponde a mi LCD? La respuesta es simple: El DNW no te dará ningún error (al menos eso es lo que se sucedió en mi ARM) y parecería que todo estuviera bien, pero cuando finalicemos y encendamos el Mini2440 la pantalla presentara errores en mi caso me presento solo hasta la mitad la interfaz gráfica esto por que el kernel esta compilado con otra tipo de resolución para la pantalla LCD.

En la ultima parte cargamos la imagen del SO QTOPIA, presionamos y. De la misma manera USB Port>Transmit y elejimos la imagen.




Hasta que finalice tardara un considerable tiempo. Después apagamos el Mini2440 y regresamos el switch de BOOT a NAND para que arranque desde ese sector de memoria, y encendemos nuevamente el Mini2440 con nuestro sistema operativo QTOPIA.

Para las configuraciones iniciales (nos pedirá calibrar la pantalla táctil, configurar la Zona Horaria, fecha, etc.) y en general para utilizar la pantalla LCD de manera efectiva sugiero utilizar un lápiz óptico. El Idioma esta en Chino, pero no nos preocupemos solo hay que abrir una aplicación de diccionario que es visible por que el icono son dos banderas: China y Británica, y elegir el idioma Ingles y listo.

Bueno hemos finalizado esta nueva entrega de como portar Linux en el Mini2440, espero que le sea de ayuda y en el siguiente blog tratare de hablar sobre como portar ANDROID, durante toda  la realización de este blog he estado en la tarea de portar ANDROID pero el problema que se me ha presentado es la pantalla que tengo (LCD W35)  que no encuentro el zImage correspondiente para ANDROID, cuando lo solucione estaré listo para la hacerles saber como lo hice.