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

VxWorks

开发平台:

C/C++

  1. /* nvr4102RTCTimer.c - NEC Vr4102 (RTC) timer driver */
  2. /* Copyright 1984-1997 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,30dec99,jmw  casting NULL to int to stop compiler warning.
  8. 01a,11sep97,mem written.
  9. */
  10. /*
  11. DESCRIPTION
  12. This library contains routines to manipulate the timer functions in
  13. the Vr4102 RTC module.  This library handles auxiliary clock
  14. functions.
  15. The macros AUX_CLK_RATE_MIN, and AUX_CLK_RATE_MAX must be defined to
  16. provide parameter checking for the sysAuxClkRateSet() routines.
  17. The RTCLong timer is used for the auxiliary clock.
  18. */
  19. /* defines */
  20. #define RTC_LONG_RATE 32768 /* aux clock counter runs at 32kHz */
  21. /* locals */
  22. LOCAL int   sysAuxClkTicksPerSecond = 100; /* default aux timer rate    */
  23. LOCAL int   sysAuxClkArg     = (int)NULL;/* aux clock int routine arg */
  24. LOCAL BOOL  sysAuxClkRunning     = FALSE; /* sys aux clock enabled flag*/
  25. LOCAL FUNCPTR sysAuxClkRoutine    = NULL; /* aux clock interpt routine */
  26. LOCAL int   sysAuxClkTicks;          /* aux clk ticks */
  27. /*******************************************************************************
  28. *
  29. * sysAuxClkInt - interrupt level processing for auxiliary clock
  30. *
  31. * This routine handles the auxiliary clock interrupt.  It is attached to the
  32. * clock interrupt vector by the routine sysAuxClkConnect().
  33. * The appropriate routine is called and the interrupt is acknowleged.
  34. */
  35. LOCAL void sysAuxClkInt (void)
  36.     {
  37.     /* clear the RTCLong1 interrupt */
  38.     
  39.     *VR4102_RTCINTREG = VR4102_RTC_RTCINTR1;
  40.     
  41.     if (sysAuxClkRoutine != NULL)
  42. (*sysAuxClkRoutine) (sysAuxClkArg); /* call system clock routine */
  43.     }
  44. /*******************************************************************************
  45. *
  46. * sysAuxClkConnect - connect a routine to the auxiliary clock interrupt
  47. *
  48. * This routine specifies the interrupt service routine to be called at each
  49. * auxiliary clock interrupt.  It does not enable auxiliary clock
  50. * interrupts.
  51. *
  52. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  53. *
  54. * SEE ALSO: intConnect(), sysAuxClkEnable()
  55. */
  56. STATUS sysAuxClkConnect
  57.     (
  58.     FUNCPTR routine,    /* routine called at each aux clock interrupt    */
  59.     int arg             /* argument to auxiliary clock interrupt routine */
  60.     )
  61.     {
  62.     sysAuxClkRoutine = routine;
  63.     sysAuxClkArg = arg;
  64.     return (OK);
  65.     }
  66. /*******************************************************************************
  67. *
  68. * sysAuxClkDisable - turn off auxiliary clock interrupts
  69. *
  70. * This routine disables auxiliary clock interrupts.
  71. *
  72. * RETURNS: N/A
  73. *
  74. * SEE ALSO: sysAuxClkEnable()
  75. */
  76. void sysAuxClkDisable (void)
  77.     {
  78.     if (sysAuxClkRunning)
  79. {
  80. int key;
  81. key = intLock ();
  82. *VR4102_ICU_MSYSINT1REG &= ~VR4102_RTCL1INTR;
  83. sysAuxClkRunning = FALSE;
  84. intUnlock (key);
  85. }
  86.     }
  87. /*******************************************************************************
  88. *
  89. * sysAuxClkEnable - turn on auxiliary clock interrupts
  90. *
  91. * This routine enables auxiliary clock interrupts.
  92. *
  93. * RETURNS: N/A
  94. *
  95. * SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()
  96. */
  97. void sysAuxClkEnable (void)
  98.     {
  99.     if (!sysAuxClkRunning)
  100. {
  101. int i;
  102. int key;
  103. key = intLock ();
  104. sysAuxClkRunning = TRUE;
  105. sysAuxClkTicks = RTC_LONG_RATE / sysAuxClkTicksPerSecond;
  106. for (i = 0; i < 2; ++i)
  107.     {
  108.     /* set RTCLong register */
  109.     *VR4102_RTCL1LREG = sysAuxClkTicks & 0xffff;
  110.     *VR4102_RTCL1HREG = (sysAuxClkTicks >> 16) & 0xff;
  111.     /* set RTCLong counter register */
  112.     
  113.     *VR4102_RTCL1CNTLREG = sysAuxClkTicks & 0xffff;
  114.     *VR4102_RTCL1CNTHREG = (sysAuxClkTicks >> 16) & 0xff;
  115.     }
  116. /* enable the RTCLong interrupt */
  117. *VR4102_ICU_MSYSINT1REG |= VR4102_RTCL1INTR;
  118. intUnlock (key);
  119. }
  120.     }
  121. /*******************************************************************************
  122. *
  123. * sysAuxClkRateGet - get the auxiliary clock rate
  124. *
  125. * This routine returns the interrupt rate of the auxiliary clock.
  126. *
  127. * RETURNS: The number of ticks per second of the auxiliary clock.
  128. *
  129. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()
  130. */
  131. int sysAuxClkRateGet (void)
  132.     {
  133.     return (sysAuxClkTicksPerSecond);
  134.     }
  135. /*******************************************************************************
  136. *
  137. * sysAuxClkRateSet - set the auxiliary clock rate
  138. *
  139. * This routine sets the interrupt rate of the auxiliary clock.
  140. * It does not enable auxiliary clock interrupts.
  141. *
  142. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  143. *
  144. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()
  145. */
  146. STATUS sysAuxClkRateSet
  147.     (
  148.     int ticksPerSecond     /* number of clock interrupts per second */
  149.     )
  150.     {
  151.     if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)
  152. return (ERROR);
  153.     if (((RTC_LONG_RATE / ticksPerSecond) < 4)
  154. || ((RTC_LONG_RATE / ticksPerSecond) > 0x00ffffff))
  155. return (ERROR);
  156.     sysAuxClkTicksPerSecond = ticksPerSecond;
  157.     if (sysAuxClkRunning)
  158. {
  159. sysAuxClkDisable ();
  160. sysAuxClkEnable ();
  161. }
  162.     return (OK);
  163.     }