Adds support for esp32 P4

This commit is contained in:
Rune Harlyk
2026-02-02 20:42:51 +01:00
committed by Rune Harlyk
parent d6075deb6c
commit bf2fd957af
16 changed files with 224 additions and 27 deletions
+22 -13
View File
@@ -1,3 +1,24 @@
set(COMPONENT_REQUIRES
driver
esp_http_server
nvs_flash
esp_wifi
esp_event
esp_netif
mdns
esp_timer
esp_psram
spi_flash
littlefs
esp-dsp
)
if(IDF_TARGET STREQUAL "esp32p4")
list(APPEND COMPONENT_REQUIRES esp_wifi_remote esp_hosted)
else()
list(APPEND COMPONENT_REQUIRES esp32-camera)
endif()
idf_component_register(
SRC_DIRS
"."
@@ -10,17 +31,5 @@ idf_component_register(
"../include"
"../../submodules/nanopb"
REQUIRES
driver
esp_http_server
nvs_flash
esp_wifi
esp_event
esp_netif
mdns
esp_timer
esp_psram
spi_flash
littlefs
esp32-camera
esp-dsp
${COMPONENT_REQUIRES}
)
+13
View File
@@ -16,3 +16,16 @@ dependencies:
espressif/esp32-camera:
version: "^2.0.0"
rules:
- if: "idf_version >=5.0.0"
- if: "target not in [esp32p4]"
espressif/esp_wifi_remote:
version: ">=0.3.0"
rules:
- if: "target in [esp32p4]"
espressif/esp_hosted:
version: ">=0.0.6"
rules:
- if: "target in [esp32p4]"
+20
View File
@@ -21,6 +21,10 @@
#include <mdns_service.h>
#include <system_service.h>
#if CONFIG_IDF_TARGET_ESP32P4
#include <esp_hosted.h>
#endif
#include <www_mount.hpp>
Websocket wsSocket {server, "/api/ws"};
@@ -275,6 +279,21 @@ void IRAM_ATTR SpotControlLoopEntry(void *) {
void IRAM_ATTR serviceLoopEntry(void *) {
ESP_LOGI("main", "Service task starting");
#if CONFIG_IDF_TARGET_ESP32P4
ESP_LOGI("main", "Initializing ESP-Hosted for C6 coprocessor WiFi...");
int ret = esp_hosted_init();
if (ret != 0) {
ESP_LOGE("main", "ESP-Hosted init failed: %d", ret);
} else {
ESP_LOGI("main", "ESP-Hosted initialized, connecting to C6...");
ret = esp_hosted_connect_to_slave();
if (ret != 0) {
ESP_LOGW("main", "ESP-Hosted connect failed: %d - WiFi may not work", ret);
} else {
ESP_LOGI("main", "ESP-Hosted link established with C6");
}
}
#endif
WiFi.init();
wifiService.begin();
@@ -291,6 +310,7 @@ void IRAM_ATTR serviceLoopEntry(void *) {
setupEventSocket();
ESP_LOGI("main", "Service task started");
for (;;) {
wifiService.loop();
apService.loop();
+20 -5
View File
@@ -5,6 +5,7 @@
namespace Camera {
static const char *const TAG = "CameraService";
#if USE_CAMERA && !CONFIG_IDF_TARGET_ESP32P4
static constexpr const char *_STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static constexpr const char *_STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
@@ -35,9 +36,8 @@ CameraService::CameraService()
: protoEndpoint(CameraSettings_read, CameraSettings_update, this,
API_REQUEST_EXTRACTOR(camera_settings, api_CameraSettings),
API_RESPONSE_ASSIGNER(camera_settings, api_CameraSettings)),
_persistence(CameraSettings_read, CameraSettings_update, this,
CAMERA_SETTINGS_FILE, api_CameraSettings_fields, api_CameraSettings_size,
CameraSettings_defaults()) {
_persistence(CameraSettings_read, CameraSettings_update, this, CAMERA_SETTINGS_FILE, api_CameraSettings_fields,
api_CameraSettings_size, CameraSettings_defaults()) {
addUpdateHandler([&](const std::string &originId) { updateCamera(); }, false);
}
@@ -46,7 +46,6 @@ esp_err_t CameraService::begin() {
camera_config_t camera_config;
camera_config.ledc_channel = LEDC_CHANNEL_0;
camera_config.ledc_timer = LEDC_TIMER_0;
#if FT_ENABLED(USE_CAMERA)
camera_config.pin_d0 = Y2_GPIO_NUM;
camera_config.pin_d1 = Y3_GPIO_NUM;
camera_config.pin_d2 = Y4_GPIO_NUM;
@@ -63,7 +62,6 @@ esp_err_t CameraService::begin() {
camera_config.pin_sccb_scl = SIOC_GPIO_NUM;
camera_config.pin_pwdn = PWDN_GPIO_NUM;
camera_config.pin_reset = RESET_GPIO_NUM;
#endif
camera_config.xclk_freq_hz = 20000000;
camera_config.pixel_format = PIXFORMAT_JPEG;
@@ -181,4 +179,21 @@ void CameraService::updateCamera() {
safe_sensor_return();
}
#else
camera_fb_t *safe_camera_fb_get() { return nullptr; }
sensor_t *safe_sensor_get() { return nullptr; }
void safe_sensor_return() {}
CameraService::CameraService() {}
esp_err_t CameraService::begin() { return ESP_ERR_NOT_SUPPORTED; }
esp_err_t CameraService::cameraStill(httpd_req_t *request) {
return WebServer::sendError(request, 501, "Camera not supported on this platform");
}
esp_err_t CameraService::cameraStream(httpd_req_t *request) {
return WebServer::sendError(request, 501, "Camera not supported on this platform");
}
#endif
} // namespace Camera
+4 -2
View File
@@ -8,7 +8,8 @@
#include <esp_sleep.h>
#include <soc/soc.h>
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || \
CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4
#include <driver/temperature_sensor.h>
static float temperatureRead() {
@@ -100,7 +101,7 @@ void sleep() {
uint64_t bitmask = (uint64_t)1 << (WAKEUP_PIN_NUMBER);
#ifdef CONFIG_IDF_TARGET_ESP32C3
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4
esp_deep_sleep_enable_gpio_wakeup(bitmask, (esp_deepsleep_gpio_wake_up_mode_t)WAKEUP_SIGNAL);
#else
esp_sleep_enable_ext1_wakeup(bitmask, (esp_sleep_ext1_wakeup_mode_t)WAKEUP_SIGNAL);
@@ -124,6 +125,7 @@ static const char *getChipModel() {
case CHIP_ESP32C2: return "ESP32-C2";
case CHIP_ESP32C6: return "ESP32-C6";
case CHIP_ESP32H2: return "ESP32-H2";
case CHIP_ESP32P4: return "ESP32-P4";
default: return "Unknown";
}
}