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 #define CPU_BOOTUP_MHZ 52
#ifdef RTC_DEBUG_ENABLED #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) #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_ENABLED() rtc_dbg_enabled = 'R'
#define RTC_DBG_NOT_ENABLED() rtc_dbg_enabled = 0 #define RTC_DBG_NOT_ENABLED() rtc_dbg_enabled = 0
#else #else
@ -197,6 +198,8 @@ static bool rtc_dbg_enabled;
#define RTC_DBG_NOT_ENABLED() #define RTC_DBG_NOT_ENABLED()
#endif #endif
#define NOINIT_ATTR __attribute__((section(".noinit")))
// RTCTIME storage // RTCTIME storage
#define RTC_TIME_MAGIC_POS (RTC_TIME_BASE+0) #define RTC_TIME_MAGIC_POS (RTC_TIME_BASE+0)
#define RTC_CYCLEOFFSETL_POS (RTC_TIME_BASE+1) #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_LASTTODUS_POS (RTC_TIME_BASE+9)
#define RTC_USRATE_POS (RTC_TIME_BASE+8) #define RTC_USRATE_POS (RTC_TIME_BASE+8)
static uint32_t rtc_time_magic; NOINIT_ATTR uint32_t rtc_time_magic;
static uint64_t rtc_cycleoffset; NOINIT_ATTR uint64_t rtc_cycleoffset;
static uint32_t rtc_lastsourceval; NOINIT_ATTR uint32_t rtc_lastsourceval;
static uint32_t rtc_sourcecycleunits; NOINIT_ATTR uint32_t rtc_sourcecycleunits;
static uint32_t rtc_calibration; NOINIT_ATTR uint32_t rtc_calibration;
static uint32_t rtc_sleeptotalus; NOINIT_ATTR uint32_t rtc_sleeptotalus;
static uint32_t rtc_sleeptotalcycles; NOINIT_ATTR uint32_t rtc_sleeptotalcycles;
static uint64_t rtc_usatlastrate; NOINIT_ATTR uint64_t rtc_usatlastrate;
static uint64_t rtc_rateadjustedus; NOINIT_ATTR uint64_t rtc_rateadjustedus;
static uint32_t rtc_todoffsetus; NOINIT_ATTR uint32_t rtc_todoffsetus;
static uint32_t rtc_lasttodus; NOINIT_ATTR uint32_t rtc_lasttodus;
static uint32_t rtc_usrate; NOINIT_ATTR uint32_t rtc_usrate;
struct rtc_timeval 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) 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,0);
rtc_reg_write(0,rtc_reg_read(0)&0xffffbfff); rtc_reg_write(0,rtc_reg_read(0)&0xffffbfff);
rtc_reg_write(0,rtc_reg_read(0)|0x30); 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); uint32_t cycles=rtc_time_us_to_ticks(us);
rtc_time_add_sleep_tracking(us,cycles); 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(RTC_TARGET_ADDR,rtc_time_read_raw()+cycles);
rtc_reg_write(0x9c,17); rtc_reg_write(0x9c,17);
rtc_reg_write(0xa0,3); 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! 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_reset(erase_calibration); // Possibly keep the calibration, it should still be good
rtc_time_select_ccount_source(CPU_BOOTUP_MHZ,true); rtc_time_select_ccount_source(CPU_BOOTUP_MHZ,true);
rtc_rateadjustedus = rtc_usatlastrate = rtc_time_get_now_us_adjusted();
rtc_todoffsetus = 0; rtc_todoffsetus = 0;
rtc_rateadjustedus = rtc_usatlastrate = rtc_time_get_now_us_adjusted();
RTC_DBG_ENABLED(); RTC_DBG_ENABLED();
return; return;
} }

View File

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