espflash --- pemflash firmware bootloader ROM ESP32

Modul ini menyediakan implementasi minimal ESPFlash yang berkomunikasi dengan bootloader ROM ESP32 melalui UART. Modul ini ditujukan untuk pembaruan firmware ESP32 secara in-system pada modul kompanion (misalnya, modul U-blox NINA-W10 yang digunakan pada papan Arduino), dan bukan pengganti utilitas esptool lengkap. Fitur-fitur lanjutan (stub loader, chip ESP lain, deflate, secure boot, dll.) tidak didukung secara sengaja.

Driver ini mengaktifkan RESET dan GPIO0 untuk menempatkan ESP32 ke mode unduh, kemudian mengeluarkan perintah bertingkai SLIP untuk membaca ukuran flash, mengonfigurasi antarmuka SPI, menulis citra firmware dan memverifikasinya melalui digest MD5.

Contoh untuk Arduino Nano RP2040 Connect (satu-satunya papan yang didukung OpenMV di mana espflash saat ini dibekukan). Pin reset dan boot-strap NINA-W102 adalah RP2040 GPIO 3 dan GPIO 2 masing-masing, dan UART0 NINA dihubungkan ke 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)

Membuat objek ESPFlash yang mengendalikan bootloader ROM ESP32.

  • reset adalah instans machine.Pin yang terhubung ke jalur RESET ESP32, dikonfigurasi sebagai output.

  • gpio0 adalah instans machine.Pin yang terhubung ke jalur GPIO0 ESP32, dikonfigurasi sebagai output.

  • uart adalah instans machine.UART yang terhubung ke pin UART0 ESP32. Harus diinisialisasi pada laju baud 115200 dengan timeout baca bukan nol.

  • log_enabled mengaktifkan pencatatan verbose dari bingkai SLIP yang dipertukarkan dengan bootloader. Berguna hanya untuk debugging.

Konstruktor akan mencoba mengimpor hashlib. Jika hashlib.md5 tersedia, digest MD5 yang berjalan yang digunakan oleh ESPFlash.flash_verify_file() akan dihitung secara otomatis saat penulisan.

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

Ubah laju baud UART bootloader.

  • baudrate adalah laju baud baru untuk beralih. Jika berbeda dari laju baud yang aktif saat ini, perintah CHANGE_BAUDRATE dikirim ke bootloader sebelum UART lokal dikonfigurasi ulang.

  • timeout dicadangkan dan saat ini tidak digunakan.

Tidak berpengaruh jika objek UART yang mendasarinya tidak mengimplementasikan metode init().

bootloader(retry: int = 6) bool

Aktifkan RESET dan GPIO0 untuk masuk ke mode unduh ROM ESP32 dan sinkronisasi dengan bootloader.

  • retry adalah jumlah percobaan reset/sinkronisasi sebelum menyerah.

Mengembalikan True jika berhasil, jika tidak maka akan memunculkan Exception.

flash_read_size() int

Baca JEDEC ID flash SPI dan kembalikan ukuran flash dalam byte.

Memunculkan Exception jika bit ukuran yang dilaporkan berada di luar rentang 0x12-0x19 yang diharapkan.

flash_attach() None

Sambungkan ke flash SPI. Harus dipanggil sekali setelah bootloader() dan sebelum operasi baca/tulis flash apa pun.

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

Konfigurasikan parameter flash SPI.

  • flash_size adalah total ukuran flash dalam byte, biasanya nilai yang dikembalikan oleh flash_read_size().

Ukuran blok, sektor, dan halaman ditetapkan masing-masing pada 64 KiB, 4 KiB, dan 256 byte.

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

Tulis citra firmware ke flash mulai dari offset 0.

  • path adalah jalur filesystem dari biner firmware yang akan di-flash.

  • blksize adalah ukuran dalam byte dari setiap blok data yang dikirim ke bootloader. Harus merupakan kelipatan dari ukuran sektor.

Blok terakhir diisi dengan 0xFF hingga blksize penuh. Jika dukungan MD5 tersedia, digest MD5 yang berjalan diperbarui selama penulisan sehingga flash_verify_file() dapat dipanggil tanpa argumen.

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

Verifikasi isi flash terhadap berkas firmware.

  • path adalah jalur filesystem dari biner firmware referensi; ukurannya menentukan jumlah byte yang akan diverifikasi.

  • digest adalah digest MD5 yang dikodekan hex yang telah dihitung sebelumnya secara opsional dari berkas tersebut. Jika None, digest yang dihitung selama pemanggilan flash_write_file() terbaru digunakan.

  • offset adalah offset flash dalam byte di mana verifikasi dimulai.

Memunculkan Exception jika tidak ada digest yang tersedia atau jika isi flash tidak cocok dengan digest referensi.

reboot() None

Kirim perintah FLASH_END yang menginstruksikan bootloader ROM untuk me-reboot ESP32 dan menjalankan firmware yang baru di-flash. Tidak ada respons yang dibaca.