How to get this firmware onto a Waveshare ESP32-P4-ETH for bench testing, using the official Espressif ESP-IDF extension for VS Code.
Why not Arduino IDE? This is a native ESP-IDF project. It depends on sdkconfig options the Arduino build can't provide —
ESP_NETIF_L2_TAPand the PTP daemon config (for hardware-timestamped PTP), plus thecomponents/layout, managed components (mdns,esp-dsp,es8311) and the tunedsdkconfig.defaults. Arduino would drop exactly the timing features that make AES67 work on the P4. Use one of the ESP-IDF workflows instead.
Board USB port: the ESP32-P4 flashes over its built-in USB-Serial-JTAG. Use the USB-C port wired for that on the board — confirm the silkscreen / the board wiki if there is more than one connector. If the PC never enumerates a serial port, see Troubleshooting → download mode below.
d:\GIT_REPO\ESP32-P4_DANTE (the repo root — the
folder containing the top-level CMakeLists.txt).sdkconfig.defaults (L2 TAP, PTP daemon, PSRAM,
32 MB flash, IRAM tuning) into a generated sdkconfig. That file is
gitignored — it's your local build config.By default the build comes up as an AES67 endpoint plus read-only Dante discovery (logs what Dante gear it sees). The Dante advertisement and CMC responder are gated OFF until validated. To turn them on:
Browse for Dante devices on boot (DANTE_DISCOVERY_ON_BOOT) — on by
default; leave it on, it's read-only and useful.Advertise this device over mDNS (Dante) (DANTE_ADVERTISE_ON_BOOT).Run the Dante CMC (device-announce) responder (DANTE_CMC_ON_BOOT).These two are prototype / untested against hardware. Enable them when you're ready to watch what Dante Controller does with a device that answers CMC but not yet ARC — expect it to appear but not be fully routable.
Log tags to watch for, roughly in order:
I (…) main: LDO4 set to 3.3V
I (…) main: ethernet started
I (…) main: ethernet link up
I (…) main: waiting for IP address...
I (…) main: got IP: 10.x.x.x
I (…) main: PA enabled (GPIO53 high)
I (…) main: Ethernet RTP hook installed
I (…) main: ES8311 codec initialized (MCLK running)
I (…) main: node ready
I (…) dante_disc: discovery task started (interval=15000ms)
I (…) dante_disc: scan complete: N Dante service instance(s)
If you enabled the Dante servers you'll also see dante_cmc: CMC responder
listening on udp/8800 and dante_adv: advertising as "ESP32P4-Dante-XXXXXX".
Work down this list; each step gates the next.
node ready, Ethernet shows link up, and
an IP is obtained. No boot loop.ES8311 codec initialized with no error. (If it fails,
suspect I2S/I2C pins or the PA — cross-check main/board_config.h.)main.c should pick up the
first source (Auto-subscribing to "…"), and audio should come out the
speaker.dante_disc should log
their _netaudio-* services and channel formats.Capture a packet trace (Wireshark, mirror port) during 5–6 — it's the ground truth for validating the clean-room Dante notes and fixing the "unknown" protocol fields.
mdns, esp-dsp, es8311) — the
IDF component manager needs internet on first build to fetch them into
managed_components/.Wrong flash size / boot loops — confirm the SDK config has 32 MB flash
(from sdkconfig.defaults) and PSRAM enabled. Try ESP-IDF: Erase Flash,
then flash again.waiting for IP address... until it gets one.idf.py set-target esp32p4 && idf.py build && idf.py -p <PORT> flash monitor.framework = espidf, board for the P4; add the components
and point at sdkconfig.defaults.