Flash encryption modeになってTiny-BASICしか動かなくなったESP32を復旧させます。

ESP-IDF toolchainをインストールします。最初,Wndows10へのインストールを試みましたが容量大きすぎで断念。Win版ESP-IDFはMinGWでpython実行環境を構築しその中でtoolchain動かす遠回りな仕組みなので,Linuxにインストールした方が相性いいのではないかと考えてUbuntuに入れることとしました。

まず,ESP-IDF toolchain専用のコンパクトなUbuntu-Linux環境を構築します。

次にココを参照してtoolchainをインストールします。

Set up of Toolchain for Linux

ファイル群のダウンロードやディレクトリの配置が終ったら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モジュール内部の探索ができるようになったので良しとします。(無駄なリソースを投入した負け惜しみデス)