lr33kTimer.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:8k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* lr33kTimer.c - LSI Logic LR33xx0 timer library */
  2. /* Copyright 1984-1994 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,21mar95,kvk  integrated into 5.2 vxWorks.
  8. 01a,10sep94,xxx  derived from version 02p of racerx/sysLib.c.
  9. */
  10. /*
  11. DESCRIPTION
  12. This library contains routines to manipulate the timer functions of the
  13. LSI Logic LR33xx0.  This library handles both the system clock and the
  14. auxiliary clock functions.
  15. The macros SYS_CLK_RATE_MIN, SYS_CLK_RATE_MAX, AUX_CLK_RATE_MIN, and
  16. AUX_CLK_RATE_MAX must be defined to provide parameter checking for the
  17. sys[Aux]ClkRateSet() routines.
  18. */
  19. /* locals */
  20. LOCAL FUNCPTR sysClkRoutine = NULL; /* routine to call on clock interrupt */
  21. LOCAL int sysClkArg = NULL; /* its argument */
  22. LOCAL int sysClkRunning = FALSE;
  23. LOCAL int sysClkConnected = FALSE;
  24. LOCAL int sysClkTicksPerSecond = 60;
  25. LOCAL FUNCPTR sysAuxClkRoutine = NULL; /* routine to call on clock interrupt */
  26. LOCAL int sysAuxClkArg = NULL; /* its argument */
  27. LOCAL int sysAuxClkRunning = FALSE;
  28. LOCAL int auxClkConnected = FALSE;
  29. LOCAL int auxClkTicksPerSecond = 60;
  30. /*******************************************************************************
  31. *
  32. * sysClkInt - system clock interrupt handler
  33. *
  34. * This routine handles the system clock interrupt.  It calls a user routine
  35. * if one was specified by the routine sysClkConnect().
  36. */
  37. LOCAL void sysClkInt (void)
  38.     {
  39.     FAST volatile int *pTimer1Cntl = (volatile int *) M_TC1;
  40.     *pTimer1Cntl &= ~TC_INT; /* acknowledge timer int */
  41.     sysWbFlush ();
  42.     if (sysClkRoutine != NULL)
  43.         (* sysClkRoutine) (sysClkArg);
  44.     }
  45. /*******************************************************************************
  46. *
  47. * sysAuxClkInt - auxiliary clock interrupt handler
  48. *
  49. * This routine handles the auxiliary clock interrupt.  It calls a user routine
  50. * if one was specified by the routine sysAuxClkConnect().
  51. */
  52. LOCAL void sysAuxClkInt (void)
  53.     {
  54.     FAST volatile int *pTimer2Cntl = (volatile int *) M_TC2;
  55.     *pTimer2Cntl &= ~TC_INT; /* acknowledge timer int */
  56.     sysWbFlush ();
  57.     if (sysAuxClkRoutine != NULL)
  58.         (* sysAuxClkRoutine) (sysAuxClkArg);
  59.     }
  60. /*******************************************************************************
  61. *
  62. * sysClkConnect - connect a routine to the system clock interrupt
  63. *
  64. * This routine specifies the interrupt service routine to be called at each
  65. * system clock interrupt.  It does not enable system clock interrupts.
  66. * Normally, it is called from usrRoot() in usrConfig.c to connect usrClock()
  67. * to the system clock interrupt.
  68. *
  69. * RETURN: OK, or ERROR if the routine cannot be connected to the interrupt.
  70. *
  71. * SEE ALSO: intConnect(), usrClock(), sysClkEnable()
  72. */
  73. STATUS sysClkConnect
  74.     (
  75.     FUNCPTR routine, /* routine to be called at each clock interrupt */
  76.     int     arg /* argument with which to call routine          */
  77.     )
  78.     {
  79.     sysHwInit2 (); /* XXX for now -- needs to be in usrConfig.c */
  80.     sysClkRoutine   = routine;
  81.     sysClkArg       = arg;
  82.     sysClkConnected = TRUE;
  83.     return (OK);
  84.     }
  85. /*******************************************************************************
  86. *
  87. * sysClkDisable - turn off system clock interrupts
  88. *
  89. * This routine disables system clock interrupts.
  90. *
  91. * RETURNS: N/A
  92. *
  93. * SEE ALSO: sysClkEnable()
  94. */
  95. void sysClkDisable (void)
  96.     {
  97.     FAST volatile int *pTimer1Cntl = (volatile int *) M_TC1;
  98.     if (sysClkRunning)
  99. {
  100.         *pTimer1Cntl = 0;
  101.         sysWbFlush ();
  102.  
  103. sysClkRunning = FALSE; /* clock is no longer running */
  104. }
  105.     }
  106. /*******************************************************************************
  107. *
  108. * sysClkEnable - turn on system clock interrupts
  109. *
  110. * This routine enables system clock interrupts.
  111. *
  112. * RETURNS: N/A
  113. *
  114. * SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()
  115. */
  116. void sysClkEnable (void)
  117.     {
  118.     FAST volatile int *pTimer1Cntl  = (volatile int *) M_TC1;
  119.     FAST volatile int *pTimer1Count = (volatile int *) M_TIC1;
  120.     if (!sysClkRunning)
  121. {
  122.         *pTimer1Count = TIMER_HZ / sysClkTicksPerSecond;
  123.         *pTimer1Cntl = TC_IE | TC_CE;
  124.         sysWbFlush ();
  125.  
  126.         intEnable (INT_LVL_TIMER1); /* enable interrupts at the CPU */
  127.         sysClkRunning = TRUE;
  128. }
  129.     }
  130. /*******************************************************************************
  131. *
  132. * sysClkRateGet - get the system clock rate
  133. *
  134. * This routine returns the interrupt rate of the system clock.
  135. *
  136. * RETURNS: The number of ticks per second of the system clock.
  137. *
  138. * SEE ALSO: sysClkEnable(), sysClkRateSet()
  139. */
  140. int sysClkRateGet (void)
  141.     {
  142.     return (sysClkTicksPerSecond);
  143.     }
  144. /*******************************************************************************
  145. *
  146. * sysClkRateSet - set the system clock rate
  147. *
  148. * This routine sets the interrupt rate of the system clock.  It does not
  149. * enable system clock interrupts.  Normally, it is called by usrRoot() in
  150. * usrConfig.c.
  151. *
  152. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be
  153. * set.
  154. *
  155. * SEE ALSO: sysClkEnable(), sysClkRateGet()
  156. */
  157. STATUS sysClkRateSet
  158.     (
  159.     int ticksPerSecond     /* number of clock interrupts per second */
  160.     )
  161.     {
  162.     if (ticksPerSecond < SYS_CLK_RATE_MIN || ticksPerSecond > SYS_CLK_RATE_MAX)
  163. return (ERROR);
  164.     sysClkTicksPerSecond = ticksPerSecond;
  165.     if (sysClkRunning)
  166. {
  167. sysClkDisable ();
  168. sysClkEnable ();
  169. }
  170.     return (OK);
  171.     }
  172. /*******************************************************************************
  173. *
  174. * sysAuxClkConnect - connect a routine to the auxiliary clock interrupt
  175. *
  176. * This routine specifies the interrupt service routine to be called at each
  177. * auxiliary clock interrupt.  It does not enable auxiliary clock
  178. * interrupts.
  179. *
  180. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  181. *
  182. * SEE ALSO: intConnect(), sysAuxClkEnable()
  183. */
  184. STATUS sysAuxClkConnect
  185.     (
  186.     FUNCPTR routine, /* routine called at each aux. clock interrupt */
  187.     int     arg /* argument with which to call routine         */
  188.     )
  189.     {
  190.     sysAuxClkRoutine   = routine;
  191.     sysAuxClkArg       = arg;
  192.     auxClkConnected    = TRUE;
  193.     return (OK);
  194.     }
  195. /*******************************************************************************
  196. *
  197. * sysAuxClkDisable - turn off auxiliary clock interrupts
  198. *
  199. * This routine disables auxiliary clock interrupts.
  200. *
  201. * RETURNS: N/A
  202. *
  203. * SEE ALSO: sysAuxClkEnable()
  204. */
  205. void sysAuxClkDisable (void)
  206.     {
  207.     FAST volatile int *pTimer2Cntl = (volatile int *) M_TC2;
  208.     if (sysAuxClkRunning)
  209. {
  210.         *pTimer2Cntl = 0;
  211.         sysWbFlush ();
  212.  
  213. sysAuxClkRunning = FALSE; /* clock is no longer running */
  214. }
  215.     }
  216. /*******************************************************************************
  217. *
  218. * sysAuxClkEnable - turn on auxiliary clock interrupts
  219. *
  220. * This routine enables auxiliary clock interrupts.
  221. *
  222. * RETURNS: N/A
  223. *
  224. * SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()
  225. */
  226. void sysAuxClkEnable (void)
  227.     {
  228.     FAST volatile int *pTimer2Cntl  = (volatile int *) M_TC2;
  229.     FAST volatile int *pTimer2Count = (volatile int *) M_TIC2;
  230.     if (!sysAuxClkRunning)
  231. {
  232.         *pTimer2Count = TIMER_HZ / auxClkTicksPerSecond;
  233.         *pTimer2Cntl = TC_IE | TC_CE;
  234.         sysWbFlush ();
  235.  
  236.         intEnable (INT_LVL_TIMER2); /* enable interrupts at the CPU */
  237.         sysAuxClkRunning = TRUE;
  238. }
  239.     }
  240. /*******************************************************************************
  241. *
  242. * sysAuxClkRateGet - get the auxiliary clock rate
  243. *
  244. * This routine returns the interrupt rate of the auxiliary clock.
  245. *
  246. * RETURNS: The number of ticks per second of the auxiliary clock.
  247. *
  248. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()
  249. */
  250. int sysAuxClkRateGet (void)
  251.     {
  252.     return (auxClkTicksPerSecond);
  253.     }
  254. /*******************************************************************************
  255. *
  256. * sysAuxClkRateSet - set the auxiliary clock rate
  257. *
  258. * This routine sets the interrupt rate of the auxiliary clock.
  259. * It does not enable auxiliary clock interrupts.
  260. *
  261. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  262. *
  263. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()
  264. */
  265. STATUS sysAuxClkRateSet
  266.     (
  267.     int ticksPerSecond     /* number of clock interrupts per second */
  268.     )
  269.     {
  270.     if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)
  271. return (ERROR);
  272.     auxClkTicksPerSecond = ticksPerSecond;
  273.     if (sysAuxClkRunning)
  274. {
  275. sysAuxClkDisable ();
  276. sysAuxClkEnable ();
  277. }
  278.     return (OK);
  279.     }