![[GUIDE] Unbricking a soft-bricked FM-1 (black screen / "WL82 UBOOT1.00") over plain USB, no extra hardware: confirmed working](https://external-preview.redd.it/_QTobzuJkr1Zm6t-xAciOuvRRUG3sFX1cl1tVTmHCMU.png?width=108&crop=smart&auto=webp&s=bdb62c26400e65a1d5708b787fc16439f7f27e51)
[GUIDE] Unbricking a soft-bricked FM-1 (black screen / "WL82 UBOOT1.00") over plain USB, no extra hardware: confirmed working
**[GUIDE] Unbricking a soft-bricked FM-1 (black screen / "WL82 UBOOT1.00") over plain USB, no extra hardware: confirmed working**
**TL;DR:** If your FM-1 died during a firmware update (black screen, installers say "FM-1 not found", and the PC shows it as **WL82 UBOOT1.00**), you can most likely restore official V15 with just a USB cable, a Windows PC and **jl-uboot-tool**. I did it today. The key: write the *extracted* flash image to **0x4000**, never the .fwsc itself and never at address 0.
Big credit to **u//International-Soup24**, whose post showed jl-uboot-tool could talk to and dump a bricked FM-1. That's what made me try this route. Full credits at the bottom.
---
## What happened to mine
I updated Felucca 0.9-beta → 1.0.1 with the web installer. Afterwards: black screen, nothing boots, web installer and `fm1_install.py` both say *FM-1 not found*. macOS/Windows showed it as a USB storage device, `VID_4C4A PID_8057`, "WL82 UBOOT1.00", which is the JieLi chip's built-in ROM boot mode.
**Interesting finding:** I dumped the flash and compared it block by block:
- `0x0000–0x3FFF` (boot head): identical to stock V15
- `0x4000–0x92FFF` (firmware): an **exact, complete** copy of Felucca 1.0.1 (143/143 sectors)
- my saved projects and settings: intact, valid CRCs
So in my case the install **didn't fail**. 1.0.1 was written perfectly but wouldn't start on my unit. I've reported that to the Felucca dev on GitHub. Bricked by a half-finished install instead? This process covers that too, because you rewrite the whole firmware area.
---
## Before you start: read this
- This is **at your own risk**. It worked on mine. I can't promise it'll work on yours.
- It only applies if your FM-1 shows up as **WL82 UBOOT1.00**. Check first (Step 3).
- **Always make a backup first** (Step 5). That's your undo button.
- **Only ever write at `0x4000`.** Never write anything below it. That area holds the boot code. It's what lets the chip recover at all.
- **Only use the commands in this guide** inside jl-uboot-tool. `erase`, `erasechip` and writes at other addresses can make things much worse.
- This guide is for **Windows**. jl-uboot-tool also supports Linux (slightly different device paths) but **not macOS**.
---
## What you need
- Your FM-1 and a USB **data** cable (not charge-only)
- A Windows PC
- **Python**, from python.org (tick *"Add python.exe to PATH"* during install)
- **jl-uboot-tool** by kagaimiq: https://github.com/kagaimiq/jl-uboot-tool → *Code → Download ZIP*, unzip to e.g. `C:\fm1\jl-uboot-tool-main`
- **Official FM-1 V15 firmware** (`FM-1.fwsc`) from M-VAVE: https://www.m-vave.com/product?id=fm-1
- **fm1_extract_app.py**, a small script that pulls the right image out of the .fwsc: https://gist.github.com/Acrawf1/ae2b9930b49231db397568cfc2abc2a8
Put `FM-1.fwsc` and `fm1_extract_app.py` **in the jl-uboot-tool folder**.
---
## Step 1: Open an admin PowerShell
Right-click **Start** → **Terminal (Admin)** (Win 11) or **Windows PowerShell (Admin)** (Win 10). Admin is required for raw USB disk access.
```
cd C:\fm1\jl-uboot-tool-main
py -m pip install -r requirements.txt
```
## Step 2: Make the file to write
```
py fm1_extract_app.py FM-1.fwsc app_v15.bin
```
You should see:
- `identity: FM-1_015`
- `= official M-VAVE V15`
- `app sha256: 6edf3c37fb5bbbc33607c89375ee024d5477c17914d72221c8c68e58a8255686`
**If you don't get that hash, stop.** Your V15 file isn't the genuine one or got damaged.
## Step 3: Plug in the FM-1 and find it
Plug the FM-1 **directly** into the PC and switch it on (the screen stays black). **If Windows offers to format a disk, click Cancel!**
Note: `jldevfind.py` usually says *"No devices found"* on Windows, because it only scans drive volumes. Find the FM-1's disk number yourself:
```
Get-CimInstance Win32_DiskDrive | Format-Table Index, Model, InterfaceType
```
Look for **`WL82 UBOOT1.00 USB Device`** (InterfaceType USB) and note its **Index**. Mine was 5. **Don't point the tool at any other disk.** Those are your real drives.
## Step 4: Connect to the chip
Replace `5` with your Index:
```
py jluboottool.py --device '\\.\PhysicalDrive5'
```
The Quick info must show **Chip key: 0x980F** and **ID: 0x856014**. If not, type `exit` and stop.
## Step 5: Back up the whole flash (do NOT skip this)
At the `=>JL:` prompt:
```
read 0 0x100000 backup.bin
read 0 0x100000 backup2.bin
exit
```
Check both copies are identical:
```
Get-FileHash backup.bin, backup2.bin
```
The hashes must match, which proves the connection is reliable. Keep `backup.bin` somewhere safe; if you had Felucca, your projects are in it.
## Step 6: Write V15
Reopen the tool (Step 4), then type **exactly**:
```
write 0x4000 app_v15.bin
```
You'll see *Erasing* then *Writing*. **Don't unplug anything** until `=>JL:` comes back. This erases and writes exactly `0x4000–0x92FFF` and nothing else.
## Step 7: Verify every byte
```
read 0x4000 0x8F000 verify.bin
exit
```
Back in PowerShell (make sure you see `PS ...>`, not `=>JL:`):
```
Get-FileHash verify.bin
```
It must be **`6EDF3C37FB5BBBC33607C89375EE024D5477C17914D72221C8C68E58A8255686`**. If it doesn't match, **don't restart**. Run the write again.
## Step 8: Restart
Unplug USB → switch off → wait 5 s → switch on. Mine booted straight into stock V15. 🎉
---
## Notes and troubleshooting
- **"Unknown syntax: Get-FileHash"**: you're still inside jl-uboot-tool. Type `exit` and wait for `Bye!`.
- **SyntaxWarning about `\s`** when running jldevfind: harmless.
- **Your disk number can change** after unplugging/replugging. Re-check it every session.
- **Your on-device songs:** stock firmware may overwrite the area Felucca stores projects in, but they're in your backup.
- **Going back to Felucca:** maybe wait for the dev's response before reinstalling 1.0.1 if it bricked you, since mine was written correctly but wouldn't start. The script also works on Felucca's own .fwsc files if you want an older version.
- **Didn't show up as WL82 UBOOT1.00 at all?** Then this guide doesn't apply, and the hardware route is the **FM-1 Transporter** (an RP2040 board wired to the USB lines): https://github.com/kurogedelic/FM-1-transporter
---
## Credits
- **u/International-Soup24**: first showed jl-uboot-tool detecting and dumping a bricked FM-1, which pointed me down this path
- **kagaimiq**: author of jl-uboot-tool, which made talking to the chip's boot mode possible: https://github.com/kagaimiq/jl-uboot-tool
- **Leo Kuroshita (kurogedelic) / Hügelton Instruments**: Felucca and the FM-1 Transporter. Their open-source docs explained the package format and the flash layout, including the rule that nothing below 0x4000 ever gets written: https://github.com/hugelton/Felucca
- And Claude (Anthropic's AI), which did the flash analysis and wrote the extractor script with me over a very long evening 😅
Questions welcome. Happy to help anyone stuck.
Update: cause found. If you updated from Felucca 0.9-beta to 1.0.x and bricked: the
new firmware gets stuck on startup because of the old 0.9-beta data. Fix while in UBOOT
(after a backup!): erase 0x97000 0x8000 and erase 0xFC000 0x2000, then power-cycle.
1.0.2 boots fine afterwards. That erases your Felucca songs/settings on the device, so back
up first. Reported to the dev on GitHub.