* mechanism for loading calibration data, disable
* "Initialize PHY in startup code" option in menuconfig and call esp_phy_init
* function from the application. For an example usage of esp_phy_init and
- * this function, see do_phy_init function in cpu_start.c
+ * this function, see esp_phy_store_cal_data_to_nvs function in cpu_start.c
*
* @param out_cal_data pointer to calibration data structure to be filled with
* loaded data.
esp_err_t esp_phy_store_cal_data_to_nvs(const esp_phy_calibration_data_t* cal_data);
/**
- * @brief Initialize PHY module
+ * @brief Initialize PHY and RF module
*
- * PHY module should be initialized in order to use WiFi or BT.
- * Now PHY initializing job is done automatically when start WiFi or BT. Users should not
+ * PHY and RF module should be initialized in order to use WiFi or BT.
+ * Now PHY and RF initializing job is done automatically when start WiFi or BT. Users should not
* call this API in their application.
*
* @param init_data PHY parameters. Default set of parameters can
* function.
* @param mode Calibration mode (Full, partial, or no calibration)
* @param[inout] calibration_data
- * @param WiFi is_Waked up from sleep or not
+ * @param is_sleep WiFi wakes up from sleep or not
* @return ESP_OK on success.
* @return ESP_FAIL on fail.
*/
-esp_err_t esp_phy_init(const void* init_data,
- int mode, void* calibration_data, bool is_sleep);
+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, bool is_sleep);
/**
- * @brief De-initialize PHY module
+ * @brief De-initialize PHY and RF module
*
* PHY module should be de-initialized in order to shutdown WiFi or BT.
- * Now PHY de-initializing job is done automatically when stop WiFi or BT. Users should not
+ * Now PHY and RF de-initializing job is done automatically when stop WiFi or BT. Users should not
* call this API in their application.
*
* @return ESP_OK on success.
*/
-esp_err_t esp_phy_deinit(void);
+esp_err_t esp_phy_rf_deinit(void);
+
+/**
+ * @brief Load calibration data from NVS and initialize PHY and RF module
+ */
+void esp_phy_load_cal_and_init(void);
#ifdef __cplusplus
}
#include <string.h>
#include <stdbool.h>
-#include "freertos/FreeRTOS.h"
-#include "freertos/semphr.h"
-#include "freertos/xtensa_api.h"
-#include "freertos/task.h"
-#include "freertos/ringbuf.h"
+#include <sys/lock.h>
#include "rom/ets_sys.h"
#include "rom/rtc.h"
static const char* TAG = "phy_init";
/* Count value to indicate if there is peripheral that has initialized PHY and RF */
-int g_phy_rf_init_count = 0;
+static int s_phy_rf_init_count = 0;
-static xSemaphoreHandle g_phy_rf_init_mux = NULL;
+static _lock_t s_phy_rf_init_lock;
-esp_err_t esp_phy_init(const void* init_data,
- int mode, void* calibration_data, bool is_sleep)
+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, bool is_sleep)
{
- esp_phy_init_data_t* data = (esp_phy_init_data_t *)init_data;
- esp_phy_calibration_mode_t cal_mode = (esp_phy_calibration_mode_t)mode;
- esp_phy_calibration_data_t* cal_data = (esp_phy_calibration_data_t *)calibration_data;
+ assert((s_phy_rf_init_count <= 1) && (s_phy_rf_init_count >= 0));
- assert((g_phy_rf_init_count <= 1) && (g_phy_rf_init_count >= 0));
-
- if (g_phy_rf_init_mux == NULL) {
- g_phy_rf_init_mux = xSemaphoreCreateMutex();
- if (g_phy_rf_init_mux == NULL) {
- ESP_LOGE(TAG, "Create PHY RF mutex fail");
- return ESP_FAIL;
+ _lock_acquire(&s_phy_rf_init_lock);
+ if (s_phy_rf_init_count == 0) {
+ if (is_sleep == false) {
+ REG_SET_BIT(DPORT_CORE_RST_EN_REG, DPORT_MAC_RST);
+ REG_CLR_BIT(DPORT_CORE_RST_EN_REG, DPORT_MAC_RST);
}
- }
-
- xSemaphoreTake(g_phy_rf_init_mux, portMAX_DELAY);
- if (g_phy_rf_init_count == 0) {
- if (is_sleep == false) {
- REG_SET_BIT(DPORT_CORE_RST_EN_REG, DPORT_MAC_RST);
- REG_CLR_BIT(DPORT_CORE_RST_EN_REG, DPORT_MAC_RST);
- }
- // Enable WiFi peripheral clock
- SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, 0x87cf);
+ // Enable WiFi peripheral clock
+ SET_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, 0x87cf);
ESP_LOGV(TAG, "register_chipv7_phy, init_data=%p, cal_data=%p, mode=%d",
init_data, calibration_data, mode);
phy_set_wifi_mode_only(0);
- register_chipv7_phy(data, cal_data, cal_mode);
+ register_chipv7_phy(init_data, calibration_data, mode);
coex_bt_high_prio();
}
- g_phy_rf_init_count++;
- xSemaphoreGive(g_phy_rf_init_mux);
+ s_phy_rf_init_count++;
+ _lock_release(&s_phy_rf_init_lock);
return ESP_OK;
}
-esp_err_t esp_phy_deinit(void)
+esp_err_t esp_phy_rf_deinit(void)
{
- assert((g_phy_rf_init_count <= 2) && (g_phy_rf_init_count >= 1));
+ assert((s_phy_rf_init_count <= 2) && (s_phy_rf_init_count >= 1));
- xSemaphoreTake(g_phy_rf_init_mux, portMAX_DELAY);
- if (g_phy_rf_init_count == 1) {
- // Disable PHY and RF. This is a teporary function.
+ _lock_acquire(&s_phy_rf_init_lock);
+ if (s_phy_rf_init_count == 1) {
+ // Disable PHY and RF. This is a teporary function.
pm_close_rf();
- // Disable WiFi peripheral clock
- CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, 0x87cf);
+ // Disable WiFi peripheral clock
+ CLEAR_PERI_REG_MASK(DPORT_WIFI_CLK_EN_REG, 0x87cf);
}
- g_phy_rf_init_count--;
- xSemaphoreGive(g_phy_rf_init_mux);
+ s_phy_rf_init_count--;
+ _lock_release(&s_phy_rf_init_lock);
return ESP_OK;
}
return err;
}
-void do_phy_init(void)
+void esp_phy_load_cal_and_init(void)
{
- esp_phy_calibration_mode_t calibration_mode = PHY_RF_CAL_PARTIAL;
+#ifdef CONFIG_ESP32_STORE_PHY_CAL_DATA_INTO_NVS
nvs_flash_init();
+ esp_phy_calibration_mode_t calibration_mode = PHY_RF_CAL_PARTIAL;
if (rtc_get_reset_reason(0) == DEEPSLEEP_RESET) {
calibration_mode = PHY_RF_CAL_NONE;
}
calibration_mode = PHY_RF_CAL_FULL;
}
- esp_phy_init(init_data, calibration_mode, cal_data, false);
+ esp_phy_rf_init(init_data, calibration_mode, cal_data, false);
- if (calibration_mode != PHY_RF_CAL_NONE) {
+ if (calibration_mode != PHY_RF_CAL_NONE && err != ESP_OK) {
err = esp_phy_store_cal_data_to_nvs(cal_data);
} else {
err = ESP_OK;
}
esp_phy_release_init_data(init_data);
free(cal_data); // PHY maintains a copy of calibration data, so we can free this
+#else
+ esp_phy_rf_init(NULL, PHY_RF_CAL_NONE, NULL, false);
+#endif
}
#endif // CONFIG_PHY_ENABLED