← back to work

AuraScope

// personal project · built in public · in progress

WIRELESS2× nRF5340 · Auracast (LC3)
HOSTArty Z7-20 · Zynq-7000 · Yocto
OBSERVABILITYkernel char driver + eBPF
STATUSshipping step by step
Digilent Arty Z7-20 board
the Arty Z7-20 — Zynq-7000 host
Arty Z7-20 wired up on the bench
nRF5340: microphone and receiver (audiocard)
● IN PROGRESSPhase 1 — hardware defined in Vivado, Yocto consuming it
read the progress log →

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.

nRF5340 #1 nRF5340 #2 Arty Z7-20 (Zynq-7000) [Auracast TX] --BLE--> [RX → USB UAC] --USB--> [ snd-usb-audio → ALSA ] Zephyr/LC3 Zephyr/LC3 | +-------------+--------------+ | char driver (/dev/audiomon) | in-kernel | eBPF probes (kprobes) | external | live dashboard (userspace) | output +-----------------------------+

Why it's worth reading

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

01

Yocto on the Arty Z7-20

A minimal custom image that boots on the board.

v0.1
02

Custom image & recipe

A layer + recipe deploying my own binary.

v0.2
03

PS/PL: audio-status LED

LED blinks on audio, solid on silence — Linux-driven via device tree + GPIO.

v0.3

Phase 2 — Wireless audio: nRF5340 & Auracast

04

Auracast transmitter

One nRF5340 broadcasting an LC3 Auracast stream.

v0.4
05

Receiver as USB sound card

Second nRF5340 enumerates over USB as a UAC device.

v0.5
06

USB audio into Linux

snd-usb-audio binds it; capture a WAV on the Arty.

v0.6

Phase 3 — Observability: kernel module & eBPF

07

Char driver: /dev/audiomon

In-kernel stats: file_operations, ioctl, sysfs, locking.

v0.7
08

eBPF tracing

kprobes on the ALSA write path; latency histograms.

v0.8
09

Live dashboard

Userspace UI consuming both the driver and eBPF data.

v0.9

Phase 4 — Integration & publish

10

Full integration

End-to-end: Auracast → Arty → monitor, with diagram.

v1.0
11

Reflections

What I'd change, what's next.

Phase 5 — Advanced (bonus): I2S / FPGA audio path

12

nRF I2S output

Receiver emits I2S clocking instead of USB.

v1.1
13

PL I2S RX logic

HDL receive logic in the Zynq fabric.

v1.2
14

PL audio → Linux

DMA + ASoC so fabric audio is an ALSA device.

v1.3
14b

PL-driven audio LED

Fabric detects signal and drives the LED — zero CPU.

v1.35
15

USB → 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/aurascope