factor into workspace, improve features & deps
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
# usbd-uac2 Examples
|
||||
|
||||
This repository contains example implementations of a USB Audio Class 2 (UAC2) device.
|
||||
|
||||
Two example backends are provided, both based on the LPCXpresso55S28 demo board, using the onboard WM8904 DAC:
|
||||
|
||||
- **Interrupt-driven example** (`lpc55s28-evk`)
|
||||
- **DMA-based example** (`lpc55s28-evk-dma`)
|
||||
|
||||
|
||||
## Examples Overview
|
||||
|
||||
### Interrupt-driven (`lpc55s28-evk`)
|
||||
|
||||
Running at 32bit/48khz. It can't keep up at 96khz. Works on USBFS and USBHS.
|
||||
|
||||
This is a minimal implementation intended to demonstrate the fundamental
|
||||
structure of the class driver. It fills a `bbqueue` as data comes in from USB,
|
||||
and drains it into the I2S FIFO in the I2S interrupt. This requires a lot of
|
||||
time-critical CPU work managing buffers. Particularly, the USB peripheral driver
|
||||
uses a lot of interrupt-free critical sections which can cause late interrupts
|
||||
and underruns.
|
||||
|
||||
This is intended primarily as a learning/reference implementation
|
||||
|
||||
### DMA-based (`lpc55s28-evk-dma`)
|
||||
|
||||
Running at 32bit/96khz. Works on USBFS and USBHS.
|
||||
|
||||
A more realistic and robust implementation using DMA. It fills a static ring
|
||||
buffer as data comes in from USB, while the DMA chases it around the ring,
|
||||
draining into the TX FIFO. This is efficient and decouples interrupt latency
|
||||
from data delivery. It uses the DMA interrupt to track consumed slots, but as
|
||||
long as the USB doesn't catch up to the read slot before this happens, there is
|
||||
a lot of slack for other things to be happening.
|
||||
|
||||
This is a more useful demonstration, but is still lacking correct handling of
|
||||
edge cases, error conditions and so on you would want in a fully fleshed out
|
||||
implementation. Particularly, it behaves poorly in underrun, since the DMA will
|
||||
keep emitting from the ring regardless of whether the data is valid, which
|
||||
sounds terrible.
|
||||
|
||||
## Running the Examples
|
||||
|
||||
You can flash and run either example using `cargo embed`:
|
||||
|
||||
```sh
|
||||
cargo embed --release --example lpc55s28-evk --features usbfs
|
||||
Reference in New Issue
Block a user