Cómo usar RPI 2 para depurar RPI modelo B a través de JTAG con OpenOCD

Tengo un RPI 2 que quiero usar para programar y depurar un modelo B de RPI sobre JTAG para un proyecto completo. En este momento tengo problemas para que las dos placas se comuniquen entre sí a través de JTAG.

Configuré el objetivo del modelo B de acuerdo con http://sysprogs.com/VisualKernel/tutorials/raspberry/jtagsetup/ y ejecuté su programa para habilitar los pines JTAG en el encabezado. También proporcionan un archivo de destino raspberry.cfg para usar en ese sitio.

También construí OpenOCD 0.9.0 desde la fuente en el host RPI 2 para acceder a él y usarlo como una interfaz JTAG. Descomenté la línea en interface/raspberrypi2-native.cfg que especifica los pines JTAG para que openocd los use. Luego conecté los pines RPI2 JTAG en interface/raspberrypi2-native.cfg a los pines configurados en modo JTAG en el Modelo B por el programa sysprogs.com con cables de puente como este:

TCK: Pin 22 (Model B) -> Pin 23 (RPI2)
TMS: Pin 13 (Model B) -> Pin 22 (RPI2)
TDI: Pin 7 (Model B) -> Pin 19 (RPI2)
TDO: Pin 19 (Model B) -> Pin 21 (RPI2)
GND: Pin 20 (Model B) -> Pin 20 (RPI2)

Empecé con openocd $openocd -f interface/raspberrypi2-native.cfg -f target/raspberry.cfg, sin embargo obtuve la respuesta:

Open On-Chip Debugger 0.10.0-dev-00329-gf19ac83 (2016-07-31-05:57)
Licenciado bajo GNU GPL v2
Para informes de errores, lea
http://openocd.org/doc/doxygen/bugs.html
BCM2835 Configuración de GPIO: tck = 11, tms = 25, tdi = 10, tdo = 9
BCM2835 Números de GPIO: swclk = 25, swdio = 24 BCM2835 Configuración
de GPIO: srst = 18
srst_only por separado srst_gates_jtag srst_push_pull connect_deass speedert_s
100kHz
por separado
.arm
Info : BCM2835 GPIO JTAG/SWD bitbang driver
Info : Modos JTAG y SWD habilitados
Info : velocidad de reloj 1001 kHz
Error: Interrogación de la cadena de escaneo JTAG falló: todos los errores
Error: Verifique la interfaz JTAG, los tiempos, la potencia del objetivo, etc.
Error: Intentando usar la cadena de escaneo configurada de todos modos...
Error: raspi.arm: error de captura IR; vio 0x1f no 0x01
Advertencia: omisión de eventos de configuración de JTAG debido a errores
Error: error JTAG 'arm11 target' SCREG OUT 0x1f
Error: código de identificación ARM11 inesperado

Estuve jugando con el objetivo y la interfaz .cfg y revisé tres veces el cableado para averiguar por qué arroja errores, pero aún no he tenido éxito. Intenté brevemente que el RPI2 se conectara a una placa Discovery STM32F3 que tenía, para ver si podía determinar que openocd estaba funcionando en el RPI2 y que el error era culpa del Modelo B, pero eso tampoco funcionó (obtuve errores de sintaxis en los cfgs ST-LinkV2 que venían con OpenOCD, así que me di por vencido porque parecía otra lata de gusanos). No estoy seguro de qué más intentar para que JTAG se inicie y se conecte correctamente. ¿Alguien sabe lo que estoy haciendo mal?

Para completar, aquí está la interfaz/raspberrypi2-native.cfg, con la que he estado jugando para intentar que funcione. La versión original viene con OpenOCD.

#
# Config for using Raspberry Pi's expansion header
#
# This is best used with a fast enough buffer but also
# is suitable for direct connection if the target voltage
# matches RPi's 3.3V and the cable is short enough.
#
# Do not forget the GND connection, pin 6 of the expansion header.
#

interface bcm2835gpio

# needed for oocd to jtag a rpi 1 model b, but breaks stm32f3 discovery support
#adapter_khz 1000
#transport select jtag 

bcm2835gpio_peripheral_base 0x3F000000

# Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET
# These depend on system clock, calibrated for stock 700MHz
# bcm2835gpio_speed SPEED_COEFF SPEED_OFFSET
bcm2835gpio_speed_coeffs 146203 36

# Each of the JTAG lines need a gpio number set: tck tms tdi tdo
# Header pin numbers: 23 22 19 21
bcm2835gpio_jtag_nums 11 25 10 9

# or if you have both connected,
# reset_config trst_and_srst srst_push_pull

# Each of the SWD lines need a gpio number set: swclk swdio
# Header pin numbers: 22 18
bcm2835gpio_swd_nums 25 24

# If you define trst or srst, use appropriate reset_config
# Header pin numbers: TRST - 26, SRST - 18

# bcm2835gpio_trst_num 7
# reset_config trst_only

bcm2835gpio_srst_num 18
reset_config srst_only srst_push_pull

# or if you have both connected,
# reset_config trst_and_srst srst_push_pull

Y aquí está el archivo target/raspberry.cfg para el dispositivo de destino del modelo B, proporcionado por sysprogs.com; no ha sido modificado IIRC:

# Broadcom 2835 on Raspberry Pi

telnet_port 4444

gdb_port 5555

#tcl_port 0
adapter_khz 1000
transport select jtag

if { [info exists CHIPNAME] } {
    set  _CHIPNAME $CHIPNAME
} else {
    set  _CHIPNAME raspi
}
    reset_config none

if { [info exists CPU_TAPID ] } {
    set _CPU_TAPID $CPU_TAPID
    } else {
        set _CPU_TAPID 0x07b7617F
    }

    jtag newtap $_CHIPNAME arm -irlen 5 -expected-id $_CPU_TAPID

            set _TARGETNAME $_CHIPNAME.arm

    target create $_TARGETNAME arm11 -chain-position $_TARGETNAME
Con respecto a su experimento paralelo, no creo que deba usar "ST-LinkV2 cfgs" para apuntar a un STM32 cuando su adaptador no es un ST-LINK, más bien use la versión simple para su chip de prueba de interés - y prueba la configuración del adaptador fue una buena idea. Acabo de verificar que stm32f3x.cfg funciona, al menos en la versión 10.

Respuestas (1)

Hmm, mirando tu pinout,

TDO: Pin 19 (Model B) -> Pin 21 (RPI2)

TDO es el pin 18 o el pin 29, pero no el pin 19.