Flash encryption modeになってTiny-BASICしか動かなくなったESP32を復旧させます。
ESP-IDF toolchainをインストールします。最初,Wndows10へのインストールを試みましたが容量大きすぎで断念。Win版ESP-IDFはMinGWでpython実行環境を構築しその中でtoolchain動かす遠回りな仕組みなので,Linuxにインストールした方が相性いいのではないかと考えてUbuntuに入れることとしました。
まず,ESP-IDF toolchain専用のコンパクトなUbuntu-Linux環境を構築します。
次にココを参照してtoolchainをインストールします。
ファイル群のダウンロードやディレクトリの配置が終ったらtoolchainの実行環境をセットアップします。
flash read err, 1000 after deep sleep reset #117によればespsecure.pyでFlash encryption modeの解除を行うらしいのでファイル検索するとちゃんとインストールされていました。
~/esp/esp-idf/components/esptool_py/esptool/espsecure.py
ESP-IDF toolchainの実行環境が整ったらespsecure.pyでFlash encryption modeの解除を試みます。
ESP-IDF toolのespefuse.pyでeFuse(ESP32の動作を設定するメモリ)のサマリーを取ることができました。
Flash encryption modeにはなっていません。
次は,bootloaderが壊れていないか調べます。
しばらく頭を冷やして再開し。esptoolを使って中をプローブしました。
結局,フラッシュメモリの読み書きができない原因は
「わ・か・り・ま・せ・ん」
toolchainにbootloader.binがあったのでesptoolで書き込みを行いましたがタイムアウトで処理が中断されます。
esptoolによるflashの読み書きは,IO0をGNDに落とすと起動するROM内のローダの機能を使ってシリアルポートを通してSTUBローダが(RAMに?)送り込まれ,ROMローダとSTUBローダが連携してflash読み書きを処理します。
flashのブートローダが壊れていても読み書きできます(flashのローダに依存したら「鶏卵パラドクス」が起こります)
flashメモリが読み書きできない原因は不明です。
- ハード的に壊れた
- レジスタ等の設定でflashメモリの読み書きが抑止されている
- STUBローダを書き込んだが正しく働いていない
などなど,色々考えられます。
まぁ,プログラム書込み中にリセットしたり,モード遷移さたり,電源ON-OFFやったりと,かなり無茶をしましたので,何かのタイミングでflashメモリ周りに不具合を生じさせたのはまちがいないです。
…と,言うことで700円の部品を回復しようと8時間ぐらい費やしましたが復旧ならずでした。
おかげで,ESP-IDF 開発環境が構築できesptool等を使ってESPモジュール内部の探索ができるようになったので良しとします。(無駄なリソースを投入した負け惜しみデス)