Thursday, September 24, 2009

¿Cómo hacer un HolaMundo para celulares nokia n900?

Hoy desperté con un humor muy peculiar, sentí de pronto unas INMENSAS ganas de tener un celular nuevo, y cuando digo un celular nuevo, realmente me refiero a lo más más nuevo. I'm talking about the NEW Nokia phone!
Sí el neuvo celular de nokia, que aún no sale al mercado. (Yo ya tengo mi pre-order listissimo.)
El nokia n900.



¿Que cosas tiene el n900?
En su página algunas de las especificaciones son:
* Procesador de tipo ARM CortexTM-A8 corriendo a 600 MHz. El cual es el primer procesador de aplicaciones basado en la arquitectura ARMv7 y es actualmente el procesador con mejor rendimiento y más efficiente con respecto al consumo de energía que ARM ofrece.
La arquitectura ARMv7 también incluye la tecnología NEON™ para incrementar el procesamiento digital de señales que se tiene en un 400% !
También ofrece una mejora en punto flotante, para poderse adaptar a las necesidades que existen con la siguiente generación de gráficos 3D, las leyes de física que se aplican a los juegos, así como aplicaciones de control embebidas.( Un controlador embebido, término que de hecho NO conocía ja!, es un dispositivo que lleva acabo control embebdio...Y control embebido es un subconjunto de la adquisición de datos, esto es, el sistema de entrada/salida que se tiene no está conectado con una PC externa, sino que la PC o el procesador que está corriendo está realmente incorporado fisicamente con el dispositivo de entrada y salida.)
*Hasta 1 GB de memoria para las aplicaciones (256 MB RAM, 768 MB memoria virtual)
* Un sistema operativo de tipo Linux
* Un acelerador de gráficos 3D con soporte para OpenGL ES 2.0 (Si son medios neewbies, como yo a esto, (which is totally cool too, en algun lado se empieza!) Un acelerador de gráficos es una especie de adaptador de video que contiene su propio procesador para mejor los niveles de rendimiento. Estos procesadores están especializados en las transformaciones de computo gráfico, así que alcanan mejores resultados que la CPU de uso general type que usa la computadora. Además liberan el resto del CPU, para que pueda hacer otras operaciones, mientras que el acelerador de gráficos se encarga del trabajo sucio i.e. las computaciones gráficas.)
*32 GB en almacenamiento interno
*Pantalla de tipo Touch Screen

...Y muchas muchas más cosas, que en la página oficial pueden checar...

Entremos ahora a lo interesante.
¿Cómo podría yo, una chica solitaria de ingeniería en la UNAM jugar a gusto con este dispositivo?

-Hmmm, pensemos un rato...Thinking thinking thinking hard...Podría usarlo! Es lo suficientemente lindo para divertirte mucho si lo pudiera usar, además está lindo para presumirse en todos lados!...Peeero eres una estudiante de ingeniería de la UNAM... y en computación, así que a eso AUN le falta!!....mmmm...oh I know!...Programemosle una aplicación hecha por nosotros!!!

Lo primero es que entendamos lo que queremos hacer:
Queremos crear un ambiente en el cual podamos probar y compilar aplicaciones que bajaremos al celular.Es entonces muy importante crear un ambiente que pueda compilar y correr programas tanto en plataformas ARM (la plataforma del celular)) como x86 (Plataforma de la PC). Debido a que el N800 corre en un procesador ARM, no podemos tomar los bianrios que se generen en nuestra máquina e insertarlos así nomás al celular y esperar que funcionen. No funcionará debido a que cada procesador tiene su PROPIO set de instruciones, así que el bianrio creado por un compilador en un procesador x86 no significará nada en un procesador ARM, es por esto que debemos agregar una capa de abstración:
La solución es INSTALAR Scratchbox.
Scratchbox es un compilador cruzado (Un compilador cruzado según Wikipedia es un compilador capaz de crear código ejecutable para otra plataforma distinta a aquélla en la que él se ejecuta.)
el cual hace el desarrollo de aplicaciones embebidas en Linux mucho más fácil, además de eso brinda una serie de herramientas para compilar cruzado e integrar toda una distribución de Linux.
Con los siguientes 3 comando, se instalará scratchbox, se volverá ejecutable y después se correrá:
wget http://repository.maemo.org/unstable/5.0beta2/maemo-scratchbox-install_5.0beta2.sh
chmod +x maemo-scratchbox-install_5.0beta.sh
(Entre este paso y el siguiente, recomiendo mucho salirse de su sesión actual que tienen en su máquina, en mi caso no cobró efecto imediatamente.)
./maemo-scratchbox-install_5.0beta2.sh –u USER -F

Con estos pasos se debió haber instalado scratchbox y haber recibido un mensaje como el siguiente:
Installation was successful!

----------------------------



You now have Scratchbox 1.1.4 'apophis' release installed.



Scratchbox cannot be run as user root. Instead, use your normal login

user account. Add additional scratchbox users and sandboxes with the

following command (outside scratchbox with root permissions):



# /scratchbox/sbin/sbox_adduser USER yes



Running this command will create sandbox environment for that user and

add user to the 'sbox' scratchbox user group.

You will need to start a new login terminal after being added to the

'sbox' group for group membership to be effective.



Login to scratchbox session using the following command (as user):



$ /scratchbox/login



Refer to scratchbox.org documentation for more information re scratchbox:

http://scratchbox.org/documentation/user/scratchbox-1.0/
saiph@ubunt:~$


Una vez que ya se corrió eso, en una terminal se debe escribir:
~$ /scratchbox/login
(Entre este paso y el anterior, recomiendo mucho salirse de la sesión actual que tienen en su máquina, en mi caso no cobró efecto imediatamente, y me dijo unas cosas acerca de que NO tenía los permisos para hacer esa operación)
Con ese comando debe salir lo siguiente:
You dont have active target in scratchbox chroot.
Please create one by running "sb-menu" before continuing
Welcome to Scratchbox, the cross-compilation toolkit!

Use 'sb-menu' to change your compilation target.

See /scratchbox/doc/ for documentation.



sb-conf: No current target

[sbox-: ~] >

Si ya se tiene el prompt de sbox es que se instaló scratchbox adecuadamente, ahora lo que se debe hacer es instalar el sdk de maemo dentro de nuestro entorno. (El sdk de maemo nos permitirá desarrollar aplicaciones para el celular,recordemos que el n900 corre sobre el sistema operativo de maemo.)
Para instalar se debe escribir:
wget http://repository.maemo.org/unstable/5.0beta2/maemo-sdk-install_5.0beta2.sh
chmod +x maemo-sdk-install_5.0beta2.sh
./maemo-sdk-install_5.0beta2.sh

Dentro de esta instalación, yo selecioné los valores que venían por default.
Una vez que se termina la instalación se nos presenta en la consola un mensaje que dice lo siguiente:


Nokia EUSA binaries

-------------------



The package maemo-explicit is a metapackage of Nokia EUSA licensed

binaries which can be installed to scratchbox targets. It is highly

recommended to install this package on both targets to ensure a fully

working system.



If you want to install these, login to scratchbox (see commands above)

and run the command 'fakeroot apt-get install maemo-explicit' for both

armel (CHINOOK_ARMEL) and i386 (CHINOOK_X86) targets.



Happy hacking!

Lo que este mensaje basicamente nos está diciendo es que el paquete que acabamos de instalar contiene binarios que se pueden instalar como objetivos o "targets" dentro de scratchbox.Un target u Objetivo dentro de Scratchbox es una "caja de arena" configurada.(y una "caja de arena" dentro de Scratchbox es simplemente un área definida para cada usuario.)
Así que precisamente hagamos esto que nos dice el mensajito:
Nos volvemos a meter a scratchbox:

pete@ubunt:~$ /scratchbox/login



Welcome to Scratchbox, the cross-compilation toolkit!



Use 'sb-menu' to change your compilation target.

See /scratchbox/doc/ for documentation.



[sbox-CHINOOK_ARMEL: ~] >


Instalaremos el paquete explicito de maemo, al correr lo siguiente:

fakeroot apt-get install maemo-explicit

Una vez que la actualización sucedió. nos debemos cambiar al otro obejtivo que está ya "build" al invocar el comando en el menu sb.Esto hara que salga un sistema de menu, y usanado las flechitas selecione la opcion de Activate a target, y escoje el ambiente que aun no se ha actualizado, en este caso es CHINOOK_X86. Se debe correr el mismo comando de la vez pasada y ya deberíamos tener ambos ambientes listos calistos!

Ahora lo probaremos graficamente:
Abriremos otra terminal para probar graficamente que el sistema maemo está ya corriendo, también compilaremos un programa de prueba y lo correremos sobre el objetivo ARMEL .
En la nueva terminal, correremos primero los siguientes comandos:

sudo apt-get install xserver-xephyr


Con este comando se instala el X server embebido, el cual se requiere para probar correr la emulación gráfica del N900.
Posteriormente se deberá correr el siguiente comando:

$ Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac -kb &

Con esto se prende el servidor Xephyr .( el servidor Xephyr es un servidor basado en KDrive, KDrive es una pequeña implementación del server que hay en el sistema X Window.Xephyr tiene como objetivo o "target" de framebuffer una ventana localizada dentro de un host X Server.->Un framebuffer representa cada uno de los píxeles de la pantalla como localidades de memoria en RAM)
Con esto lo que se verá es que se abrió una nueva ventana:

* Ahora entremos a Scratchbox y al objetivo de X86.

$ /scratchbox/login
[sbox->:~]> sb-conf se FREMANTLE_X86

* Hacemos que la variable DISPLAY corresponda a la configuración dada para el display que hay en el servidor Xephyr.

[sbox-FREMANTLE_X86: ~] > export DISPLAY=:2

* Prendemos el framework de la IU (Interfaz de Usuario) .

[sbox-FREMANTLE_X86: ~] > af-sb-init.sh start

Con esto se verá el framework de la UI lista y corriendo en la ventana Xephyr



El framework UI realmente es suuuper lindo. Después jugaremos más con él.
Por ahora sólo quería que todos lo tuvieran trabajando. Regresemos a lo que queríamos hacer...
Un aplicación "HolaMundo" para el n900:
Abra otra terminal y vayas a su directorio de home y allí debes crear un nuevo archivo en el cual pegaremos lo siguiente:


#include stdlib.h /* EXIT_* */
#include stdio.h
/* Introduce types and prototypes of GTK+ for the compiler. */
#include

int main(int argc, char** argv)
{

/* We'll have two references to two GTK+ widgets. */
GtkWindow* window;
GtkLabel* label;
GtkWidget *image;

/* Initialize the GTK+ library. */
gtk_init(&argc, &argv);

/* Create a window with window border width of 12 pixels and a
title text. */
window = g_object_new(GTK_TYPE_WINDOW,
"border-width", 12,
"title", "Hello GTK+",
NULL);

/* Create the label widget. */
label = g_object_new(GTK_TYPE_LABEL,
"label", "Hello World!",
NULL);

/* Pack the label into the window layout. */
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(label));

/* Show all widgets that are contained by the window. */
gtk_widget_show_all(GTK_WIDGET(window));

/* Start the main event loop. */
g_print("main: calling gtk_main\n");
gtk_main();

/* Display a message to the standard output and exit. */
g_print("main: returned from gtk_main and exiting with success\n");

/* The C standard defines this condition as EXIT_SUCCESS, and this
symbolic macro is defined in stdlib.h (which GTK+ will pull in
in-directly). There is also a counter-part for failures:
EXIT_FAILURE. */
return EXIT_SUCCESS;
}


Guarda el archivo como maemo_hello.c. y copialo como se demuestra a continuación:(Se ha dejado mientras prendido el scratchbox, asi como se dejó corriendo la ventana Xephyr )

cp maemo_hello.c /scratchbox/users/saiph/home/saiph/


Observese donde esá su directorio de home dentro de scratchbox, ahora si en la ventana que tiene corriendo scratchbox escribes ls, deberás de ver un archivo maemo_hello.c dentro de tu directorio de home:
[sbox-FREMANTLE_X86: ~] > ls
:~] maemo-sdk-rootstrap_5.0beta2_armel.tgz maemo_hello sb-conf
MyDocs maemo-sdk-rootstrap_5.0beta2_i386.tgz maemo_hello.c

Y ahora usando el mismo comando de sb-menu que habiamos usado antes,verificamos que estemos sobre el objetivo de ARMEL. (Esto hace que los binarios que compilemos sean hechos especificamente para el N800) .
Ahora simplemente compilamos:
gcc -o maemo_hello maemo_hello.c `pkg-config --cflags gtk+-2.0 hildon-1` -ansi -Wall `pkg-config --libs gtk+-2.0 hildon-1`

El archivo bianrio generado puede ser copiado a cualquier celular n900 y corrido sin ningun problema. Ahora lo unico que debemos hacer, es probarlo sobre nuestro ambiente de scratchbox (Que justamente está emulando el celular, tonz aunque no tengamos aun el celular, nos permitirá ver la aplicación como si se hubiese corrrido sobre el n900)
Para probarlo, sobre la terminal que tiene el scratchbox, ponemos a la variable de display=2, lo cual como ya se explicó antes, provoca que se apunte al Xephyr server, posteriormente corremos el script para prender el ambiente de prueba de maemo:n
export DISPLAY=:2

af-sb-init.sh start

Saldrán muchas letritas aqui, espera a que termine, y una vez listo aprieta enter, verás el prompt de scratchbox de regreso, y ahora ponremos:
./maemo_hello
Y finalmente deberás tener una ventanita similar a lo siguiente:


Y así hemos hecho nuestro propio HolaMundo para celulares n900!! ñ_ñ
OJO:Los pasos puestos en el blog, son para maquinas de 64 bits!!
Refrencias:
http://maemo.org/development/sdks/maemo_5_beta_2_sdk_installation/#close=1
http://www.reviewlinux.com/forums/news/12492-pete-savage-howto-scratchbox-maemo-4-0-ubuntu-gutsy-nokia-n800-dev-environment.html


8 comments:

Anonymous said...

Según yo, cuando haces cross compiling la máquina en la que compilas se llama host, y la máquina en la que correrá el programa que compilaste se llama target.

Entons, el scratchbox tiene diferentes targets por que puedes generar código para diferentes arquitecturas.

samee said...

pues yo quiero un n900.
siempre he sido de nokia :D
por siempre me refiero a mis únicos dos cellphones en mi vida (3220 y 6300) heheheh
pero bueno, para cuento tenga pal n900 probablemente ya existirá el n9000 *sigh*

wuórales que padre, tendrás muchas horas de diversión. :D

heehe
sale pues, nos presumes cuando llegue en su cajita bonita.

saludines y yay que padre que posteaste :)
:D

Little Saiph said...

oye mil gracias Alegría :)
Sí si, las cosas son ahora más claras.
Thanks =)
Oye esta muy divertido programar en GTk!
nunca lo había hecho,y descubrí tambien glade!
super lindo!
Lo haz usado?

Little Saiph said...

ah y gracias por visitar mi blog Samee =)

Anonymous said...

Yepe yepe, lo use hace algún tiempo pero nunca hice nada muy merol. Utilicé Glade en la fac para hacer un proyecto de no-se-que cosa. Estaba medio acá la interfaz. Me imagino que ahorita debe estar mas chido.

También te recomiendo que cheques Qt, que es más como una suite de programación tipo Java. Trae tronches para XMl, Red, video, OpenGL, etc.

Me parece que Qt es más completo, pero pos creo que a los de GTK no les interesa hacer algo similar y más bien se quieren enfocar a proporcionar librerías exclusivamente para la interfaz.

Un cuate me dijo que también hay Qt para el celular este, tons igual y tambien te gusta.

Sobre el cross compiling, hay una cosa que se llama canadian cross, donde compilas un compilador en una arquitectura para que corra en otra y que pueda generar código para una arquitectura diferente. Que según es para poder hacer compilaciones distribuidas, cuando tienes una aplicación ultra merol y quieres que se haga más rapido.

Little Saiph said...

si hay un paqute para usar QT4 for Maemo
Aqui encontre el tutorial de como integrarlo.


http://wiki.maemo.org/Qt4Hildon#Getting_started

suena chido lo de canadian cross compiling. grax. lo checare =)
Grax por visitar mi blog =D

Cool Acid said...

A mi tambien se me antojó tu celular.
Después de eso ya no entendí nada.
Saludos! (:

kthxbye

Carlangas said...

Hola, pase por aqui de casualidad... que padre andar programando, solo que no es parte de mi carrera esto, esperemos algun dia haya una chansita :P
por cierto tambien contento con symbian ahora que es open source

y felicidades por el blog muy guapo.