# Bench setup — build & flash (VS Code ESP-IDF extension) 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_TAP` and > the PTP daemon config (for hardware-timestamped PTP), plus the `components/` > layout, managed components (`mdns`, `esp-dsp`, `es8311`) and the tuned > `sdkconfig.defaults`. Arduino would drop exactly the timing features that > make AES67 work on the P4. Use one of the ESP-IDF workflows instead. --- ## 0. What you need - Waveshare **ESP32-P4-ETH** board. - **USB-C cable** (data-capable — not charge-only) between the PC and the board's USB port used for flashing/console. - An **Ethernet cable** to a switch/router that hands out DHCP (the firmware waits for an IP before starting audio). For real interop testing, the same switch as your Dante/AES67 gear. - Windows 11 with VS Code. > **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](https://www.waveshare.com/wiki/ESP32-P4-ETH) if there is > more than one connector. If the PC never enumerates a serial port, see > *Troubleshooting → download mode* below. --- ## 1. Install the ESP-IDF extension (one time) 1. In VS Code: **Extensions** (Ctrl+Shift+X) → search **"ESP-IDF"** (publisher *Espressif Systems*) → **Install**. 2. Open the command palette (Ctrl+Shift+P) → **ESP-IDF: Configure ESP-IDF Extension**. 3. Choose **Express** install. 4. Select ESP-IDF **v5.5** (or newer) — this project requires ≥ 5.5. Let it download the toolchain and tools (several minutes). ESP32-P4 is a RISC-V target; the installer pulls the right compiler automatically. 5. When it finishes you'll have an **ESP-IDF Terminal** and a row of icons in the VS Code status bar (target, port, build, flash, monitor…). --- ## 2. Open the project & set the target 1. **File → Open Folder** → `d:\GIT_REPO\ESP32-P4_DANTE` (the repo root — the folder containing the top-level `CMakeLists.txt`). 2. Set the chip target: command palette → **ESP-IDF: Set Espressif Device Target** → **esp32p4** → choose the **built-in USB-JTAG** flash method when prompted. - Status-bar equivalent: the chip icon. 3. First configure will apply `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. --- ## 3. (Optional) enable the Dante prototype features 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: 1. Command palette → **ESP-IDF: SDK Configuration Editor (menuconfig)**. 2. Search **"Dante"** and enable as needed: - `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**). 3. **Save**. > 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. --- ## 4. Build - Command palette → **ESP-IDF: Build your project** (or the build/wrench icon). - First build compiles ESP-IDF + both components; it takes a while. Subsequent builds are incremental. - On success you'll see the app/partition sizes. If it fails, check *Troubleshooting* below — the most likely first-run issues are toolchain/IDF version and the managed-component download needing internet. --- ## 5. Flash & monitor 1. Plug the board in. Set the port: command palette → **ESP-IDF: Select Port to Use** → pick the board's COM port (status-bar plug icon). 2. **ESP-IDF: Flash your project** → choose **UART**/**JTAG** as offered for the built-in USB-JTAG. 3. **ESP-IDF: Monitor your project** (or the "Flash + Monitor" combined action). Monitor runs at **115200** baud. - Exit the monitor with **Ctrl+]**. ### What a healthy boot looks like 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"`. --- ## 6. Bench test checklist Work down this list; each step gates the next. 1. **Boots & links** — you reach `node ready`, Ethernet shows `link up`, and an IP is obtained. No boot loop. 2. **Codec init OK** — `ES8311 codec initialized` with no error. (If it fails, suspect I2S/I2C pins or the PA — cross-check `main/board_config.h`.) 3. **PTP** — with a PTP master / AES67 gear on the network, watch for the PTP lock log from the AES67 stack. Sync is required for clean audio. 4. **AES67 receive** — point a known AES67 source (or Dante gear in AES67 mode) at the network; the SAP auto-subscribe in `main.c` should pick up the first source (`Auto-subscribing to "…"`), and audio should come out the speaker. 5. **Dante discovery** — with Dante devices present, `dante_disc` should log their `_netaudio-*` services and channel formats. 6. **Dante CMC / advertisement** (if enabled) — open **Dante Controller** on a PC on the same network; the device should appear. It won't be fully routable until the ARC responder exists — that's expected. 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. --- ## 7. Troubleshooting - **No serial port appears / can't connect → download mode.** Hold **BOOT**, tap **RESET** (EN), release BOOT, then flash. Some boards need this only if the app crashes early or USB re-enumeration fails. - **Build can't find managed components** (`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. - **No IP** — check the Ethernet link LED and that the switch does DHCP. The firmware blocks at `waiting for IP address...` until it gets one. - **No audio but everything else is fine** — check PTP lock first, then the amp: PA enable is GPIO53 (active high). Verify subscription actually happened in the log. - **IDF version errors** — this project needs **v5.5+**. Re-run *Configure ESP-IDF Extension* and select a 5.5 (or newer) release. --- ## Alternatives (same project, other tools) - **CLI:** open the **ESP-IDF Terminal**, then `idf.py set-target esp32p4 && idf.py build && idf.py -p flash monitor`. - **PlatformIO:** `framework = espidf`, `board` for the P4; add the components and point at `sdkconfig.defaults`.