#include #include #include "encoding.h" #include "platform.h" #include "eos.h" #include "timer.h" #include "pwr.h" #define PWR_RTC_SCALE 15 #define PWR_RTC_SFREQ (EOS_TIMER_RTC_FREQ >> PWR_RTC_SCALE) int eos_pwr_init(void) { AON_REG(AON_PMUKEY) = AON_WDOGKEY_VALUE; AON_REG(AON_PMUIE) = 0x5; AON_REG(AON_RTCCMP) = 0xFFFFFFFF; AON_REG(AON_RTCCFG) = PWR_RTC_SCALE; AON_REG(AON_RTCHI) = 0; AON_REG(AON_RTCLO) = 0; return EOS_OK; } uint8_t eos_pwr_wakeup_cause(void) { return AON_REG(AON_PMUCAUSE) & 0xff; } uint8_t eos_pwr_reset_cause(void) { return (AON_REG(AON_PMUCAUSE) >> 8) & 0xff; } void eos_pwr_sleep(void) { AON_REG(AON_PMUKEY) = AON_WDOGKEY_VALUE; AON_REG(AON_PMUSLEEP) = 1; } void eos_pwr_wake_at(uint32_t msec) { uint32_t pmuie; AON_REG(AON_RTCCFG) |= AON_RTCCFG_ENALWAYS; AON_REG(AON_RTCCMP) = msec * PWR_RTC_SFREQ / 1000; pmuie = AON_REG(AON_PMUIE) | (1 << AON_WAKEUPCAUSE_RTC); AON_REG(AON_PMUKEY) = AON_WDOGKEY_VALUE; AON_REG(AON_PMUIE) = pmuie; } void eos_pwr_wake_disable(void) { uint32_t pmuie; AON_REG(AON_RTCCMP) = 0xFFFFFFFF; AON_REG(AON_RTCCFG) &= ~AON_RTCCFG_ENALWAYS; AON_REG(AON_RTCHI) = 0; AON_REG(AON_RTCLO) = 0; pmuie = AON_REG(AON_PMUIE) & ~(1 << AON_WAKEUPCAUSE_RTC); AON_REG(AON_PMUKEY) = AON_WDOGKEY_VALUE; AON_REG(AON_PMUIE) = pmuie; }