ラズパイのコマンドラインで esptool を使って M5StickC のフラッシュをバックアップ、リストアしてみました。
ほぼ https://lang-ship.com/blog/work/esp32-esptool-py/ に書かれていることをそのままやっています。
環境
- Raspberry Pi 4 model B
- Raspbian GNU/Linux 10 (buster)
- M5StickC
M5StickC を接続したラズパイのシリアルポートデバイスを確認
ラズパイで $ tail -f /var/log/messages
をしながら M5StickC に付属の USB ケーブルでラズパイの USB に接続すると以下のメッセージが出ました。
Jun 18 23:33:44 raspi4 kernel: [19742.992308] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
ttyUSB0
と出ているのでシリアルポートデバイスは /dev/ttyUSB0
であることがわかりました。
デバイスファイルも存在していました。
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 6月 18 23:33 /dev/ttyUSB0
pipenv プロジェクト作成
pipenv インストール
$ sudo apt install pipenv
pipenv プロジェクト用のディレクトリを作成して移動
$ mkdir /some/where/m5stickc
$ cd /some/where/m5stickc/
pipenv プロジェクト作成
$ pipenv --python $(which python3)
pipenv shell 起動
$ pipenv shell
以下、全て pipenv シェルで実行
M5StcikC のフラッシュをバックアップ
esptool をインストール
$ pipenv install esptool
esptool.py --help
で確認すると出てくる flash_id : Read SPI flash manufacturer and device ID
を実行。シリアルポートは上で確認した /dev/ttyUSB0 を指定しました。
$ esptool.py --port /dev/ttyUSB0 flash_id
esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting......
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
--- 省略 ---
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...
いろいろ情報が表示され、フラッシュのサイズが 4MB であることがわかりました。
フラッシュをバックアップ
$ esptool.py --port /dev/ttyUSB0 read_flash 0x00000 0x400000 ./image-factory-default-4M.bin
- 先頭アドレス 0x00000 から上で確認したフラッシュのサイズ 0x400000 (10進数で 4,194,304) バイトを読み出して指定したファイルに保存しました。
保存したファイルのサイズはフラッシュのサイズと同じ 4MB でした。
$ ls -lh image-factory-default-4M.bin
-rw-r--r-- 1 pi pi 4.0M 6月 17 23:18 image-factory-default-4M.bin
バックアップしたフラッシュをベリファイ
$ esptool.py --port /dev/ttyUSB0 verify_flash --diff yes 0x0000 ./image-factory-default-4M.bin
--- 省略 ---
Auto-detected Flash size: 4MB
Verifying 0x400000 (4194304) bytes @ 0x00000000 in flash against ./image-factory-default-4M.bin...
-- verify FAILED: 279 differences, first @ 0x0000b02b
0000b02b 00 a8
0000b02c 00 aa
0000b02d a0 fa
--- 省略 ---
0000b81b 00 ff
0000b81c 01 ff
0000b81d 00 ff
A fatal error occurred: Verify failed.
ベリファイがエラーになりました。。。
「起動するたびにデータを書き換えているプログラムが存在しており、その場合にはベリファイチェックがNG」とのことで、工場出荷時のフラッシュだったのですがこれに該当しているのかもしれません。
フラッシュをリストア
ベリファイはエラーになりましたが、このバックアップからリストアしてみました。
まずはフラッシュを消去
$ esptool.py --port /dev/ttyUSB0 erase_flash
バックアップしたフラッシュをリストア
$ esptool.py --port /dev/ttyUSB0 write_flash 0x0000 ./image-factory-default-4M.bin
- 先頭アドレス 0x0000 を指定すると良いようです
うまくリストアできていました。
本文の通り、工場出荷状態の M5StickC でフラッシュをベリファイするとエラーになりましたが、以下のブログに書いた Lチカプログラムを書き込んだ M5StickC でフラッシュをバックアップしベリファイすると OK でした。
返信削除ラズパイで PlatformIO でコマンドラインで M5StickC を Lチカ
https://ne-zu-ppo.blogspot.com/2020/06/platformio-m5stickc-l.html