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

VxWorks

开发平台:

C/C++

  1. /* sh7700Timer.c - SH77xx on-chip Timer library */
  2. /* Copyright 1996-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01y,25feb02,zl   fixed connect routines' memory leak, SPR #73803.
  8. 01x,02nov01,zl   corrected NULL usage.
  9. 01w,22jan01,zl   allow BSP to redefine interrupt enable.
  10. 01v,20nov00,zl   unified with sh7729Timer.c; generalized SYS_PCLK_FREQ use.
  11. 01u,02aug00,zl   connect timestamp driver interrupt only once. Simplifyed
  12.                  SYS_PCLK_FREQ dependencies. Silicon bug fix from SH7729 code.
  13. 01t,31may00,frf  SH7751 timer for T2
  14. 01s,18sep98,hk   merged sh7750Timer.c. supported SYS_PCLK_FREQ of 33.33MHz.
  15. 01r,31aug98,st   (sh7750Timer.c) written based on sh7700 01q.
  16. 01s,28oct98,jmb  added missing sysClkRunning state flag.
  17. 01r,20jul98,jmb  added support for SYS_PCLK_FREQ of 40 and 14.75MHz.
  18. 01q,20jan98,jmc  added support for SYS_PCLK_FREQ of 20/10/5MHz.
  19. 01p,12dec97,hk   changed INUM_SYS_CLOCK to INUM_TMU0_UNDERFLOW, INUM_AUX_CLOCK
  20.                  to INUM_TMU1_UNDERFLOW. controled INTC in sys{Aux}ClkConnect().
  21. 01o,15jul97,hk   reviewed timestamp driver code.
  22. 01n,12jul97,hk   changed inclusion of drv/multi/sh7700.h to arch/sh/sh7700.h.
  23. 01m,08may97,hk   added default TIMESTAMP_LEVEL.
  24. 01l,03may97,hk   merged in timestamp driver.
  25. 01b,17apr97,st   moved initialization of Timerstamp-Timer in
  26.                  sysTimestampConnect() to sysTimestampEnable().
  27. 01a,26mar97,st   written sh7700TimerTS.c based on sh77700Timer.c 
  28. 01k,22mar97,hk   added support for various SYS_PCLK_FREQ values.
  29. 01j,07mar97,hk   deleted unused variable in sysClkEnable().
  30. 01i,27nov96,hk   deleted intBlock() for mmu support.
  31. 01h,17sep96,hk   added intBlock() call to SH7700 register access codes.
  32. 01g,26aug96,hk   changed to use INUM_TO_IVEC (INUM_xxx) for intConnect.
  33. 01f,21jul96,hk   changed SYS_CPU_FREQ to SYS_PCLK_FREQ (fixed to 15MHz).
  34. 01e,21jul96,hk   took ja's working file, modified.
  35. 01d,09jun96,hk   fixed sysClkEnable() and sysAuxClkEnable().
  36. 01c,07jun96,hk   changed for new macro header.
  37. 01b,22may96,ja   modified parts related with TMU (sysClkxxx).
  38. 01a,15may96,ja   written based on sh7604 01l.
  39. */
  40. /*
  41. DESCRIPTION
  42. This library contains routines to manipulate the timer functions on the
  43. SH77xx on-chip timer unit (TMU) with a board-independant interface.
  44. This library handles the system clock, auxiliary clock, and timestamp
  45. timer facilities.
  46. The macros SYS_CLK_RATE_MIN, SYS_CLK_RATE_MAX, AUX_CLK_RATE_MIN, and
  47. AUX_CLK_RATE_MAX must be defined to provide parameter checking for the
  48. sys[Aux]ClkRateSet() routines.
  49.  
  50. To include the timestamp timer facility, the macro INCLUDE_TIMESTAMP must be
  51. defined.  The macro TIMESTAMP_LEVEL must be defined to provide the timestamp
  52. timer's interrupt level.
  53. */
  54. #include "drv/timer/timerDev.h"
  55. #include "drv/timer/timestampDev.h"
  56. #include "config.h"
  57. #define TMU_MAX_FREQ 2000000 /* 2MHz max. */
  58. #if   (SYS_PCLK_FREQ > 64 * TMU_MAX_FREQ) /* PCLK: 128-512 MHz */
  59. #define TICK_FREQ (SYS_PCLK_FREQ / 256) /* 0.5-2.0 MHz */
  60. #define TCR_TPSC_VALUE (TCR_TPSC_P256)
  61. #elif (SYS_PCLK_FREQ > 16 * TMU_MAX_FREQ) /* PCLK: 32-128 MHz */
  62. #define TICK_FREQ (SYS_PCLK_FREQ / 64) /* 0.5-2.0 MHz */
  63. #define TCR_TPSC_VALUE (TCR_TPSC_P64)
  64. #elif (SYS_PCLK_FREQ >  4 * TMU_MAX_FREQ) /* PCLK: 8-32 MHz */
  65. #define TICK_FREQ (SYS_PCLK_FREQ / 16) /* 0.5-2.0 MHz */
  66. #define TCR_TPSC_VALUE (TCR_TPSC_P16)
  67. #else /* PCLK: 0-8 MHz */
  68. #define TICK_FREQ (SYS_PCLK_FREQ / 4) /* 0-2 MHz */
  69. #define TCR_TPSC_VALUE (TCR_TPSC_P4)
  70. #endif
  71. /* 
  72.  * define TMU_BUG_FIXED as FALSE in the BSPs config.h file if the TSTR
  73.  * register can't be read.
  74.  */
  75. #ifndef TMU_BUG_FIXED
  76. #define TMU_BUG_FIXED TRUE
  77. #endif
  78. /* Locals */ 
  79. LOCAL int sysClkTicksPerSecond = 60; 
  80. LOCAL BOOL sysClkRunning = FALSE; 
  81. LOCAL FUNCPTR sysClkRoutine = NULL; 
  82. LOCAL int sysClkArg = 0; 
  83. LOCAL int sysAuxClkTicksPerSecond = 60; 
  84. LOCAL BOOL sysAuxClkRunning = FALSE; 
  85. LOCAL FUNCPTR sysAuxClkRoutine = NULL; 
  86. LOCAL int sysAuxClkArg = 0;
  87. #if (TMU_BUG_FIXED == FALSE)
  88. LOCAL UINT8     sysTstrReg             = 0;
  89. #endif
  90. #ifdef INCLUDE_TIMESTAMP
  91. LOCAL BOOL sysTimestampRunning = FALSE; /* running flag */
  92. LOCAL FUNCPTR sysTimestampRoutine = NULL; /* user rollover routine */
  93. LOCAL int sysTimestampArg     = 0; /* arg to user routine */
  94. #ifndef INT_LVL_TSTAMP
  95. #define INT_LVL_TSTAMP TIMESTAMP_LEVEL /* for older BSPs */
  96. #endif  /*!TIMESTAMP_LEVEL*/
  97. #endif /* INCLUDE_TIMESTAMP */
  98. /*******************************************************************************
  99. *
  100. * sysClkInt - handle system clock interrupts
  101. *
  102. * This routine handles system clock interrupts.
  103. */
  104. LOCAL void sysClkInt (void)
  105.     {
  106.     volatile UINT16 stat;
  107.     if ((stat = *TMU_TCR0) & TCR_UNF)
  108. {
  109. *TMU_TCR0 = (UINT16)(stat & (~TCR_UNF));  /* clear underflow flg */
  110. if (sysClkRoutine != NULL)
  111.     (*sysClkRoutine)(sysClkArg);
  112. }
  113.     }
  114. /*******************************************************************************
  115. *
  116. * sysClkConnect - connect a routine to the system clock interrupt
  117. *
  118. * This routine specifies the interrupt service routine to be called at each
  119. * clock interrupt.  Normally, it is called from usrRoot() in usrConfig.c to
  120. * connect usrClock() to the system clock interrupt.
  121. *
  122. * RETURN: OK, or ERROR if the routine cannot be connected to the interrupt.
  123. *
  124. * SEE ALSO: intConnect(), usrClock(), sysClkEnable()
  125. */
  126.  
  127. STATUS sysClkConnect
  128.     (
  129.     FUNCPTR routine, /* routine called at each system clock interrupt */
  130.     int arg /* argument with which to call routine           */
  131.     )
  132.     {
  133.     static BOOL beenHere = FALSE;
  134.     if (!beenHere)
  135.      {
  136. beenHere = TRUE;
  137.      sysHwInit2 ();
  138. if (intConnect (INUM_TO_IVEC (INUM_TMU0_UNDERFLOW), sysClkInt, 0) != OK)
  139.     return (ERROR);
  140. *TMU_TCR0 = TCR_TPSC_VALUE;
  141. /* set timer interrupt priority */
  142. #ifdef SYS_TMU0_INT_ENABLE
  143. SYS_TMU0_INT_ENABLE (INT_LVL_SYSCLK);
  144. #else
  145. /* for backward compatible BSPs */
  146. *INTC_IPRA = (UINT16)((*INTC_IPRA & 0x0fff) | 
  147.       ((INT_LVL_SYSCLK & 0xf)<<12));
  148. #endif
  149. }
  150.     sysClkRoutine = NULL; /* ensure routine not called with wrong arg */
  151.     sysClkArg   = arg;
  152.     sysClkRoutine = routine;
  153.     return (OK);
  154.     }
  155. /*******************************************************************************
  156. *
  157. * sysClkDisable - turn off system clock interrupts
  158. *
  159. * This routine disables system clock interrupts.
  160. *
  161. * RETURNS: N/A
  162. *
  163. * SEE ALSO: sysClkEnable()
  164. */
  165.  
  166. void sysClkDisable (void)
  167.     {
  168.     if (sysClkRunning)
  169. {
  170. /* stop timer */
  171. #if (TMU_BUG_FIXED == TRUE)
  172. *TMU_TSTR  &= ~TSTR_STR0;
  173. #else
  174. sysTstrReg &= ~TSTR_STR0;
  175. *TMU_TSTR   = sysTstrReg;
  176. #endif
  177. /* disable interrupts */
  178. *TMU_TCR0  &= ~(TCR_UNF | TCR_UNIE);
  179. sysClkRunning = FALSE;
  180. }
  181.     }
  182. /****************************************************************************** 
  183. *
  184. * sysClkEnable - turn on system clock interrupts
  185. *
  186. * This routine enables system clock interrupts.
  187. *
  188. * RETURNS: N/A
  189. *
  190. * SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()
  191. */
  192.  
  193. void sysClkEnable (void)
  194.     {
  195.     UINT32 tmp32;
  196.     if (!sysClkRunning)
  197. {
  198. /* stop timer */
  199. #if (TMU_BUG_FIXED == TRUE)
  200. *TMU_TSTR  &= ~TSTR_STR0;
  201. #else
  202. sysTstrReg &= ~TSTR_STR0;
  203. *TMU_TSTR   = sysTstrReg;
  204. #endif
  205. /* disable interrupts */
  206. *TMU_TCR0  &= ~(TCR_UNF | TCR_UNIE);
  207. /* load const register with the number of micro seconds */
  208. tmp32 = (UINT32)(TICK_FREQ / sysClkTicksPerSecond - 1);
  209. *TMU_TCOR0  = tmp32;
  210. *TMU_TCNT0  = tmp32;
  211. /* enable clock interrupt */
  212. *TMU_TCR0  |= TCR_UNIE;
  213. /* start timer */
  214. #if (TMU_BUG_FIXED == TRUE)
  215. *TMU_TSTR  |= TSTR_STR0;
  216. #else
  217. sysTstrReg |= TSTR_STR0;
  218. *TMU_TSTR   = sysTstrReg;
  219. #endif
  220. sysClkRunning = TRUE;
  221. }
  222.     }
  223. /*******************************************************************************
  224. *
  225. * sysClkRateGet - get the system clock rate
  226. *
  227. * This routine returns the system clock rate.
  228. *
  229. * RETURNS: The number of ticks per second of the system clock.
  230. *
  231. * SEE ALSO: sysClkEnable, sysClkRateSet()
  232. */
  233.  
  234. int sysClkRateGet (void)
  235.     {
  236.     return (sysClkTicksPerSecond);
  237.     }
  238. /********************************************************************************
  239. * sysClkRateSet - set the system clock rate
  240. *
  241. * This routine sets the interrupt rate of the system clock.
  242. * It is called by usrRoot() in usrConfig.c.
  243. *
  244. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be
  245. * set.
  246. *
  247. * SEE ALSO: sysClkEnable, sysClkRateGet()
  248. */
  249.  
  250. STATUS sysClkRateSet
  251.     (
  252.     int ticksPerSecond /* number of clock interrupts per second */
  253.     )
  254.     {
  255.     if (ticksPerSecond < SYS_CLK_RATE_MIN || ticksPerSecond > SYS_CLK_RATE_MAX)
  256. return (ERROR);
  257.  
  258.     sysClkTicksPerSecond = ticksPerSecond;
  259.  
  260.     if (sysClkRunning)
  261. {
  262. sysClkDisable ();
  263. sysClkEnable ();
  264. }
  265.     return (OK);
  266.     }
  267. /*******************************************************************************
  268. *
  269. * sysAuxClkInt - handle auxiliary clock interrupts
  270. */
  271.  
  272. LOCAL void sysAuxClkInt (void)
  273.     {
  274.     volatile UINT16 stat;
  275.     if ((stat = *TMU_TCR1) & TCR_UNF)
  276. {
  277. *TMU_TCR1 = (UINT16)(stat & (~TCR_UNF)); /* clear underflow flg */
  278. if (sysAuxClkRoutine != NULL)
  279.     (*sysAuxClkRoutine)(sysAuxClkArg);
  280. }
  281.     }
  282. /*******************************************************************************
  283. *
  284. * sysAuxClkConnect - connect a routine to the auxiliary clock interrupt
  285. *
  286. * This routine specifies the interrupt service routine to be called at each
  287. * auxiliary clock interrupt.  It does not enable auxiliary clock
  288. * interrupts.
  289. *
  290. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  291. *
  292. * SEE ALSO: intConnect(), sysAuxClkEnable()
  293. */
  294.  
  295. STATUS sysAuxClkConnect
  296.     (
  297.     FUNCPTR routine, /* routine called at each aux clock interrupt    */
  298.     int arg /* argument to auxiliary clock interrupt routine */
  299.     )
  300.     {
  301.     static BOOL connected = FALSE;
  302.     if (!connected)
  303. {
  304. if (intConnect (INUM_TO_IVEC(INUM_TMU1_UNDERFLOW), sysAuxClkInt, 0) 
  305.     != OK)
  306.     return (ERROR);
  307. *TMU_TCR1 = TCR_TPSC_VALUE;
  308. /* set timer interrupt priority */
  309. #ifdef SYS_TMU1_INT_ENABLE
  310. SYS_TMU1_INT_ENABLE (INT_LVL_AUXCLK);
  311. #else
  312. /* for backward compatible BSPs */
  313. *INTC_IPRA = (UINT16)((*INTC_IPRA & 0xf0ff) | 
  314.       ((INT_LVL_AUXCLK & 0xf)<< 8));
  315. #endif
  316. connected = TRUE;
  317. }
  318.     sysAuxClkRoutine = NULL;
  319.     sysAuxClkRoutine = routine;
  320.     sysAuxClkArg = arg;
  321.  
  322.     return (OK);
  323.     }
  324. /*******************************************************************************
  325. *
  326. * sysAuxClkDisable - turn off auxiliary clock interrupts
  327. *
  328. * This routine disables auxiliary clock interrupts.
  329. *
  330. * RETURNS: N/A
  331. *
  332. * SEE ALSO: sysAuxClkEnable()
  333. */
  334.  
  335. void sysAuxClkDisable (void)
  336.     {
  337.     if (sysAuxClkRunning)
  338. {
  339. /* stop timer */
  340. #if (TMU_BUG_FIXED == TRUE)
  341. *TMU_TSTR  &= ~TSTR_STR1;
  342. #else
  343. sysTstrReg &= ~TSTR_STR1;
  344. *TMU_TSTR   = sysTstrReg;
  345. #endif
  346. /* disable interrupts */
  347. *TMU_TCR1  &= ~(TCR_UNF | TCR_UNIE);
  348. sysAuxClkRunning = FALSE;
  349. }
  350.     }
  351. /*******************************************************************************
  352. *
  353. * sysAuxClkEnable - turn on auxiliary clock interrupts
  354. *
  355. * This routine enables auxiliary clock interrupts.
  356. *
  357. * RETURNS: N/A
  358. *
  359. * SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()
  360. */
  361.  
  362. void sysAuxClkEnable (void)
  363.     {
  364.     UINT32 tmp32;
  365.     if (!sysAuxClkRunning)
  366. {
  367. /* stop timer */
  368. #if (TMU_BUG_FIXED == TRUE)
  369. *TMU_TSTR  &= ~TSTR_STR1;
  370. #else
  371. sysTstrReg &= ~TSTR_STR1;
  372. *TMU_TSTR   = sysTstrReg;
  373. #endif
  374. /* disable interrupts */
  375. *TMU_TCR1  &= ~(TCR_UNF | TCR_UNIE);
  376. /* load const register with the number of micro seconds */
  377. tmp32 = (UINT32)(TICK_FREQ / sysAuxClkTicksPerSecond - 1);
  378. *TMU_TCOR1  = tmp32;
  379. *TMU_TCNT1  = tmp32;
  380. /* enable clock interrupt */
  381. *TMU_TCR1  |= TCR_UNIE;
  382. /* start timer */
  383. #if (TMU_BUG_FIXED == TRUE)
  384. *TMU_TSTR  |= TSTR_STR1;
  385. #else
  386. sysTstrReg |= TSTR_STR1;
  387. *TMU_TSTR   = sysTstrReg;
  388. #endif
  389. sysAuxClkRunning = TRUE;
  390. }
  391.     }
  392. /*******************************************************************************
  393. *
  394. * sysAuxClkRateGet - get the auxiliary clock rate
  395. *
  396. * This routine returns the interrupt rate of the auxiliary clock.
  397. *
  398. * RETURNS: The number of ticks per second of the auxiliary clock.
  399. *
  400. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()
  401. */
  402.  
  403. int sysAuxClkRateGet (void)
  404.     {
  405.     return (sysAuxClkTicksPerSecond);
  406.     }
  407. /*******************************************************************************
  408. *
  409. * sysAuxClkRateSet - set the auxiliary clock rate
  410. *
  411. * This routine sets the interrupt rate of the auxiliary clock.
  412. * It does not enable auxiliary clock interrupts.
  413. *
  414. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  415. *
  416. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()
  417. */
  418.  
  419. STATUS sysAuxClkRateSet
  420.     (
  421.     int ticksPerSecond     /* number of clock interrupts per second */
  422.     )
  423.     {
  424.     if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)
  425. return (ERROR);
  426.  
  427.     sysAuxClkTicksPerSecond = ticksPerSecond;
  428.     if (sysAuxClkRunning)
  429. {
  430. sysAuxClkDisable ();
  431. sysAuxClkEnable ();
  432. }
  433.     return (OK);
  434.     } 
  435. #ifdef INCLUDE_TIMESTAMP
  436. /********************************************************************************
  437. * sysTimestampInt - timestamp timer interrupt handler
  438. *
  439. * This rountine handles the timestamp timer underflow interrupt.  A user
  440. * routine is called, if one was connected by sysTimestampConnect().
  441. *
  442. * RETURNS: N/A
  443. *
  444. * SEE ALSO: sysTimestampConnect()
  445. */
  446. LOCAL void sysTimestampInt (void)
  447.     {
  448.     volatile UINT16 stat;
  449.     if ((stat = *TMU_TCR2) & TCR_UNF)
  450. {
  451. *TMU_TCR2 = (UINT16)(stat & (~TCR_UNF)); /* acknowledge int */
  452. if (sysTimestampRoutine != NULL)
  453.     (*sysTimestampRoutine) (sysTimestampArg); /* call user routine */
  454. }
  455.     }
  456. /********************************************************************************
  457. * sysTimestampConnect - connect a user routine to the timestamp timer interrupt
  458. *
  459. * This routine specifies the user interrupt routine to be called at each
  460. * timestamp timer interrupt.  It does not enable the timestamp timer itself.
  461. *
  462. * RETURNS: OK, or ERROR if sysTimestampInt() interrupt handler is not used.
  463. */
  464.  
  465. STATUS sysTimestampConnect
  466.     (
  467.     FUNCPTR routine,    /* routine called at each timestamp timer interrupt */
  468.     int arg             /* argument with which to call routine */
  469.     )
  470.     {
  471.     static BOOL connected = FALSE;
  472.     if (!connected)
  473. {
  474. /* connect sysTimestampInt to the appropriate interrupt vector */
  475. if (intConnect (INUM_TO_IVEC(INUM_TMU2_UNDERFLOW), sysTimestampInt, 0)
  476.     != OK)
  477.     return (ERROR);
  478. /* set timer interrupt priority */
  479. #ifdef SYS_TMU2_INT_ENABLE
  480. SYS_TMU2_INT_ENABLE (INT_LVL_TSTAMP);
  481. #else
  482. /* for backward compatible BSPs */
  483. *INTC_IPRA = (UINT16)((*INTC_IPRA & 0xff0f) | 
  484.       ((INT_LVL_TSTAMP & 0xf)<<4));
  485. #endif
  486. connected = TRUE;
  487. }
  488.     sysTimestampRoutine = NULL;
  489.     sysTimestampRoutine = routine;
  490.     sysTimestampArg = arg;
  491.     return (OK);
  492.     }
  493. /********************************************************************************
  494. * sysTimestampEnable - initialize and enable the timestamp timer
  495. *
  496. * This routine connects the timestamp timer interrupt and initializes the
  497. * counter registers.  If the timestamp timer is already running, this routine
  498. * merely resets the timer counter.
  499. *
  500. * The rate of the timestamp timer should be set explicitly within the BSP,
  501. * in the sysHwInit() routine.  This routine does not intialize the timer
  502. * rate.
  503. *
  504. * RETURNS: OK, or ERROR if the timestamp timer cannot be enabled.
  505. */
  506.  
  507. STATUS sysTimestampEnable (void)
  508.     {
  509.     UINT32 tmp32 = sysTimestampPeriod ();
  510.     if (sysTimestampRunning)
  511. {
  512. #if (TMU_BUG_FIXED == TRUE)
  513. *TMU_TSTR  &= ~TSTR_STR2; /* stop timer */
  514. #else
  515. sysTstrReg &= ~TSTR_STR2;
  516. *TMU_TSTR   = sysTstrReg;
  517. #endif
  518. *TMU_TCOR2  = tmp32; /* reset auto-reload count */
  519. *TMU_TCNT2  = tmp32; /* reset counter */
  520. #if (TMU_BUG_FIXED == TRUE)
  521. *TMU_TSTR  |= TSTR_STR2; /* restart timer */
  522. #else
  523. sysTstrReg |= TSTR_STR2;
  524. *TMU_TSTR   = sysTstrReg;
  525. #endif
  526. return (OK);
  527. }
  528. #if (TMU_BUG_FIXED == TRUE)
  529.     *TMU_TSTR  &= ~TSTR_STR2; /* stop timer */
  530. #else
  531.     sysTstrReg &= ~TSTR_STR2;
  532.     *TMU_TSTR = sysTstrReg;
  533. #endif
  534.     *TMU_TCR2 = TCR_TPSC_VALUE;
  535.     *TMU_TCOR2 = tmp32; /* reset auto-reload count */
  536.     *TMU_TCNT2 = tmp32; /* reset counter */
  537.     *TMU_TCR2      |= TCR_UNIE; /* enable underflow interrupt */
  538. #if (TMU_BUG_FIXED == TRUE)
  539.     *TMU_TSTR  |= TSTR_STR2; /* start timer */
  540. #else
  541.     sysTstrReg |= TSTR_STR2;
  542.     *TMU_TSTR = sysTstrReg;
  543. #endif
  544.     sysTimestampRunning = TRUE;
  545.     return (OK);
  546.     }
  547. /********************************************************************************
  548. * sysTimestampDisable - disable the timestamp timer
  549. *
  550. * This routine disables the timestamp timer.  Interrupts are not disabled,
  551. * although the tick counter will not increment after the timestamp timer
  552. * is disabled, thus interrupts will no longer be generated.
  553. *
  554. * RETURNS: OK, or ERROR if the timestamp timer cannot be disabled.
  555. */
  556.  
  557. STATUS sysTimestampDisable (void)
  558.     {
  559.     if (sysTimestampRunning)
  560. {
  561. *TMU_TCR2  &= ~(TCR_ICPE1 | TCR_ICPE0 | TCR_UNIE);
  562. /* disable ints */
  563. #if (TMU_BUG_FIXED == TRUE)
  564. *TMU_TSTR  &= ~TSTR_STR2; /* stop timer */
  565. #else
  566. sysTstrReg &= ~TSTR_STR2;
  567. *TMU_TSTR   = sysTstrReg;
  568. #endif
  569. *TMU_TCR2  &= ~(TCR_ICPF | TCR_UNF); /* clear pending ints */
  570. sysTimestampRunning = FALSE;
  571. }
  572.     return (OK);
  573.     }
  574. /********************************************************************************
  575. * sysTimestampPeriod - get the timestamp timer period
  576. *
  577. * This routine returns the period of the timestamp timer in ticks.
  578. * The period, or terminal count, is the number of ticks to which the timestamp
  579. * timer will count before rolling over and restarting the counting process.
  580. *
  581. * RETURNS: The period of the timestamp timer in counter ticks.
  582. */
  583.  
  584. UINT32 sysTimestampPeriod (void)
  585.     {
  586.     return (UINT32)(0xffffffff); /* highest period -> freerunning */
  587.     }
  588. /********************************************************************************
  589. * sysTimestampFreq - get the timestamp timer clock frequency
  590. *
  591. * This routine returns the frequency of the timer clock, in ticks per second.
  592. * The rate of the timestamp timer should be set explicitly within the BSP,
  593. * in the sysHwInit() routine.
  594. *
  595. * RETURNS: The timestamp timer clock frequency, in ticks per second.
  596. */
  597. UINT32 sysTimestampFreq (void)
  598.     {
  599.     return (UINT32) TICK_FREQ;
  600.     }
  601. /********************************************************************************       
  602. * sysTimestamp - get the timestamp timer tick count
  603. *
  604. * This routine returns the current value of the timestamp timer tick counter.
  605. * The tick count can be converted to seconds by dividing by the return of
  606. * sysTimestampFreq().
  607. *
  608. * This routine should be called with interrupts locked.  If interrupts are
  609. * not already locked, sysTimestampLock() should be used instead.
  610. *
  611. * RETURNS: The current timestamp timer tick count.
  612. *
  613. * SEE ALSO: sysTimestampLock()
  614. */
  615.  
  616. UINT32 sysTimestamp (void)
  617.     {
  618.     return (sysTimestampPeriod() - *TMU_TCNT2); /* 32bit down counter */
  619.     }
  620. /********************************************************************************
  621. * sysTimestampLock - get the timestamp timer tick count
  622. *
  623. * This routine returns the current value of the timestamp timer tick counter.
  624. * The tick count can be converted to seconds by dividing by the return of
  625. * sysTimestampFreq().
  626. *
  627. * This routine locks interrupts for cases where it is necessary to stop the
  628. * tick counter in order to read it, or when two independent counters must
  629. * be read.  If interrupts are already locked, sysTimestamp() should be
  630. * used instead.
  631. *
  632. * RETURNS: The current timestamp timer tick count.
  633. *
  634. * SEE ALSO: sysTimestamp()
  635. */
  636.  
  637. UINT32 sysTimestampLock (void)
  638.     {
  639.     return (sysTimestampPeriod() - *TMU_TCNT2); /* 32bit down counter */
  640.     }
  641. #endif /* INCLUDE_TIMESTAMP */