mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-09 12:35:28 +00:00
disable phy and rf
1. add a macro in menuconfig for users to choose whether store phy calibration data into NVS or not. 2. rename some disable phy and rf APIs so that existing code which calls old APIS will fail to compile.
This commit is contained in:
@@ -17,11 +17,7 @@
|
||||
#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"
|
||||
@@ -43,59 +39,47 @@
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -267,10 +251,11 @@ static esp_err_t store_cal_data_to_nvs_handle(nvs_handle handle,
|
||||
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;
|
||||
}
|
||||
@@ -291,15 +276,18 @@ void do_phy_init(void)
|
||||
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
|
||||
|
Reference in New Issue
Block a user