From c403ec6b8f40e1145ac67f59e6c12490e69e8e6f Mon Sep 17 00:00:00 2001 From: muhaidong Date: Fri, 10 Apr 2026 15:02:04 +0800 Subject: [PATCH 1/5] feat(coex): support esp32s31 coexist --- components/esp_coex/Kconfig | 1 - components/esp_coex/lib | 2 +- components/esp_wifi/lib | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/components/esp_coex/Kconfig b/components/esp_coex/Kconfig index e2b83bc9ce9..2fdb5cdb3f6 100644 --- a/components/esp_coex/Kconfig +++ b/components/esp_coex/Kconfig @@ -12,7 +12,6 @@ menu "Wireless Coexistence" depends on (ESP_WIFI_ENABLED && BT_ENABLED) || \ (ESP_WIFI_ENABLED && IEEE802154_ENABLED) || \ (IEEE802154_ENABLED && BT_ENABLED) - default n if IDF_TARGET_ESP32S31 #TODO: enable coexistence for ESP32S31 default y select ESP_WIFI_STA_DISCONNECTED_PM_ENABLE if (ESP_WIFI_ENABLED) help diff --git a/components/esp_coex/lib b/components/esp_coex/lib index 28761900446..38891aba1b1 160000 --- a/components/esp_coex/lib +++ b/components/esp_coex/lib @@ -1 +1 @@ -Subproject commit 28761900446e46452e252c46092f54ec52fb4707 +Subproject commit 38891aba1b19841ea239ab399dc5f01f1bac6285 diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 71994a8dff9..200f265f07e 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 71994a8dff969bb03598e4b71f66065877cc3488 +Subproject commit 200f265f07ef0f295e13b90246ce2f850f45761a From afebdf49e0096facbeca19b08d3f158fd5d0577c Mon Sep 17 00:00:00 2001 From: muhaidong Date: Fri, 17 Apr 2026 15:31:40 +0800 Subject: [PATCH 2/5] fix(ci): add g_coex_i154_funcs_md5 check for esp32s31 --- components/esp_coex/test_md5/test_md5.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_coex/test_md5/test_md5.sh b/components/esp_coex/test_md5/test_md5.sh index dd3deb8875f..5cb27666977 100755 --- a/components/esp_coex/test_md5/test_md5.sh +++ b/components/esp_coex/test_md5/test_md5.sh @@ -91,7 +91,7 @@ echo "Checking libraries for target ${IDF_TARGET}..." check_md5_file_lib ${IDF_PATH}/components/esp_coex/include/private/esp_coexist_adapter.h g_coex_adapter_funcs_md5 case $IDF_TARGET in - esp32c6|esp32h2|esp32c5) + esp32c6|esp32h2|esp32c5|esp32s31) check_md5_file_lib ${IDF_PATH}/components/esp_coex/include/esp_coex_i154.h g_coex_i154_funcs_md5 ;; esac From a3be8db3a47af8171cf015cd6e32da853c8bceda Mon Sep 17 00:00:00 2001 From: muhaidong Date: Mon, 20 Apr 2026 11:04:07 +0800 Subject: [PATCH 3/5] feat(coex): support esp32s31 external coexist --- components/soc/esp32s31/include/soc/Kconfig.soc_caps.in | 8 ++++++++ components/soc/esp32s31/include/soc/soc_caps.h | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in index 3f78329b22e..69b79de6b80 100644 --- a/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in @@ -903,6 +903,14 @@ config SOC_UART_WAKEUP_SUPPORT_CHAR_SEQ_MODE bool default y +config SOC_COEX_HW_PTI + bool + default y + +config SOC_EXTERNAL_COEX_ADVANCE + bool + default y + config SOC_MODEM_CLOCK_IS_INDEPENDENT bool default y diff --git a/components/soc/esp32s31/include/soc/soc_caps.h b/components/soc/esp32s31/include/soc/soc_caps.h index afd9fb845fc..9cd56fc1d6c 100644 --- a/components/soc/esp32s31/include/soc/soc_caps.h +++ b/components/soc/esp32s31/include/soc/soc_caps.h @@ -384,6 +384,12 @@ #define SOC_UART_WAKEUP_SUPPORT_START_BIT_MODE (1) #define SOC_UART_WAKEUP_SUPPORT_CHAR_SEQ_MODE (1) +/*-------------------------- COEXISTENCE HARDWARE PTI CAPS -------------------------------*/ +#define SOC_COEX_HW_PTI (1) + +/*-------------------------- EXTERNAL COEXISTENCE CAPS -------------------------------------*/ +#define SOC_EXTERNAL_COEX_ADVANCE (1) /*!< HARDWARE EXTERNAL COEXISTENCE CAPS */ + // /*-------------------------- CLOCK SUBSYSTEM CAPS ----------------------------------------*/ #define SOC_MODEM_CLOCK_IS_INDEPENDENT (1) #define SOC_MODEM_CLOCK_SOC_PLL_SOURCE_CG_SUPPORTED (1) From 94bab9eea9f16234830e8a9c1c0fd88c8f38bd0b Mon Sep 17 00:00:00 2001 From: muhaidong Date: Mon, 20 Apr 2026 11:14:37 +0800 Subject: [PATCH 4/5] fix(coex): rename external coexist releated gpio sig map --- components/soc/esp32s31/include/soc/gpio_sig_map.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/soc/esp32s31/include/soc/gpio_sig_map.h b/components/soc/esp32s31/include/soc/gpio_sig_map.h index a7590976058..3be187c1278 100644 --- a/components/soc/esp32s31/include/soc/gpio_sig_map.h +++ b/components/soc/esp32s31/include/soc/gpio_sig_map.h @@ -48,6 +48,11 @@ #define GPIO_EXTERN_ACTIVE_PAD_OUT_IDX 19 #define GPIO_EXTERN_PRIORITY_PAD_IN_IDX 20 #define GPIO_EXTERN_PRIORITY_PAD_OUT_IDX 20 +/* Same GPIO matrix indices as EXTERN_* on other targets (used by esp_coex external coexist). */ +#define EXTERN_ACTIVE_I_IDX GPIO_EXTERN_ACTIVE_PAD_IN_IDX +#define EXTERN_ACTIVE_O_IDX GPIO_EXTERN_ACTIVE_PAD_OUT_IDX +#define EXTERN_PRIORITY_I_IDX GPIO_EXTERN_PRIORITY_PAD_IN_IDX +#define EXTERN_PRIORITY_O_IDX GPIO_EXTERN_PRIORITY_PAD_OUT_IDX #define GPIO_EVENT_MATRIX_IN0_IDX 21 #define GPIO_TASK_MATRIX_OUT0_IDX 21 #define GPIO_EVENT_MATRIX_IN1_IDX 22 From 322b1812b194c127bfd5911e42a40be79c8f7790 Mon Sep 17 00:00:00 2001 From: muhaidong Date: Mon, 20 Apr 2026 11:20:54 +0800 Subject: [PATCH 5/5] feat(coex): add external coex unit test for esp32s31 --- components/esp_coex/test_apps/.build-test-rules.yml | 4 ++-- .../esp_coex/test_apps/external_coex_function/README.md | 4 ++-- .../external_coex_function/main/test_enable_extern_coex.c | 3 +++ .../external_coex_function/pytest_external_coex_function.py | 4 +++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/components/esp_coex/test_apps/.build-test-rules.yml b/components/esp_coex/test_apps/.build-test-rules.yml index 164dd0b2dd4..21737a4ab0c 100644 --- a/components/esp_coex/test_apps/.build-test-rules.yml +++ b/components/esp_coex/test_apps/.build-test-rules.yml @@ -2,5 +2,5 @@ components/esp_coex/test_apps/: disable: - - if: IDF_TARGET not in ["esp32s2", "esp32s3", "esp32c3", "esp32c2", "esp32c6", "esp32h2", "esp32c5", "esp32c61"] - reason: only supported with s2, s3, c3, c2, c6, h2, c5 and c61 + - if: IDF_TARGET not in ["esp32s2", "esp32s3", "esp32c3", "esp32c2", "esp32c6", "esp32h2", "esp32c5", "esp32c61", "esp32s31"] + reason: only supported with s2, s3, c3, c2, c6, h2, c5, c61 and s31 diff --git a/components/esp_coex/test_apps/external_coex_function/README.md b/components/esp_coex/test_apps/external_coex_function/README.md index 703fb1bde35..a0d10bf872d 100644 --- a/components/esp_coex/test_apps/external_coex_function/README.md +++ b/components/esp_coex/test_apps/external_coex_function/README.md @@ -1,3 +1,3 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | --------- | diff --git a/components/esp_coex/test_apps/external_coex_function/main/test_enable_extern_coex.c b/components/esp_coex/test_apps/external_coex_function/main/test_enable_extern_coex.c index 63bba7efb24..84706ad490d 100644 --- a/components/esp_coex/test_apps/external_coex_function/main/test_enable_extern_coex.c +++ b/components/esp_coex/test_apps/external_coex_function/main/test_enable_extern_coex.c @@ -39,6 +39,9 @@ TEST_CASE("enable external coex", "[external_coex]") #elif CONFIG_IDF_TARGET_ESP32H2 #define EXTERNAL_COEX_CONF 0x600AD4A0 #define WDEV_RW_BT_COEX_EN (BIT(9)) +#elif CONFIG_IDF_TARGET_ESP32S31 +#define EXTERNAL_COEX_CONF 0x2010F4A0 +#define WDEV_RW_BT_COEX_EN (BIT(9)) #endif esp_extern_coex_work_mode_t mode = EXTERNAL_COEX_LEADER_ROLE; diff --git a/components/esp_coex/test_apps/external_coex_function/pytest_external_coex_function.py b/components/esp_coex/test_apps/external_coex_function/pytest_external_coex_function.py index 2ffc0cb4fb7..0a527748231 100644 --- a/components/esp_coex/test_apps/external_coex_function/pytest_external_coex_function.py +++ b/components/esp_coex/test_apps/external_coex_function/pytest_external_coex_function.py @@ -7,7 +7,9 @@ from pytest_embedded_idf.utils import idf_parametrize @pytest.mark.generic @idf_parametrize( - 'target', ['esp32h2', 'esp32c3', 'esp32s2', 'esp32s3', 'esp32c6', 'esp32c61', 'esp32c5'], indirect=['target'] + 'target', + ['esp32h2', 'esp32c3', 'esp32s2', 'esp32s3', 'esp32c6', 'esp32c61', 'esp32c5', 'esp32s31'], + indirect=['target'], ) def test_external_coex_unit_test(dut: Dut) -> None: dut.run_all_single_board_cases()