Flasheo de múltiples chips con JTAG usando openocd

1

Soy novato en este campo. Mi tarea es que tengo que flashear 6 dispositivos con JTAG como en la imagen de abajo. Actualmente estoy teniendo éxito con flashear un dispositivo. ¿Alguien me puede dar consejos sobre cómo flashear los 6 dispositivos? Según tengo entendido, cuando un dispositivo se está flasheando, otro estará en modo BYPASS, ¿verdad? Entonces, ¿cómo puedo controlar los dispositivos? En caso de que al destellar 6 dispositivos y uno de ellos falle, puedo saber cuál de ellos falla y volver a flashearlo. Si puede, por favor explíqueme que soy un niño de 5 años sería muy útil.

Editado 1: Estos son mis 2 archivos de configuración.

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 ()

y

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
    
pregunta Tùng Bill

1 respuesta

1

Cuando configura el IR de un dispositivo en BYPASS, asignará un registro de un bit sin acciones de CAPTURA y ACTUALIZACIÓN a DR.

El IR tiene una longitud fija, asumamos dos bits:

00 BOUNDARY-SCAN
01 IDCODE
10 PROGRAM
11 BYPASS

Además, suponga que la cadena PROGRAM tiene 16 bits, entonces podría programar el primer dispositivo con datos de programación p enviando ( x significa que el bit se ignora)

IR
11 11 11 11 11 10

DR
x x x x x pppppppppppppppp

DR
x x x x x pppppppppppppppp

El segundo dispositivo puede direccionarse enviando

IR
11 11 11 11 10 11

DR
x x x x pppppppppppppppp x

y así sucesivamente. Por lo tanto, solo agrega un prefijo fijo y un sufijo a cada IR y DR desplazado.

Con los controladores avanzados, puede ser posible programar múltiples dispositivos de una sola vez:

IR
10 10 11 11 11 11

DR
pppppppppppppppp pppppppppppppppp x x x x

Eso puede ahorrar un poco de tiempo, pero AFAIK no está implementado para OpenOCD.

Editar: Probablemente la forma más fácil de hacer esto con OpenOCD es describir la cadena de escaneo tal como está:

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]
}

El comando jtag newtap es el cuerpo de la función swj_newdap : su cadena de escaneo no funciona con SWD, por lo que puede alinear eso para mayor claridad y eliminar el comando source en la parte superior, ya que se vuelve innecesario entonces.

El bucle crea seis objetivos, con números adjuntos, y hace que su flash esté disponible en bancos separados. La configuración del banco flash se encuentra en un bucle separado, por lo que la configuración de la cadena de exploración ya es correcta en este punto (creo que no se envían datos hasta el comando probe , pero es mejor estar seguro). El comando flash banks debería mostrarlos todos.

Luego puedes usar otro bucle, o comandos separados para escribir los archivos flash individuales.

    
respondido por el Simon Richter

Lea otras preguntas en las etiquetas