patch-2.4.19 linux-2.4.19/arch/mips/galileo-boards/ev64120/cntmr.c
Next file: linux-2.4.19/arch/mips/galileo-boards/ev64120/compressed/Makefile
Previous file: linux-2.4.19/arch/mips/galileo-boards/ev64120/Makefile
Back to the patch index
Back to the overall index
- Lines: 208
- Date:
Fri Aug 2 17:39:43 2002
- Orig file:
linux-2.4.18/arch/mips/galileo-boards/ev64120/cntmr.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -urN linux-2.4.18/arch/mips/galileo-boards/ev64120/cntmr.c linux-2.4.19/arch/mips/galileo-boards/ev64120/cntmr.c
@@ -0,0 +1,207 @@
+/* cntmr.c - GT counters/timers functions */
+
+/* Copyright - Galileo technology. 9/3/2000 */
+
+/*
+DESCRIPTION
+This file contains function which serves the user with a complete interface
+to the GT internal counters and timers, please advise: each counter/timer unit
+can 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;
+ }
+ }
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)