Merge branch 'fix/h4_s31_enable_multi_board_test' into 'master'

fix(ci): h4 and s31 enable multi_board test

Closes IDFCI-10702, IDFCI-10334, and IDF-11442

See merge request espressif/esp-idf!48438
This commit is contained in:
Wan Lei
2026-05-22 15:23:03 +08:00
18 changed files with 36 additions and 70 deletions

View File

@@ -36,6 +36,13 @@
#define PIN_NUM_CS 10 //the IOMUX pin of SPI2 CS0&CS1 is Pin_16&17 which conflict with UART Tx&Rx Pin
#define PIN_NUM_WP SPI2_IOMUX_PIN_NUM_WP
#define PIN_NUM_HD SPI2_IOMUX_PIN_NUM_HD
#elif CONFIG_IDF_TARGET_ESP32H4
#define PIN_NUM_MISO SPI2_IOMUX_PIN_NUM_MISO
#define PIN_NUM_MOSI 21 //the mosi iomux pin 17 for h4 is straping pin and don't connected on burger runner
#define PIN_NUM_CLK SPI2_IOMUX_PIN_NUM_CLK
#define PIN_NUM_CS SPI2_IOMUX_PIN_NUM_CS
#define PIN_NUM_WP SPI2_IOMUX_PIN_NUM_WP
#define PIN_NUM_HD SPI2_IOMUX_PIN_NUM_HD
#else
#define PIN_NUM_MISO SPI2_IOMUX_PIN_NUM_MISO
#define PIN_NUM_MOSI SPI2_IOMUX_PIN_NUM_MOSI
@@ -45,6 +52,17 @@
#define PIN_NUM_HD SPI2_IOMUX_PIN_NUM_HD
#endif
// dummy cs pins for add device test, which are available pins but different from PIN_NUM_CS
#if CONFIG_IDF_TARGET_ESP32
#define DUMMY_CS_PINS() {25, 26, 27}
#elif CONFIG_IDF_TARGET_ESP32H2
#define DUMMY_CS_PINS() {9, 10, 11, 12, 22, 25}
#elif CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32H4
#define DUMMY_CS_PINS() {0, 1, 2, 3, 4, 5}
#else
#define DUMMY_CS_PINS() {0, 1, 4, 5, 8, 9}
#endif //CONFIG_IDF_TARGET_ESP32
#if (TEST_SPI_PERIPH_NUM >= 2) // esp32, s2, s3
#define TEST_SPI_HOST SPI2_HOST
#define TEST_SLAVE_HOST SPI3_HOST

View File

@@ -31,8 +31,6 @@ def test_i2c(dut: Dut) -> None:
indirect=True,
)
@idf_parametrize('target', soc_filtered_targets('SOC_I2C_SUPPORTED == 1'), indirect=['target'])
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='lack of s31 multi-device runner # TODO: IDFCI-10334')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='lack of runner # TODO: IDFCI-10702')
def test_i2c_multi_device(case_tester) -> None: # type: ignore
case_tester.run_all_multi_dev_cases(reset=True)

View File

@@ -20,15 +20,9 @@ components/esp_driver_i2s/test_apps/i2s_multi_dev:
- if: SOC_I2S_SUPPORTED != 1
- if: SOC_I2S_HW_VERSION_2 != 1
disable_test:
- if: IDF_TARGET in ["esp32c61"] # TODO: [ESP32C61] IDF-11442
- if: IDF_TARGET in ["esp32h4", "esp32s31"]
temporary: true
reason: lack of runners
- if: IDF_TARGET in ["esp32s31"]
temporary: true
reason: lack of s31 multi-device runner
- if: IDF_TARGET in ["esp32h4"] # TODO: IDFCI-10702
temporary: true
reason: lack of runner
reason: cannot pass # TODO: IDF-15609
depends_components:
- esp_driver_i2s
- esp_driver_dma

View File

@@ -31,7 +31,7 @@ static const char *TAG = "i2s_multi_dev_test";
#define TEST_I2S_MCK_IO (GPIO_NUM_1)
#define TEST_I2S_BCK_IO (GPIO_NUM_4)
#define TEST_I2S_WS_IO (GPIO_NUM_5)
#if CONFIG_IDF_TARGET_ESP32H2
#if CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32H4
#define TEST_I2S_DO_IO (GPIO_NUM_2)
#define TEST_I2S_DI_IO (GPIO_NUM_3) // DI and DO gpio will be reversed on slave runner
#else

View File

@@ -6,10 +6,9 @@ from pytest_embedded_idf.utils import soc_filtered_targets
@pytest.mark.generic_multi_device
@pytest.mark.temp_skip_ci(targets=['esp32c61'], reason='p4 rev3 migration # TODO: IDF-11442')
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='lack of s31 multi-device runner # TODO: IDFCI-10334')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='lack of runner # TODO: IDFCI-10702')
@pytest.mark.parametrize('count', [2], indirect=True)
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15609
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='cannot pass') # TODO: IDF-15609
@idf_parametrize('target', soc_filtered_targets('SOC_I2S_SUPPORTS_TDM == 1'), indirect=['target'])
def test_i2s_multi_dev(case_tester) -> None: # type: ignore
case_tester.run_all_multi_dev_cases(reset=True, timeout=30)

View File

@@ -66,6 +66,8 @@ def test_ledc_psram(dut: IdfDut) -> None:
@pytest.mark.temp_skip_ci(targets=['esp32s3'], reason='s3 multi device runner has no psram')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15610
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='cannot pass') # TODO: IDF-15610
@pytest.mark.generic_multi_device
@pytest.mark.parametrize(
'count, config',
@@ -76,7 +78,5 @@ def test_ledc_psram(dut: IdfDut) -> None:
indirect=True,
)
@idf_parametrize('target', ['supported_targets'], indirect=['target'])
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='TODO: IDFCI-10334 no runner yet')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='lack of runner # TODO: IDFCI-10702')
def test_ledc_multi_device(case_tester) -> None: # type: ignore
case_tester.run_all_multi_dev_cases(reset=True)

View File

@@ -12,36 +12,20 @@
components/esp_driver_spi/test_apps/master:
disable:
- if: SOC_GPSPI_SUPPORTED != 1
disable_test:
- if: IDF_TARGET in ["esp32h4"]
temporary: true
reason: cannot pass # TODO: IDF-15615
<<: *spi_depends_default
components/esp_driver_spi/test_apps/param:
disable:
- if: SOC_GPSPI_SUPPORTED != 1
disable_test:
- if: IDF_TARGET in ["esp32h4"]
temporary: true
reason: cannot pass # TODO: IDF-15615
<<: *spi_depends_default
components/esp_driver_spi/test_apps/slave:
disable:
- if: SOC_GPSPI_SUPPORTED != 1
disable_test:
- if: IDF_TARGET in ["esp32h4"]
temporary: true
reason: cannot pass # TODO: IDF-15615
<<: *spi_depends_default
components/esp_driver_spi/test_apps/slave_hd:
disable:
- if: SOC_GPSPI_SUPPORTED != 1
- if: SOC_SPI_SUPPORT_SLAVE_HD_VER2 != 1
disable_test:
- if: IDF_TARGET in ["esp32h4"]
temporary: true
reason: cannot pass # TODO: IDF-15615
<<: *spi_depends_default

View File

@@ -1592,18 +1592,6 @@ TEST_CASE("spi_speed", "[spi]")
//****************************************spi master add device test************************************//
#define SPI_MAX_DEVICE_NUM SPI_LL_PERIPH_CS_NUM(TEST_SPI_HOST)
//add dummy devices first
#if CONFIG_IDF_TARGET_ESP32
#define DUMMY_CS_PINS() {25, 26, 27}
#elif CONFIG_IDF_TARGET_ESP32H2
#define DUMMY_CS_PINS() {9, 10, 11, 12, 22, 25}
#elif CONFIG_IDF_TARGET_ESP32P4
#define DUMMY_CS_PINS() {20, 21, 22, 23, 24, 25}
#else
#define DUMMY_CS_PINS() {0, 1, 4, 5, 8, 9}
#endif //CONFIG_IDF_TARGET_ESP32
#define CS_REAL_DEV PIN_NUM_CS
#define TEST_TRANS_LEN 48
void test_add_device_master(void)
@@ -1639,7 +1627,7 @@ void test_add_device_master(void)
//3. free devs[i] after transaction to release the real CS pin for using again by another dev,
//So it will loop to check every gpio_signal one by one use one physical pin
spi_bus_remove_device(devs[i]);
dev_cfg.spics_io_num = CS_REAL_DEV;
dev_cfg.spics_io_num = PIN_NUM_CS;
TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &dev_cfg, &devs[i]));
memset(master_recvbuf, 0, sizeof(master_recvbuf));
@@ -1673,7 +1661,7 @@ void test_add_device_slave(void)
spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG();
spi_slave_interface_config_t slvcfg = {
.spics_io_num = CS_REAL_DEV,
.spics_io_num = PIN_NUM_CS,
.queue_size = 3,
};
TEST_ESP_OK(spi_slave_initialize(TEST_SPI_HOST, &bus_cfg, &slvcfg, SPI_DMA_CH_AUTO));

View File

@@ -86,7 +86,5 @@ def test_master_esp_flash(case_tester) -> None: # type: ignore
indirect=True,
)
@idf_parametrize('target', ['supported_targets'], indirect=['target'])
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='no runner')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='lack of runner') # TODO: IDFCI-10702
def test_master_multi_dev(case_tester) -> None: # type: ignore
case_tester.run_all_multi_dev_cases(reset=True)

View File

@@ -1 +1,2 @@
CONFIG_SPIRAM=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=0

View File

@@ -1,2 +0,0 @@
CONFIG_SPIRAM=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=0

View File

@@ -14,7 +14,5 @@ def test_param_single_dev(case_tester) -> None: # type: ignore
@pytest.mark.generic_multi_device
@pytest.mark.parametrize('count', [2], indirect=True)
@idf_parametrize('target', ['supported_targets'], indirect=['target'])
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='no runner')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='no runner') # TODO: IDFCI-10702
def test_param_multi_dev(case_tester) -> None: # type: ignore
case_tester.run_all_multi_dev_cases(reset=True)

View File

@@ -35,8 +35,5 @@ def test_slave_single_dev_esp32c5_rev1(case_tester) -> None: # type: ignore
@pytest.mark.generic_multi_device
@pytest.mark.parametrize('count, config', [(2, 'release'), (2, 'iram_safe')], indirect=True)
@idf_parametrize('target', ['supported_targets'], indirect=['target'])
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='no runner')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='no runner') # TODO: IDFCI-10702
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='s31 bringup on this module is not done')
def test_slave_multi_dev(case_tester) -> None: # type: ignore
case_tester.run_all_multi_dev_cases(reset=True)

View File

@@ -29,7 +29,5 @@ def test_slave_hd_single_dev_esp32c5_rev1(case_tester) -> None: # type: ignore
@pytest.mark.generic_multi_device
@pytest.mark.parametrize('count, config', [(2, 'release')], indirect=True)
@idf_parametrize('target', soc_filtered_targets('SOC_SPI_SUPPORT_SLAVE_HD_VER2 == 1'), indirect=['target'])
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='no runner')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='no runner') # TODO: IDFCI-10702
def test_slave_hd_multi_dev(case_tester) -> None: # type: ignore
case_tester.run_all_multi_dev_cases(reset=True)

View File

@@ -17,10 +17,6 @@ components/esp_driver_uart/test_apps/rs485:
components/esp_driver_uart/test_apps/uart:
disable:
- if: SOC_UART_SUPPORTED != 1
disable_test:
- if: IDF_TARGET in ["esp32h4"]
temporary: true
reason: cannot pass # TODO: IDF-15619
depends_components:
- esp_driver_uart
- esp_hal_uart

View File

@@ -83,10 +83,9 @@ def test_uart_single_dev_psram(case_tester) -> None: # type: ignore
# ESP32 only supports uart wakeup if signal routes through IOMUX
# ESP32S3 multi device runner has no psram IDF-12837,
@pytest.mark.temp_skip_ci(targets=['esp32', 'esp32s3'], reason='no multi-dev runner')
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='cannot pass') # TODO: IDF-15619
@pytest.mark.generic_multi_device
@idf_parametrize('target', ['supported_targets'], indirect=['target'])
@pytest.mark.temp_skip_ci(targets=['esp32s31'], reason='s31 bringup on this module is not done')
@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='no runner') # TODO: IDFCI-10702
@pytest.mark.parametrize(
'config',
[

View File

@@ -23,7 +23,7 @@ examples/bluetooth/bluedroid/ble:
- if: IDF_TARGET == "esp32s31"
temporary: true
reason: lack of runners
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-10702
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-11112
temporary: true
reason: lack of runner
depends_components+:
@@ -59,7 +59,7 @@ examples/bluetooth/bluedroid/ble/ble_throughput:
- if: IDF_TARGET == "esp32s31"
temporary: true
reason: lack of runners
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-10702
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-11112
temporary: true
reason: lack of runner
depends_components+:
@@ -78,7 +78,7 @@ examples/bluetooth/bluedroid/ble_50:
- if: IDF_TARGET == "esp32s31"
temporary: true
reason: lack of runners
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-10702
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-11112
temporary: true
reason: lack of runner
depends_components+:
@@ -393,7 +393,7 @@ examples/bluetooth/nimble/blecent:
- if: IDF_TARGET == "esp32s31"
temporary: true
reason: lack of runners
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-10702
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-11112
temporary: true
reason: lack of runner
depends_components+:
@@ -442,7 +442,7 @@ examples/bluetooth/nimble/power_save:
- if: IDF_TARGET == "esp32s31"
temporary: true
reason: lack of runners, and light sleep not supported yet
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-10702
- if: IDF_TARGET == "esp32h4" # TODO: IDFCI-11112
temporary: true
reason: lack of runner
depends_components+:

View File

@@ -790,9 +790,9 @@ examples/peripherals/uart/uart_dma_ota:
- if: IDF_TARGET in ["esp32s31"]
temporary: true
reason: Lack runners
- if: IDF_TARGET in ["esp32h4"] # TODO: IDFCI-10702
- if: IDF_TARGET in ["esp32h4"] # TODO: IDFCI-10703
temporary: true
reason: lack of runner
reason: lack of usj runner
depends_components:
- esp_driver_uart
- esp_driver_dma