Skip to content

FAQ

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:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13104
load:0x40080400,len:3036
entry 0x400805e4

Silencing it is often a must for production use.

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 these newer targets, silencing the ROM log is done exclusively via eFuses. Two eFuse fields are relevant, depending on where the ROM prints:

eFuse fieldOutput channelAvailability
UART_PRINT_CONTROLUART0 (U0TXD)S2, S3, C3, C6, H2, P4
DIS_USB_SERIAL_JTAG_ROM_PRINTUSB Serial/JTAG controllerS3, C3, C6, H2, P4 (not S2)

UART_PRINT_CONTROL is a 2-bit field (not a simple on/off). Its values are:

ValueBehavior
0b00Force enabled (default)
0b01Controlled by GPIO (pin level decides at reset)
0b10Controlled by GPIO (inverted logic)
0b11Force 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 lineespefuse.py can burn the fuses directly:

Terminal window
# Permanently disable UART ROM boot log
espefuse.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 1

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.

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.