drv_timer.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "rtthread.h"
  2. #include "xparameters.h"
  3. #include "xscutimer.h"
  4. #define APU_FREQ XPAR_PS7_CORTEXA9_0_CPU_CLK_FREQ_HZ
  5. #define TIMER_DEVICE_ID XPAR_XSCUTIMER_0_DEVICE_ID
  6. #define TIMER_IRPT_INTR XPAR_SCUTIMER_INTR
  7. static XScuTimer timer;
  8. static void rt_hw_timer_isr(int vector, void *param)
  9. {
  10. rt_tick_increase();
  11. XScuTimer_ClearInterruptStatus(&timer);
  12. }
  13. int rt_hw_timer_init(void)
  14. {
  15. XScuTimer_Config *cfg;
  16. s32 err;
  17. cfg = XScuTimer_LookupConfig(TIMER_DEVICE_ID);
  18. RT_ASSERT(cfg);
  19. err = XScuTimer_CfgInitialize(&timer, cfg, cfg->BaseAddr);
  20. RT_ASSERT(err == XST_SUCCESS);
  21. err = XScuTimer_SelfTest(&timer);
  22. RT_ASSERT(err == XST_SUCCESS);
  23. rt_hw_interrupt_install(TIMER_IRPT_INTR, rt_hw_timer_isr, RT_NULL, "tick");
  24. rt_hw_interrupt_umask(TIMER_IRPT_INTR);
  25. XScuTimer_EnableInterrupt(&timer);
  26. XScuTimer_LoadTimer(&timer, APU_FREQ/2/RT_TICK_PER_SECOND);
  27. XScuTimer_EnableAutoReload(&timer);
  28. XScuTimer_Start(&timer);
  29. return 0;
  30. }
  31. INIT_BOARD_EXPORT(rt_hw_timer_init);