cntmr.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* cntmr.c - GT counters/timers functions */
  2. /* Copyright - Galileo technology. 9/3/2000 */
  3. /*
  4. DESCRIPTION
  5. This file contains function which serves the user with a complete interface
  6. to the GT internal counters and timers, please advise: each counter/timer unit
  7. can function only as a counter or a timer at current time.
  8. Counter/timer 0 is 32 bit wide.
  9. Counters/timers 1-3 are 24 bit wide.
  10. */
  11. /* includes */
  12. #ifdef __linux__
  13. #include <asm/galileo/evb64120A/cntmr.h>
  14. #include <asm/galileo/evb64120A/core.h>
  15. #else
  16. #include "cntmr.h"
  17. #include "core.h"
  18. #endif
  19. /********************************************************************
  20. * cntTmrStart - Starts a counter/timer with given an initiate value.
  21. *
  22. * INPUTS:  unsigned int countNum - Selects one of the 8 counters/timers.
  23. *          unsigned int countValue - Initial value for count down.
  24. *          CNT_TMR_OP_MODES opMode - Set Mode, Counter or Timer.
  25. *
  26. * RETURNS: false if one of the parameters is erroneous, true otherwise.
  27. *********************************************************************/
  28. bool cntTmrStart(CNTMR_NUM countNum, unsigned int countValue,
  29.  CNT_TMR_OP_MODES opMode)
  30. {
  31. unsigned int command = 1;
  32. unsigned int value;
  33. if (countNum > LAST_CNTMR)
  34. return false;
  35. else {
  36. GT_REG_READ(TIMER_COUNTER_CONTROL, &value);
  37. cntTmrDisable(countNum);
  38. GT_REG_WRITE((TIMER_COUNTER0 + (4 * countNum)),
  39.      countValue);
  40. command = command << countNum * 2;
  41. value = value | command;
  42. command = command << 1;
  43. switch (opMode) {
  44. case TIMER: /* The Timer/Counter bit set to logic '1' */
  45. value = value | command;
  46. break;
  47. case COUNTER: /* The Timer/Counter bit set to logic '0' */
  48. value = value & ~command;
  49. break;
  50. default:
  51. return false;
  52. }
  53. GT_REG_WRITE(TIMER_COUNTER_CONTROL, value);
  54. return true;
  55. }
  56. }
  57. /********************************************************************
  58. * cntTmrDisable - Disables the timer/counter operation and return its
  59. *                 value.
  60. *
  61. * INPUTS:  unsigned int countNum - Selects one of the 8 counters/timers.
  62. * RETURNS: The counter/timer value (unsigned int), if any of the arguments are
  63. *          erroneous return 0.
  64. *********************************************************************/
  65. unsigned int cntTmrDisable(CNTMR_NUM countNum)
  66. {
  67. unsigned int command = 1;
  68. unsigned int regValue;
  69. unsigned int value;
  70. GT_REG_READ(TIMER_COUNTER_CONTROL, &value);
  71. if (countNum > LAST_CNTMR)
  72. return 0;
  73. GT_REG_READ(TIMER_COUNTER0 + 4 * countNum, &regValue);
  74. command = command << countNum * 2; /* Disable the timer/counter */
  75. value = value & ~command;
  76. GT_REG_WRITE(TIMER_COUNTER_CONTROL, value);
  77. return regValue;
  78. }
  79. /********************************************************************
  80. * cntTmrRead - Reads a timer or a counter value. (This operation can be
  81. *              perform while the counter/timer is active).
  82. *
  83. * RETURNS: The counter/timer value. If wrong input value, return 0.
  84. *********************************************************************/
  85. unsigned int cntTmrRead(CNTMR_NUM countNum)
  86. {
  87. unsigned int value;
  88. if (countNum > LAST_CNTMR)
  89. return 0;
  90. else
  91. GT_REG_READ(TIMER_COUNTER0 + countNum * 4, &value);
  92. return value;
  93. }
  94. /********************************************************************
  95. * cntTmrEnable - Set enable-bit of timer/counter.
  96. *                Be aware: If the counter/timer is active, this function
  97. *                          will terminate with an false.
  98. *
  99. * INPUTS:  unsigned int countNum - Selects one of the 8 counters/timers.
  100. * RETURNS: false if one of the parameters is erroneous, true otherwise.
  101. *********************************************************************/
  102. bool cntTmrEnable(CNTMR_NUM countNum)
  103. {
  104. unsigned int command = 1;
  105. unsigned int value;
  106. GT_REG_READ(TIMER_COUNTER_CONTROL, &value);
  107. if (countNum > LAST_CNTMR)
  108. return false;
  109. else {
  110. command = command << countNum * 2;
  111. if ((command & value) != 0) /* ==> The counter/timer is enabled */
  112. return false; /* doesn't make sense to Enable an "enabled" counter */
  113. value = value | command;
  114. GT_REG_WRITE(TIMER_COUNTER_CONTROL, value);
  115. return true;
  116. }
  117. }
  118. /********************************************************************
  119. * cntTmrLoad - loading value for timer number countNum.
  120. *              Be aware: If this function try to load value to an enabled
  121. *                        counter/timer it terminate with false.
  122. *
  123. * INPUTS:  unsigned int countNum - Selects one of the 8 counters/timers.
  124. *          unsigned int countValue - The value for load the register.
  125. * RETURNS: false if one of the parameters is erroneous, true otherwise.
  126. *********************************************************************/
  127. bool cntTmrLoad(unsigned int countNum, unsigned int countValue)
  128. {
  129. unsigned int command = 1;
  130. unsigned int value;
  131. GT_REG_READ(TIMER_COUNTER_CONTROL, &value);
  132. if (countNum > LAST_CNTMR)
  133. return false;
  134. else {
  135. command = command << countNum * 2;
  136. value = value & command;
  137. if (value != 0) { /* ==> The counter/timer is enabled */
  138. return false; /* can't reload value when counter/timer is enabled */
  139. } else {
  140. GT_REG_WRITE((TIMER_COUNTER0 + (4 * countNum)),
  141.      countValue);
  142. return true;
  143. }
  144. }
  145. }
  146. /********************************************************************
  147. * cntTmrSetMode - Configurate the Mode of the channel to work as a counter
  148. *                 or as a timer. (for more details on the different between
  149. *                 those two modes is written in the Data Sheet).
  150. *                 NOTE: This function only set the counter/timer mode and
  151. *                 don't enable it.
  152. *                 Be aware: If this function try to load value to an enabled
  153. *                           counter/timer it terminate with false.
  154. *
  155. * INPUTS:  unsigned int countNum - Selects one of the 8 counters/timers.
  156. *          CNT_TMR_OP_MODES opMode - TIMER or COUNTER mode.
  157. * RETURNS: false if one of the parameters is erroneous true otherwise .
  158. *********************************************************************/
  159. bool cntTmrSetMode(CNTMR_NUM countNum, CNT_TMR_OP_MODES opMode)
  160. {
  161. unsigned int command = 1;
  162. unsigned int value;
  163. GT_REG_READ(TIMER_COUNTER_CONTROL, &value);
  164. if (countNum > LAST_CNTMR)
  165. return false;
  166. else {
  167. command = command << countNum * 2;
  168. value = value & command;
  169. if (value != 0) { /* ==> The counter/timer is enabled */
  170. return false; /* can't set the Mode when counter/timer is enabled */
  171. } else {
  172. command = command << 1;
  173. switch (opMode) {
  174. case TIMER:
  175. value = value | command; /* The Timer/Counter bit set to logic '1' */
  176. break;
  177. case COUNTER:
  178. value = value & ~command; /*The Timer/Counter bit set to logic '0' */
  179. break;
  180. default:
  181. return false;
  182. }
  183. GT_REG_WRITE(TIMER_COUNTER_CONTROL, value);
  184. return true;
  185. }
  186. }
  187. }