Raspberry Pi 3B+ と Olimex ARM-USB-OCD-H の接続

# 目的

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とは

http://strawberry-linux.com/catalog/items?code=15066

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
```

# ターゲットとデバッガの接続（私のハマりポイント）

下図は、デバッガ本体のピン配置です。今回私はリボンケーブルとターゲットを接続したので、左右を入れ替える必要がありました（ここでハマった）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418952/29b696ac-8284-24c3-2da4-1d21fbc8549d.png)



ターゲット本体のピン配置は以下を参照しました。

https://raspberry-pi.ksyic.com/bypass/files/GPIO.svgz#Alt4

| 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番目左など） |

結果こんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418952/1004c4a4-bb4b-d61a-519a-548a3fd1eeef.png)

別角度から。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418952/5f585daf-a982-561f-a3d7-224355597ac5.png)


# 起動

ターゲットに電源を投入後、デバッガをホストに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