Crimson
$ ./run.sh chip
ESP32, firmware en 0x1000
$ ./run.sh micropython
  verificado: md5 9e1d0c…
$ ./run.sh subir
  micropython/main.py → /main.py

brasa

Un cargador de ESP32 por línea de comandos. Le graba el firmware al chip, y cuando ya corre MicroPython le lleva y le trae archivos.

Estado
Probada con un ESP32 clásico
Desarrollo
4.6 h

Un cargador de ESP32 que se maneja desde la terminal del Mac. Cada orden hace una cosa sobre el chip enchufado al USB. En español al firmware se lo quema. De ahí el nombre.

Con el chip en blanco, brasa lo manda al cargador de fábrica que trae en la ROM y le graba lo que haga falta. Cuando ya corre MicroPython, entra por su REPL. Le sube archivos y le corre programas sin grabarlos.

Lo que se escribe en la flash se compara contra el MD5 que calcula el chip. Si no coincide, lo dice.

Está escrita en Punk. Al lado del código van las carpetas con lo que brasa le manda al chip.

  • firmware/ guarda el binario de MicroPython que graba la orden micropython. Un script lo baja de micropython.org.
  • micropython/ es lo que subir pone en la raíz del chip. Trae un main.py que hace parpadear el LED de la placa y saluda por el puerto.
  • cpp/ es un sketch de Arduino que la orden cpp compila con arduino-cli y graba. Hace lo mismo que el main.py, en C++.

Funcionalidades

El chip

  • puertos lista los puertos USB serie. Sin placa, o con un cable que sólo carga, no sale ninguno.
  • chip dice qué chip hay del otro lado y en qué dirección va su firmware. Reconoce el ESP32 y los S2, S3, C3, C6 y H2.
  • El tamaño de la flash se le pregunta a la propia flash.
  • seguridad lee los eFuses. La MAC, la revisión y el encapsulado, si hay cifrado de flash o secure boot, el JTAG, y el registro de estado de la flash.
  • Con el chip cerrado, las órdenes que graban se niegan. --forzar graba igual.
  • pins muestra cada GPIO con su dirección, su nivel, su pull y su función, y para qué sirve ese pin en la DevKit. Por MicroPython se ve lo que el programa configuró. Con --rom se ve el estado de arranque.
  • reg lee o escribe una palabra de 32 bits en cualquier dirección del chip.
  • reset lo reinicia. bootloader lo deja esperando en el cargador, con el puerto libre para otra herramienta.

Grabar

  • borrar pone la flash entera en 0xFF y lo verifica.
  • grabar escribe un binario en una dirección.
  • micropython graba MicroPython en la dirección de arranque que le toca al chip.
  • cpp compila el sketch y graba lo que sale, recortado hasta el último sector con datos. Con --compilar sólo compila, y no hace falta placa.
  • verificar compara un archivo con la flash sin escribir nada. Si difieren, dice cuáles sectores de 4 KB.
  • md5 da el que la ROM calcula de una región.
  • Después del enganche la velocidad sube a 921.600 baudios. Con --lento se queda en 115.200.

Leer la flash

  • leer saca una región por la ROM, sin MicroPython. Sirve con un firmware de C++ o con un chip que no arranca.
  • dump hace el volcado hexadecimal de una partición, por MicroPython. Bootloader, tabla, nvs, phy_init, factory o vfs. Con --decode, la nvs sale clave por clave.
  • respaldar baja la flash entera a un archivo. Lo borrado no viaja.
  • restaurar graba esa imagen en 0x0 y la verifica.

MicroPython

  • subir manda un archivo, o la carpeta con sus subcarpetas, a la raíz del chip.
  • bajar trae un archivo al Mac. Uno que ya exista se pisa sólo con --pisar.
  • correr ejecuta en el chip un archivo del Mac, sin grabarlo, y muestra lo que imprime hasta que termina.
  • repl corre una línea de Python y muestra la salida.
  • estado da la versión de MicroPython, la frecuencia de la CPU, la flash y la RAM libre, el sistema de archivos, el id del chip y la causa del último reinicio.
  • listar da el árbol de archivos con sus tamaños, y ver muestra uno.
  • quitar borra un archivo o una carpeta. limpiar vacía la raíz y MicroPython queda.
  • Al terminar, el chip se reinicia en blando y el main.py arranca de nuevo.
  • monitor muestra lo que el chip escribe por el puerto. rmonitor lo reinicia primero, y se ven los mensajes de arranque.

Cómo se usa

Una placa nueva, de punta a punta:

./build.sh                # brasa, en bin/
./firmware/bajar.sh       # el binario de MicroPython
./run.sh chip             # qué hay del otro lado
./run.sh borrar           # la flash entera, verificada
./run.sh micropython      # graba MicroPython
./run.sh subir            # micropython/ a la raíz del chip
./run.sh monitor          # lo que imprime el main.py

Con --puerto=/dev/cu.xxx se elige el puerto. Sin él, brasa toma el primer cu.usb*.

← todos los proyectos