espflash — programator oprogramowania układowego bootloadera ROM ESP32

Ten moduł udostępnia minimalną implementację ESPFlash, która komunikuje się z bootloaderem ROM ESP32 przez UART. Jest przeznaczony do aktualizacji oprogramowania układowego ESP32 w systemie na modułach towarzyszących (na przykład module U-blox NINA-W10 używanym na płytkach Arduino) i nie zastępuje pełnego narzędzia esptool. Zaawansowane funkcje (loader pośredniczący, inne układy ESP, deflate, secure boot itp.) celowo nie są obsługiwane.

Sterownik przełącza RESET i GPIO0, aby wprowadzić ESP32 w tryb pobierania, a następnie wysyła komendy w ramkach SLIP w celu odczytania rozmiaru pamięci flash, skonfigurowania interfejsu SPI, zapisania obrazu oprogramowania układowego i zweryfikowania go za pomocą sumy MD5.

Przykład dla Arduino Nano RP2040 Connect (jedynej płytki obsługiwanej przez OpenMV, na której espflash jest obecnie zamrożony). Piny resetu i bootstrap NINA-W102 to odpowiednio GPIO 3 i GPIO 2 RP2040, a UART0 modułu NINA jest podłączony do UART1 RP2040 (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)

Tworzy obiekt ESPFlash, który steruje bootloaderem ROM ESP32.

  • reset to instancja machine.Pin podłączona do linii RESET ESP32, skonfigurowana jako wyjście.

  • gpio0 to instancja machine.Pin podłączona do linii GPIO0 ESP32, skonfigurowana jako wyjście.

  • uart to instancja machine.UART podłączona do pinów UART0 ESP32. Musi być zainicjalizowana z szybkością transmisji (baud) 115200 i niezerowym limitem czasu odczytu.

  • log_enabled włącza szczegółowe rejestrowanie ramek SLIP wymienianych z bootloaderem. Przydatne wyłącznie do debugowania.

Konstruktor spróbuje zaimportować hashlib. Jeśli hashlib.md5 jest dostępne, bieżąca suma MD5 używana przez ESPFlash.flash_verify_file() zostanie obliczona automatycznie podczas zapisu.

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

Zmienia szybkość transmisji (baud) bootloadera na UART.

  • baudrate to nowa szybkość transmisji (baud), na którą należy przełączyć. Jeśli różni się od aktualnie aktywnej szybkości, do bootloadera wysyłana jest komenda CHANGE_BAUDRATE przed ponownym skonfigurowaniem lokalnego UART.

  • timeout jest zarezerwowany i obecnie nieużywany.

Nie ma efektu, jeśli bazowy obiekt UART nie implementuje metody init().

bootloader(retry: int = 6) bool

Steruje RESET i GPIO0, aby wejść w tryb pobierania ROM ESP32 i zsynchronizować się z bootloaderem.

  • retry to liczba prób resetu/synchronizacji przed rezygnacją.

Zwraca True w przypadku powodzenia, w przeciwnym razie zgłasza Exception.

flash_read_size() int

Odczytuje identyfikator JEDEC pamięci flash SPI i zwraca rozmiar pamięci flash w bajtach.

Zgłasza Exception, jeśli raportowane bity rozmiaru są poza oczekiwanym zakresem 0x12-0x19.

flash_attach() None

Podłącza się do pamięci flash SPI. Musi być wywołane raz po bootloader() i przed jakąkolwiek operacją odczytu/zapisu pamięci flash.

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

Konfiguruje parametry pamięci flash SPI.

  • flash_size to całkowity rozmiar pamięci flash w bajtach, zazwyczaj wartość zwracana przez flash_read_size().

Rozmiary bloku, sektora i strony są ustalone odpowiednio na 64 KiB, 4 KiB i 256 bajtów.

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

Zapisuje obraz oprogramowania układowego do pamięci flash, zaczynając od przesunięcia 0.

  • path to ścieżka w systemie plików do binarnego pliku oprogramowania układowego, które ma zostać zapisane do pamięci flash.

  • blksize to rozmiar w bajtach każdego bloku danych wysyłanego do bootloadera. Musi być wielokrotnością rozmiaru sektora.

Ostatni blok jest uzupełniany wartością 0xFF do pełnego blksize. Jeśli obsługa MD5 jest dostępna, bieżąca suma MD5 jest aktualizowana podczas zapisu, dzięki czemu flash_verify_file() można wywołać bez argumentów.

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

Weryfikuje zawartość pamięci flash względem pliku oprogramowania układowego.

  • path to ścieżka w systemie plików do referencyjnego binarnego pliku oprogramowania układowego; jego rozmiar określa liczbę bajtów do zweryfikowania.

  • digest to opcjonalna, wstępnie obliczona suma MD5 pliku zakodowana szesnastkowo. Jeśli None, używana jest suma obliczona podczas ostatniego wywołania flash_write_file().

  • offset to przesunięcie w pamięci flash w bajtach, od którego rozpoczyna się weryfikacja.

Zgłasza Exception, jeśli żadna suma nie jest dostępna lub jeśli zawartość pamięci flash nie zgadza się z sumą referencyjną.

reboot() None

Wysyła komendę FLASH_END, która instruuje bootloader ROM, aby ponownie uruchomił ESP32 i uruchomił świeżo zapisane oprogramowanie układowe. Żadna odpowiedź nie jest odczytywana.