示例#1
0
/**
 * Start periodic timer.
 *
 * @param period_in_micro_secs
 */
void ac_start_periodic_timer(ac_u32 period_in_micro_secs) {
  // Register our handler and iacs
  ac_exception_irq_register(&periodic_handler, &periodic_iacs,
      (ac_uptr)&periodic_param);

  // Start the timer
  ac_timer_periodic(periodic_param.timer, period_in_micro_secs);
}
示例#2
0
int main(void) {
  ac_bool error = AC_FALSE;
#if defined(Posix)

  ac_printf("test_ac_timer: no tests for Posix\n");

#elif defined(VersatilePB)
  ac_u32 result;

  //ac_printf("test_ac_timer: initial routes=0x%x enable=0x%x\n",
  //    ac_interrupts_rd_int_routes(), ac_interrupts_rd_int_enable());

  // Set to route to irq then fiq
  ac_interrupts_int_route_to_irq(PIC_ALL);
  error |= AC_TEST(ac_interrupts_rd_int_routes() == 0);
  ac_interrupts_int_route_to_fiq(PIC_ALL);
  error |= AC_TEST(ac_interrupts_rd_int_routes() == 0xFFFFFFFF);

  // Set interrupts disable then enabled
  ac_interrupts_int_disable(PIC_ALL);
  error |= AC_TEST(ac_interrupts_rd_int_enable() == 0);
  ac_interrupts_int_enable(PIC_ALL);
  error |= AC_TEST(ac_interrupts_rd_int_enable() == 0xFFFFFFFF);

  // Back to route to irq and no interrupts
  ac_interrupts_int_route_to_irq(PIC_ALL);
  error |= AC_TEST(ac_interrupts_rd_int_routes() == 0);
  ac_interrupts_int_disable(PIC_ALL);
  error |= AC_TEST(ac_interrupts_rd_int_enable() == 0);

  // Expect 4 timers
  ac_u32 count = ac_timer_get_count();
  error |= AC_TEST(count == 4);
  ac_printf("test_ac_timer: count=%u\n", count);

  /* Loop through all of the timers printing the registers */
  for (ac_u32 i = 0; i < count; i++) {
    ac_u32 value = ac_timer_rd_value(i);
    ac_u32 load = ac_timer_rd_load(i);
    ac_u32 control = ac_timer_rd_control(i);
    ac_u32 ris = ac_timer_rd_ris(i);
    ac_u32 mis = ac_timer_rd_mis(i);
    ac_u32 bgload = ac_timer_rd_bgload(i);
    ac_printf("test_ac_timer: value=%u\n", value);
    ac_printf("test_ac_timer: load=0x%x\n", load);
    ac_printf("test_ac_timer: control=0x%x\n", control);
    ac_printf("test_ac_timer: ris=0x%x\n", ris);
    ac_printf("test_ac_timer: mis=0x%x\n", mis);
    ac_printf("test_ac_timer: bgload=0x%x\n", bgload);
  }

  ac_u32 cur_value = 0;
  ac_timer_free_running(3);
  for (ac_u32 i = 0; i < 10; i++) {
    cur_value = ac_timer_rd_free_running(3);
    ac_printf("test_ac_timer: new free_running_value=%u\n", cur_value);
  }

  irq_param one_shot_param = {
    .timer = 2,
    .source = AC_FALSE,
  };

  cur_value = 1;
  one_shot_counter = cur_value;
  ac_u32 prev_value = cur_value;
  ac_u32 terminal_value = cur_value + 1;
  ac_printf("test_ac_timer: one_shot_counter is %u\n", cur_value);

  result = ac_exception_irq_register(&one_shot_handler, &one_shot_iacs,
      (ac_uptr)&one_shot_param);
  error |= AC_TEST(result == 0);

  ac_timer_one_shot(one_shot_param.timer, 1000);
  for (ac_u32 i = 0; i < 10000 && cur_value != terminal_value; i++) {
    ac_u32 timer_value = ac_timer_rd_value(0);
    ac_u32 timer_ris = ac_timer_rd_ris(0);
    ac_u32 timer_mis = ac_timer_rd_mis(0);
    ac_u32 timer_control = ac_timer_rd_control(0);
    ac_printf("test_ac_timer: new value=%u timer_ris=0x%x"
        " timer_mis=0x%x timer_control=0x%x\n",
        timer_value, timer_ris, timer_mis, timer_control);

    ac_u32 irq_status = ac_interrupts_rd_irq_status();
    ac_u32 fiq_status = ac_interrupts_rd_fiq_status();
    ac_u32 ris_status = ac_interrupts_rd_ris_status();
    ac_u32 int_routes = ac_interrupts_rd_int_routes();
    ac_u32 int_enable = ac_interrupts_rd_int_enable();
    ac_printf("test_ac_timer: irq_status=0x%x fiq_status=0x%x"
        " ris_status=0x%x\n",
        irq_status, fiq_status, ris_status);
    ac_printf("test_ac_timer: int_routes=0x%x int_enable=0x%x\n",
        int_routes, int_enable);

    cur_value = __atomic_load_n(&one_shot_counter, __ATOMIC_ACQUIRE);
    if (cur_value != prev_value) {
      prev_value = cur_value;
      ac_printf("test_ac_timer: one_shot_counter changed to %u\n",
          cur_value);
    }
  }
  error |= AC_TEST(one_shot_counter == terminal_value);

  irq_param periodic_param = {
    .timer = 3,
    .source = AC_FALSE,
  };

  result = ac_exception_irq_register(&periodic_handler, &periodic_iacs,
      (ac_uptr)&periodic_param);
  error |= AC_TEST(result == 0);

  ac_timer_periodic(periodic_param.timer, 1000000);
  cur_value = 1;
  periodic_counter = cur_value;
  prev_value = cur_value;
  terminal_value = cur_value + 3;
  ac_printf("test_ac_timer: periodic_counter is %u\n", cur_value);
  for (ac_u64 i = 0; i < 1000000000 && cur_value != terminal_value; i++) {
    cur_value = __atomic_load_n(&periodic_counter, __ATOMIC_ACQUIRE);
    if (cur_value != prev_value) {
      prev_value = cur_value;
      ac_printf("test_ac_timer: periodic_counter changed to %u\n", cur_value);
    }
  }
  error |= AC_TEST(cur_value == terminal_value);

#else

ac_printf("test_ac_timer: Unknown Platform\n");

#endif

  if (!error) {
    // Succeeded
    ac_printf("OK\n");
  }

  return error;
}