espflash — ESP32 ROM rendszerbetöltő firmware-villantó

Ez a modul egy minimális ESPFlash implementációt biztosít, amely UART-on keresztül kommunikál az ESP32 ROM rendszerbetöltőjével. Rendszeren belüli (in-system) firmware-frissítésekre szolgál a kísérőmodulok ESP32 firmware-éhez (például az Arduino kártyákon használt U-blox NINA-W10 modulhoz), és nem helyettesíti a teljes esptool segédprogramot. A speciális funkciók (stub loader, más ESP chipek, deflate, secure boot stb.) szándékosan nem támogatottak.

A meghajtó a RESET és a GPIO0 lábak állapotát váltogatva letöltési módba helyezi az ESP32-t, majd SLIP-keretezésű parancsokat ad ki a flash memória méretének beolvasásához, az SPI interfész konfigurálásához, a firmware-kép kiírásához és annak MD5 ellenőrzőösszeggel történő ellenőrzéséhez.

Példa az Arduino Nano RP2040 Connect kártyához (az egyetlen OpenMV által támogatott kártya, ahol az espflash jelenleg be van fagyasztva). A NINA-W102 reset és boot-strap lábai rendre az RP2040 GPIO 3 és GPIO 2 lábai, a NINA UART0-ja pedig az RP2040 UART1-éhez van kötve (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)

Létrehoz egy ESPFlash objektumot, amely az ESP32 ROM rendszerbetöltőjét vezérli.

  • A reset egy machine.Pin példány, amely az ESP32 RESET vonalához csatlakozik, kimenetként konfigurálva.

  • A gpio0 egy machine.Pin példány, amely az ESP32 GPIO0 vonalához csatlakozik, kimenetként konfigurálva.

  • Az uart egy machine.UART példány, amely az ESP32 UART0 lábaihoz csatlakozik. 115200 baud sebességre és nem nulla olvasási időtúllépésre kell inicializálni.

  • A log_enabled engedélyezi a rendszerbetöltővel kicserélt SLIP-keretek részletes naplózását. Csak hibakereséshez hasznos.

A konstruktor megpróbálja importálni a hashlib modult. Ha a hashlib.md5 elérhető, akkor a ESPFlash.flash_verify_file() által használt futó MD5 ellenőrzőösszeg automatikusan kiszámításra kerül az írás közben.

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

Megváltoztatja a rendszerbetöltő UART átviteli sebességét (baud).

  • A baudrate az új átviteli sebesség (baud), amelyre váltani kell. Ha eltér a jelenleg aktív sebességtől, a helyi UART újrakonfigurálása előtt egy CHANGE_BAUDRATE parancs kerül kiadásra a rendszerbetöltőnek.

  • A timeout fenntartott, és jelenleg nincs használatban.

Nincs hatása, ha a mögöttes UART objektum nem implementál init() metódust.

bootloader(retry: int = 6) bool

Vezérli a RESET és a GPIO0 lábakat az ESP32 ROM letöltési módba lépéséhez, és szinkronizál a rendszerbetöltővel.

  • A retry a reset/szinkronizálási kísérletek száma a feladás előtt.

Sikeresség esetén True értéket ad vissza, egyébként Exception kivételt vált ki.

flash_read_size() int

Beolvassa az SPI flash JEDEC azonosítóját, és bájtban adja vissza a flash memória méretét.

Exception kivételt vált ki, ha a jelentett méretbitek a várt 0x12-0x19 tartományon kívül esnek.

flash_attach() None

Csatlakozik az SPI flash memóriához. Egyszer kell meghívni a bootloader() után és bármilyen flash olvasási/írási művelet előtt.

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

Konfigurálja az SPI flash paramétereit.

  • A flash_size a flash memória teljes mérete bájtban, jellemzően a flash_read_size() által visszaadott érték.

A blokk-, szektor- és lapméretek rögzítettek, rendre 64 KiB, 4 KiB és 256 bájt.

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

Kiír egy firmware-képet a flash memóriába a 0 eltolástól kezdődően.

  • A path a flash memóriába írandó firmware bináris fájlrendszerbeli elérési útja.

  • A blksize a rendszerbetöltőnek küldött egyes adatblokkok mérete bájtban. A szektorméret többszörösének kell lennie.

Az utolsó blokk 0xFF értékkel van kitöltve a teljes blksize eléréséig. Ha az MD5 támogatás elérhető, a futó MD5 ellenőrzőösszeg az írás közben frissül, így a flash_verify_file() argumentumok nélkül meghívható.

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

Ellenőrzi a flash memória tartalmát egy firmware-fájllal összevetve.

  • A path a referencia firmware bináris fájlrendszerbeli elérési útja; mérete határozza meg az ellenőrizendő bájtok számát.

  • A digest a fájl opcionális, előre kiszámított, hexadecimálisan kódolt MD5 ellenőrzőösszege. Ha None, akkor a legutóbbi flash_write_file() hívás során kiszámított ellenőrzőösszeg kerül felhasználásra.

  • Az offset a flash memória eltolása bájtban, ahol az ellenőrzés kezdődik.

Exception kivételt vált ki, ha nincs elérhető ellenőrzőösszeg, vagy ha a flash memória tartalma nem egyezik a referencia ellenőrzőösszeggel.

reboot() None

Elküld egy FLASH_END parancsot, amely utasítja a ROM rendszerbetöltőt, hogy indítsa újra az ESP32-t, és futtassa a frissen kiírt firmware-t. Nem olvas választ.