Après avoir réussi à démarrer Android sur l'IGEP à partir de la microSD, nous allons mettre en place un environnement de développement pour éviter d'avoir à manipuler sans cesse la microSD. Pour cela nous allons utiliser un serveur tftp pour que la carte récupère le noyau à partir du PC, et un montage nfs pour que la carte charge la rootfs directement à partir de notre dossier de travail.





Remarque : Il est fortement conseillé de lire l'article précédent : LIEN.

Commençons par installer les packages :
$ apt-get install tftpd nfs-kernel-server

On a va ensuite définir notre environnement de travail (hiérarchie de nos dossiers) ainsi :
/ srv / tftp /android / image-base / igep020 / kernel /
/ srv / nfs /android / image-base / igep020 / rootfs /


Pourquoi de cette manière? Afin de suivre la structure suivante :
[distribution] / [Projet] / [plate-forme] /

Respectez cette structure, c'est important pour la suite ;)

Important : pour éviter les Access violation dans le futur, et après avoir créé ces dossiers, revenez dans /srv et changez les accès :
$ chmod -R 777 tftp
$ chmod -R 777 nfs





Mise en place du serveur tftp


Rien de particulier à faire pour configurer le serveur tftp, sachez juste que le fichier de configuration est le suivant : /etc/inetd.conf. Si vous souhaitez le modifier n'oubliez pas de taper la commande killall -HUP inetd après.

Vous pouvez copier le noyau Android fourni par ISEE dans le dossier tftp/android/... (uImage-2.6.29-igep0020-20100407145010.bin).

Note : pensez bien à renommer le noyau uImage-2.6.29-igep0020-20100407145010.bin en uImage (pensez bien à enlever le .bin), sans quoi uboot ne trouvera pas l'image.

Pour le fichier boot.ini ne le copiez pas comme dans l'article précédent, je vous expliquerai plus bas le pourquoi ;)

Voila, pour le serveur tftp c'est bon!





Mise en place du montage NFS


Nous allons éditer le fichier de configuration NFS.
Éditez le fichier/etc/exports et ajoutez la ligne suivante :
# Android image-base
/srv/nfs/android/image-base/igep020/rootfs 192.168.254.254(rw,no_root_squash,no_subtree_check,sync)

Remarque : l'adresse IP 192.168.254.254 correspond à l'IP par défaut de l'IGEP.

On redémarre le serveur nfs pour terminer :
/etc/init.d/nfs-kernel-server restart
Vous pouvez extraire (en root) la rootfs dans le dossier nfs/android/... (android-image-eclair-2.1-update1-20100407145010.tar.bz2) :
$ tar xvfj android-image-eclair-2.1-update1-20100407145010.tar.bz2 -C /srv/nfs/android/image-base/igep020/rootfs/
Le NFS est prêt.





Configuration d'u-boot


U-boot permet à la carte de démarrer le système. Ainsi il est intéressant de connaître 2,3 commandes importantes pour interagir avec lui.

Vous vous souvenez du fichier boot.ini que nous avons créé dans l'article précédent? Vous deviez vous demander à quoi servait ce fichier? Et bien il permet de paramétrer uboot de façon "temporaire", afin de modifier certains paramètres. Si nous ne souhaitons pas utiliser ce fichier (notre cas ici), nous devons alors paramétrer directement uboot.

Lorsque vous branchez la carte, vous pouvez voir via la liaison série un message vous invitant à appuyer sur une touche pour stopper le processus de boot. Faites le, vous accéderez ainsi aux entrailles de uboot ;)

Juste à titre indicatif, je suis passé de minicom à putty pour l'interface série. La raison de ce changement est l'impossibilité d'envoyer des commandes avec minicom. En gros, si vous appuyez sur une touche et que le compteur continu son avancé folle, c'est que vous rencontrez le même problème que moi. Deux solutions s'offrent à vous, soit vous trouvez une solution avec minicom, soit vous utilisez putty :p

Si vous souhaitez passer aussi sur putty, pensez à aller dans Terminal, de cocher implicit CR in every LF, puis Force On pour les options Line discipline.
Minute astuce : pour copier dans putty faites un clic droit, pour coller faites un clic gauche-droit.

Revenons en à U-boot. Voici les principales commandes :
  • printenv : permet d'afficher les variables 'environnement.
  • setenv : permet de changer la valeur d'une variable.
  • run : lance ce que vous indiquez après cette commande.
  • saveenv : sauvegarde les changements.
  • help : aide d'u-boot
Maintenant intéressons nous aux variables plus en détail.
  • La variable bootcmd, permet de définir la séquence de boot. Si vous faites un printenv bootcmd vous obtiendrez l'ordre de boot suivant :
    bootcmd=run mmc-boot; run nfs-boot; run onenand-boot

    Si vous souhaitez intervertir la microSD et le NFS par exemple, vous pouvez utiliser la commande setenv :
    $ setenv bootcmd 'run nfs-boot; run mmc-boot; run onenand-boot'
  • La variable serverip définit l'adresse IP du serveur (sérieux? :p), nous retiendrons donc que l'adresse ip du pc devra être 192.168.254.10.

  • Les variables distro, project et machine doivent vous rappeler quelque chose... En effet, je vous en ai parlé au tout début de cet article! Elles vont définir le chemin d'accès pour le montage nfs et pour accéder au serveur tftp.

    Nous allons donc les modifier pour que cela puisse coller avec ce qu'on a défini plus haut :
    $ setenv distro 'android'
    $ setenv project 'image-base'
    $ setenv machine 'igep020'

  • Les variables nfs-bootargs et nfs-boot contiennent le chemin d'accès nfs et tftp. Il faut donc les adapter à notre environnement. La variable bootargs-base paramètre divers périphériques, nous la reprendrons aussi pour adapter l'affichage :

    Initialement nous avons :
    bootargs-base=mem=512M console=ttyS2,115200n8 console=tty0 omapfb.mode=dvi:1024x768MR-16@60

    nfs-bootargs=setenv bootargs ${bootargs-base} root=/dev/nfs nfsroot=${serverip}:/srv/nfs/${distro}/${project}/${machine} ; run addip

    nfs-boot=if ping ${serverip}; then run nfs-bootargs; tftp 0x80000000 ${distro}/${project}/${machine}/uImage; bootm; fi;

    Nous les remplaçons par :
    $ setenv bootargs-base 'mem=512M console=ttyS2,115200n8 console=tty0 omapfb.mode=dvi:1024x768MR-16@60 omap-dss.def_disp=dvi'

    $ setenv nfs-bootargs 'setenv bootargs ${bootargs-base} init=/init root=/dev/nfs nfsroot=${serverip}:/srv/nfs/${distro}/${project}/${machine}/rootfs ; run addip'

    $ setenv nfs-boot 'if ping ${serverip}; then run nfs-bootargs; tftp 0x80000000 ${distro}/${project}/${machine}/kernel/uImage; bootm; fi;'
    Remarque : dans nfs-bootargs nous devons aussi ajouter l'accès init (init=/init). Lorsque nous travaillons avec la microSD, ce paramètre était dans le fichier boot.ini.

    Voila, on a tout bien configuré, on peut sauvegarder :
    $ saveenv
Voila! Maintenant vous êtes capable de, soit d'utiliser un fichier boot.ini, soit de paramétrer directement uboot :)





Lancement d'android


On configure la carte Ethernet du PC :
$ ifconfig eth0 192.168.254.10

Cet adressage est valable pour la session actuelle, si vous redémarrez votre PC n'oubliez pas de reconfigurer l'adresse IP d'eth0! Si vous souhaitez fixer définitivement l'adresse IP, modifiez le fichier /etc/network/interfaces.
Ensuite on pense à bien retirer la microSD (dans le cas où vous n'avez pas touché la variable bootcmd d'uboot) et on y va, on envoi un petit run bootcmd à uboot (via putty ou minicom) pour démarrer le système ou alors si vous aviez éteint votre IGEP, et bien vous la rebranchez^^

On observe ce qui se passe. Première étape, la récupération du noyau par tftp par la carte :
Using smc911x-0 device
TFTP from server 192.168.254.10; our IP address is 192.168.254.254
Filename 'android/image-base/igep020/kernel/uImage'.
Load address: 0x80000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
##########################
done
Ici la récupération c'est bien déroulée. Si jamais cela ne fonctionne pas :
  • Erreur (1) [Fichier non trouvé] : la configuration du chemin d'accès est mauvaise, soit dans uboot, soit dans le fichier de config de tftp. Comme vous n'avez théoriquement pas modifié la config de tftp, le problème vient de uboot ;).
  • Erreur (2) [Access Violation] : Faites un petit chmod -R 777 /srv.
Ensuite au tour du montage NFS. Les lignes importantes sont les suivantes :
IP-Config: Complete:
device=eth0, addr=192.168.254.254, mask=255.255.255.0, gw=192.168.254.10,
host=192.168.254.254, domain=, nis-domain=(none),
bootserver=192.168.254.10, rootserver=192.168.254.10, rootpath=
Looking up port of RPC 100003/2 on 192.168.254.10
Looking up port of RPC 100005/1 on 192.168.254.10
VFS: Mounted root (nfs filesystem) on device 0:13.
La dernière ligne nous informe que le montage NFS a été correctement fait.
Si ce n'est pas le cas, le problème vient soit du fichier de config du nfs, soit de uboot.

Dernière étape, le chargement du rootfs. Là, pas de secret. Si vous avez un kernel panic c'est que vous avez fait une bourde soit dans la configuration d'uboot, soit dans la mise en place des fichiers...


Si tout se passe bien vous devriez obtenir ça sur la sortie HDMI :



Si vous avez un soucis, une remarque ou autres, les commentaires ci-dessous sont là pour ça ;)