在不安装整个 IDF 的情况下刷写 ESP32 的内存?

Flashing ESP32's memory without installing the whole IDF?

问题

我正在寻找一种无需安装整个 IDF 软件套件即可刷新 ESP32 模块内存的方法。

为什么

因为我想将 ESP32 与低性能 ARM 驱动的 CPU 集成到定制板上,后者运行一个小型 Linux 发行版(基于 Debian),我想刷入来自这个微型 Linux 发行版的 ESP32。

我知道我可以使用引导加载程序,但谁来上传初始引导加载程序?我不想做额外的步骤,所以我的想法是将 ESP32 模块嵌入到我的自定义板上,并让 Linux 从出厂状态(当它的闪存为空时,即没有预加载)引导程序)。还是串行引导加载程序 总是 预装在所有 ESP32 模块上(如 ESP-WROOM-32)?

为什么我不想使用 IDF?因为我不想构建或调试任何东西,所以我只想将 myprogram.bin 刷写到 ESP32 上。此外,由于主板性能低下,下载 运行 IDF 的所有内容需要很长时间。

当前状态

现在可以通过 UART(RX、TX、GND)看到 ESP32 模块,如果我将 GPIO0 保持在低电平,它会运行引导加载程序(我当前的模块嵌入到 NodeMCU 上 - 但没有连接 USB,这是原始 UART!):

rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))

waiting for download

对于所有 ESP32 模块,我是否可以期待相同的行为(为 运行 引导加载程序控制 GPIO0),或者这只是因为 NodeMCU 的人已经在上面预编程了一些引导加载程序?

我正在寻找一种刷入 ESP32 的方法,最好不要使用任何 python 脚本。

ESP32 在 ROM 中有一个第一阶段的引导加载程序,能够写入闪存 - 这就是打印输出的内容。如果你知道协议,你可以与它交谈——这是由 ESP IDF 中的 Python 脚本实现的。如果你不想使用官方实现因为它太重了,你将不得不编写你自己的这个协议的实现来解决你的特定问题。幸运的是,它或多或少 documented,您可能可以对官方 Python 脚本中缺失的任何知识进行逆向工程。

实际上,乐鑫还提供了一个用于刷写 ESP 的小型二进制文件:

https://github.com/espressif/esp-serial-flasher

Serial flasher component provides portable library for flashing Espressif SoCs (ESP32, ESP32-S2, ESP8266) from other host microcontroller. Espressif SoCs are normally programmed via serial interface (UART). Port layer for given host microcontroller has to be implemented, if not available.

还有一个(但非常重要的)补充: 您必须修改此 repo 以使其正常工作,而且您可能不仅需要上传二进制文件,还需要上传引导加载程序和 partition_table.