]> granicus.if.org Git - esp-idf/commitdiff
esp32: some changes relating to phy v3900
authorLiu Zhi Fu <liuzhifu@espressif.com>
Sat, 19 May 2018 04:13:34 +0000 (12:13 +0800)
committerLiu Zhi Fu <liuzhifu@espressif.com>
Tue, 22 May 2018 06:16:09 +0000 (14:16 +0800)
1. Store the calibration data to NVS if PHY does full calibration because of calibration data checksum failure
2. Pass the station's mac to PHY for checksum calculation

components/esp32/include/esp_phy_init.h
components/esp32/phy.h
components/esp32/phy_init.c

index 75cb8fb58e712b91ebe2f887b11215f73f050b9e..0228edf1cf4815dd3d5133e36421b54ca0fffcc7 100644 (file)
@@ -37,7 +37,9 @@ typedef struct {
  * @brief Opaque PHY calibration data
  */
 typedef struct {
-    uint8_t opaque[1904];                   /*!< calibration data */
+    uint8_t version[4];                     /*!< PHY version */
+    uint8_t mac[6];                         /*!< The MAC address of the station */
+    uint8_t opaque[1894];                   /*!< calibration data */
 } esp_phy_calibration_data_t;
 
 typedef enum {
index 71c44cd3d156092400876ec5cf9a1d155fcfeafa..37066d00f9dae9864d4a2b66b8effbfbf4cfae8e 100644 (file)
@@ -19,6 +19,8 @@
 extern "C" {
 #endif
 
+#define ESP_CAL_DATA_CHECK_FAIL 1
+
 /**
  * @file phy.h
  * @brief Declarations for functions provided by libphy.a
@@ -34,7 +36,7 @@ void phy_get_romfunc_addr(void);
  * @param[in] init_data Initialization parameters to be used by the PHY
  * @param[inout] cal_data As input, calibration data previously obtained. As output, will contain new calibration data.
  * @param[in] cal_mode  RF calibration mode
- * @return reserved for future use
+ * @return ESP_CAL_DATA_CHECK_FAIL if calibration data checksum fails, other values are reserved for future use
  */
 int register_chipv7_phy(const esp_phy_init_data_t* init_data, esp_phy_calibration_data_t *cal_data, esp_phy_calibration_mode_t cal_mode);
 
index 027e6733aaf2973c58b93358642f9749a2ed3d67..cf1853387d3165f1c7b93f2c2a69af43c71f8739 100644 (file)
@@ -119,7 +119,16 @@ esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibrat
             // Enable WiFi/BT common peripheral clock
             periph_module_enable(PERIPH_WIFI_BT_COMMON_MODULE);
             phy_set_wifi_mode_only(0);
-            register_chipv7_phy(init_data, calibration_data, mode);
+
+            if (ESP_CAL_DATA_CHECK_FAIL == register_chipv7_phy(init_data, calibration_data, mode)) {
+                ESP_LOGW(TAG, "saving new calibration data because of checksum failure, mode(%d)", mode);
+#ifdef CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE
+                if (mode != PHY_RF_CAL_FULL) {
+                    esp_phy_store_cal_data_to_nvs(calibration_data);
+                }
+#endif
+            }
+
             coex_bt_high_prio();
         }
     }
@@ -476,6 +485,7 @@ static esp_err_t load_cal_data_from_nvs_handle(nvs_handle handle,
         ESP_LOGD(TAG, "%s: invalid length of cal_data (%d)", __func__, length);
         return ESP_ERR_INVALID_SIZE;
     }
+    memcpy(out_cal_data->mac, sta_mac, 6);
     return ESP_OK;
 }