Wie kann ich mit einem USBWiggler von einer CPU lesen / schreiben?

Lesen der Macraigor-API für den usbWiggler

MacraigorApi_JtagScanIO

BOOLEAN_TYPE MacraigorApi_JTAGScanIO(
                               char *shift_register,
                               unsigned_int length_in_bits,
                               MEMORY_BUFFER_TYPE *data_in_ptr,
                               MEMORY_BUFFER_TYPE *data_out_ptr)

Verwenden Sie JTAG, um den im Array enthaltenen Bitstrom *data_in_ptrzum shift_registerder aktuell ausgewählten CPU zu scannen und gleichzeitig die von der CPU im *data_out_ptrArray ankommenden Bits zu sammeln, wobei die CPU am Ende der Operation im Zustand "RunTestidle" verbleibt. Gibt TRUE zurück, wenn Befehl erfolgreich abgeschlossen

shift_register["IR"/"DR"] - Zielschieberegister (IR= JTAG-Befehlsregister, DR= JTAG-Datenregister

length_in_bits[1 - ... ] Anzahl von Bits, die in/aus der CPU verschoben werden sollen

data_in_ptrZeiger auf Array mit den in die CPU zu schiebenden Bits im Format [8,7,6,5,4,3,2,1,0] [15,14,13,12,11,10,9, 8] ... wobei am Ende der Abtastoperation Bit O das Bit ist, das SDO am nächsten ist, und Bit N das Bit ist, das SDI am nächsten ist

data_out_ptrZeiger auf ein Array, das ein von der CPU eingescanntes Bit im gleichen Format wie data_in_ptr enthält, wobei das Bit-Byte Obit O das erste von der CPU eingescannte Bit enthält

Ich bin mir nicht sicher, ob ich diese Beschreibung klar verstehe. Also habe ich beim Spielen mit dem C++- Code und Cortex M3 Folgendes gemacht:

int scanBits = 0x292;
unsigned char data_in[256];
unsigned char *data_in_ptr = &data_in[0];
unsigned char data_out[256];
unsigned char *data_out_ptr = &data_out[0];
MacraigorApi_JTAGScanIO("DR",
                        scanBits, 
                        (MEMORY_BUFFER_TYPE *)data_in_ptr,
                        (MEMORY_BUFFER_TYPE *)data_out_ptr);

Und das data_out_ptrzeigte mir ein Ergebnis wie dieses:

1110010001001111111111111111111111111111111001001101001010101010011001
0010110000000000000000000000000000000000000000001100011111110100110111
1110111111011111101111000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000100110000010001001111101010100
0010000110000000100000010001001110001001000000001000000100010011111101
1100011100000000000011000111111101000110000000000000110001111111010011
1100000000000000000000000000000000001000000001000000100010101001010100
0000000000001100011111110011011100000000010000101010101011100001111111
0000000000100000000101100011000010100000000001100011111110011001100000
000000000000000000000000000000000000000000101000100111110010000

Kann mir jemand in einfacheren Worten erklären, was diese API- Beschreibung bedeutet? Ich bin neu auf diesem Gebiet, daher ist mir ein Großteil des Jargons hier nicht so klar.

Außerdem bin ich etwas verwirrt, wie kann ich aus diesem Bitstrom herausfinden , welche Daten sich auf einer X- Adresse befanden ?

Von welcher CPU schreibst du in den JTAG? Dadurch werden die legalen IR-Staaten bestimmt, in denen Sie die DR-Scans besser verstehen können.
@SeanHoulihane Cortex M3

Antworten (1)

Der Cortex M3 wird fast immer mit einem CoreSight-DAP implementiert, der den ewigen Debug-Port bereitstellt. Vereinfacht gesagt verwenden Sie den JTAG, um Steuerregister im DAP festzulegen, und der DAP führt speicherabgebildete Zugriffe auf den SoC durch, um Ihre Anforderungen zu implementieren.

Die IR-Werte sind im CoreSight Component TRM dokumentiert . Dies ist effektiv die erste Ebene der Adressierung. Bei DP-Zugriffen können Sie das AP-Select-Register setzen. AP-Zugriffe ermöglichen es Ihnen, das Übertragungsadressenregister einzustellen und Lese- und Schreibvorgänge durchzuführen.

Denken Sie daran, dass Sie für einen Lesevorgang den Lesevorgang anfordern und dann eine weitere Transaktion ausgeben müssen, um das Ergebnis abzurufen – die On-Chip-Zugriffe erfolgen asynchron zur JTAG-Transaktion. Sie würden dann APACC-Adresse, APACC-Lesen, APACC-Ergebnis für eine einzelne 32-Bit-Speichertransaktion sehen.

Auf der API-Ebene möchten Sie möglicherweise eine Abstraktionsebene hinzufügen. Das Umschalten zwischen CoreSight APACCund DPACCerfordert das Verschieben einer 6-Bit-Zeichenfolge in das Befehlsregister, aber sobald die DP-Register initialisiert sind, müssen die meisten Transaktionen nur den APACCBefehlsregisterstatus mit einer 35-Bit-Nutzlast verwenden.

Ihr Strom von APACC-Transaktionen verwendet Datenbits [1:0] als Adresse für die AP-Register, Bit 2 als Lese-/Schreibzugriff und [35:3] als Nutzlast.

Eine der DPACC-Transaktionen (ausgewählt durch die ersten 2 DR-Bitwerte als Adresse) ist ein statisches ID-Register, Sie sollten sicherstellen, dass dies das tut, was Sie erwarten, bevor Sie versuchen, etwas Komplexeres zu tun.

Dieses Übersichts- Whitepaper enthält eine etwas ausführlichere Beschreibung der Debug-Verbindungen (ab Seite 8).

DP    //Debug port (JTAG or Serial wire, external interface)   
AP    //Access Port (APB in this case, on-chip bus master)   
DPACC //JTAG state, transactions are handled by the DP (r/w with 2 bit address)   
APACC //JTAG state, transactions are handled by the AP (r/w with 2 bit address)
Danke. Ich versuche zu verstehen, was Sie sagen, indem ich zuerst all diese Abkürzungen verstehe, die Sie mir vorgestellt haben. Google ist nicht so freundlich, wenn es darum geht, die Bedeutung dieser technischen Abkürzungen zu finden. Außerdem versuche ich, dies mit dem Code zu verbinden, den ich schreiben/bearbeiten möchte. Irgendeine Idee, wie das, was Sie gesagt haben, mit der Macraigor-API in Code übersetzt würde.
Etwas detaillierter hinzugefügt, die beiden von mir verlinkten Dokumente sollten einige technische Hintergrundinformationen liefern.