Table of Contents

Debian

Wenn man dazu tendiert sich ungern zu beschränken und im Zweifelsfall lieber alles möchte, sollte man wohl nicht mit einem FS mit weniger als 1GB anfangen. Ob eine benutzbare Installation mit 250MB (also im NAND-Flash) möglich ist ist ungetestet. Wahrscheinlich kann man aber mit gutem Gewissen auf jeden Fall eine Installation auf eine möglichst grosse microSD empfehlen. Die SD-Card am Desktop oder Notebook zu partitionieren, formatieren, und per install.sh Debian darauf zu installieren dürfte auch bequemer sein…

Das install.sh des DebianOnFreeRunner Projekts unterstützt leider keine Installation mit dem Kernel im Rootfs. Mit diesem mutierten install.sh funktioniert das.

ext2load (um den Kernel aus einem ext2-FS zu lesen) wird erst von halbwegs neuen UBoot-Versionen (so etwa ab August 2008) supportet.
Ein entsprechender UBoot-Env Eintrag (Kernel im ext2-Rootfs = 1. Partition auf SD-Card) würde in etwa so aussehen:

setenv menu_1 Boot from microSD partition 1 (ext2): setenv bootargs \${bootargs_base} rootfstype=ext2 root=/dev/mmcblk0p1 rootdelay=5 \${mtdparts} ro\; mmcinit\; ext2load mmc 1:1 0x32000000 /boot/uImage\; bootm 0x32000000

Das ganze ist ein Mix aus unstable und experimental tree. Kann also durchaus passieren dass zeitweise die Installation z.B. wegen Dependency-Problemen fehlschlägt. Einfach später nochmal probieren.

Kernel

Am einfachsten klaut man sich wohl den aktuellen Openmoko-Kernel.
Location im UBoot-Env Booteintrag eintragen nicht vergessen (oder besser um den Default zu benutzen einfach /boot/uImage zum Kernel Symlinken)

Issues

usbcore, usbnet, cdc_ether

ALSA WM8753 Module

Timezone

Timezone ist per default UTC.
Ändern mit: dpkg-reconfigure tzdata

USB Networking

Generell ist wohl eine dhcp Konfiguration von usb0 eine gute Idee.

/etc/network/interfaces

auto usb0
iface usb0 inet dhcp

GSM-Terminal

Um den Aufruf eines GSM-Terminals (möglicherweise via Mux) zu vereinfachen:

gsmterminal.sh

#!/bin/sh
#
# gsmterminal.sh  This shell script starts a gsm terminal

PATH=/bin:/usr/bin:/sbin:/usr/sbin

GSM_DEV="/dev/ttySAC0"
[ -f /etc/default/rcS ] && . /etc/default/rcS
[ -f /etc/default/gsmd ] && . /etc/default/gsmd

pid="`fuser "$GSM_DEV"`"
if [ -n "$pid" ] && [ "`ps -o comm --no-heading -p $pid`" == "gsm0710muxd" ]; then
        tty="`dbus-send --system --print-reply --type=method_call --dest=org.pyneo.muxer /org/pyneo/Muxer org.freesmartphone.GSM.MUX.AllocChannel string:terminal | grep '^[    ]*string' | sed 's/^[   ]*string "\(.*\)"$/\1/'`"
else
        [ -n "$GSM_POW" ] && ( echo "0" >"$GSM_POW"; sleep 1 )
        [ -n "$GSM_POW" ] && ( echo "1" >"$GSM_POW"; sleep 1 )
        [ -n "$GSM_RES" ] && ( echo "1" >"$GSM_RES"; sleep 1 )
        [ -n "$GSM_RES" ] && ( echo "0" >"$GSM_RES"; sleep 2 )
        tty="$GSM_DEV"
fi

screen "$tty"

pid="`fuser "$GSM_DEV"`"
if [ -z "$pid" ] || [ "`ps -o comm --no-heading -p $pid`" != "gsm0710muxd" ]; then
        [ -n "$GSM_POW" ] && echo "0" >"$GSM_POW"
fi

PPP

Eine Art pppd-wrapper-daemon der dafür sorgt dem pppd immer ein tty zur Verfügung zu stellen.

/etc/ppp/gsmpppd.sh

#!/bin/sh
#
# gsmpppd.sh  This shell script starts a gsm pppd

PATH=/bin:/usr/bin:/sbin:/usr/sbin

GSM_DEV="/dev/ttySAC0"
[ -f /etc/default/rcS ] && . /etc/default/rcS
[ -f /etc/default/gsmd ] && . /etc/default/gsmd
[ -f /etc/default/pppd ] && . /etc/default/pppd

if [ "$gsmpppd_phase" != "2" ]; then
        gsmpppd_phase="2"
        export gsmpppd_phase
        $0 &
        exit 0
fi;

# making the shell send signals it receives to its children, too, would be
# great... we could forget about signal handlers, would not have to care about
# children pids, and would not have to detach pppd and then wait for it...
sig_handler() {
        trap "" $1      # i don't know why, but at least TERM is signalled twice?
        logger gsmpppd.sh: signal $1 received
        #for i in `jobs -p`; do # does not work with ash - would work with bash
        for i in $gsmpppd_children; do
                logger gsmpppd.sh: sending child process $i signal $1
                kill -$1 $i
        done
        exit 0
}
trap "sig_handler HUP"  SIGHUP
trap "sig_handler INT"  SIGINT
trap "sig_handler QUIT" SIGQUIT
trap "sig_handler KILL" SIGKILL
trap "sig_handler TERM" SIGTERM

while true; do
        pid="`fuser "$GSM_DEV"`"
        if [ -n "$pid" ] && [ "`ps -o comm --no-heading -p $pid`" == "gsm0710muxd" ]; then
                tty="`dbus-send --system --print-reply --type=method_call --dest=org.pyneo.muxer /org/pyneo/Muxer org.freesmartphone.GSM.MUX.AllocChannel string:pppd | grep '^[        ]*string' | sed 's/^[   ]*string "\(.*\)"$/\1/'`"
        else
                [ -n "$GSM_POW" ] && ( echo "0" >"$GSM_POW"; sleep 1 )
                [ -n "$GSM_POW" ] && ( echo "1" >"$GSM_POW"; sleep 1 )
                [ -n "$GSM_RES" ] && ( echo "1" >"$GSM_RES"; sleep 1 )
                [ -n "$GSM_RES" ] && ( echo "0" >"$GSM_RES"; sleep 2 )
                tty="$GSM_DEV"
        fi
        # as the following two lines are non-atomic, this qualifies as 'ugly'
        /usr/sbin/pppd file "/etc/ppp/$PPP_FILE.options" connect "chat -v -f /etc/ppp/default.chat -T '$PPP_PHONE' -U '$PPP_APN'" <"$tty" 1>&0 &
        gsmpppd_children="$gsmpppd_children $!"
        wait
done

/etc/init.d/pppd

#!/bin/sh
#
# pppd  This shell script starts and stops pppd.
#
# chkconfig: 345 90 40
# description: Pppd manages an ip link via a serial device, in this case a gsm data connection
# processname: pppd

PATH=/bin:/usr/bin:/sbin:/usr/sbin

GSM_DEV="/dev/ttySAC0"
[ -f /etc/default/rcS ] && . /etc/default/rcS
[ -f /etc/default/gsmd ] && . /etc/default/gsmd

case "$1" in
    start)
        echo -n "Starting PPP daemon: "
        start-stop-daemon -S -x /etc/ppp/gsmpppd.sh
        if [ "$?" == "0" ]; then
                echo "pppd."
        else
                echo "(failed.)"
        fi
        ;;
    stop)
        echo -n "Stopping PPP daemon: "
        #start-stop-daemon -K -x /etc/ppp/gsmpppd.sh    # start-stop-daemon won't find it because it's just an argument to its interpreter
        pkill gsmpppd.sh
        pid="`fuser "$GSM_DEV"`"
        if [ -z "$pid" ] || [ "`ps -o comm --no-heading -p $pid`" != "gsm0710muxd" ]; then
                [ -n "$GSM_POW" ] && echo "0" >"$GSM_POW"
        fi
        echo "pppd."
        ;;
    restart|force-reload)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: /etc/init.d/pppd {start|stop|restart|force-reload}"
        exit 1
        ;;
esac

exit 0

/etc/ppp/flat.options

lock
noauth
crtscts
lcp-echo-failure 3
lcp-echo-interval 20
noipdefault
usepeerdns
defaultroute
replacedefaultroute

/etc/ppp/demand.options
(ungetestet, insbes. der active-filter dürfte wohl unter 'symbolische notation' fallen…)

lock
noauth
demand
idle 20
active-filter ( outbound dst port 53 ) or ( outbound tcp dst ( port 443 or port 80 or port 25 or port 22 ) or ( inbound tcp src ( port 443 or port 80 or port 25 or port 22 ) )
crtscts
lcp-echo-failure 3
lcp-echo-interval 20
noipdefault
usepeerdns
defaultroute
replacedefaultroute

/etc/ppp/default.chat

TIMEOUT 15
"" "\K\K\K\d+++ATH"
OK-AT-OK ATZ
OK ATE1
OK AT+CFUN?
+CFUN:\s1-AT+CFUN=1-OK AT+COPS?
+COPS:\s0-AT+COPS=0-OK AT+CGDCONT=1,\"IP\",\"\U\"
OK ATD\T
ABORT BUSY
ABORT DELAYED
ABORT "NO CARRIER"
ABORT "NO ANSWER"
ABORT "NO DIALTONE"
ABORT VOICE
ABORT ERROR
ABORT RINGING
TIMEOUT 60
CONNECT ""

/etc/default/pppd
(Die jeweiligen Werte durch die für den jeweiligen GSM Provider passenden Werte ersetzen - dieses Beispiel ist für EPlus und -Reseller)

PPP_PHONE="*99#"
PPP_APN="internet.eplus.de"
PPP_FILE="flat"

Falls für den GPRS-Zugang PAP oder CHAP Authentifizierung notwendig ist, noch die jeweiligen Daten in /etc/ppp/pap-secrets oder /etc/ppp/chap-secrets eintragen. Z.B. so (wieder EPlus und -Reseller, in dem Fall chap-secrets):

*               "eplus" "gprs"                  *

Die PPP-Connection kann dann also mit /etc/init.d/pppd gestartet und gestoppt werden. PPP_FILE=“flat” ist gedacht als 'always on' Variante. Ohne Daten-Flatrate sicher nicht zu empfehlen. PPP_FILE=“demand” ist gedacht als 'on demand' Variante - ist aber ungetestet und funktioniert mit an Sicherheit grenzender Wahrscheinlichkeit nicht oder nicht so wie man das will, d.h. man kann davon ausgehen dass bei Benutzung die Welt untergeht. 😉
Automatisches Starten via Init ist allerdings wohl eine schlechte Idee. Der pppd wird die GSM-Serielle benutzen, da der gsm0710muxd erst später gestartet wird - bzw. würde, da das tty belegt ist wird das nicht funktionieren. D.h. will man den pppd automatisch starten, sollte man das tun nachdem der gsm0710muxd gestartet wird (der wird das irgendwie über 😵. Ohne Flatrate will man das alles aber vielleicht sowieso lieber manuell machen…

NTP

apt-get install ntp

Damit wird mit einer Handvoll default Timeserver gesynced.

Issues

FSO/Zhone

Um mit FSO/Zhone zu beginnen, sollte man folgende Pakete installieren:

apt-get install dbus-x11 fso-config-gta02 fso-sounds-none fso-sounds-openmoko-nonfree hicolor-icon-theme libgtk2.0-bin

Issues

Matchbox

Um das Matchbox-Panel (wie bei den Openmoko-Distributionen) und die -Tastatur (wie bei Openmoko2007), zusätzlich noch einen Application-Launcher zu benutzen, folgende Pakete installieren:

apt-get install matchbox matchbox-panel matchbox-panel-manager matchbox-keyboard matchbox-desktop

/etc/X11/Xresources/matchbox

matchbox.theme: x
matchbox.titlebar: no
matchbox.cursor: no

Das eigene Theme (hier: x) gehört nach:
/usr/share/themes/x
und die zugehörigen Icons nach:
/usr/share/icons/x
(⇒ jeweils default nach x kopieren und je nach Geschmack anpassen)

Ein deutsches Keyboard-Layout:

/usr/share/matchbox-keyboard/keyboard.xml

<?xml version="1.0" encoding="UTF-8"?>
<keyboard>
<!--
 DE keyboard layout by x <x@muc.ccc.de>
-->
<options>
<!-- not yet implemented -->
</options>
<layout id="de keyboard">

<!--
  <row>
     <key>
          <default display="ヂ" />
    </key>
    <key>
          <default display="Ӫ" />
    </key>
    <space width="1500" />
    <key fill="true">
          <default display="⠿" />
    </key>
  </row>
-->

  <row>
    <space width="500" extended="true"/>
    <key fill="true">
          <default display="Esc" action="escape" />
    </key>
    <key>
          <default display="^" />
          <shifted display="°" />
    </key>
    <key>
          <default display="1" />
          <shifted display="!" />
    </key>
    <key>
          <default display="2" />
          <shifted display='"' />
          <mod1    display="²" />
    </key>
    <key>
          <default display="3" />
          <shifted display="§" />
          <mod1    display="³" />
    </key>
    <key>
          <default display="4" />
          <shifted display="$" />
    </key>
    <key>
          <default display="5" />
          <shifted display="%" />
    </key>
    <key>
          <default display="6" />
          <shifted display="&amp;" />
    </key>
    <key>
          <default display="7" />
          <shifted display="/" />
          <mod1    display="{" />
    </key>
    <key>
          <default display="8" />
          <shifted display="(" />
          <mod1    display="[" />
    </key>
    <key>
          <default display="9" />
          <shifted display=")" />
          <mod1    display="]" />
    </key>
    <key>
          <default display="0" />
          <shifted display="=" />
          <mod1    display="}" />
    </key>
    <key>
          <default display="ß" />
          <shifted display="?" />
          <mod1    display="\" />
    </key>
    <key>
          <default display="´" />
          <shifted display="`" />
    </key>
    <key fill="true">
          <default display="⟵" action="backspace"/>
          <mod1 display="Del" action="delete"/>
    </key>
    <space width="500" extended="true"/>
    <key width="4000"  extended="true">
          <default display="Home" action="home"/>
    </key>
    <key width="4000"  extended="true">
          <default display="PgUp" action="pageup"/>
    </key>
    <space width="500" extended="true"/>
  </row>
  <row>
    <space width="500" extended="true"/>
    <key width="2500">
          <default display="⇥" action="tab"/>
          <shifted display="⇤" action="tab"/>
    </key>
    <key obey-caps='true'>
          <default display="q" />
          <shifted display="Q" />
          <mod1 display="@" />
    </key>
    <key obey-caps='true'>
          <default display="w" />
          <shifted display="W" />
          <mod1 display="ε" />
    </key>
    <key obey-caps='true'>
          <default    display="e" />
          <shifted display="E" />
          <mod1 display="€" />
    </key>
    <key obey-caps='true'>
          <default display="r" />
          <shifted display="R" />
          <mod1 display="ρ" />
    </key>
    <key obey-caps='true'>
          <default display="t" />
          <shifted display="T" />
          <mod1 display="τ" />
    </key>
    <key obey-caps='true'>
          <default display="z" />
          <shifted display="Z" />
          <mod1 display="ζ" />
    </key>
    <key obey-caps='true'>
          <default display="u" />
          <shifted display="U" />
    </key>
    <key obey-caps='true'>
          <default display="i" />
          <shifted display="I" />
          <mod1 display="ι" />
    </key>
    <key obey-caps='true'>
          <default display="o" />
          <shifted display="O" />
          <mod1 display="ω" />
    </key>
    <key obey-caps='true'>
          <default display="p" />
          <shifted display="P" />
          <mod1 display="π" />
    </key>
    <key obey-caps='true'>
          <default display="ü" />
          <shifted display="Ü" />
          <mod1 display="ψ" />
    </key>
    <key>
          <default display="+" />
          <shifted display="*" />
          <mod1 display="~" />
    </key>
    <!-- key fill="true">
          <default display="#" />
          <shifted display="'" />
    </key -->
    <key fill="true">
          <default display="⏎" action="return" />
    </key>
    <space width="500" extended="true"/>
    <key width="4000"  extended="true">
          <default display="End" action="end"/>
    </key>
    <key width="4000"  extended="true">
          <default display="PgDn" action="pagedown"/>
    </key>
    <space width="500" extended="true"/>
  </row>
  <row>
    <space width="500" extended="true"/>
    <key width="3500">
          <default display="⇩" action="modifier:caps"/>
    </key>
    <key obey-caps='true'>
          <default display="a" />
          <shifted display="A" />
          <mod1 display="α" />
    </key>
    <key obey-caps='true'>
          <default display="s" />
          <shifted display="S" />
          <mod1 display="σ" />
    </key>
    <key obey-caps='true'>
          <default display="d" />
          <shifted display="D" />
          <mod1 display="δ" />
    </key>
    <key obey-caps='true'>
          <default display="f" />
          <shifted display="F" />
          <mod1 display="φ" />
    </key>
    <key obey-caps='true'>
          <default display="g" />
          <shifted display="G" />
          <mod1 display="γ" />
    </key>
    <key obey-caps='true'>
          <default display="h" />
          <shifted display="H" />
          <mod1 display="η" />
    </key>
    <key obey-caps='true'>
          <default display="j" />
          <shifted display="J" />
    </key>
    <key obey-caps='true'>
          <default display="k" />
          <shifted display="K" />
          <mod1 display="κ" />
    </key>
    <key obey-caps='true'>
          <default display="l" />
          <shifted display="L" />
          <mod1 display="λ" />
    </key>
    <key obey-caps='true'>
          <default display="ö" />
          <shifted display="Ö" />
          <mod1 display="Ω" />
    </key>
    <key obey-caps='true'>
          <default display="ä" />
          <shifted display="Ä" />
          <mod1 display="θ" />
    </key>
    <key>
          <default display="#" />
          <shifted display="'" />
    </key>
    <key fill="true">
          <default display="⏎" action="return" />
    </key>
    <space width="500" extended="true"/>
    <space width="4000"  extended="true" />
    <space width="4000"  extended="true" />
    <space width="500" extended="true"/>
  </row>
  <row>
    <space width="500" extended="true"/>
    <key width="2000">
          <default display="⇧" action="modifier:shift"/>
    </key>
    <key>
          <default display="&lt;" />
          <shifted display="&gt;" />
          <mod1 display="|" />
    </key>
    <key obey-caps='true'>
          <default display="y" />
          <shifted display="Y" />
          <mod1 display="υ" />
    </key>
    <key obey-caps='true'>
          <default display="x" />
          <shifted display="X" />
          <mod1 display="ξ" />
    </key>
    <key obey-caps='true'>
          <default display="c" />
          <shifted display="C" />
          <mod1 display="χ" />
    </key>
    <key obey-caps='true'>
          <default display="v" />
          <shifted display="V" />
    </key>
    <key obey-caps='true'>
          <default display="b" />
          <shifted display="B" />
          <mod1 display="β" />
    </key>
    <key obey-caps='true'>
          <default display="n" />
          <shifted display="N" />
          <mod1 display="ν" />
    </key>
    <key obey-caps='true'>
          <default display="m" />
          <shifted display="M" />
          <mod1 display="µ" />
    </key>
    <key>
          <default display="," />
          <shifted display=";" />
    </key>
    <key>
          <default display="." />
          <shifted display=":" />
    </key>
    <key>
          <default display="-" />
          <shifted display="_" />
    </key>
    <key fill="true">
          <default display="⇧" action="modifier:shift"/>
    </key>
    <space width="500" extended="true"/>
    <space width="4000"  extended="true" />
    <space width="4000"  extended="true" />
    <space width="500" extended="true"/>
 </row>
  <row>
    <space width="500" extended="true"/>
    <key>
          <!-- default display="[->]" action="modifier:layout"/ -->
          <default display="Pse" action="pause"/>
          <shifted display="Scr" action="scrolllock"/>
          <mod1 display="SRq" action="sysreq"/>
    </key>
    <key fill="true">
          <default display="Ctrl" action="modifier:ctrl"/>
    </key>
    <key>
          <default display="☮" action="modifier:mod2"/>
    </key>
    <key>
          <default display="Alt" action="modifier:alt"/>
    </key>
    <key width="12000">
          <default display=" " action="space" />
    </key>
    <key>
          <default display="AGr" action="modifier:mod1"/>
    </key>
    <key>
          <default display="↑" action="up" />
          <mod1 display="Pg↑" action="pageup" />
    </key>
    <key>
          <default display="↓" action="down" />
          <mod1 display="Pg↓" action="pagedown" />
    </key>
    <key>
          <default display="←" action="left" />
          <mod1 display="Hom" action="home"/>
    </key>
    <key>
          <default display="→" action="right" />
          <mod1 display="End" action="end"/>
    </key>
    <space width="500" extended="true"/>
    <space width="4000"  extended="true" />
    <space width="4000"  extended="true" />
    <space width="500" extended="true"/>
</row>
</layout>
</keyboard>

Hinweise wie man die Enter-Tasten über die zwei Rows hinweg zu einer machen kann wären sehr erwünscht 🙂

Keybindings lassen sich in /etc/matchbox/kbdconfig konfigurieren.

Per Installation wird X mit Zhone (/usr/bin/zhone-session) via /etc/init.d/zhone-session gestartet. Um X mit Matchbox zu starten sollte man die S*zhone-session und K*zhone-session Links aus den /etc/rc*.d entfernen,

for i in 0 1 6; do mv /etc/rc$i.d/K20zhone-session /etc/rc$i.d/xK20zhone-session; done
for i in 2 3 4 5; do mv /etc/rc$i.d/S20zhone-session /etc/rc$i.d/xS20zhone-session; done

und X mit /usr/bin/matchbox-session starten. Am einfachsten wohl /etc/init.d/zhone-session nach /etc/init.d/matchbox-session kopieren, PROG_FSO auf /usr/bin/matchbox-session setzen, und S*matchbox-session/ / (rcs 2, 3, 4, 5) und / /K*matchbox-session (rcs 0, 1, 6) Links in den jeweiligen /etc/rc*.d setzen.

for i in 0 1 6; do ln -s ../init.d/matchbox-session /etc/rc$i.d/K20matchbox-session; done
for i in 2 3 4 5; do ln -s ../init.d/matchbox-session /etc/rc$i.d/S20matchbox-session; done

Die default-Session ist etwas spärlich, dem sollte folgendes abhelfen:

/etc/matchbox/session

#!/bin/sh

gnome-screensaver &
gnome-power-manager &
zhone &
matchbox-desktop &
matchbox-panel  --orientation north &
matchbox-keyboard-toggle &
exec matchbox-window-manager $@

Issues

Screensaver, Powermanager

Die Screensaver-/Locking-/Powermanagementfunktionalität des FSO-Frameworkd stört eigentlich sobald man nicht ausschliesslich Zhone, sondern verschiedene X Applikationen benutzen möchte.
In dem Fall möchte man ebendiese Aufgaben von einer X Lösung erledigt bekommen, z.B. dem gnome-screensaver und dem gnome-power-manager, letzterer dockt sich auch ans Panel.

Dazu folgende Pakete installieren:

apt-get install gnome-screensaver gnome-power-manager

Um die besagte Funktionalität beim Frameworkd auszuschalten, folgende Parameter in der angegebenen Sektion hinzufügen:

/etc/frameworkd.conf

[odeviced.idlenotifier]
# configure timeouts (in seconds) here. A value of 0
# means 'never fall into this state' (except programatically)
idle = 0
idle_dim = 0
idle_prelock = 0
lock = 0
suspend = 0

Issues

Terminal

Mind. zwecks Themeing empfiehlt sich auch hier gnome-terminal. Das ist dann hübsch und gut benutzbar - hat aber im Vergleich zu xterm oder rxvt o.ä. einen relativ riesigen (wenn auch wohl grade noch erträglichen) Memory-Footprint…

Volumecontrol

Als Volume-Control Panel-Applikation empfiehlt sich gnome-volume-manager. Leider dockt der nicht ans Panel, womit er derzeit nicht brauchbar ist (macht de facto einfach garnichts).

X

X regelt.

Issues