Restauration d'uboot avec OpenOCD et une carte Buspirate


Je me suis procuré récemment un Pogoplug (la version 2) dans le but d'y installer OpenWRT.

Après plusieurs tests, des bad blocks au boot d'Openwrt, de prise de main sur uboot, et du lancement de la commande "nand scrub", je me suis retrouvé avec une brique. Plus de sortie sur le port rs232, plus de led.

A lire plusieurs documentations sur l'installation d'uboot sur un dockstar avec une carte Buspirate et OpenOCD, j'ai décidé de l'acheter pour tenter de réparer cette brique rose.


1) OpenOCD :

On récupère la version trunk sur le git du projet, on compile et on installe :
$ git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd
$ cd openocd
$ ./bootstrap
$ ./configure --enable-maintainer-mode --enable-buspirate
$ make
$ sudo make install
$ openocd -v
Open On-Chip Debugger 0.5.0-dev-00873-g289cece-dirty (2011-05-09-22:24)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.berlios.de/doc/doxygen/bugs.html




2) Mise a jour Buspirate :


/!\ J'utilise la commande pirate-loader_lnx seulement compatible avec les bootloaders 4+ /!\

J'ai testé avec les firmwares 5.x, impossible d'avoir un mode JTAG fonctionnel (j'ai lu qu'il était disponible dans les firmwares -extras, sans succès). Je suis donc revenu sur un firmware 4.5.

On rapatrie le svn du projet :
$ svn checkout http://the-bus-pirate.googlecode.com/svn/trunk/ buspirate

On raccorde la carte Buspirate et on la passe en mode BOOTLOADER (vous pouvez aussi court-circuiter les pins PGC et PGD) :
N'oubliez pas de libérer votre port pour la suite.
$ picocom -b 115200 /dev/ttyUSB0
picocom v1.4

port is        : /dev/ttyUSB0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
escape is      : C-a
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : ascii_xfr -s -v -l10
receive_cmd is : rz -vv

Terminal ready

HiZ>$
BOOTLOADER

On se rend dans le dossier v4-nightly, et on lance la commande suivante pour flasher la carte :
$ cd buspirate/firmware/v4-nightly/
$ chmod +x pirate-loader_lnx
$ ./pirate-loader_lnx --dev=/dev/ttyUSB0 --hex=BPv3\&v2go/BPv3-Firmware-v4.5.hex

Un reboot de la carte et l'on s'y reconnecte pour vérifier :
$ picocom -b 115200 /dev/ttyUSB0
HiZ>i
Bus Pirate v3
Firmware v4.5 Bootloader v4.4
DEVID:0x0447 REVID:0x3043 (B5)
http://dangerousprototypes.com
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. JTAG
7. RAW2WIRE
8. RAW3WIRE
9. PC KEYBOARD
10. LCD



3) Raccordement JTAG et RS232 :




4) Configuration OpenOCD :

Fichier buspirate.cfg :
interface buspirate
buspirate_port /dev/ttyUSB0
buspirate_speed normal ; # or fast
buspirate_vreg 0
buspirate_mode open-drain
buspirate_pullup 0
reset_config srst_only

Modification du fichier sheevaplug.cfg :
-source [find interface/sheevaplug.cfg]
+source [find interface/buspirate.cfg]

+jtag_khz 500
+jtag_nsrst_delay 500
 
-    -work-area-phys 0x10000000 \
+    -work-area-phys 0x100000 \


5
) Installation uboot :


Mettre sous tension tout ce petit monde, puis lancer OpenOCD :
$ openocd -f sheevaplug.cfg
Open On-Chip Debugger 0.5.0-dev-00873-g289cece-dirty (2011-05-09-22:24)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.berlios.de/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
trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain
adapter_nsrst_delay: 200
jtag_ntrst_delay: 200
500 kHz
adapter_nsrst_delay: 500
dcc downloads are enabled
Warn : use 'feroceon.cpu' as target identifier, not '0'
sheevaplug_load_uboot
Info : Buspirate Interface ready!
Info : Want to set speed to 500kHz, but not implemented yet
Error: Translation from jtag_speed to khz not implemented
Info : adapter-specific clock speed value 500
Info : JTAG tap: feroceon.cpu tap/device found: 0x20a023d3 (mfg: 0x1e9, part: 0x0a02, ver: 0x2)
Info : Embedded ICE version 0
Info : feroceon.cpu: hardware has 1 breakpoint/watchpoint unit
Info : accepting 'telnet' connection from 4444

Notre CPU est reconnu (device found: 0x20a023d3) et nous pouvons nous connecter sur le port 4444 d'OpenOCD :
$ telnet localhost 4444

On arrête le processeur :
-> Maintenir le bouton reset appuyé.
-> Lancer la commande halt
-> Relâcher le bouton reset.

Vous devez normalement obtenir cette sortie (l'important est le statut "ARM state") :
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x000000d3 pc: 0xffff0000
MMU: disabled, D-Cache: disabled, I-Cache: disabled

Si vous obtenez la sortie ci-dessous, recommencer :
target state: halted
target halted in Thumb state due to debug-request, current mode: Supervisor
cpsr: 0x200000f3 pc: 0xffff0a8a
MMU: enabled, D-Cache: enabled, I-Cache: enabled

On initialise avec la commande :
>sheevaplug_init

On vérifie que la nand est bien reconnue :
> nand probe 0  
NAND flash device 'NAND 128MiB 3.3V 8-bit (Hynix)' found

Si vous obtenez cette sortie, recommencez du début :
> nand probe 0
unknown NAND flash device found, manufacturer id: 0x00 device id: 0x00
in procedure 'nand'

On efface les premiers 512ko :
> nand erase 0 0x0 0xa0000
erased blocks 0 to 5 on NAND flash device #0 'NAND 128MiB 3.3V 8-bit'

Puis on écrit sur la nand le fichier uboot :
nand write 0 uboot.j.kwb 0 oob_softecc_kw

Cette commande dure environ 15 minutes, et le pogoplug reboot automatiquement sur l'uboot fraîchement flashé.
ċ
buspirate.cfg
(1k)
Nicolas Le Falher,
27 juil. 2012 à 16:50
ċ
sheevaplug.cfg
(5k)
Nicolas Le Falher,
27 juil. 2012 à 16:50
ċ
uboot.mtd0.kwb-2011.12-pogo_e02-L2Coff
(512k)
Nicolas Le Falher,
27 juil. 2012 à 16:49
Comments