FAQ
Make boot silent
Section titled “Make boot silent”On every reset, the ESP ROM bootloader (stage 1) prints a diagnostic report on the default console (UART0 and/or USB Serial/JTAG). This output can disturb the communication between the ESP and the connected controller (3D printer, CNC board, etc.).
The output varies from chip to chip but generally looks like this:
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)configsip: 0, SPIWP:0xeeclk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00mode:DIO, clock div:2load:0x3fff0030,len:1184load:0x40078000,len:13104load:0x40080400,len:3036entry 0x400805e4Silencing it is often a must for production use.
On ESP32 (classic)
Section titled “On ESP32 (classic)”The ROM messages can be silenced simply by pulling GPIO15 to GND during reset. GPIO15 has an internal pull-up, so when left floating it goes HIGH and the ROM prints normally. Driving it LOW at reset silences the ROM bootloader.
This is a runtime choice: remove the pull-down and the ROM output comes back on the next reset. It is fully reversible.
On ESP32-S2 / S3 / C3 / C6 / H2 / P4
Section titled “On ESP32-S2 / S3 / C3 / C6 / H2 / P4”On these newer targets, silencing the ROM log is done exclusively via eFuses. Two eFuse fields are relevant, depending on where the ROM prints:
| eFuse field | Output channel | Availability |
|---|---|---|
UART_PRINT_CONTROL | UART0 (U0TXD) | S2, S3, C3, C6, H2, P4 |
DIS_USB_SERIAL_JTAG_ROM_PRINT | USB Serial/JTAG controller | S3, C3, C6, H2, P4 (not S2) |
UART_PRINT_CONTROL is a 2-bit field (not a simple on/off). Its values are:
| Value | Behavior |
|---|---|
0b00 | Force enabled (default) |
0b01 | Controlled by GPIO (pin level decides at reset) |
0b10 | Controlled by GPIO (inverted logic) |
0b11 | Force disabled (ROM log always silent) |
The “GPIO-controlled” modes (0b01 / 0b10) give you a compromise: a chosen
GPIO level at reset decides whether the ROM prints, similar in spirit to
GPIO15 on the classic ESP32 — but the pin and polarity are fixed by the eFuse
value and cannot be changed afterwards.
Programmatic access — ESP-IDF exposes a helper to set the scheme from firmware:
#include "esp_efuse.h"
// Permanently silence UART ROM log (writes UART_PRINT_CONTROL eFuse)esp_efuse_set_rom_log_scheme(ESP_EFUSE_ROM_LOG_ALWAYS_OFF);Other values are ESP_EFUSE_ROM_LOG_ALWAYS_ON, ESP_EFUSE_ROM_LOG_ON_GPIO_LOW,
and ESP_EFUSE_ROM_LOG_ON_GPIO_HIGH.
From the command line — espefuse.py can burn the fuses directly:
# Permanently disable UART ROM boot logespefuse.py --port /dev/ttyUSB0 burn_efuse UART_PRINT_CONTROL 3
# Permanently disable USB Serial/JTAG ROM boot log (S3/C3/C6/H2/P4)espefuse.py --port /dev/ttyUSB0 burn_efuse DIS_USB_SERIAL_JTAG_ROM_PRINT 1Using ESP3D
Section titled “Using ESP3D”ESP3D exposes the [ESP999] command to burn the appropriate eFuse without
needing espefuse.py or a separate firmware:
[ESP999]QUIETBOOT pwd=<admin password>Supported on ESP32-S2, S3, C3, C6 (and newer variants as they are added). This action is permanent — same irreversibility rules as above apply.
On ESP8266
Section titled “On ESP8266”There is no way to silence the ROM bootloader on ESP8266. The initial
messages (on GPIO1 / U0TXD at 74880 baud, then 115200 once the app starts)
are always printed and cannot be disabled.
Workarounds, depending on the hardware design:
- Route the printer/host connection on a different UART than UART0, so the ROM chatter stays on the debug port.
- Remap UART0 TX to a pin not connected to the host (ESP8266 allows swapping U0TXD to GPIO15).
- Accept the noise and make the host firmware tolerant to the initial garbage.