Dante-interoperable AES67 audio-over-IP firmware for the ESP32-P4
|
|
3 mesi fa | |
|---|---|---|
| docs | 3 mesi fa | |
| CLAUDE.md | 3 mesi fa | |
| LICENSE | 3 mesi fa | |
| README.md | 3 mesi fa | |
| gitignore | 3 mesi fa |
Status: planning / architecture phase — no firmware written yet.
A low-cost, network audio endpoint on the ESP32-P4 that can interoperate with Dante-based AV systems. In practice "Dante-interoperable" is being pursued in two phases:
The original ESP32 (WiFi, Xtensa) can't hold AES67's ~1ms RTP packet timing tightly enough over WiFi to be spec-compliant. The P4 drops WiFi in favour of a real Ethernet MAC with hardware PTP timestamping, which is what makes sub-millisecond, spec-accurate AoIP achievable on this class of chip at all.
This is what we fork from. It already solves the hard, P4-specific problems: hardware PTP timestamping via the EMAC, an I2S driver with APLL clock recovery, an RTP engine with an L2 hook that bypasses lwIP for latency, SAP/SDP, and mDNS/DNS-SD advertisement. Apache-2.0 means we can build on it freely, including for commercial client work.
A full software Dante device implementation for Linux. We do not vendor or
copy code from this repo. It's copyleft-licensed, and incorporating its
code would obligate this whole firmware image to the same license — which
rules out using it in closed commercial deliverables. Instead it's used as
documentation: reading inferno_aoip to understand Dante's wire behaviour
(mDNS service records, control-protocol framing, flow subscriptions) well
enough to write an independent, clean-room implementation against the P4
component.
This licensing boundary is the most important constraint on this project. See
CLAUDE.mdfor the hard rule any dev session (human or agent) needs to follow.
Starting point is DatanoiseTV's reference pinout for the ESP32-P4-NANO board — confirm/update against whatever board this actually gets deployed on:
| Function | GPIO | Notes |
|---|---|---|
| Ethernet MDC | 31 | |
| Ethernet MDIO | 52 | |
| Ethernet REF_CLK | 50 | External 50MHz crystal |
| Ethernet PHY_RST | 51 | |
| I2S MCLK | 13 | 18.432MHz via APLL |
| I2S BCLK | 36 | (onboard: 12) |
| I2S LRCLK | 33 | (onboard: 10) |
| I2S DOUT | 32 | (onboard: 9) |
| I2S DIN | 11 | Codec ADC input |
| PA Enable | 53 | Active high |
| I2C SCL / SDA | 8 / 7 | ES8311 control |
Ethernet PHY: IP101 GRI via RMII. Onboard codec: ES8311 + NS4150B amp.
components/aes67/ Forked from aes67-esp32p4 — AES67 engine (PTP, RTP, I2S, SAP/SDP, mDNS)
main/ Application entry point, board config
docs/ Design notes, incl. clean-room Dante protocol notes
reference/ Local clones of both source repos, for reading only (gitignored, not part of this repo)
Requires ESP-IDF v5.5+ with the ESP32-P4 target.
idf.py set-target esp32p4
idf.py build
idf.py flash monitor
(Not yet functional — components/aes67 hasn't been forked in yet.)
aes67-esp32p4's components/aes67 in as the starting pointdocs/dante-protocol-notes.md)Apache-2.0 (see LICENSE), matching the aes67-esp32p4 base this project
forks from.