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;
}
Example #3
0
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;
}