CONFIG_IDF_TARGET="esp32p4" # Flash (Waveshare ESP32-P4-ETH-POE ships with 16 MB QSPI flash) CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y CONFIG_ESPTOOLPY_FLASHSIZE="16MB" # Partition table CONFIG_PARTITION_TABLE_CUSTOM=y CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" # PSRAM (required for 800x480 framebuffer + JPEG decode + local screens). # 200 MHz speed is gated behind IDF_EXPERIMENTAL_FEATURES on ESP32-P4 — # at the default 20 MHz the DPI bridge underruns continuously trying to # feed the panel from PSRAM. 200 MHz gives ~10x more bandwidth and the # DPI runs clean. CONFIG_IDF_EXPERIMENTAL_FEATURES=y CONFIG_SPIRAM=y CONFIG_SPIRAM_MODE_HEX=y CONFIG_SPIRAM_SPEED_200M=y CONFIG_SPIRAM_USE_MALLOC=y CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384 # Ethernet (Waveshare ESP32-P4-ETH-POE: internal EMAC + external PHY) CONFIG_ETH_ENABLED=y CONFIG_ETH_USE_ESP32_EMAC=y # LWIP / mDNS CONFIG_LWIP_IPV4=y CONFIG_LWIP_IPV6=y CONFIG_MDNS_MAX_INTERFACES=1 # TCP receive-window + buffer tuning. Earlier attempt under HTTP # regressed because every /frame opened a fresh socket and we ate # the slow-start cost repeatedly. Under the streaming pivot the # socket is long-lived: slow-start happens once, then we run with # the full window for the rest of the session — which is exactly # the workload these knobs are designed for. Larger WND lets the # sender keep more bytes in flight per ACK and pushes our recv # throughput ceiling up from ~5.3 MB/s. CONFIG_LWIP_TCP_WND_DEFAULT=65535 CONFIG_LWIP_TCP_SND_BUF_DEFAULT=65535 CONFIG_LWIP_TCP_RECVMBOX_SIZE=16 CONFIG_LWIP_TCP_SACK_OUT=y # HTTP server CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 CONFIG_HTTPD_MAX_URI_LEN=512 # Main task stack — JPEG decode is hungry CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192 # Log level CONFIG_LOG_DEFAULT_LEVEL_INFO=y