diff --git a/.gitlab/ci/dependencies/dependencies.yml b/.gitlab/ci/dependencies/dependencies.yml index 513bd8cad8..5a58592dec 100644 --- a/.gitlab/ci/dependencies/dependencies.yml +++ b/.gitlab/ci/dependencies/dependencies.yml @@ -134,9 +134,8 @@ build:integration_test: - - bt # example_test_005 - wifi # example_test_002, example_test*wifi* - ethernet # example_test*ethernet* - - sdio # UT_044, UT_045 + - sdio # component_ut_pytest_esp32_sdio - usb # USB Device & Host tests - - spi_multi # UT_C2_SPI_DUAL - adc # component_ut_pytest_esp32x_adc - i154 patterns: diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index c5cc8ffcee..8ec204f92d 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -229,9 +229,9 @@ - "components/esp_netif/**/*" - "components/lwip/**/*" -# for jobs: UT_044, UT_045 +# for jobs: component_ut_pytest_esp32_sdio .patterns-unit_test-sdio: &patterns-unit_test-sdio - - "components/esp_serial_slave_link/**/*" + - "components/hal/**/*" - "components/driver/**/*" - "components/sdmmc/**/*" @@ -243,13 +243,6 @@ - "examples/peripherals/usb/host/**/**/**/*" - "examples/peripherals/usb/device/**/**/*" -# for job: unit_test-spi_multi which has only one runner -.patterns-unit_test-spi_multi: &patterns-unit_test-spi_multi - - "components/esp_serial_slave_link/**/*" - - "components/driver/**/*" - - "components/hal/**/*" - - "examples/peripherals/spi_slave*/**/*" - # for jobs: component_ut_pytest_esp32x_adc: .patterns-component_ut-adc: &patterns-component_ut-adc - "components/esp_adc/**/*" @@ -1285,8 +1278,6 @@ changes: *patterns-unit_test - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:build:unit_test: rules: @@ -1318,8 +1309,6 @@ changes: *patterns-unit_test - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:build:unit_test-esp32: rules: @@ -1345,8 +1334,6 @@ changes: *patterns-unit_test - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:build:unit_test-esp32c2: rules: @@ -1369,8 +1356,6 @@ changes: *patterns-target_test-wifi - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:build:unit_test-esp32c3: rules: @@ -1395,8 +1380,6 @@ changes: *patterns-unit_test - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:build:unit_test-esp32c6: rules: @@ -1421,8 +1404,6 @@ changes: *patterns-unit_test - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:build:unit_test-esp32s2: rules: @@ -1447,8 +1428,6 @@ changes: *patterns-unit_test - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:build:unit_test-esp32s3: rules: @@ -1473,8 +1452,6 @@ changes: *patterns-unit_test - <<: *if-dev-push changes: *patterns-unit_test-sdio - - <<: *if-dev-push - changes: *patterns-unit_test-spi_multi .rules:labels-protected:lan8720: rules: diff --git a/.gitlab/ci/target-test.yml b/.gitlab/ci/target-test.yml index 483bb2cb37..9dd088c1bd 100644 --- a/.gitlab/ci/target-test.yml +++ b/.gitlab/ci/target-test.yml @@ -322,6 +322,14 @@ component_ut_pytest_esp32_adc: - build_pytest_components_esp32 tags: [ esp32, adc ] +component_ut_pytest_esp32_sdio: + extends: + - .pytest_components_dir_template + - .rules:test:unit_test-esp32-sdio + needs: + - build_pytest_components_esp32 + tags: [ esp32, sdio_master_slave ] + component_ut_pytest_esp32_ip101: extends: - .pytest_components_dir_template @@ -1061,23 +1069,6 @@ UT_043: - UT_T1_32kXTAL - psram -UT_044: - extends: - - .unit_test_esp32_template - - .rules:test:unit_test-esp32-sdio - tags: - - ESP32_IDF - - UT_SDIO - -UT_045: - extends: - - .unit_test_esp32_template - - .rules:test:unit_test-esp32-sdio - tags: - - ESP32_IDF - - UT_SDIO - - psram - UT_S2_SDSPI: extends: .unit_test_esp32s2_template tags: diff --git a/components/driver/.build-test-rules.yml b/components/driver/.build-test-rules.yml index 378949d94f..9923237f72 100644 --- a/components/driver/.build-test-rules.yml +++ b/components/driver/.build-test-rules.yml @@ -63,6 +63,12 @@ components/driver/test_apps/rs485: temporary: true reason: lack of runners +components/driver/test_apps/sdio: + disable: + - if: SOC_SDIO_SLAVE_SUPPORTED != 1 + temporary: true + reason: Not supported. + components/driver/test_apps/sdm: disable: - if: SOC_SDM_SUPPORTED != 1 diff --git a/components/driver/test_apps/sdio/CMakeLists.txt b/components/driver/test_apps/sdio/CMakeLists.txt new file mode 100644 index 0000000000..8ad0621207 --- /dev/null +++ b/components/driver/test_apps/sdio/CMakeLists.txt @@ -0,0 +1,10 @@ +# This is the project CMakeLists.txt file for the test subproject +cmake_minimum_required(VERSION 3.16) + +set(EXTRA_COMPONENT_DIRS + "$ENV{IDF_PATH}/tools/unit-test-app/components" + "$ENV{IDF_PATH}/components/driver/test_apps/components" +) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(sdio_test) diff --git a/components/driver/test_apps/sdio/README.md b/components/driver/test_apps/sdio/README.md new file mode 100644 index 0000000000..d00f700643 --- /dev/null +++ b/components/driver/test_apps/sdio/README.md @@ -0,0 +1,2 @@ +| Supported Targets | ESP32 | +| ----------------- | ----- | \ No newline at end of file diff --git a/components/driver/test_apps/sdio/main/CMakeLists.txt b/components/driver/test_apps/sdio/main/CMakeLists.txt new file mode 100644 index 0000000000..9ec34ffd80 --- /dev/null +++ b/components/driver/test_apps/sdio/main/CMakeLists.txt @@ -0,0 +1,13 @@ +set(srcs + "test_app_main.c" + "test_sdio.c" + "test_sdmmc_sdspi_init.cpp" +) + +# 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 test_utils test_driver_utils driver esp_timer sdmmc esp_serial_slave_link + WHOLE_ARCHIVE +) diff --git a/components/driver/test_apps/sdio/main/test_app_main.c b/components/driver/test_apps/sdio/main/test_app_main.c new file mode 100644 index 0000000000..adf43817e8 --- /dev/null +++ b/components/driver/test_apps/sdio/main/test_app_main.c @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "unity.h" +#include "unity_test_utils.h" +#include "esp_heap_caps.h" + + +#define TEST_MEMORY_LEAK_THRESHOLD (200) + +static size_t before_free_8bit; +static size_t before_free_32bit; + +void setUp(void) +{ + before_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + before_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); +} + +void tearDown(void) +{ + esp_reent_cleanup(); //clean up some of the newlib's lazy allocations + size_t after_free_8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT); + size_t after_free_32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT); + printf("\n"); + unity_utils_check_leak(before_free_8bit, after_free_8bit, "8BIT", TEST_MEMORY_LEAK_THRESHOLD); + unity_utils_check_leak(before_free_32bit, after_free_32bit, "32BIT", TEST_MEMORY_LEAK_THRESHOLD); +} + +void app_main(void) +{ + // _____ _ _ _ + // |_ _|__ ___| |_ ___ __| (_) ___ + // | |/ _ \/ __| __| / __|/ _` | |/ _ `. + // | | __/\__ \ |_ \__ \ (_| | | (_) | + // |_|\___||___/\__| |___/\__,_|_|\___/ + + printf(" _____ _ _ _ \n"); + printf(" |_ _|__ ___| |_ ___ __| (_) ___ \n"); + printf(" | |/ _ \\/ __| __| / __|/ _` | |/ _ \\ \n"); + printf(" | | __/\\__ \\ |_ \\__ \\ (_| | | (_) |\n"); + printf(" |_|\\___||___/\\__| |___/\\__,_|_|\\___/ \n"); + + unity_run_menu(); +} diff --git a/components/driver/test/test_sdio.c b/components/driver/test_apps/sdio/main/test_sdio.c similarity index 94% rename from components/driver/test/test_sdio.c rename to components/driver/test_apps/sdio/main/test_sdio.c index d2fae22bc4..49230f094a 100644 --- a/components/driver/test/test_sdio.c +++ b/components/driver/test_apps/sdio/main/test_sdio.c @@ -7,17 +7,14 @@ #include "unity.h" #include "test_utils.h" #include "test_spi_utils.h" +#include "esp_serial_slave_link/essl_sdio.h" #include "esp_log.h" +#include "sdmmc_cmd.h" #include "esp_timer.h" -#include "soc/soc_caps.h" #include "ccomp_timer.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" - #include "driver/spi_common.h" #include "driver/sdspi_host.h" -#include "esp_serial_slave_link/essl_sdio.h" -#include "sdmmc_cmd.h" +#include "soc/soc_caps.h" #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) @@ -351,13 +348,13 @@ static void log_performance_tohost(uint32_t speed, const sdio_test_config_t* con if (!config->check_data) { switch (config->sdio_mode) { case SDIO_4BIT: - TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_4BIT, "%d", speed); + TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_4BIT, "%" PRIu32, speed); break; case SDIO_1BIT: - TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_1BIT, "%d", speed); + TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_1BIT, "%" PRIu32, speed); break; case SDIO_SPI: - TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_SPI, "%d", speed); + TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_TOHOST_SPI, "%" PRIu32, speed); break; } } @@ -422,7 +419,7 @@ static void test_tp_tohost_master(essl_handle_t handle, const sdio_test_config_t int64_t end_us = esp_timer_get_time(); uint32_t total_time_ms = (end_us - pre_us)/1000; - ESP_LOGI(MASTER_TAG, "test done, total time: %d ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length); + ESP_LOGI(MASTER_TAG, "test done, total time: %" PRIu32 " ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length); uint32_t throughput_byte_per_ms = expected_length / c_time_ms; ESP_LOGI(MASTER_TAG, "Throughput: compensated %.2lf MB/s, typical %.2lf MB/s", @@ -437,13 +434,13 @@ static void log_performance_frhost(uint32_t speed, const sdio_test_config_t* con if (!config->check_data) { switch (config->sdio_mode) { case SDIO_4BIT: - TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_4BIT, "%d", speed); + TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_4BIT, "%" PRIu32, speed); break; case SDIO_1BIT: - TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_1BIT, "%d", speed); + TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_1BIT, "%" PRIu32, speed); break; case SDIO_SPI: - TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_SPI, "%d", speed); + TEST_PERFORMANCE_CCOMP_GREATER_THAN(SDIO_THROUGHPUT_KBSEC_FRHOST_SPI, "%" PRIu32, speed); break; } } @@ -482,7 +479,7 @@ static void test_tp_frhost_master(essl_handle_t handle, const sdio_test_config_t int64_t end_us = esp_timer_get_time(); uint32_t total_time_ms = (end_us - pre_us)/1000; - ESP_LOGI(MASTER_TAG, "test done, total time: %d ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length); + ESP_LOGI(MASTER_TAG, "test done, total time: %" PRIu32 " ms (%d ms compensated), bytes transferred: %d", total_time_ms, (int)c_time_ms, expected_length); uint32_t throughput_byte_per_ms = expected_length / c_time_ms; ESP_LOGI(MASTER_TAG, "Throughput: compensated %.2lf MB/s, typical %.2lf MB/s", @@ -734,15 +731,15 @@ void test_sdio_reset_slave(void) } -TEST_CASE_MULTIPLE_DEVICES("sdio interrupt", "[sdio][test_env=UT_SDIO]", test_sdio_interrupt_master, test_sdio_interrupt_slave); +TEST_CASE_MULTIPLE_DEVICES("sdio interrupt", "[sdio][test_env=sdio_master_slave]", test_sdio_interrupt_master, test_sdio_interrupt_slave); -TEST_CASE_MULTIPLE_DEVICES("sdio register", "[sdio][test_env=UT_SDIO]", test_sdio_reg_master, test_sdio_interrupt_slave); +TEST_CASE_MULTIPLE_DEVICES("sdio register", "[sdio][test_env=sdio_master_slave]", test_sdio_reg_master, test_sdio_interrupt_slave); #if !CONFIG_FREERTOS_UNICORE -TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=UT_SDIO]", test_sdio_reset_master, test_sdio_reset_slave); +TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=sdio_master_slave]", test_sdio_reset_master, test_sdio_reset_slave); #else //Currently there is weird issue on the runner, when tested with single core config, seems to relate to receiving -TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=UT_SDIO][ignore]", test_sdio_reset_master, test_sdio_reset_slave); +TEST_CASE_MULTIPLE_DEVICES("sdio reset", "[sdio][test_env=sdio_master_slave][ignore]", test_sdio_reset_master, test_sdio_reset_slave); #endif @@ -792,10 +789,10 @@ ptest_func_t frhost_slave = { PARAM_GROUP_DECLARE_TYPE(IO_MODE, sdio_test_config_t, test_cfg_array); #if !CONFIG_FREERTOS_UNICORE -TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=UT_SDIO]", &frhost_master, &frhost_slave); +TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=sdio_master_slave]", &frhost_master, &frhost_slave); #else //Currently there is weird issue on the runner, when tested with single core config, seems to relate to receiving -TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=UT_SDIO][ignore]", &frhost_master, &frhost_slave); +TEST_MASTER_SLAVE(SDIO_FRHOST, test_cfg_array, "[sdio][timeout=180][test_env=sdio_master_slave][ignore]", &frhost_master, &frhost_slave); #endif ptest_func_t tohost_master = { @@ -810,7 +807,7 @@ ptest_func_t tohost_slave = { .post_test = null_post, }; -TEST_MASTER_SLAVE(SDIO_TOHOST, test_cfg_array, "[sdio][timeout=180][test_env=UT_SDIO]", &tohost_master, &tohost_slave); +TEST_MASTER_SLAVE(SDIO_TOHOST, test_cfg_array, "[sdio][timeout=180][test_env=sdio_master_slave]", &tohost_master, &tohost_slave); #endif //SOC_SDMMC_HOST_SUPPORTED && SOC_SDIO_SLAVE_SUPPORTED diff --git a/components/driver/test/test_sdmmc_sdspi_init.cpp b/components/driver/test_apps/sdio/main/test_sdmmc_sdspi_init.cpp similarity index 100% rename from components/driver/test/test_sdmmc_sdspi_init.cpp rename to components/driver/test_apps/sdio/main/test_sdmmc_sdspi_init.cpp diff --git a/components/driver/test_apps/sdio/pytest_sdio.py b/components/driver/test_apps/sdio/pytest_sdio.py new file mode 100644 index 0000000000..f9649d25e3 --- /dev/null +++ b/components/driver/test_apps/sdio/pytest_sdio.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest + + +@pytest.mark.esp32 +@pytest.mark.sdio_master_slave +@pytest.mark.parametrize('count', [2,], indirect=True) +def test_sdio_multi_dev(case_tester) -> None: # type: ignore + case_tester.run_all_multi_dev_cases(reset=True) diff --git a/components/driver/test_apps/sdio/sdkconfig.defaults b/components/driver/test_apps/sdio/sdkconfig.defaults new file mode 100644 index 0000000000..b308cb2ddd --- /dev/null +++ b/components/driver/test_apps/sdio/sdkconfig.defaults @@ -0,0 +1,2 @@ +CONFIG_FREERTOS_HZ=1000 +CONFIG_ESP_TASK_WDT=n diff --git a/pytest.ini b/pytest.ini index bab928e9fb..7789a6e82c 100644 --- a/pytest.ini +++ b/pytest.ini @@ -75,6 +75,7 @@ markers = wifi_two_dut: tests should be run on runners which has two wifi duts connected. generic_multi_device: generic multiple devices whose corresponding gpio pins are connected to each other. twai_network: multiple runners form a TWAI network. + sdio_master_slave: Test sdio multi board. # host_test markers host_test: tests which shouldn not be built at the build stage, and instead built in host_test stage.