]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/staging/comedi/drivers/addi-data/APCI1710_INCCPT.c
Merge branch 'omap-pool'
[linux-2.6-omap-h63xx.git] / drivers / staging / comedi / drivers / addi-data / APCI1710_INCCPT.c
diff --git a/drivers/staging/comedi/drivers/addi-data/APCI1710_INCCPT.c b/drivers/staging/comedi/drivers/addi-data/APCI1710_INCCPT.c
new file mode 100644 (file)
index 0000000..1062f2f
--- /dev/null
@@ -0,0 +1,5363 @@
+/**
+@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 shoud 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 : INC_CPT.C       | Version  : 2.96                       |
+  +-------------------------------+---------------------------------------+
+  | Project manager: Eric Stolz   | Date     :  02/12/2002                |
+  +-----------------------------------------------------------------------+
+  | Description :   APCI-1710 incremental counter module                  |
+  |                                                                       |
+  |                                                                       |
+  +-----------------------------------------------------------------------+
+  |                             UPDATES                                   |
+  +-----------------------------------------------------------------------+
+  |   Date   |   Author  |          Description of updates                |
+  +----------+-----------+------------------------------------------------+
+  |          |           |                                                |
+  |----------|-----------|------------------------------------------------|
+  | 08/05/00 | Guinot C  | - 0400/0228 All Function in RING 0             |
+  |          |           |   available                                    |
+  +-----------------------------------------------------------------------+
+  | 29/06/01 | Guinot C. | - 1100/0231 -> 0701/0232                       |
+  |          |           | See i_APCI1710_DisableFrequencyMeasurement     |
+  +-----------------------------------------------------------------------+
+*/
+
+/*
++----------------------------------------------------------------------------+
+|                               Included files                               |
++----------------------------------------------------------------------------+
+*/
+
+#include "APCI1710_INCCPT.h"
+
+/*
++----------------------------------------------------------------------------+
+| INT  i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
+struct comedi_insn *insn,unsigned int *data)
+
++----------------------------------------------------------------------------+
+| Task              : Configuration function for INC_CPT                             |
++----------------------------------------------------------------------------+
+| Input Parameters  :                                                                                                           |
++----------------------------------------------------------------------------+
+| Output Parameters : *data
++----------------------------------------------------------------------------+
+| Return Value      :                 |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_InsnConfigINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
+       struct comedi_insn * insn, unsigned int * data)
+{
+       UINT ui_ConfigType;
+       INT i_ReturnValue = 0;
+       ui_ConfigType = CR_CHAN(insn->chanspec);
+
+       printk("\nINC_CPT");
+
+       devpriv->tsk_Current = current; // Save the current process task structure
+       switch (ui_ConfigType) {
+       case APCI1710_INCCPT_INITCOUNTER:
+               i_ReturnValue = i_APCI1710_InitCounter(dev,
+                       CR_AREF(insn->chanspec),
+                       (BYTE) data[0],
+                       (BYTE) data[1],
+                       (BYTE) data[2], (BYTE) data[3], (BYTE) data[4]);
+               break;
+
+       case APCI1710_INCCPT_COUNTERAUTOTEST:
+               i_ReturnValue = i_APCI1710_CounterAutoTest(dev,
+                       (PBYTE) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_INITINDEX:
+               i_ReturnValue = i_APCI1710_InitIndex(dev,
+                       CR_AREF(insn->chanspec),
+                       (BYTE) data[0],
+                       (BYTE) data[1], (BYTE) data[2], (BYTE) data[3]);
+               break;
+
+       case APCI1710_INCCPT_INITREFERENCE:
+               i_ReturnValue = i_APCI1710_InitReference(dev,
+                       CR_AREF(insn->chanspec), (BYTE) data[0]);
+               break;
+
+       case APCI1710_INCCPT_INITEXTERNALSTROBE:
+               i_ReturnValue = i_APCI1710_InitExternalStrobe(dev,
+                       CR_AREF(insn->chanspec),
+                       (BYTE) data[0], (BYTE) data[1]);
+               break;
+
+       case APCI1710_INCCPT_INITCOMPARELOGIC:
+               i_ReturnValue = i_APCI1710_InitCompareLogic(dev,
+                       CR_AREF(insn->chanspec), (UINT) data[0]);
+               break;
+
+       case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT:
+               i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev,
+                       CR_AREF(insn->chanspec),
+                       (BYTE) data[0],
+                       (BYTE) data[1], (ULONG) data[2], (PULONG) & data[0]);
+               break;
+
+       default:
+               printk("Insn Config : Config Parameter Wrong\n");
+
+       }
+
+       if (i_ReturnValue >= 0)
+               i_ReturnValue = insn->n;
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_InitCounter                           |
+|                               (BYTE_          b_BoardHandle,               |
+|                                BYTE_          b_ModulNbr,                  |
+|                                BYTE_          b_CounterRange,              |
+|                                BYTE_          b_FirstCounterModus,         |
+|                                BYTE_          b_FirstCounterOption,        |
+|                                BYTE_          b_SecondCounterModus,        |
+|                                BYTE_          b_SecondCounterOption)       |
++----------------------------------------------------------------------------+
+| Task              : Configure the counter operating mode from selected     |
+|                     module (b_ModulNbr). You must calling this function be |
+|                     for you call any other function witch access of        |
+|                     counters.                                              |
+|                                                                            |
+|                          Counter range                                     |
+|                          -------------                                     |
+| +------------------------------------+-----------------------------------+ |
+| | Parameter       Passed value       |        Description                | |
+| |------------------------------------+-----------------------------------| |
+| |b_ModulNbr   APCI1710_16BIT_COUNTER |  The module is configured for     | |
+| |                                    |  two 16-bit counter.              | |
+| |                                    |  - b_FirstCounterModus and        | |
+| |                                    |    b_FirstCounterOption           | |
+| |                                    |    configure the first 16 bit     | |
+| |                                    |    counter.                       | |
+| |                                    |  - b_SecondCounterModus and       | |
+| |                                    |    b_SecondCounterOption          | |
+| |                                    |    configure the second 16 bit    | |
+| |                                    |    counter.                       | |
+| |------------------------------------+-----------------------------------| |
+| |b_ModulNbr   APCI1710_32BIT_COUNTER |  The module is configured for one | |
+| |                                    |  32-bit counter.                  | |
+| |                                    |  - b_FirstCounterModus and        | |
+| |                                    |    b_FirstCounterOption           | |
+| |                                    |    configure the 32 bit counter.  | |
+| |                                    |  - b_SecondCounterModus and       | |
+| |                                    |    b_SecondCounterOption          | |
+| |                                    |    are not used and have no       | |
+| |                                    |    importance.                    | |
+| +------------------------------------+-----------------------------------+ |
+|                                                                            |
+|                      Counter operating mode                                |
+|                      ----------------------                                |
+|                                                                            |
+| +--------------------+-------------------------+-------------------------+ |
+| |    Parameter       |     Passed value        |    Description          | |
+| |--------------------+-------------------------+-------------------------| |
+| |b_FirstCounterModus | APCI1710_QUADRUPLE_MODE | In the quadruple mode,  | |
+| |       or           |                         | the edge analysis       | |
+| |b_SecondCounterModus|                         | circuit generates a     | |
+| |                    |                         | counting pulse from     | |
+| |                    |                         | each edge of 2 signals  | |
+| |                    |                         | which are phase shifted | |
+| |                    |                         | in relation to each     | |
+| |                    |                         | other.                  | |
+| |--------------------+-------------------------+-------------------------| |
+| |b_FirstCounterModus |   APCI1710_DOUBLE_MODE  | Functions in the same   | |
+| |       or           |                         | way as the quadruple    | |
+| |b_SecondCounterModus|                         | mode, except that only  | |
+| |                    |                         | two of the four edges   | |
+| |                    |                         | are analysed per        | |
+| |                    |                         | period                  | |
+| |--------------------+-------------------------+-------------------------| |
+| |b_FirstCounterModus |   APCI1710_SIMPLE_MODE  | Functions in the same   | |
+| |       or           |                         | way as the quadruple    | |
+| |b_SecondCounterModus|                         | mode, except that only  | |
+| |                    |                         | one of the four edges   | |
+| |                    |                         | is analysed per         | |
+| |                    |                         | period.                 | |
+| |--------------------+-------------------------+-------------------------| |
+| |b_FirstCounterModus |   APCI1710_DIRECT_MODE  | In the direct mode the  | |
+| |       or           |                         | both edge analysis      | |
+| |b_SecondCounterModus|                         | circuits are inactive.  | |
+| |                    |                         | The inputs A, B in the  | |
+| |                    |                         | 32-bit mode or A, B and | |
+| |                    |                         | C, D in the 16-bit mode | |
+| |                    |                         | represent, each, one    | |
+| |                    |                         | clock pulse gate circuit| |
+| |                    |                         | There by frequency and  | |
+| |                    |                         | pulse duration          | |
+| |                    |                         | measurements can be     | |
+| |                    |                         | performed.              | |
+| +--------------------+-------------------------+-------------------------+ |
+|                                                                            |
+|                                                                            |
+|       IMPORTANT!                                                           |
+|       If you have configured the module for two 16-bit counter, a mixed    |
+|       mode with a counter in quadruple/double/single mode                  |
+|       and the other counter in direct mode is not possible!                |
+|                                                                            |
+|                                                                            |
+|         Counter operating option for quadruple/double/simple mode          |
+|         ---------------------------------------------------------          |
+|                                                                            |
+| +----------------------+-------------------------+------------------------+|
+| |       Parameter      |     Passed value        |  Description           ||
+| |----------------------+-------------------------+------------------------||
+| |b_FirstCounterOption  | APCI1710_HYSTERESIS_ON  | In both edge analysis  ||
+| |        or            |                         | circuits is available  ||
+| |b_SecondCounterOption |                         | one hysteresis circuit.||
+| |                      |                         | It suppresses each     ||
+| |                      |                         | time the first counting||
+| |                      |                         | pulse after a change   ||
+| |                      |                         | of rotation.           ||
+| |----------------------+-------------------------+------------------------||
+| |b_FirstCounterOption  | APCI1710_HYSTERESIS_OFF | The first counting     ||
+| |       or             |                         | pulse is not suppress  ||
+| |b_SecondCounterOption |                         | after a change of      ||
+| |                      |                         | rotation.              ||
+| +----------------------+-------------------------+------------------------+|
+|                                                                            |
+|                                                                            |
+|       IMPORTANT!                                                           |
+|       This option are only avaible if you have selected the direct mode.   |
+|                                                                            |
+|                                                                            |
+|               Counter operating option for direct mode                     |
+|               ----------------------------------------                     |
+|                                                                            |
+| +----------------------+--------------------+----------------------------+ |
+| |      Parameter       |     Passed value   |       Description          | |
+| |----------------------+--------------------+----------------------------| |
+| |b_FirstCounterOption  | APCI1710_INCREMENT | The counter increment for  | |
+| |       or             |                    | each counting pulse        | |
+| |b_SecondCounterOption |                    |                            | |
+| |----------------------+--------------------+----------------------------| |
+| |b_FirstCounterOption  | APCI1710_DECREMENT | The counter decrement for  | |
+| |       or             |                    | each counting pulse        | |
+| |b_SecondCounterOption |                    |                            | |
+| +----------------------+--------------------+----------------------------+ |
+|                                                                            |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle         : Handle of board APCI-1710|
+|                     BYTE_ b_ModulNbr            : Module number to         |
+|                                                   configure (0 to 3)       |
+|                     BYTE_ b_CounterRange        : Selection form counter   |
+|                                                   range.                   |
+|                     BYTE_ b_FirstCounterModus   : First counter operating  |
+|                                                   mode.                    |
+|                     BYTE_ b_FirstCounterOption  : First counter  option.   |
+|                     BYTE_ b_SecondCounterModus  : Second counter operating |
+|                                                   mode.                    |
+|                     BYTE_ b_SecondCounterOption : Second counter  option.  |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      : 0: No error                                            |
+|                    -1: The handle parameter of the board is wrong          |
+|                    -2: The module is not a counter module                  |
+|                    -3: The selected counter range is wrong.                |
+|                    -4: The selected first counter operating mode is wrong. |
+|                    -5: The selected first counter operating option is wrong|
+|                    -6: The selected second counter operating mode is wrong.|
+|                    -7: The selected second counter operating option is     |
+|                        wrong.                                              |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_InitCounter(struct comedi_device * dev,
+       BYTE b_ModulNbr,
+       BYTE b_CounterRange,
+       BYTE b_FirstCounterModus,
+       BYTE b_FirstCounterOption,
+       BYTE b_SecondCounterModus, BYTE b_SecondCounterOption)
+{
+       INT i_ReturnValue = 0;
+
+       /*******************************/
+       /* Test if incremental counter */
+       /*******************************/
+
+       if ((devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER) {
+          /**************************/
+               /* Test the counter range */
+          /**************************/
+
+               if (b_CounterRange == APCI1710_16BIT_COUNTER
+                       || b_CounterRange == APCI1710_32BIT_COUNTER) {
+             /********************************/
+                       /* Test the first counter modus */
+             /********************************/
+
+                       if (b_FirstCounterModus == APCI1710_QUADRUPLE_MODE ||
+                               b_FirstCounterModus == APCI1710_DOUBLE_MODE ||
+                               b_FirstCounterModus == APCI1710_SIMPLE_MODE ||
+                               b_FirstCounterModus == APCI1710_DIRECT_MODE) {
+                /*********************************/
+                               /* Test the first counter option */
+                /*********************************/
+
+                               if ((b_FirstCounterModus == APCI1710_DIRECT_MODE
+                                               && (b_FirstCounterOption ==
+                                                       APCI1710_INCREMENT
+                                                       || b_FirstCounterOption
+                                                       == APCI1710_DECREMENT))
+                                       || (b_FirstCounterModus !=
+                                               APCI1710_DIRECT_MODE
+                                               && (b_FirstCounterOption ==
+                                                       APCI1710_HYSTERESIS_ON
+                                                       || b_FirstCounterOption
+                                                       ==
+                                                       APCI1710_HYSTERESIS_OFF)))
+                               {
+                   /**************************/
+                                       /* Test if 16-bit counter */
+                   /**************************/
+
+                                       if (b_CounterRange ==
+                                               APCI1710_16BIT_COUNTER) {
+                      /*********************************/
+                                               /* Test the second counter modus */
+                      /*********************************/
+
+                                               if ((b_FirstCounterModus !=
+                                                               APCI1710_DIRECT_MODE
+                                                               &&
+                                                               (b_SecondCounterModus
+                                                                       ==
+                                                                       APCI1710_QUADRUPLE_MODE
+                                                                       ||
+                                                                       b_SecondCounterModus
+                                                                       ==
+                                                                       APCI1710_DOUBLE_MODE
+                                                                       ||
+                                                                       b_SecondCounterModus
+                                                                       ==
+                                                                       APCI1710_SIMPLE_MODE))
+                                                       || (b_FirstCounterModus
+                                                               ==
+                                                               APCI1710_DIRECT_MODE
+                                                               &&
+                                                               b_SecondCounterModus
+                                                               ==
+                                                               APCI1710_DIRECT_MODE))
+                                               {
+                         /**********************************/
+                                                       /* Test the second counter option */
+                         /**********************************/
+
+                                                       if ((b_SecondCounterModus == APCI1710_DIRECT_MODE && (b_SecondCounterOption == APCI1710_INCREMENT || b_SecondCounterOption == APCI1710_DECREMENT)) || (b_SecondCounterModus != APCI1710_DIRECT_MODE && (b_SecondCounterOption == APCI1710_HYSTERESIS_ON || b_SecondCounterOption == APCI1710_HYSTERESIS_OFF))) {
+                                                               i_ReturnValue =
+                                                                       0;
+                                                       } else {
+                            /*********************************************************/
+                                                               /* The selected second counter operating option is wrong */
+                            /*********************************************************/
+
+                                                               DPRINTK("The selected second counter operating option is wrong\n");
+                                                               i_ReturnValue =
+                                                                       -7;
+                                                       }
+                                               } else {
+                         /*******************************************************/
+                                                       /* The selected second counter operating mode is wrong */
+                         /*******************************************************/
+
+                                                       DPRINTK("The selected second counter operating mode is wrong\n");
+                                                       i_ReturnValue = -6;
+                                               }
+                                       }
+                               } else {
+                   /********************************************************/
+                                       /* The selected first counter operating option is wrong */
+                   /********************************************************/
+
+                                       DPRINTK("The selected first counter operating option is wrong\n");
+                                       i_ReturnValue = -5;
+                               }
+                       } else {
+                /******************************************************/
+                               /* The selected first counter operating mode is wrong */
+                /******************************************************/
+                               DPRINTK("The selected first counter operating mode is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /***************************************/
+                       /* The selected counter range is wrong */
+             /***************************************/
+
+                       DPRINTK("The selected counter range is wrong\n");
+                       i_ReturnValue = -3;
+               }
+
+          /*************************/
+               /* Test if a error occur */
+          /*************************/
+
+               if (i_ReturnValue == 0) {
+             /**************************/
+                       /* Test if 16-Bit counter */
+             /**************************/
+
+                       if (b_CounterRange == APCI1710_32BIT_COUNTER) {
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister1 = b_CounterRange |
+                                       b_FirstCounterModus |
+                                       b_FirstCounterOption;
+                       } else {
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister1 = b_CounterRange |
+                                       (b_FirstCounterModus & 0x5) |
+                                       (b_FirstCounterOption & 0x20) |
+                                       (b_SecondCounterModus & 0xA) |
+                                       (b_SecondCounterOption & 0x40);
+
+                /***********************/
+                               /* Test if direct mode */
+                /***********************/
+
+                               if (b_FirstCounterModus == APCI1710_DIRECT_MODE) {
+                                       devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister1 = devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister1 |
+                                               APCI1710_DIRECT_MODE;
+                               }
+                       }
+
+             /***************************/
+                       /* Write the configuration */
+             /***************************/
+
+                       outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               dw_ModeRegister1_2_3_4,
+                               devpriv->s_BoardInfos.
+                               ui_Address + 20 + (64 * b_ModulNbr));
+
+                       devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_CounterInit = 1;
+               }
+       } else {
+          /**************************************/
+               /* The module is not a counter module */
+          /**************************************/
+
+               DPRINTK("The module is not a counter module\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_CounterAutoTest                       |
+|                                               (BYTE_     b_BoardHandle,    |
+|                                                PBYTE_   pb_TestStatus)     |
++----------------------------------------------------------------------------+
+| Task              : A test mode is intended for testing the component and  |
+|                     the connected periphery. All the 8-bit counter chains  |
+|                     are operated internally as down counters.              |
+|                     Independently from the external signals,               |
+|                     all the four 8-bit counter chains are decremented in   |
+|                     parallel by each negative clock pulse edge of CLKX.    |
+|                                                                            |
+|                       Counter auto test conclusion                         |
+|                       ----------------------------                         |
+|              +-----------------+-----------------------------+             |
+|              | pb_TestStatus   |    Error description        |             |
+|              |     mask        |                             |             |
+|              |-----------------+-----------------------------|             |
+|              |    0000         |     No error detected       |             |
+|              |-----------------|-----------------------------|             |
+|              |    0001         | Error detected of counter 0 |             |
+|              |-----------------|-----------------------------|             |
+|              |    0010         | Error detected of counter 1 |             |
+|              |-----------------|-----------------------------|             |
+|              |    0100         | Error detected of counter 2 |             |
+|              |-----------------|-----------------------------|             |
+|              |    1000         | Error detected of counter 3 |             |
+|              +-----------------+-----------------------------+             |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_   b_BoardHandle : Handle of board APCI-1710      |  |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_TestStatus  : Auto test conclusion. See table|
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_CounterAutoTest(struct comedi_device * dev, PBYTE pb_TestStatus)
+{
+       BYTE b_ModulCpt = 0;
+       INT i_ReturnValue = 0;
+       DWORD dw_LathchValue;
+
+       *pb_TestStatus = 0;
+
+       /********************************/
+       /* Test if counter module found */
+       /********************************/
+
+       if ((devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[0] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER
+               || (devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[1] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER
+               || (devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[2] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER
+               || (devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[3] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER) {
+               for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) {
+             /*******************************/
+                       /* Test if incremental counter */
+             /*******************************/
+
+                       if ((devpriv->s_BoardInfos.
+                                       dw_MolduleConfiguration[b_ModulCpt] &
+                                       0xFFFF0000UL) ==
+                               APCI1710_INCREMENTAL_COUNTER) {
+                /******************/
+                               /* Start the test */
+                /******************/
+
+                               outl(3, devpriv->s_BoardInfos.
+                                       ui_Address + 16 + (64 * b_ModulCpt));
+
+                /*********************/
+                               /* Tatch the counter */
+                /*********************/
+
+                               outl(1, devpriv->s_BoardInfos.
+                                       ui_Address + (64 * b_ModulCpt));
+
+                /************************/
+                               /* Read the latch value */
+                /************************/
+
+                               dw_LathchValue = inl(devpriv->s_BoardInfos.
+                                       ui_Address + 4 + (64 * b_ModulCpt));
+
+                               if ((dw_LathchValue & 0xFF) !=
+                                       ((dw_LathchValue >> 8) & 0xFF)
+                                       && (dw_LathchValue & 0xFF) !=
+                                       ((dw_LathchValue >> 16) & 0xFF)
+                                       && (dw_LathchValue & 0xFF) !=
+                                       ((dw_LathchValue >> 24) & 0xFF)) {
+                                       *pb_TestStatus =
+                                               *pb_TestStatus | (1 <<
+                                               b_ModulCpt);
+                               }
+
+                /*****************/
+                               /* Stop the test */
+                /*****************/
+
+                               outl(0, devpriv->s_BoardInfos.
+                                       ui_Address + 16 + (64 * b_ModulCpt));
+                       }
+               }
+       } else {
+          /***************************/
+               /* No counter module found */
+          /***************************/
+
+               DPRINTK("No counter module found\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_InitIndex (BYTE_ b_BoardHandle,       |
+|                                                 BYTE_ b_ModulNbr,          |
+|                                                 BYTE_ b_ReferenceAction,   |
+|                                                 BYTE_ b_IndexOperation,    |
+|                                                 BYTE_ b_AutoMode,          |
+|                                                 BYTE_ b_InterruptEnable)   |
++----------------------------------------------------------------------------+
+| Task              : Initialise the index corresponding to the selected     |
+|                     module (b_ModulNbr). If a INDEX flag occur, you have   |
+|                     the possibility to clear the 32-Bit counter or to latch|
+|                     the current 32-Bit value in to the first latch         |
+|                     register. The b_IndexOperation parameter give the      |
+|                     possibility to choice the INDEX action.                |
+|                     If you have enabled the automatic mode, each INDEX     |
+|                     action is cleared automatically, else you must read    |
+|                     the index status ("i_APCI1710_ReadIndexStatus")        |
+|                     after each INDEX action.                               |
+|                                                                            |
+|                                                                            |
+|                               Index action                                 |
+|                               ------------                                 |
+|                                                                            |
+|           +------------------------+------------------------------------+  |
+|           |   b_IndexOperation     |         Operation                  |  |
+|           |------------------------+------------------------------------|  |
+|           |APCI1710_LATCH_COUNTER  | After a index signal, the counter  |  |
+|           |                        | value (32-Bit) is latched in to    |  |
+|           |                        | the first latch register           |  |
+|           |------------------------|------------------------------------|  |
+|           |APCI1710_CLEAR_COUNTER  | After a index signal, the counter  |  |
+|           |                        | value is cleared (32-Bit)          |  |
+|           +------------------------+------------------------------------+  |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
+|                     BYTE_ b_ReferenceAction : Determine if the reference   |
+|                                               must set or no for the       |
+|                                               acceptance from index        |
+|                                               APCI1710_ENABLE :            |
+|                                                  Reference must be set for |
+|                                                  accepted the index        |
+|                                               APCI1710_DISABLE :           |
+|                                                  Reference have not        |
+|                                                  importance                |
+|                     BYTE_ b_IndexOperation  : Index operating mode.        |
+|                                               See table.                   |
+|                     BYTE_ b_AutoMode        : Enable or disable the        |
+|                                               automatic index reset.       |
+|                                               APCI1710_ENABLE :            |
+|                                                 Enable the automatic mode  |
+|                                               APCI1710_DISABLE :           |
+|                                                 Disable the automatic mode |
+|                     BYTE_ b_InterruptEnable : Enable or disable the        |
+|                                               interrupt.                   |
+|                                               APCI1710_ENABLE :            |
+|                                               Enable the interrupt         |
+|                                               APCI1710_DISABLE :           |
+|                                               Disable the interrupt        |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4  The reference action parameter is wrong            |
+|                     -5: The index operating mode parameter is wrong        |
+|                     -6: The auto mode parameter is wrong                   |
+|                     -7: Interrupt parameter is wrong                       |
+|                     -8: Interrupt function not initialised.                |
+|                         See function "i_APCI1710_SetBoardIntRoutineX"      |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_InitIndex(struct comedi_device * dev,
+       BYTE b_ModulNbr,
+       BYTE b_ReferenceAction,
+       BYTE b_IndexOperation, BYTE b_AutoMode, BYTE b_InterruptEnable)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /********************************/
+                       /* Test the reference parameter */
+             /********************************/
+
+                       if (b_ReferenceAction == APCI1710_ENABLE ||
+                               b_ReferenceAction == APCI1710_DISABLE) {
+                /****************************/
+                               /* Test the index parameter */
+                /****************************/
+
+                               if (b_IndexOperation ==
+                                       APCI1710_HIGH_EDGE_LATCH_COUNTER
+                                       || b_IndexOperation ==
+                                       APCI1710_LOW_EDGE_LATCH_COUNTER
+                                       || b_IndexOperation ==
+                                       APCI1710_HIGH_EDGE_CLEAR_COUNTER
+                                       || b_IndexOperation ==
+                                       APCI1710_LOW_EDGE_CLEAR_COUNTER
+                                       || b_IndexOperation ==
+                                       APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER
+                                       || b_IndexOperation ==
+                                       APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
+                               {
+                   /********************************/
+                                       /* Test the auto mode parameter */
+                   /********************************/
+
+                                       if (b_AutoMode == APCI1710_ENABLE ||
+                                               b_AutoMode == APCI1710_DISABLE)
+                                       {
+                      /***************************/
+                                               /* Test the interrupt mode */
+                      /***************************/
+
+                                               if (b_InterruptEnable ==
+                                                       APCI1710_ENABLE
+                                                       || b_InterruptEnable ==
+                                                       APCI1710_DISABLE) {
+
+                            /************************************/
+                                                       /* Makte the configuration commando */
+                            /************************************/
+
+                                                       if (b_ReferenceAction ==
+                                                               APCI1710_ENABLE)
+                                                       {
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       |
+                                                                       APCI1710_ENABLE_INDEX_ACTION;
+                                                       } else {
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       &
+                                                                       APCI1710_DISABLE_INDEX_ACTION;
+                                                       }
+
+                            /****************************************/
+                                                       /* Test if low level latch or/and clear */
+                            /****************************************/
+
+                                                       if (b_IndexOperation ==
+                                                               APCI1710_LOW_EDGE_LATCH_COUNTER
+                                                               ||
+                                                               b_IndexOperation
+                                                               ==
+                                                               APCI1710_LOW_EDGE_CLEAR_COUNTER
+                                                               ||
+                                                               b_IndexOperation
+                                                               ==
+                                                               APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
+                                                       {
+                               /*************************************/
+                                                               /* Set the index level to low (DQ26) */
+                               /*************************************/
+
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       |
+                                                                       APCI1710_SET_LOW_INDEX_LEVEL;
+                                                       } else {
+                               /**************************************/
+                                                               /* Set the index level to high (DQ26) */
+                               /**************************************/
+
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       &
+                                                                       APCI1710_SET_HIGH_INDEX_LEVEL;
+                                                       }
+
+                            /***********************************/
+                                                       /* Test if latch and clear counter */
+                            /***********************************/
+
+                                                       if (b_IndexOperation ==
+                                                               APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER
+                                                               ||
+                                                               b_IndexOperation
+                                                               ==
+                                                               APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
+                                                       {
+                               /***************************************/
+                                                               /* Set the latch and clear flag (DQ27) */
+                               /***************************************/
+
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       |
+                                                                       APCI1710_ENABLE_LATCH_AND_CLEAR;
+                                                       }       // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
+                                                       else {
+                               /*****************************************/
+                                                               /* Clear the latch and clear flag (DQ27) */
+                               /*****************************************/
+
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       &
+                                                                       APCI1710_DISABLE_LATCH_AND_CLEAR;
+
+                               /*************************/
+                                                               /* Test if latch counter */
+                               /*************************/
+
+                                                               if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_COUNTER) {
+                                  /*********************************/
+                                                                       /* Enable the latch from counter */
+                                  /*********************************/
+
+                                                                       devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister2
+                                                                               =
+                                                                               devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister2
+                                                                               |
+                                                                               APCI1710_INDEX_LATCH_COUNTER;
+                                                               } else {
+                                  /*********************************/
+                                                                       /* Enable the clear from counter */
+                                  /*********************************/
+
+                                                                       devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister2
+                                                                               =
+                                                                               devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister2
+                                                                               &
+                                                                               (~APCI1710_INDEX_LATCH_COUNTER);
+                                                               }
+                                                       }       // // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
+
+                                                       if (b_AutoMode ==
+                                                               APCI1710_DISABLE)
+                                                       {
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       |
+                                                                       APCI1710_INDEX_AUTO_MODE;
+                                                       } else {
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister2
+                                                                       &
+                                                                       (~APCI1710_INDEX_AUTO_MODE);
+                                                       }
+
+                                                       if (b_InterruptEnable ==
+                                                               APCI1710_ENABLE)
+                                                       {
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister3
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister3
+                                                                       |
+                                                                       APCI1710_ENABLE_INDEX_INT;
+                                                       } else {
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister3
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister3
+                                                                       &
+                                                                       APCI1710_DISABLE_INDEX_INT;
+                                                       }
+
+                                                       devpriv->
+                                                               s_ModuleInfo
+                                                               [b_ModulNbr].
+                                                               s_SiemensCounterInfo.
+                                                               s_InitFlag.
+                                                               b_IndexInit = 1;
+
+                                               } else {
+                         /********************************/
+                                                       /* Interrupt parameter is wrong */
+                         /********************************/
+                                                       DPRINTK("Interrupt parameter is wrong\n");
+                                                       i_ReturnValue = -7;
+                                               }
+                                       } else {
+                      /************************************/
+                                               /* The auto mode parameter is wrong */
+                      /************************************/
+
+                                               DPRINTK("The auto mode parameter is wrong\n");
+                                               i_ReturnValue = -6;
+                                       }
+                               } else {
+                   /***********************************************/
+                                       /* The index operating mode parameter is wrong */
+                   /***********************************************/
+
+                                       DPRINTK("The index operating mode parameter is wrong\n");
+                                       i_ReturnValue = -5;
+                               }
+                       } else {
+                /*******************************************/
+                               /* The reference action parameter is wrong */
+                /*******************************************/
+
+                               DPRINTK("The reference action parameter is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_InitReference                         |
+|                                                (BYTE_ b_BoardHandle,       |
+|                                                 BYTE_ b_ModulNbr,          |
+|                                                 BYTE_ b_ReferenceLevel)    |
++----------------------------------------------------------------------------+
+| Task              : Initialise the reference corresponding to the selected |
+|                     module (b_ModulNbr).                                   |
+|                                                                            |
+|                               Reference level                              |
+|                               ---------------                              |
+|             +--------------------+-------------------------+               |
+|             | b_ReferenceLevel   |         Operation       |               |
+|             +--------------------+-------------------------+               |
+|             |   APCI1710_LOW     |  Reference occur if "0" |               |
+|             |--------------------|-------------------------|               |
+|             |   APCI1710_HIGH    |  Reference occur if "1" |               |
+|             +--------------------+-------------------------+               |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
+|                     BYTE_ b_ReferenceLevel  : Reference level.             |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: The selected module number parameter is wrong      |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Reference level parameter is wrong                 |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_InitReference(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_ReferenceLevel)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /**************************************/
+                       /* Test the reference level parameter */
+             /**************************************/
+
+                       if (b_ReferenceLevel == 0 || b_ReferenceLevel == 1) {
+                               if (b_ReferenceLevel == 1) {
+                                       devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister2 = devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister2 |
+                                               APCI1710_REFERENCE_HIGH;
+                               } else {
+                                       devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister2 = devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister2 &
+                                               APCI1710_REFERENCE_LOW;
+                               }
+
+                               outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       dw_ModeRegister1_2_3_4,
+                                       devpriv->s_BoardInfos.ui_Address + 20 +
+                                       (64 * b_ModulNbr));
+
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_InitFlag.b_ReferenceInit = 1;
+                       } else {
+                /**************************************/
+                               /* Reference level parameter is wrong */
+                /**************************************/
+
+                               DPRINTK("Reference level parameter is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_    i_APCI1710_InitExternalStrobe                |
+|                                      (BYTE_ b_BoardHandle,                |
+|                                       BYTE_ b_ModulNbr,                   |
+|                                       BYTE_ b_ExternalStrobe,             |
+|                                       BYTE_ b_ExternalStrobeLevel)        |
++----------------------------------------------------------------------------+
+| Task              : Initialises the external strobe level corresponding to |
+|                    the selected module (b_ModulNbr).                      |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
+|                    BYTE_ b_ExternalStrobe  : External strobe selection    |
+|                                              0 : External strobe A        |
+|                                              1 : External strobe B        |
+|                    BYTE_ b_ExternalStrobeLevel : External strobe level    |
+|                                              APCI1710_LOW :               |
+|                                              External latch occurs if "0" |
+|                                              APCI1710_HIGH :              |
+|                                              External latch occurs if "1" |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: The selected module number is wrong                |
+|                     -3: Counter not initialised.                           |
+|                        See function "i_APCI1710_InitCounter"              |
+|                     -4: External strobe selection is wrong                 |
+|                     -5: External strobe level parameter is wrong           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_InitExternalStrobe(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_ExternalStrobe, BYTE b_ExternalStrobeLevel)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /**************************************/
+                       /* Test the external strobe selection */
+             /**************************************/
+
+                       if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) {
+                /******************/
+                               /* Test the level */
+                /******************/
+
+                               if ((b_ExternalStrobeLevel == APCI1710_HIGH) ||
+                                       ((b_ExternalStrobeLevel == APCI1710_LOW
+                                                       && (devpriv->
+                                                               s_BoardInfos.
+                                                               dw_MolduleConfiguration
+                                                               [b_ModulNbr] &
+                                                               0xFFFF) >=
+                                                       0x3135))) {
+                   /*****************/
+                                       /* Set the level */
+                   /*****************/
+
+                                       devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister4 = (devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister4 & (0xFF -
+                                                       (0x10 << b_ExternalStrobe))) | ((b_ExternalStrobeLevel ^ 1) << (4 + b_ExternalStrobe));
+                               } else {
+                   /********************************************/
+                                       /* External strobe level parameter is wrong */
+                   /********************************************/
+
+                                       DPRINTK("External strobe level parameter is wrong\n");
+                                       i_ReturnValue = -5;
+                               }
+                       }       // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1)
+                       else {
+                /**************************************/
+                               /* External strobe selection is wrong */
+                /**************************************/
+
+                               DPRINTK("External strobe selection is wrong\n");
+                               i_ReturnValue = -4;
+                       }       // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1)
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+       /*
+          +----------------------------------------------------------------------------+
+          | Function Name     : _INT_ i_APCI1710_InitCompareLogic                      |
+          |                               (BYTE_   b_BoardHandle,                      |
+          |                                BYTE_   b_ModulNbr,                         |
+          |                                UINT_  ui_CompareValue)                     |
+          +----------------------------------------------------------------------------+
+          | Task              : Set the 32-Bit compare value. At that moment that the  |
+          |                     incremental counter arrive to the compare value        |
+          |                     (ui_CompareValue) a interrupt is generated.            |
+          +----------------------------------------------------------------------------+
+          | Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+          |                     BYTE_  b_ModulNbr       : Module number to configure   |
+          |                                               (0 to 3)                     |
+          |                     UINT_ ui_CompareValue   : 32-Bit compare value         |
+          +----------------------------------------------------------------------------+
+          | Output Parameters : -
+          +----------------------------------------------------------------------------+
+          | Return Value      :  0: No error                                           |
+          |                     -1: The handle parameter of the board is wrong         |
+          |                     -2: No counter module found                            |
+          |                     -3: Counter not initialised see function               |
+          |                         "i_APCI1710_InitCounter"                           |
+          +----------------------------------------------------------------------------+
+        */
+
+INT i_APCI1710_InitCompareLogic(struct comedi_device * dev,
+       BYTE b_ModulNbr, UINT ui_CompareValue)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+
+                       outl(ui_CompareValue, devpriv->s_BoardInfos.
+                               ui_Address + 28 + (64 * b_ModulNbr));
+
+                       devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_CompareLogicInit = 1;
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_InitFrequencyMeasurement              |
+|                              (BYTE_           b_BoardHandle,              |
+|                               BYTE_           b_ModulNbr,                 |
+|                               BYTE_           b_PCIInputClock,            |
+|                               BYTE_           b_TimingUnity,              |
+|                               ULONG_         ul_TimingInterval,           |
+|                               PULONG_       pul_RealTimingInterval)       |
++----------------------------------------------------------------------------+
+| Task              : Sets the time for the frequency measurement.           |
+|                    Configures the selected TOR incremental counter of the |
+|                    selected module (b_ModulNbr). The ul_TimingInterval and|
+|                    ul_TimingUnity determine the time base for the         |
+|                    measurement. The pul_RealTimingInterval returns the    |
+|                    real time value. You must call up this function before |
+|                    you call up any other function which gives access to   |
+|                    the frequency measurement.                             |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+|                    BYTE_  b_ModulNbr       : Number of the module to be   |
+|                                              configured (0 to 3)          |
+|                    BYTE_  b_PCIInputClock  : Selection of the PCI bus     |
+|                                              clock                        |
+|                                              - APCI1710_30MHZ :           |
+|                                                The PC has a PCI bus clock |
+|                                                of 30 MHz                  |
+|                                              - APCI1710_33MHZ :           |
+|                                                The PC has a PCI bus clock |
+|                                                of 33 MHz                  |
+|                    BYTE_  b_TimingUnity    : Base time unit (0 to 2)      |
+|                                                0 : ns                     |
+|                                                1 : æs                     |
+|                                                2 : ms                     |
+|                    ULONG_ ul_TimingInterval: Base time value.             |
++----------------------------------------------------------------------------+
+| Output Parameters : PULONG_ pul_RealTimingInterval : Real base time value. |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: The selected module number is wrong                |
+|                     -3: Counter not initialised see function               |
+|                        "i_APCI1710_InitCounter"                           |
+|                     -4: The selected PCI input clock is wrong              |
+|                     -5: Timing unity selection is wrong                    |
+|                     -6: Base timing selection is wrong                     |
+|                    -7: 40MHz quartz not on board                          |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_InitFrequencyMeasurement(struct comedi_device * dev,
+       BYTE b_ModulNbr,
+       BYTE b_PCIInputClock,
+       BYTE b_TimingUnity,
+       ULONG ul_TimingInterval, PULONG pul_RealTimingInterval)
+{
+       INT i_ReturnValue = 0;
+       ULONG ul_TimerValue = 0;
+       double d_RealTimingInterval;
+       DWORD dw_Status = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /**************************/
+                       /* Test the PCI bus clock */
+             /**************************/
+
+                       if ((b_PCIInputClock == APCI1710_30MHZ) ||
+                               (b_PCIInputClock == APCI1710_33MHZ) ||
+                               (b_PCIInputClock == APCI1710_40MHZ)) {
+                /************************/
+                               /* Test the timing unit */
+                /************************/
+
+                               if (b_TimingUnity <= 2) {
+                   /**********************************/
+                                       /* Test the base timing selection */
+                   /**********************************/
+
+                                       if (((b_PCIInputClock == APCI1710_30MHZ)
+                                                       && (b_TimingUnity == 0)
+                                                       && (ul_TimingInterval >=
+                                                               266)
+                                                       && (ul_TimingInterval <=
+                                                               8738133UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_30MHZ)
+                                                       && (b_TimingUnity == 1)
+                                                       && (ul_TimingInterval >=
+                                                               1)
+                                                       && (ul_TimingInterval <=
+                                                               8738UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_30MHZ)
+                                                       && (b_TimingUnity == 2)
+                                                       && (ul_TimingInterval >=
+                                                               1)
+                                                       && (ul_TimingInterval <=
+                                                               8UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_33MHZ)
+                                                       && (b_TimingUnity == 0)
+                                                       && (ul_TimingInterval >=
+                                                               242)
+                                                       && (ul_TimingInterval <=
+                                                               7943757UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_33MHZ)
+                                                       && (b_TimingUnity == 1)
+                                                       && (ul_TimingInterval >=
+                                                               1)
+                                                       && (ul_TimingInterval <=
+                                                               7943UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_33MHZ)
+                                                       && (b_TimingUnity == 2)
+                                                       && (ul_TimingInterval >=
+                                                               1)
+                                                       && (ul_TimingInterval <=
+                                                               7UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_40MHZ)
+                                                       && (b_TimingUnity == 0)
+                                                       && (ul_TimingInterval >=
+                                                               200)
+                                                       && (ul_TimingInterval <=
+                                                               6553500UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_40MHZ)
+                                                       && (b_TimingUnity == 1)
+                                                       && (ul_TimingInterval >=
+                                                               1)
+                                                       && (ul_TimingInterval <=
+                                                               6553UL))
+                                               || ((b_PCIInputClock ==
+                                                               APCI1710_40MHZ)
+                                                       && (b_TimingUnity == 2)
+                                                       && (ul_TimingInterval >=
+                                                               1)
+                                                       && (ul_TimingInterval <=
+                                                               6UL))) {
+                      /**********************/
+                                               /* Test if 40MHz used */
+                      /**********************/
+
+                                               if (b_PCIInputClock ==
+                                                       APCI1710_40MHZ) {
+                         /******************************/
+                                                       /* Test if firmware >= Rev1.5 */
+                         /******************************/
+
+                                                       if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3135) {
+                            /*********************************/
+                                                               /* Test if 40MHz quartz on board */
+                            /*********************************/
+
+                                                               /*INPDW (ps_APCI1710Variable->
+                                                                  s_Board [b_BoardHandle].
+                                                                  s_BoardInfos.
+                                                                  ui_Address + 36 + (64 * b_ModulNbr), &dw_Status); */
+                                                               dw_Status =
+                                                                       inl
+                                                                       (devpriv->
+                                                                       s_BoardInfos.
+                                                                       ui_Address
+                                                                       + 36 +
+                                                                       (64 * b_ModulNbr));
+
+                            /******************************/
+                                                               /* Test the quartz flag (DQ0) */
+                            /******************************/
+
+                                                               if ((dw_Status & 1) != 1) {
+                               /*****************************/
+                                                                       /* 40MHz quartz not on board */
+                               /*****************************/
+
+                                                                       DPRINTK("40MHz quartz not on board\n");
+                                                                       i_ReturnValue
+                                                                               =
+                                                                               -7;
+                                                               }
+                                                       } else {
+                            /*****************************/
+                                                               /* 40MHz quartz not on board */
+                            /*****************************/
+                                                               DPRINTK("40MHz quartz not on board\n");
+                                                               i_ReturnValue =
+                                                                       -7;
+                                                       }
+                                               }       // if (b_PCIInputClock == APCI1710_40MHZ)
+
+                      /***************************/
+                                               /* Test if not error occur */
+                      /***************************/
+
+                                               if (i_ReturnValue == 0) {
+                         /****************************/
+                                                       /* Test the INC_CPT version */
+                         /****************************/
+
+                                                       if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131) {
+
+                               /**********************/
+                                                               /* Test if 40MHz used */
+                               /**********************/
+
+                                                               if (b_PCIInputClock == APCI1710_40MHZ) {
+                                  /*********************************/
+                                                                       /* Enable the 40MHz quarz (DQ30) */
+                                  /*********************************/
+
+                                                                       devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister4
+                                                                               =
+                                                                               devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister4
+                                                                               |
+                                                                               APCI1710_ENABLE_40MHZ_FREQUENCY;
+                                                               }       // if (b_PCIInputClock == APCI1710_40MHZ)
+                                                               else {
+                                  /**********************************/
+                                                                       /* Disable the 40MHz quarz (DQ30) */
+                                  /**********************************/
+
+                                                                       devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister4
+                                                                               =
+                                                                               devpriv->
+                                                                               s_ModuleInfo
+                                                                               [b_ModulNbr].
+                                                                               s_SiemensCounterInfo.
+                                                                               s_ModeRegister.
+                                                                               s_ByteModeRegister.
+                                                                               b_ModeRegister4
+                                                                               &
+                                                                               APCI1710_DISABLE_40MHZ_FREQUENCY;
+
+                                                               }       // if (b_PCIInputClock == APCI1710_40MHZ)
+
+                            /********************************/
+                                                               /* Calculate the division fator */
+                            /********************************/
+
+                                                               fpu_begin();
+                                                               switch (b_TimingUnity) {
+                               /******/
+                                                                       /* ns */
+                               /******/
+
+                                                               case 0:
+
+                                       /******************/
+                                                                       /* Timer 0 factor */
+                                       /******************/
+
+                                                                       ul_TimerValue
+                                                                               =
+                                                                               (ULONG)
+                                                                               (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 */
+                                       /*****************************/
+
+                                                                       *pul_RealTimingInterval
+                                                                               =
+                                                                               (ULONG)
+                                                                               (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)*pul_RealTimingInterval + 0.5)) {
+                                                                               *pul_RealTimingInterval
+                                                                                       =
+                                                                                       *pul_RealTimingInterval
+                                                                                       +
+                                                                                       1;
+                                                                       }
+
+                                                                       ul_TimingInterval
+                                                                               =
+                                                                               ul_TimingInterval
+                                                                               -
+                                                                               1;
+                                                                       ul_TimerValue
+                                                                               =
+                                                                               ul_TimerValue
+                                                                               -
+                                                                               2;
+
+                                                                       break;
+
+                               /******/
+                                                                       /* æs */
+                               /******/
+
+                                                               case 1:
+
+                                       /******************/
+                                                                       /* Timer 0 factor */
+                                       /******************/
+
+                                                                       ul_TimerValue
+                                                                               =
+                                                                               (ULONG)
+                                                                               (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 */
+                                       /*****************************/
+
+                                                                       *pul_RealTimingInterval
+                                                                               =
+                                                                               (ULONG)
+                                                                               (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)*pul_RealTimingInterval + 0.5)) {
+                                                                               *pul_RealTimingInterval
+                                                                                       =
+                                                                                       *pul_RealTimingInterval
+                                                                                       +
+                                                                                       1;
+                                                                       }
+
+                                                                       ul_TimingInterval
+                                                                               =
+                                                                               ul_TimingInterval
+                                                                               -
+                                                                               1;
+                                                                       ul_TimerValue
+                                                                               =
+                                                                               ul_TimerValue
+                                                                               -
+                                                                               2;
+
+                                                                       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 */
+                                       /*****************************/
+
+                                                                       *pul_RealTimingInterval
+                                                                               =
+                                                                               (ULONG)
+                                                                               (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)*pul_RealTimingInterval + 0.5)) {
+                                                                               *pul_RealTimingInterval
+                                                                                       =
+                                                                                       *pul_RealTimingInterval
+                                                                                       +
+                                                                                       1;
+                                                                       }
+
+                                                                       ul_TimingInterval
+                                                                               =
+                                                                               ul_TimingInterval
+                                                                               -
+                                                                               1;
+                                                                       ul_TimerValue
+                                                                               =
+                                                                               ul_TimerValue
+                                                                               -
+                                                                               2;
+
+                                                                       break;
+                                                               }
+
+                                                               fpu_end();
+                            /*************************/
+                                                               /* Write the timer value */
+                            /*************************/
+
+                                                               outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 32 + (64 * b_ModulNbr));
+
+                            /*******************************/
+                                                               /* Set the initialisation flag */
+                            /*******************************/
+
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_InitFlag.
+                                                                       b_FrequencyMeasurementInit
+                                                                       = 1;
+                                                       } else {
+                            /***************************/
+                                                               /* Counter not initialised */
+                            /***************************/
+
+                                                               DPRINTK("Counter not initialised\n");
+                                                               i_ReturnValue =
+                                                                       -3;
+                                                       }
+                                               }       // if (i_ReturnValue == 0)
+                                       } else {
+                      /**********************************/
+                                               /* Base timing selection is wrong */
+                      /**********************************/
+
+                                               DPRINTK("Base timing selection is wrong\n");
+                                               i_ReturnValue = -6;
+                                       }
+                               } else {
+                   /***********************************/
+                                       /* Timing unity selection is wrong */
+                   /***********************************/
+
+                                       DPRINTK("Timing unity selection is wrong\n");
+                                       i_ReturnValue = -5;
+                               }
+                       } else {
+                /*****************************************/
+                               /* The selected PCI input clock is wrong */
+                /*****************************************/
+
+                               DPRINTK("The selected PCI input clock is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*########################################################################### */
+
+                                                       //INSN BITS
+/*########################################################################### */
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     :INT       i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
+struct comedi_insn *insn,unsigned int *data)                   |
++----------------------------------------------------------------------------+
+| Task              : Set & Clear Functions for INC_CPT                                          |
++----------------------------------------------------------------------------+
+| Input Parameters  :
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_InsnBitsINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
+       struct comedi_insn * insn, unsigned int * data)
+{
+       UINT ui_BitsType;
+       INT i_ReturnValue = 0;
+       ui_BitsType = CR_CHAN(insn->chanspec);
+       devpriv->tsk_Current = current; // Save the current process task structure
+
+       switch (ui_BitsType) {
+       case APCI1710_INCCPT_CLEARCOUNTERVALUE:
+               i_ReturnValue = i_APCI1710_ClearCounterValue(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_CLEARALLCOUNTERVALUE:
+               i_ReturnValue = i_APCI1710_ClearAllCounterValue(dev);
+               break;
+
+       case APCI1710_INCCPT_SETINPUTFILTER:
+               i_ReturnValue = i_APCI1710_SetInputFilter(dev,
+                       (BYTE) CR_AREF(insn->chanspec),
+                       (BYTE) data[0], (BYTE) data[1]);
+               break;
+
+       case APCI1710_INCCPT_LATCHCOUNTER:
+               i_ReturnValue = i_APCI1710_LatchCounter(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]);
+               break;
+
+       case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE:
+               i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]);
+               break;
+
+       case APCI1710_INCCPT_SETDIGITALCHLON:
+               i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_SETDIGITALCHLOFF:
+               i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       default:
+               printk("Bits Config Parameter Wrong\n");
+       }
+
+       if (i_ReturnValue >= 0)
+               i_ReturnValue = insn->n;
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_ClearCounterValue                     |
+|                               (BYTE_      b_BoardHandle,                   |
+|                                BYTE_       b_ModulNbr)                     |
++----------------------------------------------------------------------------+
+| Task              : Clear the counter value from selected module           |
+|                     (b_ModulNbr).                                          |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
+|                     BYTE_ b_ModulNbr    : Module number to configure       |
+|                                           (0 to 3)                         |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: The selected module number parameter is wrong      |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_ClearCounterValue(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*********************/
+                       /* Clear the counter */
+             /*********************/
+
+                       outl(1, devpriv->s_BoardInfos.
+                               ui_Address + 16 + (64 * b_ModulNbr));
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_ClearAllCounterValue                  |
+|                               (BYTE_      b_BoardHandle)                   |
++----------------------------------------------------------------------------+
+| Task              : Clear all counter value.                               |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_ClearAllCounterValue(struct comedi_device * dev)
+{
+       BYTE b_ModulCpt = 0;
+       INT i_ReturnValue = 0;
+
+       /********************************/
+       /* Test if counter module found */
+       /********************************/
+
+       if ((devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[0] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER
+               || (devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[1] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER
+               || (devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[2] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER
+               || (devpriv->s_BoardInfos.
+                       dw_MolduleConfiguration[3] & 0xFFFF0000UL) ==
+               APCI1710_INCREMENTAL_COUNTER) {
+               for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) {
+             /*******************************/
+                       /* Test if incremental counter */
+             /*******************************/
+
+                       if ((devpriv->s_BoardInfos.
+                                       dw_MolduleConfiguration[b_ModulCpt] &
+                                       0xFFFF0000UL) ==
+                               APCI1710_INCREMENTAL_COUNTER) {
+                /*********************/
+                               /* Clear the counter */
+                /*********************/
+
+                               outl(1, devpriv->s_BoardInfos.
+                                       ui_Address + 16 + (64 * b_ModulCpt));
+                       }
+               }
+       } else {
+          /***************************/
+               /* No counter module found */
+          /***************************/
+
+               DPRINTK("No counter module found\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_SetInputFilter                        |
+|                                      (BYTE_ b_BoardHandle,                |
+|                                       BYTE_ b_Module,                     |
+|                                       BYTE_ b_PCIInputClock,              |
+|                                       BYTE_ b_Filter)                     |
++----------------------------------------------------------------------------+
+| Task              : Disable or enable the software filter from selected    |
+|                    module (b_ModulNbr). b_Filter determine the filter time|
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+|                    BYTE_  b_ModulNbr       : Number of the module to be   |
+|                                              configured (0 to 3)          |
+|                    BYTE_  b_PCIInputClock  : Selection of the PCI bus     |
+|                                              clock                        |
+|                                              - APCI1710_30MHZ :           |
+|                                                The PC has a PCI bus clock |
+|                                                of 30 MHz                  |
+|                                              - APCI1710_33MHZ :           |
+|                                                The PC has a PCI bus clock |
+|                                                of 33 MHz                  |
+|                                              - APCI1710_40MHZ :           |
+|                                                The APCI1710 has a 40MHz    |
+|                                                quartz                     |
+|                    BYTE_  b_Filter         : Filter selection             |
+|                                                                            |
+|                              30 MHz                                       |
+|                              ------                                       |
+|                                      0:  Software filter not used         |
+|                                      1:  Filter from 266ns  (3.750000MHz) |
+|                                      2:  Filter from 400ns  (2.500000MHz) |
+|                                      3:  Filter from 533ns  (1.876170MHz) |
+|                                      4:  Filter from 666ns  (1.501501MHz) |
+|                                      5:  Filter from 800ns  (1.250000MHz) |
+|                                      6:  Filter from 933ns  (1.071800MHz) |
+|                                      7:  Filter from 1066ns (0.938080MHz) |
+|                                      8:  Filter from 1200ns (0.833333MHz) |
+|                                      9:  Filter from 1333ns (0.750000MHz) |
+|                                      10: Filter from 1466ns (0.682100MHz) |
+|                                      11: Filter from 1600ns (0.625000MHz) |
+|                                      12: Filter from 1733ns (0.577777MHz) |
+|                                      13: Filter from 1866ns (0.535900MHz) |
+|                                      14: Filter from 2000ns (0.500000MHz) |
+|                                      15: Filter from 2133ns (0.468800MHz) |
+|                                                                           |
+|                              33 MHz                                       |
+|                              ------                                       |
+|                                      0:  Software filter not used         |
+|                                      1:  Filter from 242ns  (4.125000MHz) |
+|                                      2:  Filter from 363ns  (2.754820MHz) |
+|                                      3:  Filter from 484ns  (2.066115MHz) |
+|                                      4:  Filter from 605ns  (1.652892MHz) |
+|                                      5:  Filter from 726ns  (1.357741MHz) |
+|                                      6:  Filter from 847ns  (1.180637MHz) |
+|                                      7:  Filter from 968ns  (1.033055MHz) |
+|                                      8:  Filter from 1089ns (0.918273MHz) |
+|                                      9:  Filter from 1210ns (0.826446MHz) |
+|                                      10: Filter from 1331ns (0.751314MHz) |
+|                                      11: Filter from 1452ns (0.688705MHz) |
+|                                      12: Filter from 1573ns (0.635727MHz) |
+|                                      13: Filter from 1694ns (0.590318MHz) |
+|                                      14: Filter from 1815ns (0.550964MHz) |
+|                                      15: Filter from 1936ns (0.516528MHz) |
+|                                                                           |
+|                              40 MHz                                       |
+|                              ------                                       |
+|                                      0:  Software filter not used         |
+|                                      1:  Filter from 200ns  (5.000000MHz) |
+|                                      2:  Filter from 300ns  (3.333333MHz) |
+|                                      3:  Filter from 400ns  (2.500000MHz) |
+|                                      4:  Filter from 500ns  (2.000000MHz) |
+|                                      5:  Filter from 600ns  (1.666666MHz) |
+|                                      6:  Filter from 700ns  (1.428500MHz) |
+|                                      7:  Filter from 800ns  (1.250000MHz) |
+|                                      8:  Filter from 900ns  (1.111111MHz) |
+|                                      9:  Filter from 1000ns (1.000000MHz) |
+|                                      10: Filter from 1100ns (0.909090MHz) |
+|                                      11: Filter from 1200ns (0.833333MHz) |
+|                                      12: Filter from 1300ns (0.769200MHz) |
+|                                      13: Filter from 1400ns (0.714200MHz) |
+|                                      14: Filter from 1500ns (0.666666MHz) |
+|                                      15: Filter from 1600ns (0.625000MHz) |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: The selected module number is wrong                |
+|                     -3: The module is not a counter module                 |
+|                                        -4: The selected PCI input clock is wrong              |
+|                                        -5: The selected filter value is wrong                 |
+|                                        -6: 40MHz quartz not on board                          |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_SetInputFilter(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_PCIInputClock, BYTE b_Filter)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_Status = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if incremental counter */
+          /*******************************/
+
+               if ((devpriv->s_BoardInfos.
+                               dw_MolduleConfiguration[b_ModulNbr] &
+                               0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
+             /******************************/
+                       /* Test if firmware >= Rev1.5 */
+             /******************************/
+
+                       if ((devpriv->s_BoardInfos.
+                                       dw_MolduleConfiguration[b_ModulNbr] &
+                                       0xFFFF) >= 0x3135) {
+                /**************************/
+                               /* Test the PCI bus clock */
+                /**************************/
+
+                               if ((b_PCIInputClock == APCI1710_30MHZ) ||
+                                       (b_PCIInputClock == APCI1710_33MHZ) ||
+                                       (b_PCIInputClock == APCI1710_40MHZ)) {
+                   /*************************/
+                                       /* Test the filter value */
+                   /*************************/
+
+                                       if (b_Filter < 16) {
+                      /**********************/
+                                               /* Test if 40MHz used */
+                      /**********************/
+
+                                               if (b_PCIInputClock ==
+                                                       APCI1710_40MHZ) {
+                         /*********************************/
+                                                       /* Test if 40MHz quartz on board */
+                         /*********************************/
+
+                                                       dw_Status =
+                                                               inl(devpriv->
+                                                               s_BoardInfos.
+                                                               ui_Address +
+                                                               36 +
+                                                               (64 * b_ModulNbr));
+
+                         /******************************/
+                                                       /* Test the quartz flag (DQ0) */
+                         /******************************/
+
+                                                       if ((dw_Status & 1) !=
+                                                               1) {
+                            /*****************************/
+                                                               /* 40MHz quartz not on board */
+                            /*****************************/
+
+                                                               DPRINTK("40MHz quartz not on board\n");
+                                                               i_ReturnValue =
+                                                                       -6;
+                                                       }
+                                               }       // if (b_PCIInputClock == APCI1710_40MHZ)
+
+                      /***************************/
+                                               /* Test if error not occur */
+                      /***************************/
+
+                                               if (i_ReturnValue == 0) {
+                         /**********************/
+                                                       /* Test if 40MHz used */
+                         /**********************/
+
+                                                       if (b_PCIInputClock ==
+                                                               APCI1710_40MHZ)
+                                                       {
+                            /*********************************/
+                                                               /* Enable the 40MHz quarz (DQ31) */
+                            /*********************************/
+
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       |
+                                                                       APCI1710_ENABLE_40MHZ_FILTER;
+
+                                                       }       // if (b_PCIInputClock == APCI1710_40MHZ)
+                                                       else {
+                            /**********************************/
+                                                               /* Disable the 40MHz quarz (DQ31) */
+                            /**********************************/
+
+                                                               devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       =
+                                                                       devpriv->
+                                                                       s_ModuleInfo
+                                                                       [b_ModulNbr].
+                                                                       s_SiemensCounterInfo.
+                                                                       s_ModeRegister.
+                                                                       s_ByteModeRegister.
+                                                                       b_ModeRegister4
+                                                                       &
+                                                                       APCI1710_DISABLE_40MHZ_FILTER;
+
+                                                       }       // if (b_PCIInputClock == APCI1710_40MHZ)
+
+                         /************************/
+                                                       /* Set the filter value */
+                         /************************/
+
+                                                       devpriv->
+                                                               s_ModuleInfo
+                                                               [b_ModulNbr].
+                                                               s_SiemensCounterInfo.
+                                                               s_ModeRegister.
+                                                               s_ByteModeRegister.
+                                                               b_ModeRegister3
+                                                               =
+                                                               (devpriv->
+                                                               s_ModuleInfo
+                                                               [b_ModulNbr].
+                                                               s_SiemensCounterInfo.
+                                                               s_ModeRegister.
+                                                               s_ByteModeRegister.
+                                                               b_ModeRegister3
+                                                               & 0x1F) |
+                                                               ((b_Filter &
+                                                                       0x7) <<
+                                                               5);
+
+                                                       devpriv->
+                                                               s_ModuleInfo
+                                                               [b_ModulNbr].
+                                                               s_SiemensCounterInfo.
+                                                               s_ModeRegister.
+                                                               s_ByteModeRegister.
+                                                               b_ModeRegister4
+                                                               =
+                                                               (devpriv->
+                                                               s_ModuleInfo
+                                                               [b_ModulNbr].
+                                                               s_SiemensCounterInfo.
+                                                               s_ModeRegister.
+                                                               s_ByteModeRegister.
+                                                               b_ModeRegister4
+                                                               & 0xFE) |
+                                                               ((b_Filter &
+                                                                       0x8) >>
+                                                               3);
+
+                         /***************************/
+                                                       /* Write the configuration */
+                         /***************************/
+
+                                                       outl(devpriv->
+                                                               s_ModuleInfo
+                                                               [b_ModulNbr].
+                                                               s_SiemensCounterInfo.
+                                                               s_ModeRegister.
+                                                               dw_ModeRegister1_2_3_4,
+                                                               devpriv->
+                                                               s_BoardInfos.
+                                                               ui_Address +
+                                                               20 +
+                                                               (64 * b_ModulNbr));
+                                               }       // if (i_ReturnValue == 0)
+                                       }       // if (b_Filter < 16)
+                                       else {
+                      /**************************************/
+                                               /* The selected filter value is wrong */
+                      /**************************************/
+
+                                               DPRINTK("The selected filter value is wrong\n");
+                                               i_ReturnValue = -5;
+                                       }       // if (b_Filter < 16)
+                               }       // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ))
+                               else {
+                   /*****************************************/
+                                       /* The selected PCI input clock is wrong */
+                   /*****************************************/
+
+                                       DPRINTK("The selected PCI input clock is wrong\n");
+                                       i_ReturnValue = 4;
+                               }       // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ))
+                       } else {
+                /**************************************/
+                               /* The module is not a counter module */
+                /**************************************/
+
+                               DPRINTK("The module is not a counter module\n");
+                               i_ReturnValue = -3;
+                       }
+               } else {
+             /**************************************/
+                       /* The module is not a counter module */
+             /**************************************/
+
+                       DPRINTK("The module is not a counter module\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_LatchCounter (BYTE_ b_BoardHandle,    |
+|                                                    BYTE_ b_ModulNbr,       |
+|                                                    BYTE_ b_LatchReg)       |
++----------------------------------------------------------------------------+
+| Task              : Latch the courant value from selected module           |
+|                     (b_ModulNbr) in to the selected latch register         |
+|                     (b_LatchReg).                                          |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
+|                     BYTE_ b_ModulNbr    : Module number to configure       |
+|                                           (0 to 3)                         |
+|                     BYTE_ b_LatchReg    : Selected latch register          |
+|                               0 : for the first latch register             |
+|                               1 : for the second latch register            |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: The selected latch register parameter is wrong     |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_LatchCounter(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_LatchReg)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*************************************/
+                       /* Test the latch register parameter */
+             /*************************************/
+
+                       if (b_LatchReg < 2) {
+                /*********************/
+                               /* Tatch the counter */
+                /*********************/
+
+                               outl(1 << (b_LatchReg * 4),
+                                       devpriv->s_BoardInfos.ui_Address +
+                                       (64 * b_ModulNbr));
+                       } else {
+                /**************************************************/
+                               /* The selected latch register parameter is wrong */
+                /**************************************************/
+
+                               DPRINTK("The selected latch register parameter is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_    i_APCI1710_SetIndexAndReferenceSource        |
+|                                      (BYTE_ b_BoardHandle,                |
+|                                       BYTE_ b_ModulNbr,                   |
+|                                       BYTE_ b_SourceSelection)            |
++----------------------------------------------------------------------------+
+| Task              : Determine the hardware source for the index and the    |
+|                    reference logic. Per default the index logic is        |
+|                    connected to the difference input C and the reference  |
+|                    logic is connected to the 24V input E                  |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
+|                    BYTE_ b_SourceSelection : APCI1710_SOURCE_0 :          |
+|                                              The index logic is connected |
+|                                              to the difference input C and|
+|                                              the reference logic is       |
+|                                              connected to the 24V input E.|
+|                                              This is the default          |
+|                                              configuration.               |
+|                                              APCI1710_SOURCE_1 :          |
+|                                              The reference logic is       |
+|                                              connected to the difference  |
+|                                              input C and the index logic  |
+|                                              is connected to the 24V      |
+|                                              input E                      |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                    -2: The selected module number is wrong                |
+|                    -3: The module is not a counter module.                |
+|                    -4: The source selection is wrong                      |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_SetIndexAndReferenceSource(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_SourceSelection)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if incremental counter */
+          /*******************************/
+
+               if ((devpriv->s_BoardInfos.
+                               dw_MolduleConfiguration[b_ModulNbr] &
+                               0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
+             /******************************/
+                       /* Test if firmware >= Rev1.5 */
+             /******************************/
+
+                       if ((devpriv->s_BoardInfos.
+                                       dw_MolduleConfiguration[b_ModulNbr] &
+                                       0xFFFF) >= 0x3135) {
+                /*****************************/
+                               /* Test the source selection */
+                /*****************************/
+
+                               if (b_SourceSelection == APCI1710_SOURCE_0 ||
+                                       b_SourceSelection == APCI1710_SOURCE_1)
+                               {
+                   /******************************************/
+                                       /* Test if invert the index and reference */
+                   /******************************************/
+
+                                       if (b_SourceSelection ==
+                                               APCI1710_SOURCE_1) {
+                      /********************************************/
+                                               /* Invert index and reference source (DQ25) */
+                      /********************************************/
+
+                                               devpriv->
+                                                       s_ModuleInfo
+                                                       [b_ModulNbr].
+                                                       s_SiemensCounterInfo.
+                                                       s_ModeRegister.
+                                                       s_ByteModeRegister.
+                                                       b_ModeRegister4 =
+                                                       devpriv->
+                                                       s_ModuleInfo
+                                                       [b_ModulNbr].
+                                                       s_SiemensCounterInfo.
+                                                       s_ModeRegister.
+                                                       s_ByteModeRegister.
+                                                       b_ModeRegister4 |
+                                                       APCI1710_INVERT_INDEX_RFERENCE;
+                                       } else {
+                      /****************************************/
+                                               /* Set the default configuration (DQ25) */
+                      /****************************************/
+
+                                               devpriv->
+                                                       s_ModuleInfo
+                                                       [b_ModulNbr].
+                                                       s_SiemensCounterInfo.
+                                                       s_ModeRegister.
+                                                       s_ByteModeRegister.
+                                                       b_ModeRegister4 =
+                                                       devpriv->
+                                                       s_ModuleInfo
+                                                       [b_ModulNbr].
+                                                       s_SiemensCounterInfo.
+                                                       s_ModeRegister.
+                                                       s_ByteModeRegister.
+                                                       b_ModeRegister4 &
+                                                       APCI1710_DEFAULT_INDEX_RFERENCE;
+                                       }
+                               }       // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1)
+                               else {
+                   /*********************************/
+                                       /* The source selection is wrong */
+                   /*********************************/
+
+                                       DPRINTK("The source selection is wrong\n");
+                                       i_ReturnValue = -4;
+                               }       // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1)
+                       } else {
+                /**************************************/
+                               /* The module is not a counter module */
+                /**************************************/
+
+                               DPRINTK("The module is not a counter module\n");
+                               i_ReturnValue = -3;
+                       }
+               } else {
+             /**************************************/
+                       /* The module is not a counter module */
+             /**************************************/
+
+                       DPRINTK("The module is not a counter module\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /***************************************/
+               /* The selected module number is wrong */
+          /***************************************/
+
+               DPRINTK("The selected module number is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_    i_APCI1710_SetDigitalChlOn                   |
+|                                 (BYTE_  b_BoardHandle,                    |
+|                                  BYTE_  b_ModulNbr)                       |
++----------------------------------------------------------------------------+
+| Task              : Sets the digital output H Setting an output means      |
+|                    setting an ouput high.                                 |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+|                    BYTE_  b_ModulNbr       : Number of the module to be   |
+|                                              configured (0 to 3)          |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: The selected module number is wrong                |
+|                     -3: Counter not initialised see function               |
+|                        "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_SetDigitalChlOn(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+                       devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.
+                               b_ModeRegister3 = devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.b_ModeRegister3 | 0x10;
+
+             /*********************/
+                       /* Set the output On */
+             /*********************/
+
+                       outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
+                               ui_Address + 20 + (64 * b_ModulNbr));
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_    i_APCI1710_SetDigitalChlOff                  |
+|                                 (BYTE_  b_BoardHandle,                    |
+|                                  BYTE_  b_ModulNbr)                       |
++----------------------------------------------------------------------------+
+| Task              : Resets the digital output H. Resetting an output means |
+|                    setting an ouput low.                                  |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+|                    BYTE_  b_ModulNbr       : Number of the module to be   |
+|                                              configured (0 to 3)          |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: The selected module number is wrong                |
+|                     -3: Counter not initialised see function               |
+|                        "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_SetDigitalChlOff(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+                       devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.
+                               b_ModeRegister3 = devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.b_ModeRegister3 & 0xEF;
+
+             /**********************/
+                       /* Set the output Off */
+             /**********************/
+
+                       outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
+                               ui_Address + 20 + (64 * b_ModulNbr));
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*########################################################################### */
+
+                                                       // INSN WRITE
+/*########################################################################### */
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     :INT       i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
+struct comedi_insn *insn,unsigned int *data)                   |
++----------------------------------------------------------------------------+
+| Task              : Enable Disable functions for INC_CPT                                       |
++----------------------------------------------------------------------------+
+| Input Parameters  :
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :
++----------------------------------------------------------------------------+
+*/
+INT i_APCI1710_InsnWriteINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
+       struct comedi_insn * insn, unsigned int * data)
+{
+       UINT ui_WriteType;
+       INT i_ReturnValue = 0;
+
+       ui_WriteType = CR_CHAN(insn->chanspec);
+       devpriv->tsk_Current = current; // Save the current process task structure
+
+       switch (ui_WriteType) {
+       case APCI1710_INCCPT_ENABLELATCHINTERRUPT:
+               i_ReturnValue = i_APCI1710_EnableLatchInterrupt(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_DISABLELATCHINTERRUPT:
+               i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE:
+               i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev,
+                       (BYTE) CR_AREF(insn->chanspec),
+                       (BYTE) data[0], (UINT) data[1]);
+               break;
+
+       case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE:
+               i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (ULONG) data[0]);
+
+               break;
+
+       case APCI1710_INCCPT_ENABLEINDEX:
+               i_APCI1710_EnableIndex(dev, (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_DISABLEINDEX:
+               i_ReturnValue = i_APCI1710_DisableIndex(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_ENABLECOMPARELOGIC:
+               i_ReturnValue = i_APCI1710_EnableCompareLogic(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_DISABLECOMPARELOGIC:
+               i_ReturnValue = i_APCI1710_DisableCompareLogic(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT:
+               i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]);
+               break;
+
+       case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT:
+               i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev,
+                       (BYTE) CR_AREF(insn->chanspec));
+               break;
+
+       default:
+               printk("Write Config Parameter Wrong\n");
+       }
+
+       if (i_ReturnValue >= 0)
+               i_ReturnValue = insn->n;
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_EnableLatchInterrupt                  |
+|                               (BYTE_ b_BoardHandle,                        |
+|                                BYTE_ b_ModulNbr)                           |
++----------------------------------------------------------------------------+
+| Task              : Enable the latch interrupt from selected module        |
+|                     (b_ModulNbr). Each software or hardware latch occur a  |
+|                     interrupt.                                             |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
+|                     BYTE_ b_ModulNbr    : Module number to configure       |
+|                                           (0 to 3)                         |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Interrupt routine not installed see function       |
+|                         "i_APCI1710_SetBoardIntRoutine"                    |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_EnableLatchInterrupt(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+
+                /********************/
+                       /* Enable interrupt */
+                /********************/
+
+                       devpriv->s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.
+                               b_ModeRegister2 = devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.
+                               b_ModeRegister2 | APCI1710_ENABLE_LATCH_INT;
+
+                /***************************/
+                       /* Write the configuration */
+                /***************************/
+
+                       outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
+                               ui_Address + 20 + (64 * b_ModulNbr));
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_DisableLatchInterrupt                 |
+|                               (BYTE_ b_BoardHandle,                        |
+|                                BYTE_ b_ModulNbr)                           |
++----------------------------------------------------------------------------+
+| Task              : Disable the latch interrupt from selected module       |
+|                     (b_ModulNbr).                                          |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
+|                     BYTE_ b_ModulNbr    : Module number to configure       |
+|                                           (0 to 3)                         |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Interrupt routine not installed see function       |
+|                         "i_APCI1710_SetBoardIntRoutine"                    |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_DisableLatchInterrupt(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+
+                /***************************/
+                       /* Write the configuration */
+                /***************************/
+
+                       outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               dw_ModeRegister1_2_3_4 &
+                               ((APCI1710_DISABLE_LATCH_INT << 8) | 0xFF),
+                               devpriv->s_BoardInfos.ui_Address + 20 +
+                               (64 * b_ModulNbr));
+
+                       mdelay(1000);
+
+                /*********************/
+                       /* Disable interrupt */
+                /*********************/
+
+                       devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.
+                               b_ModeRegister2 = devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_ModeRegister.
+                               s_ByteModeRegister.
+                               b_ModeRegister2 & APCI1710_DISABLE_LATCH_INT;
+
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_Write16BitCounterValue                |
+|                                               (BYTE_  b_BoardHandle        |
+|                                                BYTE_  b_ModulNbr,          |
+|                                                BYTE_  b_SelectedCounter,   |
+|                                                UINT_ ui_WriteValue)        |
++----------------------------------------------------------------------------+
+| Task              : Write a 16-Bit value (ui_WriteValue) in to the selected|
+|                     16-Bit counter (b_SelectedCounter) from selected module|
+|                     (b_ModulNbr).                                          |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                              (0 to 3)                      |
+|                     BYTE_ b_SelectedCounter : Selected 16-Bit counter      |
+|                                               (0 or 1)                     |
+|                     UINT_ ui_WriteValue     : 16-Bit write value           |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: The selected 16-Bit counter parameter is wrong     |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_Write16BitCounterValue(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_SelectedCounter, UINT ui_WriteValue)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /******************************/
+                       /* Test the counter selection */
+             /******************************/
+
+                       if (b_SelectedCounter < 2) {
+                /*******************/
+                               /* Write the value */
+                /*******************/
+
+                               outl((ULONG) ((ULONG) (ui_WriteValue) << (16 *
+                                                       b_SelectedCounter)),
+                                       devpriv->s_BoardInfos.ui_Address + 8 +
+                                       (b_SelectedCounter * 4) +
+                                       (64 * b_ModulNbr));
+                       } else {
+                /**************************************************/
+                               /* The selected 16-Bit counter parameter is wrong */
+                /**************************************************/
+
+                               DPRINTK("The selected 16-Bit counter parameter is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_Write32BitCounterValue                |
+|                                               (BYTE_   b_BoardHandle       |
+|                                                BYTE_   b_ModulNbr,         |
+|                                                ULONG_ ul_WriteValue)       |
++----------------------------------------------------------------------------+
+| Task              : Write a 32-Bit value (ui_WriteValue) in to the selected|
+|                     module (b_ModulNbr).                                   |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                              (0 to 3)                      |
+|                     ULONG_ ul_WriteValue    : 32-Bit write value           |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_Write32BitCounterValue(struct comedi_device * dev,
+       BYTE b_ModulNbr, ULONG ul_WriteValue)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*******************/
+                       /* Write the value */
+             /*******************/
+
+                       outl(ul_WriteValue, devpriv->s_BoardInfos.
+                               ui_Address + 4 + (64 * b_ModulNbr));
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_EnableIndex (BYTE_  b_BoardHandle,    |
+|                                                   BYTE_  b_ModulNbr)       |
++----------------------------------------------------------------------------+
+| Task              : Enable the INDEX actions                               |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Index not initialised see function                 |
+|                         "i_APCI1710_InitIndex"                             |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_EnableIndex(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+       ULONG ul_InterruptLatchReg;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*****************************/
+                       /* Test if index initialised */
+             /*****************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister2 = devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister2 | APCI1710_ENABLE_INDEX;
+
+                               ul_InterruptLatchReg =
+                                       inl(devpriv->s_BoardInfos.ui_Address +
+                                       24 + (64 * b_ModulNbr));
+
+                               outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       dw_ModeRegister1_2_3_4,
+                                       devpriv->s_BoardInfos.ui_Address + 20 +
+                                       (64 * b_ModulNbr));
+                       } else {
+                /*************************************************************/
+                               /* Index not initialised see function "i_APCI1710_InitIndex" */
+                /*************************************************************/
+
+                               DPRINTK("Index not initialised \n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_DisableIndex (BYTE_  b_BoardHandle,   |
+|                                                    BYTE_  b_ModulNbr)      |
++----------------------------------------------------------------------------+
+| Task              : Disable the INDEX actions                              |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Index not initialised see function                 |
+|                         "i_APCI1710_InitIndex"                             |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_DisableIndex(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*****************************/
+                       /* Test if index initialised */
+             /*****************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister2 = devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister2 &
+                                       APCI1710_DISABLE_INDEX;
+
+                               outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       dw_ModeRegister1_2_3_4,
+                                       devpriv->s_BoardInfos.ui_Address + 20 +
+                                       (64 * b_ModulNbr));
+                       } else {
+                /*************************************************************/
+                               /* Index not initialised see function "i_APCI1710_InitIndex" */
+                /*************************************************************/
+
+                               DPRINTK("Index not initialised  \n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_EnableCompareLogic                    |
+|                               (BYTE_   b_BoardHandle,                      |
+|                                BYTE_   b_ModulNbr)                         |
++----------------------------------------------------------------------------+
+| Task              : Enable the 32-Bit compare logic. At that moment that   |
+|                     the incremental counter arrive to the compare value a  |
+|                     interrupt is generated.                                |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+|                     BYTE_  b_ModulNbr       : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : -
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Compare logic not initialised.                     |
+|                         See function "i_APCI1710_InitCompareLogic"         |
+|                     -5: Interrupt function not initialised.                |
+|                         See function "i_APCI1710_SetBoardIntRoutineX"      |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_EnableCompareLogic(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*************************************/
+                       /* Test if compare logic initialised */
+             /*************************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_CompareLogicInit == 1) {
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister3 = devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister3 |
+                                       APCI1710_ENABLE_COMPARE_INT;
+
+                   /***************************/
+                               /* Write the configuration */
+                   /***************************/
+
+                               outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       dw_ModeRegister1_2_3_4,
+                                       devpriv->s_BoardInfos.ui_Address + 20 +
+                                       (64 * b_ModulNbr));
+                       } else {
+                /*********************************/
+                               /* Compare logic not initialised */
+                /*********************************/
+
+                               DPRINTK("Compare logic not initialised\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_DisableCompareLogic                   |
+|                               (BYTE_   b_BoardHandle,                      |
+|                                BYTE_   b_ModulNbr)                         |
++----------------------------------------------------------------------------+
+| Task              : Disable the 32-Bit compare logic.
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+|                     BYTE_  b_ModulNbr       : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : -
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Compare logic not initialised.                     |
+|                         See function "i_APCI1710_InitCompareLogic"         |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_DisableCompareLogic(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*************************************/
+                       /* Test if compare logic initialised */
+             /*************************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_CompareLogicInit == 1) {
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister3 = devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister3 &
+                                       APCI1710_DISABLE_COMPARE_INT;
+
+                /***************************/
+                               /* Write the configuration */
+                /***************************/
+
+                               outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       dw_ModeRegister1_2_3_4,
+                                       devpriv->s_BoardInfos.ui_Address + 20 +
+                                       (64 * b_ModulNbr));
+                       } else {
+                /*********************************/
+                               /* Compare logic not initialised */
+                /*********************************/
+
+                               DPRINTK("Compare logic not initialised\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+       /*
+          +----------------------------------------------------------------------------+
+          | Function Name     : _INT_ i_APCI1710_EnableFrequencyMeasurement            |
+          |                            (BYTE_   b_BoardHandle,                      |
+          |                             BYTE_   b_ModulNbr,                         |
+          |                             BYTE_   b_InterruptEnable)                  |
+          +----------------------------------------------------------------------------+
+          | Task              : Enables the frequency measurement function             |
+          +----------------------------------------------------------------------------+
+          | Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+          |                  BYTE_  b_ModulNbr       : Number of the module to be   |
+          |                                            configured (0 to 3)          |
+          |                  BYTE_  b_InterruptEnable: Enable or disable the        |
+          |                                            interrupt.                   |
+          |                                            APCI1710_ENABLE:             |
+          |                                            Enable the interrupt         |
+          |                                            APCI1710_DISABLE:            |
+          |                                            Disable the interrupt        |
+          +----------------------------------------------------------------------------+
+          | Output Parameters : -                                                      |
+          +----------------------------------------------------------------------------+
+          | Return Value      :  0: No error                                           |
+          |                     -1: The handle parameter of the board is wrong         |
+          |                     -2: The selected module number is wrong                |
+          |                     -3: Counter not initialised see function               |
+          |                      "i_APCI1710_InitCounter"                           |
+          |                     -4: Frequency measurement logic not initialised.       |
+          |                      See function "i_APCI1710_InitFrequencyMeasurement" |
+          |                     -5: Interrupt parameter is wrong                       |
+          |                     -6: Interrupt function not initialised.                |
+          +----------------------------------------------------------------------------+
+        */
+
+INT i_APCI1710_EnableFrequencyMeasurement(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_InterruptEnable)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /********************************************/
+                       /* Test if frequency mesurement initialised */
+             /********************************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_FrequencyMeasurementInit == 1) {
+                /***************************/
+                               /* Test the interrupt mode */
+                /***************************/
+
+                               if ((b_InterruptEnable == APCI1710_DISABLE) ||
+                                       (b_InterruptEnable == APCI1710_ENABLE))
+                               {
+
+                      /************************************/
+                                       /* Enable the frequency measurement */
+                      /************************************/
+
+                                       devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister3 = devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister3 |
+                                               APCI1710_ENABLE_FREQUENCY;
+
+                      /*********************************************/
+                                       /* Disable or enable the frequency interrupt */
+                      /*********************************************/
+
+                                       devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister3 = (devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               s_ByteModeRegister.
+                                               b_ModeRegister3 &
+                                               APCI1710_DISABLE_FREQUENCY_INT)
+                                               | (b_InterruptEnable << 3);
+
+                      /***************************/
+                                       /* Write the configuration */
+                      /***************************/
+
+                                       outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_ModeRegister.
+                                               dw_ModeRegister1_2_3_4,
+                                               devpriv->s_BoardInfos.
+                                               ui_Address + 20 +
+                                               (64 * b_ModulNbr));
+
+                                       devpriv->
+                                               s_ModuleInfo[b_ModulNbr].
+                                               s_SiemensCounterInfo.
+                                               s_InitFlag.
+                                               b_FrequencyMeasurementEnable =
+                                               1;
+                               } else {
+                   /********************************/
+                                       /* Interrupt parameter is wrong */
+                   /********************************/
+
+                                       DPRINTK("Interrupt parameter is wrong\n");
+                                       i_ReturnValue = -5;
+                               }
+                       } else {
+                /***********************************************/
+                               /* Frequency measurement logic not initialised */
+                /***********************************************/
+
+                               DPRINTK("Frequency measurement logic not initialised\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+       /*
+          +----------------------------------------------------------------------------+
+          | Function Name     : _INT_ i_APCI1710_DisableFrequencyMeasurement           |
+          |                            (BYTE_   b_BoardHandle,                      |
+          |                             BYTE_   b_ModulNbr)                         |
+          +----------------------------------------------------------------------------+
+          | Task              : Disables the frequency measurement function             |
+          +----------------------------------------------------------------------------+
+          | Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+          |                  BYTE_  b_ModulNbr       : Number of the module to be   |
+          |                                            configured (0 to 3)          |
+          +----------------------------------------------------------------------------+
+          | Output Parameters : -                                                      |
+          +----------------------------------------------------------------------------+
+          | Return Value      :  0: No error                                           |
+          |                     -1: The handle parameter of the board is wrong         |
+          |                     -2: The selected module number is wrong                |
+          |                     -3: Counter not initialised see function               |
+          |                      "i_APCI1710_InitCounter"                           |
+          |                     -4: Frequency measurement logic not initialised.       |
+          |                      See function "i_APCI1710_InitFrequencyMeasurement" |
+          +----------------------------------------------------------------------------+
+        */
+
+INT i_APCI1710_DisableFrequencyMeasurement(struct comedi_device * dev, BYTE b_ModulNbr)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /********************************************/
+                       /* Test if frequency mesurement initialised */
+             /********************************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_FrequencyMeasurementInit == 1) {
+                /*************************************/
+                               /* Disable the frequency measurement */
+                /*************************************/
+
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister3 = devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister3 &
+                                       APCI1710_DISABLE_FREQUENCY
+                                       // Begin CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared
+                                       & APCI1710_DISABLE_FREQUENCY_INT;
+                               // End CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared
+
+                /***************************/
+                               /* Write the configuration */
+                /***************************/
+
+                               outl(devpriv->s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       dw_ModeRegister1_2_3_4,
+                                       devpriv->s_BoardInfos.ui_Address + 20 +
+                                       (64 * b_ModulNbr));
+
+                /*************************************/
+                               /* Disable the frequency measurement */
+                /*************************************/
+
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_InitFlag.
+                                       b_FrequencyMeasurementEnable = 0;
+                       } else {
+                /***********************************************/
+                               /* Frequency measurement logic not initialised */
+                /***********************************************/
+
+                               DPRINTK("Frequency measurement logic not initialised\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*########################################################################### */
+
+                                                       // INSN READ
+
+/*########################################################################### */
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     :INT       i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
+struct comedi_insn *insn,unsigned int *data)                   |
++----------------------------------------------------------------------------+
+| Task              : Read and Get functions for INC_CPT                                       |
++----------------------------------------------------------------------------+
+| Input Parameters  :
++----------------------------------------------------------------------------+
+| Output Parameters : -                                                      |
++----------------------------------------------------------------------------+
+| Return Value      :
++----------------------------------------------------------------------------+
+*/
+INT i_APCI1710_InsnReadINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
+       struct comedi_insn * insn, unsigned int * data)
+{
+       UINT ui_ReadType;
+       INT i_ReturnValue = 0;
+
+       ui_ReadType = CR_CHAN(insn->chanspec);
+
+       devpriv->tsk_Current = current; // Save the current process task structure
+       switch (ui_ReadType) {
+       case APCI1710_INCCPT_READLATCHREGISTERSTATUS:
+               i_ReturnValue = i_APCI1710_ReadLatchRegisterStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec),
+                       (BYTE) CR_RANGE(insn->chanspec), (PBYTE) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_READLATCHREGISTERVALUE:
+               i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev,
+                       (BYTE) CR_AREF(insn->chanspec),
+                       (BYTE) CR_RANGE(insn->chanspec), (PULONG) & data[0]);
+               printk("Latch Register Value %d\n", data[0]);
+               break;
+
+       case APCI1710_INCCPT_READ16BITCOUNTERVALUE:
+               i_ReturnValue = i_APCI1710_Read16BitCounterValue(dev,
+                       (BYTE) CR_AREF(insn->chanspec),
+                       (BYTE) CR_RANGE(insn->chanspec), (PUINT) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_READ32BITCOUNTERVALUE:
+               i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (PULONG) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_GETINDEXSTATUS:
+               i_ReturnValue = i_APCI1710_GetIndexStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_GETREFERENCESTATUS:
+               i_ReturnValue = i_APCI1710_GetReferenceStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_GETUASSTATUS:
+               i_ReturnValue = i_APCI1710_GetUASStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_GETCBSTATUS:
+               i_ReturnValue = i_APCI1710_GetCBStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_GET16BITCBSTATUS:
+               i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec),
+                       (PBYTE) & data[0], (PBYTE) & data[1]);
+               break;
+
+       case APCI1710_INCCPT_GETUDSTATUS:
+               i_ReturnValue = i_APCI1710_GetUDStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
+
+               break;
+
+       case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS:
+               i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev,
+                       (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
+               break;
+
+       case APCI1710_INCCPT_READFREQUENCYMEASUREMENT:
+               i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev,
+                       (BYTE) CR_AREF(insn->chanspec),
+                       (PBYTE) & data[0],
+                       (PBYTE) & data[1], (PULONG) & data[2]);
+               break;
+
+       case APCI1710_INCCPT_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;
+
+               break;
+
+       default:
+               printk("ReadType Parameter wrong\n");
+       }
+
+       if (i_ReturnValue >= 0)
+               i_ReturnValue = insn->n;
+       return (i_ReturnValue);
+
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_ReadLatchRegisterStatus               |
+|                                                   (BYTE_   b_BoardHandle,  |
+|                                                    BYTE_   b_ModulNbr,     |
+|                                                    BYTE_   b_LatchReg,     |
+|                                                    PBYTE_ pb_LatchStatus)  |
++----------------------------------------------------------------------------+
+| Task              : Read the latch register status from selected module    |
+|                     (b_ModulNbr) and selected latch register (b_LatchReg). |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
+|                     BYTE_ b_ModulNbr    : Module number to configure       |
+|                                           (0 to 3)                         |
+|                     BYTE_ b_LatchReg    : Selected latch register          |
+|                               0 : for the first latch register             |
+|                               1 : for the second latch register            |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_LatchStatus :   Latch register status.       |
+|                                               0 : No latch occur           |
+|                                               1 : A software latch occur   |
+|                                               2 : A hardware latch occur   |
+|                                               3 : A software and hardware  |
+|                                                   latch occur              |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: The selected latch register parameter is wrong     |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_ReadLatchRegisterStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_LatchReg, PBYTE pb_LatchStatus)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_LatchReg;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*************************************/
+                       /* Test the latch register parameter */
+             /*************************************/
+
+                       if (b_LatchReg < 2) {
+                               dw_LatchReg = inl(devpriv->s_BoardInfos.
+                                       ui_Address + (64 * b_ModulNbr));
+
+                               *pb_LatchStatus =
+                                       (BYTE) ((dw_LatchReg >> (b_LatchReg *
+                                                       4)) & 0x3);
+                       } else {
+                /**************************************************/
+                               /* The selected latch register parameter is wrong */
+                /**************************************************/
+
+                               DPRINTK("The selected latch register parameter is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_ReadLatchRegisterValue                |
+|                                                   (BYTE_     b_BoardHandle,|
+|                                                    BYTE_     b_ModulNbr,   |
+|                                                    BYTE_     b_LatchReg,   |
+|                                                    PULONG_ pul_LatchValue) |
++----------------------------------------------------------------------------+
+| Task              : Read the latch register value from selected module     |
+|                     (b_ModulNbr) and selected latch register (b_LatchReg). |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
+|                     BYTE_ b_ModulNbr    : Module number to configure       |
+|                                           (0 to 3)                         |
+|                     BYTE_ b_LatchReg    : Selected latch register          |
+|                               0 : for the first latch register             |
+|                               1 : for the second latch register            |
++----------------------------------------------------------------------------+
+| Output Parameters : PULONG_ pul_LatchValue : Latch register value          |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: The selected latch register parameter is wrong     |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_ReadLatchRegisterValue(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_LatchReg, PULONG pul_LatchValue)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*************************************/
+                       /* Test the latch register parameter */
+             /*************************************/
+
+                       if (b_LatchReg < 2) {
+                               *pul_LatchValue = inl(devpriv->s_BoardInfos.
+                                       ui_Address + ((b_LatchReg + 1) * 4) +
+                                       (64 * b_ModulNbr));
+
+                       } else {
+                /**************************************************/
+                               /* The selected latch register parameter is wrong */
+                /**************************************************/
+
+                               DPRINTK("The selected latch register parameter is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_Read16BitCounterValue                 |
+|                                       (BYTE_     b_BoardHandle,            |
+|                                        BYTE_     b_ModulNbr,               |
+|                                        BYTE_     b_SelectedCounter,        |
+|                                        PUINT_   pui_CounterValue)          |
++----------------------------------------------------------------------------+
+| Task              : Latch the selected 16-Bit counter (b_SelectedCounter)  |
+|                     from selected module (b_ModulNbr) in to the first      |
+|                     latch register and return the latched value.           |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                              (0 to 3)                      |
+|                     BYTE_ b_SelectedCounter : Selected 16-Bit counter      |
+|                                               (0 or 1)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PUINT_ pui_CounterValue : 16-Bit counter value         |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: The selected 16-Bit counter parameter is wrong     |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_Read16BitCounterValue(struct comedi_device * dev,
+       BYTE b_ModulNbr, BYTE b_SelectedCounter, PUINT pui_CounterValue)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_LathchValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /******************************/
+                       /* Test the counter selection */
+             /******************************/
+
+                       if (b_SelectedCounter < 2) {
+                /*********************/
+                               /* Latch the counter */
+                /*********************/
+
+                               outl(1, devpriv->s_BoardInfos.
+                                       ui_Address + (64 * b_ModulNbr));
+
+                /************************/
+                               /* Read the latch value */
+                /************************/
+
+                               dw_LathchValue = inl(devpriv->s_BoardInfos.
+                                       ui_Address + 4 + (64 * b_ModulNbr));
+
+                               *pui_CounterValue =
+                                       (UINT) ((dw_LathchValue >> (16 *
+                                                       b_SelectedCounter)) &
+                                       0xFFFFU);
+                       } else {
+                /**************************************************/
+                               /* The selected 16-Bit counter parameter is wrong */
+                /**************************************************/
+
+                               DPRINTK("The selected 16-Bit counter parameter is wrong\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_Read32BitCounterValue                 |
+|                                       (BYTE_     b_BoardHandle,            |
+|                                        BYTE_     b_ModulNbr,               |
+|                                        PULONG_ pul_CounterValue)           |
++----------------------------------------------------------------------------+
+| Task              : Latch the 32-Bit counter from selected module          |
+|                     (b_ModulNbr) in to the first latch register and return |
+|                     the latched value.                                     |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                              (0 to 3)                      |
++----------------------------------------------------------------------------+
+| Output Parameters : PULONG_  pul_CounterValue : 32-Bit counter value       |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_Read32BitCounterValue(struct comedi_device * dev,
+       BYTE b_ModulNbr, PULONG pul_CounterValue)
+{
+       INT i_ReturnValue = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*********************/
+                       /* Tatch the counter */
+             /*********************/
+
+                       outl(1, devpriv->s_BoardInfos.
+                               ui_Address + (64 * b_ModulNbr));
+
+             /************************/
+                       /* Read the latch value */
+             /************************/
+
+                       *pul_CounterValue = inl(devpriv->s_BoardInfos.
+                               ui_Address + 4 + (64 * b_ModulNbr));
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_GetIndexStatus (BYTE_   b_BoardHandle,|
+|                                                      BYTE_   b_ModulNbr,   |
+|                                                      PBYTE_ pb_IndexStatus)|
++----------------------------------------------------------------------------+
+| Task              : Return the index status                                |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_IndexStatus   : 0 : No INDEX occur           |
+|                                               1 : A INDEX occur            |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Index not initialised see function                 |
+|                         "i_APCI1710_InitIndex"                             |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_GetIndexStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, PBYTE pb_IndexStatus)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_StatusReg = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*****************************/
+                       /* Test if index initialised */
+             /*****************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
+                               dw_StatusReg = inl(devpriv->s_BoardInfos.
+                                       ui_Address + 12 + (64 * b_ModulNbr));
+
+                               *pb_IndexStatus = (BYTE) (dw_StatusReg & 1);
+                       } else {
+                /*************************************************************/
+                               /* Index not initialised see function "i_APCI1710_InitIndex" */
+                /*************************************************************/
+
+                               DPRINTK("Index not initialised\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_GetReferenceStatus                    |
+|                                                (BYTE_   b_BoardHandle,     |
+|                                                 BYTE_   b_ModulNbr,        |
+|                                                 PBYTE_ pb_ReferenceStatus) |
++----------------------------------------------------------------------------+
+| Task              : Return the reference status                            |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_ReferenceStatus   : 0 : No REFERENCE occur   |
+|                                                   1 : A REFERENCE occur    |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Reference not initialised see function             |
+|                         "i_APCI1710_InitReference"                         |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_GetReferenceStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, PBYTE pb_ReferenceStatus)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_StatusReg = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*********************************/
+                       /* Test if reference initialised */
+             /*********************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_ReferenceInit) {
+                               dw_StatusReg = inl(devpriv->s_BoardInfos.
+                                       ui_Address + 24 + (64 * b_ModulNbr));
+
+                               *pb_ReferenceStatus =
+                                       (BYTE) (~dw_StatusReg & 1);
+                       } else {
+                /*********************************************************************/
+                               /* Reference not initialised see function "i_APCI1710_InitReference" */
+                /*********************************************************************/
+
+                               DPRINTK("Reference not initialised\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_GetUASStatus                          |
+|                               (BYTE_   b_BoardHandle,                      |
+|                                BYTE_   b_ModulNbr,                         |
+|                                PBYTE_ pb_UASStatus)                        |
++----------------------------------------------------------------------------+
+| Task              : Return the error signal (UAS) status                   |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_UASStatus      : 0 : UAS is low "0"          |
+|                                                1 : UAS is high "1"         |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_GetUASStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, PBYTE pb_UASStatus)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_StatusReg = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+                       dw_StatusReg = inl(devpriv->s_BoardInfos.
+                               ui_Address + 24 + (64 * b_ModulNbr));
+
+                       *pb_UASStatus = (BYTE) ((dw_StatusReg >> 1) & 1);
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_GetCBStatus                           |
+|                               (BYTE_   b_BoardHandle,                      |
+|                                BYTE_   b_ModulNbr,                         |
+|                                PBYTE_ pb_CBStatus)                         |
++----------------------------------------------------------------------------+
+| Task              : Return the counter overflow status                     |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_CBStatus      : 0 : Counter no overflow      |
+|                                               1 : Counter overflow         |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_GetCBStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, PBYTE pb_CBStatus)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_StatusReg = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+                       dw_StatusReg = inl(devpriv->s_BoardInfos.
+                               ui_Address + 16 + (64 * b_ModulNbr));
+
+                       *pb_CBStatus = (BYTE) (dw_StatusReg & 1);
+
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_Get16BitCBStatus                      |
+|                                      (BYTE_     b_BoardHandle,            |
+|                                       BYTE_     b_ModulNbr,               |
+|                                       PBYTE_ pb_CBStatusCounter0,         |
+|                                       PBYTE_ pb_CBStatusCounter1)         |
++----------------------------------------------------------------------------+
+| Task              : Returns the counter overflow (counter initialised to   |
+|                    2*16-bit) status from selected incremental counter     |
+|                    module                                                 |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_CBStatusCounter0 : 0 : No overflow occur for |
+|                                                     the first 16-bit      |
+|                                                     counter               |
+|                                                 1 : Overflow occur for the|
+|                                                     first 16-bit counter  |
+|                    PBYTE_ pb_CBStatusCounter1 : 0 : No overflow occur for |
+|                                                     the second 16-bit     |
+|                                                     counter               |
+|                                                 1 : Overflow occur for the|
+|                                                     second 16-bit counter |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Counter not initialised to 2*16-bit mode.          |
+|                        See function "i_APCI1710_InitCounter"              |
+|                     -5: Firmware revision error                            |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_Get16BitCBStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, PBYTE pb_CBStatusCounter0, PBYTE pb_CBStatusCounter1)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_StatusReg = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /*************************/
+                       /* Test if 2*16-Bit mode */
+             /*************************/
+
+                       if ((devpriv->s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_ModeRegister.
+                                       s_ByteModeRegister.
+                                       b_ModeRegister1 & 0x10) == 0x10) {
+                /*****************************/
+                               /* Test the Firmware version */
+                /*****************************/
+
+                               if ((devpriv->s_BoardInfos.
+                                               dw_MolduleConfiguration
+                                               [b_ModulNbr] & 0xFFFF) >=
+                                       0x3136) {
+                                       dw_StatusReg =
+                                               inl(devpriv->s_BoardInfos.
+                                               ui_Address + 16 +
+                                               (64 * b_ModulNbr));
+
+                                       *pb_CBStatusCounter1 =
+                                               (BYTE) ((dw_StatusReg >> 0) &
+                                               1);
+                                       *pb_CBStatusCounter0 =
+                                               (BYTE) ((dw_StatusReg >> 1) &
+                                               1);
+                               }       // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136)
+                               else {
+                   /****************************/
+                                       /* Firmware revision error  */
+                   /****************************/
+
+                                       i_ReturnValue = -5;
+                               }       // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136)
+                       }       // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10)
+                       else {
+                /********************************************/
+                               /* Counter not initialised to 2*16-bit mode */
+                               /* "i_APCI1710_InitCounter"                 */
+                /********************************************/
+
+                               DPRINTK("Counter not initialised\n");
+                               i_ReturnValue = -4;
+                       }       // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10)
+               }               // if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1)
+               else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }               // if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1)
+       }                       // if (b_ModulNbr < 4)
+       else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }                       // if (b_ModulNbr < 4)
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_GetUDStatus                           |
+|                               (BYTE_   b_BoardHandle,                      |
+|                                BYTE_   b_ModulNbr,                         |
+|                                PBYTE_ pb_UDStatus)                         |
++----------------------------------------------------------------------------+
+| Task              : Return the counter progress status                     |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_UDStatus      : 0 : Counter progress in the  |
+|                                                   selected mode down       |
+|                                               1 : Counter progress in the  |
+|                                                   selected mode up         |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_GetUDStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, PBYTE pb_UDStatus)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_StatusReg = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+                       dw_StatusReg = inl(devpriv->s_BoardInfos.
+                               ui_Address + 24 + (64 * b_ModulNbr));
+
+                       *pb_UDStatus = (BYTE) ((dw_StatusReg >> 2) & 1);
+
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+/*
++----------------------------------------------------------------------------+
+| Function Name     : _INT_ i_APCI1710_GetInterruptUDLatchedStatus           |
+|                               (BYTE_   b_BoardHandle,                      |
+|                                BYTE_   b_ModulNbr,                         |
+|                                PBYTE_ pb_UDStatus)                         |
++----------------------------------------------------------------------------+
+| Task              : Return the counter progress latched status after a     |
+|                     index interrupt occur.                                 |
++----------------------------------------------------------------------------+
+| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
+|                     BYTE_ b_ModulNbr        : Module number to configure   |
+|                                               (0 to 3)                     |
++----------------------------------------------------------------------------+
+| Output Parameters : PBYTE_ pb_UDStatus      : 0 : Counter progress in the  |
+|                                                   selected mode down       |
+|                                               1 : Counter progress in the  |
+|                                                   selected mode up         |
+|                                               2 : No index interrupt occur |
++----------------------------------------------------------------------------+
+| Return Value      :  0: No error                                           |
+|                     -1: The handle parameter of the board is wrong         |
+|                     -2: No counter module found                            |
+|                     -3: Counter not initialised see function               |
+|                         "i_APCI1710_InitCounter"                           |
+|                     -4: Interrupt function not initialised.                |
+|                         See function "i_APCI1710_SetBoardIntRoutineX"      |
++----------------------------------------------------------------------------+
+*/
+
+INT i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device * dev,
+       BYTE b_ModulNbr, PBYTE pb_UDStatus)
+{
+       INT i_ReturnValue = 0;
+       DWORD dw_StatusReg = 0;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+                /*********************************/
+                       /* Test if index interrupt occur */
+                /*********************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_IndexInterruptOccur == 1) {
+                               devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_InitFlag.b_IndexInterruptOccur = 0;
+
+                               dw_StatusReg = inl(devpriv->s_BoardInfos.
+                                       ui_Address + 12 + (64 * b_ModulNbr));
+
+                               *pb_UDStatus = (BYTE) ((dw_StatusReg >> 1) & 1);
+                       } else {
+                   /****************************/
+                               /* No index interrupt occur */
+                   /****************************/
+
+                               *pb_UDStatus = 2;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}
+
+       /*
+          +----------------------------------------------------------------------------+
+          | Function Name     : _INT_ i_APCI1710_ReadFrequencyMeasurement              |
+          |                            (BYTE_            b_BoardHandle,             |
+          |                             BYTE_            b_ModulNbr,                |
+          |                             PBYTE_          pb_Status,                  |
+          |                             PULONG_        pul_ReadValue)               |
+          +----------------------------------------------------------------------------+
+          | Task              : Returns the status (pb_Status) and the number of       |
+          |                  increments in the set time.                            |
+          |                  See function " i_APCI1710_InitFrequencyMeasurement "   |
+          +----------------------------------------------------------------------------+
+          | Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
+          |                  BYTE_  b_ModulNbr       : Number of the module to be   |
+          |                                            configured (0 to 3)          |
+          +----------------------------------------------------------------------------+
+          | Output Parameters : PBYTE_ pb_Status     : Returns the frequency        |
+          |                                            measurement status           |
+          |                                            0 : Counting cycle not       |
+          |                                                started.                 |
+          |                                            1 : Counting cycle started.  |
+          |                                            2 : Counting cycle stopped.  |
+          |                                                The measurement cycle is |
+          |                                                completed.               |
+          |                  PBYTE_ pb_UDStatus      : 0 : Counter progress in the  |
+          |                                                   selected mode down       |
+          |                                               1 : Counter progress in the  |
+          |                                                   selected mode up         |
+          |                  PULONG_ pul_ReadValue   : Return the number of         |
+          |                                            increments in the defined    |
+          |                                            time base.                   |
+          +----------------------------------------------------------------------------+
+          | Return Value      :  0: No error                                           |
+          |                     -1: The handle parameter of the board is wrong         |
+          |                     -2: The selected module number is wrong                |
+          |                     -3: Counter not initialised see function               |
+          |                      "i_APCI1710_InitCounter"                           |
+          |                     -4: Frequency measurement logic not initialised.       |
+          |                      See function "i_APCI1710_InitFrequencyMeasurement" |
+          +----------------------------------------------------------------------------+
+        */
+
+INT i_APCI1710_ReadFrequencyMeasurement(struct comedi_device * dev,
+       BYTE b_ModulNbr,
+       PBYTE pb_Status, PBYTE pb_UDStatus, PULONG pul_ReadValue)
+{
+       INT i_ReturnValue = 0;
+       UINT ui_16BitValue;
+       DWORD dw_StatusReg;
+
+       /**************************/
+       /* Test the module number */
+       /**************************/
+
+       if (b_ModulNbr < 4) {
+          /*******************************/
+               /* Test if counter initialised */
+          /*******************************/
+
+               if (devpriv->
+                       s_ModuleInfo[b_ModulNbr].
+                       s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
+             /********************************************/
+                       /* Test if frequency mesurement initialised */
+             /********************************************/
+
+                       if (devpriv->
+                               s_ModuleInfo[b_ModulNbr].
+                               s_SiemensCounterInfo.
+                               s_InitFlag.b_FrequencyMeasurementInit == 1) {
+                /******************/
+                               /* Test if enable */
+                /******************/
+
+                               if (devpriv->
+                                       s_ModuleInfo[b_ModulNbr].
+                                       s_SiemensCounterInfo.
+                                       s_InitFlag.
+                                       b_FrequencyMeasurementEnable == 1) {
+                   /*******************/
+                                       /* Read the status */
+                   /*******************/
+
+                                       dw_StatusReg =
+                                               inl(devpriv->s_BoardInfos.
+                                               ui_Address + 32 +
+                                               (64 * b_ModulNbr));
+
+                   /**************************/
+                                       /* Test if frequency stop */
+                   /**************************/
+
+                                       if (dw_StatusReg & 1) {
+                                               *pb_Status = 2;
+                                               *pb_UDStatus =
+                                                       (BYTE) ((dw_StatusReg >>
+                                                               1) & 3);
+
+                      /******************/
+                                               /* Read the value */
+                      /******************/
+
+                                               *pul_ReadValue =
+                                                       inl(devpriv->
+                                                       s_BoardInfos.
+                                                       ui_Address + 28 +
+                                                       (64 * b_ModulNbr));
+
+                                               if (*pb_UDStatus == 0) {
+                         /*************************/
+                                                       /* Test the counter mode */
+                         /*************************/
+
+                                                       if ((devpriv->s_ModuleInfo[b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & APCI1710_16BIT_COUNTER) == APCI1710_16BIT_COUNTER) {
+                            /****************************************/
+                                                               /* Test if 16-bit counter 1 pulse occur */
+                            /****************************************/
+
+                                                               if ((*pul_ReadValue & 0xFFFFU) != 0) {
+                                                                       ui_16BitValue
+                                                                               =
+                                                                               (UINT)
+                                                                               *
+                                                                               pul_ReadValue
+                                                                               &
+                                                                               0xFFFFU;
+                                                                       *pul_ReadValue
+                                                                               =
+                                                                               (*pul_ReadValue
+                                                                               &
+                                                                               0xFFFF0000UL)
+                                                                               |
+                                                                               (0xFFFFU
+                                                                               -
+                                                                               ui_16BitValue);
+                                                               }
+
+                            /****************************************/
+                                                               /* Test if 16-bit counter 2 pulse occur */
+                            /****************************************/
+
+                                                               if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
+                                                                       ui_16BitValue
+                                                                               =
+                                                                               (UINT)
+                                                                               (
+                                                                               (*pul_ReadValue
+                                                                                       >>
+                                                                                       16)
+                                                                               &
+                                                                               0xFFFFU);
+                                                                       *pul_ReadValue
+                                                                               =
+                                                                               (*pul_ReadValue
+                                                                               &
+                                                                               0xFFFFUL)
+                                                                               |
+                                                                               (
+                                                                               (0xFFFFU - ui_16BitValue) << 16);
+                                                               }
+                                                       } else {
+                                                               if (*pul_ReadValue != 0) {
+                                                                       *pul_ReadValue
+                                                                               =
+                                                                               0xFFFFFFFFUL
+                                                                               -
+                                                                               *pul_ReadValue;
+                                                               }
+                                                       }
+                                               } else {
+                                                       if (*pb_UDStatus == 1) {
+                            /****************************************/
+                                                               /* Test if 16-bit counter 2 pulse occur */
+                            /****************************************/
+
+                                                               if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
+                                                                       ui_16BitValue
+                                                                               =
+                                                                               (UINT)
+                                                                               (
+                                                                               (*pul_ReadValue
+                                                                                       >>
+                                                                                       16)
+                                                                               &
+                                                                               0xFFFFU);
+                                                                       *pul_ReadValue
+                                                                               =
+                                                                               (*pul_ReadValue
+                                                                               &
+                                                                               0xFFFFUL)
+                                                                               |
+                                                                               (
+                                                                               (0xFFFFU - ui_16BitValue) << 16);
+                                                               }
+                                                       } else {
+                                                               if (*pb_UDStatus
+                                                                       == 2) {
+                               /****************************************/
+                                                                       /* Test if 16-bit counter 1 pulse occur */
+                               /****************************************/
+
+                                                                       if ((*pul_ReadValue & 0xFFFFU) != 0) {
+                                                                               ui_16BitValue
+                                                                                       =
+                                                                                       (UINT)
+                                                                                       *
+                                                                                       pul_ReadValue
+                                                                                       &
+                                                                                       0xFFFFU;
+                                                                               *pul_ReadValue
+                                                                                       =
+                                                                                       (*pul_ReadValue
+                                                                                       &
+                                                                                       0xFFFF0000UL)
+                                                                                       |
+                                                                                       (0xFFFFU
+                                                                                       -
+                                                                                       ui_16BitValue);
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       } else {
+                                               *pb_Status = 1;
+                                               *pb_UDStatus = 0;
+                                       }
+                               } else {
+                                       *pb_Status = 0;
+                                       *pb_UDStatus = 0;
+                               }
+                       } else {
+                /***********************************************/
+                               /* Frequency measurement logic not initialised */
+                /***********************************************/
+
+                               DPRINTK("Frequency measurement logic not initialised\n");
+                               i_ReturnValue = -4;
+                       }
+               } else {
+             /****************************************/
+                       /* Counter not initialised see function */
+                       /* "i_APCI1710_InitCounter"             */
+             /****************************************/
+
+                       DPRINTK("Counter not initialised\n");
+                       i_ReturnValue = -3;
+               }
+       } else {
+          /*************************************************/
+               /* The selected module number parameter is wrong */
+          /*************************************************/
+
+               DPRINTK("The selected module number parameter is wrong\n");
+               i_ReturnValue = -2;
+       }
+
+       return (i_ReturnValue);
+}