- Posted on
I Tried to Dump the Firmware From a UE Wonderboom. I Found 2.4 Seconds of Sound Effects Instead.
The story of reverse-engineering a first-generation Bluetooth speaker, one mystery test pad, improvised SPI programmer, and 1 tiny puff of magical electric smoke at a time.
Project: Ultimate Ears Wonderboom (Gen 1)
Main SoC: Airoha AB1520
External flash: Fudan FM25Q08A, 8 Mbit / 1 MiB SPI NOR
Research: October 2026
Status: External flash dumped and decoded; main firmware still evades extraction so far
Now, many people may wonder why bother.
In today's era most of our decade old accessory devices are "Good enough" for normal use still. Though my good enough is different than other peoples; if I know a device is technically capable but it has behaviors that bother me, or needs a custom feature. I have gotten accustomed to taking it apart and hacking it.
The goal here was, (and still is), to access the device firmware and modify the auto-off interval. The default behavior for the Gen1 Wonderboom is to automatically turn off after 10 minutes without an active audio stream. For a Bluetooth speaker that lives on my desk and gets used for work, this is annoying to say the least.

There is a special kind of optimism involved in spotting an eight-pin flash chip on a Bluetooth speaker's motherboard and thinking, "Gee, this is going to be easy. I'll just dump the firmware."
That is how I ended up taking apart a first-generation Ultimate Ears Wonderboom, trying to get low level access to an Airoha Bluetooth SoC, making power components release their magic smoke, hand-desoldering a tiny SPI flash chip, and wiring it to a Raspberry Pi Pico with solid-core copper wire.
The punchline? I successfully recovered the chip's entire contents. It wasn't the firmware. It was, for the most part, two little audio cues. Just the start-up and shutdown sounds. Even funnier, the device runs stable with the flash removed entirely.
That sounds disappointing, and for the specific goal of extracting the main firmware, it absolutely was. But as a reverse-engineering project, it turned into a surprisingly useful map of how this speaker is put together—and a lesson in why a successful memory dump and a successful firmware dump are not the same thing.
The target: an original Gen 1 Wonderboom with an Airoha AB1520

The original Wonderboom is a fairly ordinary-looking portable Bluetooth speaker, if you're under 50 we've all seen one at this point. Under the shell, though, it's a collection of distinct subsystems: battery management, amplification, speaker drivers, physical controls, and the Bluetooth/audio controller.
I did a complete teardown as shown here on YouTube by Mike Novelli. The main deviation being that once I seperated the top PCBs (The main motherboard and the audio driver daughterboard), I didn't continue to disassembling the lower battery assembly.
As I examined the boards and began reverse engineering I identified the Airoha AB1520 alongside a Fudan FM25Q08A serial flash, as well as Texas Instruments components for charging, power conversion, and amplification. My target is the Airoha AB1520, handling the Bluetooth side of the operation.
That external flash looked like the obvious starting point. An 8-Mbit SPI NOR chip seemed large enough to hold a modest embedded firmware image, and it's a familiar target for hardware reverse engineering.
But before I got to it, I had to probe through the first temptation, the low hanging fruit: the row of labeled factory test points. You can see them on the top board on the image above (The gold tinned holes near the buttons), the flash chip is directly adjacent and the Airoha chip label next to it is visible on the mainboard as well.
If you zoom in close enough, you may see yourself that they were nice enough to leave them labelled!

The red herring of test-pads on locked down devices...
This is the information they were nice enough to grace us all with:
GND WK RX TX P3 SDA RST BAT
The wheels were turning in my head and the layout looks an awful lot like something a factory programming or diagnostic fixture might use: power, ground, wake, reset, UART, and two other control signals. Simple enough! (I thought!)
At this point I soldered on headers, connected my USB serial adapter and went to town. Er, tried to go to town, if I'm going to continue this allegory, all I did was put on my coat and touch the door handle. More on the UART and serial findings in a minute.
As soon as I realized I needed more information than aimlessly probing for UART; the first thing I did was measure voltages with the battery installed and the speaker in different power states. With USB disconnected and the serial adapter removed, the results were:
| Test pad | Speaker OFF | Speaker ON |
|---|---|---|
| WK | ~0.1–0.2 V | ~4.21 V |
| RX | 1.800 V | 3.25 V |
| TX | 1.800 V | 3.25 V |
| P3 | 1.469 V | ~3.00 V |
| SDA | 1.470 V | ~3.00 V |
| RST | 0 V | 0 V |
| BAT | ~4.26 V | ~4.25 V |
The interesting part was the pairing. RX and TX moved together between 1.8 V in standby and 3.25 V while running. P3 and SDA also moved together, though at slightly lower voltages. That suggested power-state-dependent I/O biasing or supply behavior, but it did not prove which regulator powered each pad or that the SoC was switching its entire I/O domain.
WK was odder still. I accidentally touched it to ground while probing and the speaker woke up. That's a useful clue about the wake circuitry, though not enough to establish the exact active polarity of the AB1520 input.
I also found documentation for a different AB1520-based module, LG Innotek's WB1NB7, which describes PIO3 as MODE_SEL (test mode selection) and SDA as CALIBRATION (engineering test mode). That was encouraging—but it's a reference design from another product, not a Wonderboom programming manual, and at best just acknowledgement the CPU could be configured this way.
In the image below, you can see my "beautiful" hand soldering job of adding headers to the pins on the main board.

UART: a handful of bytes and absolutely no conversation
Naturally, I went after RX and TX first. I connected my USB serial adapter and captured raw bytes at 115200 baud during power-on.
What came back was not exactly a warm welcome:
39 ff
2d fe
14
After swapping which board pad fed the adapter's receive input, I got more tiny, inconsistent bursts:
9c fe
08 fe
90 fe
3d
I eventually did a useful isolation test: with only the adapter's ground connected, I received no spurious bytes. With the receive input attached to either the board's TX or RX pad, boot-time junk output returned.
This was likely just evidence of electrical transitions and level shifts on the nets like I was discussing in the previous section registering weird as the device went from 1.8v to 3.3v. Ultimately I got no evidence of a working 115200-baud console.
I considered turning a Raspberry Pi Pico into a logic analyzer. I still think that's a sensible next step. I also had absolutely no desire to set up an oscilloscope just to stare at two disappointing pins, so the UART investigation stalled here for now.
Factory mode, I²C deadlock, or just an expensive way to freeze a speaker?
Next came P3 and SDA.
Briefly grounding P3 during normal operation and during a power-on attempt did not expose a useful mode or diagnostic interface.
During one P3-related experiment, I tried shorting it while the device was already powered on, that's when I got the fresh smell of the earlier mentioned magic smoke. I couldn't identify what I fried, couldn't find an obviously burned trace, and didn't observe abnormal heating afterward. The Wonderboom continues to operate completely normal as far as I can tell, which is encouraging! I surely fried something there but this stunningly locked down device at least has well designed power rails!
SDA was much more interesting to play with.
When I held SDA LOW during startup, the speaker entered a repeatable, abnormal state: the usual power indicator and the red low-battery-style LED remained solid, and the power button stopped responding. Both UART pads still sat high, but still, nothing useful appeared over serial.
There was one key observation: releasing SDA didn't unfreeze it. I had to remove power from the board and restore it before normal behavior returned.
I had found a reproducible startup failure or alternate startup path. What I hadn't found was proof of engineering mode. On the related AB1520 module docs I found, SDA is explicitly associated with engineering calibration, but SDA seems to be a conventional I²C data signal. Holding it low at startup could might block firmware read transactions and leave the CPU hanging indefinitely.
Without an SCL capture, a documented mode-entry sequence, or a response from a known protocol, the honest label I gave this experiment is “Hung SDA-dependent startup state, cause unresolved.”
I also located three pads on the underside marked A, B, and C. At least two traces appeared to route toward the main SoC. Their purpose remains unidentified. I have yet to probe them at all due to their inconvenient location.
They may be JTAG or SWD, maybe not, but it's one of my next things to look at because they're mysterious and near the processor.

Fine then. I'll just dump the eight-pin flash chip.
By this point I was tired of trying to coax the AB1520 into a conversation. The external flash was right there, and I can hack together a way to read and ordinary SPI NOR with my existing equipment.
There was only one problem: I didn't have a dedicated programmer or a comfortable chip-removal setup, like a reflow station, handy. (Don't worry, I've ordered them.)
So I improvised! I hadn't done this in a while so I practiced hand-desoldering a similar flash another IC and discovered I was entirely capable of damaging it. Then I decided to remove the Wonderboom flash anyway, because f*** it we ball.
I added Sn63Pb37 solder to the existing joints and bridged them to add mass and lower the leadless factory solder's melting point with plenty of flux and a broad soldering-iron tip, eventually I got the chip off with no damage.
A hot-air station would have been sane and taken way less time, but sometimes it's better to hone your old skills and pretend it's 1992. The old-fashioned approach worked this time.
Once the chip was free, I soldered solid-core copper leads to it from a stripped ethernet cable, connected it all to a breadboard, then connected that to a Raspberry Pi Pico, and loaded pico-serprog so that flashrom could use the Pico as a programmer. That brings you up to speed on how I got to the picture at the start of this post.
The flash was now off-board, I gave it the freedom most Chinese chips yearn for and can only dream of. I did this so I wouldn't need to worry about the AB1520 contending for the SPI bus or accidentally back-powering the entire thing through a Raspberry Pi Pico at 3.3v.
With no socket, no dedicated flash programmer, and considerably more optimism than was warranted I pressed forward.

The flash pin that almost made me rage quit: HOLD
My first attempt to identify the chip failed:
serprog: Programmer name is "pico-serprog"
Warning: NAK to query operation buffer size
No EEPROM/flash device found.
The Pico was communicating with flashrom, but flashrom couldn't see the memory device. I measured all eight flash pins at rest and found the critical detail:
Pin: 1 2 3 4 5 6 7 8
Volts 3.3 0 0 0 0 0 0 3.3
Pin 8 had 3.3 V, pin 4 was ground, and chip select was high. But pin 7, HOLD#, was at 0 V. After reviewing docs I found on this SPI flash, asserting HOLD# can suspend ordinary serial communication. Pin 3, WP#, was also low; but write protect being enabled is fine for now and shouldn't disable any reads.
After bringing HOLD# HIGH, leaving WP# as it was, flashrom reported:
Found Fudan flash chip "FM25Q08" (1024 kB, SPI) on serprog.
WOOHOOOOO! That was my breakthrough. The chip survived removal and was actually responding.
One caveat for anyone copying this: the flash's WP# and HOLD# pins can serve as Quad-SPI data pins in other modes. I used a direct HIGH connection in the successful identification experiment, but proper resistor pull-ups would be best practice.
Two clean reads. Both perfectly matched by hash.
The successful read command was:
.\flashrom -p serprog:dev=COM13:115200,spispeed=1M -c FM25Q08 -r wonderboom_original_1.bin
I read the chip a second time into another file and compared hashes:
wonderboom_original_1.bin 1,048,576 bytes
wonderboom_original_2.bin 1,048,576 bytes
SHA-256 (both):
A1F09CBA925F1BB239001D87D3FD80796E959B8BC095E89D2A810C5084A136DD
Two complete 1 MiB images. Identical SHA-256. I also kept the original flash untouched. The experiment had finally produced something meaningful and reproducible.
Then I opened the binary.
The twist: 95% zeros, 900 SBC frames, and two sound effects
The first surprise was that the dump was 94.9% zero bytes. Most of the nonzero data lived near the beginning of the address space. The next surprise was that the interesting region had a coherent resource layout, not the shape of any conventional executable image.
The inferred top-level directory described four resources:
| Offset | Length | What it appears to contain |
|---|---|---|
0x001000 |
1 byte | Placeholder/unknown |
0x002000 |
57,600 bytes | SBC audio stream |
0x011000 |
25 bytes | Index describing two clips |
0x012000 |
0 bytes | Empty resource |
At 0x002000, frames began with 9C F5 0D. 0x9C is the synchronization byte for SBC, the Subband Codec widely associated with Bluetooth audio. The 57,600-byte payload held 900 consecutive frames, each 64 bytes long, consistent with 48 kHz, dual-channel SBC audio.
The 25-byte index split those frames into two clips:
| Clip | Frames | Duration |
|---|---|---|
| 1 | 432 | 1.152 seconds |
| 2 | 468 | 1.248 seconds |
| Total | 900 | 2.400 seconds |
I decoded both streams with FFmpeg. They were real, non-silent audio—not random bytes that happened to resemble an SBC header. Obviously the resource format and index layout are only inferred from this dump, not an official Airoha specification, but the offsets and lengths reconcile exactly, and the rest is just 0's.
At this point I had to ask the obvious question: If I removed the external flash, would the speaker even boot?
This whole thing was starting to feel like a sick joke after spending several hours of my life in a labor of love, just so I wouldn't have to buy a new speaker.
I powered it on without the flash. It worked.
It powered up. It still worked as a Bluetooth speaker. But its familiar power-on and power-off sounds were missing. The Bluetooth connection/join sound still played.
The conclusion is narrow but strong: the external FM25Q08A is not required to boot the Wonderboom's normal application, and it seems like only two user-interface sounds live on it in the first place.
The natural next hypothesis is that the real Bluetooth/application firmware lives in storage associated with the AB1520, perhaps embedded flash. But I have not dumped the SoC's program storage, yet. This seems like it should be do-able over Bluetooth but sometimes you have to put a project down for a few weeks until you can stomach looking at it again after surmounting the dissapointment.
So yes: I went looking for firmware, and the tantalizing 1 MiB flash chip turned out to be, apparently, an audio-resource cartridge. Maybe not a deliberate red herring from Ultimate Ears, but it was a very effective one from my perspective.
What I actually learned—and what's next
Despite the detour, this project produced results I can repeat and build on:
- Identified the AB1520 controller and external FM25Q08A on the original Wonderboom board.
- Documented the main factory-pad labels and power-state-dependent voltages.
- Confirmed that 115200-baud UART probing has not yet yielded a verified debug interface.
- Found a reproducible SDA-dependent startup lockup, although its cause remains unknown.
- Located three more uncharacterized underside pads marked A/B/C.
- Removed the flash, identified it using a Pico and flashrom, and recovered two identical 1 MiB dumps.
- Reverse-engineered enough of the resource container to extract and decode two SBC sound assets.
- Verified through a flashless boot test that the external memory is not required for normal application startup.
There are two paths forward. The practical one is a custom sound-resource pack: encode replacement clips with compatible SBC parameters, preserve the directory structure, and test them on a replacement flash while keeping the original image safe. That's a tangible modification already grounded in a format I can parse.
The harder—and still more interesting—one is accessing the AB1520's actual firmware. That means identifying what A/B/C do, finding the real reset and engineering interfaces, and locating an AB1520-specific bootloader, factory tool, or readback path. The related LG module documentation is a lead, not an unlock procedure. An oscilloscope or logic analyzer would probably help, whether I feel like setting one up or not.
For now, I have not recovered main firmware, no custom firmware execution, and no confirmed factory debug console. Those are the next research goals, sadly not accomplishments I can claim today.
Final thoughts
I started this thinking I'd find a firmware image in a convenient external flash chip. Instead, I learned how the Wonderboom handles at least some of its audio assets, recovered an undocumented little resource container, and proved that its main application can run without that memory installed.
And the Raspberry Pi Pico earned a permanent place in my reverse-engineering toolkit. A board that costs less than a decent lunch, a few lengths of copper wire, and open-source tools are enough to extract a bit-perfect image from a chips removed by hand. That's a learning lesson for everyone with the know-how.
The main firmware is still hiding. The underside test pads are still suspicious. I still don't know which component sacrificed itself to make that puff of smoke.
But now we know exactly where ~2.4 seconds of the Wonderboom's personality were hiding!
To be continued.
References and tools
- LG Innotek WB1NB7 module manual — AB1520-family test-pin terminology; not a Wonderboom factory manual.
- LG WB1NP7 module manual — related AB1520 module pin and electrical documentation.
- opensensor/pico-serprog — Raspberry Pi Pico SPI programmer firmware.
- flashrom — serial flash identification and extraction.
- FFmpeg — SBC-to-WAV decoding.
Research note: Experiments were performed on one board. The original binary dump is preserved with the SHA-256 shown above. Potentially damaging tests, especially those involving an unknown pad or a lithium-ion-powered circuit, should not be treated as a general-purpose procedure.
If you have any additional information to aid my efforts or would like the recovered flash blobs, reach out to [email protected]





