espflash — прошивальник мікропрограми ESP32 ROM завантажувача

Цей модуль надає мінімальну реалізацію ESPFlash, яка спілкується з ROM завантажувачем ESP32 через UART. Призначений для оновлення мікропрограми ESP32 у супутніх модулях прямо в системі (наприклад, модуль U-blox NINA-W10, що використовується на платах Arduino), і не є заміною повноцінної утиліти esptool. Розширені функції (stub loader, інші чіпи ESP, стиснення, безпечне завантаження тощо) навмисно не підтримуються.

Драйвер перемикає RESET та GPIO0, щоб перевести ESP32 у режим завантаження, після чого надсилає SLIP-фреймовані команди для читання розміру флеш-пам’яті, налаштування інтерфейсу SPI, запису образу мікропрограми та його верифікації через MD5-дайджест.

Приклад для Arduino Nano RP2040 Connect (єдина плата з підтримкою OpenMV, де espflash наразі заморожений). Піни скидання та завантаження NINA-W102 відповідають RP2040 GPIO 3 та GPIO 2, а UART0 NINA підключений до 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)

Створює об’єкт ESPFlash, який керує ROM завантажувачем ESP32.

  • reset — екземпляр machine.Pin, підключений до лінії RESET ESP32, налаштований як вихід.

  • gpio0 — екземпляр machine.Pin, підключений до лінії GPIO0 ESP32, налаштований як вихід.

  • uart — екземпляр machine.UART, підключений до виводів UART0 ESP32. Має бути ініціалізований зі швидкістю 115200 бод та ненульовим таймаутом читання.

  • log_enabled вмикає докладне журналювання SLIP-фреймів, що обмінюються з завантажувачем. Корисно лише для налагодження.

Конструктор намагатиметься імпортувати hashlib. Якщо hashlib.md5 доступний, поточний MD5-дайджест, що використовується ESPFlash.flash_verify_file(), обчислюватиметься автоматично під час запису.

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

Змінює швидкість передачі UART завантажувача.

  • baudrate — нова швидкість передачі. Якщо відрізняється від поточної активної, команда CHANGE_BAUDRATE надсилається до завантажувача перед перенастройкою локального UART.

  • timeout зарезервований і наразі не використовується.

Не має ефекту, якщо об’єкт базового UART не реалізує метод init().

bootloader(retry: int = 6) bool

Керує RESET та GPIO0 для входу в режим завантаження ROM ESP32 та синхронізації з завантажувачем.

  • retry — кількість спроб скидання/синхронізації перед відмовою.

Повертає True у разі успіху, інакше генерує виключення Exception.

flash_read_size() int

Зчитує JEDEC ID SPI флеш-пам’яті та повертає її розмір у байтах.

Генерує Exception, якщо повідомлені біти розміру виходять за межі очікуваного діапазону 0x12-0x19.

flash_attach() None

Підключається до SPI флеш-пам’яті. Має бути викликано один раз після bootloader() і перед будь-якою операцією читання/запису флеш-пам’яті.

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

Налаштовує параметри SPI флеш-пам’яті.

  • flash_size — загальний розмір флеш-пам’яті в байтах, зазвичай значення, повернуте flash_read_size().

Розміри блоку, сектора та сторінки фіксовані: 64 КіБ, 4 КіБ і 256 байт відповідно.

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

Записує образ мікропрограми у флеш-пам’ять починаючи зі зміщення 0.

  • path — шлях у файловій системі до бінарного файлу мікропрограми для прошивки.

  • blksize — розмір у байтах кожного блоку даних, що надсилається до завантажувача. Має бути кратним розміру сектора.

Останній блок доповнюється значеннями 0xFF до повного blksize. Якщо підтримка MD5 доступна, поточний MD5-дайджест оновлюється під час запису, щоб flash_verify_file() можна було викликати без аргументів.

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

Перевіряє вміст флеш-пам’яті відносно файлу мікропрограми.

  • path — шлях у файловій системі до еталонного бінарного файлу мікропрограми; його розмір визначає кількість байтів для верифікації.

  • digest — необов’язковий попередньо обчислений MD5-дайджест файлу в шістнадцятковому кодуванні. Якщо None, використовується дайджест, обчислений під час останнього виклику flash_write_file().

  • offset — зміщення у флеш-пам’яті в байтах, з якого починається верифікація.

Генерує Exception, якщо дайджест недоступний або вміст флеш-пам’яті не відповідає еталонному дайджесту.

reboot() None

Надсилає команду FLASH_END, яка інструктує ROM завантажувач перезавантажити ESP32 і запустити щойно прошиту мікропрограму. Відповідь не зчитується.