====== OpenMoko Neo FreeRunner ======
{{ .:freerunner:freerunner_box.jpg?300|The Neo FreeRunner box}}
//Agosto 2008//
Finalmente è arrivato!
Il primo telefonino libero è tra noi, lo si può acquistare e funziona! Il [[http://wiki.openmoko.org/wiki/GroupSales/Firenze|gruppo di acquisto Firenze]] è stato tra i primi a ricevere il telefonino in Italia, l'acquisto collettivo è stato fatto presso la tedesca [[http://www.handheld-linux.com/|Handheld-Linux]], che per **319 euri** ha offerto il **FreeRunner** con **astuccio** e **auricolari/microfono**.
La scatola è spartana, ma con un suo stile. La documentazione praticamente assente rimanda alle pagine web dedicate ad OpenMoko. Per iniziare questo è il link: **[[http://wiki.openmoko.org/wiki/Getting_Started_with_your_Neo_FreeRunner|Getting Started]]**.
Questo è il contenuto della confezione:
* Neo FreeRunner
* Batteria Li-ion da 1200 mA, 3.7 v
* Alimentatore con adattatori internazionali
* Auricolare/microfono con gommini in varie misure
* Scheda microSD da 512 Mb
* Cavetto USB (A -> miniB) per alimentazione e scambio dati
* Penna a sfera/stilo con puntatore laser e led luminoso
* Astuccio con logo OpenMoko
{{.:freerunner:freerunner_contents.jpg?250|Il contenuto della confezione}}
{{.:freerunner:freerunner_pouch_and_earphone.jpg?250|Astuccio e auricolari}}
{{.:freerunner:freerunner_battery_and_sd.jpg?250|Batteria e scheda MiniSD}}
{{.:freerunner:freerunner_power_supply.jpg?250|Alimentatore}}
Alcuni link utili:
* **Home page del progetto OpenMoko** [[http://www.openmoko.org/]]
* **Forum italiano utenti OpenMoko** [[http://forum.telefoninux.org/]]
===== Altre pagine sul FreeRunner =====
* **[[attualita/liberta_digitale/20080903_freerunner_review]]**
* **[[freerunner_peek_poke]]**
* **[[doc:appunti:prog:openmoko_compile]]**
* **[[freerunner_debian]]**
===== Il primo boot =====
L'interfaccia utente non è intuitiva come quella del mio vecchio Nokia 1100, ma con il software originale sono stato in grado di **inviare e ricevere SMS**, **fare e ricevere telefonate**, accedere alla riga di comando. Il viaggio è appena cominciato!
{{.:freerunner:freerunner_kernel_boot.jpg?150|Kernel boot}}
{{.:freerunner:freerunner_splash_screen.jpg?150|Splash screen}}
{{.:freerunner:freerunner_enter_pin.jpg?150|Enter PIN}}
{{.:freerunner:freerunner_desktop.jpg?150|Desktop}}
{{.:freerunner:freerunner_incoming_call.jpg?150|Incoming call}}
{{.:freerunner:freerunner_terminal.jpg?150|The terminal}}
===== Collegamento network via USB =====
Collegando il cavetto USB ad un computer GNU/Linux, il kernel riconosce il Neo FreeRunner:
usb 1-7: new full speed USB device using ohci_hcd and address 9
usb 1-7: configuration #1 chosen from 2 choices
usb0: register 'cdc_ether' at usb-0000:00:0b.0-7, CDC Ethernet Device, 9e:e3:ed:c0:bd:58
il modulo kernel **usbnet** crea un'interfaccia **usb0** che possiamo configurare. Per consentire al Neo l'accesso a internet configuriamo anche il DNAT per le richieste DNS (verso il nostro server DNS 192.168.2.2) e il MASQUERADE, in pratica facciamo da gateway e DNS server al Neo:
linux:~# ifconfig usb0 192.168.0.200
linux:~# iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.2.2
linux:~# iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
linux:~# echo 1 > /proc/sys/net/ipv4/ip_forward
Per ottenere lo stesso effetto automaticamente al collegamento del cavetto USB, sul PC si aggiunge questo al file **''/etc/network/interfaces''**:
allow-hotplug usb0
iface usb0 inet static
address 192.168.0.200
netmask 255.255.255.0
network 192.168.0.0
post-up iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
post-up iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.2.2
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
Il Neo ha indirizzo predefinito **192.168.0.202**, ha come **default gateway** e **server DNS** il **192.168.0.200**, ha il server **ssh** (dropbear) attivo e la **password di root** è vuota:
linux:~# ssh root@192.168.0.202
The authenticity of host '192.168.0.202 (192.168.0.202)' can't be established.
RSA key fingerprint is 68:b6:7e:cc:81:99:1a:30:f9:25:b9:60:6f:8c:84:d8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.202' (RSA) to the list of known hosts.
root@192.168.0.202's password:
root@om-gta02:~#
===== Aggiornamento del sistema =====
Dalla shell ssh si aggiorna l'elenco dei pacchetti contenuti nel repository:
opkg update
L'aggiornamento di **dropbear** conviene farlo dalla finestra terminale del Neo
opkg upgrade dropbear
dalla shell ssh si può aggiornare tutto il resto:
opkg upgrade
===== Problema con il GPS =====
{{.:freerunner:freerunner_gps_fix.png?100 |GPS Time To First Fix}}
{{ .:freerunner:freerunner_gps_signal.png?100|GPS Satellites Signal Strenght}}
Viene segnalato un **[[http://wiki.openmoko.org/wiki/GPS_Problems|problema grave del ricevitore GPS]]**; in pratica la microSD inserita genera interferenza per cui il segnale dei satelliti viene molto disturbato.
Con l'aggiornamento del kernel (ho eseguito un upgrade completo il 2008-07-22) pare proprio che il workaround software sia stato installato; sono riuscito ad ottenere il primo fix in 162 secondi, il successivo in poco più di 20 secondi. Anche la forza del segnale ricevuto pare buona.
Esiste anche un **[[http://wiki.openmoko.org/wiki/Image:Gta02_gps_10pf_rework_sop.pdf|workaround hardware]]**: saldare un piccolo condensatore tra due contatti della microSD.
==== Test approfondito GPS ====
Ho eseguito un test sulle possibili interferenze della microSD con il ricevitore GPS secondo le linee guida della pagina **[[http://wiki.openmoko.org/wiki/Howto_Test_Your_GPS_with_agpsui|Howto Test Your GPS with agpsui]]**. Ho tenuto sempre la microSD inserita: nel primo test ho eseguito solo **agpsui**, nel secondo test ho lanciato anche la riproduzione di un brano .mp3 di circa 3 Mb per verificare se la lettura della flash influisce sulla ricezione del segnale GPS.
Il risultato è incoraggiante; sia il TTFF (**inferiore al minuto**) che la media dei segnali ricevuti (**circa 129 dBm**) sono del tutto simili nei due casi. I test sono stati eseguiti in **condizioni ottimali** di visibilità.
**Senza accedere alla microSD:** \\
{{.:freerunner:gps_signal_strength_not_reading_microsd.png?80|Signal Strength without microSD access}}
{{.:freerunner:gps_ttff_not_reading_microsd.png?80|Time To First Fix without microSD access}}
**Durante l'accesso alla microSD:** \\
{{.:freerunner:gps_signal_strength_reading_microsd.png?80|Signal Strength with microSD access}}
{{.:freerunner:gps_ttff_reading_microsd.png?80|Time To First Fix with microSD access}}
Può darsi che la lettura del brano mp3 produca ben pochi accessi alla flash memory (cache, ecc.), ma si tratta di uno scenario abbastanza verosimile, paragonabile ad esempio alla lettura della mappa di un programma di navigazione. Sicuramente il fix software è stato installato (immagine del root filesystem OM2007.2 del 2008-07-22). Non so se dalla fabbrica è stato applicato anche qualche fix hardware. Ad ogni modo non c'è alcun condensatore visibile saldato sui contatti della microSD.
Queste le versione software/hardware del mio FreeRunner:
root@om-gta02:~# cat /etc/om-version
Tag Name:
VERSION: 905a9d7ec21de0835f9ee21cc5231acb66f3e339
Branch: org.openmoko.dev
Build Host: buildhost.openmoko.org
Time Stamp: Tue, 22 Jul 2008 02:51:41 +0200
root@om-gta02:~# libgsmd-tool -m shell
libgsm-tool - (C) 2006-2007 by Harald Welte and OpenMoko, Inc.
This program is Free Software and has ABSOLUTELY NO WARRANTY
rv
# # Get revision
revision: "HW: GTA02BV5, GSM: gsm_ac_gp_fd_pu_em_cph_ds_vc_cal35_ri_36_amd8_ts0-Moko8"
S/N: 8A8602500
DATE CODE: 20080621
===== Installazione software =====
==== Quale distribuzione usare? ====
Il FreeRunner è arrivato dalla fabbrica con installata la distribuzione **OpenMoko 2007.2**. Esistono **[[http://wiki.openmoko.org/wiki/Distributions|altre distribuzioni]]** per questo hardware. Ecco un riassunto:
* **[[http://wiki.openmoko.org/wiki/Download|OM2007.2]]**: distribuzione OpenMoko, seconda release del 2007. Basato su X e le GTK.
* **[[http://wiki.openmoko.org/wiki/Qtopia|Qtopia]]**: GUI per smartphone di Trolltech/Nokia, non usa X ma direttamente il framebuffer.
* **[[http://wiki.openmoko.org/wiki/ASU|ASU]]** (August Software Update): aggiornamento della distribuzione OpenMoko, agosto 2008. Include il porting di Qtopia su X.
Nell'ottimo articolo **[[http://www.vanille-media.de/site/index.php/2008/06/28/gtk-asu-fso-tmtla/|GTK, ASU, FSO? TMTLA!]]** vengono confrontate le varie distribuzioni e si parla anche della promettente distribuzione **FSO**.
Probabilmente la direzione giusta a breve/medio termine è **installare ASU**. Un buon compromesso immediato potrebbe essere un dual boot **2007.2** e **Qtopia**, con quest'ultimo installato sulla microSD. I primi esperimenti ovviamente li ho fatti con 2007.2.
==== Gestione pacchetti ====
Il gestore pacchetti è **''opkg''** (che sostituisce il vecchio ''ipkg''), i repository si configurano in **''/etc/opkg/''**, i comandi più utili sono:
opkg list_installed
opkg list
opkg install
In [[http://wiki.openmoko.org/wiki/Repositories|questa pagina]] sono elencati alcuni repository più o meno ufficiali. Interessante è l'**[[http://www.angstrom-distribution.org/|Angstrom]]** che contiene vari pacchetti (tra cui **mc**, **navit**, ...). Con la distrbuzione attualmente installata sul FreeRunner si deve [[http://www.angstrom-distribution.org/repo/|attingere]] dalla Angstrom **armv4t**, versione **2007.12**.
Per aggiungere una icona nel menu applicazioni si crea un nuovo file .desktop nella directory **''/usr/share/applications''**, poi si fa un restart del server X:
/etc/init.d/xserver-nodm restart
==== Sofware di navigazione e GPS ====
GPS e navigazione: queste le prime applicazioni che mi interessava sperimentare sul FreeRunner. Dopo le prime ore di uso si capisce chiaramente che **il software di sistema è decisamente immaturo** (OM2007.2); non è pensabile di usarlo quotidianamente per fare/ricevere telefonate o SMS. Questo mi ha preoccupato non poco, temendo che allo stato attuale ci fosse ben poco da sperimentare.
{{.:freerunner:freerunner_tangogps.png?150 |tangoGPS sul Neo FreeRunner}}
A livello applicativo la prima **sorpresa positiva** viene ta **[[http://www.tangogps.org/|tangoGPS]]**. Il software utilizza le mappe bitmap generate da OpenStreetMap, è in grado di fare il **pre-load** della zona interessata fino al livello di zoom desiderato. Durante l'uso **si comporta in modo fluido**, facilmente utilizzabile sia con lo stilo che con il dito: il primo programma che giustifica l'acquisto del FreeRunner! La versione per OpenMoko è scaricabile direttamente dal sito del progetto.
{{ .:freerunner:freerunner_navit.png?120|Navit}}
:-) **New 2009-02-02!** **[[http://www.navit-project.org/|Navit]]** invece è un software di navigazione basato su mappa vettoriale (sempre OpenStreetMap). Il vantaggio è quello di poter scaricare tutta l'Italia in pochi megabyte (attualmente l'Italia occupa circa 21 Mb). L'usabilità delle attuali versioni (CVS 1873) è paragonabile a quella di tangoGPS, conviene installare il [[http://wiki.openmoko.org/wiki/Navit|pacchetto precompilato per OpenMoko]] che contiene anche una patch che migliora notevolmente il panning della mappa (verificare che sia attiva l'opzione **''drag_bitmap="1"''** in ''navit.xml''). **Il programma si lascia usare**, sebbene con qualche spigolosità. La funzione di **routing** pare richiedere troppe risorse: appena si chiede di calcolare un percorso **il programma rallenta al punto tale da diventare inutilizzabile**. Speriamo che sia possibile ottimizzare l'algoritmo per renderlo compatibile con la CPU del Neo. Non ho provato ancora la funzione di **indicazioni vocali**, soprattutto perchè la sintesi vocale di **espeak** ancora non supporta i fonemi in italiano.
Prima di lanciare un programma di navigazione conviene **disabilitare lo screen saver** ed eventualmente **forzare il fast-charge** se l'adattatore da accendisigari non lo negozia automaticamente, questo è lo script che utilizzo su Om2008.9:
#!/bin/sh
# Start the GPS daemon if not already running.
if ! (ps uax | grep -v grep | grep -q /usr/sbin/gpsd); then
/etc/init.d/gpsd start
fi
# Force current limit to 500 mA.
# The FreeRunner draws only 100 mA from the car lighter.
echo 500 > /sys/class/i2c-adapter/i2c-0/0-0073/force_usb_limit_dangerous
# Disable screen saver.
xset s reset
xset s off
# Exec the program
exec /usr/bin/navit
===== Il boot loader U-Boot =====
L'aggiornamento del software (applicativi e kernel) avviene generalmente via **opkg**, che provvede ad aggiornare i pacchetti e cerca di mantenere le configurazioni e personalizzazioni effettuate.
Eventualmente è possibile reinstallare tutto il sistema (perdendo le personalizzazioni) riscrivendo l'immagine del **root filesystem** e l'immagine del **kernel** nella flash memory.
Esiste un altro pezzo di software nel Neo: il bootloader **[[http://wiki.openmoko.org/wiki/U-boot|U-Boot]]**. Questo svolge le operazioni che su un normale sistema GNU/Linux vengono eseguite da GRUB, inoltre ha alcune funzioni tipiche del BIOS di un PC. Per aggiornare U-Boot è necessario [[http://wiki.openmoko.org/wiki/Category:Flashing_Openmoko|flashare l'immagine]] nella memoria flash.
Se per avviare il Neo si tiene premuto il tasto AUX e si preme per pochi secondi il tasto Power si accede al menu di U-Boot.
Il menu U-Boot predefinito del FreeRunner consente di [[http://wiki.openmoko.org/wiki/Booting_from_SD|avviare da una installazione alternativa sulla microSD]]. Un motivo per flashare l'ultima versione di U-Boot è che la vecchia versione di U-Boot (1.3.2-moko12) richiede che il kernel alternativo risieda su una **partizione vfat** della microSD, mentre le versioni a partire dal 2008-07-23 accettno anche partizioni ext2/3.
Con il **Neo 1973** (predecessore del FreeRunner) aggiornare l'U-Boot potrebbe essere pericoloso: se l'operazione non va a buon fine il Neo potrebbe non avviarsi e potrebbe essere impossibile anche entrare nel menu U-Boot per ripetere l'operazione di flash. Il FreeRunner invece ha **due copie del boot loader**, una nella flash NAND e un'altra nella NOR flash, quindi dovrebbe essere sempre possibile [[http://wiki.openmoko.org/wiki/Booting_the_Neo_FreeRunner|avviare il FreeRunner]].
===== Flash di un nuovo U-Boot =====
Il FreeRunner contiene **due copie del boot loader** U-Boot; è possibile scegliere quale usare [[http://wiki.openmoko.org/wiki/Booting_the_Neo_FreeRunner|al momento del bootstrap]].
==== U-Boot in NOR flash ====
Accendere il FreeRunner tenendo premuto il tasto **AUX** e premendo il pulsante **POWER**, si accede al menu U-Boot **contenuto nella memoria NOR** (piccola memoria flash, contiene solo questo boot loader di emergenza):
U-Boot 1.3.2-moko12 (May 9 2008 - 10:28:48)
*** BOOOT MENU (NOR) ***
Boot
Boot from microSD (FAT+ext2)
Set console to USB
Set console to serial
Reboot
Power off
Press [AUX] to select, [POWER] to execute.
Le versioni di U-Boot antecedenti al 2008-07-23 non riescono a fare boot da una **partizione ext2 o ext3 della microSD** a causa di un [[http://docs.openmoko.org/trac/ticket/799|bug]]. Tuttavia per [[http://wiki.openmoko.org/wiki/Flashing_NOR|aggiornare il contenuto della memoria NOR]] bisogna utilizzare la [[http://wiki.openmoko.org/wiki/Debug_Board|debug board]].
==== U-Boot in NAND flash ====
Per accedere al U-Boot **contenuto nella memoria NAND** accendere il FreeRunner tenendo premuto il tasto **POWER** e premere contemporaneamente il tasto **AUX** per circa 7 secondi, compare il menu:
U-Boot 1.3.2-rc2-dirty-moko12 (Apr 9 2008 - 09:31:05)
*** BOOOT MENU (NAND) ***
Boot
Boot from microSD (FAT+ext2)
Set console to USB
Set console to serial
Set console to USB
Set console to serial
Reboot
Power off
Press [AUX] to select, [POWER] to execute.
A causa del bug visto sopra, volendo fare un'**installazione su microSD ed ext3**, bisogna aggiornare U-Boot.
**NOTA**: ext3 potrebbe causare un invecchiamento precoce della SD a causa delle continue riscritture del journal. Almeno in teoria le memorie SD dovrebbero supportare il //wear leveling// per attenuare il problema.
==== Flashare U-Boot ====
Per flashare l'U-Boot in NAND si deve ovviamente partire da quello in NOR. Si installa il pacchetto Debian **dfu-util** sul PC di appoggio, si scarica l'immagine (ad esempio **''[[http://downloads.openmoko.org/releases/Om2008.8-update/gta02v5_and_up-u-boot.bin|gta02v5_and_up-u-boot.bin]]''**) e si esegue questa procedura:
- Avviare il FreeRunner con il menu U-Boot NOR (tenere premuto AUX mentre si preme Power)
- Collegare il cavetto USB al PC
- Eseguire sul PC il comandodfu-util -a u-boot -R -D gta02v5_and_up-u-boot.bin
Per evitare problemi di permessi il comando è stato eseguito da utente root:
linux# dfu-util -a u-boot -R -D gta02v5_and_up-u-boot.bin
dfu-util - (C) 2007 by OpenMoko Inc.
This program is Free Software and has ABSOLUTELY NO WARRANTY
Opening USB Device 0x0000:0x0000...
Claiming USB DFU Runtime Interface...
Determining device status: state = appIDLE, status = 0
Device really in Runtime Mode, send DFU detach request...
Resetting USB...
Opening USB Device...
Found Runtime: [0x1d50:0x5119] devnum=8, cfg=0, intf=0, alt=1, name="u-boot"
Claiming USB DFU Interface...
Setting Alternate Setting ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Transfer Size = 0x1000
bytes_per_hash=4330
Starting download: [##################################################] finished!
state(2) = dfuIDLE, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
===== Flashing del kernel =====
Durante l'aggiornamento di oggi (2008-07-28) **qualcosa è andato storto**: il pacchetto **kernel-image-2.6.24** è stato aggiornato alla versione corrente, ma pare che contenga un errore. La procedura di installazione con ''opkg'' ha cancellato l'immagine presente nella flash, ma non ha scritto quella nuova. Di conseguenza **il boot successivo ha fallito**, rimanendo bloccato sullo splash screen. È stato necessario **rimuovere la batteria** per spengere il FreeRunner.
Avviando con il menu di U-Boot (premendo il **tasto Power** mentre si tiene premuto il **tasto AUX**) e scegliendo l'opzione **boot** si riesce a leggere i messaggi altrimenti coperti dallo splash screen, ho potuto notare che **l'immagine del kernel era corrotta** e falliva il checksum.
Bene (anzi, malissimo!!!) è l'occasione giusta per imparare a [[http://wiki.openmoko.org/wiki/Flashing_Openmoko|flashare l'immagine del kernel]] dal menu di U-Boot.
Anzitutto ho scaricato l'immagine del kernel corrente. **Attenzione**: bisogna che l'immagine corrisponda alla versione dei moduli installati nel root filesystem, nel mio caso dovevano essere gli ultimi disponibili visto che avevo eseguito un **''opkg update''** e un **''opkg upgrade''**. L'aggiornamento quotidiano dei pacchetti avviene dai seguenti URL:
http://buildhost.openmoko.org/daily-feed/all/Packages.gz
http://buildhost.openmoko.org/daily-feed/armv4t/Packages.gz
http://buildhost.openmoko.org/daily-feed/neo1973/Packages.gz
http://buildhost.openmoko.org/daily-feed/om-gta02/Packages.gz
Ho cercato il file **uImage-om-gta02-latest.bin** più recente in
http://buildhost.openmoko.org/daily/freerunner/
Sul PC ho anche installato il pacchetto Debian **dfu-util**. L'operazione di flash del nuovo kernel è semplice:
- Avviare il FreeRunner con il menu U-Boot (tenere premuto AUX mentre si preme Power)
- Collegare il cavetto USB al PC
- Eseguire sul PC il comando
linux:~# dfu-util -a kernel -R -D ./uImage-om-gta02-latest.bin
Questo è l'output del comando **''dfu-util''**:
dfu-util - (C) 2007 by OpenMoko Inc.
This program is Free Software and has ABSOLUTELY NO WARRANTY
Opening USB Device 0x0000:0x0000...
Claiming USB DFU Runtime Interface...
Determining device status: state = appIDLE, status = 0
Device really in Runtime Mode, send DFU detach request...
Resetting USB...
Opening USB Device...
Found Runtime: [0x1d50:0x5119] devnum=10, cfg=0, intf=0, alt=3, name="kernel"
Claiming USB DFU Interface...
Setting Alternate Setting ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Transfer Size = 0x1000
bytes_per_hash=35797
Starting download: [##################################################] finished!
state(2) = dfuIDLE, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
Al termine dell'operazione l'immagine del kernel è risultata corretta e il FreeRunner ha potuto fare nuovamente bootstrap.
===== Installazione ASU su microSD =====
**NOTA**: con questa stessa procedura è possibile installare la nuova versione di sviluppo **[[http://wiki.openmoko.org/wiki/Om2008.9_Update|2008.9]]**, erede di ASU. Le immagini di Om2008.9 sono disponibili per il **[[http://downloads.openmoko.org/releases/Om2008.9/|download]]**.
ASU è la **[[http://wiki.openmoko.org/index.php?title=ASU|August Software Update]]**, nuova versione di OpenMoko prevista per Agosto 2008. Si tratta del porting di Qtopia su X.
Si installa ASU su una microSD in modo da avere il dual boot con il sistema operativo originale (OM2007.2). Le pagina con le istruzioni complete è **[[http://wiki.openmoko.org/wiki/Booting_from_SD|Booting from SD]]**, qui ho fatto solo un riassunto.
Inserita una microSD nel PC e formattata secondo questo schema:
Device Boot Start End Blocks Id System
/dev/sdb1 1 5 10048+ 6 FAT16
/dev/sdb2 6 130 252000 83 Linux
/dev/sdb3 131 984 1721664 83 Linux
Copiato il **kernel** in sdb1 e scompattato il **root filesystem** in sdb2. La terza partizione verrà utilizzata come spazio dati e montato in ''/media/card/''.
wget http://buildhost.openmoko.org/daily/freerunner/200807/20080722/openmoko-qtopia-x11-image-om-gta02.tar.gz
mount /dev/sdb1 /media/sdb1
mount /dev/sdb2 /media/sdb2
cp /media/sdb2/boot/uImage-2.6.24 /dev/sdb1/uImage.bin
tar -C /media/sdb2 -xzvf openmoko-qtopia-x11-image-om-gta02.tar.gz
Se vogliamo che la terza partizione venga montata in **''/media/card/''**, si deve mettere in blacklist le prime due partizioni in **''/etc/udev/mount.blacklist''** (con il nome che viene assegnato al device dal kernel del Neo):
/dev/mmcblk0p1
/dev/mmcblk0p2
inoltre si modifica /etc/fstab:
/dev/mmcblk0p3 /media/card auto defaults,async,noatime,noauto 0 0
===== Backup e reinstallazione completa =====
Riassumendo i paragrafi precedenti, questo è un esempio di come si effettua il backup e la reinstallazione completa del FreeRunner (perdendo tutte le personalizzazioni).
**ATTENZIONE**: fare il dump di una partizione della memoria flash crea un file di dimensioni pari all'intera partizione, ben superiori alla dimensione delle immagini utilizzate per flashare inizialmente il device.
==== Backup con dfu-util ====
FIXME In teoria dovrebbe essere possibile fare il backup delle immagini contenute nella memoria flash con l'utility **''dfu-util''**. Tuttavia **esiste un grave [[http://docs.openmoko.org/trac/ticket/1843|bug]]** nell'upload dal device al PC (opzione **''%%-U%%''**), per cui **le immagini scaricate dal FreeRunner risultano corrotte** e non utilizzabili. Se ad esempio si flasha nuovamente sul FreeRunner l'immagine del kernel ottenuta con il procedimento seguente, si ottiene un checksum error durante la fase di boot e conseguente blocco.
Il bug è confermato con U-Boot 1.3.2-moko12 (2008-12-18) e dfu-util r4067.
Ad ogni modo, questa sarebbe la procedura (**da non usare a causa del bug!**):
- Entrare nel **menu U-Boot in NOR flash** (accendere il FreeRunner tenendo premuto il tasto **AUX** e premendo il pulsante **POWER**).
- Collegare il cavetto USB al PC.
- Sul PC eseguire i seguenti comandi:
# WARNING! OpenMoko bug #1843 produces bad images!
dfu-util -a kernel -R -U bkp_kernel.bin
dfu-util -a splash -R -U bkp_splash.bin
dfu-util -a u-boot -R -U bkp_u-boot.bin
dfu-util -a u-boot_env -R -U bkp_u-boot_env.bin
Per salvare l'**immagine del rootfs** (partizione //rootfs//) si potrebbe procedere in modo analogo, ma il file ottenuto avrebbe il difetto di occupare tutta la dimensione della flash (**250 Mb**), non il solo spazio effettivamente usato dai file.
Ecco la dimensione e il contenuto di ciascuna partizione:
^ splash.bin | 640 Kb | Dump dello splash-screen compresso gzip (480x640x16 frame buffer, RGB bits = 5:6:5, HWSWP = 1). |
^ kernel.bin | 8.0 Mb | Immagine del kernel (u-boot/PPCBoot image). |
^ u-boot.bin | 256 Kb |Il boot loader U-Boot. |
^ u-boot_env.bin | 256 Kb | La configurazione di U-Boot, editabile con envedit.pl. |
^ rootfs.jffs2 | 247 Mb | Immagine del root filesystem, di tipo jffs2. |
==== Backup con nanddump ====
Per aggirare il bug di **''dfu-util''**/**''U-Boot''** si può fare il dump della flash con **''nanddump''**, i requisiti per usare questo metodo sono:
* Accesso al FreeRunner via ssh.
* Installazione del pacchetto **mtd-utils** che fornisce ''nanddump''.
* Spazio libero sulla SD per contenere i dump.
Verifichiamo le partizioni sulla flash
cat /proc/mtd
dev: size erasesize name
mtd0: 00200000 00010000 "physmap-flash.0"
mtd1: 00040000 00020000 "u-boot"
mtd2: 00040000 00020000 "u-boot_env"
mtd3: 00800000 00020000 "kernel"
mtd4: 000a0000 00020000 "splash"
mtd5: 00040000 00020000 "factory"
mtd6: 0f6a0000 00020000 "rootfs"
effettuiamo il dump di un paio di esse:
nanddump --omitoob -f mtd1_u-boot.dump /dev/mtd1
nanddump --omitoob -f mtd3_kernel.dump /dev/mtd3
Omettiamo dal dump i byte out-of-band (OOB), che contengono informazioni di servizio (bad block marks, error correction codes).
Il file così ottenuto deve essere **identico** a quello usato durante il flashing iniziale, **a meno della dimensione**. Ecco come confrontare i due file solo per i primi byte:
cmp --bytes=1780096 Om2008.12-om-gta02.uImage.bin mtd3_kernel.dump
Il kernel dovrebbe essere disponibile anche come file **''/boot/uImage''** sul FreeRunner, ma nel mio caso differisce di 7 byte rispetto all'originale.
Il dump della partizione //rootfs// con questo metodo è sconsigliato, sia per per i motivi di dimensione visti sopra, sia perché il contenuto non è consistente: alcuni file e directory presenti sul FreeRunner non risultano quando si monta l'immagine via loop device (perché? FIXME).
Per effettuare il dump del rootfs vedere il metodo che segue.
==== Backup con mkfs.jffs2 ====
Come accennato, il dump della partizione flash crea un file pari alla dimensione della partizione. Per il root filesystem è particolarmente penalizzante sia per lo spazio occupato (250 Mb) sia per il tempo impiegato.
Ecco quindi una **procedura alternativa** per ottenere un'immagine jffs2 di backup, pronta per essere flashata. Il tutto si esegue da una shell del FreeRunner, l'immagine viene trasferita sul PC (192.168.0.200) via ssh:
opkg install mkfs-jffs2
mkdir /var/volatile/tmp/rootfs
mount -t jffs2 /dev/mtdblock6 /var/volatile/tmp/rootfs
mkfs.jffs2 -d /var/volatile/tmp/rootfs -e 128 --pad --no-cleanmarkers -x lzo \
| ssh root@192.168.0.200 'cat > rootfs.jffs2'
umount /var/volatile/tmp/rootfs
L'immagine jffs2 viene generata sul FreeRunner, per questo è necessario installare il pacchetto ''mkfs-jffs2''. La procedura impiega circa **20 minuti per 110 Mb**.
**Jffs2** è un filesystem journaled specifico per memorie [[wp>Memory_Technology_Device|flash MTD]]. Per **montare un'immagine jffs2** si può usare l'emulazione MTD su block device offerta dal kernel:
losetup /dev/loop0 Om2008.12-om-gta02.rootfs.jffs2
modprobe block2mtd block2mtd=/dev/loop0,131072
cat /proc/mtd
modprobe jffs2
modprobe mtdblock
mount -t jffs2 -o ro /dev/mtdblock0 /mnt
**NOTA1**: il FreeRunner ha **architettura little-endian** come i **processori x86**, su altre architettura è necessario convertire il file jffs2 prima di montarlo.
**NOTA2**: se si realizza uno **script** con i comandi sopra, considerare che i vari modprobe richiedono alcuni istanti prima di essere operativi, occorre inserire degli **sleep** opportuni.
**NOTA3**: un bug nel kernel Linux prima della versione 2.6.25 può provocare dei kernel panic montando un filesystem jffs2. Il crash è preceduto da errori del tipo:
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00fe6710: 0x7b2b instead
jffs2_scan_inode_node(): CRC failed on node at 0x0f5f2bf4: Read 0xb4f0ed85, calculated 0xc9878958
==== Flashing delle nuove immagini ====
La procedura effettua il trasferimento tramite cavetto USB con l'utility **''dfu-util''**.
Entrare nel **menu U-Boot** con uno dei metodi visti sopra ed eseguire questi comandi per **installare le nuove versioni** (tra un upload e l'altro il FreeRunner potrebbe spengersi):
dfu-util -a u-boot -R -D gta02v5_and_up-u-boot.bin
dfu-util -a kernel -R -D Om2008.12-om-gta02.uImage.bin
dfu-util -a rootfs -R -D Om2008.12-om-gta02.rootfs.jffs2
dfu-util -a splash -D Om2008.9.splash.gz
**NOTA:** L'immagine 2008.12 utilizza i repository [[http://downloads.openmoko.org/repository/Om2008.8/]], vedi ''/etc/opkg/*.conf''.
===== PyPPP: connessione internet via GPRS =====
{{.:freerunner:freerunner_pyppp.png?150 |PyPPP}}
Per testare le possibilità di programmazione sul FreeRunner ho voluto scrivere un piccolo **programma che gestisce le connessioni PPP**. Essendo scritto in Python GTK, il nome è ovviamente **PyPPP**. Le [[http://wiki.openmoko.org/wiki/GPRS|istruzioni su come usare la connessione GPRS]] sono un po' confuse, inoltre mi sono scontrato con uno strano problema relativo all'inizializzazione del modem.
Considerato che è il mio secondo programma in Python (il primo in cui ho usato le GTK) il risultato mi soddisfa abbastanza. La home page del progetto è su **[[http://projects.openmoko.org/projects/pyppp/|projects.openmoko.org]]** dove potete trovare i sorgenti e il supporto. Per l'installazione potete usare lo script **''install.sh''** che provvede anche a installare un'icona per il desktop. Si può utilizzare sia con lo stilo che con il dito.
Per far funzionare PyPPP bisogna prima configurare la connessione PPP; io ho una connessione con Wind ed ho usato i file mostrati in questa pagina: **[[http://wiki.openmoko.org/wiki/Wind_pppd_scripts|Wind pppd scripts]]**.
Gli script consentono di avviare e fermare la connessione rispettivamente con i classici comandi **''pon''** e **''poff''**. Prima di eseguire ''pon'' bisogna fermare il demone **''gsmd''** e resettare opportunamente il modem, dopo aver terminato la connessione bisogna riavviare ''gsmd''. A tutto questo provvede ovviamente PyPPP.
Per eseguire PyPPP con **Om2008.9** è sufficiente installare il pacchetto **''python-pygtk''** e **''python-subprocess''**.
Con **Om2007.2** risolvere le dipendenze non è stato semplice perché i repository attualmente mi paiono un po' confusi. Ad ogni modo l'elenco dei pacchetti che ho installato è il seguente:
* **python-core_2.5.2-ml0_armv4t.ipk**
* **python-pycairo_1.4.0-ml1_armv4t.ipk**
* **python-pygobject_2.12.3-r3_armv4t.ipk**
* **python-pygobject_2.14.2-r0_armv4t.ipk**
* **python-pygtk_2.10.4-ml8_armv4t.ipk**
* **python-shell_2.5.2-ml0_armv4t.ipk**
e li ho scaricati da **[[http://buildhost.automated.it/OM2007.2/packages/armv4t/|buildhost.automated.it]]** e da **[[http://www.angstrom-distribution.org/feeds/2008/ipk/glibc/armv4t/python/python-pygobject_2.14.2-r0_armv4t.ipk|www.angstrom-distribution.org]]**.
:-( **WARNING:** It seems that there is **a problem after the ppp connection is terminated**. Despite the gsmd daemon is restarted I cannot send SMS messages. Another user reported that he must restart the Xserver to register again with the telco operator.
===== Installazione tastiera QWERTY =====
Con la distribuzione **Om2008.9** conviene installare il pacchetto **''illume-config''**, fornisce una tastiera multifunzione finger/stylus. Per essere sicuri che la tastiera di Qtopia sia disabilitata aggiungere in **''/etc/X11/Xsession.d/89qtopia''** la riga:
export QTOPIA_NO_VIRTUAL_KEYBOARD=1
I file di configurazione della tastiera sono in ''/usr/lib/enlightenment/modules/illume/keyboards''. Con l'installazione del pacchetto compare la scritta **qwerty** in alto a sinistra, per attivare o disattivare la tastiera. Nel //top shelf// compare anche l'icona chiave inglese per accedere al menu Configuration di **[[http://wiki.openmoko.org/wiki/Illume|illume]]**.
Sfortunatamente con **Om2007.2** non è stata ancora implementata la possibilità di passare dalla tastiera multi-tap (usabile con il dito) ad una QWERTY (usabile solo con lo stilo). Preferendo quella completa ho seguito le istruzioni per installare la **[[http://wiki.openmoko.org/wiki/Switching_Keyboards#Matchbox_keyboard|Matchbox keyboard]]**. In pratica si scarica l'archivio **[[http://www.ginguppin.de/files/keyboard-ipk.tar.bz2|keyboard-ipk.tar.bz2]]**, si disinstalla (con **''opkg remove -force-depends''**) il pacchetto originale **multitap-pad** e si installano i file .ipkg contenuti nell'archivio.
Se si desidera un'icona nel systray per attivare e nascondere la tastiera basta aggiungere **keyboard** all'elenco degli applet nel file **''/etc/matchbox/session''**.
===== Troubles =====
Unfortunately I got several troubles using the FreeRunner. The overall impression is that the device is not so reliable; most of the time is surely a software issue, but sometimes also the hardware seems not to be rock solid. Here are some of the issues that I catched in the first week of use.
* **Read/write errors on the microSD**. I'm a little paranoid: when I copy some amounts of data I always include an md5sum of the files. I catched at least two **md5sum errors** that were not detected by the kernel.
* **System freeze in high temperature environment**. I was measuring the GPS signal strenght under an hot sun, when the device frozen; it was necessary to remove the battery to reboot. The boot loader verified the kernel checksum OK, but the device hangs at the **''Starting kernel''** message. After an hour and cooling down the Neo in the shadow, the boot succeeded.
* **Missing UTF-8 characters in openmoko-terminal2**. It seems that **locales** package does not exist. I tried to install **glibc-charmap-utf-8** and **localedef**, but I cannot build locales because there is not source definitions (''/usr/share/i18n/locales'').
* **Touchscreen misaligned when swap orientation**. This [[http://docs.openmoko.org/trac/ticket/1244|problem]] is solved upgrading the **xserver-kdrive-glamo** package (2008-08-08).
* **Error saving screenshot: Value for PNG text chunk CREATOR cannot be converted to ISO-8859-1 encoding**. The program **''gpe-scap''** fails to open ''/lib/libc.so'', make a link: ln -s libc.so.6 /lib/libc.so
===== Specifiche del Neo FreeRunner =====
Alcune [[http://wiki.openmoko.org/wiki/Neo_FreeRunner_GTA02_Hardware|componenti hardware]] del Neo FreeRunner:
* CPU Samsung S3C2410 at 400 Mhz
* 256 Mb di [[wpit>Memoria_flash#NAND_FLASH|NAND Flash]] per il boot loader e il root filesystem.
* 16 Mbit di [[wpit>Memoria_flash#NOR_FLASH|NOR Flash]] per la copia di sicurezza del boot loader.
* 128 Mb di SDRAM
* Schermo LCD 480x640, 2.8" diagonale
* GSM e GPRS
* Vibrazione
* USB host version 1.1
* USB device
* WiFi 802.11b/g
* Bluetooth
* GPS
* Slot microSD