Skip to content

Commit ee12581

Browse files
puuudpgeorge
authored andcommitted
esp8266: Let RTC work correctly after deepsleep.
By design, at wake up from deepsleep, the RTC timer will be reset, but the data stored in RTC memory will not [1]. Therefore, we have to adjust delta in RTC memory before going into deepsleep to get almost correct time after waking up. [1] http://bbs.espressif.com/viewtopic.php?t=1184#p4082
1 parent eb78a5c commit ee12581

4 files changed

Lines changed: 15 additions & 1 deletion

File tree

esp8266/modesp.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include "espneopixel.h"
4747
#include "espapa102.h"
4848
#include "modpyb.h"
49+
#include "modpybrtc.h"
4950

5051
#define MODESP_ESPCONN (0)
5152

@@ -540,8 +541,11 @@ STATIC mp_obj_t esp_sleep_type(mp_uint_t n_args, const mp_obj_t *args) {
540541
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_sleep_type_obj, 0, 1, esp_sleep_type);
541542

542543
STATIC mp_obj_t esp_deepsleep(mp_uint_t n_args, const mp_obj_t *args) {
544+
uint32_t sleep_us = n_args > 0 ? mp_obj_get_int(args[0]) : 0;
545+
// prepare for RTC reset at wake up
546+
rtc_prepare_deepsleep(sleep_us);
543547
system_deep_sleep_set_option(n_args > 1 ? mp_obj_get_int(args[1]) : 0);
544-
system_deep_sleep(n_args > 0 ? mp_obj_get_int(args[0]) : 0);
548+
system_deep_sleep(sleep_us);
545549
return mp_const_none;
546550
}
547551
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_deepsleep_obj, 0, 2, esp_deepsleep);

esp8266/modmachine.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ STATIC mp_obj_t machine_deepsleep(void) {
103103
}
104104
}
105105

106+
// prepare for RTC reset at wake up
107+
rtc_prepare_deepsleep(sleep_us);
106108
// put the device in a deep-sleep state
107109
system_deep_sleep_set_option(0); // default power down mode; TODO check this
108110
system_deep_sleep(sleep_us);

esp8266/modpybrtc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ uint64_t pyb_rtc_get_us_since_2000() {
120120
return (((uint64_t)rtc_ticks * cal) >> 12) + delta;
121121
};
122122

123+
void rtc_prepare_deepsleep(uint64_t sleep_us) {
124+
// RTC time will reset at wake up. Let's be preared for this.
125+
int64_t delta = pyb_rtc_get_us_since_2000() + sleep_us;
126+
system_rtc_mem_write(MEM_DELTA_ADDR, &delta, sizeof(delta));
127+
}
128+
123129
STATIC mp_obj_t pyb_rtc_datetime(mp_uint_t n_args, const mp_obj_t *args) {
124130
if (n_args == 1) {
125131
// Get time

esp8266/modpybrtc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,5 @@ extern uint64_t pyb_rtc_alarm0_expiry;
3030
void pyb_rtc_set_us_since_2000(uint64_t nowus);
3131

3232
uint64_t pyb_rtc_get_us_since_2000();
33+
34+
void rtc_prepare_deepsleep(uint64_t sleep_us);

0 commit comments

Comments
 (0)