Introduction

Le but de la programmation de la clé RZUSBstick est d’utiliser le firmware killerbee pour pouvoir sniffer un réseau ZigBee avec wireshark.
Et cela avec au choix l’interface Bus Pirate ou une interface ftdi Amontec JTAGkey.

Installation d’OpenOCD

Il faut installer la version 0.9.0 ou supérieure d’OpenOCD contenant le support pour l’Atmel AT90USB128.

Compilation pour mes 2 interfaces :

cd openocd-code
./configure --prefix=/opt/openocd-code --enable-ftdi --enable-buspirate
make
sudo make install

Pins du JTAG sur la clé usb

Voici l’emplacement du connecteur JTAG sur la clé (Pin 1 en rouge)
Emplacement JTAG
Et voici l’emplacement des pins sur ce connecteur
Schema JTAG

Configuration pour l’interface Bus Pirate

Dans cet exemple mon interface utilise le firmware 6.1.
Pour l’interface Bus Pirate je me suis fait le fichier openocd_bp.cfg suivant :

# for avr
    set  _CHIPNAME avr
    set  _ENDIAN little
# jtag speed
#
# Buspirate with OpenOCD support
#
# http://dangerousprototypes.com/bus-pirate-manual/
#

interface buspirate

# you need to specify port on which BP lives
buspirate_port /dev/ttyUSB0

# communication speed setting
buspirate_speed fast; #normal ;# or fast

# voltage regulator Enabled = 1 Disabled = 0
#buspirate_vreg 0

# pin mode normal or open-drain
#buspirate_mode normal

# pullup state Enabled = 1 Disabled = 0
#buspirate_pullup 0

# this depends on the cable, you are safe with this option
reset_config srst_only

#adapter_khz 4500
reset_config  srst_only
adapter_nsrst_delay 100
#jtag scan chain
if { [info exists CPUTAPID ] } {
    set _CPUTAPID $CPUTAPID
} else {
    set _CPUTAPID 0x4978203F
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
set _TARGETNAME [format "s.cpu" $_CHIPNAME]
target create $_TARGETNAME avr -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x20000000  -work-area-size 16384 -work-area-backup 0
flash bank avr1.flash avr 0 0 0 0 $_TARGETNAME

#avr_program.cfg:
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666
init
reset init
verify_ircapture disable
halt
wait_halt
poll
#avr mass_erase 0
flash probe 0
flash write_image erase /home/esver/Perso/Zigbee/killerbee-read-only/killerbee/firmware/kb-rzusbstick-001.hex 
reset run
shutdown

J’ai connecté le jtag de ma clé en suivant les connexion suivantes :
Jtag Bus Pirate
Les pins sont donc reliées comme ceci :
Clé <=> Bus Pirate
GND <=> GND
TCK <=> CLK
TDO <=> MISO
TMS <=> CS
TDI <=> MOSI
SRST<=> AUX

J’ai ensuite lancé la commande pour programmer mon composant :

/opt/openocd-code/bin/openocd -f openocd_bp.cfg

Et voilà une clé programmée !

Configuration pour l’interface ftdi Amontec JTAGkey2 (plus rapide que la Bus Pirate)

Pour l’interface ftdi je me suis fait le fichier openocd_ftdi.cfg suivant :

# for avr
    set  _CHIPNAME avr
    set  _ENDIAN little
# jtag speed
interface ftdi
ftdi_device_desc "Amontec JTAGkey-2"
ftdi_vid_pid 0x0403 0xcff8

ftdi_layout_init 0x0c08 0x0f1b
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800

adapter_khz 4500
reset_config  srst_only
adapter_nsrst_delay 100
#jtag scan chain
if { [info exists CPUTAPID ] } {
    set _CPUTAPID $CPUTAPID
} else {
    set _CPUTAPID 0x4978203F
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
set _TARGETNAME [format "s.cpu" $_CHIPNAME]
target create $_TARGETNAME avr -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x20000000  -work-area-size 16384 -work-area-backup 0
flash bank avr1.flash avr 0 0 0 0 $_TARGETNAME

#avr_program.cfg:
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666
init
reset init
verify_ircapture disable
halt
wait_halt
poll
#avr mass_erase 0
flash probe 0
flash write_image erase /home/esver/Perso/Zigbee/killerbee-read-only/killerbee/firmware/kb-rzusbstick-001.hex 
reset run
shutdown

Le pinout de l’interface est disponible ici.
Les pins sont donc reliées comme ceci :
Clé <=> JTAG
VTref<=> VREF(1)
GND <=> GND(20)
TCK <=> TCK
TDO <=> TDO
TMS <=> TMS
TDI <=> TDI
SRST<=> SRST_N

J’ai ensuite lancé la commande pour programmer mon composant :

/opt/openocd-code/bin/openocd -f openocd_ftdi.cfg

Et voilà une clé programmée !