ESP32-P4-WIFI6-DEV-KIT Example
Brings up the Waveshare ESP32-P4-WIFI6-DEV-KIT board through the espp::Esp32P4Wifi6DevKit BSP
and drives an LVGL GUI. It exercises the display, touch, audio, microphone,
camera, uSD card and Ethernet:
Display + touch (MIPI-DSI + GT911): a tabview GUI. On the Status tab, touch the screen to draw circles and play a click; it also shows live subsystem state (panel, touch, SD, Ethernet, camera size, memory / uptime). The rotate / clear buttons rotate the display and clear the drawing.
Audio (ES8311 + NS4150B): the Audio tab has record / play buttons and speaker / microphone volume controls. Recording captures from the onboard microphone (full-duplex through the codec) into a PSRAM buffer; play streams it back to the speaker.
Camera (MIPI-CSI, OV5647): the Camera tab shows the live RGB565 feed. Each frame from the BSP capture task is copied into an LVGL canvas.
uSD / TF card (4-bit SDMMC): mounted at boot (if a card is present); its size is logged and shown on the Status tab.
Ethernet (internal EMAC + IP101GRI RMII PHY): started as a DHCP client; the acquired IP is logged and shown on the Status tab.
Wi-Fi 6 (via the onboard ESP32-C6) is not exercised by this example — see below for how to enable it in your own project.
Wi-Fi 6 via the onboard ESP32-C6 (ESP-Hosted)
The ESP32-P4 has no radio; the board’s ESP32-C6 (running the ESP-Hosted slave firmware it ships with) provides Wi-Fi 6 / BT5 over SDIO (CLK=GPIO18, CMD=GPIO19, D0-D3=GPIO14-17, C6 reset=GPIO54 — the ESP-Hosted defaults for the ESP32-P4, so no pin configuration is needed). To add Wi-Fi to a project using this BSP:
idf.py add-dependency "espressif/esp_wifi_remote"
idf.py add-dependency "espressif/esp_hosted"
then in menuconfig set Component config -> Wi-Fi Remote -> choose slave target to esp32c6, and use the standard esp_wifi / esp_netif APIs
unchanged (e.g. ESP-IDF’s wifi/getting_started/station example works as-is).
Note the C6 is 2.4 GHz-only. To (re)flash the C6’s ESP-Hosted slave firmware,
see the Waveshare wiki FAQ
(hold C6_IO9 low at power-on and flash via the C6 UART pads).
How the camera feed reaches the GUI
initialize_camera() runs a capture task in the BSP that hands each RGB565 frame
to a callback. The example forwards it to the thread-safe
Gui::set_camera_frame(data, w, h), which copies the frame into a PSRAM canvas
buffer (allocated lazily on the first frame / a size change) and invalidates the
LVGL canvas. The GUI’s LVGL task then renders it on the Camera tab.
Build and flash
idf.py set-target esp32p4
idf.py build flash monitor
The example uses a custom 16 MB flash partition table (partitions.csv) because
the display + LVGL + camera + audio application no longer fits the default 1 MB
app partition. PSRAM and the MIPI-CSI camera pipeline are enabled via
sdkconfig.defaults.