NerdQAxe – Bricked After OTA Firmware Update
Critical — Immediate action required
Symptoms
- NerdQAxe was running fine until an OTA update was triggered; brick began during or immediately after the flash
- Onboard display (OLED / 1.14" TFT / 1.9" TFT) is blank, frozen on splash, or shows `Booting...` forever
- Web UI at `http://nerdqaxe.local` / `http://nerdqaxeplusplus.local` / static IP returns connection refused or mDNS timeout
- Unit does not broadcast `NerdQAxe_XXXXXX` AP SSID even after a 10+ second `BOOT` hold
- Pool dashboard shows the worker offline; no hashrate since update attempt
- `esptool.py --chip esp32s3 chip_id` over the USB-C debug port returns `Failed to connect to ESP32-S3: No serial data received`
- Serial monitor at 115200 baud silent, OR shows tight reboot loop with `rst:0x7 (TG0WDT_SYS_RST)` / `Guru Meditation Error` / `abort() was called at PC`
- Unit draws idle power (5-10 W on NerdQAxe++) but never transitions into full hash load
- Fan spins briefly on power-up then stops - firmware PWM curve never takes over
- Windows Device Manager lists `Unknown USB Device (Device Descriptor Request Failed)` on the ESP32-S3 USB-C port
- Happens immediately after pressing Update in the web UI, or after a power flicker mid-OTA
- On the `nerdqaxeplusplus` firmware branch, serial log mentions `ota_rollback` or `invalid magic byte` before going silent
Step-by-Step Fix
Hard power-cycle once. Unplug the 12V PSU from the wall for 60 seconds (not just flipping the switch - fully disconnect), then plug back in. ESP-IDF's OTA rollback timer, if intact on your firmware branch, drops boot-select back to the last-known-good slot after a failed commit. Watch the display for 30-60 seconds. If the `NerdQAxe_XXXXXX` AP SSID reappears or the dashboard returns, the OTA was bad but the safety net worked - you're done for now, but read Step 2 before updating again.
Verify the 12V PSU is spec-correct before any recovery attempt. NerdQAxe++ needs 12V/10A (120W) with an XT30 connector; earlier variants have matching spec. An 8A PSU is the #1 reported OTA-time brownout cause on the shufps issue tracker. If you're running on an undersized PSU, swap first, then retry. A spec-correct replacement lives in the D-Central Nerd Family catalog.
Plug a USB-C DATA cable into the ESP32-S3 debug port (the small USB-C on the controller PCB next to the ESP32-S3 shield - NOT the 12V XT30). Use a cable you know carries data (Pixel, iPhone 15, USB 3.x). Plug into a laptop port, not a desktop front-panel hub. Confirm a new `USB Serial Device (COMx)` / `/dev/cu.usbmodemXXX` appears within 3 seconds. If not, swap cable and host before continuing. Roughly 30% of OTA bricks recover once a real data cable touches the board.
Open the NerdQAxe Web Flasher at shufps.github.io/nerdqaxe-web-flasher in Chrome or Edge (Firefox and Safari do NOT implement WebSerial). Click Connect, pick the ESP32-S3 serial port. If it reports `Chip: ESP32-S3` and a MAC, skip to Step 6. If it says `Failed to connect`, continue to Step 5 to force the ROM bootloader manually.
Force ROM bootloader entry manually. Unplug USB-C. Press and hold the `BOOT` button (small tactile, labeled `BOOT` or `IO0` on the controller PCB - NOT `RESET` / `EN`). While holding `BOOT`, plug USB-C back into your host. Keep holding for 3 full seconds after plug-in, then release. Retry the Web Flasher Connect. The ESP32-S3's mask-ROM bootloader - burned into silicon at the Espressif foundry, impossible to corrupt - will always respond when the chip is electrically healthy.
Identify your exact NerdQAxe variant before downloading firmware. Count ASICs and read the part number under a jeweller's loupe or phone macro lens: BM1366 = NerdQAxe, BM1368 = NerdQAxe+, BM1370 = NerdQAxe++ or NerdQAxe++ Hydro. Note display type (0.96" OLED vs 1.14" TFT vs 1.9" TFT) and any `Hydro` markings. A wrong factory `.bin` turns one brick into a harder second brick. Cross-reference the shufps/ESP-Miner-NerdQAxePlus releases page.
Erase full flash via Web Flasher, then install factory image. In the Web Flasher, tick Erase Flash before clicking Install. Wipes partition table at `0x8000`, both OTA slots, NVS, PHY init, and SPIFFS - a complete reset. Then pick your variant's factory `.bin` and click Install. Erase 15-30s, flash 60-120s. Cures partition-table corruption and guarantees you're booting from a known-good factory app slot rather than a half-written OTA slot.
Fall back to esptool.py from the command line if the Web Flasher fails opaquely. `pip install esptool` in any Python 3 env. Force ROM bootloader (unplug, hold BOOT, plug, release after 3s). Run `esptool.py --chip esp32s3 --port COMx chip_id` to confirm. Then `erase_flash`, then `--baud 921600 write_flash -z 0x0 esp-miner-factory-nerdqaxeplusplus-vX.Y.Z.bin` (substitute your filename). Terminal errors are vastly more informative than the Web Flasher's generic Failed popups.
Swap in a known-good 12V/10A XT30 PSU before booting post-flash. An undersized PSU silently brownouts the moment ESP-Miner transitions from idle into full-load self-test - and re-bricks you. 12V/10A (120W minimum) XT30-terminated. If you don't have one, grab one from the D-Central Nerd Family catalog - cheapest insurance policy in this DIY tree.
Reconfigure pool, WiFi, and Bitcoin payout address after a fresh flash. A successful recovery wipes stored pool URL, worker name, SSID, and password. On first boot the miner broadcasts `NerdQAxe_XXXXXX` AP SSID. Connect, set WiFi, set pool (`solo.ckpool.org:3333` or `public-pool.io:21496` for solo hunters, your pool of choice otherwise), set Bitcoin payout address (verify pool accepts Taproot before using `bc1p...`). Save. Reboot. Watch the display for hashrate greater than zero within 3 minutes.
UART bootloader recovery when USB-C is physically dead. Solder or clip a 3.3V USB-to-UART adapter (FT232RL, CP2102, or CH340G on a 3.3V carrier) to the labeled `TX0`/`RX0`/`GND`/`EN`/`IO0` pads on the controller PCB. Adapter TX to board RX, adapter RX to board TX, common GND. Power the NerdQAxe via its normal 12V PSU (don't backfeed 5V from the UART adapter). Short `IO0` to `GND`, briefly pulse `EN` to `GND` (hardware reset), release `EN`, then release `IO0`. Run `esptool.py --port <UART COMx> --chip esp32s3 --baud 230400 chip_id`. Bypasses USB-C, talks straight to the ESP32-S3 mask ROM.
Re-flash via UART at conservative baud. Slow to `--baud 230400` or `--baud 115200`. UART on flying leads has worse signal integrity than a clean USB trace; high baud silently corrupts mid-flash. Full `write_flash` of the factory image takes 5-8 minutes at 115200 on an 8 MB part - be patient, don't move the wires, don't bump the board. `esptool.py --chip esp32s3 --port <UART COMx> --baud 115200 write_flash -z 0x0 esp-miner-factory-<variant>-vX.Y.Z.bin`, then pulse EN to GND to reset into the new firmware.
Re-seat or re-solder the USB-C debug connector if Step 11 worked but USB-C still doesn't. Under magnification, look for cold joints, cracked fillets, solder bridges between CC1/CC2, or a lifted pad at the footprint. Flux each pin, reflow with a fine-tip iron (~330°C - Pinecil, TS100, Hakko FX-888D with T18-C1 tip). Lifted pads: scrape 0.5 mm of soldermask to expose fresh copper and bridge with 30-gauge enamelled wire. $10 parts, 20 minutes if you've soldered a Bitaxe kit before.
Cross-flash an alternative ESP32-S3 firmware to confirm the chip is alive. From UART bootloader, flash stock bitaxeorg/ESP-Miner factory `.bin` (it will boot - the ESP is identical, only the ASIC config differs - and crash on `asic_init_fail`, but the UI and serial log will prove the chip runs). If stock Bitaxe AP boots, your ESP and flash are healthy and the original NerdQAxe OTA was the fault. Now re-flash the correct NerdQAxe factory and you're done.
Check for burned flash-encryption / secure-boot eFuses. Run `espefuse.py --chip esp32s3 --port <UART COMx> summary`. Look at `FLASH_CRYPT_CNT` and `SECURE_BOOT_EN`. If `FLASH_CRYPT_CNT` is non-zero or `SECURE_BOOT_EN` is set, someone burned the encryption fuses - the stock unencrypted factory `.bin` will never boot. Recovery is either re-signing the factory with the key burned into eFuse (you need that key - most users don't), or swap the ESP32-S3 module at Tier 4. eFuses are one-way-permanent silicon fuses.
When to stop DIY: book D-Central repair if UART recovery per Step 11 also fails, `espefuse summary` shows burned encryption/secure-boot fuses you don't hold the key for, the ESP32-S3 module is physically damaged (scorching, cracked epoxy, swollen RF shield, diagonal crack), USB-C port pads are torn off past hand-reflow, you reversed 12V polarity on the XT30 and smelled burnt electrolytics, or your own hot-air reflow made things worse. D-Central stocks ESP32-S3 modules, USB-C connectors, and all NerdQAxe-variant firmware images pre-loaded on bench fixtures.
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 enumeration timing. If UART fails, hot-air the ESP32-S3 module (preheat 150°C, top-side 320-340°C for ~30s), replace with a fresh pre-flashed module carrying the correct factory for your variant, replace damaged USB-C connectors, repair lifted pads with copper-tape jumpers, flash + configure + burn-in at nameplate hashrate for 4-6 hours on bench 12V before shipping back. D-Central stocks every NerdQAxe variant and the full Nerd family - we see every failure mode first.
Ship safely to D-Central. ESD bag, foam cradle in a rigid box, include the 12V PSU + XT30 lead you were using (so we can verify it wasn't the cause), a note describing symptoms - what firmware was being flashed, what version, whether cable/PC swap was tried, whether UART recovery was attempted, whether `espefuse` was checked. If you soldered UART leads, mention it - we'll remove them. Canada Post small-parcel or UPS Ground; D-Central HQ receives and opens within 48 hours.
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.
