diff --git a/components/esp_coex/esp32s31/esp_coex_adapter.c b/components/esp_coex/esp32s31/esp_coex_adapter.c new file mode 100644 index 0000000000..858c8714c3 --- /dev/null +++ b/components/esp_coex/esp32s31/esp_coex_adapter.c @@ -0,0 +1,181 @@ +/* + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "freertos/portmacro.h" +#include "esp_heap_caps.h" +#include "esp_timer.h" +#include "soc/rtc.h" +#include "esp_private/esp_clk.h" +#include "private/esp_coexist_adapter.h" +#include "esp32s31/rom/ets_sys.h" +#include "private/esp_coexist_debug.h" + +#define TAG "esp_coex_adapter" + +#define OSI_FUNCS_TIME_BLOCKING 0xffffffff + +bool IRAM_ATTR esp_coex_common_env_is_chip_wrapper(void) +{ +#ifdef CONFIG_IDF_ENV_FPGA + return false; +#else + return true; +#endif +} + +void *esp_coex_common_spin_lock_create_wrapper(void) +{ + portMUX_TYPE tmp = portMUX_INITIALIZER_UNLOCKED; + void *mux = malloc(sizeof(portMUX_TYPE)); + + if (mux) { + memcpy(mux, &tmp, sizeof(portMUX_TYPE)); + return mux; + } + return NULL; +} + +uint32_t IRAM_ATTR esp_coex_common_int_disable_wrapper(void *wifi_int_mux) +{ + if (xPortInIsrContext()) { + portENTER_CRITICAL_ISR(wifi_int_mux); + } else { + portENTER_CRITICAL(wifi_int_mux); + } + + return 0; +} + +void IRAM_ATTR esp_coex_common_int_restore_wrapper(void *wifi_int_mux, uint32_t tmp) +{ + if (xPortInIsrContext()) { + portEXIT_CRITICAL_ISR(wifi_int_mux); + } else { + portEXIT_CRITICAL(wifi_int_mux); + } +} + +void IRAM_ATTR esp_coex_common_task_yield_from_isr_wrapper(void) +{ + portYIELD_FROM_ISR(); +} + +void *esp_coex_common_semphr_create_wrapper(uint32_t max, uint32_t init) +{ + return (void *)xSemaphoreCreateCounting(max, init); +} + +void esp_coex_common_semphr_delete_wrapper(void *semphr) +{ + vSemaphoreDelete(semphr); +} + +int32_t esp_coex_common_semphr_take_wrapper(void *semphr, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)xSemaphoreTake(semphr, portMAX_DELAY); + } else { + return (int32_t)xSemaphoreTake(semphr, block_time_tick); + } +} + +int32_t esp_coex_common_semphr_give_wrapper(void *semphr) +{ + return (int32_t)xSemaphoreGive(semphr); +} + +void IRAM_ATTR esp_coex_common_timer_disarm_wrapper(void *timer) +{ + ets_timer_disarm(timer); +} + +void esp_coex_common_timer_done_wrapper(void *ptimer) +{ + ets_timer_done(ptimer); +} + +void esp_coex_common_timer_setfn_wrapper(void *ptimer, void *pfunction, void *parg) +{ + ets_timer_setfn(ptimer, pfunction, parg); +} + +void IRAM_ATTR esp_coex_common_timer_arm_us_wrapper(void *ptimer, uint32_t us, bool repeat) +{ + ets_timer_arm_us(ptimer, us, repeat); +} + +uint32_t esp_coex_common_clk_slowclk_cal_get_wrapper(void) +{ + /* The bit width of WiFi light sleep clock calibration is 12 while the one of + * system is 19. It should shift 19 - 12 = 7. + */ + return (esp_clk_slowclk_cal_get() >> (RTC_CLK_CAL_FRACT - SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH)); +} + +void *IRAM_ATTR esp_coex_common_malloc_internal_wrapper(size_t size) +{ + return heap_caps_malloc(size, MALLOC_CAP_8BIT | MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); +} + +/* static wrapper */ + +static int32_t IRAM_ATTR esp_coex_semphr_take_from_isr_wrapper(void *semphr, void *hptw) +{ + return (int32_t)xSemaphoreTakeFromISR(semphr, hptw); +} + +static int32_t IRAM_ATTR esp_coex_semphr_give_from_isr_wrapper(void *semphr, void *hptw) +{ + return (int32_t)xSemaphoreGiveFromISR(semphr, hptw); +} + +static int esp_coexist_debug_matrix_init_wrapper(int evt, int sig, bool rev) +{ +#if CONFIG_ESP_COEX_GPIO_DEBUG + return esp_coexist_debug_matrix_init(evt, sig, rev); +#else + return ESP_ERR_NOT_SUPPORTED; +#endif +} + +static IRAM_ATTR int esp_coex_common_xtal_freq_get_wrapper(void) +{ + return rtc_clk_xtal_freq_get(); +} + +coex_adapter_funcs_t g_coex_adapter_funcs = { + ._version = COEX_ADAPTER_VERSION, + ._task_yield_from_isr = esp_coex_common_task_yield_from_isr_wrapper, + ._semphr_create = esp_coex_common_semphr_create_wrapper, + ._semphr_delete = esp_coex_common_semphr_delete_wrapper, + ._semphr_take_from_isr = esp_coex_semphr_take_from_isr_wrapper, + ._semphr_give_from_isr = esp_coex_semphr_give_from_isr_wrapper, + ._semphr_take = esp_coex_common_semphr_take_wrapper, + ._semphr_give = esp_coex_common_semphr_give_wrapper, + ._is_in_isr = xPortInIsrContext, + ._malloc_internal = esp_coex_common_malloc_internal_wrapper, + ._free = free, + ._esp_timer_get_time = esp_timer_get_time, + ._env_is_chip = esp_coex_common_env_is_chip_wrapper, + ._timer_disarm = esp_coex_common_timer_disarm_wrapper, + ._timer_done = esp_coex_common_timer_done_wrapper, + ._timer_setfn = esp_coex_common_timer_setfn_wrapper, + ._timer_arm_us = esp_coex_common_timer_arm_us_wrapper, + ._debug_matrix_init = esp_coexist_debug_matrix_init_wrapper, + ._xtal_freq_get = esp_coex_common_xtal_freq_get_wrapper, + ._magic = COEX_ADAPTER_MAGIC, +}; diff --git a/components/esp_coex/include/private/esp_coexist_internal.h b/components/esp_coex/include/private/esp_coexist_internal.h index 026f1f9fe0..eca1cb5fec 100644 --- a/components/esp_coex/include/private/esp_coexist_internal.h +++ b/components/esp_coex/include/private/esp_coexist_internal.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2018-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2018-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -325,6 +325,25 @@ int coex_schm_register_callback(coex_schm_callback_type_t type, void *callback); */ esp_err_t esp_coex_adapter_register(coex_adapter_funcs_t *funcs); +#if CONFIG_COEX_ISO_INT_SCHEME +/** + * @brief Register coexistence dynamic log functions. + * + * @param funcs : coexistence dynamic log functions + * @return : ESP_OK - success, other - failed + */ +esp_err_t esp_coex_dynamic_log_register(void *funcs); + +/** + * @brief Register coexistence iso end wifi callback function. + * + * @param is_reg : register or unregister + * @param funcs : coexistence iso end wifi function + * @return : ESP_OK - success, other - failed + */ +esp_err_t esp_coex_configure_iso_end_wifi_cb(bool is_reg, void *funcs); +#endif /* CONFIG_COEX_ISO_INT_SCHEME */ + #if CONFIG_EXTERNAL_COEX_ENABLE /** * @brief Set external coexistence advanced information, like working mode. diff --git a/components/esp_coex/test_md5/test_md5.sh b/components/esp_coex/test_md5/test_md5.sh index 429796bdfa..dd3deb8875 100755 --- a/components/esp_coex/test_md5/test_md5.sh +++ b/components/esp_coex/test_md5/test_md5.sh @@ -22,7 +22,7 @@ case $IDF_TARGET in esp32s3) PREFIX=xtensa-esp32s3-elf- ;; - esp32c2|esp32c3|esp32c6|esp32h2|esp32c5|esp32c61) + esp32c2|esp32c3|esp32c6|esp32h2|esp32c5|esp32c61|esp32s31) PREFIX=riscv32-esp-elf- ;; *) diff --git a/components/esp_hw_support/periph_ctrl.c b/components/esp_hw_support/periph_ctrl.c index dc28957858..661cb9874c 100644 --- a/components/esp_hw_support/periph_ctrl.c +++ b/components/esp_hw_support/periph_ctrl.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ diff --git a/components/esp_phy/esp32s31/include/btbb_retention_reg.h b/components/esp_phy/esp32s31/include/btbb_retention_reg.h new file mode 100644 index 0000000000..67191690ec --- /dev/null +++ b/components/esp_phy/esp32s31/include/btbb_retention_reg.h @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +// btbb sleep retention reg + +#define BB_PART_CNT 3 +#define BB_PART_0_SIZE 128 +#define BB_PART_1_SIZE 68 +#define BB_PART_2_SIZE 19 +#define BB_PART_0_ADDR 0x600A2000 +#define BB_PART_1_ADDR 0x600A2800 +#define BB_PART_2_ADDR 0x600A2C00 + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_phy/esp32s31/include/phy_init_data.h b/components/esp_phy/esp32s31/include/phy_init_data.h new file mode 100644 index 0000000000..e2eeb7078d --- /dev/null +++ b/components/esp_phy/esp32s31/include/phy_init_data.h @@ -0,0 +1,65 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef PHY_INIT_DATA_H +#define PHY_INIT_DATA_H /* don't use #pragma once here, we compile this file sometimes */ +#include +#include "esp_phy_init.h" +#include "esp_attr.h" +#include "sdkconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif +// constrain a value between 'low' and 'high', inclusive +#define LIMIT(val, low, high) ((val < low) ? low : (val > high) ? high : val) +#define PHY_INIT_MAGIC "PHYINIT" +#define PHY_INIT_MAGIC_LEN 8 // should be strlen(PHY_INIT_MAGIC) + 1 + +// define the lowest tx power as LOWEST_PHY_TX_POWER +#define PHY_TX_POWER_LOWEST LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 52) +#define PHY_TX_POWER_OFFSET 2 +#define PHY_TX_POWER_NUM 14 + +#if CONFIG_ESP_PHY_MULTIPLE_INIT_DATA_BIN +#define PHY_CRC_ALGORITHM 1 +#define PHY_COUNTRY_CODE_LEN 2 +#define PHY_INIT_DATA_TYPE_OFFSET 254 +#define PHY_SUPPORT_MULTIPLE_BIN_OFFSET 253 +#endif + +extern const char phy_init_magic_pre[]; +extern const esp_phy_init_data_t phy_init_data; +extern const char phy_init_magic_post[]; + +#if CONFIG_ESP_PHY_MULTIPLE_INIT_DATA_BIN +/** + * @brief PHY init data control information structure + */ +typedef struct { + uint8_t control_info_checksum[4]; /*!< 4-byte control information checksum */ + uint8_t multiple_bin_checksum[4]; /*!< 4-byte multiple bin checksum */ + uint8_t check_algorithm; /*!< check algorithm */ + uint8_t version; /*!< PHY init data bin version */ + uint8_t number; /*!< PHY init data bin number */ + uint8_t length[2]; /*!< Length of each PHY init data bin */ + uint8_t reserved[19]; /*!< 19-byte reserved */ +} __attribute__ ((packed)) phy_control_info_data_t; + +/** + * @brief Country corresponds to PHY init data type structure + */ +typedef struct { + NONSTRING_ATTR char cc[PHY_COUNTRY_CODE_LEN]; + uint8_t type; +} phy_country_to_bin_type_t; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PHY_INIT_DATA_H */ diff --git a/components/esp_phy/esp32s31/include/phy_init_deps.h b/components/esp_phy/esp32s31/include/phy_init_deps.h new file mode 100644 index 0000000000..caba288e46 --- /dev/null +++ b/components/esp_phy/esp32s31/include/phy_init_deps.h @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#define PHY_INIT_MODEM_CLOCK_REQUIRED_BITS 0x3BE7FF diff --git a/components/esp_phy/esp32s31/phy_init_data.c b/components/esp_phy/esp32s31/phy_init_data.c new file mode 100644 index 0000000000..5ac5db99fb --- /dev/null +++ b/components/esp_phy/esp32s31/phy_init_data.c @@ -0,0 +1,217 @@ +/* + * SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "sdkconfig.h" +#include "soc/soc_caps.h" +#include "phy_init_data.h" +#include "esp_private/phy.h" +#include "esp_check.h" + + +const char __attribute__((section(".rodata"))) phy_init_magic_pre[] = PHY_INIT_MAGIC; + +/** + * @brief Structure containing default recommended PHY initialization parameters. + */ +const esp_phy_init_data_t phy_init_data= { { + 0x1, + 0x0, + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x54), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x54), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x50), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x48), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x44), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x3C), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x3C), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x3C), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x4c), + LIMIT(CONFIG_ESP_PHY_MAX_TX_POWER * 4, 0, 0x48), + 0x0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0x51 +} }; + +const char __attribute__((section(".rodata"))) phy_init_magic_post[] = PHY_INIT_MAGIC; + +#if SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD + +#include "esp_private/sleep_retention.h" + +static const char* TAG = "phy_sleep"; + +static esp_err_t sleep_retention_wifi_bb_init(void *arg) +{ + #define N_REGS_WIFI_AGC() (130) + #define N_REGS_WIFI_TX() (30) + #define N_REGS_WIFI_NRX() (145) + #define N_REGS_WIFI_BB() (82) + #define N_REGS_WIFI_BRX() (39) + #define N_REGS_WIFI_FE_COEX() (21) + #define N_REGS_WIFI_FE_DATA() (34) + #define N_REGS_WIFI_FE_CTRL() (56) + #define N_REGS_WIFI_FE_WIFI() (21) + + const static sleep_retention_entries_config_t bb_regs_retention[] = { + [0] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b00, 0x600a7000, 0x600a7000, N_REGS_WIFI_AGC(), 0, 0), .owner = BIT(0) | BIT(1) }, /* AGC */ + [1] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b01, 0x600a7400, 0x600a7400, N_REGS_WIFI_TX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* TX */ + [2] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b02, 0x600a7800, 0x600a7800, N_REGS_WIFI_NRX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* NRX */ + [3] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b03, 0x600a7c00, 0x600a7c00, N_REGS_WIFI_BB(), 0, 0), .owner = BIT(0) | BIT(1) }, /* BB */ + [4] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b05, 0x600a0000, 0x600a0000, N_REGS_WIFI_FE_COEX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE COEX */ + [5] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b06, 0x600a8000, 0x600a8000, N_REGS_WIFI_BRX(), 0, 0), .owner = BIT(0) | BIT(1) }, /* BRX */ + [6] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b07, 0x600a0400, 0x600a0400, N_REGS_WIFI_FE_DATA(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE DATA */ + [7] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b08, 0x600a0800, 0x600a0800, N_REGS_WIFI_FE_CTRL(), 0, 0), .owner = BIT(0) | BIT(1) }, /* FE CTRL */ + [8] = { .config = REGDMA_LINK_CONTINUOUS_INIT(0x0b09, 0x600a0c00, 0x600a0c00, N_REGS_WIFI_FE_WIFI(), 0, 0), .owner = BIT(0) | BIT(1) } /* FE WiFi DATA */ + }; + esp_err_t err = sleep_retention_entries_create(bb_regs_retention, ARRAY_SIZE(bb_regs_retention), 3, SLEEP_RETENTION_MODULE_WIFI_BB); + ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate memory for modem (%s) retention", "WiFi BB"); + ESP_LOGD(TAG, "WiFi BB sleep retention initialization"); + return ESP_OK; +} + +void esp_phy_sleep_data_init(void) +{ + sleep_retention_module_init_param_t init_param = { + .cbs = { .create = { .handle = sleep_retention_wifi_bb_init, .arg = NULL } }, + .depends = RETENTION_MODULE_BITMAP_INIT(CLOCK_MODEM) + }; + esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_WIFI_BB, &init_param); + if (err != ESP_OK) { + ESP_LOGW(TAG, "WiFi BB sleep retention init failed"); + return; + } + err = sleep_retention_module_allocate(SLEEP_RETENTION_MODULE_WIFI_BB); + if (err != ESP_OK) { + ESP_LOGW(TAG, "failed to allocate sleep retention linked list for wifi bb retention"); + } +} + +void esp_phy_sleep_data_deinit(void) +{ + esp_err_t err = sleep_retention_module_free(SLEEP_RETENTION_MODULE_WIFI_BB); + if (err != ESP_OK) { + ESP_LOGW(TAG, "failed to free sleep retention linked list for wifi bb retention"); + return; + } + err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_WIFI_BB); + if (err != ESP_OK) { + ESP_LOGW(TAG, "WiFi BB sleep retention deinit failed"); + } +} + +#endif /* SOC_PM_MODEM_RETENTION_BY_REGDMA && CONFIG_MAC_BB_PD */ diff --git a/components/esp_phy/esp32s31/phy_multiple_init_data.bin b/components/esp_phy/esp32s31/phy_multiple_init_data.bin new file mode 100644 index 0000000000..0f754a2c49 Binary files /dev/null and b/components/esp_phy/esp32s31/phy_multiple_init_data.bin differ diff --git a/components/esp_phy/lib b/components/esp_phy/lib index 3dad662616..cef4eca1d2 160000 --- a/components/esp_phy/lib +++ b/components/esp_phy/lib @@ -1 +1 @@ -Subproject commit 3dad662616b80b89abed23f218fb8ef2222ceb63 +Subproject commit cef4eca1d256d7325017049c6152cb78182fcd67 diff --git a/components/esp_phy/src/phy_common.c b/components/esp_phy/src/phy_common.c index 7d27470dcc..48607d49e2 100644 --- a/components/esp_phy/src/phy_common.c +++ b/components/esp_phy/src/phy_common.c @@ -22,6 +22,10 @@ #include "hal/temperature_sensor_ll.h" #endif +#ifndef ANT_SEL0_IDX +#define ANT_SEL0_IDX PAD_MODEM_ANT_SEL0_IDX +#endif + static const char* TAG = "phy_comm"; static volatile uint16_t s_phy_modem_flag = 0; diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ld index 97194d3d23..4b26bffcc9 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ld @@ -574,7 +574,7 @@ ppSearchTxframe = 0x40001c38; ppSelectNextQueue = 0x40001c3c; ppSubFromAMPDU = 0x40001c40; ppTask = 0x40001c44; -ppTxPkt = 0x40001c48; +//ppTxPkt = 0x40001c48; ppTxProtoProc = 0x40001c4c; ppTxqUpdateBitmap = 0x40001c50; /*pp_coex_tx_request = 0x40001c54;*/ diff --git a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld index 3394f3e252..51932a64c1 100644 --- a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld +++ b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld @@ -759,7 +759,7 @@ ppSearchTxframe = 0x40001714; ppSelectNextQueue = 0x40001718; ppSubFromAMPDU = 0x4000171c; ppTask = 0x40001720; -ppTxPkt = 0x40001724; +//ppTxPkt = 0x40001724; ppTxProtoProc = 0x40001728; ppTxqUpdateBitmap = 0x4000172c; /*pp_coex_tx_request = 0x40001730;*/ diff --git a/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld b/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld index 0c7d024d67..ac40d0e98b 100644 --- a/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld +++ b/components/esp_rom/esp32c5/ld/esp32c5.rom.pp.ld @@ -192,7 +192,7 @@ ppSearchTxframe = 0x40000e98; ppSelectNextQueue = 0x40000e9c; ppSubFromAMPDU = 0x40000ea0; ppTask = 0x40000ea4; -ppTxPkt = 0x40000ea8; +//ppTxPkt = 0x40000ea8; ppTxProtoProc = 0x40000eac; ppTxqUpdateBitmap = 0x40000eb0; pp_coex_tx_request = 0x40000eb4; @@ -214,7 +214,7 @@ ppCalDeliNum = 0x40000ef0; ppRemoveHTC = 0x40000ef4; ppCheckTxHEAMPDUlength = 0x40000ef8; ppCertSetRate = 0x40000efc; -ppSelectTxFormat = 0x40000f00; +//ppSelectTxFormat = 0x40000f00; ppCalTxHEAMPDULength = 0x40000f04; pp_coex_tx_release = 0x40000f08; ppAdd2AMPDUTail = 0x40000f0c; diff --git a/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld b/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld index 8577f3a056..bcdb4df513 100644 --- a/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld +++ b/components/esp_rom/esp32c61/ld/esp32c61.rom.pp.ld @@ -192,7 +192,7 @@ ppSearchTxframe = 0x40000e10; ppSelectNextQueue = 0x40000e14; ppSubFromAMPDU = 0x40000e18; ppTask = 0x40000e1c; -ppTxPkt = 0x40000e20; +//ppTxPkt = 0x40000e20; ppTxProtoProc = 0x40000e24; ppTxqUpdateBitmap = 0x40000e28; pp_coex_tx_request = 0x40000e2c; @@ -213,7 +213,7 @@ ppRemoveHTC = 0x40000e64; ppRemoveHEAMPDUflags = 0x40000e68; ppCheckTxHEAMPDUlength = 0x40000e6c; ppCertSetRate = 0x40000e70; -ppSelectTxFormat = 0x40000e74; +//ppSelectTxFormat = 0x40000e74; ppCalTxHEAMPDULength = 0x40000e78; pp_coex_tx_release = 0x40000e7c; ppAdd2AMPDUTail = 0x40000e80; diff --git a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld index c76daafdee..c3a2f2e715 100644 --- a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +++ b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld @@ -1014,7 +1014,7 @@ ppSearchTxframe = 0x4000567c; ppSelectNextQueue = 0x40005688; ppSubFromAMPDU = 0x40005694; /* ppTask = 0x400056a0; */ -ppTxPkt = 0x400056ac; +//ppTxPkt = 0x400056ac; ppTxProtoProc = 0x400056b8; ppTxqUpdateBitmap = 0x400056c4; /*pp_coex_tx_request = 0x400056d0;*/ diff --git a/components/esp_rom/esp32s31/ld/esp32s31.rom.net80211.ld b/components/esp_rom/esp32s31/ld/esp32s31.rom.net80211.ld index 096dd38424..9f8591cfe8 100644 --- a/components/esp_rom/esp32s31/ld/esp32s31.rom.net80211.ld +++ b/components/esp_rom/esp32s31/ld/esp32s31.rom.net80211.ld @@ -41,7 +41,7 @@ ieee80211_is_tx_allowed = 0x2f800c8c; ieee80211_output_pending_eb = 0x2f800c90; ieee80211_output_process = 0x2f800c94; ieee80211_set_tx_desc = 0x2f800c98; -ieee80211_classify = 0x2f800c9c; +//ieee80211_classify = 0x2f800c9c; ieee80211_copy_eb_header = 0x2f800ca0; ieee80211_recycle_cache_eb = 0x2f800ca4; ieee80211_search_node = 0x2f800ca8; diff --git a/components/esp_rom/esp32s31/ld/esp32s31.rom.pp.ld b/components/esp_rom/esp32s31/ld/esp32s31.rom.pp.ld index 7e6f1806f3..f09b6961c7 100644 --- a/components/esp_rom/esp32s31/ld/esp32s31.rom.pp.ld +++ b/components/esp_rom/esp32s31/ld/esp32s31.rom.pp.ld @@ -27,7 +27,7 @@ esf_buf_recycle = 0x2f800d24; GetAccess = 0x2f800d28; hal_mac_is_low_rate_enabled = 0x2f800d2c; hal_mac_tx_get_blockack = 0x2f800d30; -hal_mac_tx_set_ppdu = 0x2f800d34; +//hal_mac_tx_set_ppdu = 0x2f800d34; hal_mac_tx_clr_mplen = 0x2f800d38; hal_mac_get_txq_state = 0x2f800d3c; hal_mac_clr_txq_state = 0x2f800d40; @@ -59,7 +59,7 @@ is_lmac_idle = 0x2f800da4; ic_get_he_rts_threshold_bytes = 0x2f800da8; lmacAdjustTimestamp = 0x2f800dac; lmacDiscardAgedMSDU = 0x2f800db0; -lmacDiscardMSDU = 0x2f800db4; +//lmacDiscardMSDU = 0x2f800db4; lmacEndFrameExchangeSequence = 0x2f800db8; lmacIsIdle = 0x2f800dbc; lmacIsLongFrame = 0x2f800dc0; @@ -115,7 +115,7 @@ pm_local_tsf_process = 0x2f800e84; pm_set_beacon_filter = 0x2f800e88; pm_is_in_wifi_slice_threshold = 0x2f800e8c; pm_is_waked = 0x2f800e90; -pm_keep_alive = 0x2f800e94; +//pm_keep_alive = 0x2f800e94; pm_on_beacon_rx = 0x2f800e98; pm_on_data_rx = 0x2f800e9c; pm_on_data_tx = 0x2f800ea0; @@ -127,13 +127,13 @@ pm_on_isr_twt_wake = 0x2f800eb4; pm_on_tsf_timer = 0x2f800eb8; pm_on_twt_force_tx = 0x2f800ebc; pm_parse_beacon = 0x2f800ec0; -pm_process_tim = 0x2f800ec4; +//pm_process_tim = 0x2f800ec4; pm_rx_beacon_process = 0x2f800ec8; pm_rx_data_process = 0x2f800ecc; pm_sleep = 0x2f800ed0; pm_sleep_for = 0x2f800ed4; pm_tbtt_process = 0x2f800ed8; -pm_tx_data_done_process = 0x2f800edc; +//pm_tx_data_done_process = 0x2f800edc; pm_allow_tx = 0x2f800ee0; pm_extend_tbtt_adaptive_servo = 0x2f800ee4; pm_scale_listen_interval = 0x2f800ee8; @@ -156,7 +156,7 @@ pm_clear_wakeup_signal = 0x2f800f28; pm_mac_disable_tsf_tbtt_soc_wakeup = 0x2f800f2c; pm_mac_disable_tsf_tbtt_modem_wakeup = 0x2f800f30; pm_mac_enable_tsf_tbtt_soc_wakeup = 0x2f800f34; -pm_mac_enable_tsf_tbtt_modem_wakeup = 0x2f800f38; +//pm_mac_enable_tsf_tbtt_modem_wakeup = 0x2f800f38; pm_mac_modem_params_rt_update = 0x2f800f3c; pm_update_at_next_beacon = 0x2f800f40; tbtt_adaptive_setup = 0x2f800f44; @@ -174,7 +174,7 @@ ppEmptyDelimiterLength = 0x2f800f70; ppEnqueueRxq = 0x2f800f74; ppEnqueueTxDone = 0x2f800f78; ppGetTxframe = 0x2f800f7c; -ppMapTxQueue = 0x2f800f80; +//ppMapTxQueue = 0x2f800f80; ppProcTxSecFrame = 0x2f800f84; ppProcessRxPktHdr = 0x2f800f88; ppProcessTxQ = 0x2f800f8c; @@ -183,7 +183,7 @@ ppRecycleAmpdu = 0x2f800f94; ppRecycleRxPkt = 0x2f800f98; ppResortTxAMPDU = 0x2f800f9c; ppResumeTxAMPDU = 0x2f800fa0; -ppRxFragmentProc = 0x2f800fa4; +//ppRxFragmentProc = 0x2f800fa4; ppRxPkt = 0x2f800fa8; ppRxProtoProc = 0x2f800fac; ppSearchTxQueue = 0x2f800fb0; @@ -191,7 +191,7 @@ ppSearchTxframe = 0x2f800fb4; ppSelectNextQueue = 0x2f800fb8; ppSubFromAMPDU = 0x2f800fbc; ppTask = 0x2f800fc0; -ppTxPkt = 0x2f800fc4; +//ppTxPkt = 0x2f800fc4; ppTxProtoProc = 0x2f800fc8; ppTxqUpdateBitmap = 0x2f800fcc; pp_coex_tx_request = 0x2f800fd0; @@ -211,7 +211,7 @@ ppCalDeliNum = 0x2f801004; ppRemoveHTC = 0x2f801008; ppCheckTxHEAMPDUlength = 0x2f80100c; ppCertSetRate = 0x2f801010; -ppSelectTxFormat = 0x2f801014; +//ppSelectTxFormat = 0x2f801014; ppCalTxHEAMPDULength = 0x2f801018; pp_coex_tx_release = 0x2f80101c; ppAdd2AMPDUTail = 0x2f801020; @@ -227,7 +227,7 @@ rcampduuprate = 0x2f801044; rcClearCurAMPDUSched = 0x2f801048; rcClearCurSched = 0x2f80104c; rcClearCurStat = 0x2f801050; -rcGetSched = 0x2f801054; +//rcGetSched = 0x2f801054; rcLowerSched = 0x2f801058; rcSetTxAmpduLimit = 0x2f80105c; rcTxUpdatePer = 0x2f801060; diff --git a/components/esp_system/port/soc/esp32s31/clk.c b/components/esp_system/port/soc/esp32s31/clk.c index 3e478e55ea..468c4ccd0f 100644 --- a/components/esp_system/port/soc/esp32s31/clk.c +++ b/components/esp_system/port/soc/esp32s31/clk.c @@ -23,6 +23,7 @@ #include "hal/wdt_hal.h" #endif #include "esp_private/esp_sleep_internal.h" +#include "esp_private/esp_modem_clock.h" #include "esp_private/periph_ctrl.h" #include "esp_private/esp_clk.h" #include "esp_private/esp_pmu.h" @@ -186,5 +187,11 @@ void rtc_clk_select_rtc_slow_clk(void) */ __attribute__((weak)) void esp_perip_clk_init(void) { - +#if CONFIG_ESP_WIFI_ENABLED + soc_rtc_slow_clk_src_t rtc_slow_clk_src = rtc_clk_slow_src_get(); + modem_clock_lpclk_src_t modem_lpclk_src = (modem_clock_lpclk_src_t)( + (rtc_slow_clk_src == SOC_RTC_SLOW_CLK_SRC_XTAL32K) ? MODEM_CLOCK_LPCLK_SRC_XTAL32K + : MODEM_CLOCK_LPCLK_SRC_RC_SLOW); + modem_clock_select_lp_clock_source(PERIPH_WIFI_MODULE, modem_lpclk_src, 0); +#endif } diff --git a/components/esp_wifi/esp32s31/esp_adapter.c b/components/esp_wifi/esp32s31/esp_adapter.c new file mode 100644 index 0000000000..b3234d79ee --- /dev/null +++ b/components/esp_wifi/esp32s31/esp_adapter.c @@ -0,0 +1,778 @@ +/* + * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "freertos/semphr.h" +#include "freertos/event_groups.h" +#include "freertos/portmacro.h" +#include "riscv/interrupt.h" +#include "esp_types.h" +#include "esp_random.h" +#include "esp_mac.h" +#include "esp_task.h" +#include "esp_intr_alloc.h" +#include "esp_attr.h" +#include "esp_log.h" +#include "esp_event.h" +#include "esp_heap_caps.h" +#include "esp_timer.h" +#include "esp_private/esp_modem_clock.h" +#include "esp_private/wifi_os_adapter.h" +#include "esp_private/wifi.h" +#ifdef CONFIG_ESP_PHY_ENABLED +#include "esp_phy_init.h" +#include "phy_init_data.h" +#endif +#include "soc/rtc_cntl_periph.h" +#include "soc/rtc.h" +#include "esp_private/periph_ctrl.h" +#include "esp_private/esp_clk.h" +#include "nvs.h" +#include "os.h" +#include "esp_smartconfig.h" +#ifdef CONFIG_ESP_COEX_ENABLED +#include "private/esp_coexist_internal.h" +#endif +#include "esp32s31/rom/ets_sys.h" +#include "private/esp_modem_wrapper.h" +#include "esp_private/esp_modem_clock.h" + +#if SOC_PM_MODEM_RETENTION_BY_REGDMA +#include "esp_private/esp_regdma.h" +#include "esp_private/sleep_retention.h" +#endif + +#define TAG "esp_adapter" + +#ifdef CONFIG_PM_ENABLE +extern void wifi_apb80m_request(void); +extern void wifi_apb80m_release(void); +#endif + +IRAM_ATTR void *wifi_malloc(size_t size) +{ +#if CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP + return heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL); +#else + return malloc(size); +#endif +} + +IRAM_ATTR void *wifi_realloc(void *ptr, size_t size) +{ +#if CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP + return heap_caps_realloc_prefer(ptr, size, 2, MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL); +#else + return realloc(ptr, size); +#endif +} + +IRAM_ATTR void *wifi_calloc(size_t n, size_t size) +{ +#if CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP + return heap_caps_calloc_prefer(n, size, 2, MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL); +#else + return calloc(n, size); +#endif +} + +static void *IRAM_ATTR wifi_zalloc_wrapper(size_t size) +{ + void *ptr = wifi_calloc(1, size); + return ptr; +} + +wifi_static_queue_t *wifi_create_queue(int queue_len, int item_size) +{ + wifi_static_queue_t *queue = NULL; + + queue = (wifi_static_queue_t *)heap_caps_malloc(sizeof(wifi_static_queue_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + if (!queue) { + return NULL; + } + +#if CONFIG_SPIRAM_USE_MALLOC + /* Wi-Fi still use internal RAM */ + + queue->storage = heap_caps_calloc(1, sizeof(StaticQueue_t) + (queue_len * item_size), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + if (!queue->storage) { + goto _error; + } + + queue->handle = xQueueCreateStatic(queue_len, item_size, ((uint8_t*)(queue->storage)) + sizeof(StaticQueue_t), (StaticQueue_t*)(queue->storage)); + + if (!queue->handle) { + goto _error; + } + + return queue; + +_error: + if (queue) { + if (queue->storage) { + free(queue->storage); + } + + free(queue); + } + + return NULL; +#else + queue->handle = xQueueCreate(queue_len, item_size); + return queue; +#endif +} + +void wifi_delete_queue(wifi_static_queue_t *queue) +{ + if (queue) { + vQueueDelete(queue->handle); +#if CONFIG_SPIRAM_USE_MALLOC + if (queue->storage) { + free(queue->storage); + } +#endif + free(queue); + } +} + +static void *wifi_create_queue_wrapper(int queue_len, int item_size) +{ + return wifi_create_queue(queue_len, item_size); +} + +static void wifi_delete_queue_wrapper(void *queue) +{ + wifi_delete_queue(queue); +} + +static void set_intr_wrapper(int32_t cpu_no, uint32_t intr_source, uint32_t intr_num, int32_t intr_prio) +{ + esp_rom_route_intr_matrix(cpu_no, intr_source, intr_num); + esprv_int_set_priority(intr_num, intr_prio); + esprv_int_set_type(intr_num, INTR_TYPE_LEVEL); +} + +static void clear_intr_wrapper(uint32_t intr_source, uint32_t intr_num) +{ + +} + +static void set_isr_wrapper(int32_t n, void *f, void *arg) +{ + intr_handler_set(n, (intr_handler_t)f, arg); +} + +static void enable_intr_wrapper(uint32_t intr_mask) +{ + esprv_int_enable(intr_mask); +} + +static void disable_intr_wrapper(uint32_t intr_mask) +{ + esprv_int_disable(intr_mask); +} + +static bool IRAM_ATTR is_from_isr_wrapper(void) +{ + return !xPortCanYield(); +} + +static void wifi_thread_semphr_free(void *data) +{ + SemaphoreHandle_t *sem = (SemaphoreHandle_t *)(data); + + if (sem) { + vSemaphoreDelete(sem); + } +} + +static void *wifi_thread_semphr_get_wrapper(void) +{ + static bool s_wifi_thread_sem_key_init = false; + static pthread_key_t s_wifi_thread_sem_key; + SemaphoreHandle_t sem = NULL; + + if (s_wifi_thread_sem_key_init == false) { + if (0 != pthread_key_create(&s_wifi_thread_sem_key, wifi_thread_semphr_free)) { + return NULL; + } + s_wifi_thread_sem_key_init = true; + } + + sem = pthread_getspecific(s_wifi_thread_sem_key); + if (!sem) { + sem = xSemaphoreCreateCounting(1, 0); + if (sem) { + pthread_setspecific(s_wifi_thread_sem_key, sem); + ESP_LOGV(TAG, "thread sem create: sem=%p", sem); + } + } + + ESP_LOGV(TAG, "thread sem get: sem=%p", sem); + return (void *)sem; +} + +static void *recursive_mutex_create_wrapper(void) +{ + return (void *)xSemaphoreCreateRecursiveMutex(); +} + +static void *mutex_create_wrapper(void) +{ + return (void *)xSemaphoreCreateMutex(); +} + +static void mutex_delete_wrapper(void *mutex) +{ + vSemaphoreDelete(mutex); +} + +static int32_t IRAM_ATTR mutex_lock_wrapper(void *mutex) +{ + return (int32_t)xSemaphoreTakeRecursive(mutex, portMAX_DELAY); +} + +static int32_t IRAM_ATTR mutex_unlock_wrapper(void *mutex) +{ + return (int32_t)xSemaphoreGiveRecursive(mutex); +} + +static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size) +{ + StaticQueue_t *queue_buffer = heap_caps_malloc_prefer(sizeof(StaticQueue_t) + (queue_len * item_size), 2, + MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM, + MALLOC_CAP_DEFAULT | MALLOC_CAP_INTERNAL); + if (!queue_buffer) { + return NULL; + } + QueueHandle_t queue_handle = xQueueCreateStatic(queue_len, item_size, (uint8_t *)queue_buffer + sizeof(StaticQueue_t), + queue_buffer); + if (!queue_handle) { + free(queue_buffer); + return NULL; + } + + return (void *)queue_handle; +} + +static void queue_delete_wrapper(void *queue) +{ + if (queue) { + StaticQueue_t *queue_buffer = NULL; + xQueueGetStaticBuffers(queue, NULL, &queue_buffer); + vQueueDelete(queue); + if (queue_buffer) { + free(queue_buffer); + } + } +} + +static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)xQueueSend(queue, item, portMAX_DELAY); + } else { + return (int32_t)xQueueSend(queue, item, block_time_tick); + } +} + +static int32_t IRAM_ATTR queue_send_from_isr_wrapper(void *queue, void *item, void *hptw) +{ + return (int32_t)xQueueSendFromISR(queue, item, hptw); +} + +static int32_t queue_send_to_back_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + return (int32_t)xQueueGenericSend(queue, item, block_time_tick, queueSEND_TO_BACK); +} + +static int32_t queue_send_to_front_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + return (int32_t)xQueueGenericSend(queue, item, block_time_tick, queueSEND_TO_FRONT); +} + +static int32_t queue_recv_wrapper(void *queue, void *item, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)xQueueReceive(queue, item, portMAX_DELAY); + } else { + return (int32_t)xQueueReceive(queue, item, block_time_tick); + } +} + +static uint32_t event_group_wait_bits_wrapper(void *event, uint32_t bits_to_wait_for, int clear_on_exit, int wait_for_all_bits, uint32_t block_time_tick) +{ + if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) { + return (uint32_t)xEventGroupWaitBits(event, bits_to_wait_for, clear_on_exit, wait_for_all_bits, portMAX_DELAY); + } else { + return (uint32_t)xEventGroupWaitBits(event, bits_to_wait_for, clear_on_exit, wait_for_all_bits, block_time_tick); + } +} + +static int32_t task_create_pinned_to_core_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id) +{ + return (uint32_t)xTaskCreatePinnedToCore(task_func, name, stack_depth, param, prio, task_handle, (core_id < portNUM_PROCESSORS ? core_id : tskNO_AFFINITY)); +} + +static int32_t task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle) +{ + return (uint32_t)xTaskCreate(task_func, name, stack_depth, param, prio, task_handle); +} + +static int32_t IRAM_ATTR task_ms_to_tick_wrapper(uint32_t ms) +{ + return (int32_t)(ms / portTICK_PERIOD_MS); +} + +static int32_t task_get_max_priority_wrapper(void) +{ + return (int32_t)(configMAX_PRIORITIES); +} + +static int32_t esp_event_post_wrapper(const char *event_base, int32_t event_id, void *event_data, size_t event_data_size, uint32_t ticks_to_wait) +{ + if (ticks_to_wait == OSI_FUNCS_TIME_BLOCKING) { + return (int32_t)esp_event_post(event_base, event_id, event_data, event_data_size, portMAX_DELAY); + } else { + return (int32_t)esp_event_post(event_base, event_id, event_data, event_data_size, ticks_to_wait); + } +} + +static void IRAM_ATTR wifi_apb80m_request_wrapper(void) +{ +#ifdef CONFIG_PM_ENABLE + wifi_apb80m_request(); +#endif +} + +static void IRAM_ATTR wifi_apb80m_release_wrapper(void) +{ +#ifdef CONFIG_PM_ENABLE + wifi_apb80m_release(); +#endif +} + +static void IRAM_ATTR timer_arm_wrapper(void *timer, uint32_t tmout, bool repeat) +{ + ets_timer_arm(timer, tmout, repeat); +} + +static void wifi_reset_mac_wrapper(void) +{ + modem_clock_module_mac_reset(PERIPH_WIFI_MODULE); +} + +static void wifi_clock_enable_wrapper(void) +{ + wifi_module_enable(); +} + +static void wifi_clock_disable_wrapper(void) +{ + wifi_module_disable(); +} + +static int get_time_wrapper(void *t) +{ + return os_get_time(t); +} + +static void *IRAM_ATTR realloc_internal_wrapper(void *ptr, size_t size) +{ + return heap_caps_realloc(ptr, size, MALLOC_CAP_8BIT | MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); +} + +static void *IRAM_ATTR calloc_internal_wrapper(size_t n, size_t size) +{ + return heap_caps_calloc(n, size, MALLOC_CAP_8BIT | MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); +} + +static void *IRAM_ATTR zalloc_internal_wrapper(size_t size) +{ + void *ptr = heap_caps_calloc(1, size, MALLOC_CAP_8BIT | MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); + return ptr; +} + +static esp_err_t nvs_open_wrapper(const char *name, unsigned int open_mode, nvs_handle_t *out_handle) +{ + return nvs_open(name, (nvs_open_mode_t)open_mode, out_handle); +} + +static void esp_log_writev_wrapper(unsigned int level, const char *tag, const char *format, va_list args) +{ + return esp_log_writev((esp_log_level_t)level, tag, format, args); +} + +static void esp_log_write_wrapper(unsigned int level, const char *tag, const char *format, ...) +{ + va_list list; + va_start(list, format); + esp_log_writev((esp_log_level_t)level, tag, format, list); + va_end(list); +} + +static esp_err_t esp_read_mac_wrapper(uint8_t *mac, unsigned int type) +{ + return esp_read_mac(mac, (esp_mac_type_t)type); +} + +static int coex_init_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_init(); +#else + return 0; +#endif +} + +static void coex_deinit_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + coex_deinit(); +#endif +} + +static int coex_enable_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_enable(); +#else + return 0; +#endif +} + +static void coex_disable_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + coex_disable(); +#endif +} + +static IRAM_ATTR uint32_t coex_status_get_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_status_get(COEX_STATUS_GET_WIFI_BITMAP); +#else + return 0; +#endif +} + +static int coex_wifi_request_wrapper(uint32_t event, uint32_t latency, uint32_t duration) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_wifi_request(event, latency, duration); +#else + return 0; +#endif +} + +static IRAM_ATTR int coex_wifi_release_wrapper(uint32_t event) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_wifi_release(event); +#else + return 0; +#endif +} + +static int coex_wifi_channel_set_wrapper(uint8_t primary, uint8_t secondary) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_wifi_channel_set(primary, secondary); +#else + return 0; +#endif +} + +static IRAM_ATTR int coex_event_duration_get_wrapper(uint32_t event, uint32_t *duration) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_event_duration_get(event, duration); +#else + return 0; +#endif +} + +static int coex_pti_get_wrapper(uint32_t event, uint8_t *pti) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_pti_get(event, pti); +#else + return 0; +#endif +} + +static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + coex_schm_status_bit_clear(type, status); +#endif +} + +static void coex_schm_status_bit_set_wrapper(uint32_t type, uint32_t status) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + coex_schm_status_bit_set(type, status); +#endif +} + +static IRAM_ATTR int coex_schm_interval_set_wrapper(uint32_t interval) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_schm_interval_set(interval); +#else + return 0; +#endif +} + +static uint32_t coex_schm_interval_get_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_schm_interval_get(); +#else + return 0; +#endif +} + +static uint8_t coex_schm_curr_period_get_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_schm_curr_period_get(); +#else + return 0; +#endif +} + +static void *coex_schm_curr_phase_get_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_schm_curr_phase_get(); +#else + return NULL; +#endif +} + +static int coex_register_start_cb_wrapper(int (* cb)(void)) +{ +#if CONFIG_SW_COEXIST_ENABLE + return coex_register_start_cb(cb); +#else + return 0; +#endif +} + +static int coex_schm_process_restart_wrapper(void) +{ +#if CONFIG_SW_COEXIST_ENABLE + return coex_schm_process_restart(); +#else + return 0; +#endif +} + +static int coex_schm_register_cb_wrapper(int type, int(*cb)(int)) +{ +#if CONFIG_SW_COEXIST_ENABLE + return coex_schm_register_callback(type, cb); +#else + return 0; +#endif +} + +static int coex_schm_flexible_period_set_wrapper(uint8_t period) +{ +#if CONFIG_ESP_COEX_POWER_MANAGEMENT + return coex_schm_flexible_period_set(period); +#else + return 0; +#endif +} + +static uint8_t coex_schm_flexible_period_get_wrapper(void) +{ +#if CONFIG_ESP_COEX_POWER_MANAGEMENT + return coex_schm_flexible_period_get(); +#else + return 1; +#endif +} + +static void * coex_schm_get_phase_by_idx_wrapper(int phase_idx) +{ +#if CONFIG_SW_COEXIST_ENABLE || CONFIG_EXTERNAL_COEX_ENABLE + return coex_schm_get_phase_by_idx(phase_idx); +#else + return NULL; +#endif +} + +static int coex_configure_preemption_end_cb_wrapper(bool is_register, int(*cb)(uint32_t)) +{ +#if CONFIG_SW_COEXIST_ENABLE && CONFIG_COEX_ISO_INT_SCHEME + return esp_coex_configure_iso_end_wifi_cb(is_register, cb); +#else + return 0; +#endif +} + +static void IRAM_ATTR esp_empty_wrapper(void) +{ + +} + +extern void set_bb_wdg(bool busy_chk, bool srch_chk, uint16_t max_busy, uint16_t max_srch, bool rst_en, bool int_en, bool clr); + +static void esp_phy_enable_wrapper(void) +{ + esp_phy_enable(PHY_MODEM_WIFI); + phy_wifi_enable_set(1); + //disable bb idle check(max: 139ms) for temporary to avoid unexpected RXTXPANIC + //TODO + set_bb_wdg(true, false, 0x18, 0xaa, false, false, false); +} + +static void esp_phy_disable_wrapper(void) +{ + phy_wifi_enable_set(0); + esp_phy_disable(PHY_MODEM_WIFI); +} + +wifi_osi_funcs_t g_wifi_osi_funcs = { + ._version = ESP_WIFI_OS_ADAPTER_VERSION, + ._env_is_chip = esp_coex_common_env_is_chip_wrapper, + ._set_intr = set_intr_wrapper, + ._clear_intr = clear_intr_wrapper, + ._set_isr = set_isr_wrapper, + ._ints_on = enable_intr_wrapper, + ._ints_off = disable_intr_wrapper, + ._is_from_isr = is_from_isr_wrapper, + ._spin_lock_create = esp_coex_common_spin_lock_create_wrapper, + ._spin_lock_delete = free, + ._wifi_int_disable = esp_coex_common_int_disable_wrapper, + ._wifi_int_restore = esp_coex_common_int_restore_wrapper, + ._task_yield_from_isr = esp_coex_common_task_yield_from_isr_wrapper, + ._semphr_create = esp_coex_common_semphr_create_wrapper, + ._semphr_delete = esp_coex_common_semphr_delete_wrapper, + ._semphr_take = esp_coex_common_semphr_take_wrapper, + ._semphr_give = esp_coex_common_semphr_give_wrapper, + ._wifi_thread_semphr_get = wifi_thread_semphr_get_wrapper, + ._mutex_create = mutex_create_wrapper, + ._recursive_mutex_create = recursive_mutex_create_wrapper, + ._mutex_delete = mutex_delete_wrapper, + ._mutex_lock = mutex_lock_wrapper, + ._mutex_unlock = mutex_unlock_wrapper, + ._queue_create = queue_create_wrapper, + ._queue_delete = queue_delete_wrapper, + ._queue_send = queue_send_wrapper, + ._queue_send_from_isr = queue_send_from_isr_wrapper, + ._queue_send_to_back = queue_send_to_back_wrapper, + ._queue_send_to_front = queue_send_to_front_wrapper, + ._queue_recv = queue_recv_wrapper, + ._queue_msg_waiting = (uint32_t(*)(void *))uxQueueMessagesWaiting, + ._event_group_create = (void *(*)(void))xEventGroupCreate, + ._event_group_delete = (void(*)(void *))vEventGroupDelete, + ._event_group_set_bits = (uint32_t(*)(void *, uint32_t))xEventGroupSetBits, + ._event_group_clear_bits = (uint32_t(*)(void *, uint32_t))xEventGroupClearBits, + ._event_group_wait_bits = event_group_wait_bits_wrapper, + ._task_create_pinned_to_core = task_create_pinned_to_core_wrapper, + ._task_create = task_create_wrapper, + ._task_delete = (void(*)(void *))vTaskDelete, + ._task_delay = vTaskDelay, + ._task_ms_to_tick = task_ms_to_tick_wrapper, + ._task_get_current_task = (void *(*)(void))xTaskGetCurrentTaskHandle, + ._task_get_max_priority = task_get_max_priority_wrapper, + ._malloc = malloc, + ._free = free, + ._event_post = esp_event_post_wrapper, + ._get_free_heap_size = esp_get_free_internal_heap_size, + ._rand = esp_random, + ._dport_access_stall_other_cpu_start_wrap = esp_empty_wrapper, + ._dport_access_stall_other_cpu_end_wrap = esp_empty_wrapper, + ._wifi_apb80m_request = wifi_apb80m_request_wrapper, + ._wifi_apb80m_release = wifi_apb80m_release_wrapper, + ._phy_disable = esp_phy_disable_wrapper, + ._phy_enable = esp_phy_enable_wrapper, + ._phy_update_country_info = esp_phy_update_country_info, + ._read_mac = esp_read_mac_wrapper, + ._timer_arm = timer_arm_wrapper, + ._timer_disarm = esp_coex_common_timer_disarm_wrapper, + ._timer_done = esp_coex_common_timer_done_wrapper, + ._timer_setfn = esp_coex_common_timer_setfn_wrapper, + ._timer_arm_us = esp_coex_common_timer_arm_us_wrapper, + ._wifi_reset_mac = wifi_reset_mac_wrapper, + ._wifi_clock_enable = wifi_clock_enable_wrapper, + ._wifi_clock_disable = wifi_clock_disable_wrapper, + ._wifi_rtc_enable_iso = esp_empty_wrapper, + ._wifi_rtc_disable_iso = esp_empty_wrapper, + ._esp_timer_get_time = esp_timer_get_time, + ._nvs_set_i8 = nvs_set_i8, + ._nvs_get_i8 = nvs_get_i8, + ._nvs_set_u8 = nvs_set_u8, + ._nvs_get_u8 = nvs_get_u8, + ._nvs_set_u16 = nvs_set_u16, + ._nvs_get_u16 = nvs_get_u16, + ._nvs_open = nvs_open_wrapper, + ._nvs_close = nvs_close, + ._nvs_commit = nvs_commit, + ._nvs_set_blob = nvs_set_blob, + ._nvs_get_blob = nvs_get_blob, + ._nvs_erase_key = nvs_erase_key, + ._get_random = os_get_random, + ._get_time = get_time_wrapper, + ._random = os_random, + ._slowclk_cal_get = esp_coex_common_clk_slowclk_cal_get_wrapper, + ._log_write = esp_log_write_wrapper, + ._log_writev = esp_log_writev_wrapper, + ._log_timestamp = esp_log_timestamp, + ._malloc_internal = esp_coex_common_malloc_internal_wrapper, + ._realloc_internal = realloc_internal_wrapper, + ._calloc_internal = calloc_internal_wrapper, + ._zalloc_internal = zalloc_internal_wrapper, + ._wifi_malloc = wifi_malloc, + ._wifi_realloc = wifi_realloc, + ._wifi_calloc = wifi_calloc, + ._wifi_zalloc = wifi_zalloc_wrapper, + ._wifi_create_queue = wifi_create_queue_wrapper, + ._wifi_delete_queue = wifi_delete_queue_wrapper, + ._coex_init = coex_init_wrapper, + ._coex_deinit = coex_deinit_wrapper, + ._coex_enable = coex_enable_wrapper, + ._coex_disable = coex_disable_wrapper, + ._coex_status_get = coex_status_get_wrapper, + ._coex_wifi_request = coex_wifi_request_wrapper, + ._coex_wifi_release = coex_wifi_release_wrapper, + ._coex_wifi_channel_set = coex_wifi_channel_set_wrapper, + ._coex_event_duration_get = coex_event_duration_get_wrapper, + ._coex_pti_get = coex_pti_get_wrapper, + ._coex_schm_status_bit_clear = coex_schm_status_bit_clear_wrapper, + ._coex_schm_status_bit_set = coex_schm_status_bit_set_wrapper, + ._coex_schm_interval_set = coex_schm_interval_set_wrapper, + ._coex_schm_interval_get = coex_schm_interval_get_wrapper, + ._coex_schm_curr_period_get = coex_schm_curr_period_get_wrapper, + ._coex_schm_curr_phase_get = coex_schm_curr_phase_get_wrapper, + ._coex_register_start_cb = coex_register_start_cb_wrapper, +#if SOC_PM_MODEM_RETENTION_BY_REGDMA + ._regdma_link_set_write_wait_content = regdma_link_set_write_wait_content, + ._sleep_retention_find_link_by_id = sleep_retention_find_link_by_id, +#endif + ._coex_schm_process_restart = coex_schm_process_restart_wrapper, + ._coex_schm_register_cb = coex_schm_register_cb_wrapper, + ._coex_schm_flexible_period_set = coex_schm_flexible_period_set_wrapper, + ._coex_schm_flexible_period_get = coex_schm_flexible_period_get_wrapper, + ._coex_schm_get_phase_by_idx = coex_schm_get_phase_by_idx_wrapper, + ._coex_configure_preemption_end_cb = coex_configure_preemption_end_cb_wrapper, + ._magic = ESP_WIFI_OS_ADAPTER_MAGIC, +}; diff --git a/components/esp_wifi/include/esp_private/esp_wifi_he_types_private.h b/components/esp_wifi/include/esp_private/esp_wifi_he_types_private.h index f6b7309e45..43382c5db5 100644 --- a/components/esp_wifi/include/esp_private/esp_wifi_he_types_private.h +++ b/components/esp_wifi/include/esp_private/esp_wifi_he_types_private.h @@ -189,7 +189,7 @@ typedef struct { uint32_t txbf; uint32_t dcm; } nonmimo[ESP_TEST_RX_MU_USER_NUM]; -#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 +#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32S31 uint32_t mu_bru_id_0: 16; uint32_t mu_bru_id_bssidx: 16; uint32_t mu_bru_id_2047: 16; @@ -200,7 +200,7 @@ typedef struct { #endif } esp_test_rx_mu_statistics_t; //10932 bytes -#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 +#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32S31 typedef struct { uint32_t legacy; uint32_t legacy_noeb; @@ -271,6 +271,10 @@ typedef struct { int8_t min_mu_data_rssi; int8_t max_mu_data_rssi; float avg_mu_data_rssi; +#elif CONFIG_IDF_TARGET_ESP32S31 + int8_t rx_min_rssi[4]; + int8_t rx_max_rssi[4]; + float avg_rx_rssi[4]; #endif } esp_test_rx_statistics_t; //140 bytes @@ -437,7 +441,7 @@ typedef struct { uint16_t rxhung_statis; uint16_t txhung_statis; uint32_t rxtxhung; -#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 +#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32S31 uint32_t rxtxpanic; uint8_t bf_ndp_timeout; uint8_t bf_report_err; diff --git a/components/esp_wifi/include/esp_private/wifi_os_adapter.h b/components/esp_wifi/include/esp_private/wifi_os_adapter.h index ad06dce03f..1d373a2649 100644 --- a/components/esp_wifi/include/esp_private/wifi_os_adapter.h +++ b/components/esp_wifi/include/esp_private/wifi_os_adapter.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2018-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2018-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -149,13 +149,16 @@ typedef struct wifi_osi_funcs_t { int (* _coex_schm_process_restart)(void); int (* _coex_schm_register_cb)(int, int (* cb)(int)); int (* _coex_register_start_cb)(int (* cb)(void)); -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 +#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32S31 void (* _regdma_link_set_write_wait_content)(void *, uint32_t, uint32_t); void * (* _sleep_retention_find_link_by_id)(int); #endif int (*_coex_schm_flexible_period_set)(uint8_t); uint8_t (*_coex_schm_flexible_period_get)(void); void * (*_coex_schm_get_phase_by_idx)(int); +#if CONFIG_IDF_TARGET_ESP32S31 + int (* _coex_configure_preemption_end_cb)(bool is_register, int(*cb)(uint32_t)); +#endif int32_t _magic; } wifi_osi_funcs_t; diff --git a/components/esp_wifi/include/esp_wifi_types_generic.h b/components/esp_wifi/include/esp_wifi_types_generic.h index 6406fbd64d..f217949c8a 100644 --- a/components/esp_wifi/include/esp_wifi_types_generic.h +++ b/components/esp_wifi/include/esp_wifi_types_generic.h @@ -1300,6 +1300,7 @@ typedef struct { uint64_t t2; /**< Time of arrival of FTM frame at FTM Initiator in pSec */ uint64_t t3; /**< Time of departure of ACK from FTM Initiator in pSec */ uint64_t t4; /**< Time of arrival of ACK at FTM Responder in pSec */ + int16_t ppm; /**< Clock frequency offset in parts per million (PPM) between local and peer device */ } wifi_ftm_report_entry_t; /** diff --git a/components/esp_wifi/include/local/esp_wifi_types_native.h b/components/esp_wifi/include/local/esp_wifi_types_native.h index 3efc979daa..dea9da5483 100644 --- a/components/esp_wifi/include/local/esp_wifi_types_native.h +++ b/components/esp_wifi/include/local/esp_wifi_types_native.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,8 +18,8 @@ extern "C" { #if CONFIG_IDF_TARGET_ESP32C2 #define ESP_WIFI_MAX_CONN_NUM (4) /**< max number of stations which can connect to ESP32C2 soft-AP */ -#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 -#define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP32C3/ESP32C6/ESP32C5/ESP32C61 soft-AP */ +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32S31 +#define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP32C3/ESP32C6/ESP32C5/ESP32C61/ESP32S31 soft-AP */ #else #define ESP_WIFI_MAX_CONN_NUM (15) /**< max number of stations which can connect to ESP32/ESP32S3/ESP32S2 soft-AP */ #endif diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index cdb85041a2..be8700b2cd 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit cdb85041a22d09dea948a3fe4975778f79c064d0 +Subproject commit be8700b2cdca6d72a94713f6cd3809243c9bd8dc diff --git a/components/esp_wifi/remote/Kconfig.slave_select.in b/components/esp_wifi/remote/Kconfig.slave_select.in index 67a71b2853..39086cf20e 100644 --- a/components/esp_wifi/remote/Kconfig.slave_select.in +++ b/components/esp_wifi/remote/Kconfig.slave_select.in @@ -20,4 +20,6 @@ choice SLAVE_IDF_TARGET bool "esp32c5" config SLAVE_IDF_TARGET_ESP32C61 bool "esp32c61" + config SLAVE_IDF_TARGET_ESP32S31 + bool "esp32s31" endchoice diff --git a/components/esp_wifi/remote/Kconfig.soc_wifi_caps.in b/components/esp_wifi/remote/Kconfig.soc_wifi_caps.in index cadde17acb..f19c54c3a3 100644 --- a/components/esp_wifi/remote/Kconfig.soc_wifi_caps.in +++ b/components/esp_wifi/remote/Kconfig.soc_wifi_caps.in @@ -407,3 +407,59 @@ if SLAVE_IDF_TARGET_ESP32C61 default y endif # ESP32C61 + +if SLAVE_IDF_TARGET_ESP32S31 + + config SLAVE_SOC_WIFI_SUPPORTED # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_HW_TSF # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_FTM_SUPPORT # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_GCMP_SUPPORT # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_WAPI_SUPPORT # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_CSI_SUPPORT # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_MESH_SUPPORT # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_HE_SUPPORT # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_MAC_VERSION_NUM # ignore: multiple-definition + int + default 3 + + config SLAVE_SOC_WIFI_NAN_SUPPORT # ignore: multiple-definition + bool + default y + + config SLAVE_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH # ignore: multiple-definition + int + default 12 + + config SLAVE_IDF_TARGET_ARCH_RISCV # ignore: multiple-definition + bool + default y + + config SLAVE_IDF_ENV_BRINGUP # ignore: multiple-definition + bool + default y + +endif # ESP32S31 diff --git a/components/esp_wifi/remote/include/injected/esp_wifi_types_generic.h b/components/esp_wifi/remote/include/injected/esp_wifi_types_generic.h index 1574ce4bd2..5589bedc07 100644 --- a/components/esp_wifi/remote/include/injected/esp_wifi_types_generic.h +++ b/components/esp_wifi/remote/include/injected/esp_wifi_types_generic.h @@ -1300,6 +1300,7 @@ typedef struct { uint64_t t2; /**< Time of arrival of FTM frame at FTM Initiator in pSec */ uint64_t t3; /**< Time of departure of ACK from FTM Initiator in pSec */ uint64_t t4; /**< Time of arrival of ACK at FTM Responder in pSec */ + int16_t ppm; /**< Clock frequency offset in parts per million (PPM) between local and peer device */ } wifi_ftm_report_entry_t; /** diff --git a/components/esp_wifi/remote/include/injected/esp_wifi_types_native.h b/components/esp_wifi/remote/include/injected/esp_wifi_types_native.h index 0963572a85..497a4fce55 100644 --- a/components/esp_wifi/remote/include/injected/esp_wifi_types_native.h +++ b/components/esp_wifi/remote/include/injected/esp_wifi_types_native.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -18,8 +18,8 @@ extern "C" { #if CONFIG_SLAVE_IDF_TARGET_ESP32C2 #define ESP_WIFI_MAX_CONN_NUM (4) /**< max number of stations which can connect to ESP32C2 soft-AP */ -#elif CONFIG_SLAVE_IDF_TARGET_ESP32C3 || CONFIG_SLAVE_IDF_TARGET_ESP32C6 || CONFIG_SLAVE_IDF_TARGET_ESP32C5 || CONFIG_SLAVE_IDF_TARGET_ESP32C61 -#define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP32C3/ESP32C6/ESP32C5/ESP32C61 soft-AP */ +#elif CONFIG_SLAVE_IDF_TARGET_ESP32C3 || CONFIG_SLAVE_IDF_TARGET_ESP32C6 || CONFIG_SLAVE_IDF_TARGET_ESP32C5 || CONFIG_SLAVE_IDF_TARGET_ESP32C61 || CONFIG_SLAVE_IDF_TARGET_ESP32S31 +#define ESP_WIFI_MAX_CONN_NUM (10) /**< max number of stations which can connect to ESP32C3/ESP32C6/ESP32C5/ESP32C61/ESP32S31 soft-AP */ #else #define ESP_WIFI_MAX_CONN_NUM (15) /**< max number of stations which can connect to ESP32/ESP32S3/ESP32S2 soft-AP */ #endif diff --git a/components/esp_wifi/test_apps/.build-test-rules.yml b/components/esp_wifi/test_apps/.build-test-rules.yml index a9972bba6c..6433fa3029 100644 --- a/components/esp_wifi/test_apps/.build-test-rules.yml +++ b/components/esp_wifi/test_apps/.build-test-rules.yml @@ -3,6 +3,11 @@ components/esp_wifi/test_apps/: disable: - if: SOC_WIFI_SUPPORTED != 1 + + disable_test: + - if: IDF_TARGET in ["esp32s31"] + temporary: true + reason: lack of runner depends_components: - esp_hw_support - esp_rom diff --git a/components/esp_wifi/test_apps/bin_size_apsta/README.md b/components/esp_wifi/test_apps/bin_size_apsta/README.md index 1c35092948..de83df56df 100644 --- a/components/esp_wifi/test_apps/bin_size_apsta/README.md +++ b/components/esp_wifi/test_apps/bin_size_apsta/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | diff --git a/components/esp_wifi/test_apps/wifi_connect/README.md b/components/esp_wifi/test_apps/wifi_connect/README.md index 1c35092948..de83df56df 100644 --- a/components/esp_wifi/test_apps/wifi_connect/README.md +++ b/components/esp_wifi/test_apps/wifi_connect/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | diff --git a/components/esp_wifi/test_apps/wifi_function/README.md b/components/esp_wifi/test_apps/wifi_function/README.md index aa42f91b6b..a1466d0f37 100644 --- a/components/esp_wifi/test_apps/wifi_function/README.md +++ b/components/esp_wifi/test_apps/wifi_function/README.md @@ -1,3 +1,3 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | diff --git a/components/esp_wifi/test_apps/wifi_nvs_config/README.md b/components/esp_wifi/test_apps/wifi_nvs_config/README.md index 1c35092948..de83df56df 100644 --- a/components/esp_wifi/test_apps/wifi_nvs_config/README.md +++ b/components/esp_wifi/test_apps/wifi_nvs_config/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | diff --git a/components/esp_wifi/test_apps/wifi_nvs_config/pytest_wifi_nvs_connect.py b/components/esp_wifi/test_apps/wifi_nvs_config/pytest_wifi_nvs_connect.py index 5fd6124813..6ffb4ad706 100644 --- a/components/esp_wifi/test_apps/wifi_nvs_config/pytest_wifi_nvs_connect.py +++ b/components/esp_wifi/test_apps/wifi_nvs_config/pytest_wifi_nvs_connect.py @@ -9,7 +9,7 @@ from pytest_embedded_idf.utils import idf_parametrize @pytest.mark.parametrize('count', [2], indirect=True) @idf_parametrize( 'target', - ['esp32', 'esp32c3', 'esp32c5', 'esp32c6', 'esp32c61', 'esp32s2', 'esp32s3'], + ['esp32', 'esp32c3', 'esp32c5', 'esp32c6', 'esp32c61', 'esp32s2', 'esp32s3', 'esp32s31'], indirect=['target'], ) def test_wifi_nvs_connect_cases(case_tester: CaseTester) -> None: # type: ignore diff --git a/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in index 02266e542c..0c04b025e0 100644 --- a/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s31/include/soc/Kconfig.soc_caps.in @@ -207,6 +207,18 @@ config SOC_USB_UTMI_PHY_NUM int default 1 +config SOC_PHY_SUPPORTED + bool + default y + +config SOC_WIFI_SUPPORTED + bool + default y + +config SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT + bool + default y + config SOC_XTAL_SUPPORT_40M bool default y @@ -998,3 +1010,43 @@ config SOC_JPEG_DECODE_SUPPORTED config SOC_JPEG_ENCODE_SUPPORTED bool default y + +config SOC_WIFI_HW_TSF + bool + default y + +config SOC_WIFI_FTM_SUPPORT + bool + default y + +config SOC_WIFI_GCMP_SUPPORT + bool + default y + +config SOC_WIFI_WAPI_SUPPORT + bool + default y + +config SOC_WIFI_CSI_SUPPORT + bool + default y + +config SOC_WIFI_MESH_SUPPORT + bool + default y + +config SOC_WIFI_HE_SUPPORT + bool + default y + +config SOC_WIFI_MAC_VERSION_NUM + int + default 3 + +config SOC_WIFI_NAN_SUPPORT + bool + default y + +config SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH + int + default 12 diff --git a/components/soc/esp32s31/include/soc/periph_defs.h b/components/soc/esp32s31/include/soc/periph_defs.h index 00e90eb068..11aeccb2e6 100644 --- a/components/soc/esp32s31/include/soc/periph_defs.h +++ b/components/soc/esp32s31/include/soc/periph_defs.h @@ -32,7 +32,7 @@ typedef enum { } shared_periph_module_t; #define PERIPH_MODEM_MODULE_MIN PERIPH_WIFI_MODULE -#define PERIPH_MODEM_MODULE_MAX PERIPH_MODEM_ADC_COMMON_FE_MODULE +#define PERIPH_MODEM_MODULE_MAX PERIPH_PHY_CALIBRATION_MODULE #define PERIPH_MODEM_MODULE_NUM (PERIPH_MODEM_MODULE_MAX - PERIPH_MODEM_MODULE_MIN + 1) #define IS_MODEM_MODULE(periph) ((periph>=PERIPH_MODEM_MODULE_MIN) && (periph<=PERIPH_MODEM_MODULE_MAX)) diff --git a/components/soc/esp32s31/include/soc/soc_caps.h b/components/soc/esp32s31/include/soc/soc_caps.h index 6281de1195..5ee1af60fd 100644 --- a/components/soc/esp32s31/include/soc/soc_caps.h +++ b/components/soc/esp32s31/include/soc/soc_caps.h @@ -109,6 +109,9 @@ #define SOC_USB_FSLS_PHY_NUM (0U) #define SOC_USB_UTMI_PHY_NUM (1U) +#define SOC_PHY_SUPPORTED 1 +#define SOC_WIFI_SUPPORTED 1 +#define SOC_PHY_CALIBRATION_CLOCK_IS_INDEPENDENT 1 /*-------------------------- XTAL CAPS ---------------------------------------*/ #define SOC_XTAL_SUPPORT_40M 1 @@ -447,3 +450,16 @@ /*--------------------------- JPEG --------------------------------*/ #define SOC_JPEG_DECODE_SUPPORTED (1) #define SOC_JPEG_ENCODE_SUPPORTED (1) +/*------------------------------------ WI-FI CAPS ------------------------------------*/ +#define SOC_WIFI_HW_TSF (1) /*!< Support hardware TSF */ +#define SOC_WIFI_FTM_SUPPORT (1) /*!< Support FTM */ +#define SOC_WIFI_GCMP_SUPPORT (1) /*!< Support GCMP(GCMP128 and GCMP256) */ +#define SOC_WIFI_WAPI_SUPPORT (1) /*!< Support WAPI */ +#define SOC_WIFI_CSI_SUPPORT (1) /*!< Support CSI */ +#define SOC_WIFI_MESH_SUPPORT (1) /*!< Support WIFI MESH */ +#define SOC_WIFI_HE_SUPPORT (1) /*!< Support Wi-Fi 6 */ +#define SOC_WIFI_MAC_VERSION_NUM (3) /*!< Wi-Fi MAC version num is 3 */ +#define SOC_WIFI_NAN_SUPPORT (1) /*!< Support WIFI Aware (NAN) */ + +/*--------------- WIFI LIGHT SLEEP CLOCK WIDTH CAPS --------------------------*/ +#define SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH (12) diff --git a/components/wpa_supplicant/CMakeLists.txt b/components/wpa_supplicant/CMakeLists.txt index 3ebc9155bb..e34cbccbd9 100644 --- a/components/wpa_supplicant/CMakeLists.txt +++ b/components/wpa_supplicant/CMakeLists.txt @@ -118,7 +118,7 @@ if(CONFIG_ESP_WIFI_MBEDTLS_CRYPTO) "esp_supplicant/src/crypto/crypto_mbedtls-bignum.c" "esp_supplicant/src/crypto/crypto_mbedtls-rsa.c" "esp_supplicant/src/crypto/crypto_mbedtls-ec.c") - if(NOT CONFIG_IDF_TARGET_ESP32) + if(NOT CONFIG_IDF_TARGET_ESP32 AND NOT CONFIG_IDF_TARGET_ESP32S31) # TDOD IDF-14630 list(APPEND crypto_src "esp_supplicant/src/crypto/fastpsk.c") endif() # Add internal RC4 as RC4 has been removed from mbedtls @@ -130,7 +130,8 @@ if(CONFIG_ESP_WIFI_MBEDTLS_CRYPTO) set(crypto_src ${crypto_src} "src/crypto/sha1-pbkdf2.c" ${crypto_src} "src/crypto/sha1.c" ${crypto_src} "src/crypto/sha1-internal.c") - else() + elseif(NOT CONFIG_IDF_TARGET_ESP32S31) + #TDOD IDF-14630: use mbedtls_pkcs5_pbkdf2_hmac (software) instead of fastpbkdf2. set(crypto_src ${crypto_src} "esp_supplicant/src/crypto/fastpbkdf2.c") endif() if(NOT CONFIG_MBEDTLS_SHA1_C AND CONFIG_MBEDTLS_HARDWARE_SHA) @@ -281,7 +282,7 @@ target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_NO_RADIUS ) -if(CONFIG_MBEDTLS_SHA1_C OR CONFIG_MBEDTLS_HARDWARE_SHA) +if((CONFIG_MBEDTLS_SHA1_C OR CONFIG_MBEDTLS_HARDWARE_SHA) AND NOT CONFIG_IDF_TARGET_ESP32S31) # TDOD IDF-14630 target_compile_definitions(${COMPONENT_LIB} PRIVATE CONFIG_FAST_PBKDF2) endif() diff --git a/components/wpa_supplicant/esp_supplicant/src/crypto/crypto_mbedtls.c b/components/wpa_supplicant/esp_supplicant/src/crypto/crypto_mbedtls.c index 26de756edf..f3b4902dfe 100644 --- a/components/wpa_supplicant/esp_supplicant/src/crypto/crypto_mbedtls.c +++ b/components/wpa_supplicant/esp_supplicant/src/crypto/crypto_mbedtls.c @@ -30,6 +30,7 @@ #include "aes_wrap.h" #include "crypto.h" #include "mbedtls/esp_config.h" +#include "mbedtls/private/pkcs5.h" #include "psa/crypto.h" #include "mbedtls/psa_util.h" diff --git a/components/wpa_supplicant/src/utils/includes.h b/components/wpa_supplicant/src/utils/includes.h index 544ad04d8a..8d4e0b9ac4 100644 --- a/components/wpa_supplicant/src/utils/includes.h +++ b/components/wpa_supplicant/src/utils/includes.h @@ -80,6 +80,8 @@ #include "esp32p4/rom/ets_sys.h" #elif CONFIG_IDF_TARGET_ESP32C61 #include "esp32c61/rom/ets_sys.h" +#elif CONFIG_IDF_TARGET_ESP32S31 +#include "esp32s31/rom/ets_sys.h" #endif #endif /* !__ets__ */ diff --git a/components/wpa_supplicant/test_apps/README.md b/components/wpa_supplicant/test_apps/README.md index e5c31559f2..c99e3dbe40 100644 --- a/components/wpa_supplicant/test_apps/README.md +++ b/components/wpa_supplicant/test_apps/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | # wpa_supplicant unit test diff --git a/components/wpa_supplicant/test_apps/pytest_wpa_supplicant_ut.py b/components/wpa_supplicant/test_apps/pytest_wpa_supplicant_ut.py index e9819ff551..f6424c1a0c 100644 --- a/components/wpa_supplicant/test_apps/pytest_wpa_supplicant_ut.py +++ b/components/wpa_supplicant/test_apps/pytest_wpa_supplicant_ut.py @@ -9,7 +9,7 @@ from pytest_embedded_idf.utils import idf_parametrize @pytest.mark.generic @idf_parametrize( 'target', - ['esp32', 'esp32s2', 'esp32s3', 'esp32c3', 'esp32c2', 'esp32c6', 'esp32c61', 'esp32c5'], + ['esp32', 'esp32s2', 'esp32s3', 'esp32s31', 'esp32c3', 'esp32c2', 'esp32c6', 'esp32c61', 'esp32c5'], indirect=['target'], ) def test_wpa_supplicant_ut(dut: Dut) -> None: @@ -26,7 +26,7 @@ def test_wpa_supplicant_ut(dut: Dut) -> None: ) @idf_parametrize( 'target', - ['esp32', 'esp32s2', 'esp32s3', 'esp32c6', 'esp32c61', 'esp32c5'], + ['esp32', 'esp32s2', 'esp32s3', 'esp32s31', 'esp32c6', 'esp32c61', 'esp32c5'], indirect=['target'], ) def test_wpa_supplicant_ut_offchan(case_tester: CaseTester) -> None: diff --git a/docs/conf_common.py b/docs/conf_common.py index 71b07ab5b7..4fff33565f 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -330,6 +330,9 @@ ESP32H4_DOCS = [ ESP32S31_DOCS = [ 'api-reference/system/ipc.rst', + 'api-reference/peripherals/sd_pullup_requirements.rst', + 'api-guides/RF_calibration.rst', + 'api-guides/phy.rst', ] ESP32P4_DOCS = [ @@ -454,7 +457,7 @@ html_context['github_repo'] = 'esp-idf' # noqa: F405 project_slug = 'esp-idf' versions_url = 'https://dl.espressif.com/dl/esp-idf/idf_versions.js' -idf_targets = ['esp32', 'esp32s2', 'esp32s3', 'esp32c3', 'esp32c2', 'esp32c5', 'esp32c6', 'esp32p4'] +idf_targets = ['esp32', 'esp32s2', 'esp32s3', 'esp32s31', 'esp32c3', 'esp32c2', 'esp32c5', 'esp32c6', 'esp32p4'] languages = ['en', 'zh_CN'] google_analytics_id = os.environ.get('CI_GOOGLE_ANALYTICS_ID', None) diff --git a/examples/mesh/ip_internal_network/README.md b/examples/mesh/ip_internal_network/README.md index 394e9622b8..8fc725c3fe 100644 --- a/examples/mesh/ip_internal_network/README.md +++ b/examples/mesh/ip_internal_network/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | # Mesh IP Internal Networking example diff --git a/examples/mesh/manual_networking/README.md b/examples/mesh/manual_networking/README.md index 5fc60d9bf9..f2b3842ae1 100644 --- a/examples/mesh/manual_networking/README.md +++ b/examples/mesh/manual_networking/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | # Mesh Manual Networking Example diff --git a/examples/network/eth2ap/README.md b/examples/network/eth2ap/README.md index a2e7c4e0b4..a184939bb0 100644 --- a/examples/network/eth2ap/README.md +++ b/examples/network/eth2ap/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | # eth2ap Example (See the README.md file in the upper level 'examples' directory for more information about examples. To try a more complex application about Ethernet to WiFi data forwarding, please go to [iot-solution](https://github.com/espressif/esp-iot-solution/tree/release/v1.0/examples/eth2wifi).) diff --git a/examples/network/simple_sniffer/README.md b/examples/network/simple_sniffer/README.md index 0b57e6e64a..2ae23ee5b5 100644 --- a/examples/network/simple_sniffer/README.md +++ b/examples/network/simple_sniffer/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | # Simple Sniffer Example diff --git a/examples/network/simple_sniffer/pytest_simple_sniffer.py b/examples/network/simple_sniffer/pytest_simple_sniffer.py index 12ad33fe06..702b0b6cf6 100644 --- a/examples/network/simple_sniffer/pytest_simple_sniffer.py +++ b/examples/network/simple_sniffer/pytest_simple_sniffer.py @@ -47,7 +47,7 @@ def _sniffer_packets_check(dut: Dut, channel: int, packet_num: int) -> None: ) @idf_parametrize( 'target', - ['esp32', 'esp32c2', 'esp32c3', 'esp32c5', 'esp32c6', 'esp32c61', 'esp32s2', 'esp32s3'], + ['esp32', 'esp32c2', 'esp32c3', 'esp32c5', 'esp32c6', 'esp32c61', 'esp32s2', 'esp32s3', 'esp32s31'], indirect=['target'], ) def test_examples_simple_sniffer(dut: Dut) -> None: diff --git a/examples/network/sta2eth/README.md b/examples/network/sta2eth/README.md index 96e3437aa4..42871e7934 100644 --- a/examples/network/sta2eth/README.md +++ b/examples/network/sta2eth/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | # WiFi station to "Wired" interface L2 forwarder diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index f66c2f6329..3247f2a6fd 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -822,6 +822,9 @@ examples/peripherals/usb/device/cherryusb_serial_device: examples/peripherals/usb/device/tusb_ncm: disable: - if: SOC_USB_OTG_SUPPORTED != 1 or SOC_WIFI_SUPPORTED != 1 + - if: IDF_TARGET == "esp32s31" + temporary: true + reason: USB device examples do not support esp32s31 yet disable_test: - if: IDF_TARGET not in ["esp32s2"] temporary: true diff --git a/examples/wifi/.build-test-rules.yml b/examples/wifi/.build-test-rules.yml index 3688fe70b2..49969f37a0 100644 --- a/examples/wifi/.build-test-rules.yml +++ b/examples/wifi/.build-test-rules.yml @@ -83,6 +83,9 @@ examples/wifi/power_save: - if: SOC_WIFI_SUPPORTED != 1 temporary: true reason: requires hardware support + - if: IDF_TARGET in ["esp32s31"] + temporary: true + reason: lack of runners depends_components: - *common_components - esp_wifi diff --git a/examples/wifi/ftm/README.md b/examples/wifi/ftm/README.md index d441c55336..cd1631fe46 100644 --- a/examples/wifi/ftm/README.md +++ b/examples/wifi/ftm/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | # FTM Example diff --git a/examples/wifi/getting_started/pytest_wifi_getting_started.py b/examples/wifi/getting_started/pytest_wifi_getting_started.py index eca8c470b1..52c83f863e 100644 --- a/examples/wifi/getting_started/pytest_wifi_getting_started.py +++ b/examples/wifi/getting_started/pytest_wifi_getting_started.py @@ -33,7 +33,7 @@ from pytest_embedded_idf.utils import idf_parametrize ) @idf_parametrize( 'target', - ['esp32', 'esp32c3', 'esp32s2', 'esp32s3', 'esp32c5', 'esp32c6', 'esp32c61'], + ['esp32', 'esp32c3', 'esp32s2', 'esp32s3', 'esp32s31', 'esp32c5', 'esp32c6', 'esp32c61'], indirect=['target'], ) def test_wifi_getting_started(dut: tuple[IdfDut, IdfDut]) -> None: diff --git a/examples/wifi/getting_started/softAP/README.md b/examples/wifi/getting_started/softAP/README.md index f7bf096318..97c68f43f7 100644 --- a/examples/wifi/getting_started/softAP/README.md +++ b/examples/wifi/getting_started/softAP/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | --------- | # Wi-Fi SoftAP Example diff --git a/examples/wifi/getting_started/station/README.md b/examples/wifi/getting_started/station/README.md index 2d1d7fd7c1..b025844b58 100644 --- a/examples/wifi/getting_started/station/README.md +++ b/examples/wifi/getting_started/station/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | --------- | # Wi-Fi Station Example diff --git a/examples/wifi/getting_started/station/pytest_wifi_station.py b/examples/wifi/getting_started/station/pytest_wifi_station.py index e66404f372..0c6327e6d7 100644 --- a/examples/wifi/getting_started/station/pytest_wifi_station.py +++ b/examples/wifi/getting_started/station/pytest_wifi_station.py @@ -12,6 +12,7 @@ from pytest_embedded_idf.utils import idf_parametrize DIFF_THRESHOLD = { 'esp32s2': 40 * 1000, 'esp32s3': 40 * 1000, + 'esp32s31': 40 * 1000, 'default': 45 * 1000, } @@ -20,7 +21,7 @@ DIFF_THRESHOLD = { @pytest.mark.parametrize('count, config, skip_autoflash', [(2, 'default|enable_softap', 'y')], indirect=True) @idf_parametrize( 'target', - ['esp32', 'esp32c2', 'esp32c3', 'esp32s2', 'esp32s3', 'esp32c5', 'esp32c6', 'esp32c61'], + ['esp32', 'esp32c2', 'esp32c3', 'esp32s2', 'esp32s3', 'esp32s31', 'esp32c5', 'esp32c6', 'esp32c61'], indirect=['target'], ) def test_wifi_sdkconfig_disable_softap_save_binary_size( diff --git a/examples/wifi/iperf/README.md b/examples/wifi/iperf/README.md index a518e9c7af..1d26be22c8 100644 --- a/examples/wifi/iperf/README.md +++ b/examples/wifi/iperf/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | --------- | # Iperf Example diff --git a/examples/wifi/iperf/sdkconfig.defaults.esp32s31 b/examples/wifi/iperf/sdkconfig.defaults.esp32s31 new file mode 100644 index 0000000000..0714d07186 --- /dev/null +++ b/examples/wifi/iperf/sdkconfig.defaults.esp32s31 @@ -0,0 +1,56 @@ +# +# ESP32S31-Specific +# + +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=48 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=72 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=64 +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=64 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=64 +CONFIG_ESP_WIFI_NVS_ENABLED=n + +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=65535 +CONFIG_LWIP_TCP_WND_DEFAULT=65535 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=64 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=64 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=64 +CONFIG_LWIP_IP_REASS_MAX_PBUFS=15 + +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y + + +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLE_WIFI_TX_STATS=y +CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS=y +CONFIG_ESP_WIFI_ENABLE_WIFI_RX_MU_STATS=n +CONFIG_ESP_WIFI_ENABLE_DUMP_HESIGB=n +CONFIG_ESP_WIFI_ENABLE_DUMP_MU_CFO=n +CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_NDPA=y +CONFIG_ESP_WIFI_ENABLE_DUMP_CTRL_BFRP=y +CONFIG_ESP_WIFI_SLP_IRAM_OPT=y +CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION=y + +#CONFIG_LWIP_TCPIP_CORE_LOCKING=y +#CONFIG_LWIP_TCPIP_CORE_LOCKING_INPUT=y +CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1=y +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x1 + +CONFIG_IPERF_DEF_TCP_TX_BUFFER_LEN=2880 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=12 + +#TODO IDF-14625 IDF-14630 IDF-14631 IDF-14633 +CONFIG_MBEDTLS_HARDWARE_AES=n +CONFIG_MBEDTLS_HARDWARE_MPI=n +CONFIG_MBEDTLS_HARDWARE_SHA=n +CONFIG_MBEDTLS_HARDWARE_ECC=n +#CONFIG_FREERTOS_UNICORE=y diff --git a/examples/wifi/wifi_aware/nan_console/README.md b/examples/wifi/wifi_aware/nan_console/README.md index 2601c22a5c..ee9e464d9f 100644 --- a/examples/wifi/wifi_aware/nan_console/README.md +++ b/examples/wifi/wifi_aware/nan_console/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C5 | ESP32-C61 | ESP32-S2 | -| ----------------- | ----- | -------- | --------- | -------- | +| Supported Targets | ESP32 | ESP32-C5 | ESP32-C61 | ESP32-S2 | ESP32-S31 | +| ----------------- | ----- | -------- | --------- | -------- | --------- | # NAN Console Example diff --git a/examples/wifi/wifi_aware/nan_publisher/README.md b/examples/wifi/wifi_aware/nan_publisher/README.md index a50dd05847..8a721f56f0 100644 --- a/examples/wifi/wifi_aware/nan_publisher/README.md +++ b/examples/wifi/wifi_aware/nan_publisher/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C5 | ESP32-C61 | ESP32-S2 | -| ----------------- | ----- | -------- | --------- | -------- | +| Supported Targets | ESP32 | ESP32-C5 | ESP32-C61 | ESP32-S2 | ESP32-S31 | +| ----------------- | ----- | -------- | --------- | -------- | --------- | # NAN Publisher Example diff --git a/examples/wifi/wifi_aware/nan_subscriber/README.md b/examples/wifi/wifi_aware/nan_subscriber/README.md index c648c75ab7..25c749a2cf 100644 --- a/examples/wifi/wifi_aware/nan_subscriber/README.md +++ b/examples/wifi/wifi_aware/nan_subscriber/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C5 | ESP32-C61 | ESP32-S2 | -| ----------------- | ----- | -------- | --------- | -------- | +| Supported Targets | ESP32 | ESP32-C5 | ESP32-C61 | ESP32-S2 | ESP32-S31 | +| ----------------- | ----- | -------- | --------- | -------- | --------- | # NAN Subscriber Example diff --git a/examples/wifi/wifi_aware/usd_publisher/README.md b/examples/wifi/wifi_aware/usd_publisher/README.md index 1c35092948..de83df56df 100644 --- a/examples/wifi/wifi_aware/usd_publisher/README.md +++ b/examples/wifi/wifi_aware/usd_publisher/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | diff --git a/examples/wifi/wifi_aware/usd_subscriber/README.md b/examples/wifi/wifi_aware/usd_subscriber/README.md index 1c35092948..de83df56df 100644 --- a/examples/wifi/wifi_aware/usd_subscriber/README.md +++ b/examples/wifi/wifi_aware/usd_subscriber/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | diff --git a/tools/test_apps/phy/.build-test-rules.yml b/tools/test_apps/phy/.build-test-rules.yml index 254cca151a..f76d99540d 100644 --- a/tools/test_apps/phy/.build-test-rules.yml +++ b/tools/test_apps/phy/.build-test-rules.yml @@ -4,7 +4,8 @@ tools/test_apps/phy/phy_multi_init_data_test: disable: - if: SOC_WIFI_SUPPORTED != 1 disable_test: - - if: IDF_TARGET in ["esp32c5", "esp32c61"] + - if: IDF_TARGET in ["esp32c5", "esp32c61", "esp32s31"] + temporary: true reason: lack of runner tools/test_apps/phy/phy_tsens: diff --git a/tools/test_apps/phy/phy_multi_init_data_test/README.md b/tools/test_apps/phy/phy_multi_init_data_test/README.md index 1c35092948..de83df56df 100644 --- a/tools/test_apps/phy/phy_multi_init_data_test/README.md +++ b/tools/test_apps/phy/phy_multi_init_data_test/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-S2 | ESP32-S3 | ESP32-S31 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | --------- |