Skip to content

We're upgrading our operations to serve you better. Orders ship as usual from Laval, QC. Questions? Contact us

Bitcoin accepted at checkout  |  Ships from Laval, QC, Canada  |  Expert support since 2016

NM_WEB_BOOTLOOP Info

NerdMiner – Boot Loop After Web Tool Flash

NerdMiner v2 stuck in continuous 2-4 second reboot loop with black ST7735 / ST7789 display after a web-flasher firmware install. ESP32 or ESP32-S3 mask-ROM is healthy; cause is almost always (a) wrong variant picked in the diyflasher dropdown, (b) GitHub issue #665 ST7735 pin-map bug on LILYGO T-Dongle-S3 for firmware v1.6.3-v1.8.0, or (c) stale partition/NVS from a prior firmware left unerased. Recovery is esptool erase_flash + correct-variant re-flash. Not a silicon brick.

Informational — Monitor and address as needed

Affected Models: NerdMiner v2 (ESP32 all variants) - LILYGO T-Dongle-S3 - LILYGO TTGO T-Display S3 - ESP32-WROOM-32 generic + ST7735 - matlen67 ESP32-ST7735 fork - NerdMiner-S3 custom builds

Symptoms

  • NerdMiner booted fine on its previous firmware; brick began immediately after a web-flasher install from `bitmaker-hub.github.io/diyflasher` or `nerdminers.com`
  • Power LED on and normal idle current draws (~150-400 mA on ESP32-S3, ~120-250 mA on ESP32-WROOM) but ST7735 / ST7789 LCD stays completely black
  • Serial monitor at `115200` baud shows a repeating boot banner: `ESP-ROM:esp32s3-20210327`, then `rst:0x1 (POWERON)` or `rst:0x8 (TG1WDT_SYS_RST)`, then `Guru Meditation Error: Core 0 panic'ed (LoadProhibited)`, then restart
  • Log shows `abort() was called at PC 0x...` or `Task watchdog got triggered` referencing `loopTask`, `miner_task`, or `mining_stratum`
  • Board does NOT broadcast the `NerdMinerAP_XXXXXX` or `MineYourCoins` setup SSID - the WiFi-portal task never reaches `WiFi.softAP()` because the display-init panic kills boot first
  • Config / boot button does nothing while the loop is running - the firmware panics before the button-polling task starts
  • Affects firmware `v1.6.3`, `v1.7.0`, `v1.7.1`, `v1.8.0` specifically on LILYGO T-Dongle-S3 - GitHub issue #665 scope
  • On Windows, Device Manager cycles the USB enumeration every 2-4 seconds - device appears, disappears, reappears, matching the boot-loop cadence
  • `esptool.py --chip esp32s3 --port COMx chip_id` succeeds - confirms the ESP-S3 ROM bootloader is healthy and the chip is NOT bricked at the silicon level
  • You flashed from the generic `ESP32` dropdown entry rather than the specific variant (T-Dongle-S3, TTGO T-Display S3, NerdMiner-S3)
  • You previously had a different firmware installed and the web flasher did NOT offer Erase Flash before writing
  • Display briefly flashed a logo on very first flash attempt, then went black and began looping

Step-by-Step Fix

1

Hard power-cycle once. Unplug USB for 60 seconds (full disconnect - not just pulling a USB hub power-switch). Some partial-OTA states auto-recover on a cold boot because the ESP-IDF rollback path on newer firmware reverts to the last-known-good factory slot. Plug back in with a known data-capable USB cable into a laptop port (not a desk-front hub). Watch the display for 60 seconds. If the QR code appears or the NerdMinerAP SSID comes online, you are done for now - but read Step 2 before you flash anything again.

2

Identify your exact hardware variant before doing anything else. Read the silkscreen under a jeweller's loupe or phone macro lens. Is it a LILYGO T-Dongle-S3 (small USB-A stick, ST7735 80x160, single RGB LED)? A LILYGO TTGO T-Display S3 (credit-card size, 1.9 inch IPS 170x320, two buttons flanking the display)? A generic ESP32-WROOM-32 + external ST7735 DIY board? A matlen67 fork kit? Write it down. Picking the wrong variant in Step 6 re-bricks you and wastes 20 minutes.

3

Confirm the ESP is alive. Plug USB into your laptop. On Windows, open Device Manager / Ports (COM & LPT). On macOS, `ls /dev/cu.*`. On Linux, `ls /dev/ttyUSB* /dev/ttyACM*`. You should see a serial port appear and cycle on/off every 2-4 seconds as the chip reboots. If the port enumerates at all, your ESP is healthy and recovery is a flashing exercise - continue. If nothing ever enumerates, swap USB cable (prove it is data-capable with a phone first), swap host port, try a different laptop - then go to Step 11 if still nothing.

4

Capture the panic log at 115200 baud. Use PuTTY on Windows, `screen /dev/ttyUSB0 115200` on macOS / Linux, `pio device monitor -b 115200` in PlatformIO, or the Arduino IDE serial monitor. Watch the boot banner. Panic referencing `loopTask`, `miner_task`, `tft`, or `spi` means pin-map mismatch - go to Step 6. Panic referencing `nvs_flash_init` or `spi_flash_read` means partition corruption - go to Step 5 and force full erase. Panic referencing `esp_wifi_` means a WiFi-config issue, not this page - see the NerdMiner WiFi errors instead.

5

Force ROM bootloader entry. Unplug USB. Press and hold the `BOOT` (or `IO0`) button on the board. While holding it, plug USB back in. Keep holding 3 full seconds after plug-in, then release. The ESP-S3 mask-ROM bootloader - burned into silicon at the Espressif foundry, impossible to corrupt - will respond with `waiting for download` on serial rather than the reboot-loop panic banner. On LILYGO boards specifically, you may need to additionally pulse `EN` to GND while `IO0` is held (documented LILYGO quirk - see meshtastic issue #3430). If serial goes silent and no panic appears, you are in ROM mode.

6

Full `erase_flash` from the command line. Install Python 3 and run `pip install esptool`. Execute `esptool.py --chip esp32s3 --port COMx erase_flash` (swap `esp32s3` for `esp32` on ESP32-WROOM boards; swap `COMx` for the actual port reported in Step 3). Takes 15-45 seconds. Wipes bootloader, partition table, both OTA app slots, NVS, PHY init, SPIFFS - everything except the ROM. This is the single most important step if your previous firmware was a different fork, a different major version, or a board with a different flash-size layout.

7

Re-flash via DIY Flasher with the exact correct variant. Open `bitmaker-hub.github.io/diyflasher` in Chrome, Edge, or Brave (Firefox and Safari do NOT implement WebSerial - will not work). Click Connect, pick your serial port. In the dropdown pick the entry matching your variant from Step 2 - T-Dongle-S3, T-Display S3, ESP32_ST7735, NerdMiner-S3 - NOT the generic `ESP32` entry. Pick a firmware version. For T-Dongle-S3 specifically, avoid `v1.6.3` through `v1.8.0` due to GitHub issue #665 - use `v1.6.2` or the latest post-#665 patched release. Click Install. Takes 60-180 seconds. Watch for the QR code on reboot.

8

If Step 7 boot-loops again, the web flasher's packaged image for your variant is broken. Rebuild locally. Install PlatformIO (free, cross-platform), `git clone https://github.com/BitMaker-hub/NerdMiner_v2`, open in PlatformIO. Open `platformio.ini`. For T-Dongle-S3 ST7735 boards hit by issue #665, under the `[env:ESP32_ST7735]` (or `[env:ESP32_S3_ST7735]`) section, add: `build_flags = -DTFT_MOSI=3 -DTFT_SCLK=5 -DTFT_CS=4 -DTFT_DC=2 -DTFT_RST=1`. Build, Upload. PlatformIO does `erase_flash` + `write_flash` in one click. The rebuilt image has the right pin map.

9

Configure WiFi and pool on first boot. After a clean flash the NerdMiner creates an open AP named `NerdMinerAP_XXXXXX` or `MineYourCoins`. Connect your phone or laptop to that AP. Open `http://192.168.4.1` in the captive portal. Set 2.4 GHz WiFi SSID + password - ESP32 cannot see 5 GHz networks, period. Set pool (`solo.ckpool.org:3333` for solo lottery mining, `public-pool.io:21496` for community-pool solo). Set Bitcoin payout address - use a `bc1q...` SegWit address, NOT a `bc1p...` Taproot one; public-pool and most solo pools still reject Taproot. Save, reboot, watch for non-zero hashrate on the display within 3 minutes.

10

Driver check for generic ESP32-WROOM boards. LILYGO T-Dongle-S3 and T-Display S3 use ESP32-S3 native USB-CDC and need no drivers on Windows 10/11, macOS 11+, or Linux. Generic ESP32-WROOM-32 DIY kits use a CH340 or CP2102 USB-UART bridge and DO need drivers - install the WCH CH340 driver from `wch-ic.com/downloads/CH341SER_EXE.html` or the Silicon Labs CP210x driver from `silabs.com/developers/usb-to-uart-bridge-vcp-drivers`. Reboot after install. Without the right bridge driver, the serial port never enumerates and nothing else in this guide helps.

11

UART-level recovery when USB is physically dead. Solder or clip a 3.3V USB-to-UART adapter (FT232RL or CP2102 on a 3.3V breakout) directly to the ESP32 / ESP32-S3 `TX0` / `RX0` / `GND` / `EN` / `IO0` pads on the PCB. Adapter TX to board RX, adapter RX to board TX, common GND. Power the NerdMiner through its normal USB power (do NOT backfeed 5V from the UART adapter). Short `IO0` to GND, briefly pulse `EN` to GND (hardware reset), release `EN` then `IO0`. Run `esptool.py --chip esp32s3 --port <UART COMx> --baud 230400 chip_id`. Bypasses the dead USB-C entirely and talks straight to the ESP mask ROM.

12

Re-flash via UART at conservative baud. Signal integrity on flying UART leads is worse than on a clean USB trace - high baud silently corrupts mid-flash. Use `--baud 230400` or `--baud 115200`. Run `esptool.py --chip esp32s3 --port <UART COMx> --baud 115200 erase_flash`, then `esptool.py --chip esp32s3 --port <UART COMx> --baud 115200 write_flash -z 0x0 nerdminer-factory-<variant>-vX.Y.Z.bin` (your exact variant filename from the `diyflasher` or repo release). Pulse EN to GND to reset into the new firmware. A full write at 115200 on an 8 MB part takes 5-8 minutes - do not bump the wires mid-flash.

13

Re-solder or reflow the USB connector if Step 11 worked but normal USB still does not enumerate. Under 10x magnification, look for cold joints, cracked fillets, solder bridges between CC1 and CC2, or a pad lifted off the footprint. Flux each pin. Reflow with a fine-tip iron (Pinecil, TS100, or Hakko FX-888D with a T18-C1 tip) at ~330 C. For lifted pads, scrape 0.5 mm of soldermask nearby to expose fresh copper and bridge with 30 AWG enamelled wire. $10 of parts, 20 minutes if you have soldered a Bitaxe kit before.

14

Cross-check chip health by flashing a dead-simple factory image. From UART or recovered USB, flash a minimal Arduino `Blink` sketch compiled for your ESP32 or ESP32-S3. It should enumerate, boot, toggle the onboard LED forever. If Blink runs, the ESP is 100% healthy and the NerdMiner boot loop is purely a firmware-build issue - go back to Step 8. If Blink also panics, something is physically wrong with the SPI flash or the ESP itself - Tier 4.

15

Check for burned flash-encryption and secure-boot eFuses if all else fails. Run `espefuse.py --chip esp32s3 --port COMx summary`. Look at `FLASH_CRYPT_CNT` and `SECURE_BOOT_EN`. A non-zero `FLASH_CRYPT_CNT` or `SECURE_BOOT_EN = 1` means someone (or an accidental DIY build with secure-boot enabled) burned the encryption fuses. Unsigned firmware will never boot after that. eFuses are one-way silicon fuses - recovery is either re-signing the factory image with the burned key (which most users do not have) or swapping the ESP32-S3 module at Tier 4. Rare but real.

16

Stop DIY and ship to D-Central if: the USB port pads are torn beyond hand-reflow, USB polarity was reversed and you smell burnt electrolytic, `esptool.py chip_id` still fails after the manual BOOT+EN dance with fresh cables and a fresh host, `espefuse summary` shows burned encryption / secure-boot fuses you do not hold the key for, the ESP32 module is visibly scorched / cracked / swollen, or your own hot-air reflow attempt made things worse (moved or tombstoned the module). D-Central stocks all five NerdMiner variants, replacement ESP32-S3-WROOM-1 and ESP32-WROOM-32E modules, and bench flashing fixtures pre-loaded with every firmware version.

17

What D-Central does at the bench: re-runs the full UART recovery protocol on a known-good 3.3V harness with a scope watching USB enumeration timing. If UART also fails, hot-air the ESP32-S3 module (preheat 150 C, top-side 320-340 C for about 30 s), replace it with a fresh pre-programmed module carrying the correct factory image for your variant. Repair lifted USB pads with copper-tape jumpers. Flash + configure + run a burn-in against `solo.ckpool.org` for 60 minutes to verify hashrate before shipping back. D-Central sees every Nerd-family failure mode first - we stock the ecosystem end-to-end.

18

Ship safely to D-Central. ESD bag inside a padded bubble mailer or small rigid box - NerdMiners are physically small and survive light shipping, but the USB connectors are delicate. Include the USB cable and power brick you were using (rules out a bad cable as cause), plus a written note: firmware version flashed, exact variant picked in the dropdown, what cable / host / browser was used, whether UART recovery was attempted, whether `espefuse` was checked. If you soldered UART flying leads, mention that - D-Central will remove them. Canada Post small-packet or UPS Ground; D-Central HQ receives and opens within 48 hours on business days.

When to Seek Professional Repair

If the steps above do not resolve the issue, or if you are not comfortable performing these repairs yourself, professional service is recommended. Attempting advanced repairs without proper equipment can cause further damage.

Related Error Codes

Still Having Issues?

Our team of Bitcoin Mining Hackers has been repairing ASIC miners since 2016. We have seen it all and fixed it all. Get a professional diagnosis.