Zephyr RTOS 〜 pico2 の開発環境を整えてみる 〜

# 1. はじめに

本記事はおまけ的な要素として、raspberry pi pico2 のZephyr用開発環境を構築する手順を案内します。
箸休め的な頑張りすぎない記事ですので、ご理解いただければ。

参考記事

https://qiita.com/kazueda/items/b3783ea987b8056ccbba

https://gigazine.net/news/20241004-raspberry-pi-pico-2-risc-v-debug/

# 2. 必要なもの

**まずは必須な本体**

https://www.raspberrypi.com/products/raspberry-pi-pico-2/

**デバッグプローブ(他の pico 本体でも代替できます)**

https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html

**最新の zephyr リポジトリベースの環境**

~~ZephyrOpsPlaybook は 2025年1月時点では 2024/11/15 にリリースされた v4.0.0 で固定しており、2024/12/23 に merge された rpi_pico2 向けの実装は取り込まれていません。
そのため、最新のリポジトリ環境を用意する必要があります。
手順は下記公式手順を参考にしてください。~~

2025/3/8 に rpi_pico2 対応を含んだ v4.1.0 がリリースされ、playbook も取り入れています。
そのため、下記手順だけでなく playbook でも運用可能になりました。



https://docs.zephyrproject.org/latest/develop/getting_started/index.html

以降は環境構築済み前提で話を進めます。

# 3. openocd のビルド

ビルドに必要なツール群をインストール

```bash:
sudo apt install -y git gcc g++ autoconf automake libtool pkg-config make \
libusb-1.0-0-dev libhidapi-dev libgpiod-dev libftdi1-dev openocd libjim-dev
```

pico2 向けの変更が加えられた openocd のソースを取得してディレクトリに移動

```bash:
git clone https://github.com/raspberrypi/openocd.git
cd openocd
```

zephyr-sdk-0.17.0 がホームディレクトリ直下にある場合
(※諸々の設定を省くために、既存の openocd を上書きする運用です)

```bash:
./bootstrap
./configure --prefix=${HOME}/zephyr-sdk-0.17.0/sysroots/x86_64-pokysdk-linux/usr/
```

ビルド＆インストール

```bash:
make -j 8
make install
```

# 4. Zephyr のアプリを書き込み＆デバッグ

いつもの事前準備
```bash:
source .venv/bin/activate
source zephyr/zephyr-env.sh
```

rpi_pico2 向けのビルドして書き込み

```bash:
west build -b rpi_pico2/rp2350a/m33 samples/basic/blinky
west flash
```

デバッグ開始

```bash:
west debug
```

```bash:
(.venv) user@host:~/zephyrproject/zephyr$ west debug
-- west debug: rebuilding
ninja: no work to do.
-- west debug: using runner openocd
-- runners.openocd: OpenOCD GDB server running on port 3333; no thread info available
checking adapter speed...
GNU gdb (Zephyr SDK 0.17.0) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-build_pc-linux-gnu --target=arm-zephyr-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://github.com/zephyrproject-rtos/sdk-ng/issues>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ~/zephyrproject/zephyr/build/zephyr/zephyr.elf...
Remote debugging using :3333
warning: multi-threaded target stopped without sending a thread-id, using first non-exited thread
device_is_ready (dev=<optimized out>)
    at ~/zephyrproject/zephyr/build/zephyr/include/generated/zephyr/syscalls/device.h:58
58              return z_impl_device_is_ready(dev);
Loading section .image_def, size 0x1c lma 0x10000000
Loading section rom_start, size 0x210 lma 0x10000100
Loading section text, size 0x363c lma 0x10000310
Loading section .ARM.exidx, size 0x8 lma 0x1000394c
Loading section initlevel, size 0x38 lma 0x10003954
Loading section device_area, size 0x50 lma 0x1000398c
Loading section sw_isr_table, size 0x1a0 lma 0x100039dc
Loading section gpio_driver_api_area, size 0x24 lma 0x10003b7c
Loading section reset_driver_api_area, size 0x10 lma 0x10003ba0
Loading section clock_control_driver_api_area, size 0x1c lma 0x10003bb0
Loading section uart_driver_api_area, size 0x4c lma 0x10003bcc
Loading section rodata, size 0x23c lma 0x10003c18
Loading section datas, size 0x64 lma 0x10003e54
Loading section device_states, size 0x8 lma 0x10003eb8
Loading section .last_section, size 0x4 lma 0x10003ec0
Start address 0x10000eb0, load size 15840
Transfer rate: 10 KB/sec, 1056 bytes/write.
(gdb) b main.c:28
Breakpoint 1 at 0x10000b0e: file ~/zephyrproject/zephyr/samples/basic/blinky/src/main.c, line 33.
Note: automatically using hardware breakpoints for read-only addresses.
(gdb) c
Continuing.

Thread 1 "rp2350.dap.core0" hit Breakpoint 1, main () at ~/zephyrproject/zephyr/samples/basic/blinky/src/main.c:33
33              if (ret < 0) {
(gdb) l
28              if (!gpio_is_ready_dt(&led)) {
29                      return 0;
30              }
31
32              ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
33              if (ret < 0) {
34                      return 0;
35              }
36
37              while (1) {
(gdb)
```

できた！

# 5. おまけ

この環境であれば、こちらの ZephyrOpsPlaybook の addon 方式で導入すれば、vscode との連携環境もそのまま利用できます。

https://github.com/Corgeek/ZephyrOpsPlaybook/blob/master/docs/README_addon.md

::: note
追記
常に最新 zephyr 環境を構築するブランチとして、dev/newest を設けました。
差分は west.yml の zephyr 取得を v4.0.0 から main に変更したのみです。
README_lnx.md / README_win.md をベースに、dev/newest ブランチに切り替えた上で west update すれば、pico2 の更新も含まれる最新環境が構築できます。
(ただ、どちらにしろ rpi_pico2 を利用する際は openocd のビルドが必要)
:::

```bash:scripts/setup.sh
#!/bin/bash

BOARD_TYPE=rpi_pico2/rp2350a/m33

SCRIPT_PATH=`readlink -f ${0}`
SCRIPT_DIR=`dirname ${SCRIPT_PATH}`
                  :
```

![rpi_pico_debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38092/340da743-cf87-3d65-e8f7-2c1284323e8b.png)

# 6. まとめ

今回は、裏で下書き記事を書いている合間に pico2 を購入して、環境構築を試したものを記事に書き起こしました。
(Windows 側は試していませんが、ビルドに時間がかかる以外は大差ない、はず)

なお、手順でも記載していますが、既存の SDK に含まれている openocd を上書きする方法を記載しています。
既存環境をきれいにしておきたい方は、west flash / west debug 時に外部の openocd を使うオプションを指定して運用してください。
(ただ、west sdk install で簡単に sdk を再インストールできるので、あまり気にしなくても良い気も)

ちなみに、rp2350*.cfg を指定箇所にコピーすれば動く…？と思ってトライしてみましたが、単純な設定ファイルだけでは動きませんでした。
また、pyocd の rp2350 向け pack もまだリリースされておらず、渋々 openocd をビルドするに至りました。

pico2 を Zephyr で開発してやる！って方、参考にしていただくと幸いです。