📄 ev960jxtimer.c
字号:
/* ev960jxTimer.c - i960 processor timer library *//* Copyright 1984-1997 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01f,21may97,db moved intConnect from sysTimestampConnect to sysTimestampEnable.(SPR #8400)01e,03jan97,wlf doc: more cleanup.01d,17jul96,tmk fixed casting of TIMER_ROLL_OVER - made arithmetic work.01c,23may96,wlf doc: cleanup.01b,05jan96,myz removed intConnect in xxxClkEnable routine.01a,20mar95,kvk Created.*//*DESCRIPTIONThis library contains routines to manipulate the timer functions on theep960jx and hx with a board-independent 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.*//* Move the following into /ev960jxTimer.h when created *//* Timer Reload Register 0 */#define EP960_TRR0 ((unsigned long *) TRR0_ADDR)/* Timer Count Register 0 */#define EP960_TCR0 ((unsigned long *) TCR0_ADDR)/* Timer Mode Register 0 */#define EP960_TMR0 ((unsigned long *) TMR0_ADDR)/* Timer Reload Register 1 */#define EP960_TRR1 ((unsigned long *) TRR1_ADDR)/* Timer Count Register 1 */#define EP960_TCR1 ((unsigned long *) TCR1_ADDR)/* Timer Mode Register 1 */#define EP960_TMR1 ((unsigned long *) TMR1_ADDR)/* IMSK Register */#define EP960_IMSK ((unsigned long *) IMSK_ADDR)#define CPU_SPEED_MHZ 33#define TIMER_ROLL_OVER ((unsigned long) 0xffffffff)#include "drv/timer/timerDev.h"/* 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 acknowledged.*/LOCAL void sysClkInt (void) { if (sysClkRoutine != NULL) (*(FUNCPTR) sysClkRoutine) (sysClkArg); /* processor clears the IPEND bit upon entry into the ISR */ }/***************************************************************************** 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 acknowledged.*/LOCAL void sysAuxClkInt (void) { if (sysAuxClkRoutine != NULL) (*(FUNCPTR) sysAuxClkRoutine) (sysAuxClkArg); }/***************************************************************************** sysClkConnect - connect a routine to the system clock interrupt** This routine specifies the interrupt service routine to be called at each* clock interrupt. Normally it is called from usrRoot() in usrConfig.c to * connect usrClock() to the system clock interrupt.** RETURN: OK, or ERROR if the routine cannot be connected to the interrupt.** SEE ALSO: intConnect(), usrClock(), sysClkEnable()*/STATUS sysClkConnect ( FUNCPTR routine, /* routine called at each system clock interrupt */ int arg /* argument with which to call routine */ ) { (void)intConnect ((void *)VECTOR_TMR0, sysClkInt, 0); sysClkConnected = TRUE; sysClkRoutine = routine; sysClkArg = arg; sysHwInit2 (); 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) { /* Mask the timer interrupt bits in the IMSK register */ *EP960_IMSK &= 0x20ff; /* Set the Timer mode Register */ *EP960_TMR0 = 0; /* Clear the timer interrupts in IPND register, if any */ vxIPNDClear(0x1000); sysClkRunning = FALSE; } }/***************************************************************************** sysClkEnable - turn on system clock interrupts** This routine enables system clock interrupts.** RETURNS: N/A** SEE ALSO: sysClkDisable(), sysClkRateSet()*/void sysClkEnable (void) { if (!sysClkRunning) { /* Set the Timer Count register to 0 */ *EP960_TCR0 = (CPU_SPEED_MHZ * 1000000 / sysClkTicksPerSecond); /* Load the Timer Reload register */ *EP960_TRR0 = (CPU_SPEED_MHZ * 1000000 / sysClkTicksPerSecond); /* Set the Timer mode Register */ *EP960_TMR0 = 7; /* enable timer, auto reload */ /* Enable the timer interrupt bits in the IMSK register */ *EP960_IMSK |= 0x1000; sysClkRunning = TRUE; } } /***************************************************************************** sysClkRateGet - get the system clock rate** This routine returns the system clock rate.** 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 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 service routine 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: intConnect(), sysAuxClkEnable()*/STATUS sysAuxClkConnect ( FUNCPTR routine, /* routine called at each aux. clock interrupt */ int arg /* argument with which to call routine */ ) {#ifdef INCLUDE_TIMESTAMP return (ERROR);#endif (void) intConnect ((void *)VECTOR_TMR1, sysAuxClkInt, 0); 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 (); }/***************************************************************************** sysAuxClkDisable - turn off auxiliary clock interrupts** This routine disables auxiliary clock interrupts.** RETURNS: N/A** SEE ALSO: sysAuxClkEnable()*/void sysAuxClkDisable (void) { if (sysAuxClkRunning) { /* Mask the timer interrupt bits in the IMSK register */ *EP960_IMSK &= 0x10ff; /* Set the Timer mode Register */ *EP960_TMR1 = 0; /* Clear the timer interrupts in IPND register, if any */ vxIPNDClear(0x2000); sysAuxClkRunning = FALSE; } }/***************************************************************************** sysAuxClkEnable - turn on auxiliary clock interrupts*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -