Fixes problems with time not preserved through dsleep (#2148)

* Make the rtc variables not be cleared by the .bss initialization
* Move the save to the right place
This commit is contained in:
Philip Gladstone 2017-10-28 16:16:09 -04:00 committed by Marcel Stör
parent 5c8619eb4d
commit 1a6e83d088
2 changed files with 23 additions and 19 deletions

View File

@ -187,8 +187,9 @@
#define CPU_BOOTUP_MHZ 52
#ifdef RTC_DEBUG_ENABLED
#warn this does not really work....
#define RTC_DBG(...) do { if (rtc_dbg_enabled == 'R') { dbg_printf(__VA_ARGS__); } } while (0)
static bool rtc_dbg_enabled;
static char rtc_dbg_enabled;
#define RTC_DBG_ENABLED() rtc_dbg_enabled = 'R'
#define RTC_DBG_NOT_ENABLED() rtc_dbg_enabled = 0
#else
@ -197,6 +198,8 @@ static bool rtc_dbg_enabled;
#define RTC_DBG_NOT_ENABLED()
#endif
#define NOINIT_ATTR __attribute__((section(".noinit")))
// RTCTIME storage
#define RTC_TIME_MAGIC_POS (RTC_TIME_BASE+0)
#define RTC_CYCLEOFFSETL_POS (RTC_TIME_BASE+1)
@ -210,18 +213,18 @@ static bool rtc_dbg_enabled;
//#define RTC_LASTTODUS_POS (RTC_TIME_BASE+9)
#define RTC_USRATE_POS (RTC_TIME_BASE+8)
static uint32_t rtc_time_magic;
static uint64_t rtc_cycleoffset;
static uint32_t rtc_lastsourceval;
static uint32_t rtc_sourcecycleunits;
static uint32_t rtc_calibration;
static uint32_t rtc_sleeptotalus;
static uint32_t rtc_sleeptotalcycles;
static uint64_t rtc_usatlastrate;
static uint64_t rtc_rateadjustedus;
static uint32_t rtc_todoffsetus;
static uint32_t rtc_lasttodus;
static uint32_t rtc_usrate;
NOINIT_ATTR uint32_t rtc_time_magic;
NOINIT_ATTR uint64_t rtc_cycleoffset;
NOINIT_ATTR uint32_t rtc_lastsourceval;
NOINIT_ATTR uint32_t rtc_sourcecycleunits;
NOINIT_ATTR uint32_t rtc_calibration;
NOINIT_ATTR uint32_t rtc_sleeptotalus;
NOINIT_ATTR uint32_t rtc_sleeptotalcycles;
NOINIT_ATTR uint64_t rtc_usatlastrate;
NOINIT_ATTR uint64_t rtc_rateadjustedus;
NOINIT_ATTR uint32_t rtc_todoffsetus;
NOINIT_ATTR uint32_t rtc_lasttodus;
NOINIT_ATTR uint32_t rtc_usrate;
struct rtc_timeval
@ -503,11 +506,6 @@ extern void rtc_time_enter_deep_sleep_final(void);
static void rtc_time_enter_deep_sleep_us(uint32_t us)
{
if (rtc_time_check_wake_magic())
rtc_time_set_sleep_magic();
else
bbram_save();
rtc_reg_write(0,0);
rtc_reg_write(0,rtc_reg_read(0)&0xffffbfff);
rtc_reg_write(0,rtc_reg_read(0)|0x30);
@ -533,6 +531,11 @@ static void rtc_time_enter_deep_sleep_us(uint32_t us)
uint32_t cycles=rtc_time_us_to_ticks(us);
rtc_time_add_sleep_tracking(us,cycles);
if (rtc_time_check_wake_magic())
rtc_time_set_sleep_magic();
else
bbram_save();
rtc_reg_write(RTC_TARGET_ADDR,rtc_time_read_raw()+cycles);
rtc_reg_write(0x9c,17);
rtc_reg_write(0xa0,3);
@ -744,8 +747,8 @@ static void rtc_time_register_bootup(void)
if (reset_reason!=2) // This was *not* a proper wakeup from a deep sleep. All our time keeping is f*cked!
rtc_time_reset(erase_calibration); // Possibly keep the calibration, it should still be good
rtc_time_select_ccount_source(CPU_BOOTUP_MHZ,true);
rtc_rateadjustedus = rtc_usatlastrate = rtc_time_get_now_us_adjusted();
rtc_todoffsetus = 0;
rtc_rateadjustedus = rtc_usatlastrate = rtc_time_get_now_us_adjusted();
RTC_DBG_ENABLED();
return;
}

View File

@ -207,6 +207,7 @@ SECTIONS
*(COMMON)
. = ALIGN (8);
_bss_end = ABSOLUTE(.);
*(.noinit)
_heap_start = ABSOLUTE(.);
/* _stack_sentry = ALIGN(0x8); */
} >dram0_0_seg :dram0_0_bss_phdr