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

VxWorks

开发平台:

C/C++

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