From 5e0c2349d488d97bb5c8cbd3a3825bde11f815f2 Mon Sep 17 00:00:00 2001 From: Song Ruo Jing Date: Tue, 4 Aug 2026 21:23:44 +0800 Subject: [PATCH] fix(ci): re-enable some LEDC/UART tests for H4, S31 --- .../test_apps/ledc/pytest_ledc.py | 2 - .../test_apps/uart/pytest_uart.py | 1 - examples/peripherals/.build-test-rules.yml | 4 -- .../ledc_basic/main/ledc_basic_example_main.c | 1 + examples/peripherals/ledc/ledc_fade/README.md | 9 ++++- .../ledc/ledc_fade/main/Kconfig.projbuild | 37 +++++++++++++++++++ .../ledc_fade/main/ledc_fade_example_main.c | 36 ++++++++---------- .../ledc/ledc_fade/pytest_ledc_fade.py | 1 - 8 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 examples/peripherals/ledc/ledc_fade/main/Kconfig.projbuild diff --git a/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py b/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py index eeff4cd4f2c..b781bbf4856 100644 --- a/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py +++ b/components/esp_driver_ledc/test_apps/ledc/pytest_ledc.py @@ -65,8 +65,6 @@ 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', diff --git a/components/esp_driver_uart/test_apps/uart/pytest_uart.py b/components/esp_driver_uart/test_apps/uart/pytest_uart.py index 7d31a72b279..8c1f6af29e5 100644 --- a/components/esp_driver_uart/test_apps/uart/pytest_uart.py +++ b/components/esp_driver_uart/test_apps/uart/pytest_uart.py @@ -125,7 +125,6 @@ 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.parametrize( diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 41a59e33b9b..3abb02941c3 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -380,10 +380,6 @@ examples/peripherals/lcd/tjpgd: examples/peripherals/ledc: disable: - if: SOC_LEDC_SUPPORTED != 1 - disable_test: - - if: IDF_TARGET in ["esp32h4"] - temporary: true - reason: cannot pass # TODO: IDF-15610 depends_components: - esp_driver_ledc - esp_hal_ledc diff --git a/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c index 2f17326aa70..0a8f93f58a2 100644 --- a/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c +++ b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c @@ -77,4 +77,5 @@ void app_main(void) ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY)); // Update duty to apply the new value ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL)); + printf("Generated a %d Hz signal on GPIO %d\n", LEDC_FREQUENCY, LEDC_OUTPUT_IO); } diff --git a/examples/peripherals/ledc/ledc_fade/README.md b/examples/peripherals/ledc/ledc_fade/README.md index e17ee97fd0d..0de61024a6a 100644 --- a/examples/peripherals/ledc/ledc_fade/README.md +++ b/examples/peripherals/ledc/ledc_fade/README.md @@ -14,19 +14,24 @@ This example shows how to control intensity of LEDs using selected SoC's on-boar * A development board with any Espressif SoC (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) * A USB cable for power supply and programming -Connect four LEDs to the following LEDC channels / individual GPIOs: +Connect four LEDs to the following LEDC channels / individual GPIOs (defaults): | | Channel 0 | Channel 1 | Channel 2 | Channel 3 | | --------------- | --------- | --------- | --------- | --------- | -| ESP32 | GPIO18 | GPIO19 | GPIO4 | GPIO5 | +| ESP32 | GPIO18 | GPIO19 | GPIO4 | GPIO5 | +| ESP32-H4 | GPIO18 | GPIO19 | GPIO2 | GPIO3 | | All other chips | GPIO8 | GPIO9 | GPIO2 | GPIO3 | +The GPIO numbers can be changed in menuconfig under `Example Configuration`. + ### Configure the project ``` idf.py menuconfig ``` +- `Example Configuration` → select GPIO numbers for LEDC channel 0–3 + ### Build and Flash Build the project and flash it to the board, then run the monitor tool to view the serial output: diff --git a/examples/peripherals/ledc/ledc_fade/main/Kconfig.projbuild b/examples/peripherals/ledc/ledc_fade/main/Kconfig.projbuild new file mode 100644 index 00000000000..37b5ab7bf2e --- /dev/null +++ b/examples/peripherals/ledc/ledc_fade/main/Kconfig.projbuild @@ -0,0 +1,37 @@ +menu "Example Configuration" + + orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps" + + config LEDC_CH0_GPIO + int "LEDC channel 0 GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32H4 + default 8 + help + GPIO pin number to be used as LEDC channel 0 output. + + config LEDC_CH1_GPIO + int "LEDC channel 1 GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32H4 + default 9 + help + GPIO pin number to be used as LEDC channel 1 output. + + config LEDC_CH2_GPIO + int "LEDC channel 2 GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 4 if IDF_TARGET_ESP32 + default 2 + help + GPIO pin number to be used as LEDC channel 2 output. + + config LEDC_CH3_GPIO + int "LEDC channel 3 GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 5 if IDF_TARGET_ESP32 + default 3 + help + GPIO pin number to be used as LEDC channel 3 output. + +endmenu diff --git a/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c b/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c index fa99420d192..aa5ad6c0dfd 100644 --- a/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c +++ b/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c @@ -27,39 +27,35 @@ * * 3. You can also set a target duty directly without fading. * - * 4. On ESP32, GPIO18/19/4/5 are used as the LEDC outputs: - * GPIO18/19 are from the high speed channel group - * GPIO4/5 are from the low speed channel group - * - * On other targets, GPIO8/9/4/5 are used as the LEDC outputs, - * and they are all from the low speed channel group. + * 4. LEDC channel GPIO numbers can be selected in menuconfig + * (Example Configuration). See README for default pin mapping. + * On ESP32, CH0/1 use the high speed channel group and CH2/3 use + * the low speed channel group. On other targets, all channels use + * the low speed channel group. * * 5. All the LEDC outputs change the duty repeatedly. * */ +#define LEDC_CH0_GPIO CONFIG_LEDC_CH0_GPIO +#define LEDC_CH1_GPIO CONFIG_LEDC_CH1_GPIO +#define LEDC_CH2_GPIO CONFIG_LEDC_CH2_GPIO +#define LEDC_CH3_GPIO CONFIG_LEDC_CH3_GPIO + #if CONFIG_IDF_TARGET_ESP32 #define LEDC_HS_TIMER LEDC_TIMER_0 #define LEDC_HS_MODE LEDC_HIGH_SPEED_MODE -#define LEDC_HS_CH0_GPIO (18) #define LEDC_HS_CH0_CHANNEL LEDC_CHANNEL_0 -#define LEDC_HS_CH1_GPIO (19) #define LEDC_HS_CH1_CHANNEL LEDC_CHANNEL_1 #define LEDC_LS_TIMER LEDC_TIMER_1 #define LEDC_LS_MODE LEDC_LOW_SPEED_MODE -#define LEDC_LS_CH2_GPIO (4) #define LEDC_LS_CH2_CHANNEL LEDC_CHANNEL_2 -#define LEDC_LS_CH3_GPIO (5) #define LEDC_LS_CH3_CHANNEL LEDC_CHANNEL_3 #else #define LEDC_LS_TIMER LEDC_TIMER_1 #define LEDC_LS_MODE LEDC_LOW_SPEED_MODE -#define LEDC_LS_CH0_GPIO (8) #define LEDC_LS_CH0_CHANNEL LEDC_CHANNEL_0 -#define LEDC_LS_CH1_GPIO (9) #define LEDC_LS_CH1_CHANNEL LEDC_CHANNEL_1 -#define LEDC_LS_CH2_GPIO (2) #define LEDC_LS_CH2_CHANNEL LEDC_CHANNEL_2 -#define LEDC_LS_CH3_GPIO (3) #define LEDC_LS_CH3_CHANNEL LEDC_CHANNEL_3 #endif @@ -125,7 +121,7 @@ void app_main(void) { .channel = LEDC_HS_CH0_CHANNEL, .duty = 0, - .gpio_num = LEDC_HS_CH0_GPIO, + .gpio_num = LEDC_CH0_GPIO, .speed_mode = LEDC_HS_MODE, .hpoint = 0, .timer_sel = LEDC_HS_TIMER, @@ -134,7 +130,7 @@ void app_main(void) { .channel = LEDC_HS_CH1_CHANNEL, .duty = 0, - .gpio_num = LEDC_HS_CH1_GPIO, + .gpio_num = LEDC_CH1_GPIO, .speed_mode = LEDC_HS_MODE, .hpoint = 0, .timer_sel = LEDC_HS_TIMER, @@ -144,7 +140,7 @@ void app_main(void) { .channel = LEDC_LS_CH0_CHANNEL, .duty = 0, - .gpio_num = LEDC_LS_CH0_GPIO, + .gpio_num = LEDC_CH0_GPIO, .speed_mode = LEDC_LS_MODE, .hpoint = 0, .timer_sel = LEDC_LS_TIMER, @@ -153,7 +149,7 @@ void app_main(void) { .channel = LEDC_LS_CH1_CHANNEL, .duty = 0, - .gpio_num = LEDC_LS_CH1_GPIO, + .gpio_num = LEDC_CH1_GPIO, .speed_mode = LEDC_LS_MODE, .hpoint = 0, .timer_sel = LEDC_LS_TIMER, @@ -163,7 +159,7 @@ void app_main(void) { .channel = LEDC_LS_CH2_CHANNEL, .duty = 0, - .gpio_num = LEDC_LS_CH2_GPIO, + .gpio_num = LEDC_CH2_GPIO, .speed_mode = LEDC_LS_MODE, .hpoint = 0, .timer_sel = LEDC_LS_TIMER, @@ -172,7 +168,7 @@ void app_main(void) { .channel = LEDC_LS_CH3_CHANNEL, .duty = 0, - .gpio_num = LEDC_LS_CH3_GPIO, + .gpio_num = LEDC_CH3_GPIO, .speed_mode = LEDC_LS_MODE, .hpoint = 0, .timer_sel = LEDC_LS_TIMER, diff --git a/examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py b/examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py index 245b7d58c54..ff56ec35933 100644 --- a/examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py +++ b/examples/peripherals/ledc/ledc_fade/pytest_ledc_fade.py @@ -8,7 +8,6 @@ from pytest_embedded_idf.utils import soc_filtered_targets @pytest.mark.generic @idf_parametrize('target', soc_filtered_targets('SOC_LEDC_SUPPORTED == 1'), indirect=['target']) -@pytest.mark.temp_skip_ci(targets=['esp32h4'], reason='cannot pass') # TODO: IDF-15610 def test_ledc_fade_example(dut: IdfDut) -> None: # repeat to test at least two rounds of fade dut.expect_exact('1. LEDC fade up to duty = 4000')