From d6fe48c69a051f53c6f69333bb9049bd6b53f134 Mon Sep 17 00:00:00 2001 From: Hu Rui Date: Fri, 4 Sep 2026 20:10:32 +0800 Subject: [PATCH] test(touch): Add touch sensor deep sleep wake-up ci test --- .../test_apps/touch_sens/main/test_helper.h | 2 +- .../main/test_touch_sens_common.cpp | 80 ++++++++++++++++++- .../test_apps/touch_sens/pytest_touch_sens.py | 2 +- 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_helper.h b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_helper.h index 3e59735a037..64918b9c5ac 100644 --- a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_helper.h +++ b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_helper.h @@ -5,7 +5,7 @@ */ #pragma once -#define TEST_TOUCH_WAKEUP_CHANNEL 3 +#define TEST_TOUCH_WAKEUP_CHANNEL 4 #define TEST_TOUCH_SIMULATE_HOLD_TIME_US 10000 #ifndef __ASSEMBLER__ diff --git a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.cpp b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.cpp index 6db53fc066e..54b06714795 100644 --- a/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.cpp +++ b/components/esp_driver_touch_sens/test_apps/touch_sens/main/test_touch_sens_common.cpp @@ -382,7 +382,12 @@ TEST_CASE("touch_sens_light_sleep_wakeup_test", "[touch]") s_test_touch_start_ulp(); /* Enter light sleep */ - TEST_ESP_OK(esp_light_sleep_start()); + for (int retry = 0; esp_light_sleep_start() == ESP_ERR_SLEEP_REJECT; retry++) { + if (retry > 3) { + TEST_FAIL_MESSAGE("enter light sleep failed"); + } + vTaskDelay(pdMS_TO_TICKS(10)); + } /* Wakeup from sleep */ uint32_t wakeup_causes = esp_sleep_get_wakeup_causes(); @@ -413,4 +418,77 @@ TEST_CASE("touch_sens_light_sleep_wakeup_test", "[touch]") TEST_ESP_OK(touch_sensor_del_channel(fixture->channels[1])); TEST_ESP_OK(touch_sensor_del_controller(touch)); } + +static void s_test_touch_deep_sleep_enter_common(bool allow_pd) +{ + test_touch_fixture_t *fixture = (test_touch_fixture_t *)alloca( + sizeof(test_touch_fixture_t) + sizeof(touch_channel_handle_t)); + const uint32_t chan_ids[] = {TEST_TOUCH_WAKEUP_CHANNEL}; + test_touch_cb_data_t cb_data = {}; + s_test_touch_fixture_init(fixture, 1, chan_ids, &cb_data); + touch_sensor_handle_t touch = fixture->sensor; + touch_channel_handle_t touch_chan = fixture->channels[0]; + + touch_sleep_config_t sleep_cfg = {}; + sleep_cfg.slp_wakeup_lvl = TOUCH_DEEP_SLEEP_WAKEUP; +#if SOC_TOUCH_SENSOR_VERSION > 1 + if (allow_pd) { + touch_chan_info_t chan_info = {}; + TEST_ESP_OK(touch_sensor_get_channel_info(touch_chan, &chan_info)); + sleep_cfg.deep_slp_allow_pd = true; + sleep_cfg.deep_slp_chan = touch_chan; + for (int i = 0; i < TOUCH_SAMPLE_CFG_NUM; i++) { + sleep_cfg.deep_slp_thresh[i] = chan_info.active_thresh[i]; + printf("[Sampler %d] deep sleep thresh %" PRIu32 "\n", i, sleep_cfg.deep_slp_thresh[i]); + } + } +#else + (void)allow_pd; + (void)touch_chan; +#endif + TEST_ESP_OK(touch_sensor_config_sleep_wakeup(touch, &sleep_cfg)); + TEST_ESP_OK(touch_sensor_enable(touch)); + TEST_ESP_OK(touch_sensor_start_continuous_scanning(touch)); + + /* Set up the ULP to simulate touch wake-up after entering sleep */ + s_test_touch_start_ulp(); + + esp_deep_sleep_start(); + TEST_FAIL_MESSAGE("Should not reach here after deep sleep"); +} + +static void s_test_touch_deep_sleep_check(void) +{ + TEST_ASSERT_EQUAL(ESP_RST_DEEPSLEEP, esp_reset_reason()); + + uint32_t wakeup_causes = esp_sleep_get_wakeup_causes(); + if (wakeup_causes & BIT(ESP_SLEEP_WAKEUP_TOUCHPAD)) { + printf("wakeup by touchpad\n"); + } else { + printf("wakeup by other causes: %" PRIu32 "\n", wakeup_causes); + TEST_FAIL(); + } +} + +static void s_test_touch_deep_sleep_enter(void) +{ + s_test_touch_deep_sleep_enter_common(false); +} + +TEST_CASE_MULTIPLE_STAGES("touch_sens_deep_sleep_wakeup_test", + "[touch][reset=DEEPSLEEP_RESET]", + s_test_touch_deep_sleep_enter, + s_test_touch_deep_sleep_check); + +#if SOC_TOUCH_SENSOR_VERSION > 1 +static void s_test_touch_deep_sleep_pd_enter(void) +{ + s_test_touch_deep_sleep_enter_common(true); +} + +TEST_CASE_MULTIPLE_STAGES("touch_sens_deep_sleep_pd_wakeup_test", + "[touch][reset=DEEPSLEEP_RESET]", + s_test_touch_deep_sleep_pd_enter, + s_test_touch_deep_sleep_check); +#endif // SOC_TOUCH_SENSOR_VERSION > 1 #endif // SOC_ULP_SUPPORTED && !(CONFIG_TOUCH_ISR_IRAM_SAFE && SOC_IS(ESP32P4)) diff --git a/components/esp_driver_touch_sens/test_apps/touch_sens/pytest_touch_sens.py b/components/esp_driver_touch_sens/test_apps/touch_sens/pytest_touch_sens.py index 0981af9d519..c5a3d837c27 100644 --- a/components/esp_driver_touch_sens/test_apps/touch_sens/pytest_touch_sens.py +++ b/components/esp_driver_touch_sens/test_apps/touch_sens/pytest_touch_sens.py @@ -17,4 +17,4 @@ from pytest_embedded_idf.utils import soc_filtered_targets ) @idf_parametrize('target', soc_filtered_targets('SOC_TOUCH_SENSOR_SUPPORTED == 1'), indirect=['target']) def test_touch_sens(dut: Dut) -> None: - dut.run_all_single_board_cases(timeout=20) + dut.run_all_single_board_cases(timeout=30)