From 727cc3c0d3302813d65b85699fe24c3999e398af Mon Sep 17 00:00:00 2001 From: Hu Rui Date: Mon, 9 Mar 2026 15:29:31 +0800 Subject: [PATCH] test(sdm): add iram safe test case and with malloc comes from PSRAM by default (esp32p4) --- .../test_apps/sigma_delta/main/CMakeLists.txt | 6 +- .../sigma_delta/main/test_sdm_iram.cpp | 56 +++++++++++++++++++ .../sigma_delta/sdkconfig.defaults.esp32p4 | 3 + 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 components/esp_driver_sdm/test_apps/sigma_delta/main/test_sdm_iram.cpp create mode 100644 components/esp_driver_sdm/test_apps/sigma_delta/sdkconfig.defaults.esp32p4 diff --git a/components/esp_driver_sdm/test_apps/sigma_delta/main/CMakeLists.txt b/components/esp_driver_sdm/test_apps/sigma_delta/main/CMakeLists.txt index 4c644fce2d..dc783003cd 100644 --- a/components/esp_driver_sdm/test_apps/sigma_delta/main/CMakeLists.txt +++ b/components/esp_driver_sdm/test_apps/sigma_delta/main/CMakeLists.txt @@ -4,8 +4,12 @@ if(CONFIG_SOC_LIGHT_SLEEP_SUPPORTED AND CONFIG_PM_ENABLE) list(APPEND srcs "test_sdm_sleep.cpp") endif() +if(CONFIG_SDM_CTRL_FUNC_IN_IRAM) + list(APPEND srcs "test_sdm_iram.cpp") +endif() + # In order for the cases defined by `TEST_CASE` to be linked into the final elf, # the component can be registered as WHOLE_ARCHIVE idf_component_register(SRCS ${srcs} - PRIV_REQUIRES unity esp_driver_sdm + PRIV_REQUIRES unity esp_driver_sdm esp_psram WHOLE_ARCHIVE) diff --git a/components/esp_driver_sdm/test_apps/sigma_delta/main/test_sdm_iram.cpp b/components/esp_driver_sdm/test_apps/sigma_delta/main/test_sdm_iram.cpp new file mode 100644 index 0000000000..f9cce36524 --- /dev/null +++ b/components/esp_driver_sdm/test_apps/sigma_delta/main/test_sdm_iram.cpp @@ -0,0 +1,56 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "esp_err.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "unity.h" +#include "unity_test_utils.h" +#include "esp_attr.h" +#include "driver/sdm.h" + +typedef struct { + sdm_channel_handle_t chan; + esp_err_t ret; +} sdm_iram_test_ctx_t; + +static void IRAM_ATTR test_set_pulse_density_iram(void *args) +{ + sdm_iram_test_ctx_t *ctx = (sdm_iram_test_ctx_t *)args; + // can't use TEST_ESP_OK here + ctx->ret = sdm_channel_set_pulse_density(ctx->chan, 127); +} + +TEST_CASE("sdm_works_with_cache_disabled", "[sdm]") +{ + sdm_config_t config = { + .gpio_num = GPIO_NUM_0, + .clk_src = SDM_CLK_SRC_DEFAULT, + .sample_rate_hz = 1000000, + .flags = { + .invert_out = false, + .allow_pd = false, + }, + }; + sdm_channel_handle_t chan; + TEST_ESP_OK(sdm_new_channel(&config, &chan)); + TEST_ESP_OK(sdm_channel_set_pulse_density(chan, 0)); + TEST_ESP_OK(sdm_channel_enable(chan)); + vTaskDelay(pdMS_TO_TICKS(500)); + + printf("change pulse density in IRAM\r\n"); + sdm_iram_test_ctx_t ctx = { + .chan = chan, + .ret = ESP_FAIL, + }; + unity_utils_run_cache_disable_stub(test_set_pulse_density_iram, &ctx); + TEST_ESP_OK(ctx.ret); + vTaskDelay(pdMS_TO_TICKS(500)); + + TEST_ESP_OK(sdm_channel_disable(chan)); + TEST_ESP_OK(sdm_del_channel(chan)); +} diff --git a/components/esp_driver_sdm/test_apps/sigma_delta/sdkconfig.defaults.esp32p4 b/components/esp_driver_sdm/test_apps/sigma_delta/sdkconfig.defaults.esp32p4 new file mode 100644 index 0000000000..d2699b2221 --- /dev/null +++ b/components/esp_driver_sdm/test_apps/sigma_delta/sdkconfig.defaults.esp32p4 @@ -0,0 +1,3 @@ +CONFIG_SPIRAM=y +CONFIG_SPIRAM_MODE_HEX=y +CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=0