]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/staging/comedi/drivers/addi-data/hwdrv_apci3200.c
staging: comedi: hwdrv_apci3200: remove forward declarations
[karo-tx-linux.git] / drivers / staging / comedi / drivers / addi-data / hwdrv_apci3200.c
index 7f5efa39cb76987d1b700836b72c8a55ac895f68..1c0bf27696cac111a36653f05a3fcb09c56a7098 100644 (file)
@@ -94,27 +94,10 @@ struct str_BoardInfos s_BoardInfos[100];    /*  100 will be the max number of board
 #define NVCMD_BEGIN_READ       (0x7 << 5)      /* nvRam begin read command */
 #define NVCMD_BEGIN_WRITE      (0x6 << 5)      /* EEPROM begin write command */
 
-/*+----------------------------------------------------------------------------+*/
-/*| Function   Name   : int i_AddiHeaderRW_ReadEeprom                          |*/
-/*|                               (int    i_NbOfWordsToRead,                   |*/
-/*|                                unsigned int dw_PCIBoardEepromAddress,             |*/
-/*|                                unsigned short   w_EepromStartAddress,                |*/
-/*|                                unsigned short * pw_DataRead)                          |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Task              : Read word from the 5920 eeprom.                        |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Input Parameters  : int    i_NbOfWordsToRead : Nbr. of word to read        |*/
-/*|                     unsigned int dw_PCIBoardEepromAddress : Address of the eeprom |*/
-/*|                     unsigned short   w_EepromStartAddress : Eeprom start address     |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Output Parameters : unsigned short * pw_DataRead : Read data                          |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Return Value      : -                                                      |*/
-/*+----------------------------------------------------------------------------+*/
-
-int i_AddiHeaderRW_ReadEeprom(int i_NbOfWordsToRead,
-       unsigned int dw_PCIBoardEepromAddress,
-       unsigned short w_EepromStartAddress, unsigned short *pw_DataRead)
+static int i_AddiHeaderRW_ReadEeprom(int i_NbOfWordsToRead,
+                                    unsigned int dw_PCIBoardEepromAddress,
+                                    unsigned short w_EepromStartAddress,
+                                    unsigned short *pw_DataRead)
 {
        unsigned int dw_eeprom_busy = 0;
        int i_Counter = 0;
@@ -241,20 +224,8 @@ int i_AddiHeaderRW_ReadEeprom(int i_NbOfWordsToRead,
        return 0;
 }
 
-/*+----------------------------------------------------------------------------+*/
-/*| Function   Name   : void v_GetAPCI3200EepromCalibrationValue (void)        |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Task              : Read calibration value from the APCI-3200 eeprom.      |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Input Parameters  : -                                                      |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Output Parameters : -                                                      |*/
-/*+----------------------------------------------------------------------------+*/
-/*| Return Value      : -                                                      |*/
-/*+----------------------------------------------------------------------------+*/
-
-void v_GetAPCI3200EepromCalibrationValue(unsigned int dw_PCIBoardEepromAddress,
-       struct str_BoardInfos *BoardInformations)
+static void v_GetAPCI3200EepromCalibrationValue(unsigned int dw_PCIBoardEepromAddress,
+                                               struct str_BoardInfos *BoardInformations)
 {
        unsigned short w_AnalogInputMainHeaderAddress;
        unsigned short w_AnalogInputComponentAddress;
@@ -448,9 +419,11 @@ void v_GetAPCI3200EepromCalibrationValue(unsigned int dw_PCIBoardEepromAddress,
        }
 }
 
-int i_APCI3200_GetChannelCalibrationValue(struct comedi_device *dev,
-       unsigned int ui_Channel_num, unsigned int *CJCCurrentSource,
-       unsigned int *ChannelCurrentSource, unsigned int *ChannelGainFactor)
+static int i_APCI3200_GetChannelCalibrationValue(struct comedi_device *dev,
+                                                unsigned int ui_Channel_num,
+                                                unsigned int *CJCCurrentSource,
+                                                unsigned int *ChannelCurrentSource,
+                                                unsigned int *ChannelGainFactor)
 {
        int i_DiffChannel = 0;
        int i_Module = 0;
@@ -520,33 +493,19 @@ int i_APCI3200_GetChannelCalibrationValue(struct comedi_device *dev,
        return 0;
 }
 
-/* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-
 /*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadDigitalInput                       |
-  |                      (struct comedi_device *dev,struct comedi_subdevice *s,               |
-  |                      struct comedi_insn *insn,unsigned int *data)                     |
-  +----------------------------------------------------------------------------+
-  | Task              : Read  value  of the selected channel or port           |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int ui_NoOfChannels    : No Of Channels To read  for Port
-  Channel Numberfor single channel
-  |                     unsigned int data[0]            : 0: Read single channel
-  1: Read port value
-  data[1]              Port number
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --      data[0] :Read status value
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-
-int i_APCI3200_ReadDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
-       struct comedi_insn *insn, unsigned int *data)
+ * Read  value  of the selected channel or port
+ *
+ * data[0] = 0: Read single channel
+ *        = 1 Read port value
+ * data[1] = Port number
+ *
+ * data[0] : Read status value
+ */
+static int i_APCI3200_ReadDigitalInput(struct comedi_device *dev,
+                                      struct comedi_subdevice *s,
+                                      struct comedi_insn *insn,
+                                      unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
        unsigned int ui_Temp = 0;
@@ -587,26 +546,15 @@ int i_APCI3200_ReadDigitalInput(struct comedi_device *dev, struct comedi_subdevi
 }
 
 /*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ConfigDigitalOutput                     |
-  |                      (struct comedi_device *dev,struct comedi_subdevice *s,                                 |
-  |                      struct comedi_insn *insn,unsigned int *data)                     |
-  +----------------------------------------------------------------------------+
-  | Task              : Configures The Digital Output Subdevice.               |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev : Driver handle                     |
-  |                      data[0]  :1  Memory enable
-  0  Memory Disable
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error                      |
-  |                                                                                                                                     |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
-       struct comedi_insn *insn, unsigned int *data)
+ * Configures The Digital Output Subdevice.
+ *
+ * data[0] = 1  Memory enable
+ *        = 0  Memory Disable
+ */
+static int i_APCI3200_ConfigDigitalOutput(struct comedi_device *dev,
+                                         struct comedi_subdevice *s,
+                                         struct comedi_insn *insn,
+                                         unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
 
@@ -625,34 +573,19 @@ int i_APCI3200_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subd
 }
 
 /*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_WriteDigitalOutput                      |
-  |                      (struct comedi_device *dev,struct comedi_subdevice *s,                                 |
-  |                      struct comedi_insn *insn,unsigned int *data)                     |
-  +----------------------------------------------------------------------------+
-  | Task              : writes To the digital Output Subdevice                 |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     struct comedi_subdevice *s     : Subdevice Pointer            |
-  |                     struct comedi_insn *insn       : Insn Structure Pointer       |
-  |                     unsigned int *data          : Data Pointer contains        |
-  |                                          configuration parameters as below |
-  |                     data[0]             :Value to output
-  data[1]             : 0 o/p single channel
-  1 o/p port
-  data[2]             : port no
-  data[3]             :0 set the digital o/p on
-  1 set the digital o/p off
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error              |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
-       struct comedi_insn *insn, unsigned int *data)
+ * Writes To the digital Output Subdevice
+ *
+ * data[0] = Value to output
+ * data[1] = 0  o/p single channel
+ *        = 1  o/p port
+ * data[2] = port no
+ * data[3] = 0  set the digital o/p on
+ *        = 1  set the digital o/p off
+ */
+static int i_APCI3200_WriteDigitalOutput(struct comedi_device *dev,
+                                        struct comedi_subdevice *s,
+                                        struct comedi_insn *insn,
+                                        unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
        unsigned int ui_Temp = 0, ui_Temp1 = 0;
@@ -744,30 +677,16 @@ int i_APCI3200_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subde
 }
 
 /*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadDigitalOutput                       |
-  |                      (struct comedi_device *dev,struct comedi_subdevice *s,               |
-  |                      struct comedi_insn *insn,unsigned int *data)                     |
-  +----------------------------------------------------------------------------+
-  | Task              : Read  value  of the selected channel or port           |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int ui_NoOfChannels    : No Of Channels To read       |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  data[0]                 :0 read single channel
-  1 read port value
-  data[1]                  port no
-
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
-       struct comedi_insn *insn, unsigned int *data)
+ * Read  value  of the selected channel or port
+ *
+ * data[0] = 0  read single channel
+ *        = 1  read port value
+ * data[1] = port no
+ */
+static int i_APCI3200_ReadDigitalOutput(struct comedi_device *dev,
+                                       struct comedi_subdevice *s,
+                                       struct comedi_insn *insn,
+                                       unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
        unsigned int ui_Temp;
@@ -806,881 +725,360 @@ int i_APCI3200_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdev
        return insn->n;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ConfigAnalogInput                       |
-  |                      (struct comedi_device *dev,struct comedi_subdevice *s,               |
-  |                      struct comedi_insn *insn,unsigned int *data)                     |
-  +----------------------------------------------------------------------------+
-  | Task              : Configures The Analog Input Subdevice                  |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     struct comedi_subdevice *s     : Subdevice Pointer            |
-  |                     struct comedi_insn *insn       : Insn Structure Pointer       |
-  |                     unsigned int *data          : Data Pointer contains        |
-  |                                          configuration parameters as below |
-  |                                                                            |
-  |                                    data[0]
-  |                                               0:Normal AI                  |
-  |                                               1:RTD                        |
-  |                                               2:THERMOCOUPLE               |
-  |                                data[1]            : Gain To Use                 |
-  |                                                                            |
-  |                           data[2]            : Polarity
-  |                                                0:Bipolar                   |
-  |                                                1:Unipolar                  |
-  |                                                                                                                             |
-  |                           data[3]            : Offset Range
-  |                                                                            |
-  |                           data[4]            : Coupling
-  |                                                0:DC Coupling               |
-  |                                                1:AC Coupling               |
-  |                                                                            |
-  |                           data[5]            :Differential/Single
-  |                                                0:Single                    |
-  |                                                1:Differential              |
-  |                                                                            |
-  |                           data[6]            :TimerReloadValue
-  |                                                                            |
-  |                           data[7]            :ConvertingTimeUnit
-  |                                                                            |
-  |                           data[8]             :0 Analog voltage measurement
-  1 Resistance measurement
-  2 Temperature measurement
-  |                           data[9]            :Interrupt
-  |                                              0:Disable
-  |                                              1:Enable
-  data[10]           :Type of Thermocouple
-  |                          data[11]           : 0: single channel
-  Module Number
-  |
-  |                          data[12]
-  |                                             0:Single Read
-  |                                             1:Read more channel
-  2:Single scan
-  |                                             3:Continuous Scan
-  data[13]          :Number of channels to read
-  |                          data[14]          :RTD connection type
-  :0:RTD not used
-  1:RTD 2 wire connection
-  2:RTD 3 wire connection
-  3:RTD 4 wire connection
-  |                                                                            |
-  |                                                                            |
-  |                                                                            |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ConfigAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
-       struct comedi_insn *insn, unsigned int *data)
+static int i_APCI3200_Read1AnalogInputChannel(struct comedi_device *dev,
+                                             struct comedi_subdevice *s,
+                                             struct comedi_insn *insn,
+                                             unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int ul_Config = 0, ul_Temp = 0;
+       unsigned int ui_EOC = 0;
        unsigned int ui_ChannelNo = 0;
-       unsigned int ui_Dummy = 0;
-       int i_err = 0;
+       unsigned int ui_CommandRegister = 0;
 
-       /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* ui_ChannelNo=i_ChannelNo; */
+       ui_ChannelNo = s_BoardInfos[dev->minor].i_ChannelNo;
 
-#ifdef PRINT_INFO
-       int i = 0, i2 = 0;
-#endif
-       /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+  /*********************************/
+       /* Write the channel to configure */
+  /*********************************/
+       /* Begin JK 20.10.2004: Bad channel value is used when using differential mode */
+       /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
+       /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
+       outl(0 | s_BoardInfos[dev->minor].i_ChannelNo,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
+       /* End JK 20.10.2004: Bad channel value is used when using differential mode */
 
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /*  Initialize the structure */
-       if (s_BoardInfos[dev->minor].b_StructInitialized != 1) {
-               s_BoardInfos[dev->minor].i_CJCAvailable = 1;
-               s_BoardInfos[dev->minor].i_CJCPolarity = 0;
-               s_BoardInfos[dev->minor].i_CJCGain = 2; /* changed from 0 to 2 */
-               s_BoardInfos[dev->minor].i_InterruptFlag = 0;
-               s_BoardInfos[dev->minor].i_AutoCalibration = 0; /* : auto calibration */
-               s_BoardInfos[dev->minor].i_ChannelCount = 0;
-               s_BoardInfos[dev->minor].i_Sum = 0;
-               s_BoardInfos[dev->minor].ui_Channel_num = 0;
-               s_BoardInfos[dev->minor].i_Count = 0;
-               s_BoardInfos[dev->minor].i_Initialised = 0;
-               s_BoardInfos[dev->minor].b_StructInitialized = 1;
+  /*******************************/
+       /* Set the convert timing unit */
+  /*******************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
 
-               /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-               s_BoardInfos[dev->minor].i_ConnectionType = 0;
-               /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+       /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
+       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
 
-               /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-               memset(s_BoardInfos[dev->minor].s_Module, 0,
-                       sizeof(s_BoardInfos[dev->minor].s_Module[MAX_MODULE]));
+  /**************************/
+       /* Set the convert timing */
+  /**************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
 
-               v_GetAPCI3200EepromCalibrationValue(devpriv->i_IobaseAmcc,
-                       &s_BoardInfos[dev->minor]);
+       /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
+       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
 
-#ifdef PRINT_INFO
-               for (i = 0; i < MAX_MODULE; i++) {
-                       printk("\n s_Module[%i].ul_CurrentSourceCJC = %lu", i,
-                               s_BoardInfos[dev->minor].s_Module[i].
-                               ul_CurrentSourceCJC);
+  /**************************************************************************/
+       /* Set the start end stop index to the selected channel and set the start */
+  /**************************************************************************/
 
-                       for (i2 = 0; i2 < 5; i2++) {
-                               printk("\n s_Module[%i].ul_CurrentSource [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_CurrentSource[i2]);
-                       }
+       ui_CommandRegister = ui_ChannelNo | (ui_ChannelNo << 8) | 0x80000;
 
-                       for (i2 = 0; i2 < 8; i2++) {
-                               printk("\n s_Module[%i].ul_GainFactor [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_GainFactor[i2]);
-                       }
+  /*********************************/
+       /*Test if the interrupt is enable */
+  /*********************************/
 
-                       for (i2 = 0; i2 < 8; i2++) {
-                               printk("\n s_Module[%i].w_GainValue [%i] = %u",
-                                       i, i2,
-                                       s_BoardInfos[dev->minor].s_Module[i].
-                                       w_GainValue[i2]);
-                       }
-               }
-#endif
-               /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-       }
+       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
+       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
+      /************************/
+               /* Enable the interrupt */
+      /************************/
+               ui_CommandRegister = ui_CommandRegister | 0x00100000;
+       }                       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
 
-       if (data[0] != 0 && data[0] != 1 && data[0] != 2) {
-               printk("\nThe selection of acquisition type is in error\n");
-               i_err++;
-       }                       /* if(data[0]!=0 && data[0]!=1 && data[0]!=2) */
-       if (data[0] == 1) {
-               if (data[14] != 0 && data[14] != 1 && data[14] != 2
-                       && data[14] != 4) {
-                       printk("\n Error in selection of RTD connection type\n");
-                       i_err++;
-               }               /* if(data[14]!=0 && data[14]!=1 && data[14]!=2 && data[14]!=4) */
-       }                       /* if(data[0]==1 ) */
-       if (data[1] < 0 || data[1] > 7) {
-               printk("\nThe selection of gain is in error\n");
-               i_err++;
-       }                       /*  if(data[1]<0 || data[1]>7) */
-       if (data[2] != 0 && data[2] != 1) {
-               printk("\nThe selection of polarity is in error\n");
-               i_err++;
-       }                       /* if(data[2]!=0 &&  data[2]!=1) */
-       if (data[3] != 0) {
-               printk("\nThe selection of offset range  is in error\n");
-               i_err++;
-       }                       /*  if(data[3]!=0) */
-       if (data[4] != 0 && data[4] != 1) {
-               printk("\nThe selection of coupling is in error\n");
-               i_err++;
-       }                       /* if(data[4]!=0 &&  data[4]!=1) */
-       if (data[5] != 0 && data[5] != 1) {
-               printk("\nThe selection of single/differential mode is in error\n");
-               i_err++;
-       }                       /* if(data[5]!=0 &&  data[5]!=1) */
-       if (data[8] != 0 && data[8] != 1 && data[2] != 2) {
-               printk("\nError in selection of functionality\n");
-       }                       /* if(data[8]!=0 && data[8]!=1 && data[2]!=2) */
-       if (data[12] == 0 || data[12] == 1) {
-               if (data[6] != 20 && data[6] != 40 && data[6] != 80
-                       && data[6] != 160) {
-                       printk("\nThe selection of conversion time reload value is in error\n");
-                       i_err++;
-               }               /*  if (data[6]!=20 && data[6]!=40 && data[6]!=80 && data[6]!=160 ) */
-               if (data[7] != 2) {
-                       printk("\nThe selection of conversion time unit  is in error\n");
-                       i_err++;
-               }               /*  if(data[7]!=2) */
-       }
-       if (data[9] != 0 && data[9] != 1) {
-               printk("\nThe selection of interrupt enable is in error\n");
-               i_err++;
-       }                       /* if(data[9]!=0 &&  data[9]!=1) */
-       if (data[11] < 0 || data[11] > 4) {
-               printk("\nThe selection of module is in error\n");
-               i_err++;
-       }                       /* if(data[11] <0 ||  data[11]>1) */
-       if (data[12] < 0 || data[12] > 3) {
-               printk("\nThe selection of singlechannel/scan selection is in error\n");
-               i_err++;
-       }                       /* if(data[12] < 0 ||  data[12]> 3) */
-       if (data[13] < 0 || data[13] > 16) {
-               printk("\nThe selection of number of channels is in error\n");
-               i_err++;
-       }                       /*  if(data[13] <0 ||data[13] >15) */
+  /******************************/
+       /* Write the command register */
+  /******************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
 
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /*
-          i_ChannelCount=data[13];
-          i_ScanType=data[12];
-          i_ADDIDATAPolarity = data[2];
-          i_ADDIDATAGain=data[1];
-          i_ADDIDATAConversionTime=data[6];
-          i_ADDIDATAConversionTimeUnit=data[7];
-          i_ADDIDATAType=data[0];
-        */
+       /* outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8); */
+       outl(ui_CommandRegister,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
 
-       /*  Save acquisition configuration for the actual board */
-       s_BoardInfos[dev->minor].i_ChannelCount = data[13];
-       s_BoardInfos[dev->minor].i_ScanType = data[12];
-       s_BoardInfos[dev->minor].i_ADDIDATAPolarity = data[2];
-       s_BoardInfos[dev->minor].i_ADDIDATAGain = data[1];
-       s_BoardInfos[dev->minor].i_ADDIDATAConversionTime = data[6];
-       s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit = data[7];
-       s_BoardInfos[dev->minor].i_ADDIDATAType = data[0];
-       /* Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-       s_BoardInfos[dev->minor].i_ConnectionType = data[5];
-       /* End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-       /* END JK 06.07.04: Management of sevrals boards */
+  /*****************************/
+       /*Test if interrupt is enable */
+  /*****************************/
+       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
+       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
+               do {
+         /*************************/
+                       /*Read the EOC Status bit */
+         /*************************/
 
-       /* Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-       memset(s_BoardInfos[dev->minor].ui_ScanValueArray, 0, (7 + 12) * sizeof(unsigned int)); /*  7 is the maximal number of channels */
-       /* End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+                       /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
+                       ui_EOC = inl(devpriv->iobase +
+                               s_BoardInfos[dev->minor].i_Offset + 20) & 1;
 
-       /* BEGIN JK 02.07.04 : This while can't be do, it block the process when using severals boards */
-       /* while(i_InterruptFlag==1) */
-       while (s_BoardInfos[dev->minor].i_InterruptFlag == 1) {
-#ifndef MSXBOX
-               udelay(1);
-#else
-               /*  In the case where the driver is compiled for the MSX-Box */
-               /*  we used a printk to have a little delay because udelay */
-               /*  seems to be broken under the MSX-Box. */
-               /*  This solution hat to be studied. */
-               printk("");
-#endif
-       }
-       /* END JK 02.07.04 : This while can't be do, it block the process when using severals boards */
-
-       ui_ChannelNo = CR_CHAN(insn->chanspec); /*  get the channel */
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* i_ChannelNo=ui_ChannelNo; */
-       /* ui_Channel_num =ui_ChannelNo; */
-
-       s_BoardInfos[dev->minor].i_ChannelNo = ui_ChannelNo;
-       s_BoardInfos[dev->minor].ui_Channel_num = ui_ChannelNo;
+               } while (ui_EOC != 1);
 
-       /* END JK 06.07.04: Management of sevrals boards */
+      /***************************************/
+               /* Read the digital value of the input */
+      /***************************************/
 
-       if (data[5] == 0) {
-               if (ui_ChannelNo < 0 || ui_ChannelNo > 15) {
-                       printk("\nThe Selection of the channel is in error\n");
-                       i_err++;
-               }               /*  if(ui_ChannelNo<0 || ui_ChannelNo>15) */
-       }                       /* if(data[5]==0) */
-       else {
-               if (data[14] == 2) {
-                       if (ui_ChannelNo < 0 || ui_ChannelNo > 3) {
-                               printk("\nThe Selection of the channel is in error\n");
-                               i_err++;
-                       }       /*  if(ui_ChannelNo<0 || ui_ChannelNo>3) */
-               }               /* if(data[14]==2) */
-               else {
-                       if (ui_ChannelNo < 0 || ui_ChannelNo > 7) {
-                               printk("\nThe Selection of the channel is in error\n");
-                               i_err++;
-                       }       /*  if(ui_ChannelNo<0 || ui_ChannelNo>7) */
-               }               /* elseif(data[14]==2) */
-       }                       /* elseif(data[5]==0) */
-       if (data[12] == 0 || data[12] == 1) {
-               switch (data[5]) {
-               case 0:
-                       if (ui_ChannelNo >= 0 && ui_ChannelNo <= 3) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_Offset=0; */
-                               s_BoardInfos[dev->minor].i_Offset = 0;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       }       /* if(ui_ChannelNo >=0 && ui_ChannelNo <=3) */
-                       if (ui_ChannelNo >= 4 && ui_ChannelNo <= 7) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_Offset=64; */
-                               s_BoardInfos[dev->minor].i_Offset = 64;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       }       /* if(ui_ChannelNo >=4 && ui_ChannelNo <=7) */
-                       if (ui_ChannelNo >= 8 && ui_ChannelNo <= 11) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_Offset=128; */
-                               s_BoardInfos[dev->minor].i_Offset = 128;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       }       /* if(ui_ChannelNo >=8 && ui_ChannelNo <=11) */
-                       if (ui_ChannelNo >= 12 && ui_ChannelNo <= 15) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_Offset=192; */
-                               s_BoardInfos[dev->minor].i_Offset = 192;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       }       /* if(ui_ChannelNo >=12 && ui_ChannelNo <=15) */
-                       break;
-               case 1:
-                       if (data[14] == 2) {
-                               if (ui_ChannelNo == 0) {
-                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                                       /* i_Offset=0; */
-                                       s_BoardInfos[dev->minor].i_Offset = 0;
-                                       /* END JK 06.07.04: Management of sevrals boards */
-                               }       /* if(ui_ChannelNo ==0 ) */
-                               if (ui_ChannelNo == 1) {
-                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                                       /* i_Offset=0; */
-                                       s_BoardInfos[dev->minor].i_Offset = 64;
-                                       /* END JK 06.07.04: Management of sevrals boards */
-                               }       /*  if(ui_ChannelNo ==1) */
-                               if (ui_ChannelNo == 2) {
-                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                                       /* i_Offset=128; */
-                                       s_BoardInfos[dev->minor].i_Offset = 128;
-                                       /* END JK 06.07.04: Management of sevrals boards */
-                               }       /* if(ui_ChannelNo ==2 ) */
-                               if (ui_ChannelNo == 3) {
-                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                                       /* i_Offset=192; */
-                                       s_BoardInfos[dev->minor].i_Offset = 192;
-                                       /* END JK 06.07.04: Management of sevrals boards */
-                               }       /* if(ui_ChannelNo ==3) */
+               /* data[0] = inl (devpriv->iobase+i_Offset + 28); */
+               data[0] =
+                       inl(devpriv->iobase +
+                       s_BoardInfos[dev->minor].i_Offset + 28);
+               /* END JK 06.07.04: Management of sevrals boards */
 
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_ChannelNo=0; */
-                               s_BoardInfos[dev->minor].i_ChannelNo = 0;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                               ui_ChannelNo = 0;
-                               break;
-                       }       /* if(data[14]==2) */
-                       if (ui_ChannelNo >= 0 && ui_ChannelNo <= 1) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_Offset=0; */
-                               s_BoardInfos[dev->minor].i_Offset = 0;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       }       /* if(ui_ChannelNo >=0 && ui_ChannelNo <=1) */
-                       if (ui_ChannelNo >= 2 && ui_ChannelNo <= 3) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_ChannelNo=i_ChannelNo-2; */
-                               /* i_Offset=64; */
-                               s_BoardInfos[dev->minor].i_ChannelNo =
-                                       s_BoardInfos[dev->minor].i_ChannelNo -
-                                       2;
-                               s_BoardInfos[dev->minor].i_Offset = 64;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                               ui_ChannelNo = ui_ChannelNo - 2;
-                       }       /* if(ui_ChannelNo >=2 && ui_ChannelNo <=3) */
-                       if (ui_ChannelNo >= 4 && ui_ChannelNo <= 5) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_ChannelNo=i_ChannelNo-4; */
-                               /* i_Offset=128; */
-                               s_BoardInfos[dev->minor].i_ChannelNo =
-                                       s_BoardInfos[dev->minor].i_ChannelNo -
-                                       4;
-                               s_BoardInfos[dev->minor].i_Offset = 128;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                               ui_ChannelNo = ui_ChannelNo - 4;
-                       }       /* if(ui_ChannelNo >=4 && ui_ChannelNo <=5) */
-                       if (ui_ChannelNo >= 6 && ui_ChannelNo <= 7) {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* i_ChannelNo=i_ChannelNo-6; */
-                               /* i_Offset=192; */
-                               s_BoardInfos[dev->minor].i_ChannelNo =
-                                       s_BoardInfos[dev->minor].i_ChannelNo -
-                                       6;
-                               s_BoardInfos[dev->minor].i_Offset = 192;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                               ui_ChannelNo = ui_ChannelNo - 6;
-                       }       /* if(ui_ChannelNo >=6 && ui_ChannelNo <=7) */
-                       break;
+       }                       /*  if (i_InterruptFlag == ADDIDATA_DISABLE) */
+       return 0;
+}
 
-               default:
-                       printk("\n This selection of polarity does not exist\n");
-                       i_err++;
-               }               /* switch(data[2]) */
-       }                       /* if(data[12]==0 || data[12]==1) */
-       else {
-               switch (data[11]) {
-               case 1:
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* i_Offset=0; */
-                       s_BoardInfos[dev->minor].i_Offset = 0;
-                       /* END JK 06.07.04: Management of sevrals boards */
-                       break;
-               case 2:
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* i_Offset=64; */
-                       s_BoardInfos[dev->minor].i_Offset = 64;
-                       /* END JK 06.07.04: Management of sevrals boards */
-                       break;
-               case 3:
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* i_Offset=128; */
-                       s_BoardInfos[dev->minor].i_Offset = 128;
-                       /* END JK 06.07.04: Management of sevrals boards */
-                       break;
-               case 4:
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* i_Offset=192; */
-                       s_BoardInfos[dev->minor].i_Offset = 192;
-                       /* END JK 06.07.04: Management of sevrals boards */
-                       break;
-               default:
-                       printk("\nError in module selection\n");
-                       i_err++;
-               }               /*  switch(data[11]) */
-       }                       /*  elseif(data[12]==0 || data[12]==1) */
-       if (i_err) {
-               i_APCI3200_Reset(dev);
-               return -EINVAL;
-       }
-       /* if(i_ScanType!=1) */
-       if (s_BoardInfos[dev->minor].i_ScanType != 1) {
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* i_Count=0; */
-               /* i_Sum=0; */
-               s_BoardInfos[dev->minor].i_Count = 0;
-               s_BoardInfos[dev->minor].i_Sum = 0;
-               /* END JK 06.07.04: Management of sevrals boards */
-       }                       /* if(i_ScanType!=1) */
+static int i_APCI3200_ReadCalibrationOffsetValue(struct comedi_device *dev,
+                                                unsigned int *data)
+{
+       struct addi_private *devpriv = dev->private;
+       unsigned int ui_Temp = 0, ui_EOC = 0;
+       unsigned int ui_CommandRegister = 0;
 
-       ul_Config =
-               data[1] | (data[2] << 6) | (data[5] << 7) | (data[3] << 8) |
-               (data[4] << 9);
        /* BEGIN JK 06.07.04: Management of sevrals boards */
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* END JK 06.07.04: Management of sevrals boards */
   /*********************************/
        /* Write the channel to configure */
   /*********************************/
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* outl(0 | ui_ChannelNo , devpriv->iobase+i_Offset + 0x4); */
-       outl(0 | ui_ChannelNo,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
-       /* END JK 06.07.04: Management of sevrals boards */
+       /* Begin JK 20.10.2004: This seems not necessary ! */
+       /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
+       /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
+       /* End JK 20.10.2004: This seems not necessary ! */
 
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
+  /*******************************/
+       /* Set the convert timing unit */
+  /*******************************/
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* END JK 06.07.04: Management of sevrals boards */
+       /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
+       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
   /**************************/
-       /* Reset the configuration */
+       /* Set the convert timing */
   /**************************/
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* outl(0 , devpriv->iobase+i_Offset + 0x0); */
-       outl(0, devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
-       /* END JK 06.07.04: Management of sevrals boards */
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
+       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
+  /*****************************/
+       /*Read the calibration offset */
+  /*****************************/
+       /* ui_Temp = inl(devpriv->iobase+i_Offset + 12); */
+       ui_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
 
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
+  /*********************************/
+       /*Configure the Offset Conversion */
+  /*********************************/
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* END JK 06.07.04: Management of sevrals boards */
+       /* outl((ui_Temp | 0x00020000), devpriv->iobase+i_Offset + 12); */
+       outl((ui_Temp | 0x00020000),
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
+  /*******************************/
+       /*Initialise ui_CommandRegister */
+  /*******************************/
 
-  /***************************/
-       /* Write the configuration */
-  /***************************/
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* outl(ul_Config , devpriv->iobase+i_Offset + 0x0); */
-       outl(ul_Config,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
-       /* END JK 06.07.04: Management of sevrals boards */
+       ui_CommandRegister = 0;
+
+  /*********************************/
+       /*Test if the interrupt is enable */
+  /*********************************/
+
+       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
+       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
+
+      /**********************/
+               /*Enable the interrupt */
+      /**********************/
+
+               ui_CommandRegister = ui_CommandRegister | 0x00100000;
+
+       }                       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
+
+  /**********************/
+       /*Start the conversion */
+  /**********************/
+       ui_CommandRegister = ui_CommandRegister | 0x00080000;
 
   /***************************/
-       /*Reset the calibration bit */
+       /*Write the command regiter */
   /***************************/
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* ul_Temp = inl(devpriv->iobase+i_Offset + 12); */
-       ul_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
-       /* END JK 06.07.04: Management of sevrals boards */
-
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* END JK 06.07.04: Management of sevrals boards */
+       /* outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8); */
+       outl(ui_CommandRegister,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
 
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* outl((ul_Temp & 0xFFF9FFFF) , devpriv->iobase+.i_Offset + 12); */
-       outl((ul_Temp & 0xFFF9FFFF),
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
-       /* END JK 06.07.04: Management of sevrals boards */
+  /*****************************/
+       /*Test if interrupt is enable */
+  /*****************************/
 
-       if (data[9] == 1) {
-               devpriv->tsk_Current = current;
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* i_InterruptFlag=1; */
-               s_BoardInfos[dev->minor].i_InterruptFlag = 1;
-               /* END JK 06.07.04: Management of sevrals boards */
-       }                       /*  if(data[9]==1) */
-       else {
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* i_InterruptFlag=0; */
-               s_BoardInfos[dev->minor].i_InterruptFlag = 0;
-               /* END JK 06.07.04: Management of sevrals boards */
-       }                       /* else  if(data[9]==1) */
+       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
+       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
 
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* i_Initialised=1; */
-       s_BoardInfos[dev->minor].i_Initialised = 1;
-       /* END JK 06.07.04: Management of sevrals boards */
+               do {
+         /*******************/
+                       /*Read the EOC flag */
+         /*******************/
 
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* if(i_ScanType==1) */
-       if (s_BoardInfos[dev->minor].i_ScanType == 1)
-               /* END JK 06.07.04: Management of sevrals boards */
-       {
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* i_Sum=i_Sum+1; */
-               s_BoardInfos[dev->minor].i_Sum =
-                       s_BoardInfos[dev->minor].i_Sum + 1;
-               /* END JK 06.07.04: Management of sevrals boards */
+                       /* ui_EOC = inl (devpriv->iobase+i_Offset + 20) & 1; */
+                       ui_EOC = inl(devpriv->iobase +
+                               s_BoardInfos[dev->minor].i_Offset + 20) & 1;
 
-               insn->unused[0] = 0;
-               i_APCI3200_ReadAnalogInput(dev, s, insn, &ui_Dummy);
-       }
+               } while (ui_EOC != 1);
 
-       return insn->n;
+      /**************************************************/
+               /*Read the digital value of the calibration Offset */
+      /**************************************************/
+
+               /* data[0] = inl(devpriv->iobase+i_Offset+ 28); */
+               data[0] =
+                       inl(devpriv->iobase +
+                       s_BoardInfos[dev->minor].i_Offset + 28);
+       }                       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
+       return 0;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadAnalogInput                         |
-  |                              (struct comedi_device *dev,struct comedi_subdevice *s,       |
-  |                     struct comedi_insn *insn,unsigned int *data)                      |
-  +----------------------------------------------------------------------------+
-  | Task              : Read  value  of the selected channel                            |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int ui_NoOfChannels    : No Of Channels To read       |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                            data[0]  : Digital Value Of Input             |
-  |                            data[1]  : Calibration Offset Value           |
-  |                            data[2]  : Calibration Gain Value
-  |                            data[3]  : CJC value
-  |                            data[4]  : CJC offset value
-  |                            data[5]  : CJC gain value
-  | Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
-  |                            data[6] : CJC current source from eeprom
-  |                            data[7] : Channel current source from eeprom
-  |                            data[8] : Channle gain factor from eeprom
-  | End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ReadAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
-       struct comedi_insn *insn, unsigned int *data)
+static int i_APCI3200_ReadCalibrationGainValue(struct comedi_device *dev,
+                                              unsigned int *data)
 {
-       unsigned int ui_DummyValue = 0;
-       int i_ConvertCJCCalibration;
-       int i = 0;
-
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* if(i_Initialised==0) */
-       if (s_BoardInfos[dev->minor].i_Initialised == 0)
-               /* END JK 06.07.04: Management of sevrals boards */
-       {
-               i_APCI3200_Reset(dev);
-               return -EINVAL;
-       }                       /* if(i_Initialised==0); */
+       struct addi_private *devpriv = dev->private;
+       unsigned int ui_EOC = 0;
+       int ui_CommandRegister = 0;
 
-#ifdef PRINT_INFO
-       printk("\n insn->unused[0] = %i", insn->unused[0]);
-#endif
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+  /*********************************/
+       /* Write the channel to configure */
+  /*********************************/
+       /* Begin JK 20.10.2004: This seems not necessary ! */
+       /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
+       /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
+       /* End JK 20.10.2004: This seems not necessary ! */
 
-       switch (insn->unused[0]) {
-       case 0:
+  /***************************/
+       /*Read the calibration gain */
+  /***************************/
+  /*******************************/
+       /* Set the convert timing unit */
+  /*******************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
+       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
+  /**************************/
+       /* Set the convert timing */
+  /**************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
+       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
+  /*******************************/
+       /*Configure the Gain Conversion */
+  /*******************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl(0x00040000 , devpriv->iobase+i_Offset + 12); */
+       outl(0x00040000,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
 
-               i_APCI3200_Read1AnalogInputChannel(dev, s, insn,
-                       &ui_DummyValue);
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* ui_InterruptChannelValue[i_Count+0]=ui_DummyValue; */
-               s_BoardInfos[dev->minor].
-                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
-                       i_Count + 0] = ui_DummyValue;
-               /* END JK 06.07.04: Management of sevrals boards */
+  /*******************************/
+       /*Initialise ui_CommandRegister */
+  /*******************************/
 
-               /* Begin JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-               i_APCI3200_GetChannelCalibrationValue(dev,
-                       s_BoardInfos[dev->minor].ui_Channel_num,
-                       &s_BoardInfos[dev->minor].
-                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
-                               i_Count + 6],
-                       &s_BoardInfos[dev->minor].
-                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
-                               i_Count + 7],
-                       &s_BoardInfos[dev->minor].
-                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
-                               i_Count + 8]);
+       ui_CommandRegister = 0;
 
-#ifdef PRINT_INFO
-               printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+6] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 6]);
+  /*********************************/
+       /*Test if the interrupt is enable */
+  /*********************************/
 
-               printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+7] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 7]);
+       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
+       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
 
-               printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+8] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 8]);
-#endif
+      /**********************/
+               /*Enable the interrupt */
+      /**********************/
 
-               /* End JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+               ui_CommandRegister = ui_CommandRegister | 0x00100000;
 
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1)) */
-               if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
-                       && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
-                       && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
-                       /* END JK 06.07.04: Management of sevrals boards */
-               {
-                       i_APCI3200_ReadCJCValue(dev, &ui_DummyValue);
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* ui_InterruptChannelValue[i_Count + 3]=ui_DummyValue; */
-                       s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[s_BoardInfos[dev->
-                                       minor].i_Count + 3] = ui_DummyValue;
-                       /* END JK 06.07.04: Management of sevrals boards */
-               }               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)) */
-               else {
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* ui_InterruptChannelValue[i_Count + 3]=0; */
-                       s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[s_BoardInfos[dev->
-                                       minor].i_Count + 3] = 0;
-                       /* END JK 06.07.04: Management of sevrals boards */
-               }               /* elseif((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1)) */
+       }                       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
 
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE)) */
-               if ((s_BoardInfos[dev->minor].i_AutoCalibration == FALSE)
-                       && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE))
-                       /* END JK 06.07.04: Management of sevrals boards */
-               {
-                       i_APCI3200_ReadCalibrationOffsetValue(dev,
-                               &ui_DummyValue);
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* ui_InterruptChannelValue[i_Count + 1]=ui_DummyValue; */
-                       s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[s_BoardInfos[dev->
-                                       minor].i_Count + 1] = ui_DummyValue;
-                       /* END JK 06.07.04: Management of sevrals boards */
-                       i_APCI3200_ReadCalibrationGainValue(dev,
-                               &ui_DummyValue);
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* ui_InterruptChannelValue[i_Count + 2]=ui_DummyValue; */
-                       s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[s_BoardInfos[dev->
-                                       minor].i_Count + 2] = ui_DummyValue;
-                       /* END JK 06.07.04: Management of sevrals boards */
-               }               /* if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE)) */
+  /**********************/
+       /*Start the conversion */
+  /**********************/
 
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)&& (i_CJCAvailable==1)) */
-               if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
-                       && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
-                       && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
-                       /* END JK 06.07.04: Management of sevrals boards */
-               {
-         /**********************************************************/
-                       /*Test if the Calibration channel must be read for the CJC */
-         /**********************************************************/
-         /**********************************/
-                       /*Test if the polarity is the same */
-         /**********************************/
-                       /* BEGIN JK 06.07.04: Management of sevrals boards */
-                       /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
-                       if (s_BoardInfos[dev->minor].i_CJCPolarity !=
-                               s_BoardInfos[dev->minor].i_ADDIDATAPolarity)
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       {
-                               i_ConvertCJCCalibration = 1;
-                       }       /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
-                       else {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* if(i_CJCGain==i_ADDIDATAGain) */
-                               if (s_BoardInfos[dev->minor].i_CJCGain ==
-                                       s_BoardInfos[dev->minor].i_ADDIDATAGain)
-                                       /* END JK 06.07.04: Management of sevrals boards */
-                               {
-                                       i_ConvertCJCCalibration = 0;
-                               }       /* if(i_CJCGain==i_ADDIDATAGain) */
-                               else {
-                                       i_ConvertCJCCalibration = 1;
-                               }       /* elseif(i_CJCGain==i_ADDIDATAGain) */
-                       }       /* elseif(i_CJCPolarity!=i_ADDIDATAPolarity) */
-                       if (i_ConvertCJCCalibration == 1) {
-                               i_APCI3200_ReadCJCCalOffset(dev,
-                                       &ui_DummyValue);
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* ui_InterruptChannelValue[i_Count+4]=ui_DummyValue; */
-                               s_BoardInfos[dev->minor].
-                                       ui_InterruptChannelValue[s_BoardInfos
-                                       [dev->minor].i_Count + 4] =
-                                       ui_DummyValue;
-                               /* END JK 06.07.04: Management of sevrals boards */
+       ui_CommandRegister = ui_CommandRegister | 0x00080000;
+  /***************************/
+       /*Write the command regiter */
+  /***************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8); */
+       outl(ui_CommandRegister,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
 
-                               i_APCI3200_ReadCJCCalGain(dev, &ui_DummyValue);
+  /*****************************/
+       /*Test if interrupt is enable */
+  /*****************************/
 
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* ui_InterruptChannelValue[i_Count+5]=ui_DummyValue; */
-                               s_BoardInfos[dev->minor].
-                                       ui_InterruptChannelValue[s_BoardInfos
-                                       [dev->minor].i_Count + 5] =
-                                       ui_DummyValue;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       }       /* if(i_ConvertCJCCalibration==1) */
-                       else {
-                               /* BEGIN JK 06.07.04: Management of sevrals boards */
-                               /* ui_InterruptChannelValue[i_Count+4]=0; */
-                               /* ui_InterruptChannelValue[i_Count+5]=0; */
+       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
+       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
 
-                               s_BoardInfos[dev->minor].
-                                       ui_InterruptChannelValue[s_BoardInfos
-                                       [dev->minor].i_Count + 4] = 0;
-                               s_BoardInfos[dev->minor].
-                                       ui_InterruptChannelValue[s_BoardInfos
-                                       [dev->minor].i_Count + 5] = 0;
-                               /* END JK 06.07.04: Management of sevrals boards */
-                       }       /* elseif(i_ConvertCJCCalibration==1) */
-               }               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)) */
+               do {
 
-               /* BEGIN JK 06.07.04: Management of sevrals boards */
-               /* if(i_ScanType!=1) */
-               if (s_BoardInfos[dev->minor].i_ScanType != 1) {
-                       /* i_Count=0; */
-                       s_BoardInfos[dev->minor].i_Count = 0;
-               }               /* if(i_ScanType!=1) */
-               else {
-                       /* i_Count=i_Count +6; */
-                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-                       /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count +6; */
-                       s_BoardInfos[dev->minor].i_Count =
-                               s_BoardInfos[dev->minor].i_Count + 9;
-                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-               }               /* else if(i_ScanType!=1) */
+         /*******************/
+                       /*Read the EOC flag */
+         /*******************/
 
-               /* if((i_ScanType==1) &&(i_InterruptFlag==1)) */
-               if ((s_BoardInfos[dev->minor].i_ScanType == 1)
-                       && (s_BoardInfos[dev->minor].i_InterruptFlag == 1)) {
-                       /* i_Count=i_Count-6; */
-                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-                       /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count-6; */
-                       s_BoardInfos[dev->minor].i_Count =
-                               s_BoardInfos[dev->minor].i_Count - 9;
-                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-               }
-               /* if(i_ScanType==0) */
-               if (s_BoardInfos[dev->minor].i_ScanType == 0) {
-                       /*
-                          data[0]= ui_InterruptChannelValue[0];
-                          data[1]= ui_InterruptChannelValue[1];
-                          data[2]= ui_InterruptChannelValue[2];
-                          data[3]= ui_InterruptChannelValue[3];
-                          data[4]= ui_InterruptChannelValue[4];
-                          data[5]= ui_InterruptChannelValue[5];
-                        */
-#ifdef PRINT_INFO
-                       printk("\n data[0]= s_BoardInfos [dev->minor].ui_InterruptChannelValue[0];");
-#endif
-                       data[0] =
-                               s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[0];
-                       data[1] =
-                               s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[1];
-                       data[2] =
-                               s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[2];
-                       data[3] =
-                               s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[3];
-                       data[4] =
-                               s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[4];
-                       data[5] =
-                               s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[5];
+                       /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
+                       ui_EOC = inl(devpriv->iobase +
+                               s_BoardInfos[dev->minor].i_Offset + 20) & 1;
 
-                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-                       /* printk("\n 0 - i_APCI3200_GetChannelCalibrationValue data [6] = %lu, data [7] = %lu, data [8] = %lu", data [6], data [7], data [8]); */
-                       i_APCI3200_GetChannelCalibrationValue(dev,
-                               s_BoardInfos[dev->minor].ui_Channel_num,
-                               &data[6], &data[7], &data[8]);
-                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-               }
-               break;
-       case 1:
+               } while (ui_EOC != 1);
 
-               for (i = 0; i < insn->n; i++) {
-                       /* data[i]=ui_InterruptChannelValue[i]; */
-                       data[i] =
-                               s_BoardInfos[dev->minor].
-                               ui_InterruptChannelValue[i];
-               }
+      /************************************************/
+               /*Read the digital value of the calibration Gain */
+      /************************************************/
 
-               /* i_Count=0; */
-               /* i_Sum=0; */
-               /* if(i_ScanType==1) */
-               s_BoardInfos[dev->minor].i_Count = 0;
-               s_BoardInfos[dev->minor].i_Sum = 0;
-               if (s_BoardInfos[dev->minor].i_ScanType == 1) {
-                       /* i_Initialised=0; */
-                       /* i_InterruptFlag=0; */
-                       s_BoardInfos[dev->minor].i_Initialised = 0;
-                       s_BoardInfos[dev->minor].i_InterruptFlag = 0;
-                       /* END JK 06.07.04: Management of sevrals boards */
-               }
-               break;
-       default:
-               printk("\nThe parameters passed are in error\n");
-               i_APCI3200_Reset(dev);
-               return -EINVAL;
-       }                       /* switch(insn->unused[0]) */
+               /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
+               data[0] =
+                       inl(devpriv->iobase +
+                       s_BoardInfos[dev->minor].i_Offset + 28);
 
-       return insn->n;
+       }                       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
+       return 0;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_Read1AnalogInputChannel                 |
-  |                              (struct comedi_device *dev,struct comedi_subdevice *s,       |
-  |                     struct comedi_insn *insn,unsigned int *data)                      |
-  +----------------------------------------------------------------------------+
-  | Task              : Read  value  of the selected channel                            |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int ui_NoOfChannel    : Channel No to read            |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                              data[0]  : Digital Value read                   |
-  |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_Read1AnalogInputChannel(struct comedi_device *dev,
-       struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
+static int i_APCI3200_ReadCJCValue(struct comedi_device *dev,
+                                  unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
        unsigned int ui_EOC = 0;
-       unsigned int ui_ChannelNo = 0;
-       unsigned int ui_CommandRegister = 0;
-
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* ui_ChannelNo=i_ChannelNo; */
-       ui_ChannelNo = s_BoardInfos[dev->minor].i_ChannelNo;
+       int ui_CommandRegister = 0;
 
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-  /*********************************/
-       /* Write the channel to configure */
-  /*********************************/
-       /* Begin JK 20.10.2004: Bad channel value is used when using differential mode */
-       /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
-       /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
-       outl(0 | s_BoardInfos[dev->minor].i_ChannelNo,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
-       /* End JK 20.10.2004: Bad channel value is used when using differential mode */
+  /******************************/
+       /*Set the converting time unit */
+  /******************************/
 
-  /*******************************/
-       /* Set the convert timing unit */
-  /*******************************/
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
@@ -1688,7 +1086,6 @@ int i_APCI3200_Read1AnalogInputChannel(struct comedi_device *dev,
        /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
        outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
-
   /**************************/
        /* Set the convert timing */
   /**************************/
@@ -1700,44 +1097,58 @@ int i_APCI3200_Read1AnalogInputChannel(struct comedi_device *dev,
        outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
 
-  /**************************************************************************/
-       /* Set the start end stop index to the selected channel and set the start */
-  /**************************************************************************/
-
-       ui_CommandRegister = ui_ChannelNo | (ui_ChannelNo << 8) | 0x80000;
+  /******************************/
+       /*Configure the CJC Conversion */
+  /******************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
 
+       /* outl( 0x00000400 , devpriv->iobase+i_Offset + 4); */
+       outl(0x00000400,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
+  /*******************************/
+       /*Initialise dw_CommandRegister */
+  /*******************************/
+       ui_CommandRegister = 0;
   /*********************************/
        /*Test if the interrupt is enable */
   /*********************************/
-
        /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
        if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
-      /************************/
-               /* Enable the interrupt */
-      /************************/
+      /**********************/
+               /*Enable the interrupt */
+      /**********************/
                ui_CommandRegister = ui_CommandRegister | 0x00100000;
-       }                       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
+       }
 
-  /******************************/
-       /* Write the command register */
-  /******************************/
+  /**********************/
+       /*Start the conversion */
+  /**********************/
+
+       ui_CommandRegister = ui_CommandRegister | 0x00080000;
+
+  /***************************/
+       /*Write the command regiter */
+  /***************************/
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-
-       /* outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8); */
+       /* outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8); */
        outl(ui_CommandRegister,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
 
   /*****************************/
        /*Test if interrupt is enable */
   /*****************************/
+
        /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
        if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
                do {
-         /*************************/
-                       /*Read the EOC Status bit */
-         /*************************/
+
+         /*******************/
+                       /*Read the EOC flag */
+         /*******************/
 
                        /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
                        ui_EOC = inl(devpriv->iobase +
@@ -1745,58 +1156,29 @@ int i_APCI3200_Read1AnalogInputChannel(struct comedi_device *dev,
 
                } while (ui_EOC != 1);
 
-      /***************************************/
-               /* Read the digital value of the input */
-      /***************************************/
+      /***********************************/
+               /*Read the digital value of the CJC */
+      /***********************************/
 
-               /* data[0] = inl (devpriv->iobase+i_Offset + 28); */
+               /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
                data[0] =
                        inl(devpriv->iobase +
                        s_BoardInfos[dev->minor].i_Offset + 28);
-               /* END JK 06.07.04: Management of sevrals boards */
 
-       }                       /*  if (i_InterruptFlag == ADDIDATA_DISABLE) */
+       }                       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
        return 0;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadCalibrationOffsetValue              |
-  |                              (struct comedi_device *dev,struct comedi_subdevice *s,       |
-  |                     struct comedi_insn *insn,unsigned int *data)                      |
-  +----------------------------------------------------------------------------+
-  | Task              : Read calibration offset  value  of the selected channel|
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                              data[0]  : Calibration offset Value   |
-  |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ReadCalibrationOffsetValue(struct comedi_device *dev, unsigned int *data)
+static int i_APCI3200_ReadCJCCalOffset(struct comedi_device *dev,
+                                      unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int ui_Temp = 0, ui_EOC = 0;
-       unsigned int ui_CommandRegister = 0;
-
-       /* BEGIN JK 06.07.04: Management of sevrals boards */
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-  /*********************************/
-       /* Write the channel to configure */
-  /*********************************/
-       /* Begin JK 20.10.2004: This seems not necessary ! */
-       /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
-       /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
-       /* End JK 20.10.2004: This seems not necessary ! */
+       unsigned int ui_EOC = 0;
+       int ui_CommandRegister = 0;
 
+  /*******************************************/
+       /*Read calibration offset value for the CJC */
+  /*******************************************/
   /*******************************/
        /* Set the convert timing unit */
   /*******************************/
@@ -1815,80 +1197,69 @@ int i_APCI3200_ReadCalibrationOffsetValue(struct comedi_device *dev, unsigned in
        /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
        outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
-  /*****************************/
-       /*Read the calibration offset */
-  /*****************************/
-       /* ui_Temp = inl(devpriv->iobase+i_Offset + 12); */
-       ui_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
-
+  /******************************/
+       /*Configure the CJC Conversion */
+  /******************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl(0x00000400 , devpriv->iobase+i_Offset + 4); */
+       outl(0x00000400,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
   /*********************************/
        /*Configure the Offset Conversion */
   /*********************************/
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* outl((ui_Temp | 0x00020000), devpriv->iobase+i_Offset + 12); */
-       outl((ui_Temp | 0x00020000),
+       /* outl(0x00020000, devpriv->iobase+i_Offset + 12); */
+       outl(0x00020000,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
   /*******************************/
        /*Initialise ui_CommandRegister */
   /*******************************/
-
        ui_CommandRegister = 0;
-
   /*********************************/
        /*Test if the interrupt is enable */
   /*********************************/
 
        /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
        if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
-
       /**********************/
                /*Enable the interrupt */
       /**********************/
-
                ui_CommandRegister = ui_CommandRegister | 0x00100000;
 
-       }                       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
+       }
 
   /**********************/
        /*Start the conversion */
   /**********************/
        ui_CommandRegister = ui_CommandRegister | 0x00080000;
-
   /***************************/
        /*Write the command regiter */
   /***************************/
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8); */
+       /* outl(ui_CommandRegister,devpriv->iobase+i_Offset + 8); */
        outl(ui_CommandRegister,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
-
-  /*****************************/
-       /*Test if interrupt is enable */
-  /*****************************/
-
        /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
        if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
-
                do {
          /*******************/
                        /*Read the EOC flag */
          /*******************/
-
-                       /* ui_EOC = inl (devpriv->iobase+i_Offset + 20) & 1; */
+                       /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
                        ui_EOC = inl(devpriv->iobase +
                                s_BoardInfos[dev->minor].i_Offset + 20) & 1;
-
                } while (ui_EOC != 1);
 
       /**************************************************/
                /*Read the digital value of the calibration Offset */
       /**************************************************/
-
-               /* data[0] = inl(devpriv->iobase+i_Offset+ 28); */
+               /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
                data[0] =
                        inl(devpriv->iobase +
                        s_BoardInfos[dev->minor].i_Offset + 28);
@@ -1896,46 +1267,13 @@ int i_APCI3200_ReadCalibrationOffsetValue(struct comedi_device *dev, unsigned in
        return 0;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadCalibrationGainValue                |
-  |                              (struct comedi_device *dev,struct comedi_subdevice *s,       |
-  |                     struct comedi_insn *insn,unsigned int *data)                      |
-  +----------------------------------------------------------------------------+
-  | Task              : Read calibration gain  value  of the selected channel  |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                              data[0]  : Calibration gain Value Of Input     |
-  |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ReadCalibrationGainValue(struct comedi_device *dev, unsigned int *data)
+static int i_APCI3200_ReadCJCCalGain(struct comedi_device *dev,
+                                    unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
        unsigned int ui_EOC = 0;
        int ui_CommandRegister = 0;
 
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-  /*********************************/
-       /* Write the channel to configure */
-  /*********************************/
-       /* Begin JK 20.10.2004: This seems not necessary ! */
-       /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
-       /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
-       /* End JK 20.10.2004: This seems not necessary ! */
-
-  /***************************/
-       /*Read the calibration gain */
-  /***************************/
   /*******************************/
        /* Set the convert timing unit */
   /*******************************/
@@ -1954,41 +1292,42 @@ int i_APCI3200_ReadCalibrationGainValue(struct comedi_device *dev, unsigned int
        /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
        outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
+  /******************************/
+       /*Configure the CJC Conversion */
+  /******************************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl(0x00000400,devpriv->iobase+i_Offset + 4); */
+       outl(0x00000400,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
   /*******************************/
        /*Configure the Gain Conversion */
   /*******************************/
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* outl(0x00040000 , devpriv->iobase+i_Offset + 12); */
+       /* outl(0x00040000,devpriv->iobase+i_Offset + 12); */
        outl(0x00040000,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
 
   /*******************************/
-       /*Initialise ui_CommandRegister */
+       /*Initialise dw_CommandRegister */
   /*******************************/
-
        ui_CommandRegister = 0;
-
   /*********************************/
        /*Test if the interrupt is enable */
   /*********************************/
-
        /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
        if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
-
       /**********************/
                /*Enable the interrupt */
       /**********************/
-
                ui_CommandRegister = ui_CommandRegister | 0x00100000;
-
-       }                       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
-
+       }
   /**********************/
        /*Start the conversion */
   /**********************/
-
        ui_CommandRegister = ui_CommandRegister | 0x00080000;
   /***************************/
        /*Write the command regiter */
@@ -1996,426 +1335,861 @@ int i_APCI3200_ReadCalibrationGainValue(struct comedi_device *dev, unsigned int
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8); */
+       /* outl(ui_CommandRegister ,devpriv->iobase+i_Offset + 8); */
        outl(ui_CommandRegister,
                devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
-
-  /*****************************/
-       /*Test if interrupt is enable */
-  /*****************************/
-
        /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
        if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
-
                do {
-
          /*******************/
                        /*Read the EOC flag */
          /*******************/
-
                        /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
                        ui_EOC = inl(devpriv->iobase +
                                s_BoardInfos[dev->minor].i_Offset + 20) & 1;
-
                } while (ui_EOC != 1);
-
       /************************************************/
                /*Read the digital value of the calibration Gain */
       /************************************************/
-
-               /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
+               /* data[0] = inl (devpriv->iobase+i_Offset + 28); */
                data[0] =
                        inl(devpriv->iobase +
                        s_BoardInfos[dev->minor].i_Offset + 28);
-
        }                       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
        return 0;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadCJCValue                            |
-  |                              (struct comedi_device *dev,struct comedi_subdevice *s,       |
-  |                     struct comedi_insn *insn,unsigned int *data)                      |
-  +----------------------------------------------------------------------------+
-  | Task              : Read CJC  value  of the selected channel               |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                              data[0]  : CJC Value                           |
-  |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-
-int i_APCI3200_ReadCJCValue(struct comedi_device *dev, unsigned int *data)
+static int i_APCI3200_Reset(struct comedi_device *dev)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int ui_EOC = 0;
-       int ui_CommandRegister = 0;
+       int i_Temp;
+       unsigned int dw_Dummy;
 
-  /******************************/
-       /*Set the converting time unit */
-  /******************************/
+       /* i_InterruptFlag=0; */
+       /* i_Initialised==0; */
+       /* i_Count=0; */
+       /* i_Sum=0; */
 
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
+       s_BoardInfos[dev->minor].i_InterruptFlag = 0;
+       s_BoardInfos[dev->minor].i_Initialised = 0;
+       s_BoardInfos[dev->minor].i_Count = 0;
+       s_BoardInfos[dev->minor].i_Sum = 0;
+       s_BoardInfos[dev->minor].b_StructInitialized = 0;
 
-       /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
-       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
-  /**************************/
-       /* Set the convert timing */
-  /**************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
+       outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
 
-       /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
-       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
+       /*  Enable the interrupt for the controller */
+       dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
+       outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
+       outl(0, devpriv->i_IobaseAddon);        /* Resets the output */
+  /***************/
+       /*Empty the buffer */
+  /**************/
+       for (i_Temp = 0; i_Temp <= 95; i_Temp++) {
+               /* ui_InterruptChannelValue[i_Temp]=0; */
+               s_BoardInfos[dev->minor].ui_InterruptChannelValue[i_Temp] = 0;
+       }                       /* for(i_Temp=0;i_Temp<=95;i_Temp++) */
+  /*****************************/
+       /*Reset the START and IRQ bit */
+  /*****************************/
+       for (i_Temp = 0; i_Temp <= 192;) {
+               while (((inl(devpriv->iobase + i_Temp + 12) >> 19) & 1) != 1) ;
+               outl(0, devpriv->iobase + i_Temp + 8);
+               i_Temp = i_Temp + 64;
+       }                       /* for(i_Temp=0;i_Temp<=192;i_Temp+64) */
+       return 0;
+}
 
-  /******************************/
-       /*Configure the CJC Conversion */
-  /******************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
+/*
+ * Read value of the selected channel
+ *
+ * data[0]  : Digital Value Of Input
+ * data[1]  : Calibration Offset Value
+ * data[2]  : Calibration Gain Value
+ * data[3]  : CJC value
+ * data[4]  : CJC offset value
+ * data[5]  : CJC gain value
+ * data[6] : CJC current source from eeprom
+ * data[7] : Channel current source from eeprom
+ * data[8] : Channle gain factor from eeprom
+ */
+static int i_APCI3200_ReadAnalogInput(struct comedi_device *dev,
+                                     struct comedi_subdevice *s,
+                                     struct comedi_insn *insn,
+                                     unsigned int *data)
+{
+       unsigned int ui_DummyValue = 0;
+       int i_ConvertCJCCalibration;
+       int i = 0;
 
-       /* outl( 0x00000400 , devpriv->iobase+i_Offset + 4); */
-       outl(0x00000400,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
-  /*******************************/
-       /*Initialise dw_CommandRegister */
-  /*******************************/
-       ui_CommandRegister = 0;
-  /*********************************/
-       /*Test if the interrupt is enable */
-  /*********************************/
-       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
-       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
-      /**********************/
-               /*Enable the interrupt */
-      /**********************/
-               ui_CommandRegister = ui_CommandRegister | 0x00100000;
-       }
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* if(i_Initialised==0) */
+       if (s_BoardInfos[dev->minor].i_Initialised == 0)
+               /* END JK 06.07.04: Management of sevrals boards */
+       {
+               i_APCI3200_Reset(dev);
+               return -EINVAL;
+       }                       /* if(i_Initialised==0); */
 
-  /**********************/
-       /*Start the conversion */
-  /**********************/
+#ifdef PRINT_INFO
+       printk("\n insn->unused[0] = %i", insn->unused[0]);
+#endif
 
-       ui_CommandRegister = ui_CommandRegister | 0x00080000;
+       switch (insn->unused[0]) {
+       case 0:
 
-  /***************************/
-       /*Write the command regiter */
-  /***************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8); */
-       outl(ui_CommandRegister,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
+               i_APCI3200_Read1AnalogInputChannel(dev, s, insn,
+                       &ui_DummyValue);
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* ui_InterruptChannelValue[i_Count+0]=ui_DummyValue; */
+               s_BoardInfos[dev->minor].
+                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
+                       i_Count + 0] = ui_DummyValue;
+               /* END JK 06.07.04: Management of sevrals boards */
 
-  /*****************************/
-       /*Test if interrupt is enable */
-  /*****************************/
+               /* Begin JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+               i_APCI3200_GetChannelCalibrationValue(dev,
+                       s_BoardInfos[dev->minor].ui_Channel_num,
+                       &s_BoardInfos[dev->minor].
+                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
+                               i_Count + 6],
+                       &s_BoardInfos[dev->minor].
+                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
+                               i_Count + 7],
+                       &s_BoardInfos[dev->minor].
+                       ui_InterruptChannelValue[s_BoardInfos[dev->minor].
+                               i_Count + 8]);
 
-       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
-       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
-               do {
+#ifdef PRINT_INFO
+               printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+6] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 6]);
 
-         /*******************/
-                       /*Read the EOC flag */
-         /*******************/
+               printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+7] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 7]);
 
-                       /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
-                       ui_EOC = inl(devpriv->iobase +
-                               s_BoardInfos[dev->minor].i_Offset + 20) & 1;
+               printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+8] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 8]);
+#endif
 
-               } while (ui_EOC != 1);
+               /* End JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
 
-      /***********************************/
-               /*Read the digital value of the CJC */
-      /***********************************/
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1)) */
+               if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
+                       && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
+                       && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
+                       /* END JK 06.07.04: Management of sevrals boards */
+               {
+                       i_APCI3200_ReadCJCValue(dev, &ui_DummyValue);
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* ui_InterruptChannelValue[i_Count + 3]=ui_DummyValue; */
+                       s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[s_BoardInfos[dev->
+                                       minor].i_Count + 3] = ui_DummyValue;
+                       /* END JK 06.07.04: Management of sevrals boards */
+               }               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)) */
+               else {
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* ui_InterruptChannelValue[i_Count + 3]=0; */
+                       s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[s_BoardInfos[dev->
+                                       minor].i_Count + 3] = 0;
+                       /* END JK 06.07.04: Management of sevrals boards */
+               }               /* elseif((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1)) */
 
-               /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
-               data[0] =
-                       inl(devpriv->iobase +
-                       s_BoardInfos[dev->minor].i_Offset + 28);
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE)) */
+               if ((s_BoardInfos[dev->minor].i_AutoCalibration == FALSE)
+                       && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE))
+                       /* END JK 06.07.04: Management of sevrals boards */
+               {
+                       i_APCI3200_ReadCalibrationOffsetValue(dev,
+                               &ui_DummyValue);
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* ui_InterruptChannelValue[i_Count + 1]=ui_DummyValue; */
+                       s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[s_BoardInfos[dev->
+                                       minor].i_Count + 1] = ui_DummyValue;
+                       /* END JK 06.07.04: Management of sevrals boards */
+                       i_APCI3200_ReadCalibrationGainValue(dev,
+                               &ui_DummyValue);
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* ui_InterruptChannelValue[i_Count + 2]=ui_DummyValue; */
+                       s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[s_BoardInfos[dev->
+                                       minor].i_Count + 2] = ui_DummyValue;
+                       /* END JK 06.07.04: Management of sevrals boards */
+               }               /* if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE)) */
 
-       }                       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
-       return 0;
-}
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)&& (i_CJCAvailable==1)) */
+               if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
+                       && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
+                       && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
+                       /* END JK 06.07.04: Management of sevrals boards */
+               {
+         /**********************************************************/
+                       /*Test if the Calibration channel must be read for the CJC */
+         /**********************************************************/
+         /**********************************/
+                       /*Test if the polarity is the same */
+         /**********************************/
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
+                       if (s_BoardInfos[dev->minor].i_CJCPolarity !=
+                               s_BoardInfos[dev->minor].i_ADDIDATAPolarity)
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       {
+                               i_ConvertCJCCalibration = 1;
+                       }       /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
+                       else {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* if(i_CJCGain==i_ADDIDATAGain) */
+                               if (s_BoardInfos[dev->minor].i_CJCGain ==
+                                       s_BoardInfos[dev->minor].i_ADDIDATAGain)
+                                       /* END JK 06.07.04: Management of sevrals boards */
+                               {
+                                       i_ConvertCJCCalibration = 0;
+                               }       /* if(i_CJCGain==i_ADDIDATAGain) */
+                               else {
+                                       i_ConvertCJCCalibration = 1;
+                               }       /* elseif(i_CJCGain==i_ADDIDATAGain) */
+                       }       /* elseif(i_CJCPolarity!=i_ADDIDATAPolarity) */
+                       if (i_ConvertCJCCalibration == 1) {
+                               i_APCI3200_ReadCJCCalOffset(dev,
+                                       &ui_DummyValue);
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* ui_InterruptChannelValue[i_Count+4]=ui_DummyValue; */
+                               s_BoardInfos[dev->minor].
+                                       ui_InterruptChannelValue[s_BoardInfos
+                                       [dev->minor].i_Count + 4] =
+                                       ui_DummyValue;
+                               /* END JK 06.07.04: Management of sevrals boards */
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadCJCCalOffset                        |
-  |                              (struct comedi_device *dev,struct comedi_subdevice *s,       |
-  |                     struct comedi_insn *insn,unsigned int *data)                      |
-  +----------------------------------------------------------------------------+
-  | Task              : Read CJC calibration offset  value  of the selected channel
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                              data[0]  : CJC calibration offset Value
-  |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ReadCJCCalOffset(struct comedi_device *dev, unsigned int *data)
-{
-       struct addi_private *devpriv = dev->private;
-       unsigned int ui_EOC = 0;
-       int ui_CommandRegister = 0;
+                               i_APCI3200_ReadCJCCalGain(dev, &ui_DummyValue);
 
-  /*******************************************/
-       /*Read calibration offset value for the CJC */
-  /*******************************************/
-  /*******************************/
-       /* Set the convert timing unit */
-  /*******************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
-       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
-  /**************************/
-       /* Set the convert timing */
-  /**************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
-       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
-  /******************************/
-       /*Configure the CJC Conversion */
-  /******************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(0x00000400 , devpriv->iobase+i_Offset + 4); */
-       outl(0x00000400,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
-  /*********************************/
-       /*Configure the Offset Conversion */
-  /*********************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(0x00020000, devpriv->iobase+i_Offset + 12); */
-       outl(0x00020000,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
-  /*******************************/
-       /*Initialise ui_CommandRegister */
-  /*******************************/
-       ui_CommandRegister = 0;
-  /*********************************/
-       /*Test if the interrupt is enable */
-  /*********************************/
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* ui_InterruptChannelValue[i_Count+5]=ui_DummyValue; */
+                               s_BoardInfos[dev->minor].
+                                       ui_InterruptChannelValue[s_BoardInfos
+                                       [dev->minor].i_Count + 5] =
+                                       ui_DummyValue;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       }       /* if(i_ConvertCJCCalibration==1) */
+                       else {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* ui_InterruptChannelValue[i_Count+4]=0; */
+                               /* ui_InterruptChannelValue[i_Count+5]=0; */
 
-       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
-       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
-      /**********************/
-               /*Enable the interrupt */
-      /**********************/
-               ui_CommandRegister = ui_CommandRegister | 0x00100000;
+                               s_BoardInfos[dev->minor].
+                                       ui_InterruptChannelValue[s_BoardInfos
+                                       [dev->minor].i_Count + 4] = 0;
+                               s_BoardInfos[dev->minor].
+                                       ui_InterruptChannelValue[s_BoardInfos
+                                       [dev->minor].i_Count + 5] = 0;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       }       /* elseif(i_ConvertCJCCalibration==1) */
+               }               /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)) */
 
-       }
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* if(i_ScanType!=1) */
+               if (s_BoardInfos[dev->minor].i_ScanType != 1) {
+                       /* i_Count=0; */
+                       s_BoardInfos[dev->minor].i_Count = 0;
+               }               /* if(i_ScanType!=1) */
+               else {
+                       /* i_Count=i_Count +6; */
+                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+                       /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count +6; */
+                       s_BoardInfos[dev->minor].i_Count =
+                               s_BoardInfos[dev->minor].i_Count + 9;
+                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+               }               /* else if(i_ScanType!=1) */
 
-  /**********************/
-       /*Start the conversion */
-  /**********************/
-       ui_CommandRegister = ui_CommandRegister | 0x00080000;
-  /***************************/
-       /*Write the command regiter */
-  /***************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(ui_CommandRegister,devpriv->iobase+i_Offset + 8); */
-       outl(ui_CommandRegister,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
-       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
-       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
-               do {
-         /*******************/
-                       /*Read the EOC flag */
-         /*******************/
-                       /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
-                       ui_EOC = inl(devpriv->iobase +
-                               s_BoardInfos[dev->minor].i_Offset + 20) & 1;
-               } while (ui_EOC != 1);
+               /* if((i_ScanType==1) &&(i_InterruptFlag==1)) */
+               if ((s_BoardInfos[dev->minor].i_ScanType == 1)
+                       && (s_BoardInfos[dev->minor].i_InterruptFlag == 1)) {
+                       /* i_Count=i_Count-6; */
+                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+                       /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count-6; */
+                       s_BoardInfos[dev->minor].i_Count =
+                               s_BoardInfos[dev->minor].i_Count - 9;
+                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+               }
+               /* if(i_ScanType==0) */
+               if (s_BoardInfos[dev->minor].i_ScanType == 0) {
+                       /*
+                          data[0]= ui_InterruptChannelValue[0];
+                          data[1]= ui_InterruptChannelValue[1];
+                          data[2]= ui_InterruptChannelValue[2];
+                          data[3]= ui_InterruptChannelValue[3];
+                          data[4]= ui_InterruptChannelValue[4];
+                          data[5]= ui_InterruptChannelValue[5];
+                        */
+#ifdef PRINT_INFO
+                       printk("\n data[0]= s_BoardInfos [dev->minor].ui_InterruptChannelValue[0];");
+#endif
+                       data[0] =
+                               s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[0];
+                       data[1] =
+                               s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[1];
+                       data[2] =
+                               s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[2];
+                       data[3] =
+                               s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[3];
+                       data[4] =
+                               s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[4];
+                       data[5] =
+                               s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[5];
 
-      /**************************************************/
-               /*Read the digital value of the calibration Offset */
-      /**************************************************/
-               /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
-               data[0] =
-                       inl(devpriv->iobase +
-                       s_BoardInfos[dev->minor].i_Offset + 28);
-       }                       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
-       return 0;
+                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+                       /* printk("\n 0 - i_APCI3200_GetChannelCalibrationValue data [6] = %lu, data [7] = %lu, data [8] = %lu", data [6], data [7], data [8]); */
+                       i_APCI3200_GetChannelCalibrationValue(dev,
+                               s_BoardInfos[dev->minor].ui_Channel_num,
+                               &data[6], &data[7], &data[8]);
+                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+               }
+               break;
+       case 1:
+
+               for (i = 0; i < insn->n; i++) {
+                       /* data[i]=ui_InterruptChannelValue[i]; */
+                       data[i] =
+                               s_BoardInfos[dev->minor].
+                               ui_InterruptChannelValue[i];
+               }
+
+               /* i_Count=0; */
+               /* i_Sum=0; */
+               /* if(i_ScanType==1) */
+               s_BoardInfos[dev->minor].i_Count = 0;
+               s_BoardInfos[dev->minor].i_Sum = 0;
+               if (s_BoardInfos[dev->minor].i_ScanType == 1) {
+                       /* i_Initialised=0; */
+                       /* i_InterruptFlag=0; */
+                       s_BoardInfos[dev->minor].i_Initialised = 0;
+                       s_BoardInfos[dev->minor].i_InterruptFlag = 0;
+                       /* END JK 06.07.04: Management of sevrals boards */
+               }
+               break;
+       default:
+               printk("\nThe parameters passed are in error\n");
+               i_APCI3200_Reset(dev);
+               return -EINVAL;
+       }                       /* switch(insn->unused[0]) */
+
+       return insn->n;
 }
 
 /*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_ReadCJCGainValue                        |
-  |                              (struct comedi_device *dev,struct comedi_subdevice *s,       |
-  |                     struct comedi_insn *insn,unsigned int *data)                      |
-  +----------------------------------------------------------------------------+
-  | Task              : Read CJC calibration gain value
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     unsigned int ui_NoOfChannels    : No Of Channels To read       |
-  |                     unsigned int *data              : Data Pointer to read status  |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                              data[0]  : CJC calibration gain value
-  |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_ReadCJCCalGain(struct comedi_device *dev, unsigned int *data)
+ * Configures The Analog Input Subdevice
+ *
+ * data[0]  = 0  Normal AI
+ *         = 1  RTD
+ *         = 2  THERMOCOUPLE
+ * data[1]  = Gain To Use
+ * data[2]  = 0  Bipolar
+ *         = 1  Unipolar
+ * data[3]  = Offset Range
+ * data[4]  = 0  DC Coupling
+ *         = 1  AC Coupling
+ * data[5]  = 0  Single
+ *         = 1  Differential
+ * data[6]  = TimerReloadValue
+ * data[7]  = ConvertingTimeUnit
+ * data[8]  = 0  Analog voltage measurement
+ *         = 1  Resistance measurement
+ *         = 2  Temperature measurement
+ * data[9]  = 0  Interrupt Disable
+ *         = 1  INterrupt Enable
+ * data[10] = Type of Thermocouple
+ * data[11] = single channel Module Number
+ * data[12] = 0  Single Read
+ *         = 1  Read more channel
+ *         = 2  Single scan
+ *         = 3  Continuous Scan
+ * data[13] = Number of channels to read
+ * data[14] = 0  RTD not used
+ *         = 1  RTD 2 wire connection
+ *         = 2  RTD 3 wire connection
+ *         = 3  RTD 4 wire connection
+ */
+static int i_APCI3200_ConfigAnalogInput(struct comedi_device *dev,
+                                       struct comedi_subdevice *s,
+                                       struct comedi_insn *insn,
+                                       unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
-       unsigned int ui_EOC = 0;
-       int ui_CommandRegister = 0;
+       unsigned int ul_Config = 0, ul_Temp = 0;
+       unsigned int ui_ChannelNo = 0;
+       unsigned int ui_Dummy = 0;
+       int i_err = 0;
 
-  /*******************************/
-       /* Set the convert timing unit */
-  /*******************************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
-       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
-  /**************************/
-       /* Set the convert timing */
-  /**************************/
+       /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+
+#ifdef PRINT_INFO
+       int i = 0, i2 = 0;
+#endif
+       /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /*  Initialize the structure */
+       if (s_BoardInfos[dev->minor].b_StructInitialized != 1) {
+               s_BoardInfos[dev->minor].i_CJCAvailable = 1;
+               s_BoardInfos[dev->minor].i_CJCPolarity = 0;
+               s_BoardInfos[dev->minor].i_CJCGain = 2; /* changed from 0 to 2 */
+               s_BoardInfos[dev->minor].i_InterruptFlag = 0;
+               s_BoardInfos[dev->minor].i_AutoCalibration = 0; /* : auto calibration */
+               s_BoardInfos[dev->minor].i_ChannelCount = 0;
+               s_BoardInfos[dev->minor].i_Sum = 0;
+               s_BoardInfos[dev->minor].ui_Channel_num = 0;
+               s_BoardInfos[dev->minor].i_Count = 0;
+               s_BoardInfos[dev->minor].i_Initialised = 0;
+               s_BoardInfos[dev->minor].b_StructInitialized = 1;
+
+               /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+               s_BoardInfos[dev->minor].i_ConnectionType = 0;
+               /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+
+               /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+               memset(s_BoardInfos[dev->minor].s_Module, 0,
+                       sizeof(s_BoardInfos[dev->minor].s_Module[MAX_MODULE]));
+
+               v_GetAPCI3200EepromCalibrationValue(devpriv->i_IobaseAmcc,
+                       &s_BoardInfos[dev->minor]);
+
+#ifdef PRINT_INFO
+               for (i = 0; i < MAX_MODULE; i++) {
+                       printk("\n s_Module[%i].ul_CurrentSourceCJC = %lu", i,
+                               s_BoardInfos[dev->minor].s_Module[i].
+                               ul_CurrentSourceCJC);
+
+                       for (i2 = 0; i2 < 5; i2++) {
+                               printk("\n s_Module[%i].ul_CurrentSource [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_CurrentSource[i2]);
+                       }
+
+                       for (i2 = 0; i2 < 8; i2++) {
+                               printk("\n s_Module[%i].ul_GainFactor [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_GainFactor[i2]);
+                       }
+
+                       for (i2 = 0; i2 < 8; i2++) {
+                               printk("\n s_Module[%i].w_GainValue [%i] = %u",
+                                       i, i2,
+                                       s_BoardInfos[dev->minor].s_Module[i].
+                                       w_GainValue[i2]);
+                       }
+               }
+#endif
+               /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+       }
+
+       if (data[0] != 0 && data[0] != 1 && data[0] != 2) {
+               printk("\nThe selection of acquisition type is in error\n");
+               i_err++;
+       }                       /* if(data[0]!=0 && data[0]!=1 && data[0]!=2) */
+       if (data[0] == 1) {
+               if (data[14] != 0 && data[14] != 1 && data[14] != 2
+                       && data[14] != 4) {
+                       printk("\n Error in selection of RTD connection type\n");
+                       i_err++;
+               }               /* if(data[14]!=0 && data[14]!=1 && data[14]!=2 && data[14]!=4) */
+       }                       /* if(data[0]==1 ) */
+       if (data[1] < 0 || data[1] > 7) {
+               printk("\nThe selection of gain is in error\n");
+               i_err++;
+       }                       /*  if(data[1]<0 || data[1]>7) */
+       if (data[2] != 0 && data[2] != 1) {
+               printk("\nThe selection of polarity is in error\n");
+               i_err++;
+       }                       /* if(data[2]!=0 &&  data[2]!=1) */
+       if (data[3] != 0) {
+               printk("\nThe selection of offset range  is in error\n");
+               i_err++;
+       }                       /*  if(data[3]!=0) */
+       if (data[4] != 0 && data[4] != 1) {
+               printk("\nThe selection of coupling is in error\n");
+               i_err++;
+       }                       /* if(data[4]!=0 &&  data[4]!=1) */
+       if (data[5] != 0 && data[5] != 1) {
+               printk("\nThe selection of single/differential mode is in error\n");
+               i_err++;
+       }                       /* if(data[5]!=0 &&  data[5]!=1) */
+       if (data[8] != 0 && data[8] != 1 && data[2] != 2) {
+               printk("\nError in selection of functionality\n");
+       }                       /* if(data[8]!=0 && data[8]!=1 && data[2]!=2) */
+       if (data[12] == 0 || data[12] == 1) {
+               if (data[6] != 20 && data[6] != 40 && data[6] != 80
+                       && data[6] != 160) {
+                       printk("\nThe selection of conversion time reload value is in error\n");
+                       i_err++;
+               }               /*  if (data[6]!=20 && data[6]!=40 && data[6]!=80 && data[6]!=160 ) */
+               if (data[7] != 2) {
+                       printk("\nThe selection of conversion time unit  is in error\n");
+                       i_err++;
+               }               /*  if(data[7]!=2) */
+       }
+       if (data[9] != 0 && data[9] != 1) {
+               printk("\nThe selection of interrupt enable is in error\n");
+               i_err++;
+       }                       /* if(data[9]!=0 &&  data[9]!=1) */
+       if (data[11] < 0 || data[11] > 4) {
+               printk("\nThe selection of module is in error\n");
+               i_err++;
+       }                       /* if(data[11] <0 ||  data[11]>1) */
+       if (data[12] < 0 || data[12] > 3) {
+               printk("\nThe selection of singlechannel/scan selection is in error\n");
+               i_err++;
+       }                       /* if(data[12] < 0 ||  data[12]> 3) */
+       if (data[13] < 0 || data[13] > 16) {
+               printk("\nThe selection of number of channels is in error\n");
+               i_err++;
+       }                       /*  if(data[13] <0 ||data[13] >15) */
+
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /*
+          i_ChannelCount=data[13];
+          i_ScanType=data[12];
+          i_ADDIDATAPolarity = data[2];
+          i_ADDIDATAGain=data[1];
+          i_ADDIDATAConversionTime=data[6];
+          i_ADDIDATAConversionTimeUnit=data[7];
+          i_ADDIDATAType=data[0];
+        */
+
+       /*  Save acquisition configuration for the actual board */
+       s_BoardInfos[dev->minor].i_ChannelCount = data[13];
+       s_BoardInfos[dev->minor].i_ScanType = data[12];
+       s_BoardInfos[dev->minor].i_ADDIDATAPolarity = data[2];
+       s_BoardInfos[dev->minor].i_ADDIDATAGain = data[1];
+       s_BoardInfos[dev->minor].i_ADDIDATAConversionTime = data[6];
+       s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit = data[7];
+       s_BoardInfos[dev->minor].i_ADDIDATAType = data[0];
+       /* Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+       s_BoardInfos[dev->minor].i_ConnectionType = data[5];
+       /* End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+       /* END JK 06.07.04: Management of sevrals boards */
+
+       /* Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+       memset(s_BoardInfos[dev->minor].ui_ScanValueArray, 0, (7 + 12) * sizeof(unsigned int)); /*  7 is the maximal number of channels */
+       /* End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+
+       /* BEGIN JK 02.07.04 : This while can't be do, it block the process when using severals boards */
+       /* while(i_InterruptFlag==1) */
+       while (s_BoardInfos[dev->minor].i_InterruptFlag == 1) {
+#ifndef MSXBOX
+               udelay(1);
+#else
+               /*  In the case where the driver is compiled for the MSX-Box */
+               /*  we used a printk to have a little delay because udelay */
+               /*  seems to be broken under the MSX-Box. */
+               /*  This solution hat to be studied. */
+               printk("");
+#endif
+       }
+       /* END JK 02.07.04 : This while can't be do, it block the process when using severals boards */
+
+       ui_ChannelNo = CR_CHAN(insn->chanspec); /*  get the channel */
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* i_ChannelNo=ui_ChannelNo; */
+       /* ui_Channel_num =ui_ChannelNo; */
+
+       s_BoardInfos[dev->minor].i_ChannelNo = ui_ChannelNo;
+       s_BoardInfos[dev->minor].ui_Channel_num = ui_ChannelNo;
+
+       /* END JK 06.07.04: Management of sevrals boards */
+
+       if (data[5] == 0) {
+               if (ui_ChannelNo < 0 || ui_ChannelNo > 15) {
+                       printk("\nThe Selection of the channel is in error\n");
+                       i_err++;
+               }               /*  if(ui_ChannelNo<0 || ui_ChannelNo>15) */
+       }                       /* if(data[5]==0) */
+       else {
+               if (data[14] == 2) {
+                       if (ui_ChannelNo < 0 || ui_ChannelNo > 3) {
+                               printk("\nThe Selection of the channel is in error\n");
+                               i_err++;
+                       }       /*  if(ui_ChannelNo<0 || ui_ChannelNo>3) */
+               }               /* if(data[14]==2) */
+               else {
+                       if (ui_ChannelNo < 0 || ui_ChannelNo > 7) {
+                               printk("\nThe Selection of the channel is in error\n");
+                               i_err++;
+                       }       /*  if(ui_ChannelNo<0 || ui_ChannelNo>7) */
+               }               /* elseif(data[14]==2) */
+       }                       /* elseif(data[5]==0) */
+       if (data[12] == 0 || data[12] == 1) {
+               switch (data[5]) {
+               case 0:
+                       if (ui_ChannelNo >= 0 && ui_ChannelNo <= 3) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_Offset=0; */
+                               s_BoardInfos[dev->minor].i_Offset = 0;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       }       /* if(ui_ChannelNo >=0 && ui_ChannelNo <=3) */
+                       if (ui_ChannelNo >= 4 && ui_ChannelNo <= 7) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_Offset=64; */
+                               s_BoardInfos[dev->minor].i_Offset = 64;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       }       /* if(ui_ChannelNo >=4 && ui_ChannelNo <=7) */
+                       if (ui_ChannelNo >= 8 && ui_ChannelNo <= 11) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_Offset=128; */
+                               s_BoardInfos[dev->minor].i_Offset = 128;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       }       /* if(ui_ChannelNo >=8 && ui_ChannelNo <=11) */
+                       if (ui_ChannelNo >= 12 && ui_ChannelNo <= 15) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_Offset=192; */
+                               s_BoardInfos[dev->minor].i_Offset = 192;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       }       /* if(ui_ChannelNo >=12 && ui_ChannelNo <=15) */
+                       break;
+               case 1:
+                       if (data[14] == 2) {
+                               if (ui_ChannelNo == 0) {
+                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                                       /* i_Offset=0; */
+                                       s_BoardInfos[dev->minor].i_Offset = 0;
+                                       /* END JK 06.07.04: Management of sevrals boards */
+                               }       /* if(ui_ChannelNo ==0 ) */
+                               if (ui_ChannelNo == 1) {
+                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                                       /* i_Offset=0; */
+                                       s_BoardInfos[dev->minor].i_Offset = 64;
+                                       /* END JK 06.07.04: Management of sevrals boards */
+                               }       /*  if(ui_ChannelNo ==1) */
+                               if (ui_ChannelNo == 2) {
+                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                                       /* i_Offset=128; */
+                                       s_BoardInfos[dev->minor].i_Offset = 128;
+                                       /* END JK 06.07.04: Management of sevrals boards */
+                               }       /* if(ui_ChannelNo ==2 ) */
+                               if (ui_ChannelNo == 3) {
+                                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                                       /* i_Offset=192; */
+                                       s_BoardInfos[dev->minor].i_Offset = 192;
+                                       /* END JK 06.07.04: Management of sevrals boards */
+                               }       /* if(ui_ChannelNo ==3) */
+
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_ChannelNo=0; */
+                               s_BoardInfos[dev->minor].i_ChannelNo = 0;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                               ui_ChannelNo = 0;
+                               break;
+                       }       /* if(data[14]==2) */
+                       if (ui_ChannelNo >= 0 && ui_ChannelNo <= 1) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_Offset=0; */
+                               s_BoardInfos[dev->minor].i_Offset = 0;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                       }       /* if(ui_ChannelNo >=0 && ui_ChannelNo <=1) */
+                       if (ui_ChannelNo >= 2 && ui_ChannelNo <= 3) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_ChannelNo=i_ChannelNo-2; */
+                               /* i_Offset=64; */
+                               s_BoardInfos[dev->minor].i_ChannelNo =
+                                       s_BoardInfos[dev->minor].i_ChannelNo -
+                                       2;
+                               s_BoardInfos[dev->minor].i_Offset = 64;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                               ui_ChannelNo = ui_ChannelNo - 2;
+                       }       /* if(ui_ChannelNo >=2 && ui_ChannelNo <=3) */
+                       if (ui_ChannelNo >= 4 && ui_ChannelNo <= 5) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_ChannelNo=i_ChannelNo-4; */
+                               /* i_Offset=128; */
+                               s_BoardInfos[dev->minor].i_ChannelNo =
+                                       s_BoardInfos[dev->minor].i_ChannelNo -
+                                       4;
+                               s_BoardInfos[dev->minor].i_Offset = 128;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                               ui_ChannelNo = ui_ChannelNo - 4;
+                       }       /* if(ui_ChannelNo >=4 && ui_ChannelNo <=5) */
+                       if (ui_ChannelNo >= 6 && ui_ChannelNo <= 7) {
+                               /* BEGIN JK 06.07.04: Management of sevrals boards */
+                               /* i_ChannelNo=i_ChannelNo-6; */
+                               /* i_Offset=192; */
+                               s_BoardInfos[dev->minor].i_ChannelNo =
+                                       s_BoardInfos[dev->minor].i_ChannelNo -
+                                       6;
+                               s_BoardInfos[dev->minor].i_Offset = 192;
+                               /* END JK 06.07.04: Management of sevrals boards */
+                               ui_ChannelNo = ui_ChannelNo - 6;
+                       }       /* if(ui_ChannelNo >=6 && ui_ChannelNo <=7) */
+                       break;
+
+               default:
+                       printk("\n This selection of polarity does not exist\n");
+                       i_err++;
+               }               /* switch(data[2]) */
+       }                       /* if(data[12]==0 || data[12]==1) */
+       else {
+               switch (data[11]) {
+               case 1:
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* i_Offset=0; */
+                       s_BoardInfos[dev->minor].i_Offset = 0;
+                       /* END JK 06.07.04: Management of sevrals boards */
+                       break;
+               case 2:
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* i_Offset=64; */
+                       s_BoardInfos[dev->minor].i_Offset = 64;
+                       /* END JK 06.07.04: Management of sevrals boards */
+                       break;
+               case 3:
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* i_Offset=128; */
+                       s_BoardInfos[dev->minor].i_Offset = 128;
+                       /* END JK 06.07.04: Management of sevrals boards */
+                       break;
+               case 4:
+                       /* BEGIN JK 06.07.04: Management of sevrals boards */
+                       /* i_Offset=192; */
+                       s_BoardInfos[dev->minor].i_Offset = 192;
+                       /* END JK 06.07.04: Management of sevrals boards */
+                       break;
+               default:
+                       printk("\nError in module selection\n");
+                       i_err++;
+               }               /*  switch(data[11]) */
+       }                       /*  elseif(data[12]==0 || data[12]==1) */
+       if (i_err) {
+               i_APCI3200_Reset(dev);
+               return -EINVAL;
+       }
+       /* if(i_ScanType!=1) */
+       if (s_BoardInfos[dev->minor].i_ScanType != 1) {
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* i_Count=0; */
+               /* i_Sum=0; */
+               s_BoardInfos[dev->minor].i_Count = 0;
+               s_BoardInfos[dev->minor].i_Sum = 0;
+               /* END JK 06.07.04: Management of sevrals boards */
+       }                       /* if(i_ScanType!=1) */
+
+       ul_Config =
+               data[1] | (data[2] << 6) | (data[5] << 7) | (data[3] << 8) |
+               (data[4] << 9);
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
-       outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
-  /******************************/
-       /*Configure the CJC Conversion */
-  /******************************/
+       /* END JK 06.07.04: Management of sevrals boards */
+  /*********************************/
+       /* Write the channel to configure */
+  /*********************************/
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* outl(0 | ui_ChannelNo , devpriv->iobase+i_Offset + 0x4); */
+       outl(0 | ui_ChannelNo,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
+       /* END JK 06.07.04: Management of sevrals boards */
+
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl(0x00000400,devpriv->iobase+i_Offset + 4); */
-       outl(0x00000400,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
-  /*******************************/
-       /*Configure the Gain Conversion */
-  /*******************************/
+                                       12) >> 19) & 1) != 1) ;
+       /* END JK 06.07.04: Management of sevrals boards */
+  /**************************/
+       /* Reset the configuration */
+  /**************************/
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* outl(0 , devpriv->iobase+i_Offset + 0x0); */
+       outl(0, devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
+       /* END JK 06.07.04: Management of sevrals boards */
+
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* outl(0x00040000,devpriv->iobase+i_Offset + 12); */
-       outl(0x00040000,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
+       /* END JK 06.07.04: Management of sevrals boards */
 
-  /*******************************/
-       /*Initialise dw_CommandRegister */
-  /*******************************/
-       ui_CommandRegister = 0;
-  /*********************************/
-       /*Test if the interrupt is enable */
-  /*********************************/
-       /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
-       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
-      /**********************/
-               /*Enable the interrupt */
-      /**********************/
-               ui_CommandRegister = ui_CommandRegister | 0x00100000;
-       }
-  /**********************/
-       /*Start the conversion */
-  /**********************/
-       ui_CommandRegister = ui_CommandRegister | 0x00080000;
   /***************************/
-       /*Write the command regiter */
+       /* Write the configuration */
+  /***************************/
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* outl(ul_Config , devpriv->iobase+i_Offset + 0x0); */
+       outl(ul_Config,
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
+       /* END JK 06.07.04: Management of sevrals boards */
+
+  /***************************/
+       /*Reset the calibration bit */
   /***************************/
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* ul_Temp = inl(devpriv->iobase+i_Offset + 12); */
+       ul_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
+       /* END JK 06.07.04: Management of sevrals boards */
+
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
        /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
        while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
                                        12) >> 19) & 1) != 1) ;
-       /* outl(ui_CommandRegister ,devpriv->iobase+i_Offset + 8); */
-       outl(ui_CommandRegister,
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
-       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
-       if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
-               do {
-         /*******************/
-                       /*Read the EOC flag */
-         /*******************/
-                       /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
-                       ui_EOC = inl(devpriv->iobase +
-                               s_BoardInfos[dev->minor].i_Offset + 20) & 1;
-               } while (ui_EOC != 1);
-      /************************************************/
-               /*Read the digital value of the calibration Gain */
-      /************************************************/
-               /* data[0] = inl (devpriv->iobase+i_Offset + 28); */
-               data[0] =
-                       inl(devpriv->iobase +
-                       s_BoardInfos[dev->minor].i_Offset + 28);
-       }                       /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
-       return 0;
-}
+       /* END JK 06.07.04: Management of sevrals boards */
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_InsnBits_AnalogInput_Test               |
-  |                      (struct comedi_device *dev,struct comedi_subdevice *s,               |
-  |                      struct comedi_insn *insn,unsigned int *data)                     |
-  +----------------------------------------------------------------------------+
-  | Task              : Tests the Selected Anlog Input Channel                 |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     struct comedi_subdevice *s     : Subdevice Pointer            |
-  |                     struct comedi_insn *insn       : Insn Structure Pointer       |
-  |                     unsigned int *data          : Data Pointer contains        |
-  |                                          configuration parameters as below |
-  |
-  |
-  |                           data[0]            : 0 TestAnalogInputShortCircuit
-  |                                                                         1 TestAnalogInputConnection                                                                                                                                                                                                |
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* outl((ul_Temp & 0xFFF9FFFF) , devpriv->iobase+.i_Offset + 12); */
+       outl((ul_Temp & 0xFFF9FFFF),
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
+       /* END JK 06.07.04: Management of sevrals boards */
 
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  |                            data[0]            : Digital value obtained      |
-  |                           data[1]            : calibration offset          |
-  |                           data[2]            : calibration gain            |
-  |                                                                             |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
+       if (data[9] == 1) {
+               devpriv->tsk_Current = current;
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* i_InterruptFlag=1; */
+               s_BoardInfos[dev->minor].i_InterruptFlag = 1;
+               /* END JK 06.07.04: Management of sevrals boards */
+       }                       /*  if(data[9]==1) */
+       else {
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* i_InterruptFlag=0; */
+               s_BoardInfos[dev->minor].i_InterruptFlag = 0;
+               /* END JK 06.07.04: Management of sevrals boards */
+       }                       /* else  if(data[9]==1) */
+
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* i_Initialised=1; */
+       s_BoardInfos[dev->minor].i_Initialised = 1;
+       /* END JK 06.07.04: Management of sevrals boards */
+
+       /* BEGIN JK 06.07.04: Management of sevrals boards */
+       /* if(i_ScanType==1) */
+       if (s_BoardInfos[dev->minor].i_ScanType == 1)
+               /* END JK 06.07.04: Management of sevrals boards */
+       {
+               /* BEGIN JK 06.07.04: Management of sevrals boards */
+               /* i_Sum=i_Sum+1; */
+               s_BoardInfos[dev->minor].i_Sum =
+                       s_BoardInfos[dev->minor].i_Sum + 1;
+               /* END JK 06.07.04: Management of sevrals boards */
+
+               insn->unused[0] = 0;
+               i_APCI3200_ReadAnalogInput(dev, s, insn, &ui_Dummy);
+       }
 
-int i_APCI3200_InsnBits_AnalogInput_Test(struct comedi_device *dev,
-       struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
+       return insn->n;
+}
+
+/*
+ * Tests the Selected Anlog Input Channel
+ *
+ * data[0] = 0  TestAnalogInputShortCircuit
+ *        = 1  TestAnalogInputConnection
+ *
+ * data[0] : Digital value obtained
+ * data[1] : calibration offset
+ * data[2] : calibration gain
+ */
+static int i_APCI3200_InsnBits_AnalogInput_Test(struct comedi_device *dev,
+                                               struct comedi_subdevice *s,
+                                               struct comedi_insn *insn,
+                                               unsigned int *data)
 {
        struct addi_private *devpriv = dev->private;
        unsigned int ui_Configuration = 0;
@@ -2519,61 +2293,18 @@ int i_APCI3200_InsnBits_AnalogInput_Test(struct comedi_device *dev,
        return insn->n;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : int i_APCI3200_InsnWriteReleaseAnalogInput             |
-  |                      (struct comedi_device *dev,struct comedi_subdevice *s,               |
-  |                      struct comedi_insn *insn,unsigned int *data)                     |
-  +----------------------------------------------------------------------------+
-  | Task              :  Resets the channels                                                      |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev      : Driver handle                |
-  |                     struct comedi_subdevice *s     : Subdevice Pointer            |
-  |                     struct comedi_insn *insn       : Insn Structure Pointer       |
-  |                     unsigned int *data          : Data Pointer
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error          |
-  |                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-
-int i_APCI3200_InsnWriteReleaseAnalogInput(struct comedi_device *dev,
-       struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
+static int i_APCI3200_InsnWriteReleaseAnalogInput(struct comedi_device *dev,
+                                                 struct comedi_subdevice *s,
+                                                 struct comedi_insn *insn,
+                                                 unsigned int *data)
 {
        i_APCI3200_Reset(dev);
        return insn->n;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function name     :int i_APCI3200_CommandTestAnalogInput(struct comedi_device *dev|
-  |                    ,struct comedi_subdevice *s,struct comedi_cmd *cmd)                              |
-  |                                                                                                             |
-  +----------------------------------------------------------------------------+
-  | Task              : Test validity for a command for cyclic anlog input     |
-  |                       acquisition                                                                           |
-  |                                                                                                                     |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev                                                                       |
-  |                     struct comedi_subdevice *s                                                                      |
-  |                     struct comedi_cmd *cmd                                                          |
-  |                                                                                                                     |
-  |
-  |                                                                                                                     |
-  |                                                                                                                     |
-  |                                                                                                                     |
-  +----------------------------------------------------------------------------+
-  | Return Value      :0                                                                    |
-  |                                                                                                                                 |
-  +----------------------------------------------------------------------------+
-*/
-
-int i_APCI3200_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
-       struct comedi_cmd *cmd)
+static int i_APCI3200_CommandTestAnalogInput(struct comedi_device *dev,
+                                            struct comedi_subdevice *s,
+                                            struct comedi_cmd *cmd)
 {
 
        int err = 0;
@@ -2733,25 +2464,8 @@ int i_APCI3200_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_s
        return 0;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function name     :int i_APCI3200_StopCyclicAcquisition(struct comedi_device *dev,|
-  |                                                                                         struct comedi_subdevice *s)|
-  |                                                                                                             |
-  +----------------------------------------------------------------------------+
-  | Task              : Stop the  acquisition                                                       |
-  |                                                                                                                     |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev                                                                       |
-  |                     struct comedi_subdevice *s                                                                      |
-  |                                                                                             |
-  +----------------------------------------------------------------------------+
-  | Return Value      :0                                                                    |
-  |                                                                                                                                 |
-  +----------------------------------------------------------------------------+
-*/
-
-int i_APCI3200_StopCyclicAcquisition(struct comedi_device *dev, struct comedi_subdevice *s)
+static int i_APCI3200_StopCyclicAcquisition(struct comedi_device *dev,
+                                           struct comedi_subdevice *s)
 {
        struct addi_private *devpriv = dev->private;
        unsigned int ui_Configuration = 0;
@@ -2784,26 +2498,11 @@ int i_APCI3200_StopCyclicAcquisition(struct comedi_device *dev, struct comedi_su
 }
 
 /*
-  +----------------------------------------------------------------------------+
-  | Function name     : int i_APCI3200_CommandAnalogInput(struct comedi_device *dev,  |
-  |                                                                                            struct comedi_subdevice *s) |
-  |                                                                                                             |
-  +----------------------------------------------------------------------------+
-  | Task              : Does asynchronous acquisition                          |
-  |                     Determines the mode 1 or 2.                                                 |
-  |                                                                                                                     |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev                                                                       |
-  |                     struct comedi_subdevice *s                                                                      |
-  |                                                                                                                                     |
-  |                                                                                                                                     |
-  +----------------------------------------------------------------------------+
-  | Return Value      :                                                                         |
-  |                                                                                                                                 |
-  +----------------------------------------------------------------------------+
-*/
-
-int i_APCI3200_CommandAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s)
+ * Does asynchronous acquisition
+ * Determines the mode 1 or 2.
+ */
+static int i_APCI3200_CommandAnalogInput(struct comedi_device *dev,
+                                        struct comedi_subdevice *s)
 {
        struct addi_private *devpriv = dev->private;
        struct comedi_cmd *cmd = &s->async->cmd;
@@ -2964,93 +2663,165 @@ int i_APCI3200_CommandAnalogInput(struct comedi_device *dev, struct comedi_subde
        ui_Configuration =
                inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
 
-  /*******************/
-       /*Set the START bit */
-  /*******************/
-       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
-       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
-                                       12) >> 19) & 1) != 1) ;
-       /* outl((ui_Configuration | 0x00080000),devpriv->iobase+i_Offset + 8); */
-       outl((ui_Configuration | 0x00080000),
-               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
-       return 0;
-}
+  /*******************/
+       /*Set the START bit */
+  /*******************/
+       /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
+       while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
+                                       12) >> 19) & 1) != 1) ;
+       /* outl((ui_Configuration | 0x00080000),devpriv->iobase+i_Offset + 8); */
+       outl((ui_Configuration | 0x00080000),
+               devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
+       return 0;
+}
+
+/*
+ * This function copies the acquired data(from FIFO) to Comedi buffer.
+ */
+static int i_APCI3200_InterruptHandleEos(struct comedi_device *dev)
+{
+       struct addi_private *devpriv = dev->private;
+       unsigned int ui_StatusRegister = 0;
+       struct comedi_subdevice *s = &dev->subdevices[0];
+
+       /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+       /* comedi_async *async = s->async; */
+       /* UINT *data; */
+       /* data=async->data+async->buf_int_ptr;//new samples added from here onwards */
+       int n = 0, i = 0;
+       /* END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+
+  /************************************/
+       /*Read the interrupt status register */
+  /************************************/
+       /* ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16); */
+       ui_StatusRegister =
+               inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 16);
+
+  /*************************/
+       /*Test if interrupt occur */
+  /*************************/
+
+       if ((ui_StatusRegister & 0x2) == 0x2) {
+      /*************************/
+               /*Read the channel number */
+      /*************************/
+               /* ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24); */
+               /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+               /* This value is not used */
+               /* ui_ChannelNumber = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 24); */
+               s->async->events = 0;
+               /* END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+
+      /*************************************/
+               /*Read the digital Analog Input value */
+      /*************************************/
+
+               /* data[i_Count] = inl(devpriv->iobase+i_Offset + 28); */
+               /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+               /* data[s_BoardInfos [dev->minor].i_Count] = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 28); */
+               s_BoardInfos[dev->minor].ui_ScanValueArray[s_BoardInfos[dev->
+                               minor].i_Count] =
+                       inl(devpriv->iobase +
+                       s_BoardInfos[dev->minor].i_Offset + 28);
+               /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+
+               /* if((i_Count == (i_LastChannel-i_FirstChannel+3))) */
+               if ((s_BoardInfos[dev->minor].i_Count ==
+                               (s_BoardInfos[dev->minor].i_LastChannel -
+                                       s_BoardInfos[dev->minor].
+                                       i_FirstChannel + 3))) {
+
+                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+                       s_BoardInfos[dev->minor].i_Count++;
+
+                       for (i = s_BoardInfos[dev->minor].i_FirstChannel;
+                               i <= s_BoardInfos[dev->minor].i_LastChannel;
+                               i++) {
+                               i_APCI3200_GetChannelCalibrationValue(dev, i,
+                                       &s_BoardInfos[dev->minor].
+                                       ui_ScanValueArray[s_BoardInfos[dev->
+                                                       minor].i_Count + ((i -
+                                                               s_BoardInfos
+                                                               [dev->minor].
+                                                               i_FirstChannel)
+                                                       * 3)],
+                                       &s_BoardInfos[dev->minor].
+                                       ui_ScanValueArray[s_BoardInfos[dev->
+                                                       minor].i_Count + ((i -
+                                                               s_BoardInfos
+                                                               [dev->minor].
+                                                               i_FirstChannel)
+                                                       * 3) + 1],
+                                       &s_BoardInfos[dev->minor].
+                                       ui_ScanValueArray[s_BoardInfos[dev->
+                                                       minor].i_Count + ((i -
+                                                               s_BoardInfos
+                                                               [dev->minor].
+                                                               i_FirstChannel)
+                                                       * 3) + 2]);
+                       }
+
+                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
+
+                       /* i_Count=-1; */
+
+                       s_BoardInfos[dev->minor].i_Count = -1;
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   :  int i_APCI3200_Reset(struct comedi_device *dev)                            |
-  |                                                                                             |
-  +----------------------------------------------------------------------------+
-  | Task              :Resets the registers of the card                        |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  :                                                        |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  +----------------------------------------------------------------------------+
-  | Return Value      :                                                        |
-  |                                                                                     |
-  +----------------------------------------------------------------------------+
-*/
+                       /* async->buf_int_count+=(i_LastChannel-i_FirstChannel+4)*sizeof(unsigned int); */
+                       /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+                       /* async->buf_int_count+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(unsigned int); */
+                       /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+                       /* async->buf_int_ptr+=(i_LastChannel-i_FirstChannel+4)*sizeof(unsigned int); */
+                       /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+                       /* async->buf_int_ptr+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(unsigned int); */
+                       /* comedi_eos(dev,s); */
 
-int i_APCI3200_Reset(struct comedi_device *dev)
-{
-       struct addi_private *devpriv = dev->private;
-       int i_Temp;
-       unsigned int dw_Dummy;
+                       /*  Set the event type (Comedi Buffer End Of Scan) */
+                       s->async->events |= COMEDI_CB_EOS;
 
-       /* i_InterruptFlag=0; */
-       /* i_Initialised==0; */
-       /* i_Count=0; */
-       /* i_Sum=0; */
+                       /*  Test if enougth memory is available and allocate it for 7 values */
+                       /* n = comedi_buf_write_alloc(s->async, 7*sizeof(unsigned int)); */
+                       n = comedi_buf_write_alloc(s->async,
+                               (7 + 12) * sizeof(unsigned int));
 
-       s_BoardInfos[dev->minor].i_InterruptFlag = 0;
-       s_BoardInfos[dev->minor].i_Initialised = 0;
-       s_BoardInfos[dev->minor].i_Count = 0;
-       s_BoardInfos[dev->minor].i_Sum = 0;
-       s_BoardInfos[dev->minor].b_StructInitialized = 0;
+                       /*  If not enough memory available, event is set to Comedi Buffer Error */
+                       if (n > ((7 + 12) * sizeof(unsigned int))) {
+                               printk("\ncomedi_buf_write_alloc n = %i", n);
+                               s->async->events |= COMEDI_CB_ERROR;
+                       }
+                       /*  Write all 7 scan values in the comedi buffer */
+                       comedi_buf_memcpy_to(s->async, 0,
+                               (unsigned int *) s_BoardInfos[dev->minor].
+                               ui_ScanValueArray, (7 + 12) * sizeof(unsigned int));
 
-       outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
+                       /*  Update comedi buffer pinters indexes */
+                       comedi_buf_write_free(s->async,
+                               (7 + 12) * sizeof(unsigned int));
 
-       /*  Enable the interrupt for the controller */
-       dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
-       outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
-       outl(0, devpriv->i_IobaseAddon);        /* Resets the output */
-  /***************/
-       /*Empty the buffer */
-  /**************/
-       for (i_Temp = 0; i_Temp <= 95; i_Temp++) {
-               /* ui_InterruptChannelValue[i_Temp]=0; */
-               s_BoardInfos[dev->minor].ui_InterruptChannelValue[i_Temp] = 0;
-       }                       /* for(i_Temp=0;i_Temp<=95;i_Temp++) */
-  /*****************************/
-       /*Reset the START and IRQ bit */
-  /*****************************/
-       for (i_Temp = 0; i_Temp <= 192;) {
-               while (((inl(devpriv->iobase + i_Temp + 12) >> 19) & 1) != 1) ;
-               outl(0, devpriv->iobase + i_Temp + 8);
-               i_Temp = i_Temp + 64;
-       }                       /* for(i_Temp=0;i_Temp<=192;i_Temp+64) */
+                       /*  Send events */
+                       comedi_event(dev, s);
+                       /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+
+                       /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+                       /*  */
+                       /* if (s->async->buf_int_ptr>=s->async->data_len) //  for buffer rool over */
+                       /*   { */
+                       /*     /* buffer rollover */ */
+                       /*     s->async->buf_int_ptr=0; */
+                       /*     comedi_eobuf(dev,s); */
+                       /*   } */
+                       /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
+               }
+               /* i_Count++; */
+               s_BoardInfos[dev->minor].i_Count++;
+       }
+       /* i_InterruptFlag=0; */
+       s_BoardInfos[dev->minor].i_InterruptFlag = 0;
        return 0;
 }
 
-/*
-  +----------------------------------------------------------------------------+
-  | Function   Name   : static void v_APCI3200_Interrupt                                            |
-  |                                      (int irq , void *d)                            |
-  +----------------------------------------------------------------------------+
-  | Task              : Interrupt processing Routine                           |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : int irq                 : irq number                   |
-  |                     void *d                 : void pointer                 |
-  +----------------------------------------------------------------------------+
-  | Output Parameters :        --                                                                                                       |
-  +----------------------------------------------------------------------------+
-  | Return Value      : TRUE  : No error occur                                 |
-  |                        : FALSE : Error occur. Return the error                                      |
-  |                                                                                             |
-  +----------------------------------------------------------------------------+
-*/
-void v_APCI3200_Interrupt(int irq, void *d)
+static void v_APCI3200_Interrupt(int irq, void *d)
 {
        struct comedi_device *dev = d;
        struct addi_private *devpriv = dev->private;
@@ -3472,165 +3243,3 @@ void v_APCI3200_Interrupt(int irq, void *d)
        }                       /* switch(i_ScanType) */
        return;
 }
-
-/*
-  +----------------------------------------------------------------------------+
-  | Function name     :int i_APCI3200_InterruptHandleEos(struct comedi_device *dev)   |
-  |                                                                                                             |
-  |                                                                                                     |
-  +----------------------------------------------------------------------------+
-  | Task              : .                   |
-  |                     This function copies the acquired data(from FIFO)      |
-  |                            to Comedi buffer.                                                                        |
-  |                                                                                                                     |
-  +----------------------------------------------------------------------------+
-  | Input Parameters  : struct comedi_device *dev                                                                       |
-  |                                                                                                                                     |
-  |                                                                                             |
-  +----------------------------------------------------------------------------+
-  | Return Value      : 0                                                                       |
-  |                                                                                                                                 |
-  +----------------------------------------------------------------------------+
-*/
-int i_APCI3200_InterruptHandleEos(struct comedi_device *dev)
-{
-       struct addi_private *devpriv = dev->private;
-       unsigned int ui_StatusRegister = 0;
-       struct comedi_subdevice *s = &dev->subdevices[0];
-
-       /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-       /* comedi_async *async = s->async; */
-       /* UINT *data; */
-       /* data=async->data+async->buf_int_ptr;//new samples added from here onwards */
-       int n = 0, i = 0;
-       /* END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-
-  /************************************/
-       /*Read the interrupt status register */
-  /************************************/
-       /* ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16); */
-       ui_StatusRegister =
-               inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 16);
-
-  /*************************/
-       /*Test if interrupt occur */
-  /*************************/
-
-       if ((ui_StatusRegister & 0x2) == 0x2) {
-      /*************************/
-               /*Read the channel number */
-      /*************************/
-               /* ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24); */
-               /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-               /* This value is not used */
-               /* ui_ChannelNumber = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 24); */
-               s->async->events = 0;
-               /* END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-
-      /*************************************/
-               /*Read the digital Analog Input value */
-      /*************************************/
-
-               /* data[i_Count] = inl(devpriv->iobase+i_Offset + 28); */
-               /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-               /* data[s_BoardInfos [dev->minor].i_Count] = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 28); */
-               s_BoardInfos[dev->minor].ui_ScanValueArray[s_BoardInfos[dev->
-                               minor].i_Count] =
-                       inl(devpriv->iobase +
-                       s_BoardInfos[dev->minor].i_Offset + 28);
-               /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-
-               /* if((i_Count == (i_LastChannel-i_FirstChannel+3))) */
-               if ((s_BoardInfos[dev->minor].i_Count ==
-                               (s_BoardInfos[dev->minor].i_LastChannel -
-                                       s_BoardInfos[dev->minor].
-                                       i_FirstChannel + 3))) {
-
-                       /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-                       s_BoardInfos[dev->minor].i_Count++;
-
-                       for (i = s_BoardInfos[dev->minor].i_FirstChannel;
-                               i <= s_BoardInfos[dev->minor].i_LastChannel;
-                               i++) {
-                               i_APCI3200_GetChannelCalibrationValue(dev, i,
-                                       &s_BoardInfos[dev->minor].
-                                       ui_ScanValueArray[s_BoardInfos[dev->
-                                                       minor].i_Count + ((i -
-                                                               s_BoardInfos
-                                                               [dev->minor].
-                                                               i_FirstChannel)
-                                                       * 3)],
-                                       &s_BoardInfos[dev->minor].
-                                       ui_ScanValueArray[s_BoardInfos[dev->
-                                                       minor].i_Count + ((i -
-                                                               s_BoardInfos
-                                                               [dev->minor].
-                                                               i_FirstChannel)
-                                                       * 3) + 1],
-                                       &s_BoardInfos[dev->minor].
-                                       ui_ScanValueArray[s_BoardInfos[dev->
-                                                       minor].i_Count + ((i -
-                                                               s_BoardInfos
-                                                               [dev->minor].
-                                                               i_FirstChannel)
-                                                       * 3) + 2]);
-                       }
-
-                       /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
-
-                       /* i_Count=-1; */
-
-                       s_BoardInfos[dev->minor].i_Count = -1;
-
-                       /* async->buf_int_count+=(i_LastChannel-i_FirstChannel+4)*sizeof(unsigned int); */
-                       /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-                       /* async->buf_int_count+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(unsigned int); */
-                       /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-                       /* async->buf_int_ptr+=(i_LastChannel-i_FirstChannel+4)*sizeof(unsigned int); */
-                       /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-                       /* async->buf_int_ptr+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(unsigned int); */
-                       /* comedi_eos(dev,s); */
-
-                       /*  Set the event type (Comedi Buffer End Of Scan) */
-                       s->async->events |= COMEDI_CB_EOS;
-
-                       /*  Test if enougth memory is available and allocate it for 7 values */
-                       /* n = comedi_buf_write_alloc(s->async, 7*sizeof(unsigned int)); */
-                       n = comedi_buf_write_alloc(s->async,
-                               (7 + 12) * sizeof(unsigned int));
-
-                       /*  If not enough memory available, event is set to Comedi Buffer Error */
-                       if (n > ((7 + 12) * sizeof(unsigned int))) {
-                               printk("\ncomedi_buf_write_alloc n = %i", n);
-                               s->async->events |= COMEDI_CB_ERROR;
-                       }
-                       /*  Write all 7 scan values in the comedi buffer */
-                       comedi_buf_memcpy_to(s->async, 0,
-                               (unsigned int *) s_BoardInfos[dev->minor].
-                               ui_ScanValueArray, (7 + 12) * sizeof(unsigned int));
-
-                       /*  Update comedi buffer pinters indexes */
-                       comedi_buf_write_free(s->async,
-                               (7 + 12) * sizeof(unsigned int));
-
-                       /*  Send events */
-                       comedi_event(dev, s);
-                       /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-
-                       /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-                       /*  */
-                       /* if (s->async->buf_int_ptr>=s->async->data_len) //  for buffer rool over */
-                       /*   { */
-                       /*     /* buffer rollover */ */
-                       /*     s->async->buf_int_ptr=0; */
-                       /*     comedi_eobuf(dev,s); */
-                       /*   } */
-                       /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
-               }
-               /* i_Count++; */
-               s_BoardInfos[dev->minor].i_Count++;
-       }
-       /* i_InterruptFlag=0; */
-       s_BoardInfos[dev->minor].i_InterruptFlag = 0;
-       return 0;
-}