test(ana_cmpr): migrate analog comparator test sources to C++

Convert test files in the analog comparator test app from C to C++ and update initializations/types for strict C++ compilation while keeping test behavior unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
morris
2026-05-18 11:20:06 +08:00
co-authored by Cursor
parent fce70533fa
commit 49bb908f3e
5 changed files with 159 additions and 143 deletions
@@ -1,14 +1,14 @@
set(srcs "test_app_main.c" set(srcs "test_app_main.c"
"test_ana_cmpr_utils.c" "test_ana_cmpr_utils.cpp"
"test_ana_cmpr.c") "test_ana_cmpr.cpp")
if(CONFIG_ANA_CMPR_ISR_CACHE_SAFE) if(CONFIG_ANA_CMPR_ISR_CACHE_SAFE)
list(APPEND srcs "test_ana_cmpr_iram.c") list(APPEND srcs "test_ana_cmpr_iram.cpp")
endif() endif()
if(CONFIG_SOC_ANA_CMPR_SUPPORT_ETM AND CONFIG_SOC_TIMER_SUPPORT_ETM) if(CONFIG_SOC_ANA_CMPR_SUPPORT_ETM AND CONFIG_SOC_TIMER_SUPPORT_ETM)
# Analog Comparator event test relies on GPTIMER task # Analog Comparator event test relies on GPTIMER task
list(APPEND srcs "test_ana_cmpr_etm.c") list(APPEND srcs "test_ana_cmpr_etm.cpp")
endif() endif()
idf_component_register(SRCS ${srcs} idf_component_register(SRCS ${srcs}
@@ -6,18 +6,25 @@
#include "test_ana_cmpr.h" #include "test_ana_cmpr.h"
static inline gpio_num_t test_pad_gpio_num(int pad_gpio)
{
return static_cast<gpio_num_t>(pad_gpio);
}
TEST_CASE("ana_cmpr unit install/uninstall", "[ana_cmpr]") TEST_CASE("ana_cmpr unit install/uninstall", "[ana_cmpr]")
{ {
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = 100, // Set a wrong unit config.unit = 100; // Set a wrong unit
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
#if ANALOG_CMPR_LL_GET(IP_VERSION) > 1 #if ANALOG_CMPR_LL_GET(IP_VERSION) > 1
.src_chan0_gpio = ana_cmpr_periph[0].pad_gpios[0], config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[0].pad_gpios[0]);
#else
config.src_chan0_gpio = GPIO_NUM_NC;
#endif #endif
}; config.ext_ref_gpio = GPIO_NUM_NC;
/* Allocate a wrong unit */ /* Allocate a wrong unit */
TEST_ESP_ERR(ESP_ERR_INVALID_ARG, ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_ERR(ESP_ERR_INVALID_ARG, ana_cmpr_new_unit(&config, &cmpr));
/* Reject negative interrupt priority */ /* Reject negative interrupt priority */
@@ -30,9 +37,8 @@ TEST_CASE("ana_cmpr unit install/uninstall", "[ana_cmpr]")
/* Try to allocate a existed unit */ /* Try to allocate a existed unit */
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_ERR(ESP_ERR_INVALID_STATE, ana_cmpr_new_unit(&config, &cmpr));
/* Set the internal reference before enable */ /* Set the internal reference before enable */
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD;
};
TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
/* Enable the unit */ /* Enable the unit */
TEST_ESP_OK(ana_cmpr_enable(cmpr)); TEST_ESP_OK(ana_cmpr_enable(cmpr));
@@ -49,7 +55,7 @@ TEST_CASE("ana_cmpr unit install/uninstall", "[ana_cmpr]")
/* Try to set internal reference for a external unit */ /* Try to set internal reference for a external unit */
config.ref_src = ANA_CMPR_REF_SRC_EXTERNAL; config.ref_src = ANA_CMPR_REF_SRC_EXTERNAL;
#if ANALOG_CMPR_LL_GET(IP_VERSION) > 1 #if ANALOG_CMPR_LL_GET(IP_VERSION) > 1
config.ext_ref_gpio = ana_cmpr_periph[0].pad_gpios[1]; config.ext_ref_gpio = test_pad_gpio_num(ana_cmpr_periph[0].pad_gpios[1]);
#endif #endif
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
TEST_ESP_ERR(ESP_ERR_NOT_ALLOWED, ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_ERR(ESP_ERR_NOT_ALLOWED, ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
@@ -61,22 +67,24 @@ TEST_CASE("ana_cmpr event callback", "[ana_cmpr]")
{ {
uint32_t cnt = 0; uint32_t cnt = 0;
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = TEST_ANA_CMPR_UNIT_ID, config.unit = TEST_ANA_CMPR_UNIT_ID;
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
#if ANALOG_CMPR_LL_GET(IP_VERSION) > 1 #if ANALOG_CMPR_LL_GET(IP_VERSION) > 1
.src_chan0_gpio = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0], config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0]);
.resample_limit = 3, config.resample_limit = 3;
#else
config.src_chan0_gpio = GPIO_NUM_NC;
config.resample_limit = 0;
#endif #endif
}; config.ext_ref_gpio = GPIO_NUM_NC;
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
gpio_num_t src_chan_io = test_init_src_chan_gpio(cmpr, 0, 0); gpio_num_t src_chan_io = test_init_src_chan_gpio(cmpr, 0, 0);
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD;
};
TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
ana_cmpr_debounce_config_t dbc_cfg = { ana_cmpr_debounce_config_t dbc_cfg = {
.wait_us = 10, .wait_us = 10,
@@ -115,21 +123,20 @@ TEST_CASE("ana_cmpr event callback", "[ana_cmpr]")
TEST_CASE("ana_cmpr source channel management api", "[ana_cmpr]") TEST_CASE("ana_cmpr source channel management api", "[ana_cmpr]")
{ {
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = TEST_ANA_CMPR_UNIT_ID, config.unit = TEST_ANA_CMPR_UNIT_ID;
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
.resample_limit = 3, config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0]);
.src_chan0_gpio = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0], config.ext_ref_gpio = GPIO_NUM_NC;
}; config.resample_limit = 3;
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
#if ANALOG_CMPR_LL_GET(IP_VERSION) > 1 #if ANALOG_CMPR_LL_GET(IP_VERSION) > 1
ana_cmpr_src_chan_config_t src_cfg = { ana_cmpr_src_chan_config_t src_cfg = {};
.gpio_num = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[1], src_cfg.gpio_num = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[1]);
.cross_type = ANA_CMPR_CROSS_POS, src_cfg.cross_type = ANA_CMPR_CROSS_POS;
};
TEST_ESP_OK(ana_cmpr_add_src_chan(cmpr, 1, &src_cfg)); TEST_ESP_OK(ana_cmpr_add_src_chan(cmpr, 1, &src_cfg));
TEST_ESP_OK(ana_cmpr_remove_src_chan(cmpr, 1)); TEST_ESP_OK(ana_cmpr_remove_src_chan(cmpr, 1));
TEST_ESP_OK(ana_cmpr_remove_src_chan(cmpr, 1)); TEST_ESP_OK(ana_cmpr_remove_src_chan(cmpr, 1));
@@ -159,28 +166,27 @@ TEST_CASE("ana_cmpr trigger scan and get output level", "[ana_cmpr]")
TEST_IGNORE_MESSAGE("not supported on old IP version"); TEST_IGNORE_MESSAGE("not supported on old IP version");
#else #else
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = TEST_ANA_CMPR_UNIT_ID, config.unit = TEST_ANA_CMPR_UNIT_ID;
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
.resample_limit = 3, config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0]);
.src_chan0_gpio = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0], config.ext_ref_gpio = GPIO_NUM_NC;
}; config.resample_limit = 3;
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
ana_cmpr_src_chan_config_t src_cfg = { ana_cmpr_src_chan_config_t src_cfg = {};
.cross_type = ANA_CMPR_CROSS_ANY, src_cfg.gpio_num = GPIO_NUM_NC;
}; src_cfg.cross_type = ANA_CMPR_CROSS_ANY;
// for test purpose, source channel N uses pad N. // for test purpose, source channel N uses pad N.
for (int i = 1; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) { for (int i = 1; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) {
src_cfg.gpio_num = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]; src_cfg.gpio_num = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]);
TEST_ESP_OK(ana_cmpr_add_src_chan(cmpr, i, &src_cfg)); TEST_ESP_OK(ana_cmpr_add_src_chan(cmpr, i, &src_cfg));
} }
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD;
};
TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
ana_cmpr_scan_config_t scan_cfg = { ana_cmpr_scan_config_t scan_cfg = {
@@ -193,9 +199,9 @@ TEST_CASE("ana_cmpr trigger scan and get output level", "[ana_cmpr]")
for (int i = 0; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) { for (int i = 0; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) {
bool out_level = false; bool out_level = false;
gpio_output_enable(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]); gpio_output_enable(test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]));
// Set input to low (0V), which is lower than 50% VDD reference // Set input to low (0V), which is lower than 50% VDD reference
gpio_set_level(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i], 0); gpio_set_level(test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]), 0);
// Trigger a scan to update the comparison result // Trigger a scan to update the comparison result
TEST_ESP_OK(ana_cmpr_trigger_scan(cmpr)); TEST_ESP_OK(ana_cmpr_trigger_scan(cmpr));
vTaskDelay(pdMS_TO_TICKS(10)); vTaskDelay(pdMS_TO_TICKS(10));
@@ -203,7 +209,7 @@ TEST_CASE("ana_cmpr trigger scan and get output level", "[ana_cmpr]")
TEST_ASSERT_EQUAL(false, out_level); TEST_ASSERT_EQUAL(false, out_level);
// Set input to high (3.3V), which is higher than 50% VDD reference // Set input to high (3.3V), which is higher than 50% VDD reference
gpio_set_level(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i], 1); gpio_set_level(test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]), 1);
// Trigger a scan to update the comparison result // Trigger a scan to update the comparison result
TEST_ESP_OK(ana_cmpr_trigger_scan(cmpr)); TEST_ESP_OK(ana_cmpr_trigger_scan(cmpr));
vTaskDelay(pdMS_TO_TICKS(10)); vTaskDelay(pdMS_TO_TICKS(10));
@@ -222,27 +228,26 @@ TEST_CASE("ana_cmpr trigger scan step mode", "[ana_cmpr]")
TEST_IGNORE_MESSAGE("not supported on old IP version"); TEST_IGNORE_MESSAGE("not supported on old IP version");
#else #else
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = TEST_ANA_CMPR_UNIT_ID, config.unit = TEST_ANA_CMPR_UNIT_ID;
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
.resample_limit = 3, config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0]);
.src_chan0_gpio = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0], config.ext_ref_gpio = GPIO_NUM_NC;
}; config.resample_limit = 3;
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
ana_cmpr_src_chan_config_t src_cfg = { ana_cmpr_src_chan_config_t src_cfg = {};
.cross_type = ANA_CMPR_CROSS_ANY, src_cfg.gpio_num = GPIO_NUM_NC;
}; src_cfg.cross_type = ANA_CMPR_CROSS_ANY;
for (int i = 1; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) { for (int i = 1; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) {
src_cfg.gpio_num = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]; src_cfg.gpio_num = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[i]);
TEST_ESP_OK(ana_cmpr_add_src_chan(cmpr, i, &src_cfg)); TEST_ESP_OK(ana_cmpr_add_src_chan(cmpr, i, &src_cfg));
} }
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD;
};
TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
ana_cmpr_scan_config_t scan_cfg = { ana_cmpr_scan_config_t scan_cfg = {
@@ -251,7 +256,7 @@ TEST_CASE("ana_cmpr trigger scan step mode", "[ana_cmpr]")
}; };
TEST_ESP_OK(ana_cmpr_set_scan_config(cmpr, &scan_cfg)); TEST_ESP_OK(ana_cmpr_set_scan_config(cmpr, &scan_cfg));
gpio_num_t src_chan_ios[ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM)] = {0}; gpio_num_t src_chan_ios[ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM)] = {};
for (int i = 0; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) { for (int i = 0; i < ANALOG_CMPR_LL_GET(SRC_CHANNEL_NUM); i++) {
src_chan_ios[i] = test_init_src_chan_gpio(cmpr, i, 0); src_chan_ios[i] = test_init_src_chan_gpio(cmpr, i, 0);
} }
@@ -300,24 +305,23 @@ TEST_CASE("ana_cmpr capture timestamps", "[ana_cmpr]")
TEST_IGNORE_MESSAGE("not supported on old IP version"); TEST_IGNORE_MESSAGE("not supported on old IP version");
#else #else
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = TEST_ANA_CMPR_UNIT_ID, config.unit = TEST_ANA_CMPR_UNIT_ID;
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
.resample_limit = 3, config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0]);
.src_chan0_gpio = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0], config.ext_ref_gpio = GPIO_NUM_NC;
.en_capture_timer = true, config.resample_limit = 3;
}; config.en_capture_timer = true;
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
uint32_t resolution_hz = 0; uint32_t resolution_hz = 0;
TEST_ESP_OK(ana_cmpr_get_clock_resolution_hz(cmpr, &resolution_hz)); TEST_ESP_OK(ana_cmpr_get_clock_resolution_hz(cmpr, &resolution_hz));
TEST_ASSERT_GREATER_THAN_UINT32(0, resolution_hz); TEST_ASSERT_GREATER_THAN_UINT32(0, resolution_hz);
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD;
};
TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
ana_cmpr_scan_config_t scan_cfg = { ana_cmpr_scan_config_t scan_cfg = {
@@ -16,14 +16,18 @@
#define TEST_TIME_US 5000 #define TEST_TIME_US 5000
static inline gpio_num_t test_pad_gpio_num(int pad_gpio)
{
return static_cast<gpio_num_t>(pad_gpio);
}
static gptimer_handle_t test_ana_cmpr_gptimer_init(void) static gptimer_handle_t test_ana_cmpr_gptimer_init(void)
{ {
gptimer_handle_t gptimer = NULL; gptimer_handle_t gptimer = NULL;
gptimer_config_t timer_config = { gptimer_config_t timer_config = {};
.clk_src = GPTIMER_CLK_SRC_DEFAULT, timer_config.clk_src = GPTIMER_CLK_SRC_DEFAULT;
.direction = GPTIMER_COUNT_UP, timer_config.direction = GPTIMER_COUNT_UP;
.resolution_hz = 1 * 1000 * 1000, // 1MHz, 1 tick = 1us timer_config.resolution_hz = 1 * 1000 * 1000; // 1MHz, 1 tick = 1us
};
TEST_ESP_OK(gptimer_new_timer(&timer_config, &gptimer)); TEST_ESP_OK(gptimer_new_timer(&timer_config, &gptimer));
TEST_ESP_OK(gptimer_set_raw_count(gptimer, 0)); TEST_ESP_OK(gptimer_set_raw_count(gptimer, 0));
TEST_ESP_OK(gptimer_enable(gptimer)); TEST_ESP_OK(gptimer_enable(gptimer));
@@ -40,21 +44,23 @@ static ana_cmpr_handle_t test_ana_cmpr_init(void)
{ {
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = TEST_ANA_CMPR_UNIT_ID, config.unit = TEST_ANA_CMPR_UNIT_ID;
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
#if ANALOG_CMPR_LL_GET(IP_VERSION) > 1 #if ANALOG_CMPR_LL_GET(IP_VERSION) > 1
.src_chan0_gpio = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0], config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0]);
.resample_limit = 3, config.resample_limit = 3;
#else
config.src_chan0_gpio = GPIO_NUM_NC;
config.resample_limit = 0;
#endif #endif
}; config.ext_ref_gpio = GPIO_NUM_NC;
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD;
};
TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
ana_cmpr_debounce_config_t dbc_cfg = { ana_cmpr_debounce_config_t dbc_cfg = {
@@ -114,9 +120,8 @@ static test_ana_cmpr_etm_handles_t test_ana_cmpr_init_etm_chain_v1(ana_cmpr_hand
test_ana_cmpr_etm_handles_t etm_handles = {}; test_ana_cmpr_etm_handles_t etm_handles = {};
/* Allocate the analog comparator positive & negative cross events */ /* Allocate the analog comparator positive & negative cross events */
ana_cmpr_etm_event_config_t evt_cfg = { ana_cmpr_etm_event_config_t evt_cfg = {};
.event_type = ANA_CMPR_EVENT_POS_CROSS, evt_cfg.event_type = ANA_CMPR_EVENT_POS_CROSS;
};
TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &evt_cfg, &etm_handles.cmpr_pos_evt)); TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &evt_cfg, &etm_handles.cmpr_pos_evt));
evt_cfg.event_type = ANA_CMPR_EVENT_NEG_CROSS; evt_cfg.event_type = ANA_CMPR_EVENT_NEG_CROSS;
TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &evt_cfg, &etm_handles.cmpr_neg_evt)); TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &evt_cfg, &etm_handles.cmpr_neg_evt));
@@ -212,10 +217,8 @@ TEST_CASE("ana_cmpr etm event delete keeps sibling source event working", "[ana_
// Trigger a scan to make sure the initial level is sampled // Trigger a scan to make sure the initial level is sampled
TEST_ESP_OK(ana_cmpr_trigger_scan(cmpr)); TEST_ESP_OK(ana_cmpr_trigger_scan(cmpr));
ana_cmpr_etm_event_config_t evt_cfg = { ana_cmpr_etm_event_config_t evt_cfg = {};
.src_chan_id = 0, evt_cfg.event_type = ANA_CMPR_EVENT_POS_CROSS;
.event_type = ANA_CMPR_EVENT_POS_CROSS,
};
esp_etm_event_handle_t pos_evt = NULL; esp_etm_event_handle_t pos_evt = NULL;
esp_etm_event_handle_t neg_evt = NULL; esp_etm_event_handle_t neg_evt = NULL;
TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &evt_cfg, &pos_evt)); TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &evt_cfg, &pos_evt));
@@ -260,6 +263,8 @@ TEST_CASE("ana_cmpr etm event delete keeps sibling source event working", "[ana_
#define TEST_ETM_SCAN_PERIOD_US 50 #define TEST_ETM_SCAN_PERIOD_US 50
#define TEST_ETM_WAIT_TIMEOUT_US 2000 #define TEST_ETM_WAIT_TIMEOUT_US 2000
static constexpr gpio_num_t TEST_ETM_MONITOR_GPIO_NUM = static_cast<gpio_num_t>(TEST_ETM_MONITOR_GPIO);
typedef struct { typedef struct {
esp_etm_event_handle_t gptimer_alarm_evt; esp_etm_event_handle_t gptimer_alarm_evt;
esp_etm_event_handle_t cmpr_pos_evt; esp_etm_event_handle_t cmpr_pos_evt;
@@ -328,9 +333,8 @@ static test_ana_cmpr_etm_task_handles_t test_ana_cmpr_init_etm_chain_v2(ana_cmpr
}; };
TEST_ESP_OK(ana_cmpr_new_etm_task(cmpr, &cmpr_task_cfg, &etm_handles.cmpr_start_task)); TEST_ESP_OK(ana_cmpr_new_etm_task(cmpr, &cmpr_task_cfg, &etm_handles.cmpr_start_task));
ana_cmpr_etm_event_config_t cmpr_evt_cfg = { ana_cmpr_etm_event_config_t cmpr_evt_cfg = {};
.event_type = ANA_CMPR_EVENT_POS_CROSS, cmpr_evt_cfg.event_type = ANA_CMPR_EVENT_POS_CROSS;
};
TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &cmpr_evt_cfg, &etm_handles.cmpr_pos_evt)); TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &cmpr_evt_cfg, &etm_handles.cmpr_pos_evt));
cmpr_evt_cfg.event_type = ANA_CMPR_EVENT_NEG_CROSS; cmpr_evt_cfg.event_type = ANA_CMPR_EVENT_NEG_CROSS;
TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &cmpr_evt_cfg, &etm_handles.cmpr_neg_evt)); TEST_ESP_OK(ana_cmpr_new_etm_event(cmpr, &cmpr_evt_cfg, &etm_handles.cmpr_neg_evt));
@@ -339,8 +343,8 @@ static test_ana_cmpr_etm_task_handles_t test_ana_cmpr_init_etm_chain_v2(ana_cmpr
gpio_task_cfg.actions[0] = GPIO_ETM_TASK_ACTION_SET; gpio_task_cfg.actions[0] = GPIO_ETM_TASK_ACTION_SET;
gpio_task_cfg.actions[1] = GPIO_ETM_TASK_ACTION_CLR; gpio_task_cfg.actions[1] = GPIO_ETM_TASK_ACTION_CLR;
TEST_ESP_OK(gpio_new_etm_task(&gpio_task_cfg, &etm_handles.gpio_set_task, &etm_handles.gpio_clr_task)); TEST_ESP_OK(gpio_new_etm_task(&gpio_task_cfg, &etm_handles.gpio_set_task, &etm_handles.gpio_clr_task));
TEST_ESP_OK(gpio_etm_task_add_gpio(etm_handles.gpio_set_task, TEST_ETM_MONITOR_GPIO)); TEST_ESP_OK(gpio_etm_task_add_gpio(etm_handles.gpio_set_task, TEST_ETM_MONITOR_GPIO_NUM));
TEST_ESP_OK(gpio_etm_task_add_gpio(etm_handles.gpio_clr_task, TEST_ETM_MONITOR_GPIO)); TEST_ESP_OK(gpio_etm_task_add_gpio(etm_handles.gpio_clr_task, TEST_ETM_MONITOR_GPIO_NUM));
esp_etm_channel_config_t etm_cfg = {}; esp_etm_channel_config_t etm_cfg = {};
TEST_ESP_OK(esp_etm_new_channel(&etm_cfg, &etm_handles.etm_reload_handle)); TEST_ESP_OK(esp_etm_new_channel(&etm_cfg, &etm_handles.etm_reload_handle));
@@ -368,8 +372,8 @@ static void test_ana_cmpr_deinit_etm_chain_v2(test_ana_cmpr_etm_task_handles_t h
TEST_ESP_OK(esp_etm_channel_disable(handles.etm_pos_handle)); TEST_ESP_OK(esp_etm_channel_disable(handles.etm_pos_handle));
TEST_ESP_OK(esp_etm_channel_disable(handles.etm_neg_handle)); TEST_ESP_OK(esp_etm_channel_disable(handles.etm_neg_handle));
TEST_ESP_OK(gpio_etm_task_rm_gpio(handles.gpio_set_task, TEST_ETM_MONITOR_GPIO)); TEST_ESP_OK(gpio_etm_task_rm_gpio(handles.gpio_set_task, TEST_ETM_MONITOR_GPIO_NUM));
TEST_ESP_OK(gpio_etm_task_rm_gpio(handles.gpio_clr_task, TEST_ETM_MONITOR_GPIO)); TEST_ESP_OK(gpio_etm_task_rm_gpio(handles.gpio_clr_task, TEST_ETM_MONITOR_GPIO_NUM));
TEST_ESP_OK(esp_etm_del_task(handles.gpio_set_task)); TEST_ESP_OK(esp_etm_del_task(handles.gpio_set_task));
TEST_ESP_OK(esp_etm_del_task(handles.gpio_clr_task)); TEST_ESP_OK(esp_etm_del_task(handles.gpio_clr_task));
@@ -392,13 +396,14 @@ TEST_CASE("ana_cmpr etm task periodic scan", "[ana_cmpr][etm]")
ana_cmpr_handle_t cmpr = test_ana_cmpr_init(); ana_cmpr_handle_t cmpr = test_ana_cmpr_init();
gpio_num_t src_gpio = test_init_src_chan_gpio(cmpr, 0, 0); gpio_num_t src_gpio = test_init_src_chan_gpio(cmpr, 0, 0);
gpio_config_t monitor_gpio_cfg = { gpio_config_t monitor_gpio_cfg = {};
.intr_type = GPIO_INTR_DISABLE, monitor_gpio_cfg.pin_bit_mask = 1ULL << TEST_ETM_MONITOR_GPIO;
.mode = GPIO_MODE_INPUT_OUTPUT, monitor_gpio_cfg.mode = GPIO_MODE_INPUT_OUTPUT;
.pin_bit_mask = 1ULL << TEST_ETM_MONITOR_GPIO, monitor_gpio_cfg.pull_up_en = GPIO_PULLUP_DISABLE;
}; monitor_gpio_cfg.pull_down_en = GPIO_PULLDOWN_DISABLE;
monitor_gpio_cfg.intr_type = GPIO_INTR_DISABLE;
TEST_ESP_OK(gpio_config(&monitor_gpio_cfg)); TEST_ESP_OK(gpio_config(&monitor_gpio_cfg));
TEST_ESP_OK(gpio_set_level(TEST_ETM_MONITOR_GPIO, 0)); TEST_ESP_OK(gpio_set_level(TEST_ETM_MONITOR_GPIO_NUM, 0));
// Prime the comparator with a known initial low level before ETM-driven scans begin. // Prime the comparator with a known initial low level before ETM-driven scans begin.
TEST_ESP_OK(gpio_set_level(src_gpio, 0)); TEST_ESP_OK(gpio_set_level(src_gpio, 0));
@@ -407,11 +412,10 @@ TEST_CASE("ana_cmpr etm task periodic scan", "[ana_cmpr][etm]")
vTaskDelay(pdMS_TO_TICKS(10)); vTaskDelay(pdMS_TO_TICKS(10));
test_ana_cmpr_wait_output_level(cmpr, 0, false); test_ana_cmpr_wait_output_level(cmpr, 0, false);
gptimer_alarm_config_t alarm_config = { gptimer_alarm_config_t alarm_config = {};
.reload_count = 0, alarm_config.reload_count = 0;
.alarm_count = TEST_ETM_SCAN_PERIOD_US, alarm_config.alarm_count = TEST_ETM_SCAN_PERIOD_US;
.flags.auto_reload_on_alarm = true, alarm_config.flags.auto_reload_on_alarm = true;
};
TEST_ESP_OK(gptimer_set_alarm_action(gptimer, &alarm_config)); TEST_ESP_OK(gptimer_set_alarm_action(gptimer, &alarm_config));
test_ana_cmpr_etm_task_handles_t handles = test_ana_cmpr_init_etm_chain_v2(cmpr, gptimer); test_ana_cmpr_etm_task_handles_t handles = test_ana_cmpr_init_etm_chain_v2(cmpr, gptimer);
@@ -421,20 +425,20 @@ TEST_CASE("ana_cmpr etm task periodic scan", "[ana_cmpr][etm]")
// demonstrating that the ETM-driven scans are working correctly. // demonstrating that the ETM-driven scans are working correctly.
TEST_ESP_OK(gptimer_start(gptimer)); TEST_ESP_OK(gptimer_start(gptimer));
TEST_ASSERT_EQUAL(0, gpio_get_level(TEST_ETM_MONITOR_GPIO)); TEST_ASSERT_EQUAL(0, gpio_get_level(TEST_ETM_MONITOR_GPIO_NUM));
TEST_ESP_OK(gpio_set_level(src_gpio, 1)); TEST_ESP_OK(gpio_set_level(src_gpio, 1));
vTaskDelay(pdMS_TO_TICKS(1)); vTaskDelay(pdMS_TO_TICKS(1));
test_ana_cmpr_wait_output_level(cmpr, 0, true); test_ana_cmpr_wait_output_level(cmpr, 0, true);
TEST_ASSERT_EQUAL(1, gpio_get_level(TEST_ETM_MONITOR_GPIO)); TEST_ASSERT_EQUAL(1, gpio_get_level(TEST_ETM_MONITOR_GPIO_NUM));
TEST_ESP_OK(gpio_set_level(src_gpio, 0)); TEST_ESP_OK(gpio_set_level(src_gpio, 0));
vTaskDelay(pdMS_TO_TICKS(1)); vTaskDelay(pdMS_TO_TICKS(1));
test_ana_cmpr_wait_output_level(cmpr, 0, false); test_ana_cmpr_wait_output_level(cmpr, 0, false);
TEST_ASSERT_EQUAL(0, gpio_get_level(TEST_ETM_MONITOR_GPIO)); TEST_ASSERT_EQUAL(0, gpio_get_level(TEST_ETM_MONITOR_GPIO_NUM));
TEST_ESP_OK(gptimer_stop(gptimer)); TEST_ESP_OK(gptimer_stop(gptimer));
TEST_ESP_OK(gpio_reset_pin(TEST_ETM_MONITOR_GPIO)); TEST_ESP_OK(gpio_reset_pin(TEST_ETM_MONITOR_GPIO_NUM));
test_ana_cmpr_deinit_etm_chain_v2(handles); test_ana_cmpr_deinit_etm_chain_v2(handles);
test_ana_cmpr_deinit(cmpr); test_ana_cmpr_deinit(cmpr);
test_ana_cmpr_gptimer_deinit(gptimer); test_ana_cmpr_gptimer_deinit(gptimer);
@@ -7,6 +7,11 @@
#include "test_ana_cmpr.h" #include "test_ana_cmpr.h"
#include "unity_test_utils_cache.h" #include "unity_test_utils_cache.h"
static inline gpio_num_t test_pad_gpio_num(int pad_gpio)
{
return static_cast<gpio_num_t>(pad_gpio);
}
typedef struct { typedef struct {
ana_cmpr_handle_t handle; ana_cmpr_handle_t handle;
uint32_t count; uint32_t count;
@@ -16,9 +21,9 @@ typedef struct {
static void IRAM_ATTR test_ana_cmpr_iram_safety(void *args) static void IRAM_ATTR test_ana_cmpr_iram_safety(void *args)
{ {
test_ana_cmpr_data_t *data = (test_ana_cmpr_data_t *)args; test_ana_cmpr_data_t *data = (test_ana_cmpr_data_t *)args;
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_50_PCT_VDD;
}; ref_cfg.ref_hys_level = ANA_CMPR_REF_HYS_LEVEL0;
ana_cmpr_set_internal_reference(data->handle, &ref_cfg); ana_cmpr_set_internal_reference(data->handle, &ref_cfg);
ana_cmpr_debounce_config_t dbc_cfg = { ana_cmpr_debounce_config_t dbc_cfg = {
.wait_us = 1, .wait_us = 1,
@@ -41,21 +46,24 @@ static void IRAM_ATTR test_ana_cmpr_iram_safety(void *args)
TEST_CASE("ana_cmpr works with cache disabled", "[ana_cmpr]") TEST_CASE("ana_cmpr works with cache disabled", "[ana_cmpr]")
{ {
ana_cmpr_handle_t cmpr = NULL; ana_cmpr_handle_t cmpr = NULL;
ana_cmpr_config_t config = { ana_cmpr_config_t config = {};
.unit = TEST_ANA_CMPR_UNIT_ID, config.unit = TEST_ANA_CMPR_UNIT_ID;
.clk_src = ANA_CMPR_CLK_SRC_DEFAULT, config.clk_src = ANA_CMPR_CLK_SRC_DEFAULT;
.ref_src = ANA_CMPR_REF_SRC_INTERNAL, config.ref_src = ANA_CMPR_REF_SRC_INTERNAL;
.cross_type = ANA_CMPR_CROSS_ANY, config.cross_type = ANA_CMPR_CROSS_ANY;
#if ANALOG_CMPR_LL_GET(IP_VERSION) > 1 #if ANALOG_CMPR_LL_GET(IP_VERSION) > 1
.src_chan0_gpio = ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0], config.src_chan0_gpio = test_pad_gpio_num(ana_cmpr_periph[TEST_ANA_CMPR_UNIT_ID].pad_gpios[0]);
.resample_limit = 3, config.resample_limit = 3;
#else
config.src_chan0_gpio = GPIO_NUM_NC;
config.resample_limit = 0;
#endif #endif
}; config.ext_ref_gpio = GPIO_NUM_NC;
TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr)); TEST_ESP_OK(ana_cmpr_new_unit(&config, &cmpr));
ana_cmpr_internal_ref_config_t ref_cfg = { ana_cmpr_internal_ref_config_t ref_cfg = {};
.ref_volt = ANA_CMPR_REF_VOLT_20_PCT_VDD, ref_cfg.ref_volt = ANA_CMPR_REF_VOLT_20_PCT_VDD;
}; ref_cfg.ref_hys_level = ANA_CMPR_REF_HYS_LEVEL0;
TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg)); TEST_ESP_OK(ana_cmpr_set_internal_reference(cmpr, &ref_cfg));
ana_cmpr_debounce_config_t dbc_cfg = { ana_cmpr_debounce_config_t dbc_cfg = {
.wait_us = 10, .wait_us = 10,