Kampis Elektroecke

Lektion 2

Im zweiten Teil des Raspberry Pi Assembler Tutorials möchte ich zeigen, wie der JTAG, eine Programmier- und Debugschnittstelle, des BCM2835 aktiviert und únd mit einem externen JTAG Debugger genutzt werden kann.


Hinweis:

Dieses Tutorial wurde mit einem Raspberry Pi B+ (Revision 0010) gemacht. Bei den Raspberry Pi Versionen mit 256 MB Arbeitsspeicher ist der GPIO27, welcher für den JTAG genutzt wird, nur über den CSI-Anschluss zu erreichen. Dieses Problem wurde mit der Revision 2 behoben. Ab Revision 2 sind alle JTAG-Pins über die 26-, bzw. 40-pol Stiftleiste P1 zu erreichen.


Für eine JTAG-Verbindung werden die folgenden Signale benötigt:

  • Test Data Input (TDI) – Dateneingang des JTAG Schieberegisters
  • Test Data Output (TDO) – Datenausgang des JTAG Schieberegisters
  • Test Clock (TCK) – Taktsignal für die JTAG Logik
  • Test Mode Select (TMS) – Steuersignal für den Zustandsautomaten des JTAG-Ports
  • Test Reset (TRST) – Reset der Testlogik

Anders als bei Mikrocontrollern muss die JTAG-Schnittstelle des Raspberry Pi nicht per default aktiviert. Sie muss explizit aktiviert werden, da die JTAG-Funktionen alternative Funktionen einiger I/Os darstellen. Auch hier hilft wieder das Datenblatt des BCM2835 weiter…

Für den JTAG können somit die folgenden Pins verwendet werden:

Signal
ALT4 ALT5
TDI GPIO26 GPIO4
TDO GPIO24 GPIO5
RTCK GPIO23 GPIO6
TMS GPIO27 GPIO12
TCK GPIO25 GPIO13
TRST GPIO22

Da nicht alle I/Os mit einer JTAG-Funktion über die Stiftleiste P1 zugänglich sind, ergeben sich die folgenden Kombinationen…

Signal I/O Funktion P1
TDI GPIO4 ALT5 7
TDO GPIO24 ALT4 18
RTCK GPIO23 ALT4 16
TMS GPIO27 ALT4 13
TCK GPIO25 ALT4 22
TRST GPIO22 ALT4 15

Diese I/Os müssen nun in den JTAG-Modus versetzt werden. Dazu wird das Ordnertemplate kopiert und die Datei main.s aus dem Verzeichnis source geöffnet. Über den nachfolgenden Code werden die benötigten I/Os dann in den JTAG-Modus versetzt.

Anschließend wird die Datei gespeichert und über den Befehl make kompiliert:

Es wird wieder eine Datei mit dem Namen kernel.img erzeugt. Um das Programm auszuführen gibt es zwei Möglichkeiten:

  • Es wird das kernel.img einer vorhandenen Raspberry Pi Installation ersetzt
  • Auf einer SD-Karte wird eine FAT32 Partition mit einer Größe von etwa ~60 MB erzeugt. Anschließend werden die Dateien bootcode.bin und start.elf aus meinem Git-Repository, sowie das erzeugte Kernelimage auf die SD-Karte kopiert.

Sobald das Kernelimage auf die SD-Karte kopiert worden ist, kann der Raspberry Pi eingeschaltet werden. Der JTAG ist von nun an einsatzbereit.

Die JTAG-Pins werden nun mit einem entsprechenden ARM Debugger verbunden. Ich verwende einen Segger J-Link als Educational Version. Dieser Debugger kostet etwa 70€ und ist ein vollwertiger JTAG-Debugger (darf allerdings nur für nicht kommerzielle Zwecke genutzt werden!). Als Software kommt OpenOCD, GDB und ein Ubuntu Betriebssystem zum Einsatz. Bei OpenOCD handelt es sich um eine Open Source Debuggingsoftware, die mit verschiedenen Hardwaredebuggern arbeiten und einen Debugserver für die Verwendung von GDB bereitstellen kann.

Leider unterstützt die aktuelle Version von OpenOCD den J-Link nicht korrekt. Daher wird auf eine ältere Version zurückgegriffen:

Jetzt müssen noch zwei Konfigurationsdateien angelegt werden. Eine ist für den verwendeten Debugger (hier der Segger J-Link) und die andere für das Target (hier der BCM2835 des Raspberry Pi).

Zum Schluss muss der Raspberry Pi noch mit dem J-Link (bzw. dem verwendeten Debugger) verbunden werden.

J-Link Raspberry Pi JTAG Signal
1 1 VREF
3 15 nTRST
4 9 GND
5 7 TDI
7 13 TMS
9 22 TCK
11 16 RTCK
13 18 TDO

Wenn ein anderer Debugger verwendet wird (z. B. ein FT232) müssen die Verbindungen und die entsprechende Konfigurationsdatei für den Debugger selbstverständlich angepasst werden.

Nun ist alles bereit und es kann versucht werden eine Verbindung zum Raspberry Pi herzustellen. Dazu wird der J-Link mit dem Computer verbunden und der Raspberry Pi (wenn noch nicht geschehen) mit Spannung versorgt. Anschließend kann OpenOCD gestartet werden. Als Parameter werden die Pfade zu den Konfigurationsdateien übergeben:

Es sollte nun die folgende Ausgabe erscheinen…

OpenOCD hat nun erfolgreich einen Debugserver gestartet, welcher über Telnet, bzw. GDB genutzt werden kann. Für einen Zugriff mittels GDB muss der entsprechende GNU-Debugger, hier arm-none-eabi-gdb, installiert werden. 


Hinweis:

Der verwendete Debugger muss für die Architektur des Targets kompiliert worden sein. Andernfalls wird eine Warnung ausgegeben und die Verbindung abgebrochen.


Anschließend kann GDB gestartet und eine Verbindung mit OpenOCD hergestellt werden.

Nun wollen wir GDB nutzen um ein Programm per JTAG auf den Raspberry Pi zu laden und auszuführen. Das Programm soll die Act-LED, welche sich an GPIO 47 befindet, einschalten.


Hinweis:

Beim Raspberry Pi B+ befindet sich die Act-LED an GPIO 47 und ist Active-High beschaltet. Bei einem Raspberry Pi B befindet sich die LED an GPIO 16 und ist Active-Low beschaltet.


Der Programmcode für das gewünschte Programm sieht folgenermaßen aus:

Jetzt muss das Programm noch kompiliert werden. Dazu wird der arm-none-eabi Compiler genutzt. Im Gegensatz zum ersten Programm wird hier kein Kernelimage benötigt, da dieses Programm nicht von einem Bootloader geladen werden muss. Stattdessen wird ein einfaches Hex-File erzeugt.

Über die geöffnete GDB Instanz wird das kompilierte Programm mit dem Befehl file geladen und über den Befehl load auf das Target kopiert.

Mit dem Befehl c wird das Programm dann ausgeführt.

Und schon sehr ihr die Act-LED des Raspberry Pi aufleuchten. Somit funktioniert die komplette Debugchain und ihr könnt über GDB nun jedes Programm mittels JTAG debuggen.


Hinweis:

Als Alternative kann auch auf das Embedded Studio der Firma Segger zurückgegriffen werden. Es wird allerdings nur die verwendete ARM-CPU und nicht das komplette SoC des Kleinrechners unterstützt. Dafür wird das Debuggen und die Codeentwicklung vereinfacht.


Das komplette Projekt, inkl. Boot-Partition für die SD-Karte, OpenOCD und allen Programmen, steht in meinem GitLab-Repository zum Download bereit.

→ Zurück zu Raspberry Pi Assembler

Last Updated on

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.