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

VxWorks

开发平台:

C/C++

  1. /* m68681Timer.c - MC68681/SC2681 timer driver */
  2. /* Copyright 1984-1997 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01h,10jun97,wlf  doc: cleanup
  8. 01g,03mar97,kkk  added timestamp support. Added macro M68681_PRESCALER.
  9. 01f,04feb97,dat  changed timer to run in counter mode.
  10. 01e,04jan97,p_m  removed "," in param list that was introduced by doc cleanup.
  11. 01d,25oct96,wlf  doc: cleanup.
  12. 01c,27mar96,dat  new timer driver, to be used with new sio serial drivers
  13. 01b,08feb93,caf  fixed ansi warning (SPR 1851).
  14. 01a,21aug92,caf  created.
  15. */
  16. /*
  17. DESCRIPTION
  18. This is the timer driver for the MC68681/SC2681 DUART.
  19. It uses the DUART for the system clock only.
  20. This driver relies on the serial driver m68681Serial.c for its operation.
  21. The macros SYS_CLK_RATE_MIN and SYS_CLK_RATE_MAX must be defined to provide
  22. parameter checking for sysClkRateSet().
  23. The macro DUART_CLOCK_DEVICE must be defined.
  24. If the driver controls only one DUART, DUART_CLOCK_DEVICE must be 0.
  25. The macro DUART_HZ must be defined to reflect the clock frequency supplied
  26. to the DUART hardware.  The typical value is 3686400.
  27. If this driver is being used with the new bi-modal driver m68681Sio.c, the
  28. a completely new interface is used.  This is expected to be a model for
  29. a new class of timer devices altogether.  This new interface is initialized
  30. by the m68681DevInit() function which links the m68681Duart to the new
  31. m68681Clk structures.
  32. */
  33. #ifdef INCLUDE_TYCODRV_5_2
  34. /* TO BE USED WITH SINGLE-MODE SERIAL DRIVER */
  35. /* locals */
  36. LOCAL int sysClkTicksPerSecond = 60;
  37. LOCAL int sysClkRunning = FALSE;
  38. LOCAL BOOL sysClkConnected = FALSE;
  39. LOCAL FUNCPTR  sysClkRoutine = NULL;
  40. LOCAL int  sysClkArg = NULL;
  41. IMPORT void tyImrSet ();
  42. IMPORT void tyCoClkConnect ();
  43. /*******************************************************************************
  44. *
  45. * sysClkInt - handle system clock interrupts
  46. *
  47. * This routine handles system clock interrupts.
  48. *
  49. * RETURNS: N/A
  50. */
  51. LOCAL void sysClkInt (void)
  52.     {
  53.     if (*tyCoDv [2 * DUART_CLOCK_DEVICE].ctroff)      /* reset the interrupt */
  54. ;
  55.     if (sysClkRoutine != NULL)
  56. (*(FUNCPTR) sysClkRoutine) (sysClkArg);
  57.     }
  58. /*******************************************************************************
  59. *
  60. * sysClkConnect - connect a routine to the system clock interrupt
  61. *
  62. * This routine specifies the interrupt service routine to be called at each
  63. * clock interrupt.  Normally, it is called from usrRoot() in usrConfig.c to
  64. * connect usrClock() to the system clock interrupt.  
  65. *
  66. * RETURN: OK, or ERROR if the routine cannot be connected to the interrupt.
  67. *
  68. * SEE ALSO: intConnect(), usrClock(), sysClkEnable()
  69. */
  70. STATUS sysClkConnect
  71.     (
  72.     FUNCPTR routine, /* routine called at each system clock interrupt */
  73.     int     arg /* argument with which to call routine           */
  74.     )
  75.     {
  76.     sysHwInit2 (); /* XXX for now -- needs to be in usrConfig.c */
  77.     /* DUART serial driver handles the timer interrupt */
  78.     tyCoClkConnect (DUART_CLOCK_DEVICE, sysClkInt);
  79.     sysClkRoutine   = routine;
  80.     sysClkArg       = arg;
  81.     sysClkConnected = TRUE;
  82.     return (OK);
  83.     }
  84. /*******************************************************************************
  85. *
  86. * sysClkDisable - turn off system clock interrupts
  87. *
  88. * This routine disables system clock interrupts.
  89. *
  90. * RETURNS: N/A
  91. *
  92. * SEE ALSO: sysClkEnable()
  93. */
  94. void sysClkDisable (void)
  95.     {
  96.     if (sysClkRunning)
  97. {
  98. tyImrSet (& tyCoDv [2 * DUART_CLOCK_DEVICE], 0, CTR_RDY_INT);
  99. *tyCoDv [2 * DUART_CLOCK_DEVICE].acr = BRG_SELECT;
  100. sysClkRunning = FALSE;
  101. }
  102.     }
  103. /*******************************************************************************
  104. *
  105. * sysClkEnable - turn on system clock interrupts
  106. *
  107. * This routine enables system clock interrupts.
  108. *
  109. * RETURNS: N/A
  110. *
  111. * SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()
  112. */
  113. void sysClkEnable (void)
  114.     {
  115.     if (!sysClkRunning)
  116. {
  117. int temp;
  118. /* preload the preload register */
  119. temp = (DUART_HZ / 2) / sysClkTicksPerSecond;
  120. *tyCoDv [2 * DUART_CLOCK_DEVICE].ctlr = LSB (temp);
  121. *tyCoDv [2 * DUART_CLOCK_DEVICE].ctur = MSB (temp);
  122. *tyCoDv [2 * DUART_CLOCK_DEVICE].acr = BRG_SELECT | TMR_EXT_CLK;
  123. tyImrSet (& tyCoDv [2 * DUART_CLOCK_DEVICE], CTR_RDY_INT, 0);
  124. if (* tyCoDv [2 * DUART_CLOCK_DEVICE].ctron)
  125.     ; /* start timer */
  126.         sysClkRunning = TRUE;
  127. }
  128.     }
  129. /*******************************************************************************
  130. *
  131. * sysClkRateGet - get the system clock rate
  132. *
  133. * This routine returns the system clock rate.
  134. *
  135. * RETURNS: The number of ticks per second of the system clock.
  136. *
  137. * SEE ALSO: sysClkEnable(), sysClkRateSet()
  138. */
  139. int sysClkRateGet (void)
  140.     {
  141.     return (sysClkTicksPerSecond);
  142.     }
  143. /*******************************************************************************
  144. *
  145. * sysClkRateSet - set the system clock rate
  146. *
  147. * This routine sets the interrupt rate of the system clock.  It does not
  148. * enable system clock interrupts.  It is called by usrRoot() in
  149. * usrConfig.c.
  150. *
  151. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  152. *
  153. * SEE ALSO: sysClkEnable(), sysClkRateGet()
  154. */
  155. STATUS sysClkRateSet
  156.     (
  157.     int ticksPerSecond      /* number of clock interrupts per second */
  158.     )
  159.     {
  160.     if (ticksPerSecond < SYS_CLK_RATE_MIN || ticksPerSecond > SYS_CLK_RATE_MAX)
  161.         return (ERROR);
  162.     sysClkTicksPerSecond = ticksPerSecond;
  163.     if (sysClkRunning)
  164.         {
  165.         sysClkDisable ();
  166.         sysClkEnable ();
  167.         }
  168.     return (OK);
  169.     }
  170. #else /* INCLUDE_TYCODRV_5_2 */
  171. /* TO BE USED WITH NEW DUAL-MODE SIO DRIVER */
  172. /*
  173. DESCRIPTION
  174. This is the timer driver for the MC68681/SC2681 DUART.
  175. Each MC68681 device provides one counter/timer device.  This driver
  176. presumes counter mode operation.
  177. This driver relies on the serial driver m68681Sio.c for its operation.
  178. This driver should not be used if m68681Sio.o is not included in the system.
  179. The default clock rate can be specified by setting the macro M68681_CLK_
  180. TICKS to the desired value.  If not set, the value used will be 60 hertz.
  181. To use this driver, the user creates and initializes the data in a 
  182. M68681_CLK structure.  The address of that structure, and the address
  183. of the associated M68681_DUART structure (which has already been created
  184. and completely initialized) are passed to the m68681ClkInit routine.
  185. i.e.
  186. .CS
  187. /@ data structures, serial and clock @/
  188. M68681_DUART myDuart;
  189. M68681_CLK myClock;
  190. sysHwInit2 ()
  191.     {
  192.     ...
  193.     /@ 68681 Duart must be initialized first @/
  194.     m68681DevInit (&myDuart);
  195.     ...
  196.     /@ interrupt should be connected before m68681ClkInit @/
  197.     intConnect (INUM_TO_IVEC(CLK_INUM), m68681ClkInt, &myClock);
  198.     ...
  199.     /@ initialize clock structure elements, as needed @/
  200.     myClock->min   = SYS_CLK_RATE_MIN;
  201.     myClock->max   = SYS_CLK_RATE_MAX;
  202.     myClock->hertz = 3686400;
  203.     myClock->rate  = 60;
  204.     /@ call initialization procedure @/
  205.     m68681ClkInit (&myClock, &myDuart);
  206.     ...
  207.     }
  208. .CE
  209. */
  210. #include "drv/sio/m68681Sio.h"
  211. /* default clock rate */
  212. #ifndef M68681_CLK_TICKS
  213. #define M68681_CLK_TICKS (60)
  214. #endif
  215. /* default prescaler value in counter mode */
  216. #ifndef M68681_PRESCALER
  217. #define M68681_PRESCALER        (16)
  218. #endif
  219. /*
  220.  *  Allow user to redefine the register access procedure.
  221.  * Default is to assume normal memory accesses.
  222.  * The register pointer argument comes directly from the
  223.  * data structures.
  224.  */
  225. #ifndef M68681_READ
  226. #define M68681_READ(x) (*(x)) /* arg is register pointer */
  227. #endif
  228. #ifndef M68681_WRITE
  229. #define M68681_WRITE(x,y) (*(x) = y) /* args are reg ptr, data to write */
  230. #endif
  231. /* Oscillator frequency input to m68681 */
  232. #define M68681_OSC_HZ (3686400)
  233. #define MAX_CTR_VALUE (0xffff)
  234. #define MIN_CTR_VALUE (0x2)
  235. /*********************************************************************
  236. *
  237. * m68681ClkInit - initialize an MC68681 counter/timer
  238. *
  239. * This routine initializes a clock device.  It requires a pointer to
  240. * the associated DUART structure.
  241. *
  242. * After initialization, the MC68681 CLK structure is disabled with no attached
  243. * routines.
  244. *
  245. * If the structure elements <hertz>, <rate>, <min>, or <max> are uninitialized,
  246. * this routine initializes them.  If these values are invalid, they
  247. * are corrected.
  248. *
  249. * RETURNS: OK, or ERROR if either <pClk> or <pDuart> is invalid.
  250. */
  251. STATUS m68681ClkInit 
  252.     (
  253.     M68681_CLK *pClk, /* clock to be initialized */
  254.     M68681_DUART *pDuart /* associated DUART for this clock */
  255.     )
  256.     {
  257.     int temp;
  258.     if (pClk == NULL || pDuart == NULL)
  259. return ERROR;
  260.     /* initialize clock data fields */
  261.     pClk->running = FALSE;
  262.     pClk->routine = NULL;
  263.     pClk->arg = 0;
  264.     /* normalize and fix up ticks, hertz, min, max */
  265.     if (pClk->rate <= 0)
  266. pClk->rate = M68681_CLK_TICKS;
  267.     if (pClk->hertz <= 0)
  268. pClk->hertz = M68681_OSC_HZ;
  269.     temp = pClk->hertz / (M68681_PRESCALER * MAX_CTR_VALUE);
  270.     if (pClk->min < temp)
  271. pClk->min = temp;
  272.     temp = pClk->hertz / (M68681_PRESCALER * MIN_CTR_VALUE);
  273.     if (pClk->max > temp || pClk->max <= 0)
  274. pClk->max = temp;
  275.     /* connect DUART to clock */
  276.     pClk->pDuart = pDuart;
  277.     /* connect clock to DUART */
  278.     pDuart->tickArg = pClk;
  279.     pDuart->tickRtn = m68681ClkInt;
  280.     return OK;
  281.     }
  282. /********************************************************************
  283. *
  284. * m68681ClkInt - MC68681 clock interrupt handler
  285. *
  286. * This is the clock interrupt handler for the MC68681/SC2681 DUART.  The
  287. * system connects this routine to the appropriate interrupt vector.
  288. *
  289. * Because the counter is actually stopped for a very small amount of
  290. * time, there is some amount of clock skew in the system.  It should
  291. * be less than the actual clock frequency error.
  292. *
  293. * RETURNS: N/A
  294. */
  295. void m68681ClkInt 
  296.     (
  297.     M68681_CLK *pClk /* clock to be serviced */
  298.     )
  299.     {
  300.     char resetTimer;
  301.     UINT16 temp;
  302.     /* turn off the counter */
  303.     resetTimer = M68681_READ (pClk->pDuart->ctroff);
  304.     /* adjust for clock skew */
  305.     temp = (M68681_READ (pClk->pDuart->ctur) << 8);
  306.     temp |= M68681_READ (pClk->pDuart->ctlr);
  307.     temp += pClk->preload; 
  308.     M68681_WRITE (pClk->pDuart->ctlr, LSB (temp));
  309.     M68681_WRITE (pClk->pDuart->ctur, MSB (temp));
  310.     /* restart counter */
  311.     resetTimer = M68681_READ (pClk->pDuart->ctron);
  312.     if (pClk->routine != NULL)
  313. (*pClk->routine) (pClk->arg);
  314.     }
  315. /********************************************************************
  316. *
  317. * m68681ClkConnect - connect a routine to the clock interrupt
  318. *
  319. * This routine specifies the user routine to be called at each clock
  320. * interrupt of a Motorola MC68681 timer.  It does not enable system 
  321. * clock interrupts.
  322. *
  323. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  324. *
  325. * SEE ALSO: m68681ClkEnable()
  326. */
  327. STATUS m68681ClkConnect
  328.     (
  329.     M68681_CLK *pClk, /* clock to connect to */
  330.     VOIDFUNCPTR routine,/* routine called at each clock interrupt */
  331.     void *  arg /* argument with which to call routine */
  332.     )
  333.     {
  334.     pClk->routine   = NULL;
  335.     pClk->arg       = arg;
  336.     pClk->routine   = routine;
  337.     return OK;
  338.     }
  339. /********************************************************************
  340. *
  341. * m68681ClkDisable - turn off clock interrupts
  342. *
  343. * This routine disables clock interrupts generated by the Motorola MC68681
  344. * timer.
  345. *
  346. * RETURNS: N/A
  347. *
  348. * SEE ALSO: m68681ClkEnable()
  349. */
  350. void m68681ClkDisable 
  351.     (
  352.     M68681_CLK *pClk /* clock to be disabled */
  353.     )
  354.     {
  355.     if (pClk->running)
  356. {
  357. int level = intLock ();
  358. /* Disable the timer interrupt */
  359. m68681ImrSetClr (pClk->pDuart, 0, M68681_ISR_CTR_RDY_INT);
  360. /* stop clock */
  361. M68681_READ (pClk->pDuart->ctroff);
  362.         pClk->running = FALSE;
  363. intUnlock (level);
  364. }
  365.     }
  366. /********************************************************************
  367. *
  368. * m68681ClkEnable - turn on clock interrupts
  369. *
  370. * This routine enables clock interrupts generated by the Motorola MC68681
  371. * timer.
  372. *
  373. * RETURNS: N/A
  374. *
  375. * SEE ALSO: m68681ClkConnect(), m68681ClkDisable(), m68681ClkRateSet()
  376. */
  377. void m68681ClkEnable 
  378.     (
  379.     M68681_CLK * pClk  /* clock to be enabled */
  380.     )
  381.     {
  382.     if (!pClk->running)
  383. {
  384. int level;
  385. int temp;
  386. char startTimer;
  387. M68681_DUART *pDuart = pClk->pDuart;
  388. /* calculate the preload value */
  389. temp = (pClk->hertz) / M68681_PRESCALER / pClk->rate; 
  390. /* min is 2, max is 0xffff, per m68681 users manual */
  391. if (temp < MIN_CTR_VALUE)
  392.     temp = MIN_CTR_VALUE;
  393. else if (temp > MAX_CTR_VALUE)
  394.     temp = MAX_CTR_VALUE;
  395. pClk->preload = temp;
  396. level = intLock ();
  397. M68681_WRITE (pDuart->ctlr, LSB (temp));
  398. M68681_WRITE (pDuart->ctur, MSB (temp));
  399. /* Counter mode */
  400. m68681AcrSetClr (pDuart, M68681_ACR_CTR_EXT_CLK_16, 0);
  401. /* Enable the timer interrupt */
  402. m68681ImrSetClr (pDuart, M68681_ISR_CTR_RDY_INT, 0);
  403. /* Initialize the timer */
  404. startTimer = M68681_READ (pDuart->ctron);
  405. intUnlock (level);
  406.         pClk->running = TRUE;
  407. }
  408.     }
  409. /*****************************************************************
  410. *
  411. * m68681ClkRateGet - get the clock rate
  412. *
  413. * This routine returns the interrupt rate of the MC68681 clock.
  414. *
  415. * RETURNS: The number of ticks per second of the MC68681 clock.
  416. *
  417. * SEE ALSO: m68681ClkEnable(), m68681ClkRateSet()
  418. */
  419. int m68681ClkRateGet
  420.     (
  421.     M68681_CLK * pClk /* clock to be read */
  422.     )
  423.     {
  424.     return (pClk->rate);
  425.     }
  426. /*****************************************************************
  427. *
  428. * m68681ClkRateSet - set the clock rate
  429. *
  430. * This routine sets the interrupt rate of the MC68681 clock.  It does not
  431. * enable clock interrupts.
  432. *
  433. * In addition to checking against the user-specified min/max rates, this
  434. * routine also checks against the hardware limits for min/max rates.  These 
  435. * limits cannot be exceeded.
  436. *
  437. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  438. *
  439. * SEE ALSO:
  440. * m68681ClkEnable(), m68681ClkRateGet()
  441. */
  442. STATUS m68681ClkRateSet
  443.     (
  444.     M68681_CLK *pClk, /* clock to be set */
  445.     int rate      /* number of clock interrupts per second */
  446.     )
  447.     {
  448.     if (rate < pClk->min
  449.      || rate > pClk->max)
  450.         return (ERROR);
  451.     pClk->rate = rate;
  452.     if (pClk->running)
  453.         {
  454.         m68681ClkDisable (pClk);
  455.         m68681ClkEnable  (pClk);
  456.         }
  457.     return (OK);
  458.     }
  459. /*****************************************************************
  460. *
  461. * m68681ClkReadOnFly - read the clock internal counter
  462. *
  463. * This routine reads the counter/timer value on the fly when receiving
  464. * normal oscillator input.  The lowest 8 bits of the counter roll over every
  465. * 140 microseconds.  A standard hi/low/hi read sequence ensures a consistent
  466. * value from the pair of registers, assuming that the two 8-bit values are
  467. * individually latched and there is no problem with ripple in either
  468. * register.
  469. *
  470. * RETURNS: The current countdown counter value, or ERROR if
  471. * there is a hardware error.
  472. */
  473. int m68681ClkReadOnFly
  474.     (
  475.     M68681_CLK * pClk /* clock to be read */
  476.     )
  477.     {
  478.     volatile UCHAR *pLow = pClk->pDuart->ctlr;
  479.     volatile UCHAR *pHi = pClk->pDuart->ctur;
  480.     UCHAR low;
  481.     UCHAR hi1;
  482.     UCHAR hi2;
  483.     int level;
  484.     level = intLock ();
  485.     /* usual hi/low/hi sequence */
  486.     hi1 = M68681_READ (pHi);
  487.     low = M68681_READ (pLow);
  488.     hi2 = M68681_READ (pHi);
  489.     if (hi1 != hi2)
  490. low = M68681_READ (pLow);
  491.     intUnlock (level);
  492.     return (int)((hi2 << 8) + low);
  493.     }
  494. IMPORT M68681_CLK * pSysClk;
  495. /*******************************************************************************
  496. *
  497. * sysClkConnect - connect a routine to the system clock interrupt
  498. *
  499. * This routine specifies the interrupt service routine to be called at each
  500. * clock interrupt.  Normally, it is called from usrRoot() in usrConfig.c to
  501. * connect usrClock() to the system clock interrupt.  
  502. *
  503. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  504. *
  505. * SEE ALSO: intConnect(), usrClock(), sysClkEnable()
  506. */
  507. STATUS sysClkConnect
  508.     (
  509.     FUNCPTR routine, /* routine called at each system clock interrupt */
  510.     int     arg /* argument with which to call routine           */
  511.     )
  512.     {
  513.     sysHwInit2 ();
  514.     return (m68681ClkConnect (pSysClk, (VOIDFUNCPTR) routine, (void *) arg)); 
  515.     }
  516. /*******************************************************************************
  517. *
  518. * sysClkEnable - turn on system clock interrupts
  519. *
  520. * This routine enables system clock interrupts.
  521. *
  522. * RETURNS: N/A
  523. *
  524. * SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()
  525. */
  526. void  sysClkEnable (void)
  527.     {
  528.     m68681ClkEnable (pSysClk); 
  529.     }
  530. /*******************************************************************************
  531. *
  532. * sysClkDisable - turn off system clock interrupts
  533. *
  534. * This routine disables system clock interrupts.
  535. *
  536. * RETURNS: N/A
  537. *
  538. * SEE ALSO: sysClkEnable()
  539. */
  540. void sysClkDisable (void)
  541.     {
  542.     m68681ClkDisable (pSysClk); 
  543.     }
  544. /*******************************************************************************
  545. *
  546. * sysClkRateGet - get the system clock rate
  547. *
  548. * This routine returns the interrupt rate of the system clock.
  549. *
  550. * RETURNS: The number of ticks per second of the system clock.
  551. *
  552. * SEE ALSO: sysClkRateSet()
  553. */
  554. int sysClkRateGet ()
  555.     {
  556.     return m68681ClkRateGet (pSysClk); 
  557.     }
  558. /*******************************************************************************
  559. *
  560. * sysClkRateSet - set the system clock rate
  561. *
  562. * This routine sets the interrupt rate of the system clock.  It does not
  563. * enable system clock interrupts.  It is called by usrRoot() in
  564. * usrConfig.c.
  565. *
  566. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  567. *
  568. * SEE ALSO: sysClkEnable(), sysClkRateGet()
  569. */
  570. STATUS sysClkRateSet (int ticksPerSecond)
  571.     {
  572.     return m68681ClkRateSet (pSysClk, ticksPerSecond);
  573.     }
  574. #ifdef INCLUDE_TIMESTAMP
  575. /*******************************************************************************
  576. *
  577. * sysTimestampConnect - connect a user routine to a timestamp timer interrupt
  578. *
  579. * This routine specifies the user interrupt routine to be called at each
  580. * timestamp timer interrupt.
  581. *
  582. * RETURNS: ERROR, always.
  583. */
  584. STATUS sysTimestampConnect
  585.     (
  586.     FUNCPTR routine,    /* routine called at each timestamp timer interrupt */
  587.     int arg             /* argument with which to call routine */
  588.     )
  589.     {
  590.     return (ERROR);
  591.     }
  592. /*******************************************************************************
  593. *
  594. * sysTimestampEnable - enable a timestamp timer interrupt
  595. *
  596. * This routine enables timestamp timer interrupts and resets the counter.
  597. *
  598. * RETURNS: OK, always.
  599. *
  600. * SEE ALSO: sysTimestampDisable()
  601. */
  602. STATUS sysTimestampEnable (void)
  603.    {
  604.    return (OK);
  605.    }
  606. /*******************************************************************************
  607. *
  608. * sysTimestampDisable - disable a timestamp timer interrupt
  609. *
  610. * This routine disables timestamp timer interrupts.
  611. *
  612. * RETURNS: OK, always.
  613. *
  614. * SEE ALSO: sysTimestampEnable()
  615. */
  616. STATUS sysTimestampDisable (void)
  617.     {
  618.     return (OK);
  619.     }
  620. /*******************************************************************************
  621. *
  622. * sysTimestampPeriod - get the period of a timestamp timer
  623. *
  624. * This routine gets the period of the timestamp timer, in ticks.  The
  625. * period, or terminal count, is the number of ticks to which the timestamp
  626. * timer counts before rolling over and restarting the counting process.
  627. *
  628. * RETURNS: The period of the timestamp timer in counter ticks.
  629. */
  630. UINT32 sysTimestampPeriod (void)
  631.     {
  632.     return (pSysClk->preload);
  633.     }
  634. /*******************************************************************************
  635. *
  636. * sysTimestampFreq - get a timestamp timer clock frequency
  637. *
  638. * This routine gets the frequency of the timer clock, in ticks per
  639. * second.  The rate of the timestamp timer is set explicitly by the
  640. * hardware and typically cannot be altered.
  641. *
  642. * RETURNS: The timestamp timer clock frequency, in ticks per second.
  643. */
  644. UINT32 sysTimestampFreq (void)
  645.     {
  646.     return (pSysClk->hertz / M68681_PRESCALER);
  647.     }
  648. /*******************************************************************************
  649. *
  650. * sysTimestamp - get a timestamp timer tick count
  651. *
  652. * This routine returns the current value of the timestamp timer tick counter.
  653. * The tick count can be converted to seconds by dividing it by the return of
  654. * sysTimestampFreq().
  655. *
  656. * This routine should be called with interrupts locked.  If interrupts are
  657. * not locked, sysTimestampLock() should be used instead.
  658. *
  659. * RETURNS: The current timestamp timer tick count.
  660. *
  661. * SEE ALSO: sysTimestampFreq(), sysTimestampLock()
  662. */
  663. UINT32 sysTimestamp (void)
  664.     {
  665.     /* timer is decrementing */
  666.     return (pSysClk->preload - m68681ClkReadOnFly(pSysClk));
  667.     }
  668. /*******************************************************************************
  669. *
  670. * sysTimestampLock - lock interrupts and get the timestamp timer tick count
  671. *
  672. * This routine locks interrupts when the tick counter must be stopped
  673. * in order to read it or when two independent counters must be read.
  674. * It then returns the current value of the timestamp timer tick
  675. * counter.
  676. *
  677. * The tick count can be converted to seconds by dividing it by the return of
  678. * sysTimestampFreq().
  679. *
  680. * If interrupts are already locked, sysTimestamp() should be
  681. * used instead.
  682. *
  683. * RETURNS: The current timestamp timer tick count.
  684. *
  685. * SEE ALSO: sysTimestampFreq(), sysTimestamp()
  686. */
  687. UINT32 sysTimestampLock (void)
  688.     {
  689.     /* same as sysTimestamp() */
  690.     return (pSysClk->preload - m68681ClkReadOnFly(pSysClk));
  691.     }
  692. #endif  /* INCLUDE_TIMESTAMP */
  693. #endif /* INCLUDE_TYCODRV_5_2 */