* @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 {
extern "C" {
#endif
+#define ESP_CAL_DATA_CHECK_FAIL 1
+
/**
* @file phy.h
* @brief Declarations for functions provided by libphy.a
* @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);
// 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();
}
}
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;
}