色々なボードでZephyrを動かしてみる

この文章は、[ZephyrRTOS Advent Calendar 2024](https://qiita.com/advent-calendar/2024/zephyr)の5日目のエントリとして書かれました。

# はじめに
Zephyrをお試しする場合に、手元に解説されている記事のボードが無くて試せないなぁと考えている人は多いかと思います。

この記事では、手元のボードが対応しているかを調べる方法を紹介し、実際にいくつかのボードでZephyrを試してみます。

# Zephyr開発環境の準備
Zephyr公式サイトの[Getting Started Guide](https://docs.zephyrproject.org/latest/develop/getting_started/index.html)[^1]で、各OS(Ubuntu(Linux), macOS, Windows)に対応したタブを選択して表示される手順で問題なく開発環境が構築できます。
というわけで、ここでは詳細は説明しません。

[^1]: https://docs.zephyrproject.org/latest/develop/getting_started/index.html

# Zephyrのディレクトリ階層
Zephyrのディレクトリ階層の中で、今回のデモの動作に関連した部分に関して紹介します。

Zephyrのトップディレクトリを`${ZEPHYR}`と仮定します。

## ボード情報
対応ボードの一覧は、以下のコマンドで得ることができます。
今回の環境では、650ものボードがサポートされているようです。

```shell:ボードの一覧を取得する。
$ west boards
  ...
esp32s2_lolin_mini
linum
w5500_evb_pico
xenvm
$ west boards|wc
     650     650    9253
```

各種ボードの詳しい作業方法は[Supported Boards and Shields](https://docs.zephyrproject.org/latest/boards/index.html) [^2] も参照してください。

[^2]: https://docs.zephyrproject.org/latest/boards/index.html

ボードの情報は、`${ZEPHYR}/zephyr/boards/`にメーカごとで分けられて配置されています。
例えば、STのボードは、`${ZEPHYR}/zephyr/boards/st/`の下にあります。
同じように、micro:bitのボード定義は`${ZEPHYR}/zephyr/boards/bbc/`にあり、M5Stackのボード定義は`${ZEPHYR}/zephyr/boards/m5stack/`にあります。

このディレクトリ直下のボード毎のディレクトリに、ハードウエア定義のDevice Tree Source(DTS:`*.dts`)やCmake用の定義`board.cmake`などのbuildに必要な情報が配置されています。

今回使うSTM32F746G-DISCOの場合、`${ZEPHYR}/zephyr/boards/st/stm32f746g_disco/`があるので、サポートされていると考えることができます。このディレクトリ名`stm32f746g_disco`が、`west`コマンドの`-b`オプションに与えるボード名となります。

ただ、手元で確認したところ、M5Stackシリーズの`stamp_c3`を除くボードはbuildがうまくいきませんでした。
このような、現在動かない状態のボードもそれなりの数あると思われます。

## build生成物のディレクトリ
buildされた生成物は`${ZEPHYR}/zephyr/build/zephyr/`に作成されます。
ここに、`zephyr.bin`, `zephyr.hex`, `zephyr.elf`, `zephyr.uf2`などの名称で、各種フォーマットのバイナリが生成されています。

:::note info
これらのバイナリは、`west build`が実行されるごとに上書きされますので、複数のボードで作業しているときには注意してください。
:::

## デモプログラムのディレクトリ
デモプログラムは、`${ZEPHYR}/zephyr/samples/`(以下、`${SAMPLES}`)の下に収められています。
- `${SAMPLES}/hello_world`:シリアルに"Hello World!"に続いて、ボード名を表示します。
- `${SAMPLES}/basic/`: 基本的なデモです。Lチカ(`blinky`)やボタン操作(`button`)などが含まれています。
- `${SAMPLES}/boards/`: ボードに特化したデモです。さらにメーカーごとに分けられており、例えばmicro:bitの場合は`${SAMPLES}/boards/bbc/microbit/`に3つのデモ(`display, sound, pong`)があります。

# デモを実行する
ここでは、デモを実行してみます。

## 実際のbuild
実際のデモをbuildするためのコマンドラインは以下のようになります。
`<ボード名>`に関しては、後述のボードの説明部分に書いてありますので、参考にしてください。

### blinkyデモ
blinkyデモを動かす場合は、サンプルの名前を`samples/basic/blinky`とします。

ボタンがなく、LEDが付いている機種では、このデモを最初に試すと良いでしょう。

```shell:blinkyデモをbuildする
$ west build -p always -b <ボード名> samples/basic/blinky
```

### buttonデモ
buttonデモでは、オンボードのボタンを押すと、そのボタンに応じてオンボードのLEDが点滅するものになっています。

以下のコマンドで、実際にbuildが行われます。

```shell:buttonデモをbuildする。
$ west build -p always -b <ボード名> samples/basic/button
```

## 完成したプログラムをflashする
完成したプログラムをボードに書き込む(flash)するには、以下のコマンドを使います。
ボードごとに適切な方法でプログラムが書き込まれます。

```shell:共通
$ west flash
```

RP2040などのボードの場合は、ストレージとして見えて、そこにUF2形式のプログラムを書き込むものがあります。これらのボードでは、BOOTSELボタンを押しながらPCに接続して見えたストレージに、いつものように、`build/zephyr/zephyr.uf2`を書き込むことでflashを行います。

# 今回試したボードたち
今回、手元にあった以下のようなボードを使って試してみました。
- STM32F746G-DISCO
- Raspberry Pi Pico
- Arduino UNO R4 MINIMA
- M5Stack Stamp C3
- Seeed Studio 製品(XIAOシリーズ, WioTerminal)
- Adafruit Feather nRF52840 Sense

これらのボードを選んだ理由は、偶然手元にあったからというだけで、深い意味はありません。

micro:bitに関しては、別記事「[macOSでZephyrのmicro:bitデモを動かす](https://qiita.com/610t/items/65feb82e35db99568d25) [^3] 」を書いていますので、こちらをご覧ください。

[^3]: https://qiita.com/610t/items/65feb82e35db99568d25

## 結論:どのボードを使えばいいのか
最初に、今回試してみた結果、どのボードを使えばいいのかの結論から説明しておきます。

今回試したボードですが、buildはできてもflashの所でJ-LinkやCMSIS-DAPアダプターなどのハードウエアが必要なものも少なくありませんでした。
筆者はこれらのものを持っていないため、動作の確認を行うことができませんでした。

その中で、オンボードだけでflashまでできたものとしては、以下のボードがあります。
手軽に利用できる順に並べてあります。
- Raspberry Pi Pico/XIAO RP2040:UF2を手動でコピー
- micro:bit (v1.5, v2.0):J-Linkファームウエアを利用
- Wio Terminal:手動でコマンドラインの指定が必要
- STM32F746G-DISCO

順番としては最後に並べてありますが、STの製品はSTM32CubeProgrammerがすぐに使える開発ボードであれば、とても手軽に利用できると思います。

ボート選択の参考になれば幸いです。

## STM32F746G-DISCO
![STM32F746G-DISCO](https://i.gyazo.com/ad1d05b9b5d9ea674edbcc72430c164b.png)

[STM32F746G-DISCO](https://www.st.com/ja/evaluation-tools/32f746gdiscovery.html)([Zephyr](https://docs.zephyrproject.org/latest/boards/st/stm32f746g_disco/doc/index.html)[^4] )は、写真のようなディスプレイのついた評価ボードです。

[^4]: https://docs.zephyrproject.org/latest/boards/st/stm32f746g_disco/doc/index.html

Ethernet用のRJ45ポートなどもあり、すぐにTCP/IP通信ができて魅力的です。
主な仕様は、以下の通りです。
- 価格:	$55.13([直販](https://estore.st.com/en/products/evaluation-tools/product-evaluation-tools/mcu-mpu-eval-tools/stm32-mcu-mpu-eval-tools/stm32-discovery-kits/32f746gdiscovery.html))
- SoC:	STM32F746NGH6
- Display:		4.3” RGB 480×272 LCD-TFT
- タッチパネル:	非マルチタッチ
- Built-in:		ボタン
- インタフェース:	RJ45, Audio, microSD, Arduino互換ピン, USB-microB x 2

ボード名は、`stm32f746g_disco`です。

flashは、STM32CubeProgrammer経由で行われます。

```shell:STM32F746G-DISCO flashの様子
% west flash
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner stm32cubeprogrammer
      -------------------------------------------------------------------
                        STM32CubeProgrammer v2.15.0                  
      -------------------------------------------------------------------

ST-LINK SN  : 066EFF535748775187113829
ST-LINK FW  : V2J45M30
Board       : 32F746GDISCOVERY
Voltage     : 3.22V
SWD freq    : 4000 KHz
Connect mode: Under Reset
Reset mode  : Hardware reset
Device ID   : 0x449
Revision ID : Rev Z
Device name : STM32F74x/STM32F75x
Flash size  : 1 MBytes
Device type : MCU
Device CPU  : Cortex-M7
BL Version  : 0x90
Debug in Low Power mode enabled



Memory Programming ...
Opening and parsing file: zephyr.hex
  File          : zephyr.hex
  Size          : 17.05 KB 
  Address       : 0x08000000 


Erasing memory corresponding to segment 0:
Erasing internal memory sector 0
Download in Progress:
[==================================================] 100% 

File download complete
Time elapsed during download operation: 00:00:00.595

RUNNING Program ... 
  Address:      : 0x8000000
Application is running, Please Hold on...
Start operation achieved successfully

```

Interfaceだったかトランジスタ技術だったかのプレゼントで当たりました。

## Raspberry Pi Pico
![Raspberry Pi Pico](https://i.gyazo.com/a60bdbe226a7cadb494bc567f36b751f.png)

[Raspberry Pi Picoシリーズ](https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html)([Zephyr](https://docs.zephyrproject.org/latest/boards/raspberrypi/rpi_pico/doc/index.html) [^5] )は、Raspberry Pi財団が開発しているマイクロコントローラー[RP2040](https://www.raspberrypi.com/documentation/microcontrollers/silicon.html#rp2040)や[RP2350](https://www.raspberrypi.com/documentation/microcontrollers/silicon.html#rp2350)を使って作ったコンパクトなボードです。

[^5]: https://docs.zephyrproject.org/latest/boards/raspberrypi/rpi_pico/doc/index.html

このボードには、ボタンが付いていなくて、LEDだけになっています。
他のメーカーから出ているボードにはボタンが付いていたり他のLEDが付いていたりしますが、ボード定義がないので、簡単に使うのは難しいでしょう。

ボード名は、`rpi_pico`です。
他にもW5500が付いた`w5500_evb_pico`もサポートされているようです。

この記事では、RP2040搭載のRaspberry Pi Picoボードに関して取り扱っています。
RP2350搭載ボードでの利用例は、別記事「[RP2350搭載のRaspberry pi pico2でZephyrOSのLチカ](https://qiita.com/kazueda/items/b3783ea987b8056ccbba) [^6] 」をご覧ください。

[^6]: https://qiita.com/kazueda/items/b3783ea987b8056ccbba

既に説明したように、Raspberry Pi Picoの場合は`build/zephyr/zephyr.uf2`をファームウエア書き込みモードでコピーする必要があります。

```shell:Raspberry Pi Picoのファームウエア書き込み(macOS)
$ cp build/zephyr/zephyr.uf2 /Volumes/RPI-RP2
```

## Arduino UNO R4 MINIMA
![Arduino UNO R4 Minima](https://i.gyazo.com/a526aaa4b70f0ad333aeabf7de55a8c7.png)

[Arduino UNO R4 Minima](https://docs.arduino.cc/hardware/uno-r4-minima/)([Zephyr](https://docs.zephyrproject.org/latest/boards/arduino/uno_r4/doc/index.html) [^7] )は、最近提供が始まった最新バージョンのArduinoです。
ArduinoシリーズもZephyrのサポート対象で、色々なボードが対応されています。

[^7]: https://docs.zephyrproject.org/latest/boards/arduino/uno_r4/doc/index.html

Arduinoシリーズは、共通の拡張ボードが利用できるのが魅力的だと思います。

Arduino UNO R4 Minimaは、CMSIS-DAPアダプターがないとflashできないようになっています。
今回は、buildのみを試しています。

ボード名は、`arduino_uno_r4_minima`です。

このボードは、ルネサスのセミナー受講を条件としたモニタープログラムでいただきました。

## M5Stack M5Stamp C3 Mate
![M5Stack M5Stamp C3 Mate](https://www.switch-science.com/cdn/shop/files/307a7b88-df0c-4489-8c05-73f1e90b009f_700x700.png?v=1725604995)

[M5Stack](http://m5stack.com/)ファミリーのいくつかのボードもZephyrでサポートされているようです。
ただし、M5Stamp C3 Mate以外のボードはうまくbuildできない状況でした。

[M5Stamp C3 Mate](https://www.switch-science.com/products/7474)([Zephyr](https://docs.zephyrproject.org/latest/boards/m5stack/stamp_c3/doc/index.html) [^8] )は、コンパクトなシリーズで、この機種には一つのボタンと一つのフルカラーLEDがついています。

[^8]: https://docs.zephyrproject.org/latest/boards/m5stack/stamp_c3/doc/index.html

ボード名は、`stamp_c3`です。

flashは標準的なESP32の書き込みツールである`esptool.py`を使って行われます。
```shell:Stamp C3のflash
$  west flash
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner esp32
-- runners.esp32: reset after flashing requested
-- runners.esp32: Flashing esp32 chip on None (921600bps)
esptool.py v4.7.0
Found 3 serial ports
Serial port /dev/cu.wchusbserial53190069071
Connecting....
Detecting chip type... ESP32-C3
Chip is ESP32-C3 (QFN32) (revision v0.3)
Features: WiFi, BLE, Embedded Flash 4MB (XMC)
Crystal is 40MHz
MAC: 7c:df:a1:a5:34:e4
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x00000000 to 0x00020fff...
Wrote 147456 bytes at 0x00000000 in 2.3 seconds (519.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
```

## Seeed Studio製品
![Seeed Studio製品](https://i.gyazo.com/7225b6e9431eb9e225030ecd63acf5bb.png)

[Seeed Studio](https://jp.seeedstudio.com/)は、様々な開発用ボードなどを販売しています。
[XIAOシリーズ](https://www.seeedstudio.com/xiao-series-page)は、共通のコンパクトなフォームファクタ(18mm x 21mm)で、様々なSoC(SAMD, ESP32, nRF52840, RP2040など)の製品が提供されています。これらも、Zephyrでサポートされています。
更に、[Wio Terminal](https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/)もサポートされています。

ボード名は、以下の通りです。ここで紹介したボードは、少なくともbuildができる所まで確認しています。
各リンクは、Zephyrプロジェクトの解説に統一しています。
|機種(Zephyr情報)|ボード名|build|flash|備考|
|--|--|--|--|--|
|[XIAO ESP32C6](https://docs.zephyrproject.org/latest/boards/seeed/xiao_esp32c6/doc/index.html) [^9] |`xiao_esp32c6`|o|不明|所有せず|
|[XIAO RP2040](https://docs.zephyrproject.org/latest/boards/seeed/xiao_rp2040/doc/index.html) [^10]|`xiao_rp2040`|o|o|flashはPicoと同じ方法|
|[XIAO BLE(Sense)](https://docs.zephyrproject.org/latest/boards/seeed/xiao_ble/doc/index.html) [^11] (nRF52840)|`xiao_ble`|o|未確認|J-Link必要|
|[Seeeduino XIAO](https://docs.zephyrproject.org/latest/boards/seeed/seeeduino_xiao/doc/index.html)(SAMD21) [^12] |`seeeduino_xiao`|o|未確認||
|[Wio Terminal](https://docs.zephyrproject.org/latest/boards/seeed/wio_terminal/doc/index.html) [^13]|`wio_terminal`|o|x(macOS),△(Windows)|手動flash|

[^9]: https://docs.zephyrproject.org/latest/boards/seeed/xiao_esp32c6/doc/index.html
[^10]: https://docs.zephyrproject.org/latest/boards/seeed/xiao_rp2040/doc/index.html
[^11]: https://docs.zephyrproject.org/latest/boards/seeed/xiao_ble/doc/index.html
[^12]: https://docs.zephyrproject.org/latest/boards/seeed/seeeduino_xiao/doc/index.html
[^13]: https://docs.zephyrproject.org/latest/boards/seeed/wio_terminal/doc/index.html

### Wio Terminalの場合
Wio Terminalの場合、`FATAL ERROR: required program bossac not found; install it or add its location to PATH`というエラーが出るときは、追加で[BOSSA](https://www.shumatech.com/web/products/bossa) [^14] をインストールしてください。

[^14]: https://www.shumatech.com/web/products/bossa

```shell:Wio Terminal
$ west flash
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner bossac
There are multiple serial ports available on this system:
    1. /dev/cu.usbmodem141101
    2. /dev/cu.Bluetooth-Incoming-Port
Please select one (1-2, or EOF to exit): 1
FATAL ERROR: required program bossac not found; install it or add its location to PATH
```

Windowsの場合、BOSSAをインストールして`PATH`を設定しても、自動ではflashできませんでした。
以下のように、コマンドラインで指定することで、flashができました。

```shell:WindowsでBOSSAで書き込む
$ west flash -r bossac --bossac="C:\Program Files (x86)\BOSSA\bossac.exe" --bossac-port="COM12"
```

macOSの場合は、デバイスが見つからず、flashすることができませんでした。原因は不明です。`bossac`を単体で動かしても同じエラーのため、`bossac`側の問題のように思えます。
```shell:macOSでBOSSAを使った場合
west flash 
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner bossac
There are multiple serial ports available on this system:
    1. /dev/cu.usbmodem141301
    2. /dev/cu.Bluetooth-Incoming-Port
Please select one (1-2, or EOF to exit): 1
No device found on /dev/cu.usbmodem141301
FATAL ERROR: command exited with status 1: /usr/local/bin/bossac -p /dev/cu.usbmodem141301 -R -e -w -v -b /Users/mutoh/work/zephyrproject/zephyr/build/zephyr/zephyr.bin -o 16384
$ west flash -r bossac --bossac="bossac" --bossac-port="/dev/cu.usbmodem141301" 
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner bossac
No device found on /dev/cu.usbmodem141301
FATAL ERROR: command exited with status 1: bossac -p /dev/cu.usbmodem141301 -R -e -w -v -b /Users/mutoh/work/zephyrproject/zephyr/build/zephyr/zephyr.bin -o 16384

$ bossac -e -w -v -b -i -p /dev/cu.usbmodem141301 build/zephyr/zephyr.bin
No device found on /dev/cu.usbmodem141301
```

## Adafruit Feather nRF52840 Sense
[Adafruit Feather nRF52840 Sense](https://www.adafruit.com/product/4516)([Zephyr](https://docs.zephyrproject.org/latest/boards/adafruit/nrf52_adafruit_feather/doc/index.html) [^15] )は、SoCにnRF52840を使ったボードで、色々なセンサー類がついているバージョンです。

[^15]: https://docs.zephyrproject.org/latest/boards/adafruit/nrf52_adafruit_feather/doc/index.html

ボード名は、`nrf52_adafruit_feather`です。

このボードは、別途J-Linkアダプターが必要なため、今回はbuildのみを試しています。

# おわりに
色々なボードでZephyrを試してみました。
あなたの所に対応ボードがあったら、一度Zephyrを試してみませんか?