jtag:tutorials:start

Dies ist eine alte Version des Dokuments!


JTAG lernen - für ungeduldige

Warum bist Du hier gelandet? Warum willst Du JTAG verstehen, ohne es aber gleich monatelang studieren zu wollen? Vielleicht aus dem gleichen Grund wie ich: „Nur mal eben schnell nen Firmwaredump von nem Flash einer Steuerung lesen oder neu programmieren“ - irgendsowas in der Art. Und dann findet man im Netz massig Infos die einen aber nur tagelang mit Grundlagen oder abgedrehtem Zeugs beschäftigen ohne das man wirklich voran kommt. Seitenweise dämliche Posts in irgendwelchen Foren und immer wenns ins Detail geht, also in die Praxis ist plötzlich schluß und man ist genauso weit wie vorher.

Wenn es Dir genauso ging bist Du HIER genau richtig! :-) Nachfolgend will ich Dir mit wenig Worten und viel Praxis die Funktion von JTAG näher bringen. Alles mit Standard-Mitteln, also kauf nicht gleich irgendwelche JTAG-Debugger Hardware für hunderte von Euros, zum lernen brauchts' das nicht.

Ich will mich nachfolgend so kurz wie möglich halten. Wer etwas nicht versteht oder doch genauer wissen will was dahinter steckt, für den hab ich immer mal einen Zusatz „Nerd-Wissen“ reingepackt. Der leitet auf eine separate Seite mit detaillierteren Infos zum jeweiligen Thema.

Genug geschwafelt - LOS GEHTS!

Geeignetes Gerät für die Experimente finden

Wo und wie anfangen? Am besten nicht mit dem eigentlichen Probanten. Such Dir aus der Bastelkiste oder auf kleinanzeigen ein billiges Gerät, z.B. wie ich einen alten Linksys WRT54 Router, von dem Du genau weißt das der eine JTAG-Schnittstelle besitzt. Das bekommst Du mit ein paar Google-Suchen leicht raus.

Nimm ein Gerät von dem die JTAG-Schnittstelle bekannt und bereits dokumentiert ist. Google einfach danach: „<GERÄTENAME> JTAG Signale Header“. Später lernen wir noch, wie man die Schnittstelle eines nicht bekannten Systems ermittelt. Für den Anfang wäre das aber der falsche Weg, glaub mir. Sobald Du also weißt wo auf Deinem Test-Board die JTAG-Anschlüsse TCK, TMS, TDI, TDO (und natürlich GND) liegen kann es schon losgehen.

Wie kann ich den PC mit der JTAG-Schnittstelle des Geräts verbinden?

Ich verwende dafür nachfolgend einen Arduino verwenden, mit dem ich die Signale erzeuge und auslese. Sowas sollte jeder in der Bastelkiste haben, hier reicht ein Arduino Nano Clone, der für unter 5,- € zu haben ist.

Desweiteren brauchst Du einen Pegelwandler um die IO-Signale vom Arduino an den Spannungspegel des JTAG-Chips auf dem Testgerät anzupassen. Such auf ebay nach „Pegelwandler TXS0108“ und Du wirst was passendes für wenige Euro finden. HEY, DAS IST WICHTIG nicht einfach drauf verzichten, sonst grillst Du womöglich gleich Dein Testgerät. (Nerd-Wissen: Warum braucht man das?)

Verbinde das ganze so

<FOTOS>

Was haben wir nun gelernt?
  • Du weißt nun das JTAG mindestens 4 Signalleitungen braucht, nämlich TCK, TMS, TDI und TDO.
  • Der Spannungspegel dieser Leitungen ist zu beachten und entsprechend anzupassen um sicher darauf zuzugreifen.
Grundlegende Kommunikation

Diese ist seriell, sowohl für die Daten als auch für die Befehle. Die Daten werden an den TDI und TDO-Pins gesendet bzw. empfangen, die Befehle über den TMS-Pin. Wann die jeweilige Information an den Pins stabil ist und übernommen wird, regelt die Taktleitung TCK. Hierbei sind die Übergänge von 0 nach 1 bzw. 1 nach 0 entscheident.

Intern liegt zwischen TDI und TDO ein Schieberegister. Die Breite dieses und die Verwendung der darin befindlichen Daten bestimmt der Betriebsmodus des Chips, der über JTAG-Befehle gesteuert wird.

Sind mehrere JTAG-fähige Chips auf einem Board vorhanden, werden deren Datenleitungen in Reihe geschaltet. Also TDO des einen an TDI des nächsten Chips. Dadurch ergibt sich eine Kette, „JTAG-Chain“ genannt, der einzelnen Schieberegister:

TAP Chip 1 Chip 2

TDO ---->| TDI [010100011] TDO |---->| TDI [11111] TDO |---.
TDI <------------------------------------------------------'                                                   

Will man also nur die Daten eines bestimmten Chips lesen oder schreiben, muss man wissen an welcher Stelle der Chain sich dieser befindet.

Die Befehls- und Taktleitung liegt an allen parallel an, was bedeutet das immer alle den gleichen Betriebszustand einnehmen werden.

Mit JTAG kann man mehr als einen Chip verbinden. Diese sind dabei datentechnisch in Reihe geschaltet und man nennt das eine „JTAG-Chain“. Man kann sich das wie eine Verkettung von Schieberegistern vorstellen:

Die Kommunikation vom Testadapter (unserem Arduino) mit der Chain erfolgt also seriell. Jeder Chip enthält seinen eigenen JTAG-Controller. Sein Betriebsmodus bestimmt, was mit den einfließenden Daten an TDI zu tun ist und welche Daten an TDO anliegen. Dieser Modus wird über die separate TMS-Leitung eingestellt, ebenfalls seriell.

Zur Synchronisation dient das Clocksignal TCK. Bei der steigenden, bzw. fallenden Flanke des Signals werden bestimmte Ein-, Ausgangssignale verarbeitet. Man muss wissen das TCK und TMS im Gegensatz zu TDI und TDO bei allen JTAG-Chips einer Chain parallel anliegen. Man steuert also über TMS nicht nur einen Chip sondern alle und der Betriebszustand ist immer für alle gleich.

Es gilt als erstes herauszufinden wieviele Chips in einer Chain verkettet sind. Das ist die Basis für alle weiteren Untersuchungen. Später wirst Du das verstehen!

Nach dem einschalten des Chips befindet sich der Controller im Zustand „Test-Logic Reset“. Im Modus „Shift IR“ verbindet der Controller das Befehlsregister an TDI+TDO. Dann kann man einen JTAG-Befehl senden. Oder im Modus „Shift DR“ die Scandaten des Chips auslesen oder einschreiben. Dazu später mehr.

Wie finde ich heraus wieviele Chips in einer JTAG-Chain sind?

Das Verfahren ist im groben so: Man versetzt den JTAG-Controller im Chip in den Bypass-Modus. Dabei verbindet er ein 1-Bit Schieberegister zwischen TDI und TDO. Der Inhalt interessiert den Chip nicht. Jetzt besteht die Chain aus Anschließend schiebt man erstmal ne große Menge an '1'en durch die Chain.

  • jtag/tutorials/start.1520779958.txt.gz
  • Zuletzt geändert: Sun. 11.03.2018 15:52
  • von wikiadmin