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:
parent
5c8619eb4d
commit
1a6e83d088
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue