Table of Contents
Cross compile per OpenMoko
Per compilare un'applicazione per il FreeRunner su sistema operativo OpenMoko possiamo scegliere tre strade:
- Qemu. È possibile eseguire l'intero sistema opertativo OpenMoko sotto Qemu, tuttavia l'hardware GTA02 (FreeRunner) non è pienamente supportato. Inoltre le utility fornite a corredo dell'emulatore sono scritte per il GTA01 (Neo1973), pertanto la strada per avere l'emulatore funzionante non è semplice. L'emulazione del GTA01/GTA02 non è inclusa nella distrubuzione ufficiale Qemu, bisogna scaricare i sorgenti dal repository SVN apposito.
- MokoMakeFile. Si tratta di uno script che provvede a scaricare e configurare un ambiente completo derivato da OpenEmbedded. Il progetto è considerato obsoleto.
- Toolchain. Questa è la strada consigliata sia per lo sviluppo di una singola applicazione che per un'intera distrubuzione. Consente di compilare codice arm su piattaforma i686 o amd64.
Installare la toolchain
Per installare la toolchain su Debian Lenny si sono seguite queste istruzioni: Openmoko application development in 5 minutes.
Si installano preventivamente i pacchetti:
apt-get install alien autoconf automake autotools-dev build-essential ccache check curl \ fakeroot gettext intltool libgconf2-dev libglib2.0-dev libtool libxrender-dev mtools uboot-mkimage
Si scarica la toolchain precompilata dal repository OpenMoko, esiste la versione i686 e amd64, il pacchetto non è rilocabile e va in /usr/local/openmoko
. Invece di installare il tarball, lo si trasforma in uno pseudo pacchetto .deb facilmente (dis)installabile.
Scegliamo openmoko-i686-20090323-armv4t-linux-gnueabi-toolchain-openmoko.tar.bz2 (pacchetto per i686, per compilare codice arm su piattaforma GNU/Linux) ed eseguiamo:
bunzip2 openmoko-i686-20090323-armv4t-linux-gnueabi-toolchain-openmoko.tar.bz2 gzip openmoko-i686-20090323-armv4t-linux-gnueabi-toolchain-openmoko.tar fakeroot alien -d openmoko-i686-20090323-armv4t-linux-gnueabi-toolchain-openmoko.tar.gz
Il pacchetto .deb risultante è installabile con
sudo dpkg -i openmoko-i686_20090323-2_all.deb
Usare la toolchain
Prima di compilare qualcosa si deve settare l'environment giusto (PATH
, CPPFLAGS
, CXXFLAGS
, LDFLAGS
, ecc.):
source /usr/local/openmoko/arm/environment-setup
Quindi si usa il compilatore apposito
arm-angstrom-linux-gnueabi-gcc -o test test.c
Un'ipotetico Makefile
potrebbe contenere qualcosa del tipo:
export CC = arm-angstrom-linux-gnueabi-gcc binary: $(CC) -o test test.c
Installazione delle dipendenze
Se il programma da compilare dipende da una libreria OpenMoko, bisogna installarla nella toolchain. Prima di tutto si deve impostare i repository da cui attingere in /usr/local/openmoko/arm/arm-angstrom-linux-gnueabi/etc/opkg.conf
.
L'impostazione predefinita prevede di scaricare da unstable, ecco invece come scaricare i pacchetti da 2008.12:
arch all 1 src/gz all http://downloads.openmoko.org/repository/Om2008.8/all arch armv4t 26 src/gz armv4t http://downloads.openmoko.org/repository/Om2008.8/armv4t arch om-gta02 31 src/gz om-gta02 http://downloads.openmoko.org/repository/Om2008.8/om-gta02
Ecco l'esempio di come installare un pacchetto -dev:
. /usr/local/openmoko/arm/environment-setup opkg-target update opkg-target list opkg-target install gpsd-dev
L'elenco dei pacchetti disponibili viene salvato in /usr/local/openmoko/arm/arm-angstrom-linux-gnueabi/usr/lib/opkg/lists/
.
I pacchetti vengono installati sotto /usr/local/openmoko/arm/arm-angstrom-linux-gnueabi/
.
Compiling a large project: Navit
Remember to improve the page Navit on FreeRunner.
How to cross-compile a large project like Navit for the OpenMoko/FreeRunner, using a GNU/Linux box and the toolchain.
First of all, edit the /usr/local/openmoko/arm/environment-setup
script and add the followig line:
export OMTOOL_DIR=/usr/local/openmoko
After toolchain installation, install (with opkg-target
) some OpenMoko -dev
packages required to compile Navit. Depending upon permissions of /usr/local/openmoko/
directory, you may need root privileges:
. /usr/local/openmoko/arm/environment-setup opkg-target list opkg-target install gpsd-dev opkg-target install gtk+-dev opkg-target install libspeechd-dev
Now we check-out Navit sources from the SVN repository and we make an archive just in case we need the pristine sources in the future:
svn co https://navit.svn.sourceforge.net/svnroot/navit/trunk/navit tar zcvf navit-svn-2670.tar.gz navit
Instead of running the traditional ./autogen.sh; ./configure
in the navit source tree, we must run the om-conf
script, which will modify the automake
, autoconf
and make
files to run into the OpenMoko toolchain.
Because Navit on the OpenMoko FreeRunner requires some configure options, we will pass them to the script. Run om-conf
from the directory containing the source tree (not inside it):
om-conf --host=arm-angstrom-linux-gnueabi --enable-avoid-unaligned --enable-avoid-float \ --enable-cache-size=20971520 --with-saxon=saxon-xslt --with-xslts=openmoko \ --enable-svg2png-scaling=16,32,48,96 --enable-svg2png-scaling-flag=32,48 \ navit
In the example above we used some ./configure
options, among them:
--with-saxon=saxon-xslt
This is because we have the Debian libsaxon-java package, where the executable is called saxon-xslt
instead of saxon
.
--enable-svg2png-scaling=16,32,48,96
For each .svg icon, render a png image of the specified size. Images will be named icon_XX_YY.png
.
--enable-svg2png-scaling-flag=32,48
Same as above, but only for country flag icons.
It's time to cross-compile:
cd navit make
Make an .opk package
Using the toolchains
The OpenMoko toolchain provides the om-make-ipkg
utility. It requires the directory name where to execute the make install
and the name of the control file:
. /usr/local/openmoko/arm/environment-setup om-make-ipkg navit navit-control
The control file is described here.
If you need more control files (e.g. a postinst
or alike) you have to tweak with the om-make-ipkg
script. Here it is the script I use, it looks for the control files into an opkg
directory, so you have to pass just the directory name containing the source tree.
#!/bin/sh -e error_exit () { echo usage: $(basename ${0}) [app_dir_name] [ipkg_control_file] exit 1 } test x${OMTOOL_DIR} = x && . /usr/local/openmoko/arm/setup-env . ${OMTOOL_DIR}/arm/scripts/functions S=${1} (test x${S} = x || test ! -d ${S}) && error_exit appname=$(basename ${S}) tmpdir=/tmp/${appname}-ipkg-tmp test -e "${tmpdir}" && echo Cannot use ${tmpdir} because it already exists. && exit 1 make -C ${S} install DESTDIR="${tmpdir}" # Copy control files to destination directory. cp -pr opkg/* ${tmpdir} ipkg-build -o 0 -g 0 ${tmpdir} rm -rf ${tmpdir}
Control files and other files are arranged into the opkg
directory as needed, here it is an example:
opkg/CONTROL/postinst opkg/CONTROL/control opkg/etc/rcS.d/S96overcommit_memory.sh
Using opkg-utils
The ipkg tool is obsolete, OpenMoko uses the opkg instead, but documentation is scarce.
The current opkg code is in Google code, but you can try this one:
svn co http://svn.openmoko.org/trunk/src/host/opkg-utils
and use the instructions of ipkg's website but the software from this checkout. The main script is opkg-build
.
Qemu and the GTA02 FreeRunner
WARNING: this procedure works only for the GTA01 Neo1973, it fails for the GTA02 FreeRunner.
Install the Debian packages gcc-3.4 and libsdl1.2-dev, download the qemu-neo1973 sources from the svn repository. Run the ./configure && make
.
Edit the openmoko/env
file and set current URLs and filenames:
# Entries for GTA01 kernel_wildcard="uImage-2.6.22.5-moko11+svnr3238-r9-neo1973.bin" rootfs_wildcard="openmoko-image-fic-gta01.jffs2" uboot_wildcard="u-boot-gta01*.bin" download_dir="http://downloads.openmoko.org/distro/obsolete-images/Om2007.11//images/neo1973/"
Run the openmoko/download.sh
and openmoko/flash.sh
scripts.
For the (failed) attempt to run the GTA02 FreeRunner emulator we need different Qemu parameters and different images:
qemu_relative="arm-softmmu/qemu-system-arm -M gta02fake -m 130" # Entries for GTA02, Om2008.12 kernel_wildcard="Om2008.12-om-gta02.uImage.bin" rootfs_wildcard="Om2008.12-om-gta02.rootfs.jffs2" uboot_wildcard="gta02v5_and_up-u-boot.bin" download_dir="http://downloads.openmoko.org/distro/releases/Om2008.12/"
The openmoko/Makefile
should be changed so the openmoko-flash.base (the NAND image) will be 256 Mb in size:
# GTA02 $(FLASHIMG): # Making an empty/erased flash image. Need a correct echo behavior. $(echo) -en \\0377\\0377\\0377\\0377\\0377\\0377\\0377\\0377 > .8b cat .8b .8b .8b .8b .8b .8b .8b .8b > .64b # OOB is 64 bytes cat .64b .64b .64b .64b .64b .64b .64b .64b > .2048b cat .64b .64b .64b .64b .64b .64b .64b .64b >> .2048b cat .64b .64b .64b .64b .64b .64b .64b .64b >> .2048b cat .64b .64b .64b .64b .64b .64b .64b .64b >> .2048b cat .2048b .64b > .sec # A sector is 2048 bytes of data + OOB cat .sec .sec .sec .sec .sec .sec .sec .sec > .8sec cat .8sec .8sec .8sec .8sec .8sec .8sec .8sec .8sec > .64sec cat .64sec .64sec .64sec .64sec .64sec .64sec .64sec .64sec > .512sec cat .512sec .512sec .512sec .512sec > .2ksec cat .2ksec .2ksec .2ksec .2ksec .2ksec .2ksec .2ksec .2ksec > .16ksec # Neo GTA02 NAND is 128k sectors big cat .16ksec .16ksec .16ksec .16ksec .16ksec .16ksec .16ksec .16ksec > $@ rm -rf .8b .64b .2048b .sec .8sec .64sec .512sec .2ksec .16ksec
The openmoko/download.sh
will run, but openmoko/flash.sh
fails with endless errors:
s3c_nand_read: Bad register 0x20
May be there are more instructions for the GTA02 in the wiki page.
We can manually run the emulator to get the U-Boot prompt, but here we have to partition and flash the NAND manually.
arm-softmmu/qemu-system-arm -M gta02fake -m 130 \ -mtdblock openmoko-flash.base \ -kernel u-boot.bin \ -serial stdio -nographic -usb -monitor null