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:
XiaXiaotian 2017-02-16 22:06:02 +08:00
parent eb14284c92
commit cd13c9e95d
7 changed files with 64 additions and 63 deletions

View file

@ -17,12 +17,11 @@
#include "btc_task.h"
#include "btc_main.h"
#include "future.h"
#include "esp_phy_init.h"
static bool esp_already_enable = false;
static bool esp_already_init = false;
extern esp_err_t esp_phy_deinit(void);
esp_bluedroid_status_t esp_bluedroid_get_status(void)
{
if (esp_already_init) {
@ -166,7 +165,7 @@ esp_err_t esp_bluedroid_deinit(void)
esp_already_init = false;
esp_phy_deinit();
esp_phy_rf_deinit();
return ESP_OK;
}

View file

@ -27,12 +27,11 @@
#include "esp_task.h"
#include "esp_intr.h"
#include "esp_attr.h"
#include "esp_phy_init.h"
#include "bt.h"
#if CONFIG_BT_ENABLED
extern void do_phy_init(void);
/* not for user call, so don't put to include file */
extern void btdm_osi_funcs_register(void *osi_funcs);
extern void btdm_controller_init(void);
@ -148,7 +147,7 @@ static void bt_controller_task(void *pvParam)
{
btdm_osi_funcs_register(&osi_funcs);
do_phy_init();
esp_phy_load_cal_and_init();
btdm_controller_init();
}

View file

@ -507,6 +507,16 @@ config PHY_ENABLED
menu PHY
visible if PHY_ENABLED
config ESP32_STORE_PHY_CAL_DATA_INTO_NVS
bool "Store PHY calibration data into NVS"
depends on PHY_ENABLED
default y
help
If this option is enabled, PHY initialization will also calibrate PHY data, and
store it into NVS.
If unsure, choose 'y'.
config ESP32_PHY_INIT_DATA_IN_PARTITION
bool "Use a partition to store PHY init data"

View file

@ -192,7 +192,7 @@ void esp_phy_release_init_data(const esp_phy_init_data_t* data);
* 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.
@ -220,10 +220,10 @@ esp_err_t esp_phy_load_cal_data_from_nvs(esp_phy_calibration_data_t* out_cal_dat
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
@ -231,23 +231,28 @@ esp_err_t esp_phy_store_cal_data_to_nvs(const esp_phy_calibration_data_t* cal_da
* 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
}

@ -1 +1 @@
Subproject commit c0d94203602f7dd3d755bb1180a1640c3715c3ae
Subproject commit bc16e8c0749adefcd5bf44c9024849a504b8e839

View file

@ -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

View file

@ -407,7 +407,7 @@ void vPortSetStackWatchpoint( void* pxStackStart ) {
}
uint32_t xPortGetTickRateHz(void) {
return (uint32_t)configTICK_RATE_HZ;
return (uint32_t)configTICK_RATE_HZ;
}