fix(esp8266): fix system and wifi sleep/wake process error

This commit is contained in:
dongheng
2019-09-18 17:03:08 +08:00
parent 6f3983d39e
commit 4d4e1c0564
12 changed files with 91 additions and 28 deletions

View File

@ -25,6 +25,7 @@
#include "esp8266/rom_functions.h"
#include "driver/rtc.h"
#include "rom/uart.h"
#include "internal/phy_init_data.h"
#define FRC2_LOAD (0x60000620)
#define FRC2_COUNT (0x60000624)
@ -36,8 +37,10 @@
#define FRC2_TICKS_PER_US (5)
#define FRC2_TICKS_MAX (UINT32_MAX / 4)
#define MIN_SLEEP_US (3000)
#define WAKEUP_EARLY_TICKS (272) // about 2620ms
#define SLEEP_MIN_TIME (1000)
#define SLEEP_PROC_TIME (4450)
#define WAKEUP_EARLY_TICKS (264) // PLL and STAL wait ticks
#define MIN_SLEEP_US (SLEEP_MIN_TIME + SLEEP_PROC_TIME)
#define TAG "esp8266_pm"
@ -113,12 +116,43 @@ static inline void update_soc_clk(pm_soc_clk_t *clk, uint32_t us)
WdevTimOffSet += us;
}
void esp_wifi_hw_open(void)
{
phy_open_rf();
}
void esp_wifi_hw_close(void)
{
phy_close_rf();
}
rtc_cpu_freq_t rtc_clk_cpu_freq_get(void)
{
rtc_cpu_freq_t freq;
uint32_t reg = REG_READ(DPORT_CTL_REG);
if (reg & DPORT_CTL_DOUBLE_CLK)
freq = RTC_CPU_FREQ_160M;
else
freq = RTC_CPU_FREQ_80M;
return freq;
}
void rtc_clk_cpu_freq_set(rtc_cpu_freq_t cpu_freq)
{
if (RTC_CPU_FREQ_80M == cpu_freq)
REG_CLR_BIT(DPORT_CTL_REG, DPORT_CTL_DOUBLE_CLK);
else
REG_SET_BIT(DPORT_CTL_REG, DPORT_CTL_DOUBLE_CLK);
}
esp_err_t esp_sleep_enable_timer_wakeup(uint32_t time_in_us)
{
if (time_in_us <= MIN_SLEEP_US)
return ESP_ERR_INVALID_ARG;
s_sleep_duration = time_in_us;
s_sleep_duration = time_in_us - SLEEP_PROC_TIME;
s_sleep_wakup_triggers |= RTC_TIMER_TRIG_EN;
return ESP_OK;
@ -126,14 +160,16 @@ esp_err_t esp_sleep_enable_timer_wakeup(uint32_t time_in_us)
esp_err_t esp_light_sleep_start(void)
{
const uint32_t rtc_cal = esp_clk_cal_get(CRYSTAL_USED);
const uint32_t sleep_rtc_ticks = rtc_time_us_to_clk(s_sleep_duration, rtc_cal);
uint32_t period = pm_rtc_clock_cali_proc();
const uint32_t sleep_rtc_ticks = pm_usec2rtc(s_sleep_duration, period);
const rtc_cpu_freq_t cpu_freq = rtc_clk_cpu_freq_get();
if (sleep_rtc_ticks > WAKEUP_EARLY_TICKS + 1) {
rtc_light_sleep_start(sleep_rtc_ticks - WAKEUP_EARLY_TICKS, s_sleep_wakup_triggers, 0);
rtc_lightsleep_init();
pm_set_sleep_cycles(sleep_rtc_ticks - WAKEUP_EARLY_TICKS);
rtc_light_sleep_start(s_sleep_wakup_triggers, 0);
rtc_wakeup_init();
rtc_clk_init();
rtc_clk_cpu_freq_set(cpu_freq);
return ESP_OK;
@ -180,15 +216,17 @@ void esp_sleep_start(void)
const uint32_t sleep_us = min_sleep_us(&clk);
if (sleep_us > MIN_SLEEP_US) {
const uint32_t rtc_cal = esp_clk_cal_get(CRYSTAL_USED);
const uint32_t sleep_rtc_ticks = rtc_time_us_to_clk(sleep_us, rtc_cal);
uint32_t period = pm_rtc_clock_cali_proc();
const uint32_t sleep_rtc_ticks = pm_usec2rtc(sleep_us - SLEEP_PROC_TIME, period);
if (sleep_rtc_ticks > WAKEUP_EARLY_TICKS + 1) {
const rtc_cpu_freq_t cpu_freq = rtc_clk_cpu_freq_get();
rtc_light_sleep_start(sleep_rtc_ticks - WAKEUP_EARLY_TICKS, s_sleep_wakup_triggers | RTC_TIMER_TRIG_EN, 0);
rtc_lightsleep_init();
pm_set_sleep_cycles(sleep_rtc_ticks - WAKEUP_EARLY_TICKS);
rtc_light_sleep_start(s_sleep_wakup_triggers | RTC_TIMER_TRIG_EN, 0);
rtc_wakeup_init();
rtc_clk_init();
rtc_clk_cpu_freq_set(cpu_freq);
update_soc_clk(&clk, sleep_us);

View File

@ -31,6 +31,8 @@
#include "internal/phy_init_data.h"
#include "phy.h"
#include "driver/rtc.h"
static const char* TAG = "phy_init";
static uint8_t phy_check_calibration_data(uint8_t* rf_cal_data)
@ -105,6 +107,8 @@ esp_err_t esp_phy_rf_init(const esp_phy_init_data_t* init_data, esp_phy_calibrat
uart_tx_wait_idle(1);
uart_div_modify(1, UART_CLK_FREQ / uart_baudrate);
rtc_init_2(local_init_data);
int ret = register_chipv6_phy(local_init_data);
if (ret) {
ESP_LOGI(TAG, "phy register error, ret:%d", ret);