AuraScope
The idea
Take a Bluetooth LE Audio (Auracast) broadcast, receive it on an nRF5340, and present the receiver to a Zynq-7000 Linux host as a plain USB sound card. Then make the whole audio pipeline observable two different ways — from inside the kernel with a character driver I write, and from outside with eBPF — and surface the data in a small live dashboard.
The point isn't just the gadget. It's to build it as a series of small, self-contained, publishable steps that each teach one thing and each leave a tagged commit behind — so the repo history itself tells the story from first boot to full integration.
Why it's worth reading
- Auracast / LC3 on Zephyr — the new BLE Audio stack, still uncommon in portfolios.
- Real Yocto — a custom image and recipes on a Zynq target, not a pre-baked distro.
- A kernel module I actually wrote — file_operations, ioctls, sysfs, and correct locking.
- eBPF on embedded Linux — the same data the driver owns, observed from the outside, so you see the tradeoff between the two approaches.
The build, step by step
Each step links to its own write-up as it ships. Greyed steps are planned but not yet published.
Phase 1 — Foundation: Linux on the Zynq
Yocto on the Arty Z7-20
A minimal custom image that boots on the board.
v0.1 02Custom image & recipe
A layer + recipe deploying my own binary.
v0.2PS/PL: audio-status LED
LED blinks on audio, solid on silence — Linux-driven via device tree + GPIO.
v0.3Phase 2 — Wireless audio: nRF5340 & Auracast
Auracast transmitter
One nRF5340 broadcasting an LC3 Auracast stream.
v0.4Receiver as USB sound card
Second nRF5340 enumerates over USB as a UAC device.
v0.5USB audio into Linux
snd-usb-audio binds it; capture a WAV on the Arty.
v0.6Phase 3 — Observability: kernel module & eBPF
Char driver: /dev/audiomon
In-kernel stats: file_operations, ioctl, sysfs, locking.
v0.7eBPF tracing
kprobes on the ALSA write path; latency histograms.
v0.8Live dashboard
Userspace UI consuming both the driver and eBPF data.
v0.9Phase 4 — Integration & publish
Full integration
End-to-end: Auracast → Arty → monitor, with diagram.
v1.0Reflections
What I'd change, what's next.
—Phase 5 — Advanced (bonus): I2S / FPGA audio path
nRF I2S output
Receiver emits I2S clocking instead of USB.
v1.1PL I2S RX logic
HDL receive logic in the Zynq fabric.
v1.2PL audio → Linux
DMA + ASoC so fabric audio is an ALSA device.
v1.3PL-driven audio LED
Fabric detects signal and drives the LED — zero CPU.
v1.35USB → FPGA port write-up
Both transports compared; same observability layer reused.
v1.4// tap a lit step to read it · greyed steps are planned, not yet published
Repo
Source and tagged history: github.com/a-teresa (repo link to be set)