目的
Raspberry Pi 3B+ と Olimex ARM-USB-OCD-H を接続してデバッグできるようにする
設定するもの
- ホストPC(Ubuntu 20.04.4 LTS)
- ターゲット(Raspberry Pi 3B+)
- デバッガ(ARM-USB-OCD-H)
Olimex ARM-USB-OCD-Hとは
2V未満の用途にも使いたいのでこれを選びました。価格は、税込み7700円。
ホストPC
OpenOCDのインストール
パッケージは0.10系なので、0.11系のソースコードをダウンロードしてインストールしました。
$ git clone https://git.code.sf.net/p/openocd/code openocd-code
ビルドに必要なライブラリをインストールします。
$ sudo apt-get install libusb-1.0.0-dev libftdi-dev
ビルドします。configureのオプションはちゃんと調べず適当です。
$ cd openocd-code
$ ./bootstrap
$ ./configure --prefix=/opt/openocd --enable-ftdi --enable-armjtagew --enable-bcm2835gpio
$ make -j8
$ sudo make install
/opt/openocd/bin
を PATH
に追加しておきます。
udevの設定
一般ユーザでデバイスにアクセスできるように以下の設定をします。
$ sudo vi /etc/udev/rules.d/99-openocd.rules
中身は以下
SUBSYSTEM=="usb", ATTR{idVendor}=="15ba", ATTR{idProduct}="002b", MODE="0666"
ターゲットの設定
あらかじめSDカードにRaspbianをインストールしています。
/boot/config.txtに以下の設定を追加します。ホストPCでSDカードをマウントして編集でもよいし、RaspberryPiを起動して編集でも良いです。私はJTAGとは別にUARTもつないでいるので以下の設定になっています。
[all]
enable_uart=1
uart_2ndstage=1
enable_jtag_gpio=1
ターゲットとデバッガの接続(私のハマりポイント)
下図は、デバッガ本体のピン配置です。今回私はリボンケーブルとターゲットを接続したので、左右を入れ替える必要がありました(ここでハマった)。
ターゲット本体のピン配置は以下を参照しました。
Host | Target (コネクタを右側にしたときの場所) |
---|---|
1 VREF | GPIO-17(上から9番目左) |
3 TRST | GPIO-22(上から8番目左) |
5 TDI | GPIO-26(下から2番目左) |
7 TMS | GPIO-27(上から7番目左) |
9 TCK | GPIO-25(上から11番目右) |
11 RTCK | GPIO-23(上から8番目右) |
13 TDO | GPIO-24(上から9番目右) |
18 GND | Ground(下から1番目左など) |
結果こんな感じです。
別角度から。
起動
ターゲットに電源を投入後、デバッガをホストにUSB接続します。
ホストで以下のコマンドを実行します。
$ openocd -f /opt/openocd/share/openocd/scripts/interface/ftdi/olimex-arm-usb-ocd-h.cfg -f /opt/openocd/share/openocd/scripts/target/bcm2837.cfg
Open On-Chip Debugger 0.11.0+dev-00626-g92c4e634d (2022-03-25-00:39)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 4000 kHz
Info : JTAG tap: bcm2837.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Info : bcm2837.cpu0: hardware has 6 breakpoints, 4 watchpoints
Info : bcm2837.cpu1: hardware has 6 breakpoints, 4 watchpoints
Info : bcm2837.cpu2: hardware has 6 breakpoints, 4 watchpoints
Info : bcm2837.cpu3: hardware has 6 breakpoints, 4 watchpoints
Info : gdb port disabled
Info : starting gdb server for bcm2837.cpu0 on 3333
Info : Listening on port 3333 for gdb connections
Info : starting gdb server for bcm2837.cpu1 on 3334
Info : Listening on port 3334 for gdb connections
Info : starting gdb server for bcm2837.cpu2 on 3335
Info : Listening on port 3335 for gdb connections
Info : starting gdb server for bcm2837.cpu3 on 3336
Info : Listening on port 3336 for gdb connections
新たにターミナルを立ち上げ、openocdにtelnetで接続します。
$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> reg
===== Aarch64 registers
(0) x0 (/64)
(1) x1 (/64)
(2) x2 (/64)
(3) x3 (/64)
(4) x4 (/64)
(5) x5 (/64)
(6) x6 (/64)
(7) x7 (/64)
(8) x8 (/64)
~省略~
以上です。
おまけ
OpenOCD 0.10
パッケージでインストールした OpenOCD 0.10 では以下のエラーが出て解消できませんでした。(設定やJTAGの結線が悪かった可能性もある)
Warn : Haven't made progress in mpsse_flush() for 2126ms.
Warn : Haven't made progress in mpsse_flush() for 4166ms.
Warn : Haven't made progress in mpsse_flush() for 8247ms.
Warn : Haven't made progress in mpsse_flush() for 16152ms.
Warn : Haven't made progress in mpsse_flush() for 32217ms.
JTAGの結線
JTAGの結線でハマりました。接続を間違えていると以下のようなエラーが出ます。
Open On-Chip Debugger 0.11.0+dev-00626-g92c4e634d (2022-03-25-00:39)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 4000 kHz
Error: JTAG scan chain interrogation failed: all zeroes
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway...
Error: bcm2837.cpu: IR capture error; saw 0x00 not 0x01
Warn : Bypassing JTAG setup events due to errors
Error: Invalid ACK (0) in DAP response
参考URL
https://metebalci.com/blog/bare-metal-raspberry-pi-3b-jtag/
https://qiita.com/toshinaga/items/146bcb00db235258162f
https://logmi.jp/tech/articles/326201
https://datasheets.raspberrypi.com/rpi3/raspberry-pi-3-b-plus-reduced-schematics.pdf
https://www.raspberrypi.com/documentation/computers/processors.html#bcm2837b0
https://tnishinaga.hatenablog.com/entry/2015/04/04/033445
https://chakoku.hatenablog.com/entry/2020/08/27/192925
https://hikalium.hatenablog.jp/entry/2021/07/18/214013#openocd%E3%81%AE%E8%A8%AD%E5%AE%9A
https://qiita.com/toshinaga/items/146bcb00db235258162f