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_FLASH_ERASE Warning

NerdMiner – Erase All Flash Recovery Procedure

NerdMiner refuses to boot, settings won't save, or NVS / partition-table panic loops on every cold start. Recovery is `esptool.py erase_flash` followed by a clean factory image for the exact hardware variant. Mask-ROM bootloader is silicon-burned and unaffected by any erase operation; not a brick - a stuck partition table, corrupt NVS, stale SPIFFS, or wrong-variant `.bin`.

Warning — Should be addressed soon

Affected Models: NerdMiner v2 (ESP32 / ESP32-S3 all variants) - LILYGO T-Dongle-S3 - LILYGO TTGO T-Display S3 - LILYGO T-QT - M5StickC / M5StickC Plus - generic ESP32-WROOM-32 + ST7735 / ST7789 DIY builds - matlen67 ESP32-ST7735 fork - NerdMiner-S3 community builds

Symptoms

  • NerdMiner refuses to boot, boot-loops every 2-4 seconds, or hangs on the splash screen with no progress to the WiFi config portal
  • Serial monitor at `115200` baud shows panic referencing `nvs_flash_init`, `spi_flash_read`, `partition_table`, `esp_partition_find`, or `Failed to mount NVS`
  • Settings refuse to save - WiFi credentials, pool URL, BTC address are accepted in the captive portal but lost after reboot, suggesting NVS write corruption
  • Display flashes briefly then goes black, or shows the BitMaker logo and freezes there forever, or remains stone-dead through the entire boot cycle
  • Previously flashed a different firmware (matlen67 fork, an old `v1.4.x` build, a custom branch) and the new image refuses to behave even though the flasher reported success
  • The `NerdMinerAP_XXXXXX` or `MineYourCoins` setup SSID never appears in your phone's WiFi list, even though the chip is clearly powered and drawing current
  • On Windows, Device Manager shows the COM port cycling on and off in lockstep with the boot loop - device appears, disappears, reappears every 2-4 seconds
  • `esptool.py --chip esp32s3 chip_id` connects successfully and reports MAC + flash chip ID - confirming the silicon is healthy and the ROM bootloader works
  • Symptoms started immediately after an OTA update, a web-flasher install, or a manual `write_flash` operation that did NOT include `erase_flash` first
  • Mixed-firmware history: this board has been flashed with two or more different forks or firmware major versions over its lifetime
  • Hashrate display reads `0 H/s` or `--` permanently even though serial logs show stratum subscribe succeeded - stale config in NVS pointing at a dead pool
  • You typed `bc1p...` Taproot or a Lightning address into a previous configuration and the firmware silently rejects every subsequent address attempt - bad value still in NVS

Step-by-Step Fix

1

Hard power-cycle once. Unplug USB for 60 seconds (full disconnect, not just toggling a USB hub power switch). Some half-completed OTA states auto-recover on a clean cold boot because newer NerdMiner firmware uses ESP-IDF's anti-rollback path to revert to the last-known-good factory slot. Plug back in with a known data-capable USB cable (test it on a phone first - charge-only cables look identical and silently sabotage every step). Watch the display for 60 seconds. If the QR code appears or NerdMinerAP comes online, you may be done - but read Step 2 before flashing anything new.

2

Identify the exact hardware variant before doing anything else. Read the silkscreen under a phone macro lens or jeweller's loupe. Possible variants: LILYGO T-Dongle-S3 (USB-A stick, 0.96 inch ST7735, ESP32-S3-FN8). LILYGO TTGO T-Display S3 (credit-card form, 1.9 inch IPS ST7789 170x320, ESP32-S3-WROOM-1). LILYGO T-QT (square 0.85 inch ST7789, ESP32-S3). M5StickC / M5StickC Plus (yellow plastic case, internal LiPo, ESP32-PICO). Generic ESP32-WROOM-32 + external SPI LCD DIY. matlen67 fork ESP32-WROOM-32 + ST7735 with custom pin map. Write the variant name down - picking the wrong one in Step 7 re-bricks you and burns 20 minutes.

3

Confirm the ESP is alive. Plug USB into the laptop. On Windows, expand Device Manager / Ports (COM & LPT) and watch for a new port to appear and cycle every 2-4 seconds. On macOS, `ls /dev/cu.*` before and after plug-in. On Linux, `ls /dev/ttyUSB* /dev/ttyACM*` before and after. If the serial port enumerates - even transiently - the ESP is healthy and recovery is mechanical, continue. If nothing ever enumerates: prove the cable is data-capable on a phone, swap host port (front panels are often flaky), try a different laptop, then go to Step 11 if still nothing.

4

Capture the panic log at 115200 baud. Open PuTTY on Windows, `screen /dev/ttyUSB0 115200` on macOS / Linux, `pio device monitor -b 115200` from PlatformIO, or the Arduino IDE serial monitor. Watch the boot. Look for `ESP-ROM:esp32s3-20210327`, then a reset reason, then either firmware boot or a `Guru Meditation Error` panic. Panic referencing `nvs_flash_init`, `nvs_get_str`, or `partition_table_md5` confirms this page is your fix - go to Step 5. Panic referencing `tft.init()`, `loopTask`, or `spi_master` means pin-map mismatch - see the NerdMiner Boot Loop After Web Flash page. Panic on `esp_wifi_init` is a WiFi config issue, not this page.

5

Force ROM bootloader entry. Unplug USB. Press and hold the BOOT button (also labelled IO0 on some variants - on T-Dongle-S3 it is the small tactile button beside the RGB LED; on T-Display S3 it is the lower of the two buttons closest to USB-C). While holding, plug USB back in. Hold for 3 full seconds after plug-in, then release. The ESP-S3 mask-ROM bootloader - burned at the Espressif foundry, impossible to corrupt - is now in `waiting for download` mode and will respond silently to esptool. The reboot loop must STOP - if the chip is in ROM mode it sits idle, not booting firmware. LILYGO-specific quirk: pulse EN to GND briefly while IO0 is held - documented in meshtastic issue #3430.

6

Run `esptool.py erase_flash` from the command line. Install Python 3 if you do not already have it (python.org on Windows, `brew install python` on macOS, your distro's package manager on Linux), then `pip install esptool` for the latest Espressif flasher. Execute: `esptool.py --chip esp32s3 --port COMx erase_flash` (substitute `esp32` for `esp32s3` if you are on classic WROOM-32; substitute `COMx` with the actual port). Takes 15-45 seconds. Wipes bootloader, partition table, both OTA app slots, NVS, PHY init, and SPIFFS - everything down to the ROM. Output should read `Chip erase completed successfully`. If `Failed to connect`: chip is not really in ROM mode, redo Step 5 with a 5-second hold. If `Wrong head` or `Invalid head of packet`: drop to `--baud 115200` (default) and try a different cable.

7

Re-flash a clean factory image for your exact variant. Browser path: open `bitmaker-hub.github.io/diyflasher` in Chrome, Edge, or Brave (Firefox and Safari do NOT implement WebSerial - they will throw `browser not supported` and quit). Click Connect, pick your serial port. In the dropdown, pick the entry matching your variant from Step 2 - NEVER the generic `ESP32` entry on a LILYGO board, that is the trap. Pick a firmware version. For T-Dongle-S3 specifically, avoid `v1.6.3` through `v1.8.0` due to issue #665 (broken ST7735 pin defaults); use `v1.6.2` or the latest post-#665 patched release. Click Install. 60-180 seconds. Chip reboots, QR code paints within 10 seconds.

8

CLI re-flash (alternative to Step 7 for repeat use, no browser). Download the matching factory `.bin` from `BitMaker-hub/NerdMiner_v2` releases. Run: `esptool.py --chip esp32s3 --port COMx --baud 921600 write_flash -z 0x0 nerdminer-factory-<variant>-v1.6.2.bin`. The `-z` flag compresses on the wire (faster). 60-90 seconds. Pulse EN to GND or unplug/replug to reset into the new firmware. On classic ESP32-WROOM-32, factory bootloader goes at `0x1000` not `0x0` - the diyflasher web tool handles offset automatically; CLI users must match the offset to the chip family.

9

Configure on first boot. After a clean flash, the NerdMiner creates an open AP named `NerdMinerAP_XXXXXX` or `MineYourCoins`. Connect your phone to that AP. Open `http://192.168.4.1` in any browser. Set 2.4 GHz WiFi SSID and password (ESP32 cannot see 5 GHz networks - hardware limitation, not a bug). Set pool: `solo.ckpool.org:3333` for solo lottery mining, or `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. Chip reboots, joins your home WiFi, subscribes to the pool, begins hashing within 60-90 seconds.

10

Driver check for generic ESP32-WROOM DIY boards. LILYGO T-Dongle-S3 / T-Display S3 / T-QT use ESP32-S3 native USB-CDC and need NO drivers on Windows 10/11, macOS 11+, or Linux 5.4+. 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`. The CH9102 you may see in older guides is a CH340-family variant covered by the standard WCH driver. Reboot Windows after install. Without the bridge driver the serial port never enumerates and nothing else 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 - never 5V, you will fry the ESP) to the ESP32 / ESP32-S3 `TX0` / `RX0` / `GND` / `EN` / `IO0` test points 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 connector entirely and talks straight to 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 115200` for max reliability. 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`. A full erase + write at 115200 on an 8 MB part takes 5-8 minutes. Do not bump the wires mid-flash - one disturbed clip and the partition table writes corrupt and you start over.

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. Apply flux to each pin. Reflow with a fine-tip iron (Pinecil, TS100, or Hakko FX-888D with a T18-C1 tip) at 330C. For lifted pads, scrape 0.5 mm of soldermask near the footprint to expose fresh copper and bridge with 30 AWG enamel wire. $10 of parts, 20-40 minutes if you have soldered a Bitaxe kit before. After repair, re-attempt USB enumeration from Step 3.

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 / ESP32-S3 family. It should enumerate, boot, toggle the onboard LED forever - no display, no WiFi, no NVS access. If Blink runs cleanly, the ESP is 100% healthy and the NerdMiner panic was purely a flash-content issue - go back to Step 7 with a different firmware version. If Blink also panics, something is physically wrong with the SPI flash chip itself (rare) or the ESP module is dying - Tier 4.

15

Check for burned flash-encryption / 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 by mistake) burned the encryption fuses. Unsigned firmware will never boot after that. eFuses are one-way silicon fuses - recovery requires either re-signing the factory image with the burned key (which most users do not have) or swapping the ESP32-S3 module entirely at Tier 4. Rare on commercial NerdMiner boards but real on custom DIY builds.

16

Stop DIY and ship to D-Central if: USB pads are torn beyond hand-reflow, USB polarity was reversed and burnt electrolytic was smelled, `esptool.py chip_id` still fails after fresh cables / fresh host / manual BOOT+EN dance, `espefuse summary` shows burned encryption / secure-boot fuses without a held key, the ESP32 module is visibly scorched / cracked / swollen, your own hot-air reflow moved or tombstoned the module, or Steps 1-9 ran cleanly twice and the panic returns within a single boot cycle. D-Central stocks every NerdMiner variant, replacement ESP32-S3-WROOM-1 and ESP32-WROOM-32E modules, and bench flashing fixtures pre-loaded with every firmware version released since 2023.

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 and the SPI flash CS / CLK lines. If UART recovery also fails, hot-air the ESP32-S3 module (preheat 150C, top-side 320-340C for ~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 and 30 AWG enamel wire. Flash + configure + run a 60-minute burn-in against `solo.ckpool.org:3333` to verify hashrate before shipping back. D-Central sees every Nerd-family failure mode first - we stock the entire ecosystem.

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 and snap off with side load. Include the USB cable and power adapter 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 summary` was checked. If you soldered UART flying leads, mention that - D-Central will remove them. Canada Post small-packet or UPS Ground works fine for any Canadian shipper. 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.