Erkennung der JTAG-Pinbelegung

Ich möchte die JTAG-Pinbelegung auf der Zielplatine mit dem JTAGenum-Tool identifizieren. Ich habe den JTAGenum- Code gelesen und möchte einige Punkte zur Benutzerkonfiguration klären. JTAGenum kann 4 obligatorische Pins identifizieren (TCK, TMS, TDI, TDO), gibt es eine Methode, um die optionalen Pins zu definieren? (TRST, RST, RTCK)

Kann jemand den Teil der Benutzerkonfiguration im JTAGenum-Code klären: Es ist erforderlich, die Pins [] und Pinnames [] zu definieren und die Pin-Namen den Pins zuzuordnen, mit denen gescannt werden soll. Wäre es richtig, die Einstellungen für den 8-Pin-JTAG-Header (ein Pin davon ist GND) wie folgt anzugeben:

byte      pins[] = { 2, 3, 4, 5, 6, 7, 8 };
char * pinnames[] = { "TCK ", "TMS ", "TDI ", "TDO ", "DIG_6", "DIG_7", "DIG_8" };
Die 4 identifizierten Signale sind die einzigen obligatorischen Pins. TRST (aktiv niedrig) ist optional, einige Teile haben es, andere nicht. Im Allgemeinen fehlt es auf FPGAs.

Antworten (2)

Sie können die „optionalen“ Pins wahrscheinlich ignorieren, mit Ausnahme von RTCK. Es sollte kein Debug-Szenario geben, in dem diese Pins erforderlich sind, es sei denn, Ihr Teil hat den JTAG-Port deaktiviert, indem er in einem „Reset“-Zustand abgebunden ist. Wenn das Ziel diese optionalen Pins implementiert, ist es wahrscheinlich, dass die PCB sie fest verdrahtet, als sie auf einem Steckverbinder freizulegen. Wenn Sie einen Anschluss als Kandidaten-JTAG-Port identifiziert haben, kann dieser auch eine 3v3-Referenz (Zielversorgungsschiene) bereitstellen, die Ihr Tastkopf verwenden soll (und kann wahrscheinlich auch ignoriert werden).

RTCK kann auf einem alten Arm-Ziel vorhanden sein, alles ARM11 und früher. Dies ist eine abgetastete und verzögerte Version der TCK-Eingabe, neu synchronisiert mit der internen Kernuhr. Wenn RTCK verwendet wird, müssen Sie Ihr JTAG langsam ausführen oder auf die RTCK-Flanken warten. Alles, was den CoreSight-DAP verwendet, verwendet kein RTCK (es könnte möglicherweise als Loopback von TCK verdrahtet werden, erfüllt jedoch keinen Zweck).

Denken Sie daran, dass 2-polige Serial-Wire-Debug-Ports jetzt üblich sind. Sie benötigen eine andere Sequenz, um diese zu erkennen (in der Größenordnung von 100 Bits pro Pin, die als Daten getestet werden). Es gibt in diesem Fall kein einfaches FSM wie bei JTAG.

Mir ist aufgefallen, dass die aktuelle Open-OCD-Dokumentation darauf hinweist, dass die JTAG-Taktgeschwindigkeit auf ~CPU/6 begrenzt ist. Dies gilt nur für die älteren ARM-Kerne, bei denen der RTAG TAP direkt mit dem Prozessor verbunden ist. Bei jedem Prozessor mit einem CoreSight DAP ist der Debug-Takt vollständig asynchron zu den internen Takten und kann sogar mit JTAG/SW-Takt schneller als der Prozessor laufen.

Siehe hier für die Standardanschlüsse - Sie finden möglicherweise auch eine Versorgung, eine Zielspannungsreferenz und einen Zielfunktions-Reset - aber dies hängt vom Plan des Designers für das Debuggen der Platine ab.

In Bezug auf den „RST“-Pin: Wenn ein Gerät irgendwo eine „Reset“-Taste hat, die das Zurücksetzen des Geräts auf die Werkseinstellungen ermöglicht: Bedeutet dies, dass das „RST“-Signal auch unter den optionalen JTAG-Pins vorhanden ist?
Vielleicht. nRESET auf den Standard-Debug-Anschluss-Pinbelegungen ermöglicht dies, daher gibt es eine Ermutigung dazu, aber keine funktionale Anforderung – es hängt also von Ihrem Board-Designer ab.
Kann es sein, dass der VCC-Pin nicht im JTAG-Header enthalten ist? Ich habe die Spannung an allen JTAG-Pins gemessen, kann aber keine VCC-Spannung finden. Die VCC wird von einem anderen Punkt auf der Leiterplatte angelegt? Es ist nicht klar, warum der VCC-Pin nicht einfach innerhalb der JTAG-Testpunkte hinzugefügt wurde.
Vtref ist optional, ebenso wie eine Versorgung, die der Adapter verwenden kann.

Ich lerne gerade, aber soweit ich verstanden habe, brauchen Sie zuerst die Pinbelegung Ihres eigenen Arduino. Zum Beispiel habe ich in meinem Fall Arduino Nano.

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, gibt es Zahlen in Lila, die Sie verwenden können. So viele Pins Sie in Ihrem Arduino zur Verfügung haben, mehr Pins können Sie gleichzeitig in Ihrem Zielboard testen.

Sie können also einen Code wie diesen schreiben:

byte      pins[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 11, 12, 13, 14, 15, 16, 17, 18, 19 };

char * pinnames[] = { "DIG_0 ", "DIG_1 ", "DIG_2", "DIG_3", "DIG_4", "DIG_5", "DIG_6", "DIG_7", "DIG_8", "DIG_9", "DIG_10", "DIG_11", "DIG_12", "DIG_13", "DIG_14", "DIG_15", "DIG_16", "DIG_17", "DIG_18", "DIG_19" };

Allerdings gibt es dabei ein Problem. Die Anzahl der Kombinationen ist riesig und wahrscheinlich haben Sie im Ziel eine Vorstellung davon, welche 6 Pins die JTAG-Schnittstelle sein können.

So können Sie mit der Mindestzahl vereinfachen:

byte      pins[] = { 0, 1, 2, 3, 4, 5};

char * pinnames[] = { "DIG_0 ", "DIG_1 ", "DIG_2", "DIG_3", "DIG_4", "DIG_5" };

In beiden Fällen müssen Sie alle im Arduino registrierten Pins an einen der verdächtigen Pins im Ziel anschließen (in den ersten Fällen sind möglicherweise einige der 20 Pins leer).

Dann müssen Sie eine Verbindung zum seriellen Port zum JTAGEnum-Programm herstellen und nach dem Scannen (Befehl s) sollten Sie die Ergebnisse der Tests erhalten (falls vorhanden).

Wenn Sie einen JTAG gefunden haben, teilt Ihnen das Programm mit, welche Pins in Ihrem Arduino mit den identifizierten JTAG-Pins übereinstimmen.

Zum Beispiel:

GEFUNDEN! tck:DIG_0 tms:DIG_1 tdo:DIG_2 tdi:DIG_3

So können Sie der DIG_0 folgen, um zu wissen, welche tck im Ziel ist, ...

Es tut mir leid, wenn ich mich nicht sehr gut erklären kann, und ich hoffe, das kann helfen