Skip to content

Commit c85856b

Browse files
committed
Update "can deep sleep" function for LP ticker
When the define LPTICKER_DELAY_TICKS is set deep sleep can be randomly disallowed when using the low power ticker. This is because a Timer object, which locks deep sleep, is used to protect from back-to-back writes to lp tickers which can't support that. This patch updates the function sleep_manager_can_deep_sleep() to return that deep sleep is allowed if only the lp ticker's Timeout object is locking deep sleep. This allows tests which assert that deep sleep should be allowed to pass.
1 parent b1081ee commit c85856b

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

hal/mbed_sleep_manager.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "mbed_debug.h"
2323
#include "mbed_stats.h"
2424
#include "lp_ticker_api.h"
25+
#include "mbed_lp_ticker_wrapper.h"
2526
#include <limits.h>
2627
#include <stdio.h>
2728
#include "mbed_stats.h"
@@ -180,7 +181,13 @@ void sleep_manager_unlock_deep_sleep_internal(void)
180181

181182
bool sleep_manager_can_deep_sleep(void)
182183
{
183-
return deep_sleep_lock == 0 ? true : false;
184+
uint32_t lock_count = deep_sleep_lock;
185+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
186+
if (lp_ticker_get_timeout_pending() && (lock_count > 0)) {
187+
lock_count--;
188+
}
189+
#endif
190+
return lock_count == 0 ? true : false;
184191
}
185192

186193
void sleep_manager_sleep_auto(void)
@@ -196,7 +203,11 @@ void sleep_manager_sleep_auto(void)
196203
#ifdef MBED_DEBUG
197204
hal_sleep();
198205
#else
199-
if (sleep_manager_can_deep_sleep()) {
206+
if (sleep_manager_can_deep_sleep()
207+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
208+
&& !lp_ticker_get_timeout_pending()
209+
#endif
210+
) {
200211
deep = true;
201212
hal_deepsleep();
202213
} else {

0 commit comments

Comments
 (0)