- probe device: Olimex ARM-USB-OCD-H
- target device: Raspberry Pi 2
- host machine: Ubuntu 15.04
openocd-0.9.0
as debugger host:- probe device driver:
libftd2xx1.1.12
- probe device configuration:
olimex-arm-usb-ocd-h.cfg
(@see below) - target device configuration:
openocd-rpi2.cfg
(@see below)
- probe device driver:
- debug client:
telnet
orgdb
- pin assign between
Olimex ARM-USB-OCD-H
andRaspberry Pi 2
This method is obsolete. By openocd warning message, you should use libftdi.
- download FTDI proprietary D2XX driver for linux from here
- installation guide is here
- extract to ./libftd2xx1.1.12/
- (optional) locate libraries to /usr/local/lib/
sudo cp libftd2xx1.1.12/build/x86_64/libftd2xx.a /usr/local/lib/
sudo cp libftd2xx1.1.12/build/x86_64/libtd2xx.so.1.1.12 /usr/local/lib/
sudo ln -s /usr/local/lib/libtd2xx.so.1.1.12 /usr/local/lib/libftd2xx.so
sudo chmod 0755 /usr/local/lib/libtd2xx.so.1.1.12
Download "openocd-0.9.0 release" from here
$ cd openocd-0.9.0
$ ./configure --enable-maintainer-mode --enable-legacy-ft2232_ftd2xx --with-ftd2xx-lib=static --with-ftd2xx-linux-tardir=../libftd2xx1.1.12
--- src/Makefile.org 2015-07-16 17:51:11.333497970 +0900
+++ src/Makefile 2015-07-16 17:52:06.797236301 +0900
@@ -275,11 +275,11 @@
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = -L/home/tono/OpenOCD/libftd2xx1.1.12/build/x86_64
+LDFLAGS = -L/home/tono/OpenOCD/libftd2xx1.1.12/build/x86_64 -L/lib64
LIBFTDI_CFLAGS =
LIBFTDI_LIBS =
LIBOBJS =
-LIBS = -lftd2xx -lrt -ldl
+LIBS = -lftd2xx -lrt -ldl -lpthread
LIBTOOL = $(SHELL) $(top_builddir)/libtool
LIBTOOL_DEPS = ./ltmain.sh
LIBUSB0_CFLAGS =
$ ldd openocd-0.9.0/src/openocd
linux-vdso.so.1 => (0x00007ffc599bc000)
libusb-0.1.so.4 => /lib/x86_64-linux-gnu/libusb-0.1.so.4 (0x00007f5dace03000)
libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0 (0x00007f5dacbeb000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5dac8e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5dac6df000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5dac4c1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5dac0f7000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f5dabee4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5dad00c000)
# Olimex ARM-USB-OCD-H
# http://www.olimex.com/dev/arm-usb-ocd-h.html
interface ft2232
ft2232_device_desc "Olimex OpenOCD JTAG ARM-USB-OCD-H"
ft2232_layout olimex-jtag
ft2232_vid_pid 0x15ba 0x002b
from here Thanks jitomesky! I bought your book!
# ref: http://www.raspberrypi.org/forums/viewtopic.php?f=72&t=100268
# : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0464f/ch10s06s01.html
adapter_khz 1000
adapter_nsrst_delay 400
reset_config none
gdb_breakpoint_override hard
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME rpi2
}
#
# Main DAP
#
if { [info exists DAP_TAPID] } {
set _DAP_TAPID $DAP_TAPID
} else {
set _DAP_TAPID 0x4ba00477
}
jtag newtap $_CHIPNAME dap -irlen 4 -ircapture 0x01 -irmask 0xf -expected-id $_DAP_TAPID
set _TARGETNAME $_CHIPNAME.cpu.0
target create $_TARGETNAME cortex_a -chain-position $_CHIPNAME.dap -coreid 0 -dbgbase 0x80010000
set _TARGETNAME $_CHIPNAME.cpu.1
target create $_TARGETNAME cortex_a -chain-position $_CHIPNAME.dap -coreid 1 -dbgbase 0x80012000
set _TARGETNAME $_CHIPNAME.cpu.2
target create $_TARGETNAME cortex_a -chain-position $_CHIPNAME.dap -coreid 2 -dbgbase 0x80014000
set _TARGETNAME $_CHIPNAME.cpu.3
target create $_TARGETNAME cortex_a -chain-position $_CHIPNAME.dap -coreid 3 -dbgbase 0x80016000
$_TARGETNAME configure -event reset-assert-post "cortex_a dbginit"
$_TARGETNAME configure -event gdb-attach { halt }
$ rmmod ftdi_sio usbserial
$ sudo src/openocd -f olimex-arm-usb-ocd-h.cfg -f openocd-rpi2.cfg
[sudo] password for tono:
Open On-Chip Debugger 0.9.0 (2015-07-16-17:40)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
adapter_nsrst_delay: 400
none separate
Warn : Using DEPRECATED interface driver 'ft2232'
Info : Consider using the 'ftdi' interface driver, with configuration files in interface/ftdi/...
Info : device: 6 "2232H"
Info : deviceID: 364511275
Info : SerialNumber: OLYPBH2QA
Info : Description: Olimex OpenOCD JTAG ARM-USB-OCD-H A
Info : max TCK change to: 30000 kHz
Info : clock speed 1000 kHz
Info : JTAG tap: rpi2.dap tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : rpi2.cpu.0: hardware has 6 breakpoints, 4 watchpoints
Info : rpi2.cpu.1: hardware has 6 breakpoints, 4 watchpoints
Info : rpi2.cpu.2: hardware has 6 breakpoints, 4 watchpoints
Info : rpi2.cpu.3: hardware has 6 breakpoints, 4 watchpoints
Now connection established, you can see the brinking LED on top of ARM-USB-OCD-H.
open another terminal
$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> halt
ttbcr 0ttbr0 ca5eaa5attbr1 fd7c7f73
rpi2.cpu.3 rev 5, partnum c07, arch f, variant 0, implementor 41
number of cache level 2
cache l2 present :not supported
rpi2.cpu.3 cluster f core 3 multi core
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x600001d3 pc: 0x000000c4
MMU: disabled, D-Cache: disabled, I-Cache: disabled
Download gcc-arm-none-eabi-4_9-2015q1-20150306-linux.tar.bz2 or later from here .
[Solved] Issue: Out of GDB control after enabling MMU with Stage 2 TLB mapping
I have lost GDB debugging control after
isb
ordsb
instruction.Solution
Add a line
gdb_breakpoint_override hard
toopenocd-rpi2.cfg
(config file for openocd).See detail "Conjecture 3".
Conjecture 1: Some configuration about instruction fetching cause
BUSTED 👎
OpenOCD error message says data about occured.
I guessed this might be caused by using memory mapped debug registers.
Table C6-9 v7 Debug memory-mapped and external debug interfaces access behavior (p. C6-2136)
Table C6-14 v7.1 Debug memory-mapped and external debug interfaces access behavior
OpenOCD access routine @openocd-0.9.0/src/target/cortex_a.c:495
Conjecture 2: Memory mapped DAP registers can't access from OpenOCD
BUSTED 👎
DAP(0xc0010000, 0xc0012000, 0xc0014000, 0xc0016000) described in
openocd-rpi2.cfg
are VideoCore's bus-address, not ARM side physical address.But, JTAG might use peripheral via ARM physical memory range 0x3f000000 to 0x3fffffff(VideoCore map that range to peripheral bus addresses 0x7e000000 to 0x7effffff).
Investigate this hypothesis in next comment.
Info: need appropriate flush TLB while debugging
C11.11.21 DBGDSMCR, Debug State MMU Control Register (p. C11-2259)
Therefore some debugger disable outer(L2) cache.
Info: What about
isb
doesIn this context,
isb
means:DDI0406C_C_arm_architecture_reference_manual.pdf (p. A3-153)
Conjecture 3: gdb
step
command using rewrite instruction cause broken cache coherency.From openocd debug log message with
-d 3
option.Otherwise, according to
cortex_a.c
it looks like using hardware break point.GDB 'step' packet reqired
BKPT_SOFT
.The key for solution is
gdb_breakpoint_override_type
.gdb_breakpoint_override_type@openocd-0.9.0/src/server/gdb_server.c#L1583
Add a line to
openocd-rpi2.cfg
(config file for openocd).Thus, now
step
working with hardware breakpoint.Conjecture 4:
OpenOCD(=gdbserver) does not recognize that Hypervisor MMU has been enabled.
In this current situation, this matter does not affect the function of
step
.Because, we have just set the hypervisor level1 TLB to straight map between virtual address and physical address.
However, by another aspects if we have different mapping between virtual and physical then we should treat properly the status of hypervisor MMU.