概要
前回はEraseまで作りました。今回は任意のファームウエアを転送できるところまで作ってみました。
成果物
GitHub上に公開しました。そしてGitHub Pagesを使ってJavaScriptがそのまま動くページを公開してみました。
ファイルアップロードでの書き込み
上記のページになります。

上記のような画面で書き込みたいバイナリを選択して、Writeボタンを押すとシリアル選択ダイアログが表示されて転送が始まります。

転送するファイルについてはArduino IDEの環境設定から書き込みの情報を表示させます。
最大1310720バイトのフラッシュメモリのうち、スケッチが314682バイト(24%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が16804バイト(5%)を使っていて、ローカル変数で310876バイト使うことができます。
C:\Users\tanaka\AppData\Local\Arduino15\packages\m5stack\tools\esptool_py\3.0.0/esptool.exe --chip esp32 --port COM15 --baud 1500000 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 C:\Users\tanaka\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\1.0.7/tools/partitions/boot_app0.bin 0x1000 C:\Users\tanaka\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\1.0.7/tools/sdk/bin/bootloader_dio_80m.bin 0x10000 C:\Users\MSC9E5~1.TAN\AppData\Local\Temp\arduino_build_498923/AnalogMeter.ino.bin 0x8000 C:\Users\MSC9E5~1.TAN\AppData\Local\Temp\arduino_build_498923/AnalogMeter.ino.partitions.bin
するといつも表示されるメモリ量の次の行にesptoolで転送しているコマンドが表示されます。
C:\Users\tanaka\AppData\Local\Arduino15\packages\m5stack\tools\esptool_py\3.0.0/esptool.exe
--chip
esp32
--port
COM7
--baud
1500000
--before
default_reset
--after
hard_reset
write_flash
-z
--flash_mode
dio
--flash_freq
80m
--flash_size
detect
0xe000
C:\Users\tanaka\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\1.0.7/tools/partitions/boot_app0.bin
0x1000
C:\Users\tanaka\AppData\Local\Arduino15\packages\m5stack\hardware\esp32\1.0.7/tools/sdk/bin/bootloader_dio_80m.bin
0x10000
C:\Users\MSC9E5~1.TAN\AppData\Local\Temp\arduino_build_894641/GameOfLife.ino.bin
0x8000
C:\Users\MSC9E5~1.TAN\AppData\Local\Temp\arduino_build_894641/GameOfLife.ino.partitions.bin
スペースを改行に置換すると上記みたいになります。最後にある0xe000にboot_app0.bin、0x1000にbootloader_dio_80m.bin、0x10000にGameOfLife.ino.bin、0x8000にGameOfLife.ino.partitions.binを転送しているのがわかります。
こちらのファイルを保存しておき、転送することでファームウエアを書き換えることができます。
埋め込み版
- https://tanakamasayuki.github.io/WebSerialEsptool/Example-M5GFX-AnalogMeter.html
- https://tanakamasayuki.github.io/WebSerialEsptool/Example-M5GFX-GameOfLife.html
M5GFXのスケッチ例をお借りして、ぽちっと押すと転送できるものを作ってみました。

こちらはボタンひとつとログ表示用のテキストエリアしかありません。シンプルですね。
仕組み
まずファイルをアップロードか、Htmlに埋め込むか、別ファイルから読み込むかしてJavaScriptで扱える状態にしています。
ここが思ったより面倒で、JavaScriptは非同期の読み込み形式しかなくて、いろいろ欲しい型と違った場合にはさらに非同期で変換が必要になったりします。ちなみにGitHub Pagesはバイナリファイルを置けないので、HTMLの中にBase64したテキストデータとしておいています。。。
実際の書き込みはStub転送とほぼ同じです。気をつけないと行けないのは一度に転送できる量が16Kまでのため、複数回に分割して送る必要があります。そして分割した番号も一緒に送るのですがそれが1バイトしかありません。16Kx256は4MBなのでアプリケーションが4MB上限って制限はもしかしたらここかもしれません。
現状の問題点
非圧縮で書き込んでいる
実際のesptoolでは圧縮転送モードをサポートしています。Pythonのzlib.compress(data)相当のデータで圧縮して転送可能です。ファイルによりますが半分近くまで圧縮できる気がします。
現状は実証実験のところなので速度はまあいいかと対応していません。ライブラリを使わないとJavaScriptでは圧縮できないので圧縮済みを埋め込むとかの用途がよさそうだと思います。
転送が安定しない?
たまーに転送が不安定になっているみたいです。書き込みに失敗して別パーティションのアプリが起動したり、ハングアップする場合があるようです。これはエラー処理が適当なので途中で転送ミスっているのだと思います。
個体差があるので、私の手元だとわりと安定しているのですがもう少し処理を見直してみる必要がありそうですね。
Arm搭載のChromebookで動かない
んー、Intelだと割と動くっぽいですがArm機だと動きがものすごく不安定です。Web Serial自体がたぶん結構遅延している気がします。Linuxモードで動かす分には問題ないのですが。。。
上記でも動かないので、ちょっといろいろ手をいれないとだめですね。ちなみにリセット自体が効きにくいです。がんばってこねくり回してリセットはできるようになりましたが、転送まではもう少し調整しないとだめそうです。
機種依存がないと思っていたのですがWeb Serialもいろいろ面倒。。。ただChromebook自体は非常に使いやすいです。ちょっと使うならタッチパネル付きの10インチぐらいでもいいのかもしれませんね。
まとめ
まだちょっと不安定ですが、Windowsで使う分にはある程度使えるようになったかな?
M5StackさんのEasyLoaderとかをWeb Serialに変更してもらいたいです。あれWindowsとMacの実行ファイルなんでウイルスチェックにひっかかるんですよね。。。
あとM5Burnerも対応してほしいです。とくにUIFlowはブラウザのみで完結しないと導入が面倒なんですよね。
コメント