Débriquer un Nabaztag/tag

En jouant avec un firmware custom pour le Nabaztag/tag, j’ai fait une erreur et j’ai rendu deux de mes lapins inutilisables. Heureusement, il est possible de sauver un lapin, même après avoir flashé un mauvais firmware.

Ce qui va suivre, je vous le dit tout de suite, demande un peu de connaissances du monde Linux et un peu de matériel. Mais je suppose que si vous avez briqué un Nabaztag/tah, vous avez les connaissances en question. C’est velu, rempli de commandes, et il n’y a pas beaucoup d’images…

Du Nabaztag Porn

Il faut un peu de matériel pour reflasher le Nabaztag/tag. Dans mon cas, j’ai utilisé un Bus Pirate (une petite carte à tout faire) reliée en USB à un Raspberry Pi (ça doit marcher depuis un Mac) et évidemment au lapin. Pour ouvrir ce dernier, il faut un tournevis avec une tête triangulaire, pour enlever les quatre vis sous sa base. Le connecteur JTAG est en haut à gauche quand on regarde le lapin de face.

Avant de commencer, il faut un Bus Pirate avec un firmware compatible OpenOCD (6.1 ou 7), c’est normalement le cas si vous n’avez pas acheté le vôtre il y a trop longtemps.

La connexion entre le Bus Pirate et le lapin s’effectue de cette façon, je compte les broches du connecteur en partant du haut.

1 -> 3,3 V -> 3,3 V sur le Bus Pirate.
2 -> masse -> GND sur le Bus Pirate.
3 -> nTRST -> pas branché.
4 -> TDI -> MOSI sur le Bus Pirate.
5 -> TMS -> CS sur le Bus Pirate.
6 -> TCK -> CLK sur le Bus Pirate.
7 -> TDO -> MISO sur le Bus Pirate.
8 -> RESETN -> AUX sur le Bus Pirate.

Le connecteur JTAG en haut à gauche


Le connecteur du Bus Pirate

Pour la partie logicielle, j’ai essentiellement utilisé le travail de RedoX (merci à lui).

Première étape, installer le nécessaire sur le Raspberry Pi (à jour, mais je vous laisse gérer ça).

wget http://wk.redox.ws/_media/dev/nab/v2/jtag/openocd-0.8.0.tar.gz
wget http://wk.redox.ws/_media/dev/nab/v2/jtag/openocd_0.8.0_oki.patch.gz
sudo apt-get install libtool autoconf automake libusb-1.0-0-dev
gzip -d openocd_0.8.0_oki.patch.gz
tar xzvf ./openocd-0.8.0.tar.gz
cd openocd-0.8.0/
patch -p1 < ../openocd_0.8.0_oki.patch autoreconf -fi ./configure make sudo make install

Seconde étape, les fichiers nécessaires pour le flash lui-même.

wget http://wk.redox.ws/_media/dev/nab/v2/jtag/openocd_nab.tar.gz
tar xzvf ./openocd_nab.tar.gz
cd openocd_nab

Il faut modifier le fichier nabaztagv2.cfg pour qu'il ressemble à ça.

source [find interface/buspirate.cfg]

interface buspirate
buspirate_port /dev/ttyUSB0
buspirate_speed normal

# increase working area to 16KB
set WORKAREASIZE 0x4000

source [find target/ml67q4051.cfg]

Maintenant, vous pouvez lancer le programme.

openocd -f nabaztagv2.cfg

Si vous avez fait les branchements correctement et que le lapin est alimenté, ça devrait se lancer sans erreurs, avec un truc qui ressemble à ça.

Open On-Chip Debugger 0.8.0 (2017-09-03-01:58)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Warn : Adapter driver 'buspirate' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
srst_only separate srst_gates_jtag srst_open_drain connect_deassert_srst
Warn : Interface already configured, ignoring
adapter_nsrst_delay: 200
jtag_ntrst_delay: 200
trst_and_srst separate srst_nogate trst_push_pull srst_push_pull connect_assert_srst
force hard breakpoints
dcc downloads are enabled
fast memory access is enabled
Info : Buspirate Interface ready!
Info : This adapter doesn't support configurable speed
Info : JTAG tap: ml67q4051.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3)
Info : Embedded ICE version 1
Info : ml67q4051.cpu: hardware has 2 breakpoint/watchpoint units

Sauver le firmware

Pour commencer, j'ai branché un lapin fonctionnel, avec un firmware correct. Il faut évidemment l'alimenter. Dans une seconde session, il faut lancer un programme de debug.

arm-none-eabi-gdb

Ensuite, se connecter au lapin, le bloquer et sauver le firmware.

tar ext :3333
mon reset run
mon reset init
dump binary memory dump.bin 0x08000000 0x08020000

Ca prend quelques minutes dans le pire des cas, avec un fichier dump.bin dans le dossier courant. Il doit faire 128 ko.

Ecrire le firmware

Faites les mêmes branchements sur le lapin à sauver (et les mêmes commandes pour se connecter). Dans le logiciel de debug, seule la dernière ligne change.

mon flash write_image erase ./dump.bin 0x08000000

Dans mon cas (avec les bons branchements, je m'étais trompé à la base), ça a réécrit proprement le firmware et sauvé mes lapins. L'écriture peut prendre quelques minutes, c'est normal. Le programme affiche quelques erreurs, mais a priori sans conséquences.

Enfin, il suffit de taper cette commande pour relancer le lapin.

mon reset run

Et voilà, un lapin sauvé.