Table des matières

OpenOCD

Cet article est une ébauche à compléter, vous pouvez partager vos connaissances en le modifiant.

OpenOCD est une interface de communication entre vous et votre microcontrôleur.

Vous envoyez des commandes à un serveur telnet et openocd se charge de les transcrire en commandes JTAG.

Cet article est un résumé de ce que j'ai pu trouver et tester dans les docs suivantes :

Installation

Téléchargez et installez Open On-Chip Debugger

Vous pouvez aussi utilisez l'openOCD intégré dans WinARM qui se trouve dans C:\WinARM\utils\OpenOCD mais elle n'est pas forcément très à jour …

Pour les utilisateurs de WinAVR, Windows NT, 2000 ou XP et du programmateur type "Wiggler clone"

Executez le fichier ioperm_install.bat qui se trouve dans le répertoire C:\WinARM\utils\OpenOCD de WinARM

( Si vous avez besoin de plus d'informations, ouvrez le fichier test.txt qui se trouve dans le même répertoire )

Utilisation

OpenOCD a besoin de 2 fichiers pour fonctionner :

Voici les fichiers que j'ai utilisé lors de mon 1er test sur un AT91SAM7S64 avec un programmateur “Wiggler clone”:

at91sam7s_flash_wiggler.cfg :

#define our ports
telnet_port 4444
gdb_port 3333

#commands specific to the Wiggler
interface parport
parport_port 0x378
parport_cable wiggler
jtag_speed 0
jtag_nsrst_delay 200
jtag_ntrst_delay 200

#reset_config <signals> [combination] [trst_type] [srst_type]
reset_config srst_only srst_pulls_trst

#jtag_device <IR length> <IR capture> <IR mask> <IDCODE instruction>
jtag_device 4 0x1 0xf 0xe

#daemon_startup <'attach'|'reset'>
daemon_startup reset

#target <type> <endianess> <reset_mode> <jtag#> [variant]
target arm7tdmi little run_and_init 0 arm7tdmi_r4

#run_and_halt_time <target#> <time_in_ms>
run_and_halt_time 0 30

# commands below are specific to AT91sam7 Flash Programming
# ---------------------------------------------------------

#target_script specifies the flash programming script file
target_script 0 reset plop.ocd

#working_area <target#> <address> <size> <'backup'|'nobackup'>
working_area 0 0x40000000 0x4000 nobackup

#flash bank at91sam7 0 0 0 0 <target#>
flash bank at91sam7 0 0 0 0 0

Si vous avez utilisé SAM-BA lors de votre derniere programmation :

plop.ocd :

wait_halt
armv4_5 core_state arm
mww 0xffffff64 0x5a000004
mww 0xffffff64 0x5a002004
flash write 0 main.bin 0x0
mww 0xfffffd08 0xa5000401
reset
shutdown

sinon :

plop.ocd :

wait_halt
armv4_5 core_state arm
flash write 0 main.bin 0x0
mww 0xfffffd08 0xa5000401
reset
shutdown

SAM-BA peut vous verrouillez l'accès à la mémoire donc avant de lancer une programmation avec le JTAG il est préférable d'autoriser l'accès à la flash grâce aux commandes :

mww 0xffffff64 0x5a000004
mww 0xffffff64 0x5a002004

Le derniere fichier qu'il vous faut c'est le main.bin qui correspond à un fichier compilé en binaire (.bin pas un .hex) pour votre miro. Pour ma part j'ai utilisé celui-ci fournit par Olimex.

Pour lancer la programmation, il vous suffit de taper la commande dans le “dos” de Windows:

openocd.exe -f at91sam7s_flash_wiggler.cfg

Au final, ca vous donne cette chose indigeste :

C:\WinARM\utils\OpenOCD>openocd.exe -f at91sam7s_flash_wiggler.cfg
Info:    openocd.c:73 main(): Open On-Chip Debugger (Revision 65)
Info:    configuration.c:50 configuration_output_handler(): Command jtag_nsrst_d
elay not found
Info:    configuration.c:50 configuration_output_handler(): Command jtag_ntrst_d
elay not found
Warning: arm7_9_common.c:669 arm7_9_assert_reset(): srst resets test logic, too
Info:    target.c:177 target_init_handler(): executing reset script 'plop.ocd'
Warning: arm7_9_common.c:669 arm7_9_assert_reset(): srst resets test logic, too 

Mais ca fonctionne :-)

Vous aurez surement remarqué que mon fichier de configuration est dans la même répertoire que openocd.exe, ce qui n'est pas très pratique … Pour avoir acces à openocd quelque soit le répertoire où vous vous trouvez (en particulier celui de votre projet), il faut rajouter le répertoire où se trouve openocd.exe dans le path de windows.
Pour cela :

  1. Allez dans le panneau de configuration de windows, puis dans “performances et maintenance” → “système”, l'onglet “Avancé”, cliquez sur “Variables d'environnement, selectionnez la ligne “PATH”, cliquez sur “modifier” et rajoutez au début de la ligne “Valeur de la variable” :
C:\WinARM\utils\OpenOCD;

Discutons avec notre ARM7

Toujours sur le même principe, nous allons réaliser un fichier de configuration qui n'envera pas de commande à votre micro mais établira juste une connexion.

Mon fichier de configuration :

SAM7S_wiggler_chat.cfg

#Configuration du daemon 
telnet_port 4444 
gdb_port 3333

#Configuration du programmateur
interface parport
parport_port 0x378
parport_cable wiggler

#Configuration JTAG
jtag_speed 0
reset_config srst_only srst_pulls_trst
jtag_device 4 0x1 0xf 0xe

#Configuration Microcontroleur 
target arm7tdmi little run_and_halt 0 arm7tdmi_r4
run_and_halt_time 0 30

#Flashage
working_area 0 0x00200000 0x4000 nobackup
flash bank at91sam7 0 0 0 0 0

Comme avant, ouvrez une fenètre dos, menu démarrer→executer → cmd, allez dans le répertoire où se trouve votre fichier de configuration et tapez :

:at91:chat_sam71.gif

Votre connexion est maintenant établie entre openocd et votre micro.
Ouvrez une nouvelle fenêtre dos, sans fermer la premiere et tapez la commande :

telnet localhost 4444

Vous êtes maintenant connecté à openocd. Vous devriez voir apparaître une invite de commande ”>“

Si vous avez fait comme moi dans l'exemple précédent et que vous avez programmé l'exemple d'olimex vous deviez voir vos deux leds clignoter.

Tapez maintenant la commande :

halt

Elles ne clignotent plus, votre micro est bien arreté.

Tapez la commande :

flash banks

OpenOCD vous détecte bien votre AT91SAM7 et lui a donné le numéro “0”.

Tapez la commande :

flash info 0

Des infos sur la clock la configuration des bits etc

Tapez la commande :

resume

Votre micro repart d'où il s'était arreté.

Tapez la commande :

exit 

pour vous deconnecter.

:at91:chat_sam72.gif

Vous pouvez trouver l'intégralité des commandes sur le site d'OpenOCD

Vérification des LOCKBITS

Vous avez sûrement vu dans le datasheet que l'AT91SAM7S64 dispose de 64 octets de mémoire flash. Cette mémoire peut être verrouillée par régions. Sur l'AT91SAM7S64 vous avez 16 régions donc 64/16=4 octet par région. Donc nous allons vérifier si nous n'avons pas de région verrouillée.

Pour cela connectez vous comme précédemment et tapez les commandes :

halt 
flash info 0

OpenOCD me revoie

 Open On-Chip Debugger
> halt
requesting target halt...
> Target 0 halted
target halted in Thumb state due to debug request, current mode: System
cpsr: 0x400000df pc: 0x0000011e
> flash info 0
#1: at91sam7 at 0x00000000, size 0x00000000, buswidth 0, chipwidth 0

at91sam7 information:
cidr: 0x27090540, arch: 0x0070, eproc: ARM7TDMI, version:0x000,  flashsize: 0x00
010000
main clock(estimated): 18288kHz
pagesize: 128, lockbits: 16 0x0002, pages in lock region: 32
securitybit: 0, nvmbits: 0x0 

Donc les lockbits sont à 2, donc le 2eme bit est à 1, donc ma 2ème région de ma mémoire flash est protégée. Pour la débloquer je vais utilisez la commande :

flash protect 0 0 15 off

La commande demande la désactivation “off” des bit de protection “protect” sur mon AT91 “0” des bits “0” à “15”.

Je relance la commande :

flash info 0

Je n'ai plus de region verrouillée :

pagesize: 128, lockbits: 16 0x0000, pages in lock region: 32

Liens

OpenOCD