From ea951b0ca62628f7245b4a543efa5caee66ddb5d Mon Sep 17 00:00:00 2001 From: Wan Lei Date: Wed, 27 May 2026 19:38:41 +0800 Subject: [PATCH] fix(driver_twai): enable ci test for h4 --- .../test_apps/.build-test-rules.yml | 4 --- .../test_twai/main/test_twai_common.cpp | 28 ++++++++----------- .../test_apps/test_twai/main/test_twai_fd.cpp | 10 +++++-- .../test_apps/test_twai/pytest_driver_twai.py | 1 - examples/peripherals/.build-test-rules.yml | 4 --- .../twai/twai_utils/pytest_twai_utils.py | 10 ------- .../twai_utils/sdkconfig.defaults.esp32h4 | 1 + 7 files changed, 20 insertions(+), 38 deletions(-) create mode 100644 examples/peripherals/twai/twai_utils/sdkconfig.defaults.esp32h4 diff --git a/components/esp_driver_twai/test_apps/.build-test-rules.yml b/components/esp_driver_twai/test_apps/.build-test-rules.yml index f0f2cf9a9c4..a38e7e86f6a 100644 --- a/components/esp_driver_twai/test_apps/.build-test-rules.yml +++ b/components/esp_driver_twai/test_apps/.build-test-rules.yml @@ -1,10 +1,6 @@ components/esp_driver_twai/test_apps/test_twai: disable: - if: SOC_TWAI_SUPPORTED != 1 - disable_test: - - if: IDF_TARGET in ["esp32h4"] - temporary: true - reason: cannot pass # TODO: IDF-15618 depends_components: - esp_driver_twai - esp_hal_twai diff --git a/components/esp_driver_twai/test_apps/test_twai/main/test_twai_common.cpp b/components/esp_driver_twai/test_apps/test_twai/main/test_twai_common.cpp index d35f4266c3f..f2476cff014 100644 --- a/components/esp_driver_twai/test_apps/test_twai/main/test_twai_common.cpp +++ b/components/esp_driver_twai/test_apps/test_twai/main/test_twai_common.cpp @@ -23,13 +23,8 @@ #include "esp_private/gpio.h" #include "driver/uart.h" // for baudrate detection -#if CONFIG_IDF_TARGET_ESP32H4 -#define TEST_TX_GPIO GPIO_NUM_2 -#define TEST_RX_GPIO GPIO_NUM_3 -#else #define TEST_TX_GPIO GPIO_NUM_4 #define TEST_RX_GPIO GPIO_NUM_5 -#endif #define TEST_TWAI_QUEUE_DEPTH 5 #define TEST_TRANS_LEN 100 #define TEST_FRAME_LEN 7 @@ -57,7 +52,7 @@ TEST_CASE("twai install uninstall (loopback)", "[twai]") node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC; node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC; - node_config.bit_timing.bitrate = 500000; + node_config.bit_timing.bitrate = 100000; node_config.tx_queue_depth = TEST_TWAI_QUEUE_DEPTH; node_config.flags.enable_self_test = true; node_config.flags.enable_loopback = true; @@ -153,7 +148,7 @@ static void test_twai_baudrate_correctness(twai_clock_source_t clk_src, uint32_t TEST_ESP_OK(uart_detect_bitrate_stop(UART_NUM_1, true, &measure_result)); uint32_t bitrate_measured = measure_result.clk_freq_hz * 4 / (measure_result.pos_period + measure_result.neg_period); printf("TWAI bitrate measured: %" PRIu32 "\r\n", bitrate_measured); - TEST_ASSERT_INT_WITHIN(1000, test_bitrate, bitrate_measured); // 1k tolerance + TEST_ASSERT_INT_WITHIN((test_bitrate / 100), test_bitrate, bitrate_measured); // 1% tolerance TEST_ESP_OK(twai_node_disable(twai_node)); TEST_ESP_OK(twai_node_delete(twai_node)); @@ -875,18 +870,17 @@ TEST_CASE("twai rx timestamp", "[twai]") node_config.flags.enable_loopback = true; node_config.flags.enable_self_test = true; - bool hw_timer = false; -#if TWAI_LL_SUPPORT(TIMESTAMP) - hw_timer = true; -#endif for (uint32_t resolution = 1000; resolution <= 10000000; resolution *= 100) { +#if CONFIG_IDF_TARGET_ESP32H4 + if (resolution > 1000000) { + continue; // h4 clk_src [32M, 96M] can't accurate support resolutions > 1MHz + } +#endif node_config.timestamp_resolution_hz = resolution; printf("\nTesting resolution %ld\n", resolution); - if (((resolution < 2000) && hw_timer) || ((resolution > 1000000) && !hw_timer)) { - TEST_ESP_ERR(twai_new_node_onchip(&node_config, &node_hdl), ESP_ERR_INVALID_ARG); + if (ESP_OK != twai_new_node_onchip(&node_config, &node_hdl)) { continue; } - TEST_ESP_OK(twai_new_node_onchip(&node_config, &node_hdl)); uint8_t rx_buffer[TWAI_FRAME_MAX_LEN] = {0}; twai_frame_t rx_frame = {}; @@ -911,8 +905,8 @@ TEST_CASE("twai rx timestamp", "[twai]") time_now = MS_TO_TWAI_TICK(esp_timer_get_time() / 1000, resolution); printf("esp tick now %llu, diff %u\n", time_now, abs(time_now - rx_frame.header.timestamp)); - TEST_ASSERT_INT32_WITHIN(MAX(resolution / 100, 5), time_now, rx_frame.header.timestamp); - TEST_ASSERT_INT32_WITHIN(MAX(resolution / 100, 5), rx_frame.header.timestamp - time_last, MS_TO_TWAI_TICK(i * 100, resolution)); + TEST_ASSERT_INT32_WITHIN(MAX(resolution / 100, 5), rx_frame.header.timestamp, time_now); + TEST_ASSERT_INT32_WITHIN(MAX(resolution / 100, 5), MS_TO_TWAI_TICK(i * 100, resolution), rx_frame.header.timestamp - time_last); time_last = rx_frame.header.timestamp; } @@ -923,7 +917,7 @@ TEST_CASE("twai rx timestamp", "[twai]") TEST_ESP_OK(twai_node_enable(node_hdl)); TEST_ESP_OK(twai_node_transmit(node_hdl, &tx_frame, 100)); TEST_ESP_OK(twai_node_transmit_wait_all_done(node_hdl, 100)); - TEST_ASSERT_INT32_WITHIN(MAX(resolution / 100, 5), rx_frame.header.timestamp - time_last, MS_TO_TWAI_TICK(1000, resolution)); + TEST_ASSERT_INT32_WITHIN(MAX(resolution / 100, 5), MS_TO_TWAI_TICK(1000, resolution), rx_frame.header.timestamp - time_last); TEST_ESP_OK(twai_node_disable(node_hdl)); TEST_ESP_OK(twai_node_delete(node_hdl)); diff --git a/components/esp_driver_twai/test_apps/test_twai/main/test_twai_fd.cpp b/components/esp_driver_twai/test_apps/test_twai/main/test_twai_fd.cpp index bc2c9da921d..fa10bc71536 100644 --- a/components/esp_driver_twai/test_apps/test_twai/main/test_twai_fd.cpp +++ b/components/esp_driver_twai/test_apps/test_twai/main/test_twai_fd.cpp @@ -194,7 +194,13 @@ TEST_CASE("twai fd transmit time (loopback)", "[twai]") } uint64_t predict_time_ms = (uint64_t)trans_num * arb_bits * 1000 / node_config.bit_timing.bitrate; predict_time_ms += (uint64_t)trans_num * data_bits * 1000 / node_config.data_timing.bitrate; - predict_time_ms += (trans_num * 10) / 1000; // add about 10 us interrupt overhead per frame + predict_time_ms += (trans_num * 20) / 1000; // add about 20 us interrupt overhead per frame +#if CONFIG_COMPILER_OPTIMIZATION_NONE + predict_time_ms += (trans_num * 10) / 1000; // non optimized slow code +#endif +#if CONFIG_PM_DFS_INIT_AUTO + predict_time_ms += (trans_num * 35) / 1000; // slow cpu +#endif //waiting pkg receive finish TEST_ESP_OK(twai_node_transmit_wait_all_done(node_hdl, -1)); @@ -211,7 +217,7 @@ TEST_CASE("twai fd transmit time (loopback)", "[twai]") (unsigned long long)predict_time_ms, memcmp(recv_pkg_ptr, send_pkg_ptr, TEST_TRANS_TIME_BUF_LEN) ? "failed" : "ok"); TEST_ASSERT_EQUAL_HEX8_ARRAY(send_pkg_ptr, recv_pkg_ptr, TEST_TRANS_TIME_BUF_LEN); - TEST_ASSERT_LESS_THAN((predict_time_ms / 10), abs((time2 - time1) / 1000 - predict_time_ms)); + TEST_ASSERT_LESS_THAN((predict_time_ms * 15 / 100), abs((time2 - time1) / 1000 - predict_time_ms)); } printf("-----------------------------------------------------------------------------------------\n"); diff --git a/components/esp_driver_twai/test_apps/test_twai/pytest_driver_twai.py b/components/esp_driver_twai/test_apps/test_twai/pytest_driver_twai.py index e90d117b5ff..d759b5ddca0 100644 --- a/components/esp_driver_twai/test_apps/test_twai/pytest_driver_twai.py +++ b/components/esp_driver_twai/test_apps/test_twai/pytest_driver_twai.py @@ -20,7 +20,6 @@ from pytest_embedded_idf.utils import soc_filtered_targets @idf_parametrize( 'target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1 and IDF_TARGET not in ["esp32c5"]'), indirect=['target'] ) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_driver_twai_loopbk(dut: Dut) -> None: dut.run_all_single_board_cases(group='twai', reset=True) diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 54f6381824e..1700a3324af 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -765,10 +765,6 @@ examples/peripherals/twai/twai_network/twai_sender: examples/peripherals/twai/twai_utils: disable: - if: SOC_TWAI_SUPPORTED != 1 - disable_test: - - if: IDF_TARGET in ["esp32h4"] - temporary: true - reason: cannot pass # TODO: IDF-15618 depends_components: - esp_driver_twai - esp_hal_twai diff --git a/examples/peripherals/twai/twai_utils/pytest_twai_utils.py b/examples/peripherals/twai/twai_utils/pytest_twai_utils.py index af35891da90..454f5364ffd 100644 --- a/examples/peripherals/twai/twai_utils/pytest_twai_utils.py +++ b/examples/peripherals/twai/twai_utils/pytest_twai_utils.py @@ -310,7 +310,6 @@ def usb_can() -> CanBusManager: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_basic_operations(twai: TwaiTestHelper) -> None: with twai.session(start_dump=False): # Test basic send operation @@ -329,7 +328,6 @@ def test_twai_utils_basic_operations(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_bitrate_configuration(twai: TwaiTestHelper) -> None: for bitrate in [125000, 250000, 500000, 1000000]: with twai.session(mode='standard', bitrate=bitrate, tx_gpio=DEFAULT_TX_GPIO, rx_gpio=DEFAULT_RX_GPIO): @@ -338,7 +336,6 @@ def test_twai_utils_bitrate_configuration(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_frame_formats(twai: TwaiTestHelper) -> None: with twai.session(): BASIC_FRAMES = [ @@ -369,7 +366,6 @@ def test_twai_utils_frame_formats(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_info_and_recovery(twai: TwaiTestHelper) -> None: with twai.session(): assert twai.info(), 'Info command failed' @@ -390,7 +386,6 @@ def test_twai_utils_info_and_recovery(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_input_validation(twai: TwaiTestHelper) -> None: with twai.session(start_dump=False): INVALID_FRAMES = [ @@ -437,7 +432,6 @@ def test_twai_utils_input_validation(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_gpio_and_basic_send(twai: TwaiTestHelper) -> None: with twai.session(): assert twai.info(), 'GPIO info failed' @@ -465,7 +459,6 @@ def test_twai_utils_gpio_and_basic_send(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_send_various_frames(twai: TwaiTestHelper) -> None: with twai.session(): # Boundary ID tests @@ -485,7 +478,6 @@ def test_twai_utils_send_various_frames(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_FD_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_fd_frames(twai: TwaiTestHelper) -> None: with twai.session(): FD_FRAMES = [ @@ -500,7 +492,6 @@ def test_twai_utils_fd_frames(twai: TwaiTestHelper) -> None: @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_TWAI_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_mask_filters(twai: TwaiTestHelper) -> None: """Test TWAI filtering including automatic extended frame detection.""" MASK_FILTER_GROUPS = [ @@ -563,7 +554,6 @@ def test_twai_utils_mask_filters(twai: TwaiTestHelper) -> None: soc_filtered_targets('SOC_TWAI_RANGE_FILTER_NUM > 0'), indirect=['target'], ) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15618 def test_twai_utils_range_filters(twai: TwaiTestHelper) -> None: """Test TWAI range filters (available on chips with range filter support).""" RANGE_FILTER_GROUPS = [ diff --git a/examples/peripherals/twai/twai_utils/sdkconfig.defaults.esp32h4 b/examples/peripherals/twai/twai_utils/sdkconfig.defaults.esp32h4 new file mode 100644 index 00000000000..daff3b9a4d6 --- /dev/null +++ b/examples/peripherals/twai/twai_utils/sdkconfig.defaults.esp32h4 @@ -0,0 +1 @@ +CONFIG_EXAMPLE_ENABLE_TWAI_FD=y