Skip to content

Commit

Permalink
Merge branch 'bugfix/no_wakeup_sleep_v4.4' into 'release/v4.4'
Browse files Browse the repository at this point in the history
fix(ble): Fixed Bluetooth not waking up due to clock drift(v4.4)

See merge request espressif/esp-idf!28725
  • Loading branch information
jack0c committed Jan 31, 2024
2 parents 3afb4b5 + 8e41d56 commit 61e7464
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions components/bt/controller/esp32c3/bt.c
Original file line number Diff line number Diff line change
Expand Up @@ -763,19 +763,26 @@ static void btdm_sleep_enter_phase1_wrapper(uint32_t lpcycles)
return;
}

// start a timer to wake up and acquire the pm_lock before modem_sleep awakes
uint32_t us_to_sleep = btdm_lpcycles_2_hus(lpcycles, NULL) >> 1;

#define BTDM_MIN_TIMER_UNCERTAINTY_US (1800)
#define BTDM_RTC_SLOW_CLK_RC_DRIFT_PERCENT 7
assert(us_to_sleep > BTDM_MIN_TIMER_UNCERTAINTY_US);
// allow a maximum time uncertainty to be about 488ppm(1/2048) at least as clock drift
// and set the timer in advance
uint32_t uncertainty = (us_to_sleep >> 11);
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
if (rtc_clk_slow_freq_get() == RTC_SLOW_FREQ_RTC) {
uncertainty = us_to_sleep * BTDM_RTC_SLOW_CLK_RC_DRIFT_PERCENT / 100;
}
#endif

if (uncertainty < BTDM_MIN_TIMER_UNCERTAINTY_US) {
uncertainty = BTDM_MIN_TIMER_UNCERTAINTY_US;
}

assert (s_lp_stat.wakeup_timer_started == 0);
// start a timer to wake up and acquire the pm_lock before modem_sleep awakes
if (esp_timer_start_once(s_btdm_slp_tmr, us_to_sleep - uncertainty) == ESP_OK) {
s_lp_stat.wakeup_timer_started = 1;
} else {
Expand All @@ -794,12 +801,12 @@ static void btdm_sleep_enter_phase2_wrapper(void)
assert(0);
}

if (s_lp_stat.pm_lock_released == 0) {
#ifdef CONFIG_PM_ENABLE
if (s_lp_stat.pm_lock_released == 0) {
esp_pm_lock_release(s_pm_lock);
#endif
s_lp_stat.pm_lock_released = 1;
}
#endif
}
}

Expand Down

0 comments on commit 61e7464

Please sign in to comment.