From 54259799321192f0def5bb799bad2da5bc84f759 Mon Sep 17 00:00:00 2001 From: zhangyanjiao Date: Wed, 25 Jul 2018 17:28:56 +0800 Subject: [PATCH] =?UTF-8?q?when=20brownout=20reset=20occurs=EF=BC=8Cset=20?= =?UTF-8?q?the=20phy=20TX=20Power=20to=20the=20lowest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/esp32/Kconfig | 8 +++++++ components/esp32/phy_init.c | 36 ++++++++++++++++++++++++++++++++ components/esp32/phy_init_data.h | 5 +++++ 3 files changed, 49 insertions(+) diff --git a/components/esp32/Kconfig b/components/esp32/Kconfig index 2f7d4c868..aa7415f57 100644 --- a/components/esp32/Kconfig +++ b/components/esp32/Kconfig @@ -646,6 +646,14 @@ config BROWNOUT_DET_LVL 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 # high resolution timekeeping anymore. Instead the esp_timer API, implemented # using FRC2 timer, is used. diff --git a/components/esp32/phy_init.c b/components/esp32/phy_init.c index 2da98c31b..62f82f6fa 100644 --- a/components/esp32/phy_init.c +++ b/components/esp32/phy_init.c @@ -531,6 +531,18 @@ static esp_err_t store_cal_data_to_nvs_handle(nvs_handle handle, 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) { esp_phy_calibration_data_t* cal_data = @@ -540,11 +552,30 @@ void esp_phy_load_cal_and_init(phy_rf_module_t module) 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(); if (init_data == NULL) { ESP_LOGE(TAG, "failed to obtain PHY init data"); abort(); } +#endif #ifdef CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE 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); #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); +#endif free(cal_data); // PHY maintains a copy of calibration data, so we can free this } diff --git a/components/esp32/phy_init_data.h b/components/esp32/phy_init_data.h index d09bbdd9c..cb211152a 100644 --- a/components/esp32/phy_init_data.h +++ b/components/esp32/phy_init_data.h @@ -21,6 +21,11 @@ #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; /**