📄 cntmr.c
字号:
/* cntmr.c - GT counters/timers functions *//* Copyright - Galileo technology. 9/3/2000 *//*DESCRIPTIONThis file contains function which serves the user with a complete interfaceto the GT internal counters and timers, please advise: each counter/timer unitcan function only as a counter or a timer at current time.Counter/timer 0 is 32 bit wide.Counters/timers 1-3 are 24 bit wide.*//* includes */#ifdef __linux__#include <asm/galileo/evb64120A/cntmr.h>#include <asm/galileo/evb64120A/core.h>#else#include "cntmr.h"#include "core.h"#endif/********************************************************************* cntTmrStart - Starts a counter/timer with given an initiate value.** INPUTS: unsigned int countNum - Selects one of the 8 counters/timers.* unsigned int countValue - Initial value for count down. * CNT_TMR_OP_MODES opMode - Set Mode, Counter or Timer.** RETURNS: false if one of the parameters is erroneous, true otherwise.*********************************************************************/bool cntTmrStart(CNTMR_NUM countNum, unsigned int countValue, CNT_TMR_OP_MODES opMode){ unsigned int command = 1; unsigned int value; if (countNum > LAST_CNTMR) return false; else { GT_REG_READ(TIMER_COUNTER_CONTROL, &value); cntTmrDisable(countNum); GT_REG_WRITE((TIMER_COUNTER0 + (4 * countNum)), countValue); command = command << countNum * 2; value = value | command; command = command << 1; switch (opMode) { case TIMER: /* The Timer/Counter bit set to logic '1' */ value = value | command; break; case COUNTER: /* The Timer/Counter bit set to logic '0' */ value = value & ~command; break; default: return false; } GT_REG_WRITE(TIMER_COUNTER_CONTROL, value); return true; }}/********************************************************************* cntTmrDisable - Disables the timer/counter operation and return its * value.** INPUTS: unsigned int countNum - Selects one of the 8 counters/timers.* RETURNS: The counter/timer value (unsigned int), if any of the arguments are * erroneous return 0.*********************************************************************/unsigned int cntTmrDisable(CNTMR_NUM countNum){ unsigned int command = 1; unsigned int regValue; unsigned int value; GT_REG_READ(TIMER_COUNTER_CONTROL, &value); if (countNum > LAST_CNTMR) return 0; GT_REG_READ(TIMER_COUNTER0 + 4 * countNum, ®Value); command = command << countNum * 2; /* Disable the timer/counter */ value = value & ~command; GT_REG_WRITE(TIMER_COUNTER_CONTROL, value); return regValue;}/********************************************************************* cntTmrRead - Reads a timer or a counter value. (This operation can be* perform while the counter/timer is active).** RETURNS: The counter/timer value. If wrong input value, return 0.*********************************************************************/unsigned int cntTmrRead(CNTMR_NUM countNum){ unsigned int value; if (countNum > LAST_CNTMR) return 0; else GT_REG_READ(TIMER_COUNTER0 + countNum * 4, &value); return value;}/********************************************************************* cntTmrEnable - Set enable-bit of timer/counter.* Be aware: If the counter/timer is active, this function* will terminate with an false.** INPUTS: unsigned int countNum - Selects one of the 8 counters/timers.* RETURNS: false if one of the parameters is erroneous, true otherwise.*********************************************************************/bool cntTmrEnable(CNTMR_NUM countNum){ unsigned int command = 1; unsigned int value; GT_REG_READ(TIMER_COUNTER_CONTROL, &value); if (countNum > LAST_CNTMR) return false; else { command = command << countNum * 2; if ((command & value) != 0) /* ==> The counter/timer is enabled */ return false; /* doesn't make sense to Enable an "enabled" counter */ value = value | command; GT_REG_WRITE(TIMER_COUNTER_CONTROL, value); return true; }}/********************************************************************* cntTmrLoad - loading value for timer number countNum.* Be aware: If this function try to load value to an enabled* counter/timer it terminate with false.** INPUTS: unsigned int countNum - Selects one of the 8 counters/timers.* unsigned int countValue - The value for load the register.* RETURNS: false if one of the parameters is erroneous, true otherwise.*********************************************************************/bool cntTmrLoad(unsigned int countNum, unsigned int countValue){ unsigned int command = 1; unsigned int value; GT_REG_READ(TIMER_COUNTER_CONTROL, &value); if (countNum > LAST_CNTMR) return false; else { command = command << countNum * 2; value = value & command; if (value != 0) { /* ==> The counter/timer is enabled */ return false; /* can't reload value when counter/timer is enabled */ } else { GT_REG_WRITE((TIMER_COUNTER0 + (4 * countNum)), countValue); return true; } }}/********************************************************************* cntTmrSetMode - Configurate the Mode of the channel to work as a counter* or as a timer. (for more details on the different between* those two modes is written in the Data Sheet).* NOTE: This function only set the counter/timer mode and* don't enable it. * Be aware: If this function try to load value to an enabled* counter/timer it terminate with false.* * INPUTS: unsigned int countNum - Selects one of the 8 counters/timers.* CNT_TMR_OP_MODES opMode - TIMER or COUNTER mode.* RETURNS: false if one of the parameters is erroneous true otherwise .*********************************************************************/bool cntTmrSetMode(CNTMR_NUM countNum, CNT_TMR_OP_MODES opMode){ unsigned int command = 1; unsigned int value; GT_REG_READ(TIMER_COUNTER_CONTROL, &value); if (countNum > LAST_CNTMR) return false; else { command = command << countNum * 2; value = value & command; if (value != 0) { /* ==> The counter/timer is enabled */ return false; /* can't set the Mode when counter/timer is enabled */ } else { command = command << 1; switch (opMode) { case TIMER: value = value | command; /* The Timer/Counter bit set to logic '1' */ break; case COUNTER: value = value & ~command; /*The Timer/Counter bit set to logic '0' */ break; default: return false; } GT_REG_WRITE(TIMER_COUNTER_CONTROL, value); return true; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -