windowsでのraspipicoの開発環境の構築 その3 デバック実行

下記の記事を見つけたので、VScode上でもデバック実行ができないかなと考えた。

結論としては、「WSL2」上でデバッグツール「gdb-multiarch」と「OpenOCD」を使ってwindowsの「VSCode」からGUIによるデバック実行ができた。

まだ一部改良の余地があるが手順は次の通りとなった。

1. (初回)picoにpicoproveを書き込む
1. (初回)WSLへソフトをインストールする。
1. (毎回)picoをPCに接続する
1. (毎回)windows のpower shellからwsl(ubuntu)へUSBのブリッジ接続設定をする。
1. (初回のみ)Ubuntu上でUSBへの接続設定を行う
1. (毎回)openocdの起動を行う
1. (毎回)デバックを開始する。

かなり手順が短く、簡単にできる。
また、手順6まで進めばUSBを外さない限りは6,7を繰り返すことでコードの修正、デバックを繰り返すことができる。
必要な部材は、下記のようになっている

- Raspberry Pi Pico 二台
- USBケーブル 一本
- PC 一台

Raspberry Pi Picoを二台使用し、一台はdebugerとして使用し、もう一台が動作させるPicoとなる。
Picoをデバッガーにするのは初回のみで、以降は変更しなくてよい。

### (初回)picoにpicoproveを書き込む

下記の記事を参考にインストールを行う。

https://kamuycikap.hatenablog.com/entry/2021/09/12/001639

WSL上で、適当な位置に下記のプロジェクトをクローンする。

https://github.com/raspberrypi/picoprobe.git

```shell-session
git clone https://github.com/raspberrypi/picoprobe.git

```

クローンを行った後は下記のようなディレクトリとなる。

```shell-session
~/src/repo/picoprobe$ tree -L 1 ./
./
├── CMakeLists.txt
├── pico_sdk_import.cmake
└── src
```

ビルドを行うが、pico_sdkのパスを環境変数に設定する必要がある。
`picoprobe/CMakeLists.txt`に下記の一文を書き込むことで、Cmakeによって環境変数を加えられる。

```cmake
...
cmake_minimum_required(VERSION 3.12)

set(ENV{PICO_SDK_PATH} "${CMAKE_SOURCE_DIR}/pico-sdk" )

include(pico_sdk_import.cmake)
...
```

`set(ENV{PICO_SDK_PATH} "${CMAKE_SOURCE_DIR}/pico-sdk" )`の`"${CMAKE_SOURCE_DIR}/pico-sdk"`を変更することで自分の環境に合わせたパスを指定する。
今回は、picoprobeのプロジェクト内にpico-sdkをクローンした。

```shell-session
~/src/repo/picoprobe$git clone https://github.com/raspberrypi/pico-sdk.git
~/src/repo/picoprobe$ tree -L 1 ./
./
├── CMakeLists.txt
├── pico-sdk
├── pico_sdk_import.cmake
└── src
```

cmakeの拡張からbuildを行う。

![build完了時のウインドウ](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220208/20220208220247.png)

buildが完了すると、build下に`picoprobe.uf2`が生成される。

```shell
~/src/repo/picoprobe$ tree -L 1 build/
build/
├── CMakeCache.txt
├── CMakeFiles
├── Makefile
├── cmake_install.cmake
├── compile_commands.json
├── elf2uf2
├── generated
├── pico-sdk
├── picoprobe.bin
├── picoprobe.dis
├── picoprobe.elf
├── picoprobe.elf.map
├── picoprobe.hex
├── picoprobe.uf2
├── pioasm
└── probe.pio.h
```

`picoprobe.uf2`をdebugger用のPicoに書き込む。

書き込みは前の記事を参考に、接続し、転送を行う。

Raspberry Pi Picoをマウントするには、bootボタンを押したままUSBを接続する。
その後、下記のコマンドを実行する。今回は、windows上でDドライブにRaspberry Pi Picoがマウントされたことを前提としている。

```sh
$ sudo mkdir /mnt/d
$ sudo mount -t drvfs D: /mnt/d
```

上記によって下記のようにlinuxにRaspberry Pi Picoがマウントされる。

```sh
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        251G  4.6G  234G   2% /
tmpfs           3.1G     0  3.1G   0% /mnt/wsl
tools           238G  201G   38G  85% /init
none            3.1G     0  3.1G   0% /dev
none            3.1G  8.0K  3.1G   1% /run
none            3.1G     0  3.1G   0% /run/lock
none            3.1G     0  3.1G   0% /run/shm
none            3.1G     0  3.1G   0% /run/user
tmpfs           3.1G     0  3.1G   0% /sys/fs/cgroup
drivers         238G  201G   38G  85% /usr/lib/wsl/drivers
lib             238G  201G   38G  85% /usr/lib/wsl/lib
C:\             238G  201G   38G  85% /mnt/c
D:              128M   20K  128M   1% /mnt/d
```

最後に、`$ cp build/src/pico-display/pico_display.uf2 /mnt/d/`を行うとPicoにコピーされる。

コピーされたのち、一回Picoを抜いて再度挿すとコピーした実行ファイルが実行される。

### (初回)WSLへソフトをインストール・セットアップ

「OpenOCD」と「gdb-multiarch」をWSLへインストールする。
ターミナルを起動して下記コマンドを実行する。

```shell

$sudo apt update

$sudo apt install openocd gdb-multiarch

```

### (毎回)picoをPCに接続する

PicoをPCに接続する。

Pico同士の接続は下記のように行う。
左がpicoprobe搭載Picoデバッガー、右がデバック対象のPico

![picoprobeとデバック対象のPicoの結線図](https://cdn-ak.f.st-hatena.com/images/fotolife/I/Ikimon/20220208/20220208124429.png)

参照

https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf

### (毎回)windows のpower shellからwsl(ubuntu)へUSBのブリッジ接続設定をする

接続したときに、windowsとwslのUSBを中継する設定を行う。

環境によってはwindowsのpower shell上でusbipd-winのアップデートを行う必要がある。
```shell
> winget install --interactive --exact dorssel.usbipd-win
```

windowsのpower shell上でWSLと接続できるusbデバイスの情報を下記のコマンドで確認できる。

```terminal
> usbipd wsl list
BUSID  DEVICE                                                        STATE
2-1    USB シリアル デバイス (COM3), Picoprobe                       Not attached
2-7    TOSHIBA Web Camera - FHD                                      Not attached
2-8    インテル(R) ワイヤレス Bluetooth(R)                           Not attached
3-2    Synaptics FP Sensors (WBF) (PID=0010)                         Not attached
```

picoprobeをWSLに接続する。

```terminal
> usbipd wsl attach --busid 2-1
```

以上で接続できる。

### (初回のみ)Ubuntu上でUSBへの接続設定を行う

Ubuntu上で管理者権限無しでpicoprobeにアクセスできるように設定する。
`udevadm`を使用するがWSLのUbuntu20.04では有効になっていないため有効化する。

https://forums.balena.io/t/balenalib-balena-machine-name-ubuntu-focal-udevadm-issues/343862

```shell
$ sudo /lib/systemd/systemd-udevd --daemon
```

次に、picoprobeの接続を管理者権限無しでできるようルールを追加する。

```shell
$ sudo nano /etc/udev/rules.d/60-picoprobe.rules 

```

`60-picoprobe.rules `の中

```
# Raspberry Pi Pico probe
ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0004", MODE="0777",TAG+=">
```

この設定を読み込むために下記のコマンドを実行する。

```shell
$ sudo udevadm control --reload-rules 
$ sudo udevadm trigger 
```

以上でopenocdを使用するときに管理者権限は不要となる。

### (毎回)openocdの起動を行う

OpenOCDの起動を行い、GDBとの接続ができるようにしておく。

```shell
$ openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl
```

### (毎回)デバックを開始する

VScodeからlaunch.jsonを使用しGDBを起動できるようにする。

下記のリポジトリに例としてLEDチカチカプロジェクトを用意した。

https://github.com/ikimon-dev/ledblink.git

以上でLEDのチカチカをデバック実行できるようにした。

https://qiita.com/4580TAT/items/313759d5a1e32a25944f

https://qiita.com/4580TAT/items/39d2dfe2a4d4b5e9c578