espflash — Programmateur de micrologiciel pour le programme d’amorçage ROM de l’ESP32

Ce module fournit une implémentation minimale de ESPFlash qui communique avec le programme d’amorçage ROM de l’ESP32 via une UART. Il est destiné aux mises à jour in-system du micrologiciel de l’ESP32 sur les modules compagnons (par exemple, le module U-blox NINA-W10 utilisé sur les cartes Arduino), et ne remplace pas l’utilitaire complet esptool. Les fonctionnalités avancées (chargeur stub, autres puces ESP, deflate, démarrage sécurisé, etc.) ne sont volontairement pas prises en charge.

Le pilote bascule RESET et GPIO0 pour mettre l’ESP32 en mode téléchargement, puis émet des commandes encadrées en SLIP pour lire la taille de la mémoire flash, configurer l’interface SPI, écrire l’image du micrologiciel et la vérifier au moyen d’une empreinte MD5.

Exemple pour l’Arduino Nano RP2040 Connect (la seule carte prise en charge par OpenMV où espflash est actuellement figé dans le micrologiciel). Les broches de réinitialisation et de boot-strap du NINA-W102 sont respectivement les GPIO 3 et GPIO 2 du RP2040, et l”UART0 du NINA est câblée à l”UART1 du 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)

Construit un objet ESPFlash qui pilote le programme d’amorçage ROM de l’ESP32.

  • reset est une instance machine.Pin connectée à la ligne RESET de l’ESP32, configurée en sortie.

  • gpio0 est une instance machine.Pin connectée à la ligne GPIO0 de l’ESP32, configurée en sortie.

  • uart est une instance machine.UART connectée aux broches UART0 de l’ESP32. Elle doit être initialisée à 115200 bauds avec un délai d’attente de lecture non nul.

  • log_enabled active la journalisation détaillée des trames SLIP échangées avec le programme d’amorçage. Utile uniquement pour le débogage.

Le constructeur tentera d’importer hashlib. Si hashlib.md5 est disponible, l’empreinte MD5 calculée au fil de l’eau et utilisée par ESPFlash.flash_verify_file() sera calculée automatiquement pendant l’écriture.

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

Change le débit en bauds de l’UART du programme d’amorçage.

  • baudrate est le nouveau débit en bauds vers lequel basculer. S’il diffère du débit en bauds actuellement actif, une commande CHANGE_BAUDRATE est émise vers le programme d’amorçage avant que l’UART locale ne soit reconfigurée.

  • timeout est réservé et actuellement inutilisé.

N’a aucun effet si l’objet UART sous-jacent n’implémente pas de méthode init().

bootloader(retry: int = 6) bool

Pilote RESET et GPIO0 pour entrer en mode téléchargement ROM de l’ESP32 et se synchroniser avec le programme d’amorçage.

  • retry est le nombre de tentatives de réinitialisation/synchronisation avant d’abandonner.

Renvoie True en cas de succès, sinon lève une Exception.

flash_read_size() int

Lit l’identifiant JEDEC de la mémoire flash SPI et renvoie la taille de la mémoire flash en octets.

Lève une Exception si les bits de taille signalés sont hors de la plage attendue 0x12-0x19.

flash_attach() None

Se rattache à la mémoire flash SPI. Doit être appelée une fois après bootloader() et avant toute opération de lecture/écriture en mémoire flash.

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

Configure les paramètres de la mémoire flash SPI.

  • flash_size est la taille totale de la mémoire flash en octets, généralement la valeur renvoyée par flash_read_size().

Les tailles de bloc, de secteur et de page sont fixées respectivement à 64 KiB, 4 KiB et 256 octets.

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

Écrit une image de micrologiciel en mémoire flash en commençant à l’offset 0.

  • path est le chemin dans le système de fichiers du binaire de micrologiciel à programmer.

  • blksize est la taille en octets de chaque bloc de données envoyé au programme d’amorçage. Doit être un multiple de la taille de secteur.

Le dernier bloc est complété avec 0xFF jusqu’à atteindre une taille blksize complète. Si la prise en charge de MD5 est disponible, l’empreinte MD5 calculée au fil de l’eau est mise à jour pendant l’écriture afin que flash_verify_file() puisse être appelée sans arguments.

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

Vérifie le contenu de la mémoire flash par rapport à un fichier de micrologiciel.

  • path est le chemin dans le système de fichiers du binaire de micrologiciel de référence ; sa taille détermine le nombre d’octets à vérifier.

  • digest est une empreinte MD5 optionnelle, pré-calculée et encodée en hexadécimal, du fichier. Si None, l’empreinte calculée lors du plus récent appel à flash_write_file() est utilisée.

  • offset est l’offset en octets dans la mémoire flash à partir duquel commence la vérification.

Lève une Exception si aucune empreinte n’est disponible ou si le contenu de la mémoire flash ne correspond pas à l’empreinte de référence.

reboot() None

Envoie une commande FLASH_END qui ordonne au programme d’amorçage ROM de redémarrer l’ESP32 et d’exécuter le micrologiciel fraîchement programmé. Aucune réponse n’est lue.