Before we can start, we need to set up a compiler toolchain targetting
TomTom devices. TomTom provides a a pre-compiled compiler toolchain for
Linux and Windows (CygWin). It can be downloaded from TomTom’s website:
http://www.tomtom.com/page.php?Page=gpl. This file needs to be unpacked
into /usr/local/cross.
In order to use the TomTom compiler and libraries, we need to set some
environment variables:
Finally, some standard build tools are necessary for building some of
the libraries and the Navit binaries. The most important one is the
autotools suite, including autoconf, automake, autoheader and aclocal.
Install these if you don’t already have them.
Get the zlib source from http://zlib.net/. zlib’s configure script does
not support selecting the host system via –host, so we need to set a
few environment variables by hand before we can compile zlib:
This has been tested with zlib 1.2.5. Older versions require AR to bet
set to “arm-linux-ar -r” instead. Before proceeding, make sure to reset
it to arm-linux-ar because the “-r” switch is needed only by these old
zlib versions and will cause conflicts compiling the other libraries.
This one is rather straightforward. Simply download the source from
ftp://xmlsoft.org/libxml2/, configure (disable Python as this may cause
problems), make and install:
./configure--prefix=$PREFIX--host=arm-linux--without-python
make
makeinstall
The libpng source can be downloaded from
http://sourceforge.net/projects/libpng/files/. I recommend using
libpng-1.2.xx - I have tried 1.4.xx before but that one didn’t work.
Configure, make and install:
./configure--prefix=$PREFIX--host=arm-linux
make
makeinstall
Get the libjpeg source from
http://sourceforge.net/projects/libjpeg/files/ - the current version
(which worked for me) should be 6b. It seems to rely on the directory
$PREFIX/man/man1 to be present, so we need to create this if it is not
already present. Configure, make and install:
mkdir-p$PREFIX/man/man1
./configure--prefix=$PREFIX--host=arm-linux
make
makeinstall
Cross compiling glib is a bit tricky. First, we need the sources from
http://ftp.gnome.org/pub/gnome/sources/glib/. The configure script tries
to probe some characteristics of the host machine by compiling a few
test programs and running them - which will fail when a cross compiler
is used. We therefore need to set the results of these tests by hand. In
the glib source directory, create a file named tomtom.cache with the
following contents:
These instructions are based on http://www.opentom.org/Tslib. First, we
need the tslib source from the SVN repository:
svncosvn://svn.berlios.de/tslib/trunk/tslibtslib
Before compiling, we need to patch the source a bit: Open the file
plugins/input-raw.c in the tslib source directory and search for
EVIOCGRAB. You will find several occurences of EVIOCGRAB, each of them
within some if-statement. Enclose these if-statements with #ifdef
EVIOCGRAB … #endif, so that you get something like this:
#ifdef EVIOCGRABif(...){...EVIOCGRAB....}#endif
We also need to edit the config file etc/ts.conf. For older TomToms,
uncomment the line “module_raw h3600”, so the file should look like
this:
# Uncomment if you wish to use the linux input layer event interface# module_raw input# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d# module_raw collie# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860# module_raw corgi# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface# module_raw ucb1x00# Uncomment if you're using an HP iPaq h3600 or similarmodule_rawh3600
# Uncomment if you're using a Hitachi Webpad# module_raw mk712# Uncomment if you're using an IBM Arctic II# module_raw arctic2modulepthrespmin=1
modulevariancedelta=30
moduledejitterdelta=100
modulelinear
The new TomTom versions (ONE, XL) require a different driver. For these
devices, uncomment “module_raw input” instead. Finally, use autogen.sh
to create a configure script, configure, make and install.
./autogen.sh
./configure--prefix=$PREFIX--host=arm-linux
make
makeinstall
./configure--prefix=$PREFIX--host=arm-linux\--disable-esd--disable-joystick--disable-cdrom--disable-video-x11\--disable-x11-vm--disable-dga--disable-video-x11-dgamouse\--disable-video-x11-xv--disable-video-x11-xinerama--disable-video-directfb\--enable-video-fbcon--disable-audioCFLAGS="$CFLAGS -DFBCON_NOTTY"
make
makeinstall
The “-DFBCON_NOTTY” invokes the patch mentioned above and removes
fbcon’s dependence on a virtual console. If you like, you can also
compile the test applications, as these are quite useful for testing
whether libSDL works:
cdtest
./configure--prefix=$PREFIX--host=arm-linux
make
makeinstall
./autogen.sh
./configure--prefix=$PREFIX--host=arm-linux--disable-graphics-gtk-drawing-area--disable-gui-gtk\--disable-graphics-qt-qpainter--disable-binding-dbus--disable-fribidi--enable-cache-size=16777216
make
makeinstall
Since we have not ported gtk, as we will use libSDL and the internal GUI
only, we have to disable the gtk drivers in the configure command.
We can now put the compiled libraries and the Navit executable, as well
as some config files and, of course, some maps, to a TomTom device.
Connect the TomTom device to your computer. You should see a new hard
drive. In the following, let’s assume this hard drive can be found in
/media/TOMTOM. We then need two directories on the TomTom disk, navit
and SDKRegistry. If they don’t exist yet, create them:
cd/media/TOMTOM
mkdir-pnavitSDKRegistry
Within the navit directory, create the following directories: bin, lib,
share, sdl and ts.
cdnavit
mkdir-pbinlibsharesdlts
Now these directories have to be filled with content.
Put all the libraries you just compiled into the lib directory. Be aware
that TomTom uses a FAT file system which isn’t aware of symlinks, so you
will have to copy / rename libraries instead of symlinking them. You
should end up with something similar to these files:
libSDL-1.2.so
libSDL.so
libSDL_image-1.2.so
libSDL_image.so
libfontconfig.so
libfreetype.so
libgio-2.0.so
libglib-2.0.so
libgmodule-2.0.so
libgobject-2.0.so
libgthread-2.0.so
libpng.so
libpng12.so
libts-1.0.so
libts.so
libxml2.so
It seems that TomTom’s compiler toolchain contains some libraries which
are not present on the TomTom devices, so you may need to copy the
following libraries as well:
We already copied the tslib library into the navit/lib folder in the
previous step. But in order to use tslib, we still need the config file
telling tslib which driver to use. Copy it into navit/ts:
cp$PREFIX/etc/ts.conf/media/TOMTOM/navit/ts/
tslib comes with some utilities for touchscreen devices, such as
calibration and testing tools. When you followed the procedure described
above for compiling and installing tslib, you can find them in
$PREFIX/bin - easily recognizable, because their names start with “ts_”.
If you wish to use them on your TomTom, simply copy them into the
navit/ts folder:
cp$PREFIX/bin/ts_*/media/TOMTOM/navit/ts/
In order to run them, you will need a small wrapper script which sets
some environment variables before executing the actual utility. For
example, the following script will run the calibration utility and then
start a simple test program:
Here, /dev/fb is the frame buffer device, and /dev/ts is the
touchscreen. Newer TomTom versions (ONE, XL) have the touchscreen at
/dev/input/event0 instead. In this case you need to change the
corresponding line to:
exportTSLIB_TSDEVICE=/dev/input/event0
To run this script, create a file named ts.cap in the SDKRegistry
directory with the following contents:
Version|100|
AppName|ts-wrapper|
AppPath|/mnt/sdcard/navit/ts/|
AppIconFile||
AppMainTitle|Touchscreen|
AppPort||
COMMAND|CMD|hallo||Touchscreen|
This will create an entry named “Touchscreen” in TomTom’s main menu.
If you have compiled the SDL test applications along with libSDL, place
them in the navit/sdl folder on your TomTom device, as well as the
*.bmp, *.wav , *.xbm, *.dat and *.txt files from the folder named
test in the libSDL source directory. Before running any of these
utilities, we need to set some environment variables. The overall
procedure is very similar to the tslib utilities mentioned above. You
need to create a wrapper script which with the following lines in it:
Add a line with the command that should be executed by the script. Put
this file into the navit/sdl folder on your TomTom device. Finally, you
need to create an entry in Navit’s main menu. Place a file named sdl.cap
in the SDKRegistry with the following contents:
Version|100|
AppName|sdl-wrapper|
AppPath|/mnt/sdcard/navit/sdl/|
AppIconFile||
AppMainTitle|SDL-Utility|
AppPort||
COMMAND|CMD|hallo||SDL-Utility|
Replace “sdl-wrapper” with the name of your wrapper script, if
necessary.
In order to run Navit, we need to create a short wrapper script, which
will set a few environment variables before running the actual Navit
executable. Create a file named navit-wrapper in the bin directory with
the following contents:
#!/bin/shcd/mnt/sdcard
# Set some paths.exportPATH=$PATH:/mnt/sdcard/navit/bin
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/sdcard/navit/lib
exportHOME=/mnt/sdcard/
exportNAVIT_LIBDIR=/mnt/sdcard/navit/lib/navit
exportNAVIT_SHAREDIR=/mnt/sdcard/navit/share
# tslib requirements.exportTSLIB_CONSOLEDEVICE=none
exportTSLIB_FBDEVICE=/dev/fb
exportTSLIB_TSDEVICE=/dev/ts
exportTSLIB_CALIBFILE=/mnt/sdcard/navit/ts/pointercal
exportTSLIB_CONFFILE=/mnt/sdcard/navit/ts/ts.conf
exportTSLIB_PLUGINDIR=/mnt/sdcard/navit/lib/ts
# SDL requirements.exportSDL_MOUSEDRV=TSLIB
exportSDL_MOUSEDEV=$TSLIB_TSDEVICEexportSDL_NOMOUSE=1exportSDL_FBDEV=/dev/fb
exportSDL_VIDEODRIVER=fbcon
exportSDL_AUDIODRIVER=dsp
# fontconfig requirementsexportFC_CONFIG_DIR=/mnt/sdcard/navit/fonts
exportFONTCONFIG_DIR=/mnt/sdcard/navit/fonts
exportFC_CONFIG_FILE=/mnt/sdcard/navit/fonts/fonts.conf
exportFONTCONFIG_FILE=/mnt/sdcard/navit/fonts/fonts.conf
exportFC_DEBUG=0# Set language.exportLANG=en_US.utf8
# Run Navit.
/mnt/sdcard/navit/bin/navit/mnt/sdcard/navit/share/navit.xml2>/mnt/sdcard/navit/navit.log
The first few lines tell Navit where it can find binaries, libraries,
plugins and map icons. The middle part tells tslib which touchscreen
device to use, and where to place calibration data. For newer TomToms,
the touchscreen device is at /dev/input/event0, so the corresponding
line needs to be changed to:
export TSLIB_TSDEVICE=/dev/input/event0
The following lines tell libSDL to use the touchscreen as mouse input,
to hide the mouse pointer and to use the framebuffer. The last lines set
Navit’s language and run the Navit executable. stderr is redirected into
a log file, since there is usually no console available to view debugger
output.
You may have noticed the presence of a “NAVIT_LIBDIR” in the wrapper
script. This is where Navit will look for plugins, so we put the plugins
right there:
cp-r$PREFIX/lib/navit/media/TOMTOM/navit/lib/
Next, copy the images used by Navit to display POIs, as well as the
navit config file into the share folder, and create a folder for
installing maps:
In order to start Navit from TomTom’s graphical menu, we finally have to
add a menu button. Create a file named navit.cap with the following
contents in /media/TOMTOM/SDKRegistry:
Version|100|
AppName|navit-wrapper|
AppPath|/mnt/sdcard/navit/bin/|
AppIconFile|navit.bmp|
AppMainTitle|Navit|
AppPort||
COMMAND|CMD|hallo|navit.bmp|Navit|
In the same directory, place a simple 48 * 48 pixel, 24 bit bitmap file
named navit.bmp with a fancy Navit icon or whatever you like. If you are
happy without such an icon, you can omit this step and delete the two
“navit.bmp” entries from the file above:
Any navigation software would be useless without maps. See the
Maps section for maps you can use with Navit. Put them into
the directory /media/TOMTOM/navit/share/maps which you have just
created.
Before running Navit, we need to change some settings in the Navit
config file, navit.xml, which we have placed in navit/share on the
TomTom disk. Here are some settings which are rather useful:
As long as you don’t have gdb on your TomTom, set the segfault
debugging level to 0, i.e. let Navit crash without printing a stack
trace via gdb. Otherwise Navit will complain that gdb can’t be found.
<debugname="segv"level="0"/>
Use libSDL for graphics output. Set the screen witdh and height as
well as the bits per pixel fitting to your TomTom device. (Have a
look at http://www.opentom.org/Hardware_TFT_LCD for a list of screen
sizes.) Disable the window frame and set SDL flags such that
“software surfaces” are enabled.
Finally, enable the mapsets you wish to use. Remember that TomTom’s disk
will be mounted at /mnt/sdcard at runtime, so any maps you place in the
navit/share/maps folder will appear in /mnt/sdcard/navit/share/maps
(which is the same as $NAVIT_SHAREDIR/maps, if you have set
$NAVIT_SHAREDIR as shown above).
Running Navit is as simple as a touch of a button. Disconnect your
device properly from the computer and let it reboot. Touch the screen to
enter the main manu. On the last page of the main menu, a new menu entry
named “Navit” should be visible. Simply press the Navit button and wait
for the Navit screen to appear. Have fun!
Sometimes it is useful to obtain debugging output from Navit, for
example to include it in a bug report. Add the following lines to your
navit.xml (if they are not already present):
You can now switch on debugging output for different parts of Navit by
increasing the corresponding debug level. For example, to obtain
standard debug messages from the Navit core application, increase the
debug level in the “navit” entry to 1. For more debug output, you can
use higher numbers, i.e. setting the debug level in the “osd_core” entry
to 5 will give you plenty of debug output from the on screen display
plugin.
Make sure that the debug output is redirected into some file which you
can transfer to your computer after running Navit, so you need an entry
similar to this one in your navit-wrapper script:
# Run Navit.
/mnt/sdcard/navit/bin/navit/mnt/sdcard/navit/share/navit.xml2>/mnt/sdcard/navit/navit.log
The debugger output will then be placed in a file named “navit.log” in
the navit folder on your TomTom.
It is often useful to run programs from a console. For a simple console
running on TomTom devices, have a look at TomTom
Console.
It seems not to run an all TomTom devices and software versions, so you
may try using Btconsole instead,
which allows you to login to your TomTom device via bluetooth.