espflash --- ESP32 ROM ブートローダー ファームウェアフラッシャー¶
このモジュールは、UART 経由で ESP32 ROM ブートローダーと通信する最小限の ESPFlash 実装を提供します。これは、コンパニオンモジュール(たとえば、Arduino ボードで使用される U-blox NINA-W10 モジュール)上の ESP32 ファームウェアをシステム内で更新することを目的としており、完全な esptool ユーティリティの代替ではありません。高度な機能(スタブローダー、その他の ESP チップ、deflate、セキュアブートなど)は意図的にサポートされていません。
このドライバーは RESET と GPIO0 を切り替えて ESP32 をダウンロードモードにし、その後 SLIP フレームのコマンドを発行してフラッシュサイズの読み取り、SPI インターフェースの構成、ファームウェアイメージの書き込みを行い、MD5 ダイジェストによる検証を実施します。
Arduino Nano RP2040 Connect(espflash が現在フリーズされている唯一の OpenMV 対応ボード)の例です。NINA-W102 のリセットおよびブートストラップピンはそれぞれ RP2040 の GPIO 3 と GPIO 2 であり、NINA の UART0 は RP2040 の UART1(TX = GPIO 8、RX = 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¶
RESETとGPIO0を駆動して 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を発生させます。