Google+ Room Technology: Mini2440:SO Android, Jugando con el Kernel.

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.



3 comentarios:

  1. hola
    me parce excelente tu foro;
    estoy siguiendolo paso por paso. pero cuando le doy el comando arm-linux-gcc -v me sale

    diego@ubuntu:~$ arm-linux-gcc -v
    /usr/local/arm/4.3.2/bin/arm-linux-gcc: línea 3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: No existe el archivo o el directorio

    por casualidad sabes por que sucede esto?

    ResponderEliminar
  2. la solucion este problema es
    sudo apt-get install ia32-libs

    ResponderEliminar
  3. Muchas Gracias Diego por el aporte, lo tendré en cuenta.

    ResponderEliminar