⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sunectimer.c

📁 IXP425的BSP代码
💻 C
字号:
/* sunEcTimer.c - Sun EC Timer library *//* Copyright 1984-1994 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------02c,19sep94,vin  fixed a bug in the sysAuxClkEnable, changed copyright.		 removed the SUN_COUNTER_1 reset (SPR #3426)02b,19sep94,vin  fixed a bug in the sysClkEnable,		 changed the SUN_IR_PENDING to SUN_IR_MASK_SET (SPR #3400)01c,11jun93,ccc  moved intConnect() to sysHwInit2().01b,13may93,ccc  moved to final directory.01a,17mar93,ccc  created.    26apr93,ccc  changed path to build in sunec directory.*//*DESCRIPTIONThis library contains routines to manipulate the timer functions on thesun1e with a board-independant interface.  This library handles boththe system clock and the auxiliary clock functions.The macros SYS_CLK_RATE_MIN, SYS_CLK_RATE_MAX, AUX_CLK_RATE_MIN, andAUX_CLK_RATE_MAX must be defined to provide parameter checking for thesys[Aux]ClkRateSet() routines.*/#include "drv/timer/timerDev.h"IMPORT	void	sysClkAck ();IMPORT	void	sysAuxClkAck ();/* Locals */ LOCAL int     sysClkTicksPerSecond = 60; LOCAL BOOL    sysClkRunning        = FALSE; LOCAL FUNCPTR sysClkRoutine        = NULL; LOCAL int     sysClkArg            = NULL; LOCAL BOOL    sysClkConnected      = FALSE; LOCAL int     auxClkTicksPerSecond = 60; LOCAL BOOL    sysAuxClkRunning     = FALSE; LOCAL FUNCPTR sysAuxClkRoutine     = NULL; LOCAL int     sysAuxClkArg         = NULL;LOCAL BOOL    sysAuxClkConnected   = FALSE; /**************************************************************************** sysClkInt - clock interrupt handler** This routine handles the clock interrupt.  It is attached to the clock* interrupt vector by the routine sysClkConnect().  The appropriate routine* is called and the interrupts are acknowleged.*/LOCAL void sysClkInt (void)    {    if (sysClkRoutine != NULL)        (*(FUNCPTR) sysClkRoutine) (sysClkArg);    sysClkAck ();    }/***************************************************************************** sysAuxClkInt - clock interrupt handler** This routine handles the clock interrupt.  It is attached to the clock* interrupt vector by the routine sysAuxClkConnect().  The appropriate* routine is called and the interrupts are acknowleged.*/LOCAL void sysAuxClkInt (void)    {    if (sysAuxClkRoutine != NULL)        (*(FUNCPTR) sysAuxClkRoutine) (sysAuxClkArg);    sysAuxClkAck ();    }/***************************************************************************** sysClkConnect - connect a routine to the system clock interrupt** This routine specifies the interrupt handler to be called at each clock* interrupt.  It does not enable system clock interrupts.  Normally, it is* called from usrRoot() in usrConfig.c to connect usrClock() to the system* clock interrupt.** RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.** SEE ALSO: usrClock(), sysClkEnable()*/STATUS sysClkConnect    (    FUNCPTR routine,    /* routine called at each system clock interrupt */    int     arg         /* argument with which to call routine           */    )    {    sysHwInit2 ();    sysClkConnected   = TRUE;    sysClkRoutine     = routine;    sysClkArg         = arg;    return (OK);    } /***************************************************************************** sysClkDisable - turn off system clock interrupts** This routine disables system clock interrupts.** RETURNS: N/A** SEE ALSO: sysClkEnable()*/ void sysClkDisable (void)     {    if (sysClkRunning)        {        *SUN_IR_MASK_SET = IR_ALL;     /* turn off interrupts */        *SUN_IR_MASK_SET = IR_CLOCK10; /* turn off lvl 10 */        *SUN_IR_MASK_CLR = IR_ALL;     /* turn on interrupts */        sysClkRunning    = FALSE;        }    }/***************************************************************************** sysClkEnable - turn on system clock interrupts** This routine enables system clock interrupts.** RETURNS: N/A** SEE ALSO: sysClkDisable(), sysClkRateSet()*/void sysClkEnable (void)    {    unsigned int intRegister;    if (!sysClkRunning)        {        *SUN_IR_MASK_SET = IR_ALL;       /* turn off interrupts */        intRegister      = *SUN_LIMIT_0; /* Clear interrupt at clock */        *SUN_IR_MASK_SET = IR_CLOCK10;   /* Clear interrupt pending */        *SUN_IR_MASK_CLR = IR_CLOCK10;   /* turn on lvl 10 */	*SUN_LIMIT_0     = (1000000 / sysClkTicksPerSecond) << 10;        *SUN_IR_MASK_CLR = IR_ALL;       /* turn on interrupts */        sysClkRunning    = TRUE;        }    }/***************************************************************************** sysClkRateGet - get the system clock rate** This routine returns the interrupt rate of the system clock.** RETURNS: The number of ticks per second of the system clock.** SEE ALSO: sysClkEnable(), sysClkRateSet()*/int sysClkRateGet (void)    {    return (sysClkTicksPerSecond);    }/***************************************************************************** sysClkRateSet - set the system clock rate** This routine sets the interrupt rate of the system clock.  It does not* enable system clock interrupts.  Normally, it is called by usrRoot() in* usrConfig.c.** RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.** SEE ALSO: sysClkEnable(), sysClkRateGet()*/STATUS sysClkRateSet    (    int ticksPerSecond      /* number of clock interrupts per second */    )    {    if (ticksPerSecond < SYS_CLK_RATE_MIN || ticksPerSecond > SYS_CLK_RATE_MAX)	return (ERROR);    sysClkTicksPerSecond = ticksPerSecond;    if (sysClkRunning)	{	sysClkDisable ();	sysClkEnable ();	}    return (OK);    }/***************************************************************************** sysAuxClkConnect - connect a routine to the auxiliary clock interrupt** This routine specifies the interrupt handler to be called at each* auxiliary clock interrupt.  It does not enable auxiliary clock* interrupts.** RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.** SEE ALSO: sysAuxClkDisconnect(), sysAuxClkEnable()*/STATUS sysAuxClkConnect    (    FUNCPTR routine,    /* routine called at each aux. clock interrupt */    int     arg         /* argument with which to call routine         */    )    {    sysAuxClkConnected = TRUE;    sysAuxClkRoutine   = routine;    sysAuxClkArg       = arg;    return (OK);    }/***************************************************************************** sysAuxClkDisconnect - clear the auxiliary clock routine** This routine disables the auxiliary clock interrupt, stops the timer,* and disconnects the routine currently connected to the auxiliary clock* interrupt.** RETURNS: N/A** SEE ALSO: sysAuxClkConnect(), sysAuxClkEnable()*/void sysAuxClkDisconnect (void)    {    /* disable the auxiliary clock interrupt */    sysAuxClkDisable ();    /* connect dummy routine, just in case */    sysAuxClkConnect ((FUNCPTR) logMsg, (int) "auxiliary clock interrupt\n");    }/***************************************************************************** sysAuxClkDisable - turn off auxiliary clock interrupts** This routine disables auxiliary clock interrupts.** RETURNS: N/A** SEE ALSO: sysAuxClkEnable()*/void sysAuxClkDisable (void)    {    if (sysAuxClkRunning)        {        *SUN_COUNTER_1_CR = 1;      /* disable timer */        sysAuxClkRunning = FALSE;        }    }/***************************************************************************** sysAuxClkEnable - turn on auxiliary clock interrupts** This routine enables auxiliary clock interrupts.** RETURNS: N/A** SEE ALSO: sysAuxClkDisable(), sysAuxClkRateSet()*/void sysAuxClkEnable (void)    {    if (!sysAuxClkRunning)        {	*SUN_COUNTER_1_CR = 0;		/* enable timer */	*SUN_LIMIT_1      = (1000000 / auxClkTicksPerSecond) << 10;        sysAuxClkRunning  = TRUE;        }    }/***************************************************************************** sysAuxClkRateGet - get the auxiliary clock rate** This routine returns the interrupt rate of the auxiliary clock.** RETURNS: The number of ticks per second of the auxiliary clock.** SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()*/int sysAuxClkRateGet (void)    {    return (auxClkTicksPerSecond);    }/***************************************************************************** sysAuxClkRateSet - set the auxiliary clock rate** This routine sets the interrupt rate of the auxiliary clock.  It does not* enable auxiliary clock interrupts.** RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.** SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()*/STATUS sysAuxClkRateSet    (    int ticksPerSecond      /* number of clock interrupts per second */    )    {    if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)	return (ERROR);    auxClkTicksPerSecond = ticksPerSecond;    if (sysAuxClkRunning)	{	sysAuxClkDisable ();	sysAuxClkEnable ();	}    return (OK);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -