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

VxWorks

开发平台:

C/C++

  1. /* z8036Timer.c - Z8036 timer library */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,15dec92,caf  moved clock routines from ver 01y of mv135/sysLib.c, ansified.
  8. */
  9. /*
  10. DESCRIPTION
  11. This library contains routines to manipulate the timer functions on the
  12. Zilog Z8036.  This library handles both the system clock and the auxiliary
  13. clock functions.
  14. The macros SYS_CLK_RATE_MIN, SYS_CLK_RATE_MAX, AUX_CLK_RATE_MIN, and
  15. AUX_CLK_RATE_MAX must be defined to provide parameter checking for the
  16. sys[Aux]ClkRateSet() routines.
  17. The macro ZCIO_HZ must also be defined to indicate the clock frequency
  18. of the Z8036.
  19. The system clock is the ZCIO counter/timer 1.
  20. The auxiliary clock is the ZCIO counter/timer 2.
  21. SEE ALSO
  22. .I "ZCIO Counter/Timer and Parallel I/O Unit Technical Manual"
  23. */
  24. /* locals */
  25. LOCAL FUNCPTR sysClkRoutine           = NULL;
  26. LOCAL int     sysClkArg               = NULL;
  27. LOCAL int     sysClkTicksPerSecond    = 60;
  28. LOCAL BOOL    sysClkConnected         = FALSE;
  29. LOCAL int     sysClkRunning           = FALSE;
  30. LOCAL FUNCPTR sysAuxClkRoutine        = NULL;
  31. LOCAL int     sysAuxClkArg            = NULL;
  32. LOCAL int     sysAuxClkTicksPerSecond = 60;
  33. LOCAL BOOL    sysAuxClkConnected      = FALSE;
  34. LOCAL int     sysAuxClkRunning        = FALSE;
  35. /*******************************************************************************
  36. *
  37. * sysClkInt - clock interrupt handler
  38. */
  39. LOCAL void sysClkInt (void)
  40.     {
  41.     char mask = *Z8036_CTIV(CIO_ADRS) & 0x06;
  42.     if (mask & 0x04) /* main system clock */
  43. {
  44. /* invoke user system clock routine */
  45. if (sysClkRoutine != NULL)
  46.     (*(FUNCPTR) sysClkRoutine) (sysClkArg);
  47. /* clear pending interupt and under service flags */
  48. *Z8036_CT1CS(CIO_ADRS) = ZCIO_CS_CLIPIUS;
  49. /* restart timer */
  50. *Z8036_CT1CS(CIO_ADRS) = ZCIO_CS_SIE | ZCIO_CS_GCB | ZCIO_CS_TCB;
  51. }
  52.     else
  53. {
  54. /* invoke auxiliary clock routine */
  55. if (sysAuxClkRoutine != NULL)
  56.     (*(FUNCPTR) sysAuxClkRoutine) (sysAuxClkArg);
  57. /* clear pending interupt and under service flags */
  58. *Z8036_CT2CS(CIO_ADRS) = ZCIO_CS_CLIPIUS;
  59. /* restart timer */
  60. *Z8036_CT2CS(CIO_ADRS) = ZCIO_CS_SIE | ZCIO_CS_GCB | ZCIO_CS_TCB;
  61. }
  62.     }
  63. /*******************************************************************************
  64. *
  65. * sysClkConnect - connect a routine to the system clock interrupt
  66. *
  67. * This routine specifies the interrupt service routine to be called at each
  68. * clock interrupt.  It does not enable system clock interrupts.  Normally,
  69. * it is called from usrRoot() in usrConfig.c to connect usrClock() to the
  70. * system clock interrupt.
  71. *
  72. * NOTE:
  73. * The abort switch is also set up at this time.
  74. *
  75. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  76. *
  77. * SEE ALSO: intConnect(), usrClock(), sysClkEnable()
  78. */
  79. STATUS sysClkConnect
  80.     (
  81.     FUNCPTR routine,
  82.     int     arg
  83.     )
  84.     {
  85.     sysHwInit2 (); /* XXX for now -- needs to be in usrConfig.c */
  86.     sysClkRoutine   = routine;
  87.     sysClkArg       = arg;
  88.     sysClkConnected = TRUE;
  89.     return (OK);
  90.     }
  91. /*******************************************************************************
  92. *
  93. * sysClkDisable - turn off system clock interrupts
  94. *
  95. * This routine disables system clock interrupts.
  96. *
  97. * RETURNS: N/A
  98. *
  99. * SEE ALSO: sysClkEnable()
  100. */
  101. void sysClkDisable (void)
  102.     {
  103.     if (sysClkRunning)
  104. {
  105. *Z8036_MCC(CIO_ADRS) &= (~ZCIO_MCC_CT1E); /* stop interrupts */
  106. *Z8036_CT1CS(CIO_ADRS) = ZCIO_CS_CLIE; /* clear intr enable */
  107. sysClkRunning = FALSE;
  108. }
  109.     }
  110. /*******************************************************************************
  111. *
  112. * sysClkEnable - turn on system clock interrupts
  113. *
  114. * This routine enables system clock interrupts.
  115. *
  116. * RETURNS: N/A
  117. *
  118. * SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()
  119. */
  120. void sysClkEnable (void)
  121.     {
  122.     unsigned int tc; /* time constant */
  123.     if (!sysClkRunning)
  124. {
  125. /* initialize timer A; the timer chip has been prepared in sysHwInit */
  126. tc = ZCIO_HZ / sysClkTicksPerSecond;
  127. *Z8036_CT1CS(CIO_ADRS) = ZCIO_CS_CLIE; /* disable interrupts */
  128. /* set time constant */
  129. *Z8036_CT1TCMSB(CIO_ADRS) = MSB(tc);
  130. *Z8036_CT1TCLSB(CIO_ADRS) = LSB(tc);
  131. *Z8036_MCC(CIO_ADRS) |= ZCIO_MCC_CT1E; /* enable interrupts */
  132. /* start timer */
  133. *Z8036_CT1CS(CIO_ADRS)  = ZCIO_CS_SIE | ZCIO_CS_GCB | ZCIO_CS_TCB;
  134. sysClkRunning = TRUE;
  135. }
  136.     }
  137. /*******************************************************************************
  138. *
  139. * sysClkRateGet - get the system clock rate
  140. *
  141. * This routine returns the interrupt rate of the system clock.
  142. *
  143. * RETURNS: The number of ticks per second of the system clock.
  144. *
  145. * SEE ALSO: sysClkEnable(), sysClkRateSet()
  146. */
  147. int sysClkRateGet (void)
  148.     {
  149.     return (sysClkTicksPerSecond);
  150.     }
  151. /*******************************************************************************
  152. *
  153. * sysClkRateSet - set the system clock rate
  154. *
  155. * This routine sets the interrupt rate of the system clock.  It does not
  156. * enable system clock interrupts.  Normally, it is called by usrRoot() in
  157. * usrConfig.c.
  158. *
  159. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  160. *
  161. * SEE ALSO: sysClkEnable(), sysClkRateGet()
  162. */
  163. STATUS sysClkRateSet
  164.     (
  165.     int ticksPerSecond
  166.     )
  167.     {
  168.     if (ticksPerSecond < SYS_CLK_RATE_MIN || ticksPerSecond > SYS_CLK_RATE_MAX)
  169.         return (ERROR);
  170.     sysClkTicksPerSecond = ticksPerSecond;
  171.     if (sysClkRunning)
  172. {
  173. sysClkDisable ();
  174. sysClkEnable ();
  175. }
  176.     return (OK);
  177.     }
  178. /*******************************************************************************
  179. *
  180. * sysAuxClkConnect - connect a routine to the auxiliary clock interrupt
  181. *
  182. * This routine specifies the interrupt service routine to be called at each
  183. * auxiliary clock interrupt.  It does not enable auxiliary clock
  184. * interrupts.
  185. *
  186. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  187. *
  188. * SEE ALSO: intConnect(), sysAuxClkEnable()
  189. */
  190. STATUS sysAuxClkConnect
  191.     (
  192.     FUNCPTR routine,
  193.     int     arg
  194.     )
  195.     {
  196.     sysAuxClkRoutine    = routine;
  197.     sysAuxClkArg        = arg;
  198.     sysAuxClkConnected  = TRUE;
  199.     return (OK);
  200.     }
  201. /*******************************************************************************
  202. *
  203. * sysAuxClkDisable - turn off auxiliary clock interrupts
  204. *
  205. * This routine disables auxiliary clock interrupts.
  206. *
  207. * RETURNS: N/A
  208. *
  209. * SEE ALSO: sysAuxClkEnable()
  210. */
  211. void sysAuxClkDisable (void)
  212.     {
  213.     if (sysAuxClkRunning)
  214. {
  215. *Z8036_MCC(CIO_ADRS) &= ~(ZCIO_MCC_CT2E); /* stop timer */
  216. *Z8036_CT2CS(CIO_ADRS)= ZCIO_CS_CLIE; /* clear intr enable */
  217. sysAuxClkRunning = FALSE;
  218. }
  219.     }
  220. /*******************************************************************************
  221. *
  222. * sysAuxClkEnable - turn on auxiliary clock interrupts
  223. *
  224. * This routine enables auxiliary clock interrupts.
  225. *
  226. * RETURNS: N/A
  227. *
  228. * SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()
  229. */
  230. void sysAuxClkEnable (void)
  231.     {
  232.     unsigned int tc; /* time constant */
  233.     if (!sysAuxClkRunning)
  234. {
  235. /* initialize timer B; the timer chip has been prepared in sysHwInit */
  236. tc = ZCIO_HZ / sysAuxClkTicksPerSecond;
  237. *Z8036_CT2CS(CIO_ADRS) = ZCIO_CS_CLIE; /* disable interrupts */
  238. /* set time constant */
  239. *Z8036_CT2TCMSB(CIO_ADRS) = MSB(tc);
  240. *Z8036_CT2TCLSB(CIO_ADRS) = LSB(tc);
  241. /* enable timer B interrupts */
  242. *Z8036_MCC(CIO_ADRS) |= ZCIO_MCC_CT2E;
  243. /* Start timer B */
  244. *Z8036_CT2CS(CIO_ADRS) = ZCIO_CS_SIE | ZCIO_CS_GCB | ZCIO_CS_TCB;
  245. sysAuxClkRunning = TRUE;
  246. }
  247.     }
  248. /*******************************************************************************
  249. *
  250. * sysAuxClkRateGet - get the auxiliary clock rate
  251. *
  252. * This routine returns the interrupt rate of the auxiliary clock.
  253. *
  254. * RETURNS: The number of ticks per second of the auxiliary clock.
  255. *
  256. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()
  257. */
  258. int sysAuxClkRateGet (void)
  259.     {
  260.     return (sysAuxClkTicksPerSecond);
  261.     }
  262. /*******************************************************************************
  263. *
  264. * sysAuxClkRateSet - set the auxiliary clock rate
  265. *
  266. * This routine sets the interrupt rate of the auxiliary clock.
  267. * It does not enable auxiliary clock interrupts.
  268. *
  269. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be
  270. * set.
  271. *
  272. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()
  273. */
  274. STATUS sysAuxClkRateSet
  275.     (
  276.     int ticksPerSecond
  277.     )
  278.     {
  279.     if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)
  280.         return (ERROR);
  281.     sysAuxClkTicksPerSecond = ticksPerSecond;
  282.     if (sysAuxClkRunning)
  283. {
  284. sysAuxClkDisable ();
  285. sysAuxClkEnable ();
  286. }
  287.     return (OK);
  288.     }