お知らせ
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/issuesNo /boot/config.txt (or any other usefull file) on new ubuntu server 18 install
toolchain is broken on aarch64 #236
0 件のコメント :
コメントを投稿