drv_hw_timer.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include "timer.h"
  4. #include "sysctl.h"
  5. struct khwtimer
  6. {
  7. rt_hwtimer_t time_device;
  8. timer_device_number_t devno;
  9. int chn;
  10. const char *name;
  11. };
  12. extern uint32_t timer_get_count(timer_device_number_t timer_number, timer_channel_number_t channel);
  13. extern void timer_set_reload(timer_device_number_t timer_number, timer_channel_number_t channel, uint32_t count);
  14. static int timer_isr(void *ctx)
  15. {
  16. struct khwtimer *ktm = (struct khwtimer*)ctx;
  17. rt_device_hwtimer_isr(&ktm->time_device);
  18. return 0;
  19. }
  20. static void khwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state)
  21. {
  22. struct khwtimer *ktm = (struct khwtimer*)(timer->parent.user_data);
  23. RT_ASSERT(ktm->devno < TIMER_DEVICE_2);
  24. if (state)
  25. {
  26. sysctl_clock_enable(SYSCTL_CLOCK_TIMER0 + ktm->devno);
  27. }
  28. else
  29. {
  30. timer_set_enable(ktm->devno, ktm->chn, 0);
  31. }
  32. }
  33. static rt_err_t khwtimer_start(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode)
  34. {
  35. struct khwtimer *ktm = (struct khwtimer*)(timer->parent.user_data);
  36. RT_ASSERT(ktm->devno < TIMER_DEVICE_2);
  37. timer_set_reload(ktm->devno, ktm->chn, cnt);
  38. timer_irq_register(ktm->devno, ktm->chn,
  39. mode == HWTIMER_MODE_ONESHOT,
  40. 1,
  41. timer_isr, ktm);
  42. timer_set_enable(ktm->devno, ktm->chn, 1);
  43. return 0;
  44. }
  45. static void khwtimer_stop(struct rt_hwtimer_device *timer)
  46. {
  47. struct khwtimer *ktm = (struct khwtimer*)(timer->parent.user_data);
  48. RT_ASSERT(ktm->devno < TIMER_DEVICE_2);
  49. timer_set_enable(ktm->devno, ktm->chn, 0);
  50. }
  51. static rt_uint32_t khwtimer_count_get(struct rt_hwtimer_device *timer)
  52. {
  53. struct khwtimer *ktm = (struct khwtimer*)(timer->parent.user_data);
  54. RT_ASSERT(ktm->devno < TIMER_DEVICE_2);
  55. return timer_get_count(ktm->devno, ktm->chn);
  56. }
  57. static rt_err_t khwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args)
  58. {
  59. struct khwtimer *ktm = (struct khwtimer*)(timer->parent.user_data);
  60. rt_uint32_t *f = (rt_uint32_t *)args;
  61. return 0;
  62. }
  63. static const struct rt_hwtimer_ops _ops =
  64. {
  65. khwtimer_init,
  66. khwtimer_start,
  67. khwtimer_stop,
  68. khwtimer_count_get,
  69. khwtimer_control
  70. };
  71. static struct rt_hwtimer_info _info =
  72. {
  73. .maxcnt = 0xffffffff,
  74. .cntmode = HWTIMER_CNTMODE_DW
  75. };
  76. int k210_hwtimer_init(void)
  77. {
  78. struct khwtimer *ktm;
  79. _info.maxfreq = sysctl_clock_get_freq(SYSCTL_CLOCK_TIMER0);
  80. _info.minfreq = _info.maxfreq;
  81. #if defined(BSP_TIMER0_CHN0_ENABLE) || defined(BSP_TIMER0_CHN1_ENABLE) || defined(BSP_TIMER0_CHN2_ENABLE) || defined(BSP_TIMER0_CHN3_ENABLE)
  82. timer_init(TIMER_DEVICE_0);
  83. sysctl_clock_disable(SYSCTL_CLOCK_TIMER0);
  84. #endif
  85. #ifdef BSP_TIMER0_CHN0_ENABLE
  86. static struct khwtimer _timer00;
  87. ktm = &_timer00;
  88. ktm->devno = TIMER_DEVICE_0;
  89. ktm->chn = TIMER_CHANNEL_0;
  90. ktm->name = "timer00";
  91. ktm->time_device.ops = &_ops;
  92. ktm->time_device.info = &_info;
  93. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  94. #endif
  95. #ifdef BSP_TIMER0_CHN1_ENABLE
  96. static struct khwtimer _timer01;
  97. ktm = &_timer01;
  98. ktm->devno = TIMER_DEVICE_0;
  99. ktm->chn = TIMER_CHANNEL_1;
  100. ktm->name = "timer01";
  101. ktm->time_device.ops = &_ops;
  102. ktm->time_device.info = &_info;
  103. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  104. #endif
  105. #ifdef BSP_TIMER0_CHN2_ENABLE
  106. static struct khwtimer _timer02;
  107. ktm = &_timer02;
  108. ktm->devno = TIMER_DEVICE_0;
  109. ktm->chn = TIMER_CHANNEL_2;
  110. ktm->name = "timer02";
  111. ktm->time_device.ops = &_ops;
  112. ktm->time_device.info = &_info;
  113. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  114. #endif
  115. #ifdef BSP_TIMER0_CHN3_ENABLE
  116. static struct khwtimer _timer03;
  117. ktm = &_timer03;
  118. ktm->devno = TIMER_DEVICE_0;
  119. ktm->chn = TIMER_CHANNEL_3;
  120. ktm->name = "timer03";
  121. ktm->time_device.ops = &_ops;
  122. ktm->time_device.info = &_info;
  123. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  124. #endif
  125. #if defined(BSP_TIMER1_CHN0_ENABLE) || defined(BSP_TIMER1_CHN1_ENABLE) || defined(BSP_TIMER1_CHN2_ENABLE) || defined(BSP_TIMER1_CHN3_ENABLE)
  126. timer_init(TIMER_DEVICE_1);
  127. sysctl_clock_disable(SYSCTL_CLOCK_TIMER1);
  128. #endif
  129. #ifdef BSP_TIMER1_CHN0_ENABLE
  130. static struct khwtimer _timer10;
  131. ktm = &_timer10;
  132. ktm->devno = TIMER_DEVICE_1;
  133. ktm->chn = TIMER_CHANNEL_0;
  134. ktm->name = "timer10";
  135. ktm->time_device.ops = &_ops;
  136. ktm->time_device.info = &_info;
  137. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  138. #endif
  139. #ifdef BSP_TIMER1_CHN1_ENABLE
  140. static struct khwtimer _timer11;
  141. ktm = &_timer11;
  142. ktm->devno = TIMER_DEVICE_1;
  143. ktm->chn = TIMER_CHANNEL_1;
  144. ktm->name = "timer11";
  145. ktm->time_device.ops = &_ops;
  146. ktm->time_device.info = &_info;
  147. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  148. #endif
  149. #ifdef BSP_TIMER1_CHN2_ENABLE
  150. static struct khwtimer _timer12;
  151. ktm = &_timer12;
  152. ktm->devno = TIMER_DEVICE_1;
  153. ktm->chn = TIMER_CHANNEL_2;
  154. ktm->name = "timer12";
  155. ktm->time_device.ops = &_ops;
  156. ktm->time_device.info = &_info;
  157. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  158. #endif
  159. #ifdef BSP_TIMER1_CHN3_ENABLE
  160. static struct khwtimer _timer13;
  161. ktm = &_timer13;
  162. ktm->devno = TIMER_DEVICE_1;
  163. ktm->chn = TIMER_CHANNEL_3;
  164. ktm->name = "timer13";
  165. ktm->time_device.ops = &_ops;
  166. ktm->time_device.info = &_info;
  167. rt_device_hwtimer_register(&ktm->time_device, ktm->name, ktm);
  168. #endif
  169. return RT_EOK;
  170. }
  171. INIT_DEVICE_EXPORT(k210_hwtimer_init);