int up_rtc_gettime(FAR struct timespec *tp) { time_t t; uint32_t hires_val; irqstate_t flags; flags = irqsave(); do { /* pending IRQ so theat it */ if (getreg32(EFM32_BURTC_IF) & BURTC_IF_COMP0) efm32_rtc_burtc_interrupt(EFM32_IRQ_BURTC,NULL); t = getreg32(__SEC_OFF_REG); hires_val = getreg32(EFM32_BURTC_CNT) + getreg32(__CNT_OFF_REG); } /* Retry if IRQ appear during register reading */ while (getreg32(EFM32_BURTC_IF) & BURTC_IF_COMP0); irqrestore(flags); t += hires_val / CONFIG_RTC_FREQUENCY; hires_val = hires_val % CONFIG_RTC_FREQUENCY; /* Then we can save the time in seconds and fractional seconds. */ tp->tv_sec = t; tp->tv_nsec = hires_val * (1000000000/CONFIG_RTC_FREQUENCY); return OK; }
time_t up_rtc_time(void) { time_t t; irqstate_t flags; flags = irqsave(); do { /* pending IRQ so theat it */ if (getreg32(EFM32_BURTC_IF) & BURTC_IF_COMP0) efm32_rtc_burtc_interrupt(EFM32_IRQ_BURTC,NULL); t = getreg32(__SEC_OFF_REG) + getreg32(EFM32_BURTC_CNT); } /* Retry if IRQ appear during register reading */ while (getreg32(EFM32_BURTC_IF) & BURTC_IF_COMP0); irqrestore(flags); return t; }
static uint64_t efm32_get_burtc_tick(void) { uint32_t cnt_carry; uint32_t cnt_zero; uint32_t cnt; uint64_t val; irqstate_t flags; flags = irqsave(); do { /* pending IRQ so theat it */ if (getreg32(EFM32_BURTC_IF) & BURTC_IF_COMP0) { efm32_rtc_burtc_interrupt(EFM32_IRQ_BURTC, NULL); } cnt = getreg32(EFM32_BURTC_CNT); cnt_zero = getreg32(__CNT_ZERO_REG); cnt_carry = getreg32(__CNT_CARRY_REG); } /* Retry if IRQ appear during register reading */ while (getreg32(EFM32_BURTC_IF) & BURTC_IF_COMP0); irqrestore(flags); val = (uint64_t)cnt_carry*__CNT_TOP + cnt + cnt_zero; burtcdbg("Get Tick carry %u zero %u reg %u\n", cnt_carry, cnt_carry,cnt); return val; }