ESP32 FLASHING REFERENCE · ESPTOOL · MARAUDER · BOARDS
HARDWARE REF v1.0

SUPPORTED BOARDS

WAVESHARE ESP32-S3 AMOLED
1.8" AMOLED · RM67162 · USB-C · 8MB PSRAM
PARAMVALUE
ChipESP32-S3R8
Flash16MB QIO
USB ModeUSB-CDC (native)
Boot pinGPIO0 — hold on power
# Flash Marauder / custom firmware
esptool.py --chip esp32s3 --port COM? \
--baud 921600 write_flash -z \
--flash_mode dio --flash_freq 80m \
--flash_size detect 0x0 firmware.bin
T-DONGLE S3
LilyGo USB dongle · ST7735 TFT · SD slot
PARAMVALUE
ChipESP32-S3
Flash16MB QIO
USB ModeUSB-CDC
BootSlide switch to FLASH pos
esptool.py --chip esp32s3 --port COM? \
--baud 921600 write_flash -z \
--flash_mode qio --flash_freq 80m \
--flash_size 16MB 0x0 firmware.bin
BAGUETTE S3 (Adafruit)
ESP32-S3 · No PSRAM · USB-C · 4MB flash
PARAMVALUE
ChipESP32-S3
Flash4MB QIO
USB ModeUSB-CDC native
BootHold BOOT + tap RESET
esptool.py --chip esp32s3 --port COM? \
--baud 460800 write_flash \
--flash_mode dio --flash_size 4MB \
0x0 firmware.bin
ESP32 WROOM / WROVER
Generic ESP32 · 4MB · Classic dual-core
PARAMVALUE
ChipESP32 (Xtensa)
Flash4MB DIO
USBCP2102 / CH340 UART bridge
BootGPIO0 LOW on reset
esptool.py --chip esp32 --port COM? \
--baud 115200 write_flash \
--flash_mode dio --flash_size 4MB \
0x1000 bootloader.bin \
0x8000 partitions.bin \
0x10000 app.bin

ESPTOOL QUICK REFERENCE

INSTALL

pip install esptool pip install esptool --upgrade

DETECT / INFO

# Identify chip on port
esptool.py --port COM? chip_id
esptool.py --port COM? flash_id

ERASE

# Full erase before reflash
esptool.py --port COM? erase_flash

READ BACK

# Dump current firmware
esptool.py --port COM? \
read_flash 0x0 0x400000 backup.bin

BAUD RATES (try in order if failing)

RATERELIABILITY
115200Most reliable — old boards
460800Good balance
921600Fast — S3 native USB only
2000000S3 native USB max

FLASH MODES

MODEWHEN TO USE
dioDefault — most boards
qioNewer boards w/ QIO flash
doutCompatibility fallback

FLASH SIZES

SIZEFLAG
4MB--flash_size 4MB
8MB--flash_size 8MB
16MB--flash_size 16MB
Auto--flash_size detect

ESP32 MARAUDER

WEB FLASHER (easiest)
Browser-based · Chrome/Edge only · No esptool needed
Use https://esp.huhn.me or the official Marauder web flasher. Connect board in USB-CDC mode, select binary, flash. Works on Windows, Linux, Android Chrome.

Select the correct .bin for your exact hardware revision. Wrong variant = no display output but may still function.

MANUAL FLASH — S3 BOARDS
Waveshare AMOLED / T-Dongle / Baguette
# Download from Marauder releases
# Pick: esp32_marauder_[board]_[ver].bin

esptool.py --chip esp32s3 \
--port COM? --baud 921600 \
write_flash -z \
--flash_mode dio \
--flash_freq 80m \
--flash_size detect \
0x0 esp32_marauder_[board].bin
MARAUDER BOOT MODES
Force DFU / bootloader mode
BOARDMETHOD
Waveshare AMOLEDHold GPIO0 button while plugging USB
T-Dongle S3Slide FLASH switch, plug in, slide back
Baguette S3Hold BOOT, tap RESET, release BOOT
Generic WROOMGPIO0 → GND, reset, release GPIO0
In DFU mode the board appears as a generic USB device with no COM port. esptool detects it automatically on the correct port.
MARAUDER OTA UPDATE
Update over WiFi without USB
# Marauder must be running w/ WiFi active
# Navigate to Marauder IP in browser
# Upload .bin via OTA page
http://[marauder-ip]/update
OTA partition must be present in flash — this is the default for most Marauder builds. Confirm partition scheme before relying on OTA.

CIRCUITPYTHON / MICROPYTHON

CIRCUITPYTHON (S3)

# 1. Download .bin from circuitpython.org
# 2. Erase first
esptool.py --chip esp32s3 \
--port COM? erase_flash

# 3. Flash
esptool.py --chip esp32s3 \
--port COM? --baud 460800 \
write_flash -z 0x0 \
adafruit-circuitpython-[board]-*.bin
After flash, board appears as CIRCUITPY USB drive. Edit code.py directly.

MICROPYTHON (classic ESP32)

# Download from micropython.org/download/esp32
# Erase
esptool.py --chip esp32 \
--port COM? erase_flash

# Flash
esptool.py --chip esp32 \
--port COM? --baud 460800 \
write_flash -z 0x1000 \
esp32-micropython-*.bin
Connect via any serial terminal at 115200 baud. REPL prompt is >>>

BADUSB / DUCKYSCRIPT (Pico + ESP32 COMBO)

WIFI DUCK SETUP (ESP32 + Pico)
COMPONENTFIRMWAREROLE
Raspberry Pi PicoWiFi Duck Pico .uf2USB HID emulation — appears as keyboard/mouse
ESP32WiFi Duck ESP32 .binWiFi AP + script delivery to Pico via UART
# Flash ESP32 partner firmware
esptool.py --chip esp32 --port COM? \
write_flash 0x0 wifi_duck_esp8266.bin

# Pico: drag .uf2 to BOOTSEL drive (see PICOREF)

TROUBLESHOOTING

FAILED TO CONNECT
CAUSEFIX
Wrong boot modeHold BOOT before connecting, release after esptool starts
Wrong COM portDevice Manager / ls /dev/tty* to find correct port
Driver missingInstall CP2102 or CH340 driver for UART bridge boards
USB cableTry a different cable — many are charge-only
S3 native USBMay not enumerate until DFU mode entered
FLASH VERIFY ERRORS
SYMPTOMFIX
MD5 mismatchLower baud rate, use --no-compress
Invalid headWrong flash_mode — try dio instead of qio
Size errorSpecify --flash_size explicitly, don't use detect
Partial flashErase full flash first, reflash from 0x0
Always erase before flashing Marauder — leftover partitions from previous firmware cause boot loops.

WINDOWS DRIVER QUICK REF

CHIPDRIVERSOURCE
CP2102 / CP2104Silicon Labs VCPsilabs.com/developers/usb-to-uart-bridge-vcp-drivers
CH340 / CH341WCH CH340 driverwch-ic.com/downloads/CH341SER_EXE.html
ESP32-S3 native USBBuilt into Windows 10+No driver needed — appears as USB serial CDC
ESP32 USB JTAGZadig / WinUSBzadig.akeo.ie — select USB JTAG/serial debug unit
HYLAS SECURITY // ESPFLASH v1.0INTERNAL — HARDWARE REFERENCE