Merge branch 'bugfix/tw23350_fix_brownout_reset' into 'master'
when brownout reset occurs, set the phy TX Power to the lowest See merge request idf/esp-idf!2854
This commit is contained in:
commit
76413309a5
3 changed files with 49 additions and 0 deletions
|
@ -646,6 +646,14 @@ config BROWNOUT_DET_LVL
|
||||||
default 7 if BROWNOUT_DET_LVL_SEL_7
|
default 7 if BROWNOUT_DET_LVL_SEL_7
|
||||||
|
|
||||||
|
|
||||||
|
#Reduce PHY TX power when brownout reset
|
||||||
|
config REDUCE_PHY_TX_POWER
|
||||||
|
bool "Reduce PHY TX power when brownout reset"
|
||||||
|
depends on BROWNOUT_DET
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
When brownout reset occurs, reduce PHY TX power to keep the code running
|
||||||
|
|
||||||
# Note about the use of "FRC1" name: currently FRC1 timer is not used for
|
# Note about the use of "FRC1" name: currently FRC1 timer is not used for
|
||||||
# high resolution timekeeping anymore. Instead the esp_timer API, implemented
|
# high resolution timekeeping anymore. Instead the esp_timer API, implemented
|
||||||
# using FRC2 timer, is used.
|
# using FRC2 timer, is used.
|
||||||
|
|
|
@ -531,6 +531,18 @@ static esp_err_t store_cal_data_to_nvs_handle(nvs_handle handle,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_REDUCE_PHY_TX_POWER
|
||||||
|
static void esp_phy_reduce_tx_power(esp_phy_init_data_t* init_data)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
for(i = 0; i < PHY_TX_POWER_NUM; i++) {
|
||||||
|
// LOWEST_PHY_TX_POWER is the lowest tx power
|
||||||
|
init_data->params[PHY_TX_POWER_OFFSET+i] = PHY_TX_POWER_LOWEST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void esp_phy_load_cal_and_init(phy_rf_module_t module)
|
void esp_phy_load_cal_and_init(phy_rf_module_t module)
|
||||||
{
|
{
|
||||||
esp_phy_calibration_data_t* cal_data =
|
esp_phy_calibration_data_t* cal_data =
|
||||||
|
@ -540,11 +552,30 @@ void esp_phy_load_cal_and_init(phy_rf_module_t module)
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_REDUCE_PHY_TX_POWER
|
||||||
|
const esp_phy_init_data_t* phy_init_data = esp_phy_get_init_data();
|
||||||
|
if (phy_init_data == NULL) {
|
||||||
|
ESP_LOGE(TAG, "failed to obtain PHY init data");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_phy_init_data_t* init_data = (esp_phy_init_data_t*) malloc(sizeof(esp_phy_init_data_t));
|
||||||
|
if (init_data == NULL) {
|
||||||
|
ESP_LOGE(TAG, "failed to allocate memory for phy init data");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(init_data, phy_init_data, sizeof(esp_phy_init_data_t));
|
||||||
|
if (esp_reset_reason() == ESP_RST_BROWNOUT) {
|
||||||
|
esp_phy_reduce_tx_power(init_data);
|
||||||
|
}
|
||||||
|
#else
|
||||||
const esp_phy_init_data_t* init_data = esp_phy_get_init_data();
|
const esp_phy_init_data_t* init_data = esp_phy_get_init_data();
|
||||||
if (init_data == NULL) {
|
if (init_data == NULL) {
|
||||||
ESP_LOGE(TAG, "failed to obtain PHY init data");
|
ESP_LOGE(TAG, "failed to obtain PHY init data");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE
|
#ifdef CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE
|
||||||
esp_phy_calibration_mode_t calibration_mode = PHY_RF_CAL_PARTIAL;
|
esp_phy_calibration_mode_t calibration_mode = PHY_RF_CAL_PARTIAL;
|
||||||
|
@ -571,7 +602,12 @@ void esp_phy_load_cal_and_init(phy_rf_module_t module)
|
||||||
esp_phy_rf_init(init_data, PHY_RF_CAL_FULL, cal_data, module);
|
esp_phy_rf_init(init_data, PHY_RF_CAL_FULL, cal_data, module);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_REDUCE_PHY_TX_POWER
|
||||||
|
esp_phy_release_init_data(phy_init_data);
|
||||||
|
free(init_data);
|
||||||
|
#else
|
||||||
esp_phy_release_init_data(init_data);
|
esp_phy_release_init_data(init_data);
|
||||||
|
#endif
|
||||||
|
|
||||||
free(cal_data); // PHY maintains a copy of calibration data, so we can free this
|
free(cal_data); // PHY maintains a copy of calibration data, so we can free this
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,11 @@
|
||||||
|
|
||||||
#define PHY_INIT_MAGIC "PHYINIT"
|
#define PHY_INIT_MAGIC "PHYINIT"
|
||||||
|
|
||||||
|
// define the lowest tx power as LOWEST_PHY_TX_POWER
|
||||||
|
#define PHY_TX_POWER_LOWEST LIMIT(CONFIG_ESP32_PHY_MAX_TX_POWER * 4, 0, 52)
|
||||||
|
#define PHY_TX_POWER_OFFSET 44
|
||||||
|
#define PHY_TX_POWER_NUM 5
|
||||||
|
|
||||||
static const char phy_init_magic_pre[] = PHY_INIT_MAGIC;
|
static const char phy_init_magic_pre[] = PHY_INIT_MAGIC;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue