Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende ÜberarbeitungLetzte ÜberarbeitungBeide Seiten der Revision | ||
jtag:tutorials:start [Sun. 11.03.2018 15:28] – wikiadmin | jtag:tutorials:start [Mon. 12.03.2018 14:43] – [Aller Anfang ist schwer...] wikiadmin | ||
---|---|---|---|
Zeile 19: | Zeile 19: | ||
Nimm ein Gerät von dem die JTAG-Schnittstelle bekannt und bereits dokumentiert ist. Google einfach danach: "< | Nimm ein Gerät von dem die JTAG-Schnittstelle bekannt und bereits dokumentiert ist. Google einfach danach: "< | ||
- | == Wie kann ich den PC mit der JTAG-Schnittstelle | + | == Womit und wie kann ich Daten über die JTAG-Schnittstelle |
- | Ich verwende dafür nachfolgend einen Arduino verwenden, mit dem ich die Signale erzeuge | + | Dafür sind die " |
- | 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 | + | Damit uns der nicht wegen unterschiedlicher Betriebs- und IO-Signalspannung hopps geht, schalten wir noch einen Pegelwandler zwischen ihm und der JTAG-Schnittstelle vom Gerät. Ich verwende hier einen 8-Kanaligen mit nem " |
- | == Verbinde | + | **UND HEY, DAS IST WICHTIG** nicht einfach auf den Pegelwandler verzichten, sonst grillst Du womöglich gleich Dein Testgerät. ([[nerdwissen_pegelwandler|Nerd-Wissen: |
- | < | + | ===== Wir bauen uns ein JTAG-Interface mit Arduino und Pegelwandler ===== |
- | == Was haben wir nun gelernt? | + | == Prinzipschaltbild |
- | * Du weißt nun das JTAG mindestens 4 Signalleitungen braucht, nämlich | + | < |
- | | + | [PC]< |
+ | </ | ||
+ | |||
+ | == Schaltplan und physikalischer Aufbau == | ||
+ | |||
+ | < | ||
+ | |||
+ | <FOTO VOM AUFBAU> | ||
+ | |||
+ | ^ Arduino ^ Pegelwandler HS ^ Pegelwandler LS ^ JTAG-Signal ^ Kabelfarbe ^ | ||
+ | | D7 | H1 | L1 | TCK | Gelb | | ||
+ | | D8 | H2 | L2 | TMS | Grau | | ||
+ | | D9 | H3 | L3 | TDI | Grün | | ||
+ | | D10 | H4 | L4 | TDO | Lila | | ||
+ | |||
+ | == Software-Grundgerüst für den Arduino == | ||
+ | |||
+ | Zunächst definieren wird die Signale mit Namen um sie einfach verwenden zu können: | ||
+ | |||
+ | <code c> | ||
+ | #define TCK 7 | ||
+ | #define TMS 8 | ||
+ | #define TDI 9 | ||
+ | #define TDO 10 | ||
+ | </ | ||
+ | |||
+ | Im '' | ||
+ | |||
+ | <code c> | ||
+ | void initPins() | ||
+ | { | ||
+ | pinMode(TCK, OUTPUT); | ||
+ | pinMode(TMS, OUTPUT); | ||
+ | pinMode(TDO, | ||
+ | pinMode(TDI, INPUT); | ||
+ | |||
+ | digitalWrite(TCK, | ||
+ | digitalWrite(TMS, | ||
+ | digitalWrite(TDO, HIGH); | ||
+ | } | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | initPins(); | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
===== Wie kommuniziere ich nun mit dem Chip? ===== | ===== Wie kommuniziere ich nun mit dem Chip? ===== | ||
Zeile 38: | Zeile 84: | ||
== Grundlegende Kommunikation == | == Grundlegende Kommunikation == | ||
- | Mit JTAG kann man mehr als einen Chip verbinden. Diese sind dabei datentechnisch | + | 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 |
+ | |||
+ | 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 | ||
+ | |||
+ | TAP Chip 1 Chip 2 | ||
+ | TDO ---->| TDI [010100011] TDO |---->| TDI [11111] TDO |---. | ||
+ | TDI < | ||
+ | |||
+ | Die Befehls- und Taktleitung (TMS, TCK) liegt an allen Chips parallel an, was bedeutet das immer alle den gleichen Betriebszustand einnehmen werden. | ||
+ | |||
+ | == Daten an TDI einlesen == | ||
+ | |||
+ | Die Norm definiert das der Logikpegel (Bit) von TDI bei der steigenden Flanke von TCK in das Schieberegister übernommen wird. Solange TCK also ' | ||
+ | digitalWrite(TCK, | ||
+ | digitalWrite(TCK, | ||
+ | bit = digitalRead(TDI); | ||
+ | data = (data << 1) & bit; | ||
+ | </ | ||
+ | |||
+ | == Daten auf TDO senden == | ||
+ | |||
+ | Bei der fallenden Flanke von TCK wird das nächste Bit vom Schieberegister an TDO ausgegeben. | ||
+ | |||
+ | <code c> | ||
+ | digitalWrite(TCK, | ||
+ | bit = data & 1; | ||
+ | digitalWrite(TDO, | ||
+ | digitalWrite(TCK, | ||
+ | data >> 1; | ||
+ | </ | ||
+ | |||
+ | == Daten auf TMS senden == | ||
+ | |||
+ | TMS ist unidirektional, | ||
+ | |||
+ | <code c> | ||
+ | bit = x; // 0 oder 1 | ||
+ | digitalWrite(TCK, | ||
+ | digitalWrite(TMS, | ||
+ | digitalWrite(TCK, | ||
+ | </ | ||
+ | |||
+ | == Welche Betriebszustände kennt der JTAG-Controller und wozu dienen diese? == | ||
+ | |||
+ | Nach dem einschalten befindet sich der JTAG-Controller | ||
+ | |||
+ | In diesem Zustand passiert JTAG-mäßig einfach nichts. Der Chip macht was er will oder soll ohne das wir darauf Einfluß nehmen. Eine Statemachine beschreibt die stabilen Zustände und den Übergang dort hin. (Nerd-Wissen ...) | ||
+ | |||
+ | Für uns ist wichtig, das man über TMS den Controller dazu veranlassen kann, entweder das Datenregister ('' | ||
+ | |||
+ | Die JTAG-Norm definiert hier nur wenige: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Darüber hinaus unterstützen manche Chips auch noch diese: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | Will man also nur die Daten eines bestimmten Chips lesen oder schreiben, muss man wissen an welcher Stelle der Chain sich dieser befindet. | ||
- | Die Kommunikation erfolgt seriell. Über den TDI-Pin des Chips werden Daten von außen | + | Mit JTAG kann man mehr als einen Chip verbinden. Diese sind dabei datentechnisch |
- | In einer JTAG-Chain ist der TDO-Pin eines Chips mit dem TDI des nächsten verbunden. So ergibt sich eine Kette. Im Chip selbst wird zwischen TDI und TDO ein Schieberegister verbunden. Bei jedem Taktübergang wird ein Bit vom TDI in das Register geschoben und ein Bit aus diesem an den TDO gelegt. An allen Chips der Chain liegt das TCK-Signal parallel an. Somit ergibt sich ein großes, langes Schieberegister: | ||
- | TDO ----> | + | 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, |
- | TDI < | + | |
- | Wozu die Bits im Schieberegister dienen und wie " | + | 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. |
- | == Der Betriebsmodus | + | ===== Anzahl |
- | Hierzu muss man wissen das das TMS-Signal parallel an allen Chips der JTAG-Chain anliegt. Man stellt damit also den Betriebsmodus von JEDEM Chip ein. Der Modus wird seriell eingestellt. Über den TMS ist eine Statemachine verbunden. Ausgehend von einem Betriebszustand wird eine Folge von Bits einen anderen Betriebszustand wählen. | + | Es gilt als erstes herauszufinden wieviele |
Nach dem einschalten des Chips befindet sich der Controller im Zustand " | Nach dem einschalten des Chips befindet sich der Controller im Zustand " |