2019年10月6日日曜日

aarch64環境(Ubuntu 64bit on Raspberry Pi)でPlatformIOを通してesp32向けのビルドとプログラムの書き込みをしてみた


お知らせ

PlatformIOのaarch64向けのesp32のツールチェーンに不具合がありましたが、2020.02.07に解消されました。
githubでのやりとり: https://github.com/platformio/platform-espressif32/issues/236

不具合にまだ遭遇している方は、下記のようなコマンドでtoolchain-xtensa32を消去してコンパイルしなおしてみてください。
rm -r ~/.platformio/packages/toolchain-xtensa32/

この記事の内容は行わずとも動くようになりましたが、どこを調査したかは後々参考になることがあるかもしれないので、記事は残します。

背景

aarch64とはARMの64bit環境のことです。
PlatformIOとは、Arduinoやesp32などのプログラムを書き込めるモジュール向けのプログラムをビルドして書き込めるソフトウェアです。

aarch64環境でesp32向けのビルドと書き込みを行おうとしたところ、いくつか問題が発生したので、備忘録を兼ねて解決方法を共有します。

使ったもの

  • aarch64の環境
    今回は64bitのUbuntuで動くRaspberry Pi 3B+を利用しました
    利用したUbuntuは18.04.3です。
  • PlatformIO
    Ubuntu向けに下記のコマンドでPlatformIOのインストールudev ruleの更新を行いました。
    sudo apt install python3-pip
    sudo pip3 install -U platformio
    curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
    sudo service udev restart
  • esp32を搭載した開発装置
    プログラムを書き込む対象です。
    M5StackFireを利用しました。

対策前の動かない環境

ESP32向けのPlatformIOプログラムを作り、 M5Stackへのアップロードを試みましたが、下記のようなツールチェーンが無い旨のエラーが発生してビルドに失敗ました。

HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (esp-prog) External (esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: toolchain-xtensa32 2.50200.80 (5.2.0), framework-arduinoespressif32 2.10004.191002 (1.0.4), tool-esptoolpy 1.20600.0 (2.6.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 26 compatible libraries
Scanning dependencies...
No dependencies
Compiling .pio/build/esp32dev/src/main.cpp.o
sh: 1: xtensa-esp32-elf-g++: not found
Generating partitions .pio/build/esp32dev/partitions.bin
Archiving .pio/build/esp32dev/libFrameworkArduinoVariant.a
sh: 1: xtensa-esp32-elf-ar: not found
*** [.pio/build/esp32dev/src/main.cpp.o] Error 127
*** [.pio/build/esp32dev/libFrameworkArduinoVariant.a] Error 127
Compiling .pio/build/esp32dev/FrameworkArduino/Esp.cpp.o
sh: 1: xtensa-esp32-elf-g++: not found
*** [.pio/build/esp32dev/FrameworkArduino/Esp.cpp.o] Error 127


しかし、ツールチェーンの関連ファイルはあるようでした。


対策: toolchain-xtensa32をlinux-aarch64専用のものに置き換える

同様の問題を扱っているgithubのissueがあったので、そこで紹介されていたコマンドを参考にして、toolchain-xtensa32を置き換えました。

mv ~/.platformio/packages/toolchain-xtensa32 /tmp
curl -sSL -o ./toolchain-xtensa32.tar.gz https://github.com/esphome/esphome-docker-base/releases/download/v1.4.0/toolchain-xtensa32.tar.gz
tar -xzvf ./toolchain-xtensa32.tar.gz -C /home/${USER}/.platformio/packages/
rm ./toolchain-xtensa32.tar.gz

toolchain-xtensa32の内容を確認すると、armv7l, v8l, aarch64向けのツールチェーンが、linux-aarch64専用のものに変わっていました。

置き換え後
~/.platformio/packages/toolchain-xtensa32/package.json
{
    "description": "GCC for SoC Xtensa L108",
    "name": "toolchain-xtensa32",
    "system": [
        "linux_aarch64"
    ],
    "url": "https://github.com/espressif/esp-idf",
    "version": "2.50200.80"
}

置き換え前
~/.platformio/packages/toolchain-xtensa32/package.json
{
    "description": "GCC for SoC Xtensa L108",
    "name": "toolchain-xtensa32",
    "system": [
        "linux_armv7l",
        "linux_armv8l",
        "linux_aarch64"
    ],
    "url": "https://github.com/espressif/esp-idf",
    "version": "2.50200.80"
}

これにより、ビルド時にツールがないというエラーは出なくなると思います。

注意点: M5Stackの電池が切れているときは電流量に注意

電池が切れた状態のM5StackをRaspberry Piに接続すると、電流量が足りず再起動を繰り返すなどの不安定な動作をして書き込めません。
/boot/firmware/config.txtにmax_usb_current=1を記述して再起動しても、電池切れ時の電流量はまかなえないようでした。
(2017年より新しいOSなら標準で電流量が多くなっているようなので、max_usb_currentは要らなさそう。参考: max_usb_current=1が要らなくなっていた
そのため、M5Stackの電池が切れているときは、下記のどれかの対応が必要です。
  • 他の装置からのUSB給電でM5Stackを充電する
    ある程度充電されたM5Stackなら、書き込みを行なえます。
  • 外部給電できるUSBハブやケーブルを利用する
    Raspberry Piでは賄えない電流量をを外部から供給すれば、動作が安定すると思います。
  • 電池を外して書き込みを行う
    電池を外していれば、必要以上に電流量を要求しないため、動作が安定します。

動作確認

電流量に気をつけつつ、M5Stackへの書き込みに成功しました。


まとめ

ツールをaarch64専用に置き換え、USBから給電可能な電流量に注意することにより、Raspberry Piで動かすUbuntu 64bitでPlatformIOを通してesp32向けのビルドを行いM5Stackにプログラムを書き込めました。

参考

compiling error #594 - esphome/issues
No /boot/config.txt (or any other usefull file) on new ubuntu server 18 install
toolchain is broken on aarch64 #236

変更履歴

2020.02.09 PlatformIO側で対応されたため、冒頭にお知らせを追加しました。

0 件のコメント :