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 :
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 …
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 )
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 :
C:\WinARM\utils\OpenOCD;
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 :
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.
Vous pouvez trouver l'intégralité des commandes sur le site d'OpenOCD
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