blob: 7361d508bf37a59a476b1291301021e29fb38c6b [file] [log] [blame]
/**
@verbatim
Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
ADDI-DATA GmbH
Dieselstrasse 3
D-77833 Ottersweier
Tel: +19(0)7223/9493-0
Fax: +49(0)7223/9493-92
http://www.addi-data.com
info@addi-data.com
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
You should also find the complete GPL in the COPYING file accompanying this source code.
@endverbatim
*/
/*
+-----------------------------------------------------------------------+
| (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
+-----------------------------------------------------------------------+
| Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
| Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
+-----------------------------------------------------------------------+
| Project : API APCI1710 | Compiler : gcc |
| Module name : TOR.C | Version : 2.96 |
+-------------------------------+---------------------------------------+
| Project manager: Eric Stolz | Date : 02/12/2002 |
+-----------------------------------------------------------------------+
| Description : APCI-1710 tor counter module |
| |
| |
+-----------------------------------------------------------------------+
| UPDATES |
+-----------------------------------------------------------------------+
| Date | Author | Description of updates |
+----------+-----------+------------------------------------------------+
| 27/01/99 | S. Weber | 40 MHz implementation |
+-----------------------------------------------------------------------+
| 28/04/00 | S. Weber | Simple,double and quadruple mode implementation|
| | | Extern clock implementation |
+-----------------------------------------------------------------------+
| 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
| | | available |
+-----------------------------------------------------------------------+
*/
/*
+----------------------------------------------------------------------------+
| Included files |
+----------------------------------------------------------------------------+
*/
#include "APCI1710_Tor.h"
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_InitTorCounter |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_TorCounter, |
| unsigned char_ b_PCIInputClock, |
| unsigned char_ b_TimingUnit, |
| ULONG_ ul_TimingInterval, |
| PULONG_ pul_RealTimingInterval) |
+----------------------------------------------------------------------------+
| Task : Configure the selected tor counter (b_TorCounter) |
| from selected module (b_ModulNbr). |
| The ul_TimingInterval and ul_TimingUnit determine the |
| timing base for the measurement. |
| The pul_RealTimingInterval return the real timing |
| value. You must calling this function be for you call |
| any other function witch access of the tor counter. |
| |
+----------------------------------------------------------------------------+
| Input Parameters : |
|
CR_AREF unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| data[0] unsigned char_ b_TorCounter : Tor counter selection |
| (0 or 1). |
| data[1] unsigned char_ b_PCIInputClock : Selection from PCI bus clock|
| - APCI1710_30MHZ : |
| The PC have a PCI bus |
| clock from 30 MHz |
| - APCI1710_33MHZ : |
| The PC have a PCI bus |
| clock from 33 MHz |
| - APCI1710_40MHZ |
| The APCI-1710 have a |
| integrated 40Mhz |
| quartz. |
| - APCI1710_GATE_INPUT |
| Used the gate input for |
| the base clock. If you |
| have selected this option,|
| than it is not possibl to |
| used the gate input for |
| enabled the acquisition |
| data[2] unsigned char_ b_TimingUnit : Base timing unit (0 to 4) |
| 0 : ns |
| 1 : µs |
| 2 : ms |
| 3 : s |
| 4 : mn |
| data[3] ULONG_ ul_TimingInterval : Base timing value. |
+----------------------------------------------------------------------------+
| Output Parameters : PULONG_ pul_RealTimingInterval : Real base timing |
| data[0] value. |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: Module selection wrong |
| -3: The module is not a tor counter module |
| -4: Tor counter selection is wrong |
| -5: The selected PCI input clock is wrong |
| -6: Timing unit selection is wrong |
| -7: Base timing selection is wrong |
| -8: You can not used the 40MHz clock selection wich |
| this board |
| -9: You can not used the 40MHz clock selection wich |
| this TOR version |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnConfigInitTorCounter(struct comedi_device *dev,
struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
int i_ReturnValue = 0;
unsigned int ul_TimerValue = 0;
unsigned int dw_Command;
double d_RealTimingInterval = 0;
unsigned char b_ModulNbr;
unsigned char b_TorCounter;
unsigned char b_PCIInputClock;
unsigned char b_TimingUnit;
unsigned int ul_TimingInterval;
unsigned int ul_RealTimingInterval = 0;
i_ReturnValue = insn->n;
b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
b_TorCounter = (unsigned char) data[0];
b_PCIInputClock = (unsigned char) data[1];
b_TimingUnit = (unsigned char) data[2];
ul_TimingInterval = (unsigned int) data[3];
printk("INPUT clock %d\n", b_PCIInputClock);
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/***********************/
/* Test if tor counter */
/***********************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
/**********************************/
/* Test the tor counter selection */
/**********************************/
if (b_TorCounter <= 1) {
/**************************/
/* Test the PCI bus clock */
/**************************/
if ((b_PCIInputClock == APCI1710_30MHZ) ||
(b_PCIInputClock == APCI1710_33MHZ) ||
(b_PCIInputClock == APCI1710_40MHZ) ||
(b_PCIInputClock ==
APCI1710_GATE_INPUT)) {
/************************/
/* Test the timing unit */
/************************/
if ((b_TimingUnit <= 4)
|| (b_PCIInputClock ==
APCI1710_GATE_INPUT)) {
/**********************************/
/* Test the base timing selection */
/**********************************/
if (((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 133) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230650UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 9UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 121) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691043UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 520UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 8UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 100) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496729UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 7UL)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && (ul_TimingInterval >= 2))) {
/**************************/
/* Test the board version */
/**************************/
if (((b_PCIInputClock == APCI1710_40MHZ) && (devpriv->s_BoardInfos.b_BoardVersion > 0)) || (b_PCIInputClock != APCI1710_40MHZ)) {
/************************/
/* Test the TOR version */
/************************/
if (((b_PCIInputClock == APCI1710_40MHZ) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3132)) || (b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) {
/*********************************/
/* Test if not extern clock used */
/*********************************/
if (b_PCIInputClock != APCI1710_GATE_INPUT) {
fpu_begin
();
/****************************************/
/* Calculate the timer 0 division fator */
/****************************************/
switch (b_TimingUnit) {
/******/
/* ns */
/******/
case 0:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
(unsigned int)
(ul_TimingInterval
*
(0.00025 * b_PCIInputClock));
/*******************/
/* Round the value */
/*******************/
if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
ul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(0.00025 * (double)b_PCIInputClock));
d_RealTimingInterval
=
(double)
ul_TimerValue
/
(0.00025
*
(double)
b_PCIInputClock);
if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
ul_RealTimingInterval
=
ul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
if (b_PCIInputClock != APCI1710_40MHZ) {
ul_TimerValue
=
(unsigned int)
(
(double)
(ul_TimerValue)
*
1.007752288);
}
break;
/******/
/* æs */
/******/
case 1:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
(unsigned int)
(ul_TimingInterval
*
(0.25 * b_PCIInputClock));
/*******************/
/* Round the value */
/*******************/
if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
ul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(0.25 * (double)b_PCIInputClock));
d_RealTimingInterval
=
(double)
ul_TimerValue
/
(
(double)
0.25
*
(double)
b_PCIInputClock);
if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
ul_RealTimingInterval
=
ul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
if (b_PCIInputClock != APCI1710_40MHZ) {
ul_TimerValue
=
(unsigned int)
(
(double)
(ul_TimerValue)
*
1.007752288);
}
break;
/******/
/* ms */
/******/
case 2:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
ul_TimingInterval
*
(250.0
*
b_PCIInputClock);
/*******************/
/* Round the value */
/*******************/
if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
ul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(250.0 * (double)b_PCIInputClock));
d_RealTimingInterval
=
(double)
ul_TimerValue
/
(250.0
*
(double)
b_PCIInputClock);
if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
ul_RealTimingInterval
=
ul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
if (b_PCIInputClock != APCI1710_40MHZ) {
ul_TimerValue
=
(unsigned int)
(
(double)
(ul_TimerValue)
*
1.007752288);
}
break;
/*****/
/* s */
/*****/
case 3:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
(unsigned int)
(ul_TimingInterval
*
(250000.0
*
b_PCIInputClock));
/*******************/
/* Round the value */
/*******************/
if ((double)((double)ul_TimingInterval * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
ul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(250000.0
*
(double)
b_PCIInputClock));
d_RealTimingInterval
=
(double)
ul_TimerValue
/
(250000.0
*
(double)
b_PCIInputClock);
if ((double)((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
ul_RealTimingInterval
=
ul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
if (b_PCIInputClock != APCI1710_40MHZ) {
ul_TimerValue
=
(unsigned int)
(
(double)
(ul_TimerValue)
*
1.007752288);
}
break;
/******/
/* mn */
/******/
case 4:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
(unsigned int)
(
(ul_TimingInterval
*
60)
*
(250000.0
*
b_PCIInputClock));
/*******************/
/* Round the value */
/*******************/
if ((double)((double)(ul_TimingInterval * 60.0) * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
ul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(250000.0
*
(double)
b_PCIInputClock))
/
60;
d_RealTimingInterval
=
(
(double)
ul_TimerValue
/
(250000.0
*
(double)
b_PCIInputClock))
/
60.0;
if ((double)(((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) / 60.0) >= (double)((double)ul_RealTimingInterval + 0.5)) {
ul_RealTimingInterval
=
ul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
if (b_PCIInputClock != APCI1710_40MHZ) {
ul_TimerValue
=
(unsigned int)
(
(double)
(ul_TimerValue)
*
1.007752288);
}
break;
}
fpu_end();
} /* if (b_PCIInputClock != APCI1710_GATE_INPUT) */
else {
/*************************************************************/
/* 2 Clock used for the overflow and the reload from counter */
/*************************************************************/
ul_TimerValue
=
ul_TimingInterval
-
2;
} /* if (b_PCIInputClock != APCI1710_GATE_INPUT) */
/****************************/
/* Save the PCI input clock */
/****************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_TorCounterModuleInfo.
b_PCIInputClock
=
b_PCIInputClock;
/************************/
/* Save the timing unit */
/************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo
[b_TorCounter].
b_TimingUnit
=
b_TimingUnit;
/************************/
/* Save the base timing */
/************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo
[b_TorCounter].
d_TimingInterval
=
d_RealTimingInterval;
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo
[b_TorCounter].
ul_RealTimingInterval
=
ul_RealTimingInterval;
/*******************/
/* Get the command */
/*******************/
dw_Command
=
inl
(devpriv->
s_BoardInfos.
ui_Address
+
4
+
(16 * b_TorCounter) + (64 * b_ModulNbr));
dw_Command
=
(dw_Command
>>
4)
&
0xF;
/******************/
/* Test if 40 MHz */
/******************/
if (b_PCIInputClock == APCI1710_40MHZ) {
/****************************/
/* Set the 40 MHz selection */
/****************************/
dw_Command
=
dw_Command
|
0x10;
}
/*****************************/
/* Test if extern clock used */
/*****************************/
if (b_PCIInputClock == APCI1710_GATE_INPUT) {
/****************************/
/* Set the 40 MHz selection */
/****************************/
dw_Command
=
dw_Command
|
0x20;
}
/*************************/
/* Write the new command */
/*************************/
outl(dw_Command, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr));
/*******************/
/* Disable the tor */
/*******************/
outl(0, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr));
/*************************/
/* Set the timer 1 value */
/*************************/
outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 0 + (16 * b_TorCounter) + (64 * b_ModulNbr));
/*********************/
/* Tor counter init. */
/*********************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo
[b_TorCounter].
b_TorCounterInit
=
1;
} else {
/***********************************************/
/* TOR version error for 40MHz clock selection */
/***********************************************/
DPRINTK("TOR version error for 40MHz clock selection\n");
i_ReturnValue
=
-9;
}
} else {
/**************************************************************/
/* You can not used the 40MHz clock selection wich this board */
/**************************************************************/
DPRINTK("You can not used the 40MHz clock selection wich this board\n");
i_ReturnValue =
-8;
}
} else {
/**********************************/
/* Base timing selection is wrong */
/**********************************/
DPRINTK("Base timing selection is wrong\n");
i_ReturnValue = -7;
}
} /* if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) */
else {
/**********************************/
/* Timing unit selection is wrong */
/**********************************/
DPRINTK("Timing unit selection is wrong\n");
i_ReturnValue = -6;
} /* if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) */
} /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) */
else {
/*****************************************/
/* The selected PCI input clock is wrong */
/*****************************************/
DPRINTK("The selected PCI input clock is wrong\n");
i_ReturnValue = -5;
} /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) */
} /* if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) */
else {
/**********************************/
/* Tor Counter selection is wrong */
/**********************************/
DPRINTK("Tor Counter selection is wrong\n");
i_ReturnValue = -4;
} /* if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) */
} else {
/******************************************/
/* The module is not a tor counter module */
/******************************************/
DPRINTK("The module is not a tor counter module\n");
i_ReturnValue = -3;
}
} else {
/***********************/
/* Module number error */
/***********************/
DPRINTK("Module number error\n");
i_ReturnValue = -2;
}
data[0] = (unsigned int) ul_RealTimingInterval;
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_EnableTorCounter |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_TorCounter, |
| unsigned char_ b_InputMode, |
| unsigned char_ b_ExternGate, |
| unsigned char_ b_CycleMode, |
| unsigned char_ b_InterruptEnable) |
+----------------------------------------------------------------------------+
| Task : Enable the tor counter (b_TorCounter) from selected |
| module (b_ModulNbr). You must calling the |
| "i_APCI1710_InitTorCounter" function be for you call |
| this function. |
| If you enable the tor counter interrupt, the |
| tor counter generate a interrupt after the timing cycle|
| See function "i_APCI1710_SetBoardIntRoutineX" and the |
| Interrupt mask description chapter from this manual. |
| The b_CycleMode parameter determine if you will |
| measured a single or more cycle. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Selected module number (0 to 3) |
| unsigned char_ b_TorCounter : Tor counter selection (0 or 1). |
| unsigned char_ b_InputMode : Input signal level selection |
| 0 : Tor count each low level |
| 1 : Tor count each high level|
| unsigned char_ b_ExternGate : Extern gate action selection |
| 0 : Extern gate signal not |
| used |
| 1 : Extern gate signal used. |
| If you selected the |
| single mode, each high |
| level signal start the |
| counter. |
| If you selected the |
| continuous mode, the |
| first high level signal |
| start the tor counter |
| |
| APCI1710_TOR_QUADRUPLE _MODE : |
| In the quadruple mode, the edge|
| analysis circuit generates a |
| counting pulse from each edge |
| of 2 signals which are phase |
| shifted in relation to each |
| other. |
| The gate input is used for the |
| signal B |
| |
| APCI1710_TOR_DOUBLE_MODE: |
| Functions in the same way as |
| the quadruple mode, except that|
| only two of the four edges are |
| analysed per period. |
| The gate input is used for the |
| signal B |
| |
| APCI1710_TOR_SIMPLE_MODE: |
| Functions in the same way as |
| the quadruple mode, except that|
| only one of the four edges is |
| analysed per period. |
| The gate input is used for the |
| signal B |
| |
| unsigned char_ b_CycleMode : Selected the tor counter |
| acquisition mode |
| unsigned char_ b_InterruptEnable : Enable or disable the |
| tor counter interrupt. |
| APCI1710_ENABLE: |
| Enable the tor counter |
| interrupt |
| APCI1710_DISABLE: |
| Disable the tor counter |
| interrupt |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: Module selection wrong |
| -3: The module is not a tor counter module |
| -4: Tor counter selection is wrong |
| -5: Tor counter not initialised see function |
| "i_APCI1710_InitTorCounter" |
| -6: Tor input signal selection is wrong |
| -7: Extern gate signal mode is wrong |
| -8: Tor counter acquisition mode cycle is wrong |
| -9: Interrupt parameter is wrong |
| -10:Interrupt function not initialised. |
| See function "i_APCI1710_SetBoardIntRoutineX" |
+----------------------------------------------------------------------------+
*/
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_DisableTorCounter |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_TorCounter) |
+----------------------------------------------------------------------------+
| Task : Disable the tor counter (b_TorCounter) from selected |
| module (b_ModulNbr). If you disable the tor counter |
| after a start cycle occur and you restart the tor |
| counter witch the " i_APCI1710_EnableTorCounter" |
| function, the status register is cleared |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Selected module number (0 to 3) |
| unsigned char_ b_TorCounter : Tor counter selection (0 or 1). |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: Module selection wrong |
| -3: The module is not a tor counter module |
| -4: Tor counter selection is wrong |
| -5: Tor counter not initialised see function |
| "i_APCI1710_InitTorCounter" |
| -6: Tor counter not enabled see function |
| "i_APCI1710_EnableTorCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnWriteEnableDisableTorCounter(struct comedi_device *dev,
struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
int i_ReturnValue = 0;
unsigned int dw_Status;
unsigned int dw_DummyRead;
unsigned int dw_ConfigReg;
unsigned char b_ModulNbr, b_Action;
unsigned char b_TorCounter;
unsigned char b_InputMode;
unsigned char b_ExternGate;
unsigned char b_CycleMode;
unsigned char b_InterruptEnable;
b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
b_Action = (unsigned char) data[0]; /* enable or disable */
b_TorCounter = (unsigned char) data[1];
b_InputMode = (unsigned char) data[2];
b_ExternGate = (unsigned char) data[3];
b_CycleMode = (unsigned char) data[4];
b_InterruptEnable = (unsigned char) data[5];
i_ReturnValue = insn->n;;
devpriv->tsk_Current = current; /* Save the current process task structure */
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/***********************/
/* Test if tor counter */
/***********************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
/**********************************/
/* Test the tor counter selection */
/**********************************/
if (b_TorCounter <= 1) {
switch (b_Action) /* Enable or Disable */
{
case APCI1710_ENABLE:
/***********************************/
/* Test if tor counter initialised */
/***********************************/
dw_Status =
inl(devpriv->s_BoardInfos.
ui_Address + 8 +
(16 * b_TorCounter) +
(64 * b_ModulNbr));
if (dw_Status & 0x10) {
/******************************/
/* Test the input signal mode */
/******************************/
if (b_InputMode == 0 ||
b_InputMode == 1 ||
b_InputMode ==
APCI1710_TOR_SIMPLE_MODE
|| b_InputMode ==
APCI1710_TOR_DOUBLE_MODE
|| b_InputMode ==
APCI1710_TOR_QUADRUPLE_MODE)
{
/************************************/
/* Test the extern gate signal mode */
/************************************/
if (b_ExternGate == 0
|| b_ExternGate
== 1
|| b_InputMode >
1) {
/*********************************/
/* Test the cycle mode parameter */
/*********************************/
if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) {
/***************************/
/* Test the interrupt flag */
/***************************/
if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) {
/***************************/
/* Save the interrupt mode */
/***************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo
[b_TorCounter].
b_InterruptEnable
=
b_InterruptEnable;
/*******************/
/* Get the command */
/*******************/
dw_ConfigReg
=
inl
(devpriv->
s_BoardInfos.
ui_Address
+
4
+
(16 * b_TorCounter) + (64 * b_ModulNbr));
dw_ConfigReg
=
(dw_ConfigReg
>>
4)
&
0x30;
/********************************/
/* Test if not direct mode used */
/********************************/
if (b_InputMode > 1) {
/*******************************/
/* Extern gate can not be used */
/*******************************/
b_ExternGate
=
0;
/*******************************************/
/* Enable the extern gate for the Signal B */
/*******************************************/
dw_ConfigReg
=
dw_ConfigReg
|
0x40;
/***********************/
/* Test if simple mode */
/***********************/
if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) {
/**************************/
/* Enable the sinple mode */
/**************************/
dw_ConfigReg
=
dw_ConfigReg
|
0x780;
} /* if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) */
/***********************/
/* Test if double mode */
/***********************/
if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) {
/**************************/
/* Enable the double mode */
/**************************/
dw_ConfigReg
=
dw_ConfigReg
|
0x180;
} /* if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) */
b_InputMode
=
0;
} /* if (b_InputMode > 1) */
/*******************/
/* Set the command */
/*******************/
dw_ConfigReg
=
dw_ConfigReg
|
b_CycleMode
|
(b_InterruptEnable
*
2)
|
(b_InputMode
*
4)
|
(b_ExternGate
*
8);
/*****************************/
/* Clear the status register */
/*****************************/
dw_DummyRead
=
inl
(devpriv->
s_BoardInfos.
ui_Address
+
0
+
(16 * b_TorCounter) + (64 * b_ModulNbr));
/***************************************/
/* Clear the interrupt status register */
/***************************************/
dw_DummyRead
=
inl
(devpriv->
s_BoardInfos.
ui_Address
+
12
+
(16 * b_TorCounter) + (64 * b_ModulNbr));
/********************/
/* Set the commando */
/********************/
outl(dw_ConfigReg, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr));
/****************/
/* Set the gate */
/****************/
outl(1, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr));
} /* if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) */
else {
/********************************/
/* Interrupt parameter is wrong */
/********************************/
DPRINTK("Interrupt parameter is wrong\n");
i_ReturnValue
=
-9;
} /* if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) */
} /* if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) */
else {
/***********************************************/
/* Tor counter acquisition mode cycle is wrong */
/***********************************************/
DPRINTK("Tor counter acquisition mode cycle is wrong\n");
i_ReturnValue
=
-8;
} /* if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) */
} /* if (b_ExternGate >= 0 && b_ExternGate <= 1) */
else {
/***********************************/
/* Extern gate input mode is wrong */
/***********************************/
DPRINTK("Extern gate input mode is wrong\n");
i_ReturnValue =
-7;
} /* if (b_ExternGate >= 0 && b_ExternGate <= 1) */
} /* if (b_InputMode >= 0 && b_InputMode <= 1) */
else {
/***************************************/
/* Tor input signal selection is wrong */
/***************************************/
DPRINTK("Tor input signal selection is wrong\n");
i_ReturnValue = -6;
}
} else {
/*******************************/
/* Tor counter not initialised */
/*******************************/
DPRINTK("Tor counter not initialised\n");
i_ReturnValue = -5;
}
break;
case APCI1710_DISABLE:
/***********************************/
/* Test if tor counter initialised */
/***********************************/
dw_Status = inl(devpriv->s_BoardInfos.
ui_Address + 8 +
(16 * b_TorCounter) +
(64 * b_ModulNbr));
/*******************************/
/* Test if counter initialised */
/*******************************/
if (dw_Status & 0x10) {
/***************************/
/* Test if counter enabled */
/***************************/
if (dw_Status & 0x1) {
/****************************/
/* Clear the interrupt mode */
/****************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo
[b_TorCounter].
b_InterruptEnable
=
APCI1710_DISABLE;
/******************/
/* Clear the gate */
/******************/
outl(0, devpriv->
s_BoardInfos.
ui_Address + 8 +
(16 * b_TorCounter) + (64 * b_ModulNbr));
} /* if (dw_Status & 0x1) */
else {
/***************************/
/* Tor counter not enabled */
/***************************/
DPRINTK("Tor counter not enabled \n");
i_ReturnValue = -6;
} /* if (dw_Status & 0x1) */
} /* if (dw_Status & 0x10) */
else {
/*******************************/
/* Tor counter not initialised */
/*******************************/
DPRINTK("Tor counter not initialised\n");
i_ReturnValue = -5;
} /* // if (dw_Status & 0x10) */
} /* switch */
} /* if (b_TorCounter <= 1) */
else {
/**********************************/
/* Tor counter selection is wrong */
/**********************************/
DPRINTK("Tor counter selection is wrong\n");
i_ReturnValue = -4;
} /* if (b_TorCounter <= 1) */
} else {
/******************************************/
/* The module is not a tor counter module */
/******************************************/
DPRINTK("The module is not a tor counter module \n");
i_ReturnValue = -3;
}
} else {
/***********************/
/* Module number error */
/***********************/
DPRINTK("Module number error \n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_GetTorCounterInitialisation |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_TorCounter, |
| unsigned char *_ pb_TimingUnit, |
| PULONG_ pul_TimingInterval, |
| unsigned char *_ pb_InputMode, |
| unsigned char *_ pb_ExternGate, |
| unsigned char *_ pb_CycleMode, |
| unsigned char *_ pb_Enable, |
| unsigned char *_ pb_InterruptEnable)|
+----------------------------------------------------------------------------+
| Task : Enable the tor counter (b_TorCounter) from selected |
| module (b_ModulNbr). You must calling the |
| "i_APCI1710_InitTorCounter" function be for you call |
| this function. |
| If you enable the tor counter interrupt, the |
| tor counter generate a interrupt after the timing cycle|
| See function "i_APCI1710_SetBoardIntRoutineX" and the |
| Interrupt mask description chapter from this manual. |
| The b_CycleMode parameter determine if you will |
| measured a single or more cycle. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Selected module number (0 to 3) |
| unsigned char_ b_TorCounter : Tor counter selection (0 or 1)
b_ModulNbr = CR_AREF(insn->chanspec);
b_TorCounter = CR_CHAN(insn->chanspec);
. |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_TimingUnit : Base timing unit (0 to 4) |
| 0 : ns |
| 1 : µs |
| 2 : ms |
| 3 : s |
| 4 : mn |
| PULONG_ pul_TimingInterval : Base timing value. |
| unsigned char *_ pb_InputMode : Input signal level |
| selection |
| 0 : Tor count each low level |
| 1 : Tor count each high level|
| unsigned char *_ pb_ExternGate : Extern gate action |
| selection |
| 0 : Extern gate signal not |
| used |
| 1 : Extern gate signal used|
| unsigned char *_ pb_CycleMode : Tor counter acquisition |
| mode |
| unsigned char *_ pb_Enable : Indicate if the tor counter|
| is enabled or no |
| 0 : Tor counter disabled |
| 1 : Tor counter enabled |
| unsigned char *_ pb_InterruptEnable : Enable or disable the |
| tor counter interrupt. |
| APCI1710_ENABLE: |
| Enable the tor counter |
| interrupt |
| APCI1710_DISABLE: |
| Disable the tor counter |
| interrupt
pb_TimingUnit = (unsigned char *) &data[0];
pul_TimingInterval = (unsigned int *) &data[1];
pb_InputMode = (unsigned char *) &data[2];
pb_ExternGate = (unsigned char *) &data[3];
pb_CycleMode = (unsigned char *) &data[4];
pb_Enable = (unsigned char *) &data[5];
pb_InterruptEnable = (unsigned char *) &data[6];
|
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: Module selection wrong |
| -3: The module is not a tor counter module |
| -4: Tor counter selection is wrong |
| -5: Tor counter not initialised see function |
| "i_APCI1710_InitTorCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnReadGetTorCounterInitialisation(struct comedi_device *dev,
struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
int i_ReturnValue = 0;
unsigned int dw_Status;
unsigned char b_ModulNbr;
unsigned char b_TorCounter;
unsigned char *pb_TimingUnit;
unsigned int *pul_TimingInterval;
unsigned char *pb_InputMode;
unsigned char *pb_ExternGate;
unsigned char *pb_CycleMode;
unsigned char *pb_Enable;
unsigned char *pb_InterruptEnable;
i_ReturnValue = insn->n;
b_ModulNbr = CR_AREF(insn->chanspec);
b_TorCounter = CR_CHAN(insn->chanspec);
pb_TimingUnit = (unsigned char *) &data[0];
pul_TimingInterval = (unsigned int *) &data[1];
pb_InputMode = (unsigned char *) &data[2];
pb_ExternGate = (unsigned char *) &data[3];
pb_CycleMode = (unsigned char *) &data[4];
pb_Enable = (unsigned char *) &data[5];
pb_InterruptEnable = (unsigned char *) &data[6];
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/***********************/
/* Test if tor counter */
/***********************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
/**********************************/
/* Test the tor counter selection */
/**********************************/
if (b_TorCounter <= 1) {
/***********************************/
/* Test if tor counter initialised */
/***********************************/
dw_Status = inl(devpriv->s_BoardInfos.
ui_Address + 8 + (16 * b_TorCounter) +
(64 * b_ModulNbr));
if (dw_Status & 0x10) {
*pb_Enable = dw_Status & 1;
/********************/
/* Get the commando */
/********************/
dw_Status = inl(devpriv->s_BoardInfos.
ui_Address + 4 +
(16 * b_TorCounter) +
(64 * b_ModulNbr));
*pb_CycleMode =
(unsigned char) ((dw_Status >> 4) & 1);
*pb_InterruptEnable =
(unsigned char) ((dw_Status >> 5) & 1);
/******************************************************/
/* Test if extern gate used for clock or for signal B */
/******************************************************/
if (dw_Status & 0x600) {
/*****************************************/
/* Test if extern gate used for signal B */
/*****************************************/
if (dw_Status & 0x400) {
/***********************/
/* Test if simple mode */
/***********************/
if ((dw_Status & 0x7800)
== 0x7800) {
*pb_InputMode =
APCI1710_TOR_SIMPLE_MODE;
}
/***********************/
/* Test if double mode */
/***********************/
if ((dw_Status & 0x7800)
== 0x1800) {
*pb_InputMode =
APCI1710_TOR_DOUBLE_MODE;
}
/**************************/
/* Test if quadruple mode */
/**************************/
if ((dw_Status & 0x7800)
== 0x0000) {
*pb_InputMode =
APCI1710_TOR_QUADRUPLE_MODE;
}
} /* if (dw_Status & 0x400) */
else {
*pb_InputMode = 1;
} /* // if (dw_Status & 0x400) */
/************************/
/* Extern gate not used */
/************************/
*pb_ExternGate = 0;
} /* if (dw_Status & 0x600) */
else {
*pb_InputMode =
(unsigned char) ((dw_Status >> 6)
& 1);
*pb_ExternGate =
(unsigned char) ((dw_Status >> 7)
& 1);
} /* if (dw_Status & 0x600) */
*pb_TimingUnit =
devpriv->
s_ModuleInfo[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo[b_TorCounter].
b_TimingUnit;
*pul_TimingInterval =
devpriv->
s_ModuleInfo[b_ModulNbr].
s_TorCounterModuleInfo.
s_TorCounterInfo[b_TorCounter].
ul_RealTimingInterval;
} else {
/*******************************/
/* Tor counter not initialised */
/*******************************/
DPRINTK("Tor counter not initialised\n");
i_ReturnValue = -5;
}
} /* if (b_TorCounter <= 1) */
else {
/**********************************/
/* Tor counter selection is wrong */
/**********************************/
DPRINTK("Tor counter selection is wrong \n");
i_ReturnValue = -4;
} /* if (b_TorCounter <= 1) */
} else {
/******************************************/
/* The module is not a tor counter module */
/******************************************/
DPRINTK("The module is not a tor counter module\n");
i_ReturnValue = -3;
}
} else {
/***********************/
/* Module number error */
/***********************/
DPRINTK("Module number error\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_ReadTorCounterValue |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_TorCounter, |
| unsigned int_ ui_TimeOut, |
| unsigned char *_ pb_TorCounterStatus, |
| PULONG_ pul_TorCounterValue) |
+----------------------------------------------------------------------------+
| Task case APCI1710_TOR_GETPROGRESSSTATUS: Return the tor counter
(b_TorCounter) status (pb_TorCounterStatus) from selected tor counter |
| module (b_ModulNbr).
case APCI1710_TOR_GETCOUNTERVALUE :
Return the tor counter (b_TorCounter) status |
| (pb_TorCounterStatus) and the timing value |
| (pul_TorCounterValue) after a conting cycle stop |
| from selected tor counter module (b_ModulNbr). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Selected module number (0 to 3) |
| unsigned char_ b_TorCounter : Tor counter selection (0 or 1).
b_ModulNbr = CR_AREF(insn->chanspec);
b_ReadType = (unsigned char) data[0];
b_TorCounter = (unsigned char) data[1];
ui_TimeOut = (unsigned int) data[2]; |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_TorCounterStatus : Return the tor counter |
| status. |
| 0 : Conting cycle not started|
| Software gate not set. |
| 1 : Conting cycle started. |
| Software gate set. |
| 2 : Conting cycle stopped. |
| The conting cycle is |
| terminate. |
| 3 : A overflow occur. You |
| must change the base |
| timing witch the |
| function |
| "i_APCI1710_InitTorCounter"|
| 4 : Timeeout occur |
| unsigned int * pul_TorCounterValue : Tor counter value.
pb_TorCounterStatus=(unsigned char *) &data[0];
pul_TorCounterValue=(unsigned int *) &data[1]; |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: Module selection wrong |
| -3: The module is not a tor counter module |
| -4: Tor counter selection is wrong |
| -5: Tor counter not initialised see function |
| "i_APCI1710_InitTorCounter" |
| -6: Tor counter not enabled see function |
| "i_APCI1710_EnableTorCounter" |
| -7: Timeout parameter is wrong (0 to 65535) |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue(struct comedi_device *dev,
struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
{
int i_ReturnValue = 0;
unsigned int dw_Status;
unsigned int dw_TimeOut = 0;
unsigned char b_ModulNbr;
unsigned char b_TorCounter;
unsigned char b_ReadType;
unsigned int ui_TimeOut;
unsigned char *pb_TorCounterStatus;
unsigned int *pul_TorCounterValue;
i_ReturnValue = insn->n;
b_ModulNbr = CR_AREF(insn->chanspec);
b_ReadType = (unsigned char) data[0];
b_TorCounter = (unsigned char) data[1];
ui_TimeOut = (unsigned int) data[2];
pb_TorCounterStatus = (unsigned char *) &data[0];
pul_TorCounterValue = (unsigned int *) &data[1];
/**************************/
/* Test the module number */
/**************************/
if (b_ReadType == APCI1710_TOR_READINTERRUPT) {
data[0] = devpriv->s_InterruptParameters.
s_FIFOInterruptParameters[devpriv->
s_InterruptParameters.ui_Read].b_OldModuleMask;
data[1] = devpriv->s_InterruptParameters.
s_FIFOInterruptParameters[devpriv->
s_InterruptParameters.ui_Read].ul_OldInterruptMask;
data[2] = devpriv->s_InterruptParameters.
s_FIFOInterruptParameters[devpriv->
s_InterruptParameters.ui_Read].ul_OldCounterLatchValue;
/**************************/
/* Increment the read FIFO */
/***************************/
devpriv->
s_InterruptParameters.
ui_Read = (devpriv->
s_InterruptParameters.
ui_Read + 1) % APCI1710_SAVE_INTERRUPT;
return insn->n;
}
if (b_ModulNbr < 4) {
/***********************/
/* Test if tor counter */
/***********************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
/**********************************/
/* Test the tor counter selection */
/**********************************/
if (b_TorCounter <= 1) {
/***********************************/
/* Test if tor counter initialised */
/***********************************/
dw_Status = inl(devpriv->s_BoardInfos.
ui_Address + 8 + (16 * b_TorCounter) +
(64 * b_ModulNbr));
/*******************************/
/* Test if counter initialised */
/*******************************/
if (dw_Status & 0x10) {
/***************************/
/* Test if counter enabled */
/***************************/
if (dw_Status & 0x1) {
switch (b_ReadType) {
case APCI1710_TOR_GETPROGRESSSTATUS:
/*******************/
/* Read the status */
/*******************/
dw_Status =
inl(devpriv->
s_BoardInfos.
ui_Address + 4 +
(16 * b_TorCounter) + (64 * b_ModulNbr));
dw_Status =
dw_Status & 0xF;
/*****************/
/* Test if start */
/*****************/
if (dw_Status & 1) {
if (dw_Status &
2) {
if (dw_Status & 4) {
/************************/
/* Tor counter overflow */
/************************/
*pb_TorCounterStatus
=
3;
} else {
/***********************/
/* Tor counter started */
/***********************/
*pb_TorCounterStatus
=
2;
}
} else {
/***********************/
/* Tor counter started */
/***********************/
*pb_TorCounterStatus
=
1;
}
} else {
/***************************/
/* Tor counter not started */
/***************************/
*pb_TorCounterStatus
= 0;
}
break;
case APCI1710_TOR_GETCOUNTERVALUE:
/*****************************/
/* Test the timout parameter */
/*****************************/
if ((ui_TimeOut >= 0)
&& (ui_TimeOut
<=
65535UL))
{
for (;;) {
/*******************/
/* Read the status */
/*******************/
dw_Status
=
inl
(devpriv->
s_BoardInfos.
ui_Address
+
4
+
(16 * b_TorCounter) + (64 * b_ModulNbr));
/********************/
/* Test if overflow */
/********************/
if ((dw_Status & 4) == 4) {
/******************/
/* Overflow occur */
/******************/
*pb_TorCounterStatus
=
3;
/******************/
/* Read the value */
/******************/
*pul_TorCounterValue
=
inl
(devpriv->
s_BoardInfos.
ui_Address
+
0
+
(16 * b_TorCounter) + (64 * b_ModulNbr));
break;
} /* if ((dw_Status & 4) == 4) */
else {
/*******************************/
/* Test if measurement stopped */
/*******************************/
if ((dw_Status & 2) == 2) {
/***********************/
/* A stop signal occur */
/***********************/
*pb_TorCounterStatus
=
2;
/******************/
/* Read the value */
/******************/
*pul_TorCounterValue
=
inl
(devpriv->
s_BoardInfos.
ui_Address
+
0
+
(16 * b_TorCounter) + (64 * b_ModulNbr));
break;
} /* if ((dw_Status & 2) == 2) */
else {
/*******************************/
/* Test if measurement started */
/*******************************/
if ((dw_Status & 1) == 1) {
/************************/
/* A start signal occur */
/************************/
*pb_TorCounterStatus
=
1;
} /* if ((dw_Status & 1) == 1) */
else {
/***************************/
/* Measurement not started */
/***************************/
*pb_TorCounterStatus
=
0;
} /* if ((dw_Status & 1) == 1) */
} /* if ((dw_Status & 2) == 2) */
} /* if ((dw_Status & 8) == 8) */
if (dw_TimeOut == ui_TimeOut) {
/*****************/
/* Timeout occur */
/*****************/
break;
} else {
/*************************/
/* Increment the timeout */
/*************************/
dw_TimeOut
=
dw_TimeOut
+
1;
mdelay(1000);
}
} /* for (;;) */
/*************************/
/* Test if timeout occur */
/*************************/
if ((*pb_TorCounterStatus != 3) && (dw_TimeOut == ui_TimeOut) && (ui_TimeOut != 0)) {
/*****************/
/* Timeout occur */
/*****************/
*pb_TorCounterStatus
=
4;
}
} else {
/******************************/
/* Timeout parameter is wrong */
/******************************/
DPRINTK("Timeout parameter is wrong\n");
i_ReturnValue =
-7;
}
break;
default:
printk("Inputs wrong\n");
} /* switch end */
} /* if (dw_Status & 0x1) */
else {
/***************************/
/* Tor counter not enabled */
/***************************/
DPRINTK("Tor counter not enabled\n");
i_ReturnValue = -6;
} /* if (dw_Status & 0x1) */
} else {
/*******************************/
/* Tor counter not initialised */
/*******************************/
DPRINTK("Tor counter not initialised\n");
i_ReturnValue = -5;
}
} /* if (b_TorCounter <= 1) */
else {
/**********************************/
/* Tor counter selection is wrong */
/**********************************/
DPRINTK("Tor counter selection is wrong\n");
i_ReturnValue = -4;
} /* if (b_TorCounter <= 1) */
} else {
/******************************************/
/* The module is not a tor counter module */
/******************************************/
DPRINTK("The module is not a tor counter module\n");
i_ReturnValue = -3;
}
} else {
/***********************/
/* Module number error */
/***********************/
DPRINTK("Module number error\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}