Flashen von Multichips mit JTAG mit openocd

Ich bin Neuling auf diesem Gebiet. Meine Aufgabe ist es, 6 Geräte mit JTAG wie im Bild unten zu flashen. Ich bin derzeit erfolgreich mit dem Flashen eines Geräts. Kann mir jemand einen Rat geben, wie ich alle 6 Geräte flashen kann? Soweit ich weiß, befinden sich andere im BYPASS-Modus, wenn ein Gerät geflasht wird, oder? Wie kann ich dann die Geräte steuern? Nur für den Fall, dass beim Flashen von 6 Geräten eines ausfällt, kann ich wissen, welches ausfällt, und es erneut flashen. Wenn Sie können, erklären Sie mir bitte, dass ich ein 5-jähriger Junge wäre, was sehr hilfreich wäre.Geben Sie hier die Bildbeschreibung ein

Bearbeitet 1: Dies sind meine 2 Konfigurationsdateien.

source [find target/kinetis_generic.cfg]

$_TARGETNAME configure -event reset-init {}

flash bank pflash.0 kinetis 0x00000000 0x20000 0 4 $_TARGETNAME

proc program_device () {
 # halt the processor
 halt
 wait_halt
 # write file to flash memory
 poll
 flash probe 0
 flash write_image erase unlock "C:\\Users\\tung\\Desktop\\flash program\\OpenOCD-20170821\\sa2_can_195_init_boot&device.srec" 0x00000000
 #start execution of the program just downladed
 reset run
 #exit OpenOCD
 shutdown
}
init
reset init
program_device ()

Und

source [find target/swj-dp.tcl]

if { [info exists CHIPNAME] } {
    set _CHIPNAME $CHIPNAME
} else {
    set _CHIPNAME kinetis
}

if { [info exists ENDIAN] } {
    set _ENDIAN $ENDIAN
} else {
    set _ENDIAN little
}

if { [info exists CPUTAPID] } {
    set _CPUTAPID $CPUTAPID
} else {
    set _CPUTAPID 0x4ba00477
}


set _TARGETNAME $_CHIPNAME.cpu

swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

target create $_TARGETNAME cortex_m -chain-position $_CHIPNAME.cpu

$_CHIPNAME.cpu configure -event examine-start { puts "START..." ; }
$_CHIPNAME.cpu configure -event examine-end { puts "END..." ; }

# if srst is not fitted use SYSRESETREQ to
# perform a soft reset
cortex_m reset_config sysresetreq

Antworten (1)

Wenn Sie das IR eines Geräts auf BYPASS einstellen, wird es ein Ein-Bit-Register ohne CAPTURE- und UPDATE-Aktionen auf DR abbilden.

Das IR hat eine feste Länge, nehmen wir zwei Bit an:

00 BOUNDARY-SCAN
01 IDCODE
10 PROGRAM
11 BYPASS

Nehmen Sie weiter an, dass die PROGRAM-Kette 16 Bits hat, dann könnten Sie das erste Gerät mit Programmierdaten p durch Senden programmieren ( xbedeutet, dass das Bit ignoriert wird).

IR
11 11 11 11 11 10

DR
x x x x x pppppppppppppppp

DR
x x x x x pppppppppppppppp

Das zweite Gerät kann durch Senden adressiert werden

IR
11 11 11 11 10 11

DR
x x x x pppppppppppppppp x

usw. Sie fügen also einfach jedem verschobenen IR und DR ein festes Präfix und Suffix hinzu.

Bei fortgeschrittenen Steuerungen ist es möglich, mehrere Geräte auf einmal zu programmieren:

IR
10 10 11 11 11 11

DR
pppppppppppppppp pppppppppppppppp x x x x

Das könnte etwas Zeit sparen, aber AFAIK ist dies nicht für OpenOCD implementiert.

Bearbeiten: Der wahrscheinlich einfachste Weg, dies mit OpenOCD zu tun, besteht darin, die Scankette so zu beschreiben, wie sie ist:

for { set i 1 } { $i <= 6 } { incr i } {
    jtag newtap [string cat $_CHIPNAME $i] cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
    target create [string cat $_TARGETNAME $i] cortex_m -chain-position [string cat $_CHIPNAME $i].cpu
    [string cat $_CHIPNAME $i].cpu configure -event examine-start { puts "START..." ; }
    [string cat $_CHIPNAME $i].cpu configure -event examine-end { puts "END..." ; }
}
for { set i 1 } { $i <= 6 } { incr i } {
    flash bank pflash.$i kinetis 0x00000000 0x20000 0 4 [string cat $_CHIPNAME $i]
}

Der jtag newtapBefehl ist der Hauptteil der swj_newdapFunktion – Ihre Scan-Kette funktioniert nicht mit SWD, also können Sie das der Übersichtlichkeit halber einbetten und den sourceBefehl oben löschen, da dies dann unnötig wird.

Die Schleife erstellt sechs Ziele mit angehängten Nummern und stellt ihren Blitz auf separaten Bänken zur Verfügung. Das Setup der Flash-Bank befindet sich in einer separaten Schleife, sodass die Konfiguration der Scan-Kette bereits an dieser Stelle korrekt ist (ich glaube, bis zum Befehl werden keine Daten gesendet probe, aber gehen Sie besser auf Nummer sicher). Der flash banksBefehl sollte alle anzeigen.

Sie können dann eine weitere Schleife oder separate Befehle verwenden, um die einzelnen Flash-Dateien zu schreiben.

vielen Dank für die Antwort, aber ich verstehe es immer noch nicht. Wie kann ich IR auf BYPASS stellen? ich habe meinen Beitrag editiert. Sie sind meine Konfigurationsdatei. Kannst du dir die bitte mal anschauen?
Aus privaten Gründen muss ich dieses Projekt um mehr als 2 Monate verschieben. Ich habe gerade letzte Woche damit angefangen und Ihre Hilfe war wirklich großartig. Aber wenn ich anfange, Geräte zu flashen, ist nur 1 Gerät programmiert. Bitte schau mal hier @Simon