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

VxWorks

开发平台:

C/C++

  1. /* pcc2Timer.c - Peripheral Channel Controller 2 (PCC2) timer library */
  2. /* Copyright 1984-1996 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01e,20dec96,dat  fixed SPR 2672, resetting devices before calling funcs.
  8. 01d,18jun96,wlf  doc: cleanup.
  9. 01c,07jul92,ccc  changed genericTimer.h to timerDev.h.
  10. 01b,25jun92,ccc  changed include to genericTimer.h.
  11. 01a,10jun92,ccc  created by moving routines from sysLib.c of mv167, ANSIfied.
  12. */
  13. /*
  14. DESCRIPTION
  15. This library contains routines to manipulate the timer functions on the
  16. PCC2 chip with a board-independent interface.  This library handles both
  17. the system clock and the auxiliary clock functions.
  18. The macros SYS_CLK_RATE_MIN, SYS_CLK_RATE_MAX, AUX_CLK_RATE_MIN, and
  19. AUX_CLK_RATE_MAX must be defined to provide parameter checking for the
  20. sys[Aux]ClkRateSet() routines.
  21. */
  22. #include "drv/timer/timerDev.h"
  23. /* Locals */ 
  24. #define TICK_FREQ  160000 
  25. LOCAL int     sysClkTicksPerSecond = 60; 
  26. LOCAL BOOL    sysClkRunning        = FALSE; 
  27. LOCAL FUNCPTR sysClkRoutine        = NULL; 
  28. LOCAL int     sysClkArg            = NULL; 
  29. LOCAL BOOL    sysClkConnected      = FALSE; 
  30. LOCAL int     auxClkTicksPerSecond = 100; 
  31. LOCAL BOOL    sysAuxClkRunning     = FALSE; 
  32. LOCAL FUNCPTR sysAuxClkRoutine     = NULL; 
  33. LOCAL int     sysAuxClkArg         = NULL;
  34. LOCAL BOOL    auxClkConnected      = FALSE; 
  35. /********************************************************************************
  36. * sysClkInt - handle system clock interrupts
  37. *
  38. * This routine handles system clock interrupts.
  39. */
  40. LOCAL void sysClkInt (void)
  41.     {
  42.     /* reset clock interrupt */
  43.     *PCC2_T1_IRQ_CR |=  T1_IRQ_CR_ICLR;
  44.     if (sysClkRoutine != NULL)
  45.         (*sysClkRoutine) (sysClkArg);
  46.     }
  47. /*******************************************************************************
  48. *
  49. * sysClkConnect - connect a routine to the system clock interrupt
  50. *
  51. * This routine specifies the interrupt service routine to be called at each
  52. * clock interrupt.  Normally, it is called from usrRoot() in usrConfig.c to
  53. * connect usrClock() to the system clock interrupt.
  54. *
  55. * RETURN: OK, always.
  56. *
  57. * SEE ALSO: intConnect(), usrClock(), sysClkEnable()
  58. */
  59.  
  60. STATUS sysClkConnect
  61.     (
  62.     FUNCPTR routine,    /* routine called at each system clock interrupt */
  63.     int arg             /* argument with which to call routine           */
  64.     )
  65.     {
  66.     sysHwInit2 (); /* XXX for now -- needs to be in usrConfig.c */
  67.  
  68.     sysClkConnected = TRUE;
  69.  
  70.     sysClkRoutine   = routine;
  71.     sysClkArg       = arg;
  72.  
  73.     return (OK);
  74.     }
  75. /********************************************************************************
  76. * sysClkDisable - turn off system clock interrupts
  77. *
  78. * This routine disables system clock interrupts.
  79. *
  80. * RETURNS: N/A
  81. *
  82. * SEE ALSO: sysClkEnable()
  83. */
  84.  
  85. void sysClkDisable (void)
  86.  
  87.     {
  88.     if (sysClkRunning)
  89.         {
  90.         /* disable interrupts */
  91.  
  92.         *PCC2_T1_IRQ_CR = 0;
  93.         *PCC2_TIMER1_CR = 0;    /* and disable counter */
  94.  
  95.         sysClkRunning = FALSE;
  96.         }
  97.     }
  98. /********************************************************************************    
  99. * sysClkEnable - turn on system clock interrupts
  100. *
  101. * This routine enables system clock interrupts.
  102. *
  103. * RETURNS: N/A
  104. *
  105. * SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()
  106. */
  107.  
  108. void sysClkEnable (void)
  109.  
  110.     {
  111.     if (!sysClkRunning)
  112.         {
  113.         /* load compare register with the number of micro seconds */
  114.         *PCC2_TIMER1_CMP = 1000000 / sysClkTicksPerSecond;
  115.         /* enable the clock interrupt. */
  116.         *PCC2_TIMER1_CNT = 0;           /* clear counter */
  117.         /* enable interrupt, clear any pending, and set IRQ level */
  118.         *PCC2_T1_IRQ_CR = T1_IRQ_CR_IEN         |
  119.                           T1_IRQ_CR_ICLR        |
  120.                           SYS_CLK_LEVEL;
  121.         /* now enable timer */
  122.         *PCC2_TIMER1_CR = TIMER1_CR_CEN         |
  123.                           TIMER1_CR_COC;
  124.      
  125.         sysClkRunning = TRUE;
  126.         }
  127.     }
  128. /*******************************************************************************
  129. *
  130. * sysClkRateGet - get the system clock rate
  131. *
  132. * This routine returns the system clock rate.
  133. *
  134. * RETURNS: The number of ticks per second of the system clock.
  135. *
  136. * SEE ALSO: sysClkEnable(), sysClkRateSet()
  137. */
  138.  
  139. int sysClkRateGet (void)
  140.  
  141.     {
  142.     return (sysClkTicksPerSecond);
  143.     }
  144. /********************************************************************************
  145. * sysClkRateSet - set the system clock rate
  146. *
  147. * This routine sets the interrupt rate of the system clock.
  148. * It is called by usrRoot() in usrConfig.c.
  149. *
  150. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be
  151. * set.
  152. *
  153. * SEE ALSO: sysClkEnable(), sysClkRateGet()
  154. */
  155.  
  156. STATUS sysClkRateSet
  157.     (
  158.     int ticksPerSecond     /* number of clock interrupts per second */
  159.     )
  160.     {
  161.     if (ticksPerSecond < SYS_CLK_RATE_MIN || ticksPerSecond > SYS_CLK_RATE_MAX)
  162.         return (ERROR);
  163.  
  164.     sysClkTicksPerSecond = ticksPerSecond;
  165.  
  166.     if (sysClkRunning)
  167.         {
  168.         sysClkDisable ();
  169.         sysClkEnable ();
  170.         }
  171.  
  172.     return (OK);
  173.     }
  174. /********************************************************************************
  175. * sysAuxClkInt - handle auxiliary clock interrupts
  176. */
  177. LOCAL void sysAuxClkInt (void)
  178.     {
  179.     /* reset clock interrupt */
  180.     *PCC2_T2_IRQ_CR |=  T2_IRQ_CR_ICLR;
  181.     if (sysAuxClkRoutine != NULL)
  182.         (*sysAuxClkRoutine) (sysAuxClkArg);
  183.     }
  184. /*******************************************************************************
  185. *
  186. * sysAuxClkConnect - connect a routine to the auxiliary clock interrupt
  187. *
  188. * This routine specifies the interrupt service routine to be called at each
  189. * auxiliary clock interrupt.  It does not enable auxiliary clock interrupts.
  190. *
  191. * RETURNS: OK, always.
  192. *
  193. * SEE ALSO: intConnect(), sysAuxClkEnable()
  194. */
  195.  
  196. STATUS sysAuxClkConnect
  197.     (
  198.     FUNCPTR routine,    /* routine called at each aux clock interrupt    */
  199.     int arg             /* argument to auxiliary clock interrupt routine */
  200.     )
  201.     {
  202.     auxClkConnected  = TRUE;
  203.  
  204.     sysAuxClkRoutine = routine;
  205.     sysAuxClkArg     = arg;
  206.  
  207.     return (OK);
  208.     }
  209. /********************************************************************************
  210. * sysAuxClkDisable - turn off auxiliary clock interrupts
  211. *
  212. * This routine disables auxiliary clock interrupts.
  213. *
  214. * RETURNS: N/A
  215. *
  216. * SEE ALSO: sysAuxClkEnable()
  217. */
  218.  
  219. void sysAuxClkDisable (void)
  220.  
  221.     {
  222.     if (sysAuxClkRunning)
  223.         {
  224.         /* disable interrupts */
  225.  
  226.         *PCC2_T2_IRQ_CR = 0;
  227.         *PCC2_TIMER2_CR = 0;
  228.  
  229.         sysAuxClkRunning = FALSE;
  230.         }
  231.     }
  232. /********************************************************************************
  233. * sysAuxClkEnable - turn on auxiliary clock interrupts
  234. *
  235. * This routine enables auxiliary clock interrupts.
  236. *
  237. * RETURNS: N/A
  238. *
  239. * SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()
  240. */
  241.  
  242. void sysAuxClkEnable (void)
  243.  
  244.     {
  245.     if (!sysAuxClkRunning)
  246.         {
  247.         /* load compare register with the number of micro seconds per tick */
  248.  
  249.         *PCC2_TIMER2_CMP = 1000000 / auxClkTicksPerSecond;
  250.  
  251.         /* enable the clock interrupt */
  252.  
  253.         *PCC2_TIMER2_CNT = 0;   /* clear counter */
  254.  
  255.         /* enable interrupt, clear any pending, and set IRQ level */
  256.  
  257.         *PCC2_T2_IRQ_CR = T2_IRQ_CR_IEN         |
  258.                           T2_IRQ_CR_ICLR        |
  259.                           AUX_CLK_LEVEL;
  260.  
  261.         /* now enable timer */
  262.  
  263.         *PCC2_TIMER2_CR = TIMER2_CR_CEN         |
  264.                           TIMER2_CR_COC;
  265.  
  266.         sysAuxClkRunning = TRUE;
  267.         }
  268.     }
  269. /*******************************************************************************
  270. *
  271. * sysAuxClkRateGet - get the auxiliary clock rate
  272. *
  273. * This routine returns the interrupt rate of the auxiliary clock.
  274. *
  275. * RETURNS: The number of ticks per second of the auxiliary clock.
  276. *
  277. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()
  278. */
  279.  
  280. int sysAuxClkRateGet (void)
  281.  
  282.     {
  283.     return (auxClkTicksPerSecond);
  284.     }
  285. /*******************************************************************************
  286. *
  287. * sysAuxClkRateSet - set the auxiliary clock rate
  288. *
  289. * This routine sets the interrupt rate of the auxiliary clock.
  290. * It does not enable auxiliary clock interrupts.
  291. *
  292. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  293. *
  294. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()
  295. */
  296.  
  297. STATUS sysAuxClkRateSet
  298.     (
  299.     int ticksPerSecond     /* number of clock interrupts per second */
  300.     )
  301.     {
  302.     if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)
  303.         return (ERROR);
  304.  
  305.     auxClkTicksPerSecond = ticksPerSecond;
  306.  
  307.     if (sysAuxClkRunning)
  308.         {
  309.         sysAuxClkDisable ();
  310.         sysAuxClkEnable ();
  311.         }
  312.  
  313.     return (OK);
  314.     }