OpenOCD

From Eric

Jump to: navigation, search

Contents

OpenOCD

OpenOCD est un logiciel de contrôle d'une sonde JTAG open source.

Le rôle d'OpenOCD est schématisé ci-dessous :

gdb <-- port TCP/IP --> openOCD <-- USB --> Sonde JTAG <-- bus JTAG --> Cible

Le processus d'installation consiste à

  • installer les composants de la chaîne,
  • établir les connexions entre ces composants.

Installation d'OpenOCD

Le logiciel OpenOCD est disponible au format source et binaire précompilé pour Windows à l'adresse suivante : http://www.freddiechopin.info/index.php/en/download/category/4-openocd.

Nous utiliserons la version précompilée. Une fois l'archive téléchargée, lancer l'installation.

Connexion entre OpenOCD et la sonde JTAG

Pour pouvoir utiliser la sonde JTAG (type "openJtag"), OpenOCD requiert un driver FTDI2232. Le driver officiel FTDI étant non libre, on ne trouve aucun binaire OpenOCD (hors, jadis, la version 0.1) l'utilisant.

Il est normalement possible de recompiler OpenOCD pour qu'il utilise le driver FTDI que l'on aura pris soin de télécharger sur le site de Future Technologies (http://www.ftdichip.com/). Pour cela, il suffit d'utiliser la conmmande "configure" avec les paramètres suivants :

$ ./configure --enable-maintainer-mode --disable-werror --disable-shared
--enable-ft2232_ftd2xx
--with-ftd2xx-win32-zipdir=/tmp/ftd2xx CC="gcc -mno-cygwin"

La procédure est décrite en détails ici. Il est à noter que je ne suis pas parvenu à faire fonctionner cette solution... Aussi, j'ai simplement récupéré le fichier précompilé avec les composants opensource et ai procédé au remplacement du driver FTDI d'origine par le driver opensource.

En gros, la procédure consiste à :

  • Installer la sonde JTAG avec le driver FTDI propriétaire fourni.
  • Remplacer le driver FTDI propriétaire par le driver open source.

Installation des drivers FTDI

L'objectif de l'opération est d'installer les drivers du coupleur USB-RS232 ; pour ce qui concerne la sonde JTAG proprement dite, le driver FTDI va s'installer mais nous le remplacerons plus tard (voir section suivante).

Pour installer les drivers standards, il suffit de

  • décompresser l'archive "open-jtag.zip", le répertoire contenant les drivers FDTI est situé sous "open-jtag\usb-drivers" ;
  • de brancher la sonde ;
  • de réaliser une installation manuelle des drivers en indiquant le répertoire "open-jtag\usb-drivers".

La structure du répertoire est donnée ci-dessous :

Openjtag-dir.png


Remplacement des drivers FTDI par les drivers open source

Le driver open source "libusb-win32" est livré avec OpenOCD, sous le répertoire "OpenOCD\0.4.0\drivers", dans le fichier "libusb-win32_ft2232_driver_100223.zip", comme illustré ci-dessous.

Libusb-win32.png


Une fois l'archive décompressée, il faut configurer le driver pour qu'il supporte notre sonde JTAG ; en l'absence de configuration, Windows refusera d'installer le driver. Pour ce faire, il faut éditer le fichier "libusb-win32_ft2232_driver.inf" qui configure le driver. Ce fichier indique notamment les périphériques supportés dans les sections "[Devices]" et "[Devices.NT]".

Initialement, ces sections contiennent les lignes suivantes :

[Devices]
"Amontec JTAGkey (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_cff8&MI_00
"Amontec JTAGkey (Channel B)"=LIBUSB_DEV, USB\VID_0403&PID_cff8&MI_01
"CALAO Systems USB-A9260-C01 (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_6010&MI_00
"CALAO Systems USB-A9260-C02 (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_6001&MI_00
...


et, plus loin,

[Devices.NT]
"Amontec JTAGkey (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_cff8&MI_00
"Amontec JTAGkey (Channel B)"=LIBUSB_DEV, USB\VID_0403&PID_cff8&MI_01
"CALAO Systems USB-A9260-C01 (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_6010&MI_00
"CALAO Systems USB-A9260-C02 (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_6001&MI_00
...


Dans tous les cas, elles ne contiennent pas d'information sur notre sonde : il va falloir les ajouter.

Lorsque nous avons installé les drivers FTDI, notre sonde a été reconnu et apparaît dans le liste des périphériques USB. On peut par ce moyen connaître le nom du périphérique, son vendor ID (VID) et son product ID (PID).

Un autre moyen est d'utiliser l'utilitaire USBView. Concernant notre sonde, celui-ci nous donne les informations suivantes :

Usbview.png

On constate que :

  • le fabricant est "www.100ask.net"
  • le VID est 0x1457
  • le PID est 0x5118
  • le produit s'appelle "USB<=>JTAG&RS232"

Nous allons rajouter ce périphérique au fichier "libusb-win32_ft2232_driver.inf" pour obtenir le résultat suivant :

[Devices]
"100ASK JTAG"=LIBUSB_DEV, USB\VID_1457&PID_5118&MI_00
"Amontec JTAGkey (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_cff8&MI_00
...

et

[Devices.NT]
"100ASK JTAG"=LIBUSB_DEV, USB\VID_1457&PID_5118&MI_00
"Amontec JTAGkey (Channel A)"=LIBUSB_DEV, USB\VID_0403&PID_cff8&MI_00
...

Notez que le nom du périphérique est "100ASK JTAG" ; c'est sous ce nom qu'il apparaît dans la liste des périphériques retournée par Windows.

Une fois le fichier modifié (le fichier final est ici), on peut alors installer le driver.

Pour ce faire, on lance le gestion de périphérique de Windows, et on demande la suppression du driver pour le périphérique "100ASK JTAG". On demande alors à windows de vérifier la configuration matérielle (clic droit sur la racine, "Rechercher les modifications du matériel"). Windows va repérer la sonde et va demande l'installation du driver. Pour ce faire, utiliser l'installation manuelle pour laquelle l'utilisateur indique lui-même l'endroit où se trouve le driver. Ici, nous allons indiquer le répertoire contenant le fichier "libusb-win32_ft2232_driver.inf" que nous avons modifié.

A l'issue de l'installation, la sonde JTAG dit apparaître sous l'intitulé "LibUSB-Win32 Devices".

La phase d'installation du driver est achevée. Il reste maintenant à établir la connexion entre la sonde et OpenOCD.

Configuration d'OpenOCD

OpenOCD utilise un (ou plusieurs) fichiers de configuration, qui permettent de spécifier le port TCP/IP qui sera utilisé par GDB, comment accéder à la sonde JTAG, quelle est la cible à contrôler, etc. Le logiciel vient avec un certain nombre de fichiers prédéfinis situé dans les répertoires "interface", "board" et "target". Dans notre configuration, nous utilisons :

  • le fichier "open-jtag.cfg" situé dans le répertoire "interface"
  • le fichier "lpc1768.cfg" situé dans le répertoire "target"
  • le fichier "openocd.cfg" situé dans le répertoire racine.

(Noter la présence de l'exécutable "sjf24x0_ft2232.exde" et du fichier de données "supervivi_mini2440" qui permettent de reprogrammer l'EPLD de la sonde.)

Le fichier "open-jtag.cfg" installé par OpenOCD doit être modifié pour notre sonde. Il doit contenir les lignes suivantes:

# Configuration pour la sonde Open-JTAG 100ASK.net
interface ft2232
ft2232_device_desc "USB<=>JTAG&RS232"
ft2232_layout jtagkey_prototype_v1
ft2232_vid_pid 0x1457 0x5118

Le fichier "lpc1768.cfg" installé par OpenOCD n'a pas à être modifié. (Si si : il faut s'assurer que la fréquence qui est indiquée est conforme à celle programmée dans le LPC. Ainsi, dans le cas de l'application "camera", le LPC est programmé à 40MHz.)

Le fichier "openocd.cfg" doit contenir les lignes suivantes :

# My NXP ARM KIT from ETT
# Change the default telnet port...
telnet_port 4444
# GDB connects here
gdb_port 3333

Une fois les fichiers mis à jour, la connexion entre OpenOCD et la sonde doit être complète.

Le lancement du serveur OpenOCD s'effectue ainsi (si on se trouve à la racine de l'installation d'OpenOCD) :

openocd -f interface\open-jtag.cfg -f target\lpc1768.cfg -f openocd.cfg

(Attention : avec ma version modifiée du fichier de configuration, utiliser :openocd -f openocd.cfg )


Le résultat doit être le suivant (si la sonde est connectée à la cible) :

Start openocd.png


Le serveur OpenOCD ayant démarré, il est possible de lancer des commandes via telnet. Le port sur lequel se connecter est indiqué dans le fichier "openocd.cfg". Dans notre cas, il s'agit du port 4444 :

telnet 192.168.0.2 4444

(L'adresse 192.168.0.2 est celle de la machine qui exécute OpenOCD et sur laquelle la sonde est connectée.) Lorsque la connexion est établie, OpenOCD répond par le prompt suivant :

Open On-Chip Debugger
>

Il est alors possible de lancer des commandes sur la cible, telle "reset", "halt", "resume", etc. La commande "help" donne la liste des commandes disponibles.

Un exemple de session est donnée ci-après :

Openocd-session.png

Retour sur le fichier de configuration d'OpenOCD

Afin d'éviter la longue liste de fichiers de configuration en ligne de commande, il vaut mieux utiliser un seul fichier de configuration qui va "appeler" les deux autres au moyen de la commande source. Un exemple de ficheir de configuration est donné ici. On verra dans ce fichier comment créer des "callbacks" sur certains évènements, au moyen de procédures TCL.

Le manuel d'OpenOCD est ici.

Connection à GDB

La connexion de GDB à une cible distante s'effectue au moyen de la commande target remote <adresse ip>:<port>

<adresse ip>:<port> désignent la machine sur laquelle "tourne" OpenOCD.

Nota: Afin d'éviter les timeouts, il est recommandé d'augmenter la valeur du timeout sous GDB: set remotetimeout 2000

Un exemple de session est donné ci-dessous. Dans cet exemple, on voit

  • la connexion de GDB à OpenOCD
  • une demande d'un reset de la cible
  • une demande d'arrêt de la cible (halt)
  • une demande de redémarrage de la cible (resume)
  • une demande d'exécution "pas-à-pas"

Gdb-connection.png

Dans cette copie d'écran, on remarque la "note" suivante : "Note: automatically using hardware breakpoints for read-only adresses."

En effet, le pas-à-pas sur du code situé en flash requiert l'utilisation des moyens fournis par le processeur (hard breakpoints). Pour indiquer à gdb l'existence et le nombre de "breakpoints" et de "watchpoints" matériel, il faut utiliser les commandes suivantes (sur la cible LPC1768):

set remote hardware-breakpoint-limit 6
set remote hardware-watchpoint-limit 4

Notez que ces valeurs sont retournées par OpenOCD lors du démarrage.

Il est important de savoir que GDB peut lancer n'importe quelle commande d'OpenOCD en la faisant précéder du mot-clef monitor. Ainsi, pour effectuer un reset de la cible, il suffit de saisir :

monitor reset

Chargement d'un exécutable

Le chargement d'un binaire en RAM s'effectue avec la commande load de GDB. Si le code doit être stocké en flash, la commande "load" ne fonctionne pas (comprendre: je n'ai pas su la faire fonctionner... Comme GDB ne connait pas la map mémoire, il ne peut deviner qu'il faut effectuer un stockage en flash...).

On peut cependant utiliser les commandes d'OpenOCD:

flash write_image erase unlock "y:\lpc1768.elf"

Ici, le binaire est "lpc1768.elf". On rappelle que cette commande peut être lancée directement par GDB en la faisant précéder du mot-clef monitor.


Connexion à Eclipse

La connexion entre Eclipse et OpenOCD requiert l'installation du plug-in "Zylin Embedded CDT" que l'on installe à partir du site "update" : "http://www.zylin.com/zylincdt" (voir http://opensource.zylin.com/embeddedcdt.html pour plus de détails).

Personal tools