diff --git a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld index b1c8eed0f1..64d91fa348 100644 --- a/components/esp_rom/esp32c3/ld/esp32c3.rom.ld +++ b/components/esp_rom/esp32c3/ld/esp32c3.rom.ld @@ -1545,7 +1545,7 @@ pm_set_beacon_filter = 0x4000166c; pm_is_in_wifi_slice_threshold = 0x40001670; pm_is_waked = 0x40001674; pm_keep_alive = 0x40001678; -pm_on_beacon_rx = 0x4000167c; +/* pm_on_beacon_rx = 0x4000167c; */ pm_on_data_rx = 0x40001680; pm_on_tbtt = 0x40001684; pm_parse_beacon = 0x40001688; @@ -1554,7 +1554,7 @@ pm_rx_beacon_process = 0x40001690; pm_rx_data_process = 0x40001694; /*pm_sleep = 0x40001698;*/ pm_sleep_for = 0x4000169c; -/*pm_tbtt_process = 0x400016a0;*/ +/* pm_tbtt_process = 0x400016a0; */ ppAMPDU2Normal = 0x400016a4; ppAssembleAMPDU = 0x400016a8; ppCalFrameTimes = 0x400016ac; diff --git a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld index 82f78f1208..4fadc25fee 100644 --- a/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +++ b/components/esp_rom/esp32s3/ld/esp32s3.rom.ld @@ -1850,7 +1850,7 @@ pm_set_beacon_filter = 0x40005484; pm_is_in_wifi_slice_threshold = 0x40005490; pm_is_waked = 0x4000549c; pm_keep_alive = 0x400054a8; -pm_on_beacon_rx = 0x400054b4; +/* pm_on_beacon_rx = 0x400054b4; */ pm_on_data_rx = 0x400054c0; pm_on_tbtt = 0x400054cc; pm_parse_beacon = 0x400054d8; @@ -1859,7 +1859,7 @@ pm_rx_beacon_process = 0x400054f0; pm_rx_data_process = 0x400054fc; /*pm_sleep = 0x40005508;*/ pm_sleep_for = 0x40005514; -/*pm_tbtt_process = 0x40005520;*/ +/* pm_tbtt_process = 0x40005520; */ ppAMPDU2Normal = 0x4000552c; ppAssembleAMPDU = 0x40005538; ppCalFrameTimes = 0x40005544; @@ -1890,7 +1890,7 @@ ppSearchTxQueue = 0x40005670; ppSearchTxframe = 0x4000567c; ppSelectNextQueue = 0x40005688; ppSubFromAMPDU = 0x40005694; -ppTask = 0x400056a0; +/* ppTask = 0x400056a0; */ ppTxPkt = 0x400056ac; ppTxProtoProc = 0x400056b8; ppTxqUpdateBitmap = 0x400056c4; @@ -1942,7 +1942,7 @@ wdev_mac_special_reg_store = 0x400058e0; wdev_mac_wakeup = 0x400058ec; wdev_mac_sleep = 0x400058f8; hal_mac_is_dma_enable = 0x40005904; -wDev_ProcessFiq = 0x40005910; +/* wDev_ProcessFiq = 0x40005910; */ wDev_ProcessRxSucData = 0x4000591c; wdevProcessRxSucDataAll = 0x40005928; wdev_csi_len_align = 0x40005934; diff --git a/components/esp_wifi/Kconfig b/components/esp_wifi/Kconfig index 90ad2b4c14..e3d9a90dc8 100644 --- a/components/esp_wifi/Kconfig +++ b/components/esp_wifi/Kconfig @@ -332,4 +332,45 @@ menu "Wi-Fi" help WiFi module can be compiled without SoftAP to save code size. + config ESP_WIFI_SLP_BEACON_LOST_OPT + bool "Wifi sleep optimize when beacon lost" + help + Enable wifi sleep optimization when beacon loss occurs and immediately enter + sleep mode when the WiFi module detects beacon loss. + + config ESP_WIFI_SLP_BEACON_LOST_TIMEOUT + int "Beacon loss timeout" + range 5 100 + default 10 + depends on ESP_WIFI_SLP_BEACON_LOST_OPT + help + Timeout time for close rf phy when beacon loss occurs, Unit: 1024 microsecond. + + config ESP_WIFI_SLP_BEACON_LOST_THRESHOLD + int "Maximum number of consecutive lost beacons allowed" + range 0 8 + default 3 + depends on ESP_WIFI_SLP_BEACON_LOST_OPT + help + Maximum number of consecutive lost beacons allowed, WiFi keeps Rx state when + the number of consecutive beacons lost is greater than the given threshold. + + config ESP_WIFI_SLP_PHY_ON_DELTA_EARLY_TIME + int "Delta early time for RF PHY on" + range 0 100 + default 2 + depends on ESP_WIFI_SLP_BEACON_LOST_OPT + help + Delta early time for rf phy on, When the beacon is lost, the next rf phy on will + be earlier the time specified by the configuration item, Unit: 32 microsecond. + + config ESP_WIFI_SLP_PHY_OFF_DELTA_TIMEOUT_TIME + int "Delta timeout time for RF PHY off" + range 0 8 + default 2 + depends on ESP_WIFI_SLP_BEACON_LOST_OPT + help + Delta timeout time for rf phy off, When the beacon is lost, the next rf phy off will + be delayed for the time specified by the configuration item. Unit: 1024 microsecond. + endmenu # Wi-Fi diff --git a/components/esp_wifi/include/esp_private/wifi.h b/components/esp_wifi/include/esp_private/wifi.h index f36a276974..6d77c8a353 100644 --- a/components/esp_wifi/include/esp_private/wifi.h +++ b/components/esp_wifi/include/esp_private/wifi.h @@ -590,6 +590,15 @@ void esp_wifi_set_sleep_delay_time(uint32_t return_to_sleep_delay); */ void esp_wifi_set_keep_alive_time(uint32_t keep_alive_time); +/** + * @brief Configure wifi beacon montior default parameters + * + * @param enable: enable or disable beacon monitor + * @param timeout: timeout time for close rf phy when beacon loss occurs, Unit: 1024 microsecond + * @param threshold: maximum number of consecutive lost beacons allowed + */ +void esp_wifi_beacon_monitor_configure(bool enable, int timeout, int threshold, int delta_intr_early, int delta_timeout); + #ifdef __cplusplus } #endif diff --git a/components/esp_wifi/src/wifi_init.c b/components/esp_wifi/src/wifi_init.c index eb6d4945c6..6c4cf395fd 100644 --- a/components/esp_wifi/src/wifi_init.c +++ b/components/esp_wifi/src/wifi_init.c @@ -111,6 +111,10 @@ esp_err_t esp_wifi_deinit(void) return err; } +#if CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT + esp_wifi_beacon_monitor_configure(false, 0, 0, 0, 0); +#endif + #if CONFIG_ESP_WIFI_SLP_IRAM_OPT esp_pm_unregister_light_sleep_default_params_config_callback(); #endif @@ -256,6 +260,11 @@ esp_err_t esp_wifi_init(const wifi_init_config_t *config) return result; } } +#if CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT + esp_wifi_beacon_monitor_configure(true, CONFIG_ESP_WIFI_SLP_BEACON_LOST_TIMEOUT, + CONFIG_ESP_WIFI_SLP_BEACON_LOST_THRESHOLD, CONFIG_ESP_WIFI_SLP_PHY_ON_DELTA_EARLY_TIME, + CONFIG_ESP_WIFI_SLP_PHY_OFF_DELTA_TIMEOUT_TIME); +#endif adc2_cal_include(); //This enables the ADC2 calibration constructor at start up. esp_wifi_config_info();