I got myself a FreeRunner. Here are some notes from the first few days:
Available operating systems
The FreeRunner comes with the Om 2007.2 distribution: it works for basic phone things, and it has an opkg package manager that you can use to install all sort of extra software. Only issue: the SMS application was rather unstable with my SIM card.
I then tried Om 2008.8, which is a major new redesign, partly based on Qtopia. It's definitely more advanced on how it looks, with smooth animations all around, but I did not manage to get the GSM part to work, because I did not manage to get it to ask for a PIN.
I then tried plain Qtopia and I got what looks and feels like a properly working mobile phone. The only issue that it has is that I did not manage to make it suspend, so battery life is much shorter than it could be. Apparently, this should improve as kernel 2.6.26 reaches the phone. I kept Qtopia installed in the phone flash as a "stable" phone system.
And finally, Debian. Debian is based on the freesmartphone.org software stack, which is an attempt to create a UI agnostic DBUS frontend to the hardware that supports multiple applications running on top of it. It is a young project, but it can already drive a mobile phone in a useful way. It has a demo interface that is basically a showcase of what is implemented in the DBUS frontend, but does most of the basic things you need from a mobile phone, including taking and making phone calls. And then it has Debian behind, all of it. I need to buy a bigger microsd card.
Tips and tricks
Flashing things
apt-get install
dfu-util- Start the Freerunner bios/bootloader, by holding down Power and then pressing AUX (standard bootloader), or by holding down AUX and then pressing Power (factory, unbrickable, read only fail safe bootloader).
dfu-util -l
shows you a list of devices it can access. If you see more than once, you need to specify in alldfu-util
commands which one you want, using-d USBID
. In my case, I have to always usedfu-util -d 0x1d50:0x5119
- To flash the kernel:
dfu-util -a kernel -R -D /path/to/uImage
- To flash the root file system:
dfu-util -a rootfs -R -D rootfs_filename.jffs2
- To flash the bootloader:
dfu-util -a u-boot -R -D uboot_filename.bin
- To flash the u-boot configuration:
dfu-util -a u-boot_env -D env.new
You can also download all of these things from the FreeRunner by using -U
instead of -D
.
Networking via USB
All of the distributions I tried, by default configure the USB as a
gadget with ethernet over usb. You can
form a lan with it using the cdc_ether
module, and you will find your phone
preconfigured as 192.168.0.202
expecting to find a gateway at
192.168.0.200
.
I made myself this script to start and stop networking with the phone:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/sh case "$1" in start) iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 192.168.0.200/29 ifconfig usb0 192.168.0.200 netmask 255.255.255.248 /etc/init.d/dnsmasq start echo 1 > /proc/sys/net/ipv4/ip_forward ;; stop) echo 0 > /proc/sys/net/ipv4/ip_forward /etc/init.d/dnsmasq stop iptables -t nat -F POSTROUTING ifconfig usb0 down ;; esac |
Besides doing masquerading, it also brings up dnsmasq so that the phone can always find a DNS together with the router.
Another useful trick is to configure the phone to share the approx cache with the laptop:
deb http://192.168.0.200:9999/debian unstable main deb http://192.168.0.200:9999/debian experimental main deb http://pkg-fso.alioth.debian.org/debian unstable main
So yes, my laptop can now be turned into a phone charger with networking, DNS and apt cache services. I shall look into hooking that script into dbus to have it run automatically when the phone is plugged and unplugged.
Changing the ringtone in Debian
In case you don't like the default ringtone, this is how to change it:
vi /usr/share/python-support/fso-frameworkd/framework/subsystems/oeventd/receiver.py
- look for
def _play( self ):
- change the codec in
decoder = gst.element_factory_make
, if needed. The list of available plugins is on the gstreamer website. - change the path in
filesrc.set_property
/etc/init.d/fso-frameworkd restart
and maybe/etc/init.d/zhone-session restart
Yes, the ringtone is currently hardcoded, but it does say it's a prototype
after all. Or, if you prefer, it's fully configurable and the configuration
can be found in /usr/share/python-support/fso-frameworkd
.
Configuring the bootloader
You can connect to the u-boot bootloader via
a serial terminal on /dev/ttyACM0
. Type help
and you will find that it can
do a lot of things. The OpenMoko wiki
has pages on the bootloader itself,
its commands and
the environment.
The environment is the configuration of the bootloader, similar somehow to
/boot/grub/menu.lst
. Unlike grub, you can edit the environment from within
the bootloader and then save it using the saveenv
command.
What I did:
- A boot entry for Debian, with the kernel on an ext2 partition instead of fat:
setenv menu_3 Boot from microSD (FAT+ext2): setenv bootargs \${bootargs_base} rootfstype=ext2 root=/dev/mmcblk0p2 rootdelay=5 \${mtdparts} ro\; mmcinit\; fatload mmc 1 0x32000000 \${sd_image_name}\; bootm 0x32000000
- Stay in the bootloader until a choice has been made:
setenv bootdelay -1
- Don't power down the bootloader when idle:
setenv boot_menu_timeout 99999
- Always show the menu at boot:
setenv stop_in_menu yes
saveenv
So now my phone dual boots, and I can choose if I want a more reliable phone now (Qtopia) or if I want to play with my future phone (Debian).
Configuring ssh for two host keys on the same host
Minor issue, but annoying: since both QTopia and Debian show up on
192.168.0.202, ssh will complain about changed host keys. Here is how to
configure ssh to avoid the problem (in ~/.ssh/config
):
Host debian HostName 192.168.0.202 User root HostKeyAlias debian Host qtopia HostName 192.168.0.202 User root HostKeyAlias qtopia