From eb27e688fb6cb5288467e843d02dd4a26556c86b Mon Sep 17 00:00:00 2001 From: jingli Date: Wed, 1 Feb 2023 16:37:04 +0800 Subject: [PATCH] UT/esp32c2: reenable pm and sleep related UT --- components/esp_pm/test/test_pm.c | 3 - components/esp_system/test/CMakeLists.txt | 3 +- components/esp_system/test/test_sleep.c | 86 ++++++++++++++----- .../rtc_8md256/main/test_rtc_8md256.c | 4 - .../test_apps/rtc_8md256/pytest_rtc_8md256.py | 2 +- examples/system/.build-test-rules.yml | 6 -- examples/system/light_sleep/README.md | 4 +- .../main/light_sleep_example_main.c | 6 ++ .../system/light_sleep/pytest_light_sleep.py | 4 +- 9 files changed, 79 insertions(+), 39 deletions(-) diff --git a/components/esp_pm/test/test_pm.c b/components/esp_pm/test/test_pm.c index ca4b913f99..76c0f1c14e 100644 --- a/components/esp_pm/test/test_pm.c +++ b/components/esp_pm/test/test_pm.c @@ -268,8 +268,6 @@ TEST_CASE("Can wake up from automatic light sleep by GPIO", "[pm][ignore]") #endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2, ESP32S3) #endif //CONFIG_ULP_COPROC_TYPE_FSM -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) -//IDF-5053 typedef struct { int delay_us; int result; @@ -390,7 +388,6 @@ TEST_CASE("esp_timer produces correct delays with light sleep", "[pm]") #undef NUM_INTERVALS } -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) static void timer_cb1(void *arg) { diff --git a/components/esp_system/test/CMakeLists.txt b/components/esp_system/test/CMakeLists.txt index f9dbdc04cf..2f98628ec8 100644 --- a/components/esp_system/test/CMakeLists.txt +++ b/components/esp_system/test/CMakeLists.txt @@ -1,7 +1,8 @@ set(requires "unity" "test_utils" "driver" - "esp_timer") + "esp_timer" + "nvs_flash") set(excludes "test_ipc_isr.c" "test_ipc_isr.S" diff --git a/components/esp_system/test/test_sleep.c b/components/esp_system/test/test_sleep.c index 1a9e2d4df0..655e0b322a 100644 --- a/components/esp_system/test/test_sleep.c +++ b/components/esp_system/test/test_sleep.c @@ -28,6 +28,8 @@ #include "esp_timer.h" #include "esp_private/esp_clk.h" #include "esp_random.h" +#include "nvs_flash.h" +#include "nvs.h" #define ESP_EXT0_WAKEUP_LEVEL_LOW 0 #define ESP_EXT0_WAKEUP_LEVEL_HIGH 1 @@ -64,8 +66,6 @@ TEST_CASE("enter deep sleep on APP CPU and wake up using timer", "[deepsleep][re } #endif -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) -//IDF-5131 TEST_CASE("wake up from deep sleep using timer", "[deepsleep][reset=DEEPSLEEP_RESET]") { esp_sleep_enable_timer_wakeup(2000000); @@ -79,7 +79,6 @@ TEST_CASE("light sleep followed by deep sleep", "[deepsleep][reset=DEEPSLEEP_RES esp_deep_sleep_start(); } -//IDF-5053 TEST_CASE("wake up from light sleep using timer", "[deepsleep]") { esp_sleep_enable_timer_wakeup(2000000); @@ -91,7 +90,6 @@ TEST_CASE("wake up from light sleep using timer", "[deepsleep]") (tv_stop.tv_usec - tv_start.tv_usec) * 1e-3f; TEST_ASSERT_INT32_WITHIN(500, 2000, (int) dt); } -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) //NOTE: Explained in IDF-1445 | MR !14996 #if !(CONFIG_SPIRAM) || (CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL >= 16384) @@ -232,8 +230,6 @@ TEST_CASE("light sleep and frequency switching", "[deepsleep]") } } -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) -//IDF-5131 static void do_deep_sleep(void) { esp_sleep_enable_timer_wakeup(100000); @@ -275,6 +271,7 @@ TEST_CASE_MULTIPLE_STAGES("enter deep sleep after abort", "[deepsleep][reset=abo check_abort_reset_and_sleep, check_sleep_reset); +#if SOC_RTC_FAST_MEM_SUPPORTED static RTC_DATA_ATTR uint32_t s_wake_stub_var; static RTC_IRAM_ATTR void wake_stub(void) @@ -300,12 +297,10 @@ static void check_wake_stub(void) #endif } - TEST_CASE_MULTIPLE_STAGES("can set sleep wake stub", "[deepsleep][reset=DEEPSLEEP_RESET]", prepare_wake_stub, check_wake_stub); - -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) +#endif // SOC_RTC_FAST_MEM_SUPPORTED #if CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP @@ -374,9 +369,7 @@ TEST_CASE_MULTIPLE_STAGES("can set sleep wake stub from stack in RTC RAM", "[dee #if SOC_RTCIO_INPUT_OUTPUT_SUPPORTED - -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) -//IDF-5131 +#if SOC_PM_SUPPORT_EXT_WAKEUP TEST_CASE("wake up using ext0 (13 high)", "[deepsleep][ignore]") { ESP_ERROR_CHECK(rtc_gpio_init(GPIO_NUM_13)); @@ -430,8 +423,7 @@ TEST_CASE("wake up using ext1 when RTC_PERIPH is on (13 low)", "[deepsleep][igno ESP_ERROR_CHECK(esp_sleep_enable_ext1_wakeup(BIT(GPIO_NUM_13), ESP_EXT1_WAKEUP_ALL_LOW)); esp_deep_sleep_start(); } - -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) +#endif // SOC_PM_SUPPORT_EXT_WAKEUP __attribute__((unused)) static float get_time_ms(void) { @@ -528,11 +520,30 @@ TEST_CASE("disable source trigger behavior", "[deepsleep]") #endif //SOC_RTCIO_INPUT_OUTPUT_SUPPORTED -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) -//IDF-5131 -static RTC_DATA_ATTR struct timeval start; static void trigger_deepsleep(void) { + struct timeval start; + + // Use NVS instead of RTC mem to store the start time of deep sleep + // Beacuse not all esp chips support RTC mem(such as esp32c2) + // Initialize NVS + esp_err_t err = nvs_flash_init(); + if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { + // NVS partition was truncated and needs to be erased + // Retry nvs_flash_init + ESP_ERROR_CHECK(nvs_flash_erase()); + err = nvs_flash_init(); + } + ESP_ERROR_CHECK(err); + + nvs_handle_t nvs_handle; + err = nvs_open("storage", NVS_READWRITE, &nvs_handle); + if (err != ESP_OK) { + printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err)); + } else { + printf("Done\n"); + } + printf("Trigger deep sleep. Waiting for 10 sec ...\n"); // Simulate the dispersion of the calibration coefficients at start-up. @@ -545,6 +556,14 @@ static void trigger_deepsleep(void) // Save start time. Deep sleep. gettimeofday(&start, NULL); + + ESP_ERROR_CHECK(nvs_set_i32(nvs_handle, "start_sec", start.tv_sec)); + ESP_ERROR_CHECK(nvs_set_i32(nvs_handle, "start_usec", start.tv_usec)); + ESP_ERROR_CHECK(nvs_commit(nvs_handle)); + nvs_close(nvs_handle); + // Deinit NVS to prevent Unity from complaining "The test leaked too much memory" + ESP_ERROR_CHECK(nvs_flash_deinit()); + esp_sleep_enable_timer_wakeup(1000); // In function esp_deep_sleep_start() uses function esp_sync_timekeeping_timers() // to prevent a negative time after wake up. @@ -553,11 +572,39 @@ static void trigger_deepsleep(void) static void check_time_deepsleep(void) { - struct timeval stop; + struct timeval start, stop; + + // Initialize NVS + esp_err_t err = nvs_flash_init(); + if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { + // NVS partition was truncated and needs to be erased + // Retry nvs_flash_init + ESP_ERROR_CHECK(nvs_flash_erase()); + err = nvs_flash_init(); + } + ESP_ERROR_CHECK(err); + + nvs_handle_t nvs_handle; + err = nvs_open("storage", NVS_READWRITE, &nvs_handle); + if (err != ESP_OK) { + printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err)); + } else { + printf("Done\n"); + } + + // Get start time of deep sleep + ESP_ERROR_CHECK(nvs_get_i32(nvs_handle, "start_sec", (int32_t *)&start.tv_sec)); + ESP_ERROR_CHECK(nvs_get_i32(nvs_handle, "start_usec", (int32_t *)&start.tv_usec)); + nvs_close(nvs_handle); + // Deinit NVS to prevent Unity from complaining "The test leaked too much memory" + ESP_ERROR_CHECK(nvs_flash_deinit()); + + // Reset must be caused by deep sleep soc_reset_reason_t reason = esp_rom_get_reset_reason(0); TEST_ASSERT(reason == RESET_REASON_CORE_DEEP_SLEEP); - gettimeofday(&stop, NULL); + // Time dt_ms must in any case be positive. + gettimeofday(&stop, NULL); int dt_ms = (stop.tv_sec - start.tv_sec) * 1000 + (stop.tv_usec - start.tv_usec) / 1000; printf("delta time = %d \n", dt_ms); TEST_ASSERT_MESSAGE(dt_ms > 0, "Time in deep sleep is negative"); @@ -589,4 +636,3 @@ TEST_CASE("wake up using GPIO (2 or 4 low)", "[deepsleep][ignore]") esp_deep_sleep_start(); } #endif // SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) diff --git a/components/esp_system/test_apps/rtc_8md256/main/test_rtc_8md256.c b/components/esp_system/test_apps/rtc_8md256/main/test_rtc_8md256.c index 902f8423bd..3831015833 100644 --- a/components/esp_system/test_apps/rtc_8md256/main/test_rtc_8md256.c +++ b/components/esp_system/test_apps/rtc_8md256/main/test_rtc_8md256.c @@ -16,9 +16,6 @@ #include "soc/soc_caps.h" -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) -//IDF-5131 - static const char TAG[] = "rtc_8m"; static void test_deepsleep(bool force_rtc_periph) @@ -40,7 +37,6 @@ TEST_CASE("Can use 8MD256 as RTC clock source in deepsleep", "[pm]") { test_deepsleep(false); } -#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) static void test_lightsleep(bool force_rtc_periph) { diff --git a/components/esp_system/test_apps/rtc_8md256/pytest_rtc_8md256.py b/components/esp_system/test_apps/rtc_8md256/pytest_rtc_8md256.py index 8410d9a5a5..a19fa858e2 100644 --- a/components/esp_system/test_apps/rtc_8md256/pytest_rtc_8md256.py +++ b/components/esp_system/test_apps/rtc_8md256/pytest_rtc_8md256.py @@ -19,11 +19,11 @@ def deepsleep_test(dut: Dut, case_name: str) -> None: dut.expect(r'rst:.*\(%s\)' % reset_reason, timeout=10) -# IDF-5131 @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c2 @pytest.mark.generic def test_rtc_8md256_deepsleep(dut: Dut) -> None: deepsleep_test(dut, '"Can use 8MD256 as RTC clock source in deepsleep"') diff --git a/examples/system/.build-test-rules.yml b/examples/system/.build-test-rules.yml index e1d33c807b..b55c9caec5 100644 --- a/examples/system/.build-test-rules.yml +++ b/examples/system/.build-test-rules.yml @@ -90,12 +90,6 @@ examples/system/ipc/ipc_isr: temporary: true reason: the other targets are not tested yet -examples/system/light_sleep: - disable: - - if: IDF_TARGET == "esp32c2" - temporary: true - reason: target esp32c2 is not supported yet - examples/system/ota/advanced_https_ota: disable_test: - if: IDF_TARGET == "esp32c2" diff --git a/examples/system/light_sleep/README.md b/examples/system/light_sleep/README.md index 1a24c4ebce..94d57c3236 100644 --- a/examples/system/light_sleep/README.md +++ b/examples/system/light_sleep/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | # Light Sleep Example diff --git a/examples/system/light_sleep/main/light_sleep_example_main.c b/examples/system/light_sleep/main/light_sleep_example_main.c index fccb36883f..ebd6047533 100644 --- a/examples/system/light_sleep/main/light_sleep_example_main.c +++ b/examples/system/light_sleep/main/light_sleep_example_main.c @@ -54,8 +54,14 @@ static void light_sleep_task(void *args) wakeup_reason = "other"; break; } +#if CONFIG_NEWLIB_NANO_FORMAT + /* printf in newlib-nano does not support %ll format, causing example test fail */ + printf("Returned from light sleep, reason: %s, t=%d ms, slept for %d ms\n", + wakeup_reason, (int) (t_after_us / 1000), (int) ((t_after_us - t_before_us) / 1000)); +#else printf("Returned from light sleep, reason: %s, t=%lld ms, slept for %lld ms\n", wakeup_reason, t_after_us / 1000, (t_after_us - t_before_us) / 1000); +#endif if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_GPIO) { /* Waiting for the gpio inactive, or the chip will continously trigger wakeup*/ example_wait_gpio_inactive(); diff --git a/examples/system/light_sleep/pytest_light_sleep.py b/examples/system/light_sleep/pytest_light_sleep.py index 4b0fc8c9a7..bbdbad0f92 100644 --- a/examples/system/light_sleep/pytest_light_sleep.py +++ b/examples/system/light_sleep/pytest_light_sleep.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: CC0-1.0 import logging @@ -8,11 +8,11 @@ import pytest from pytest_embedded import Dut -# IDF-5053 @pytest.mark.esp32 @pytest.mark.esp32s2 @pytest.mark.esp32s3 @pytest.mark.esp32c3 +@pytest.mark.esp32c2 @pytest.mark.generic def test_light_sleep(dut: Dut) -> None: