From a4c8ef9d16d45c58bbfc0aba451e4c197c552f0f Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 8 Feb 2016 21:43:37 +0200 Subject: [PATCH] esp8266: Reset "virtual RTC" on power on. Initialize RTC period coefficients, etc. if RTC RAM doesn't contain valid values. time.time() then will return number of seconds since power-on, unless set to different timebase. This reuses MEM_MAGIC for the purpose beyond its initial purpose (but the whole modpybrtc.c need to be eventually reworked completely anyway). --- esp8266/esp_mphal.c | 1 + esp8266/esp_mphal.h | 1 + esp8266/modpybrtc.c | 14 ++++++++++++++ 3 files changed, 16 insertions(+) diff --git a/esp8266/esp_mphal.c b/esp8266/esp_mphal.c index f5e9468e57..1a46c5f243 100644 --- a/esp8266/esp_mphal.c +++ b/esp8266/esp_mphal.c @@ -37,6 +37,7 @@ extern void ets_delay_us(); void mp_hal_init(void) { ets_wdt_disable(); // it's a pain while developing + mp_hal_rtc_init(); uart_init(UART_BIT_RATE_115200, UART_BIT_RATE_115200); } diff --git a/esp8266/esp_mphal.h b/esp8266/esp_mphal.h index 5c7b816355..f063fb8493 100644 --- a/esp8266/esp_mphal.h +++ b/esp8266/esp_mphal.h @@ -31,6 +31,7 @@ void ets_isr_mask(unsigned); void mp_hal_init(void); +void mp_hal_rtc_init(void); void mp_hal_feed_watchdog(void); uint32_t mp_hal_ticks_us(void); diff --git a/esp8266/modpybrtc.c b/esp8266/modpybrtc.c index 02377985c7..594c34b157 100644 --- a/esp8266/modpybrtc.c +++ b/esp8266/modpybrtc.c @@ -49,6 +49,20 @@ typedef struct _pyb_rtc_obj_t { // singleton RTC object STATIC const pyb_rtc_obj_t pyb_rtc_obj = {{&pyb_rtc_type}}; +void mp_hal_rtc_init(void) { + uint32_t magic; + + system_rtc_mem_read(MEM_USER_MAGIC_ADDR, &magic, sizeof(magic)); + if (magic != MEM_MAGIC) { + magic = MEM_MAGIC; + system_rtc_mem_write(MEM_USER_MAGIC_ADDR, &magic, sizeof(magic)); + uint32_t cal = system_rtc_clock_cali_proc(); + int64_t delta = 0; + system_rtc_mem_write(MEM_CAL_ADDR, &cal, sizeof(cal)); + system_rtc_mem_write(MEM_DELTA_ADDR, &delta, sizeof(delta)); + } +} + STATIC mp_obj_t pyb_rtc_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { // check arguments mp_arg_check_num(n_args, n_kw, 0, 0, false);