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

VxWorks

开发平台:

C/C++

  1. /* sonicTimer.c - National Semiconductor DP83932BVF (SONIC) timer library */
  2. /* Copyright 1997 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,29Apr97,sal  Change INCLUDE_SN to INCLUDE_NETWORK
  8. 01a,03mar97,kkk  created.
  9. */
  10. /*
  11. DESCRIPTION
  12. This library provides auxiliary clock timer routines, which are based 
  13. on the the SONIC ethernet driver. Thus, the auxiliary clock is enabled 
  14. only if the SONIC ethernet driver is enabled.
  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. SEE ALSO:
  18. .pG "Configuration"
  19. */
  20. /* extern declarations */
  21. #ifdef INCLUDE_NETWORK /* enable aux. clock only if SONIC */
  22. IMPORT void     snClkDisable(); /* is enabled     */
  23. IMPORT void     snClkEnable();
  24. #endif /* INCLUDE_NETWORK */
  25. /* Locals */
  26. LOCAL int   sysAuxClkTicksPerSecond = 100;      /* default aux timer rate     */
  27. LOCAL int   sysAuxClkArg            = NULL;     /* aux clock int routine arg  */
  28. LOCAL BOOL  sysAuxClkConnected      = FALSE;    /* sys aux clock connect flag */
  29. LOCAL BOOL  sysAuxClkRunning        = FALSE;    /* sys aux clock enabled flag */
  30. LOCAL FUNCPTR   sysAuxClkRoutine    = NULL;     /* aux clock interpt routine  */
  31. /*******************************************************************************
  32. *
  33. * sysAuxClkInt - interrupt level processing for auxiliary clock
  34. *
  35. * This routine handles the auxiliary clock interrupt.  It is attached to the
  36. * clock interrupt vector by the routine sysAuxClkConnect().
  37. * The appropriate routine is called and the interrupt is acknowleged.
  38. *
  39. * RETURNS: N/A.
  40. */
  41. LOCAL void sysAuxClkInt (void)
  42.     {
  43.     if (sysAuxClkRoutine != NULL)
  44.         (*sysAuxClkRoutine) (sysAuxClkArg);     /* call system clock routine */
  45.     }
  46. /*******************************************************************************
  47. *
  48. * sysAuxClkConnect - connect a routine to the auxiliary clock interrupt
  49. *
  50. * This routine specifies the interrupt service routine to be called at each
  51. * auxiliary clock interrupt.  It does not enable auxiliary clock
  52. * interrupts.
  53. *
  54. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  55. *
  56. * SEE ALSO: intConnect(), sysAuxClkEnable()
  57. */
  58. STATUS sysAuxClkConnect
  59.     (
  60.     FUNCPTR routine,    /* routine called at each aux clock interrupt    */
  61.     int arg             /* argument to auxiliary clock interrupt routine */
  62.     )
  63.     {
  64.     if (!sysAuxClkConnected)
  65.         {
  66.         sysAuxClkConnected = TRUE;
  67.         }
  68.     sysAuxClkRoutine = routine;
  69.     sysAuxClkArg = arg;
  70.     return (OK);
  71.     }
  72. /*******************************************************************************
  73. *
  74. * sysAuxClkDisable - turn off auxiliary clock interrupts
  75. *
  76. * This routine disables auxiliary clock interrupts.
  77. *
  78. * RETURNS: N/A
  79. *
  80. * SEE ALSO: sysAuxClkEnable()
  81. */
  82. void sysAuxClkDisable (void)
  83.     {
  84. #ifdef  INCLUDE_NETWORK
  85.     /* disable clock in the SONIC */
  86.     snClkDisable (0);
  87.     sysAuxClkRunning = FALSE;
  88. #endif  /* INCLUDE_NETWORK */
  89.     }
  90. /*******************************************************************************
  91. *
  92. * sysAuxClkEnable - turn on auxiliary clock interrupts
  93. *
  94. * This routine enables auxiliary clock interrupts.
  95. *
  96. * RETURNS: N/A
  97. *
  98. * SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()
  99. */
  100. void sysAuxClkEnable (void)
  101.     {
  102. #ifdef  INCLUDE_NETWORK
  103.     /* enable clock in the SONIC */
  104.     snClkEnable (0, sysAuxClkTicksPerSecond, sysAuxClkInt);
  105.     sysAuxClkRunning = TRUE;
  106. #endif  /* INCLUDE_NETWORK */
  107.     }
  108. /*******************************************************************************
  109. *
  110. * sysAuxClkRateGet - get the auxiliary clock rate
  111. *
  112. * This routine returns the interrupt rate of the auxiliary clock.
  113. *
  114. * RETURNS: The number of ticks per second of the auxiliary clock.
  115. *
  116. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()
  117. */
  118. int sysAuxClkRateGet (void)
  119.     {
  120.     return (sysAuxClkTicksPerSecond);
  121.     }
  122. /*******************************************************************************
  123. *
  124. * sysAuxClkRateSet - set the auxiliary clock rate
  125. *
  126. * This routine sets the interrupt rate of the auxiliary clock.
  127. * It does not enable auxiliary clock interrupts.
  128. *
  129. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  130. *
  131. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()
  132. */
  133. STATUS sysAuxClkRateSet
  134.     (
  135.     int ticksPerSecond     /* number of clock interrupts per second */
  136.     )
  137.     {
  138. #ifdef  INCLUDE_NETWORK
  139.     if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)
  140.         {
  141.         return (ERROR);
  142.         }
  143.     sysAuxClkTicksPerSecond = ticksPerSecond;
  144.     if (sysAuxClkRunning)
  145.         {
  146.         sysAuxClkDisable ();
  147.         sysAuxClkEnable ();
  148.         }
  149.     return (OK);
  150. #else
  151.     return (ERROR);
  152. #endif  /* INCLUDE_NETWORK */
  153.     }