The ESP32-C6-MINI-1/U is the main microcontroller on the A0 board (RISC-V core, WiFi 6, BLE 5, 802.15.4). It runs from the board's +3V3 rail (pair of AMS1117-3.3 LDOs, fed from the VBAT/charger input), and exposes a native USB-Serial/JTAG peripheral used for both flashing and debug logging.
This page documents how to diagnose a boot loop on the ESP32-C6 — visible on the host as the board's USB port repeatedly disconnecting and reconnecting — and how to confirm the board is healthy again with a minimal serial "Hello World" sketch.
The disconnect/reconnect cycle is the ESP32-C6's own native USB-Serial/JTAG peripheral resetting along with the whole chip — not a host-side USB/driver issue. Confirm with:
usb 1-1: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.02usb 1-1: Product: USB JTAG/serial debug unitusb 1-1: Manufacturer: Espressifcdc_acm 1-1:1.0: ttyACM0: USB ACM deviceusb 1-1: USB disconnect, device number 58usb 1-1: new full-speed USB device number 59 using xhci_hcd...
idVendor=303a is Espressif's own native-USB VID — this is the SoC's built-in USB-JTAG/serial unit, not an external USB-UART bridge. The re-enumeration period lines up exactly with the TG0_WDT_HPSYS watchdog resets in the serial log.
A board stuck in this loop reads back all 0xFF at offset 0x0 — confirming the flash has no bootloader/app image at all (erased, or never successfully flashed).
esptool/arduino-cli drive the reset/boot-mode lines directly, so this works even while the board is actively looping — it does not need to be power-cycled first. If auto-reset fails, hold BOOT and tap RESET to force download mode.
Board-specific gotcha: the esp32:esp32:esp32c6 board profile defaults USB CDC On Boot to disabled. With the default profile, Serial is routed to the physical UART0 pins, not the native USB port — so after flashing you'll see one clean boot (no more invalid header spam), but no application output over /dev/ttyACM0. Recompile/upload with the CDC option enabled to see Serial output on the same port used for flashing:
A minimal sketch to confirm the board boots cleanly and holds a serial connection, without depending on any peripheral module (SIM7080G, WMBUS, E07-400M10S, etc.):
void setup() { Serial.begin(115200); delay(1000); Serial.println("A0 board is alive - boot loop fixed!");}void loop() { Serial.println("Hello from A0 (ESP32-C6)"); delay(1000);}
Build and flash with CDCOnBoot=cdc as shown above, then read the port: