]> granicus.if.org Git - esp-idf/commitdiff
esp32: fix WiFi timer inaccurate bug
authorLiu Zhi Fu <liuzhifu@espressif.com>
Thu, 11 Oct 2018 12:57:15 +0000 (20:57 +0800)
committerLiu Zhi Fu <liuzhifu@espressif.com>
Wed, 17 Oct 2018 01:47:25 +0000 (09:47 +0800)
Fix the bug that WiFi timer is not accurate when sleep is on

components/esp32/include/esp_wifi_internal.h
components/esp32/lib
components/esp32/phy_init.c

index f486b7aaf6ffb4ff7982b54422535de32c50fef2..acb78eaae358e78e8316697079956db18d70b8c6 100644 (file)
@@ -215,6 +215,15 @@ void *wifi_realloc( void *ptr, size_t size );
   */
 void *wifi_calloc( size_t n, size_t size );
 
+/**
+  * @brief     Update WiFi MAC time
+  *
+  * @param     uint32_t time_delta : time duration since the WiFi/BT common clock is disabled
+  *
+  * @return    Always returns ESP_OK
+  */
+esp_err_t esp_wifi_internal_update_mac_time( uint32_t time_delta );
+
 #ifdef __cplusplus
 }
 #endif
index 9790499df4e75709f171cef5d63b5afa6663d058..2f5fc77efd724c54d78deb8c38abd5b290111180 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 9790499df4e75709f171cef5d63b5afa6663d058
+Subproject commit 2f5fc77efd724c54d78deb8c38abd5b290111180
index 62f82f6fa70241a340b92b1cc5a24a4ddf9dcf83..c15840d582144a0e2a21dcd0d807fdf4c244f919 100644 (file)
@@ -74,6 +74,24 @@ void IRAM_ATTR phy_exit_critical(uint32_t level)
     portEXIT_CRITICAL_NESTED(level);
 }
 
+static inline void phy_update_wifi_mac_time(bool en_clock_stopped)
+{
+    static uint32_t s_common_clock_disable_time = 0;
+
+    if (en_clock_stopped) {
+        s_common_clock_disable_time = esp_timer_get_time();
+    } else {
+        if (s_common_clock_disable_time) {
+            uint64_t now = esp_timer_get_time();
+            uint32_t diff = now - s_common_clock_disable_time;
+
+            esp_wifi_internal_update_mac_time(diff);
+            s_common_clock_disable_time = 0;
+            ESP_LOGD(TAG, "wifi mac time delta: %u", diff);
+        }
+    }
+}
+
 esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibration_mode_t mode, 
                           esp_phy_calibration_data_t* calibration_data, phy_rf_module_t module)
 {
@@ -117,6 +135,8 @@ esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibrat
             }
         }
         if (s_is_phy_rf_en == true){
+            // Update WiFi MAC time before WiFi/BT common clock is enabled
+            phy_update_wifi_mac_time( false );
             // Enable WiFi/BT common peripheral clock
             periph_module_enable(PERIPH_WIFI_BT_COMMON_MODULE);
             phy_set_wifi_mode_only(0);
@@ -130,6 +150,7 @@ esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibrat
 #endif
             }
 
+
 extern esp_err_t wifi_osi_funcs_register(wifi_osi_funcs_t *osi_funcs);
             status = wifi_osi_funcs_register(&g_wifi_osi_funcs);
             if(status != ESP_OK) {
@@ -207,6 +228,8 @@ esp_err_t esp_phy_rf_deinit(phy_rf_module_t module)
         if (s_is_phy_rf_en == false) {
             // Disable PHY and RF.
             phy_close_rf();
+            // Update WiFi MAC time before disalbe WiFi/BT common peripheral clock
+            phy_update_wifi_mac_time(true);
             // Disable WiFi/BT common peripheral clock. Do not disable clock for hardware RNG
             periph_module_disable(PERIPH_WIFI_BT_COMMON_MODULE);
         }