Tengo una RPI 2 que quiero usar para programar y depurar una RPI modelo B sobre JTAG para un proyecto de bare metal. Ahora mismo estoy teniendo problemas para conseguir que las dos placas se comuniquen entre sí a través de JTAG.
Configuré el objetivo del modelo B según http://sysprogs.com/VisualKernel/tutorials/raspberry/jtagsetup/ y ejecutó su programa para habilitar los pines JTAG en el cabezal. También proporcionan un archivo de destino raspberry.cfg para usar en ese sitio.
También construí OpenOCD 0.9.0 desde el código fuente en el host RPI 2 para hacer ssh en él y utilizarlo como una interfaz JTAG. Descomenté la línea en interface/raspberrypi2-native.cfg que especifica los pines JTAG para que openocd los utilice. Entonces conecté los pines JTAG de la RPI2 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 así:
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)
He iniciado openocd con $openocd -f interface/raspberrypi2-native.cfg -f target/raspberry.cfg
Sin embargo, recibí la respuesta:
Open On-Chip Debugger 0.10.0-dev-00329-gf19ac83 (2016-07-31-05:57)
Licenciado bajo GNU GPL v2
Para los informes de errores, lea
http://openocd.org/doc/doxygen/bugs.html
BCM2835 GPIO config: tck = 11, tms = 25, tdi = 10, tdo = 9
BCM2835 GPIO nums: swclk = 25, swdio = 24
BCM2835 GPIO config: srst = 18
srst_only separate srst_gates_jtag srst_push_pull connect_deassert_srst
velocidad del adaptador: 1000 kHz
ninguno por separado
raspi.arm
Información : BCM2835 GPIO JTAG/SWD bitbang driver
Información : Modos JTAG y SWD habilitados
Información : velocidad del reloj 1001 kHz
Error: La interrogación de la cadena de escaneo JTAG falló: todos los unos
Error: Compruebe la interfaz JTAG, los tiempos, la potencia del objetivo, etc.
Error: Intentando utilizar la cadena de exploración configurada de todas formas...
Error: raspi.arm: Error de captura IR; vio 0x1f no 0x01
Warn : Evitar los eventos de configuración JTAG debido a errores
Error: 'arm11 target' JTAG error SCREG OUT 0x1f
Error: código de identificación ARM11 inesperado
He estado trasteando con los .cfg del objetivo y de la interfaz y comprobando tres veces el cableado para saber por qué da errores, pero aún no he tenido éxito. Intenté brevemente que el RPI2 se conectara a una placa STM32F3 Discovery que tenía por ahí, para ver si podía determinar que openocd funcionaba en el RPI2 y que el error era culpa del Modelo B, pero tampoco funcionó (obtuve errores de sintaxis en los cfg de ST-LinkV2 que venían con OpenOCD, así que desistí porque parecía otra lata de gusanos). No estoy seguro de qué más probar para conseguir que JTAG se inicie y se conecte correctamente. ¿Alguien sabe qué estoy haciendo mal?
Para completar, aquí está el interface/raspberrypi2-native.cfg, con el que he estado jugueteando 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 target/raspberry.cfg para el dispositivo objetivo 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