espflash — programer ESP32 ROM bootloader ugrađenog programa (firmware)

Ovaj modul pruža minimalnu implementaciju ESPFlash koja komunicira s ESP32 ROM pokretačem (bootloader) putem UART-a. Namijenjen je za ažuriranje ESP32 ugrađenog programa (firmware) u sustavu na pomoćnim modulima (na primjer, U-blox NINA-W10 modul koji se koristi na Arduino pločama) i nije zamjena za potpuni alat esptool. Napredne značajke (stub loader, drugi ESP čipovi, deflate, secure boot itd.) namjerno nisu podržane.

Upravljački program preklapa RESET i GPIO0 kako bi ESP32 doveo u način preuzimanja, zatim izdaje naredbe uokvirene SLIP protokolom za čitanje veličine flash memorije, konfiguriranje SPI sučelja, zapisivanje slike ugrađenog programa (firmware) i njezinu provjeru putem MD5 sažetka.

Primjer za Arduino Nano RP2040 Connect (jedinu OpenMV-om podržanu ploču gdje je espflash trenutno zamrznut). Pinovi za resetiranje i pokretanje NINA-W102 su RP2040 GPIO 3 odnosno GPIO 2, a NINA-in UART0 je spojen na 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)

Konstruira ESPFlash objekt koji upravlja ESP32 ROM pokretačem (bootloader).

  • reset je instanca machine.Pin spojena na ESP32 RESET liniju, konfigurirana kao izlaz.

  • gpio0 je instanca machine.Pin spojena na ESP32 GPIO0 liniju, konfigurirana kao izlaz.

  • uart je instanca machine.UART spojena na ESP32 UART0 pinove. Mora biti inicijalizirana na 115200 baud s nenultim vremenom čekanja čitanja.

  • log_enabled omogućuje opširno bilježenje SLIP okvira izmijenjenih s pokretačem (bootloader). Korisno samo za otklanjanje pogrešaka.

Konstruktor će pokušati uvesti hashlib. Ako je hashlib.md5 dostupan, tekući MD5 sažetak koji koristi ESPFlash.flash_verify_file() automatski će se izračunavati tijekom zapisivanja.

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

Mijenja brzinu prijenosa (baud) UART-a pokretača (bootloader).

  • baudrate je nova brzina prijenosa (baud) na koju se prelazi. Ako se razlikuje od trenutno aktivne brzine prijenosa (baud), pokretaču (bootloader) se izdaje naredba CHANGE_BAUDRATE prije nego što se lokalni UART ponovno konfigurira.

  • timeout je rezerviran i trenutno se ne koristi.

Nema učinka ako temeljni UART objekt ne implementira metodu init().

bootloader(retry: int = 6) bool

Upravlja s RESET i GPIO0 za ulazak u ESP32 ROM način preuzimanja i sinkronizaciju s pokretačem (bootloader).

  • retry je broj pokušaja resetiranja/sinkronizacije prije odustajanja.

Vraća True u slučaju uspjeha, inače baca Exception.

flash_read_size() int

Čita SPI flash JEDEC ID i vraća veličinu flash memorije u bajtovima.

Baca Exception ako su prijavljeni bitovi veličine izvan očekivanog raspona 0x12-0x19.

flash_attach() None

Pridružuje se SPI flash memoriji. Mora se pozvati jednom nakon bootloader() i prije bilo kakve operacije čitanja/zapisivanja flash memorije.

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

Konfigurira parametre SPI flash memorije.

  • flash_size je ukupna veličina flash memorije u bajtovima, obično vrijednost koju vraća flash_read_size().

Veličine bloka, sektora i stranice fiksirane su na 64 KiB, 4 KiB odnosno 256 bajtova.

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

Zapisuje sliku ugrađenog programa (firmware) u flash memoriju počevši od pomaka 0.

  • path je putanja datotečnog sustava do binarne datoteke ugrađenog programa (firmware) koju treba zapisati u flash memoriju.

  • blksize je veličina u bajtovima svakog bloka podataka poslanog pokretaču (bootloader). Mora biti višekratnik veličine sektora.

Posljednji blok dopunjava se s 0xFF do pune blksize. Ako je podrška za MD5 dostupna, tekući MD5 sažetak ažurira se tijekom zapisivanja tako da se flash_verify_file() može pozvati bez argumenata.

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

Provjerava sadržaj flash memorije u odnosu na datoteku ugrađenog programa (firmware).

  • path je putanja datotečnog sustava do referentne binarne datoteke ugrađenog programa (firmware); njezina veličina određuje broj bajtova za provjeru.

  • digest je opcionalni unaprijed izračunati MD5 sažetak datoteke kodiran u heksadekadskom obliku. Ako je None, koristi se sažetak izračunat tijekom posljednjeg poziva flash_write_file().

  • offset je pomak u flash memoriji u bajtovima na kojem počinje provjera.

Baca Exception ako nije dostupan nijedan sažetak ili ako se sadržaj flash memorije ne podudara s referentnim sažetkom.

reboot() None

Šalje naredbu FLASH_END koja nalaže ROM pokretaču (bootloader) da ponovno pokrene ESP32 i izvrši svježe zapisani ugrađeni program (firmware). Nikakav odgovor se ne čita.