Introduction
Le Neo FreeRunnner est un téléphone portable libre, dont le système d'exploitation officiel est une distribution Linux appelée OpenMoko. De nombreuses autres distributions sont également disponibles.
Outre le fait qu'il s'agisse d'un bon téléphone, le Neo FreeRunner fait également office d'un bon ordinateur de poche, mais surtout d'une excellente plateforme de développement. Tout comme l'iPAQ H3650, il peut être très intéressant d'y installer Inferno.
Mashara Binovich a auparavant réussit à faire fonctionner Inferno sur OpenMoko. Son code est disponible au sein du projet inferno-openmoko. Cependant cette dernière a également effectuée de nombreuses autres modifications, se séparant ainsi complètement de la branche officielle de développement d'Inferno (inferno-os).
J'ai ici tenté d'expliquer comment faire fonctionne la version officielle actuelle d'Inferno sur OpenMoko, le plus simplement possible, tout en effectuant le minimum de modifications et en réutilisant le travail déjà effectué. La procédure décrite ici se déroule sous Linux.
Variables d'environnement
Par la suite, on considérera les variables d'environnement suivantes :
INFERNO=/usr/local/inferno
OMINFERNO=/usr/inferno
OM=/root/openmoko
Où $INFERNO représente le répertoire où est installé Inferno pour votre système hôte, $OMINFERNO le répertoire ou sera installé Inferno pour OpenMoko et $OM le répertoire de travail pour la préparation de la distribution OpenMoko.
Pré-requis
Avant toute chose, il est nécessaire que vous ayé déjà installé Inferno pour votre système, et ajouté le répertoire Linux/386/bin dans votre PATH, afin d'avoir accès aux commandes telles que limbo.
Utilitaires
On commence par installer les outils de base :
- dfu-util permet de flasher la mémoire NAND du Neo FreeRunner à partir des images présentes sur votre ordinateur, par l'intermédiaire du câble USB,
- mkfs.jffs2 permet de formater une partition en JFFS2, le système de fichiers utilisé par la distribution OpenMoko.
L'utilitaire mkfs.jffs2 est généralement fournit dans les distributions Linux au sein du paquet mtd-utils.
yum install mtd-utils
L'utilitaire dfu-util est propre au projet OpenMoko. Il est présent dans plusieurs distributions Linux, mais n'étant pas forcément très à jour, il est plutôt conseillé de récupérer la dernière version à partir du dépôt Subversion. Sa compilation dépend des paquets libusb-devel, glibc-static et libusb-static qu'il vous faudra préalablement installer avec le gestionnaire de paquet de votre distribution.
svn co https://svn.openmoko.org/trunk/src/host/dfu-util/
cd dfu-util
./autogen.sh
./configure
make
make install
cd ..
rm -rf dfu-util
Environnement de compilation croisé
Ensuite, nous aurons besoin d'un environnement de compilation croisée pour compiler Inferno pour l'architecture ARM. Si vous utilisez un système x86, le projet OpenMoko fournit un environnement de compilation ARM920T prêt-à-l'emploi.
cd /
wget http://downloads.openmoko.org/developer/toolchains/
openmoko-i686-20090323-armv4t-linux-gnueabi-toolchain-openmoko.tar.bz2
tar jxf openmoko-i686-20090323-armv4t-linux-gnueabi-toolchain-openmoko.tar.bz2
rm openmoko-i686-20090323-armv4t-linux-gnueabi-toolchain-openmoko.tar.bz2
. /usr/local/openmoko/arm/environment-setup
opkg-target update
opkg-target install libx11-dev libxext-dev
ln -s /usr/local/openmoko/arm/bin/arm-angstrom-linux-gnueabi-gcc /usr/local/bin/arm-gcc
Installation d'Inferno
Nous allons maintenant télécharger la version de développement d'Inferno à partir du dépôt Mercurial.
hg clone https://inferno-os.googlecode.com/hg/ $OMINFERNO
On supprime les fichiers de Mercurial, ce qui permettra d'économiser de la place sur la mémoire Flash du Neo FreeRunner.
find $OMINFERNO -name .hg -exec rm -rf {} \;
Suite à la migration du projet Inferno de Subversion vers Mercurial, certains répertoires sont manquants. Nous allons donc les créer.
mkdir $OMINFERNO/Linux/arm/lib
mkdir $OMINFERNO/Linux/arm/bin
Sous OpenMoko, les applications sont exécutés en tant que root, donc nous allons ajouter son répertoire personnel dans Inferno.
cp -r $OMINFERNO/usr/inferno $OMINFERNO/usr/root
Certaines polices ne sont pas distribuées autrement que dans la version commerciale d'Inferno. On ira donc les récupérer sur le site de Vita Nuova.
wget http://www.vitanuova.com/dist/4e/inferno-20090730.tgz
tar xzf inferno-20090730.tgz
mv inferno/fonts/lucida $OMINFERNO/fonts
mv inferno/fonts/lucidasans $OMINFERNO/fonts
mv inferno/fonts/lucm $OMINFERNO/fonts
mv inferno/fonts/pelm $OMINFERNO/fonts
rm -rf inferno inferno-20090730.tgz
Éditez le fichier $OMINFERNO/mkconfig, en changeant les variables ROOT, SYSHOST et OBJTYPE comme ci-dessous :
ROOT=/usr/inferno
SYSHOST=Linux
OBJTYPE=arm
Modification d'Inferno
Le clavier virtuel est un élément indispensable sur un ordinateur ne disposant pas de clavier physique. Le clavier par défaut étant un trop petit pour l'écran du Neo FreeRunner, nous allons ici le configurer pour qu'il prenne toute la largeur de l'écran (480 pixels).
Éditez le fichier $OMINFERNO/appl/wm/keyboard.b, en remplaçant la ligne :
KEYSIZE: con 13;
Par la ligne :
KEYSIZE: con 31;
Le clavier virtuel étant absent du menu de lancement des applications, il faudra l'ajouter.
Éditez le fichier $OMINFERNO/lib/wmsetup et ajoutez la ligne suivante dans le menu que vous désirez.
menu Keyboard {wmrun wm/keyboard}
Parmi de nombreuses autres choses, le projet inferno-openmoko a effectué un excellent travail de modification d'Inferno pour que ce dernier s'exécute correctement sur le Neo FreeRunner. Plutôt que de livrer mon propre code, je vous conseille de réutiliser leur travail, qui est déjà disponible en ligne, en remplaçant ces deux fichiers par les leurs. Je vous laisse soin de comparer le code pour comprendre leurs modifications.
SVN=http://inferno-openmoko.googlecode.com/svn-history/r5/trunk
curl $SVN/emu/Linux/asm-arm.S > $OMINFERNO/emu/Linux/asm-arm.S
curl $SVN/emu/port/win-x11a.c > $OMINFERNO/emu/port/win-x11a.c
Compilation d'Inferno
Désormais, vous pouvez lancer la compilation d'Inferno, qui durera plusieurs minutes.
cd $OMINFERNO
mk nuke
mk install
mk clean
Intégration d'Inferno dans OpenMoko
Maintenant, vous pouvez télécharger la distribution OpenMoko :
- fso-paroli-image est la distribution d'OpenMoko contenant l'environnement graphique,
- u-boot est le chargeur de démarrage du Neo FreeRunner,
- uImage est le noyau Linux d'OpenMoko,
- Om2008.9.splash.gz est l'image affichée au démarrage du Neo FreeRunner.
mkdir $OM
cd $OM
OMFTP=ftp://downloads.openmoko.org/distro
wget $OMFTP/unstable/NeoFreerunner/fso-paroli-image-om-gta02.jffs2
wget --glob=on $OMFTP/unstable/NeoFreerunner/u-boot-gta02v5-1.3.1+*.bin
wget --glob=on $OMFTP/unstable/NeoFreerunner/uImage-2.6.28-stable+*.bin
wget $OMFTP/releases/Om2008.9/Om2008.9.splash.gz
L'utilitaire Mntjffs.sh permet de monter les images au format JFFS2 dans votre arborescence.
wget http://wiki.openmoko.org/images/8/82/Mntjffs.sh
chmod +x Mntjffs.sh
Nous allons maintenant extraire l'image d'OpenMoko, afin d'y intégrer Inferno
mkdir $OM/ro
$OM/Mntjffs.sh $OM/fso-paroli-image-om-gta02.jffs2 $OM/ro
cp -r $OM/ro $OM/rw
umount $OM/ro
rmmod block2mtd jffs2 mtdblock
rm -rf $OM/fso-paroli-image-om-gta02.jffs2 $OM/ro
cp -r $OMINFERNO $OM/rw/usr/inferno
Nous modifions le script x-window-manager d'OpenMoko, afin qu'Inferno soit lancé au démarrage de X, à la place d'Enlightenment.
rm $OM/rw/usr/bin/x-window-manager
ln -s /usr/bin/inferno_start $OM/rw/usr/bin/x-window-manager
Créez le fichier $OM/rw/usr/bin/inferno_start comme ci-dessous :
#!/bin/sh
/usr/inferno/Linux/arm/bin/emu -g 480x640 -r /usr/inferno wm/wm
Création de l'image d'OpenMoko
Maintenant, nous pouvons créer l'image rootfs.jffs2 à partir du répertoire $OM/rw.
mkfs.jffs2 --pad=0x700000 -o $OM/rootfs.jffs2 -e 0x20000 \
--pagesize=0x100 -n -d $OM/rw
Installation d'OpenMoko sur le Neo FreeRunner
Maintenant, branchez votre Neo FreeRunner à votre ordinateur à l'aide du câble USB, puis démarrer sur la mémoire NOR en appuyant sur le bouton « Aux », que vous maintenez enfoncé tout en appuyant sur le bouton « Power ». Vous avez désormais 30 secondes pour commencer à flasher, avant que le Neo FreeRunner ne s'éteigne.
dfu-util -a rootfs -R -D $OM/rootfs.jffs2
dfu-util -a u-boot -R -D $OM/u-boot-gta02v5-1.3.1+*.bin
dfu-util -a kernel -R -D $OM/uImage-2.6.28-stable+*.bin
dfu-util -a splash -R -D $OM/Om2008.9.splash.gz
Désormais, vous pouvez éteindre votre Neo FreeRunner, puis le démarrer normalement. Le premier démarrage d'OpenMoko peut prendre plusieurs minutes. Inferno se lancera au démarrage à la place de l'environnement graphique habituel.