espflash — flashare för ESP32 ROM-startladdarens fasta programvara

Denna modul tillhandahåller en minimal ESPFlash-implementation som kommunicerar med ESP32:s ROM-startladdare via en UART. Den är avsedd för uppdateringar i systemet av ESP32:s fasta programvara på medföljande moduler (till exempel U-blox NINA-W10-modulen som används på Arduino-kort), och är inte en ersättning för det fullständiga verktyget esptool. Avancerade funktioner (stub-laddare, andra ESP-chip, deflate, säker uppstart osv.) stöds avsiktligt inte.

Drivrutinen växlar RESET och GPIO0 för att försätta ESP32 i nedladdningsläge och utfärdar sedan SLIP-inramade kommandon för att läsa flashminnets storlek, konfigurera SPI-gränssnittet, skriva avbildningen av den fasta programvaran och verifiera den via en MD5-sammanfattning.

Exempel för Arduino Nano RP2040 Connect (det enda OpenMV-stödda kortet där espflash för närvarande är fryst). NINA-W102:s reset- och boot-strap-stift är RP2040 GPIO 3 respektive GPIO 2, och NINA:s UART0 är kopplad till 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)

Konstruera ett ESPFlash-objekt som driver ESP32:s ROM-startladdare.

  • reset är en machine.Pin-instans ansluten till ESP32:s RESET-linje, konfigurerad som en utgång.

  • gpio0 är en machine.Pin-instans ansluten till ESP32:s GPIO0-linje, konfigurerad som en utgång.

  • uart är en machine.UART-instans ansluten till ESP32:s UART0-stift. Den måste initieras med 115200 baud och en read timeout som inte är noll.

  • log_enabled aktiverar utförlig loggning av de SLIP-ramar som utbyts med startladdaren. Användbart endast för felsökning.

Konstruktorn försöker importera hashlib. Om hashlib.md5 är tillgänglig beräknas den löpande MD5-sammanfattning som används av ESPFlash.flash_verify_file() automatiskt under skrivningen.

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

Ändra startladdarens UART-baudhastighet.

  • baudrate är den nya baudhastighet att växla till. Om den skiljer sig från den för närvarande aktiva baudhastigheten utfärdas ett CHANGE_BAUDRATE-kommando till startladdaren innan den lokala UART:en omkonfigureras.

  • timeout är reserverad och används för närvarande inte.

Har ingen effekt om det underliggande UART-objektet inte implementerar en init()-metod.

bootloader(retry: int = 6) bool

Driv RESET och GPIO0 för att gå in i ESP32:s ROM-nedladdningsläge och synkronisera med startladdaren.

  • retry är antalet reset/sync-försök innan man ger upp.

Returnerar True vid framgång, annars utlöses ett Exception.

flash_read_size() int

Läs SPI-flashminnets JEDEC-ID och returnera flashminnets storlek i byte.

Utlöser ett Exception om de rapporterade storleksbitarna ligger utanför det förväntade intervallet 0x12-0x19.

flash_attach() None

Anslut till SPI-flashminnet. Måste anropas en gång efter bootloader() och före all läs-/skrivoperation på flashminnet.

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

Konfigurera parametrarna för SPI-flashminnet.

  • flash_size är flashminnets totala storlek i byte, vanligtvis värdet som returneras av flash_read_size().

Block-, sektor- och sidstorlekar är fasta till 64 KiB, 4 KiB respektive 256 byte.

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

Skriv en avbildning av fast programvara till flashminnet med början vid offset 0.

  • path är filsystemssökvägen till den binärfil med fast programvara som ska flashas.

  • blksize är storleken i byte på varje datablock som skickas till startladdaren. Måste vara en multipel av sektorstorleken.

Det sista blocket fylls ut med 0xFF till en full blksize. Om MD5-stöd är tillgängligt uppdateras den löpande MD5-sammanfattningen under skrivningen så att flash_verify_file() kan anropas utan argument.

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

Verifiera innehållet i flashminnet mot en fil med fast programvara.

  • path är filsystemssökvägen till referensbinärfilen med fast programvara; dess storlek avgör antalet byte som ska verifieras.

  • digest är en valfri förberäknad hex-kodad MD5-sammanfattning av filen. Om None används den sammanfattning som beräknades under det senaste anropet till flash_write_file().

  • offset är flash-offset i byte där verifieringen börjar.

Utlöser ett Exception om ingen sammanfattning är tillgänglig eller om flashminnets innehåll inte matchar referenssammanfattningen.

reboot() None

Skicka ett FLASH_END-kommando som instruerar ROM-startladdaren att starta om ESP32 och köra den nyss flashade fasta programvaran. Inget svar läses.