FreeRunner GTA-02 FSO/Debian et mode USB host

Après de nombreux essais de différents firmwares pour le FreeRunner, je me suis finalement tourné vers FSO (FreeSmartphone.Org) qui reprend pas mal d’éléments de configuration de Debian/OpenWrt. Les images sont disponibles ici : http://downloads.freesmartphone.org/fso-stable/milestone4.1/.

Tout ceci se flash exactement comme les autres firmwares et après reboot on accède au FreeRunner via USB. Par défaut, son IP est 192.168.0.202. Comme mes interfaces réseau sur ma machine de travail sont bridgées, j’ajoute simplement usb0 au bridge :
% brctl addif br0 usb0
% ifconfig usb0 up
% ping 192.168.0.202
PING 192.168.0.202 (192.168.0.202) 56(84) bytes of data.
64 bytes from 192.168.0.202: icmp_seq=1 ttl=64 time=216 ms
64 bytes from 192.168.0.202: icmp_seq=2 ttl=64 time=29.9 ms
^C
Ce qui me permet un accès SSH sur le FreeRunner (root, pas de mot de passe). Ainsi, je peux configurer le Wifi en ajoutant simplement ce qu’il faut dans /etc/network/interface comme sur une Debian :
iface eth0 inet dhcp
        wireless-mode Managed
        wireless-essid dalefwrt
        wpa-conf /etc/wpa_supplicant/openwrthome.conf
Ainsi qu’un /etc/wpa_supplicant/openwrthome.conf qui va bien :
network={
        ssid= »dalefwrt »
        psk= »laphrasedepass »
}
Un petit ifup eth0 et le tour est joué. Plus besoin de l’interface usb0, ifdown usb0 donc. Le Freerunner est accessible en SSH par Wifi à condition de modifier la configuration de dropbear qui n’écoute que sur l’IP de l’interface usb0 par défaut. On édite /etc/default/dropbear pour avoir ceci :
DROPBEAR_PORT=22
Comme le port USB n’est plus vraiment utile en mode device autant le passer en mode host pour pouvoir utiliser des périphériques USB avec le FreeRunner. Ceci se fait très simplement avec :
echo host > /sys/devices/platform/s3c2410-ohci/usb_mode
On repasse en mode device avec :
echo device > /sys/devices/platform/s3c2410-ohci/usb_mode
Par défaut le FreeRunner est en mode device et utilise l’USB comme source de courant pour se recharger. En mode host il lui faut normalement alimenter les périphériques USB. Le GTA-02, aka FreeRunner, peut basculer d’un mode à l’autre de manière logicielle. Avec ceci :
echo 1 > /sys/devices/platform/neo1973-pm-host.0/hostmode
le FreeRunner alimente le port USB avec un courant de 500mA, exactement comme une machine standard. Des résistances de rappel de 15K à la masse sont activées sur les lignes D+ et D- de l’USB. Malheureusement, ceci consomme énormément de courant et vide rapidement la batterie.

Avec :
echo 0 > /sys/devices/platform/neo1973-pm-host.0/hostmode
on repasse en mode standard. Les résistances sont désactivées et la charge depuis l’USB est réactivé. Notez que ceci est indépendant du mode USB device/host. Et justement, c’est ce qui permet d’utiliser le courant fourni par un hub USB pour charger le FreeRunner alors qu’il est en mode host.

Attention, tout les hub USB fournissent du courant aux périphériques mais pas nécessairement à l’hôte. Le plus simple est d’avoir quelques hub sous la main et de faire les essais. Une autre solution consiste, tout simplement à récupérer du +5V en sortie du hub et de le connecter au Vcc du connecteur côté hôte. Enfin, une autre solution est de jeter un oeil au hub. Souvent, une simple diode est utilisée pour bloquer le courant du hub vers l’hôte.

Regardez http://wiki.openmoko.org/wiki/Neo1973_USB_host et http://wiki.openmoko.org/wiki/Specialized_USB_cables pour plus d’informations.

De mon côté j’ai la chance de disposer d’un pauvre hub sans marque acheté en supermarché, mais qui alimente effectivement l’hôte en courant. Il m’a donc suffit de bricoler un connecteur me permettant de brancher le hub sur du le connecteur mini type B jack du FreeRuner.

On trouve ce type de câble (mini type B plug vers type A jack) sur le net (eBay). J’ai opté pour une autre solution :
un câble mini type B plug vers type A plug
un double déporteur type A jack provenant d’un PC que j’ai ponté avec des cavaliers
le connecteur type A plug du hub

Je peux ainsi alimenter le FreeRunner tout en utilisant le mode host et le hub USB pour y connecter plein de choses :

# lsusb
Bus 001 Device 001: ID 0000:0000
Bus 001 Device 082: ID 05e3:0606 Genesys Logic, Inc.
Bus 001 Device 085: ID 0951:1603 Kingston Technology
Bus 001 Device 086: ID 0718:0286 Imation Corp.
Bus 001 Device 087: ID 9710:7830
Bus 001 Device 088: ID 4348:5523
Tout ne fonctionne pas par défaut faute de drivers. Il faut installer les modules adéquates sous forme de paquets avec opkg (qui est déjà configuré). Exemple :
# opkg update
# opkg install kernel-module-cp2101 kernel-module-pl2303 kernel-module-ftdi-sio
[…]
Configuring kernel-module-cp2101
Configuring kernel-module-pl2303
Configuring kernel-module-ftdi-sio
# dmesg
[…]
ftdi_sio 1-2.3:1.0: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT232RL
usb 1-2.3: FTDI USB Serial Device converter now attached to ttyUSB0
Un convertisseur USB/série permet d’étendre les sorties du FreeRunner. Il suffit de lui ajouter un AVR (Attiny2313) pour disposer de plein de GPIO. Le FreeRunner dispose d’un GPS, d’un modem GSM/GPRS, du Wifi, du BlueTooth, d’un écran, d’un périphérique audio… En utilisant le port USB en mode host on lui offre tout ce qui manque. Je ne parle plus de téléphone mais d’un système embarqué autonome accessible en IP et GSM/GPRS. Imaginez deux secondes ce qu’il devient possible de faire si je dis, par exemple, «domotique».

Idem pour la robotique. Le FreeRunner peut devenir le cœur d’un drone très efficace…

Androïd sur Neo Freerunner

Après avoir essayé plusieurs «distributions» pour le Neo et n’ayant pas été vraiment satisfait du résultat, j’ai finalement décidé de regarder si, à tout hasard, il n’existerait pas un portage d’Androïd sur le Neo… et c’est bien le cas !

Ceci est principalement le résultat du travail de Sean McNeil qui a produit et maintient des images rootfs et kernel pour le Neo. Vous pouvez récupérer ces dernières sur http://people.openmoko.org/sean_mcneil/. Puis flasher le Neo avec :
dfu-util -a rootfs -R -D androidfs.jffs2
dfu-util -a kernel -R -D uImage-android
Vous trouverez également un binaire pour GNU/Linux : adb, le serveur de debug permettant de «contacter» le Neo. En effet, l’interface USB du Neo est configurée en CDC Ethernet Device avec une IP 192.168.0.202. Voici qui peut poser problème dans une configuration LAN classique 192.168.0.1/24. Il faut alors jouer un peu du bridge et revoir sa configuration réseau.

Personnellement j’ai déjà un bridge installé regroupant eth0, tap10 et tap11 (pour les machines virtuelles KVM). Il suffit alors d’ajouter usb0 :
% sudo brctl addif br0 usb0
% sudo ifconfig usb0 up
% sudo brctl showstp br0
[…]
usb0 (0)
port id 0000 state forwarding
designated root 8000.0019662eb213 path cost 100
designated bridge 8000.0019662eb213 message age timer 0.00
designated port 8004 forward delay timer 0.00
designated cost 0 hold timer 0.79
flags

% ping 192.168.0.202
PING 192.168.0.202 (192.168.0.202) 56(84) bytes of data.
64 bytes from 192.168.0.202: icmp_seq=1 ttl=64 time=0.663 ms
64 bytes from 192.168.0.202: icmp_seq=2 ttl=64 time=0.563 ms
^C
Obtenir un shell sur le Neo est ensuite chose facile :
ADBHOST=192.168.0.202 ./adb shell
D’autres informations sont présentes sur :

http://wiki.openmoko.org/wiki/User:Seanmcneil3 et http://wiki.openmoko.org/wiki/Android

Reflashage du Freerunner GTA02

Hé oui, lorsqu’on se précipite pour mettre à jour un système embarqué il arrive parfois des bricoles. Ici, j’ai mis à jour Openmoko dès chargement de la batterie. Voyant que tout allait bien, j’ai basculé sur testing et… c’était mal.

Résultat, reflashage du rootfs et du noyau depuis le bootloader uBoot. procédure :

Installation des outils :
% sudo apt-get instal dfu-utils
Récupération des images sur http://downloads.openmoko.org/releases/Om2008.9/.

Comme expliqué sur http://wiki.openmoko.org/wiki/Flashing_the_Neo_FreeRunner procéder comme suit.

Démarrage du système sur la flash NOR (appuyer sur le bouton AUX jusqu’au menu uBoot, maintenir, appuyer sur power). Le menu du booloader NOR ne reste actif que 30 secondes. Si l’écran devient noir avant que vous ayez eu le temps de taper les commande, recommencez.

Brancher le câble USB.

Reflashage du noyau :
% dfu-util -a kernel -R -D Om2008.9-gta02-20080916.uImage.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=58, 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=37894
Starting download: [##################################################] finished!
state(2) = dfuIDLE, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
Flashage rootfs :
% dfu-util -a rootfs -R -D Om2008.9-gta02-20080916.rootfs.jffs2
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=60, cfg=0, intf=0, alt=6, name= »rootfs »
Claiming USB DFU Interface…
Setting Alternate Setting …
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Transfer Size = 0x1000
bytes_per_hash=1433927
Starting download: [##################################################] finished!
state(2) = dfuIDLE, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
Rebooter depuis la mémoire NAND (éteindre le système, appuyer sur power, maintenir et appuyer sur AUX)

Nouveau jouet : Freerunner GTA02

Aller à l’EuroBSDcon est dangeureux. On y va tranquillement avec plein de BSD dans la tête et là, bam ! On tombe sur Wim, son stand de tshirt, de livres et… tiens ?! Un téléphone sur lequel on fantasme depuis longtemps. Pire ! Il est vendu moins cher que par l’importateur français ! Comment résister ?!

Plus d’info à suivre. En attendant, quelques photos (oui c’est flou, mais quand on est réveillé par les démons d’OpenMoko, du hack et de l’embarqué à 5h30 du matin, difficile de faire des photos nettes) :