Passer au contenu

Nous améliorons nos opérations pour mieux vous servir. Les commandes sont expédiées normalement depuis Laval, QC. Questions? Contactez-nous

Bitcoin accepté au paiement  |  Expédié depuis Laval, QC, Canada  |  Soutien expert depuis 2016

NERD_EFUSE_BURN Critical

Nerd Family – Flash Encryption eFuse Burn Blocks Reflash

Accidental ESP32-S3 flash-encryption or secure-boot eFuse burn permanently blocks reflash on Bitaxe, NerdMiner, NerdAxe, NerdQAxe and other ESP32-S3-based open-source miners. eFuses are one-way silicon - once burned, the unencrypted factory `.bin` will never boot again. Recovery without the AES key is an ESP32-S3 module swap at the D-Central bench.

Critical — Immediate action required

Affected Models: All ESP32-S3 Nerd / Bitaxe variants: Bitaxe Supra, Ultra, Hex, Gamma, GT, Max; NerdAxe; NerdNOS; NerdMiner (S3 boards); NerdQAxe, NerdQAxe+, NerdQAxe++, NerdQAxe++ Hydro; PiAxe (S3 controller variant); StealthMiner (S3 variant). Original ESP32 (non-S3) NerdMiner boards are similarly affected via FLASH_CRYPT_CNT eFuse, though wording differs.

Symptoms

  • Bitaxe / NerdMiner / NerdAxe / NerdQAxe was running fine until you compiled or flashed a custom firmware build with `CONFIG_SECURE_FLASH_ENC_ENABLED=y` or `CONFIG_SECURE_BOOT=y` set in `sdkconfig`
  • First boot after that flash worked once - the chip ran the encrypted image - but every subsequent attempt to flash a stock unencrypted factory `.bin` results in a chip that will not run
  • Stock factory `.bin` from `bitaxeorg/ESP-Miner` or `shufps/ESP-Miner-NerdQAxePlus` writes successfully but the ESP32-S3 reboot loops with `flash read err, 1000` or silently does nothing on every cold start
  • Serial monitor at 115200 baud shows `rst:0x10 (RTCWDT_RTC_RST)`, `Invalid header: 0xffffffff`, or `flash decryption is enabled, but key is not set / wrong` on boot
  • `espefuse.py --chip esp32s3 --port COMx summary` reports `FLASH_CRYPT_CNT` value of `1`, `3`, `7`, or `15` (any non-zero - the field is a 4-bit counter), or `SECURE_BOOT_EN` / `SECURE_BOOT_V2_EN` flag set to `True`
  • ESP32-S3 mask-ROM bootloader still responds (`esptool.py chip_id` works, MAC reads, chip rev prints) but no app firmware will execute past the bootloader stage
  • Web Flasher (Bitaxe AxeOS or shufps NerdQAxe) reports successful erase + flash but unit never broadcasts AP SSID, never serves dashboard, never starts hashing
  • Display (OLED or TFT) is blank, dark, or stuck on `Booting...` indefinitely after every reflash attempt
  • Pool dashboard shows the worker as offline; no shares submitted since the encryption-enable flash
  • If you flashed with a development key (`espsecure.py generate_flash_encryption_key` output you saved): the unit boots when you flash with that exact key but refuses any unencrypted image - confirms encryption fuses are active
  • User explicitly remembers enabling 'flash encryption,' 'secure boot,' or 'release mode' in `idf.py menuconfig` before the issue started - the most reliable confirmation of root cause
  • Unit was flashed by a third party (used / second-hand purchase) and now refuses any community firmware - prior owner may have left the chip in flash-encrypted state without disclosing the key

Step-by-Step Fix

1

Stop flashing immediately. Every additional encrypted-flash cycle increments the `FLASH_CRYPT_CNT` eFuse counter, and once it hits its 4-bit cap the chip locks all encryption operations permanently. Unplug the unit, set it aside, and confirm via diagnosis (Step 2) before attempting any further recovery. The single most expensive mistake on this page is panic-flashing more times to 'unbrick' a chip that is already in eFuse-burned state - you only make it worse.

2

Read the eFuse summary. Install esptool: `pip install esptool` in any Python 3 environment. Force ROM bootloader (unplug, hold `BOOT` or `IO0`, plug USB-C, release after 3 s). Run `espefuse.py --chip esp32s3 --port COMx summary`. Look at three fields: `FLASH_CRYPT_CNT` (should be `0` for a healthy chip - any non-zero value means encryption is active or has been active), `SECURE_BOOT_EN` or `SECURE_BOOT_V2_EN` (should be `False` / `0` on a healthy chip), and `DIS_DOWNLOAD_MANUAL_ENCRYPT` / `DIS_DOWNLOAD_DCACHE` (lockout fuses that may have been burned alongside). Save the full output - D-Central will need it if you ship to bench.

3

If `FLASH_CRYPT_CNT` is `0` and `SECURE_BOOT_EN` is `False`, this is NOT an eFuse-burn issue - your brick has another cause. Stop here and consult the parallel pages: `nerdqaxe-brick-after-ota-update`, `bitaxe-esp32-crash-loop`, or `nerdaxe-firmware-update-issues`. Do not burn additional eFuses chasing a different problem - it converts a recoverable brick into a permanent one.

4

If `FLASH_CRYPT_CNT` is non-zero, search exhaustively for the AES key. Check: your `idf.py menuconfig` history (the key path is set under `Security features > Flash Encryption Mode`), your `build/` directory for `flash_encryption_key.bin`, your version control history for any `.gitignore`-d key files, your password manager, your home directory for `~/.espressif/` cache files, and any backup of the original build environment. Without the exact 256-bit key burned into the chip, you cannot produce an encrypted image the bootloader will accept.

5

If you find the key, encrypt the factory `.bin` and reflash. With the key in hand: `espsecure.py encrypt_flash_data --aes_xts --keyfile flash_encryption_key.bin --address 0x0 --output factory_encrypted.bin esp-miner-factory-vX.Y.Z.bin`. Then: `esptool.py --chip esp32s3 --port COMx --baud 115200 write_flash --encrypt 0x0 factory_encrypted.bin`. Note: each successful encrypted flash increments `FLASH_CRYPT_CNT` again. Do this once, verify boot via UART serial monitor at 115200 baud, then leave the chip alone.

6

Verify recovery via UART serial monitor. Run `idf.py monitor -p COMx -b 115200` or `pyserial-miniterm COMx 115200`. Watch for normal AxeOS / ESP-Miner-NerdQAxePlus boot output: `I (1234) cpu_start: Pro cpu up.`, `I (1500) main_task: Started on CPU0`, `I (2000) wifi: ...`. If the chip boots and the AP SSID appears, recovery succeeded. Reconfigure WiFi, pool, and Bitcoin payout address as you would after any factory recovery.

7

If you do NOT have the key, do not attempt further flashes. Every wrong-key encrypted flash burns one more `FLASH_CRYPT_CNT` bit. Three or four wrong attempts and the chip enters permanent encryption-locked state where even a correct key cannot recover it. Stop, document the eFuse summary, and proceed to Tier 4 (Step 14) for ESP32-S3 module replacement at D-Central. This is the moment to swallow the L and ship the board.

8

Document the brick before shipping. Take three photos: the controller PCB top showing the ESP32-S3 module and any visible damage, the bottom of the PCB, and a screenshot or copy-paste of the full `espefuse.py summary` output. Note the firmware fork you were building (`bitaxeorg/ESP-Miner`, `shufps/ESP-Miner-NerdQAxePlus`, `BitMaker-hub/NerdMiner_v2`, etc.), the exact `sdkconfig` lines you changed, and the date/time of the burn event. D-Central uses this to confirm the failure mode and price the repair correctly.

9

Confirm the rest of the controller PCB is healthy before shipping. With a multimeter, verify 3.3V regulator output (should read 3.30 +/- 0.05 V at the regulator pad), 12V input rail integrity, and continuity on USB-C data lines. If any of these are also bad, the unit needs more than an ESP32-S3 swap and D-Central will price accordingly. Catching co-occurring damage early prevents a second repair cycle.

10

Pre-buy a replacement ESP32-S3 module if you want to attempt the swap yourself with full understanding of the risks. Espressif ESP32-S3-WROOM-1-N16R8 (16 MB flash, 8 MB PSRAM) is the standard module on most Bitaxe and NerdQAxe variants - verify against your specific board schematic on the upstream GitHub repo before ordering. Sourcing options: Mouser, DigiKey, LCSC. Never order from anonymous AliExpress sellers - clone modules with reduced flash sizes have shipped and create a second class of brick.

11

Hot-air rework requires bench-grade equipment. Preheat: 150-160 C bottom-side IR or hotplate to soften surrounding solder. Top-side hot air: 320-340 C with a 5-8 mm nozzle for ~30 seconds, watching for the module to float free on its solder joints. Lift with vacuum tweezers - do NOT pry. Clean the pad array with flux and a desolder braid, level with a hot-air pass at 280 C, then place a fresh ESP32-S3 module aligned with the silkscreen outline. Reflow at 320-340 C until the solder visibly wets the new module pads. Cool naturally - never quench with air or contact.

12

Verify the new module before reassembly. With the module replaced and the PCB cleaned of flux residue with isopropyl alcohol 99%, attach a USB-to-UART adapter to the labeled `TX0`/`RX0`/`GND`/`EN`/`IO0` pads, force ROM bootloader (`IO0` low, pulse `EN` low, release `EN`, release `IO0`), and run `esptool.py --chip esp32s3 --port <UART COMx> chip_id`. Expected: a fresh ESP32-S3 chip ID with `FLASH_CRYPT_CNT = 0` and `SECURE_BOOT_EN = False` on `espefuse.py summary`. Confirm before flashing factory firmware.

13

Re-flash the correct factory firmware for your variant. Identify the exact board (count BM1366 / BM1368 / BM1370 / BM1397 chips, note display type, note any 'Hex' / 'Gamma' / 'Hydro' markings). Pull the matching factory `.bin` from the upstream repo (`bitaxeorg/ESP-Miner/releases`, `shufps/ESP-Miner-NerdQAxePlus/releases`, `BitMaker-hub/NerdMiner_v2/releases`). Flash via Web Flasher or `esptool.py write_flash -z 0x0 esp-miner-factory-<variant>-vX.Y.Z.bin` at `--baud 460800` or lower. Reconfigure pool, WiFi, payout address.

14

Tier 4: ship to D-Central for ESP32-S3 module replacement. Required conditions: (a) `espefuse.py summary` confirms `FLASH_CRYPT_CNT > 0` or `SECURE_BOOT_EN` set, (b) you do not hold the AES key, (c) the controller PCB is otherwise undamaged. D-Central's bench process: read eFuse summary on intake, photograph and log the unit, hot-air remove the bricked ESP32-S3 module, install a fresh pre-tested ESP32-S3-WROOM-1-N16R8 with virgin eFuses, flash the correct factory firmware for your exact variant, configure pool/WiFi/payout per your spec sheet, burn-in 4-6 hours at nameplate hashrate on the bench harness, and return shipped unit.

15

Ship safely to D-Central. ESD anti-static bag for the controller PCB or the entire unit, foam cradle in a rigid box, include the `espefuse.py summary` output printed on paper inside the bag, a note describing what firmware was being built, what `sdkconfig` options were enabled, whether you have the AES key (and the key file if you do - we will encrypt-flash with your key as a cheaper alternative to module replacement), and your contact info. Do NOT ship the 12V PSU unless you suspect it - the D-Central bench has spec-correct power for every Nerd / Bitaxe variant. Canada Post small-parcel or UPS Ground; D-Central HQ receives and intakes within 48 hours.

16

Prevention rule for next time: never compile a Bitaxe / Nerd family firmware with `CONFIG_SECURE_FLASH_ENC_ENABLED=y`, `CONFIG_SECURE_BOOT=y`, or `CONFIG_SECURE_BOOT_V2_ENABLED=y` set in `sdkconfig` unless you have an explicit, documented, key-management plan. The default `sdkconfig.defaults` for upstream `bitaxeorg/ESP-Miner` and `shufps/ESP-Miner-NerdQAxePlus` does NOT enable encryption - you have to actively opt in via `idf.py menuconfig`. If you don't know what flash encryption does at the eFuse level, you should not be enabling it. Read the Espressif Flash Encryption docs in full first.

17

Prevention rule, supply-chain: only flash factory `.bin` files from trusted upstream sources - the official `bitaxeorg/ESP-Miner` releases page, the official `shufps/ESP-Miner-NerdQAxePlus` releases page, the official `BitMaker-hub/NerdMiner_v2` releases page, or D-Central's verified factory mirror. Do NOT flash random `.bin` files attached to Discord posts, Telegram dumps, or anonymous Pastebin uploads. A malicious `.bin` could enable flash encryption with a key only the attacker has, then refuse all your subsequent flashes - effectively a remote brick attack. Verify SHA-256 against the release page checksum every time.

18

Prevention rule, second-hand units: if you bought a Bitaxe, NerdMiner, NerdAxe, NerdQAxe, or any ESP32-S3-based open-source miner second-hand, run `espefuse.py --chip esp32s3 --port COMx summary` BEFORE you trust it for any custom firmware work. Verify `FLASH_CRYPT_CNT = 0` and `SECURE_BOOT_EN = False`. If either is set, you've inherited a chip the prior owner left in encrypted state - either get the key from them in writing, or factor an ESP32-S3 module swap into your purchase economics. This 30-second check has saved countless secondary-market buyers from a permanent brick.

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.