espflash --- ESP32 ROM ブートローダー ファームウェアフラッシャー

このモジュールは、UART 経由で ESP32 ROM ブートローダーと通信する最小限の ESPFlash 実装を提供します。これは、コンパニオンモジュール(たとえば、Arduino ボードで使用される U-blox NINA-W10 モジュール)上の ESP32 ファームウェアをシステム内で更新することを目的としており、完全な esptool ユーティリティの代替ではありません。高度な機能(スタブローダー、その他の ESP チップ、deflate、セキュアブートなど)は意図的にサポートされていません。

このドライバーは RESETGPIO0 を切り替えて ESP32 をダウンロードモードにし、その後 SLIP フレームのコマンドを発行してフラッシュサイズの読み取り、SPI インターフェースの構成、ファームウェアイメージの書き込みを行い、MD5 ダイジェストによる検証を実施します。

Arduino Nano RP2040 Connect(espflash が現在フリーズされている唯一の OpenMV 対応ボード)の例です。NINA-W102 のリセットおよびブートストラップピンはそれぞれ RP2040 の GPIO 3GPIO 2 であり、NINA の UART0 は RP2040 の UART1TX = GPIO 8RX = GPIO 9)に配線されています:

from machine import Pin, UART
from espflash import ESPFlash

reset = Pin(3, Pin.OUT)                                    # NINA RESET
gpio0 = Pin(2, Pin.OUT)                                    # NINA GPIO0
uart = UART(1, 115200, timeout=1000)

esp = ESPFlash(reset, gpio0, uart)
esp.bootloader()
esp.set_baudrate(921600)
size = esp.flash_read_size()
esp.flash_attach()
esp.flash_config(size)
esp.flash_write_file("NINA_FW.bin")
esp.flash_verify_file("NINA_FW.bin")
esp.reboot()

class ESPFlash

class espflash.ESPFlash(reset: 'machine.Pin', gpio0: 'machine.Pin', uart: 'machine.UART', log_enabled: bool = False)

ESP32 ROM ブートローダーを駆動する ESPFlash オブジェクトを構築します。

  • reset は、ESP32 の RESET ラインに接続され、出力として構成された machine.Pin インスタンスです。

  • gpio0 は、ESP32 の GPIO0 ラインに接続され、出力として構成された machine.Pin インスタンスです。

  • uart は、ESP32 の UART0 ピンに接続された machine.UART インスタンスです。115200 ボーで、ゼロでない読み取りタイムアウトを設定して初期化する必要があります。

  • log_enabled は、ブートローダーとやり取りされる SLIP フレームの詳細ログを有効にします。デバッグ目的のみに有用です。

コンストラクターは hashlib のインポートを試みます。hashlib.md5 が利用可能な場合、ESPFlash.flash_verify_file() で使用される実行中の MD5 ダイジェストが、書き込み中に自動的に計算されます。

set_baudrate(baudrate: int, timeout: int = 350) None

ブートローダーの UART ボーレートを変更します。

  • baudrate は、切り替える新しいボーレートです。現在アクティブなボーレートと異なる場合、ローカル UART が再構成される前に CHANGE_BAUDRATE コマンドがブートローダーに発行されます。

  • timeout は予約済みで、現在は未使用です。

基盤となる UART オブジェクトが init() メソッドを実装していない場合は、何も起こりません。

bootloader(retry: int = 6) bool

RESETGPIO0 を駆動して ESP32 ROM ダウンロードモードに入り、ブートローダーと同期します。

  • retry は、あきらめるまでのリセット/同期試行の回数です。

成功時には True を返し、それ以外の場合は Exception を発生させます。

flash_read_size() int

SPI フラッシュの JEDEC ID を読み取り、フラッシュサイズをバイト単位で返します。

報告されたサイズビットが想定される 0x12-0x19 の範囲外である場合は、Exception を発生させます。

flash_attach() None

SPI フラッシュにアタッチします。bootloader() の後、かつフラッシュの読み書き操作の前に一度だけ呼び出す必要があります。

flash_config(flash_size: int = 2 * 1024 * 1024) None

SPI フラッシュのパラメーターを構成します。

  • flash_size は、フラッシュの合計サイズ(バイト単位)で、通常は flash_read_size() が返す値です。

ブロック、セクター、ページのサイズは、それぞれ 64 KiB、4 KiB、256 バイトに固定されています。

flash_write_file(path: str, blksize: int = 0x1000) None

ファームウェアイメージをオフセット 0 から開始してフラッシュに書き込みます。

  • path は、フラッシュするファームウェアバイナリのファイルシステムパスです。

  • blksize は、ブートローダーに送信される各データブロックのサイズ(バイト単位)です。セクターサイズの倍数でなければなりません。

最後のブロックは 0xFF でパディングされ、完全な blksize になります。MD5 サポートが利用可能な場合、書き込み中に実行中の MD5 ダイジェストが更新されるため、flash_verify_file() を引数なしで呼び出すことができます。

flash_verify_file(path: str, digest: bytes | None = None, offset: int = 0) None

フラッシュの内容をファームウェアファイルと照合して検証します。

  • path は、参照ファームウェアバイナリのファイルシステムパスです。そのサイズによって検証するバイト数が決まります。

  • digest は、ファイルの事前計算された 16 進エンコード MD5 ダイジェスト(任意)です。None の場合、最新の flash_write_file() 呼び出し中に計算されたダイジェストが使用されます。

  • offset は、検証を開始するフラッシュオフセット(バイト単位)です。

ダイジェストが利用できない場合、またはフラッシュの内容が参照ダイジェストと一致しない場合は、Exception を発生させます。

reboot() None

ROM ブートローダーに ESP32 を再起動して新しくフラッシュされたファームウェアを実行するよう指示する FLASH_END コマンドを送信します。応答は読み取られません。