その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

ESP32でZephyrを開発する環境を整える - macOS編

ZephyrはApache Lisence, Version 2.0で公開されているRTOSです.多分「ゼファー」と読むはず.
https://www.zephyrproject.org/

このZephyrをESP32のボードで開発する環境をmacOS上に整えるというのがこの記事の目的です.
なおESP32開発ボードは今回以下を使いました: http://akizukidenshi.com/catalog/g/gM-11819/

基本的にZephyrの以下のドキュメントに従うとできます:

http://docs.zephyrproject.org/getting_started/installation_mac.html
http://docs.zephyrproject.org/boards/xtensa/esp32/doc/esp32.html

事前準備
$ brew install direnv cmake ninja dfu-util doxygen qemu dtc python3 gperf

開発環境が問答無用でSystemのPython3を見てくるのでインストールする必要があります.direnvはあるとなにかと便利なので入れています.

(上記開発ボードを使っている場合) CP210x USB to UART Bridge VCP driversを入れる

https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

もしもmacOS High Sierra以降を使っている場合は Security & Privacy でインストール時にBlockしているソフトウェアベンダーをAllowする必要があります (Silicon Laboratoriesとか).
これがないと開発ボードがシリアルデバイスとして認識されない.

Espressif Toolchainを入れる
$ mkdir -p ~/opt/esp
$ cd ~/opt/esp
$ curl -O https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
$ tar zxf xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz

xtensa-esp32-elf-osxのバージョンについては実際どこを見れば最新なのかがわからなかった (ダウンロード可能なバージョン一覧が取れるページを見つけられなかった) ので,雑に調べて出てきたものを使っています.
確証はありませんが,
arduino-esp32/package_esp32_index.template.json at master · espressif/arduino-esp32 · GitHub
の中身に書いているやつを使っておけば良いような気がしています (espressifの公式リポジトリだし).

ESP32 IDFを入れる

要はRTOS SDKです.

$ git clone --recursive https://github.com/espressif/esp-idf.git
$ cd esp-idf
$ git checkout dc8c33892e0

espressifのリポジトリからESP32 IDFをcloneしてきます.
加えてZephyrのドキュメントにあったので,IDFのリビジョンを過去のものに固定しています.

Since ESP-IDF is an external project in constant development, it’s possible that files that Zephyr depends on will be moved, removed, or renamed. Those files are mostly header files containing hardware definitions, which are unlikely to change and require fixes from the vendor. In addition to setting the environment variables above, also check out an earlier version of ESP-IDF
http://docs.zephyrproject.org/boards/xtensa/esp32/doc/esp32.html

Zephyrをダウンロードして諸々の開発環境を整える
$ git clone git@github.com:zephyrproject-rtos/zephyr.git /path/to/zephyr
$ cd /path/to/zephyr
$ pip3 install --user -r scripts/requirements.txt
$ cat <<EOS >> .envrc

export PATH="$PATH:$HOME/opt/esp/xtensa-esp32-elf/bin
export ZEPHYR_TOOLCHAIN_VARIANT="espressif"
export ESP_IDF_PATH="$HOME/opt/esp/esp-idf"
export ESPRESSIF_TOOLCHAIN_PATH="$HOME/opt/esp/xtensa-esp32-elf/"

source ./zephyr-env.sh
export ESP_DEVICE="/dev/cu.blahblah" # ここは開発ボードによって変わるでしょう
export ESP_BAUD_RATE=115200 # ここは開発ボードによって変わるでしょう
export ESP_FLASH_SIZE="detect"
export ESP_FLASH_FREQ="40m"
export ESP_FLASH_MODE="dio"

EOS
$ direnv allow

ZephyrはGitHubで公開されているので普通にgit cloneしてくれば良いです.
次にpythonで書かれたツールを動かすための依存ライブラリをインストールします.このコマンドではSystem python以下に依存ライブラリが入ります (system pythonを使わずに済ます方法は無いものか……).
あとは諸々の環境変数を.envrcに書き込んでdirenvでそれらを有効にしてやる.

Hello-Worldを動かしてみる
$ cd "$ZEPHYR_BASE/samples/hello_world"
$ mkdir build && cd build
$ cmake -DESP_IDF_PATH="$ESP_IDF_PATH" -GNinja -DBOARD=esp32 ..
$ west flash \
   --esp-device="$ESP_DEVICE" \
   --esp-baud-rate="$ESP_BAUD_RATE" \
   --esp-flash-size="$ESP_FLASH_SIZE" \
   --esp-flash-freq="$ESP_FLASH_FREQ" \
   --esp-flash-mode="$ESP_FLASH_MODE"
$ screen $ESP_DEVICE $ESP_BAUD_RATE # and push reset button

以上のようにコマンドを叩くとプログラムのビルドとボードへの書き込みを行うことができます.
公式ドキュメントでは ESP_DEVICEESP_BAUD_RATE といった環境変数を設定しておくと ninja flash コマンドはそれらをリスペクトするように書いてあるが,実際にそのような処理が行われている気配はない (ざっとコードを読んだ) ので, ninja コマンドの代わりに west を利用し,そのコマンドラインオプションで各種設定を与えるようにしています.
あとはscreenでTTYにつないでボードのリセットボタンを押すと "Hello World: esp32" が表示されるはずです!


以上です.これでmacOS上でESP32向けのZephyrプログラムが開発できます.やりましたね.