RTXI 1.3
comedi/comedi/drivers/addi-data/hwdrv_apci3200.c
Go to the documentation of this file.
00001 
00024 /*
00025     
00026   +-----------------------------------------------------------------------+
00027   | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
00028   +-----------------------------------------------------------------------+
00029   | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
00030   | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
00031   +-------------------------------+---------------------------------------+
00032   | Project     : APCI-3200       | Compiler   : GCC                      |
00033   | Module name : hwdrv_apci3200.c| Version    : 2.96                     |
00034   +-------------------------------+---------------------------------------+
00035   | Project manager: Eric Stolz   | Date       :  02/12/2002              |
00036   +-------------------------------+---------------------------------------+
00037   | Description :   Hardware Layer Acces For APCI-3200                    |
00038   +-----------------------------------------------------------------------+
00039   |                             UPDATES                                   |
00040   +----------+-----------+------------------------------------------------+
00041   |   Date   |   Author  |          Description of updates                |
00042   +----------+-----------+------------------------------------------------+
00043   | 02.07.04 | J. Krauth | Modification from the driver in order to       |
00044   |          |           | correct some errors when using several boards. |
00045   |          |           |                                                |
00046   |          |           |                                                |
00047   +----------+-----------+------------------------------------------------+
00048   | 26.10.04 | J. Krauth | - Update for COMEDI 0.7.68                     |
00049   |          |           | - Read eeprom value                            |
00050   |          |           | - Append APCI-3300                             |
00051   +----------+-----------+------------------------------------------------+  
00052 */
00053 
00054 /*
00055   +----------------------------------------------------------------------------+
00056   |                               Included files                               |
00057   +----------------------------------------------------------------------------+
00058 */
00059 #include "hwdrv_apci3200.h"
00060 //Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
00061 #include "addi_amcc_S5920.h"
00062 //#define PRINT_INFO
00063 
00064 //End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
00065 
00066 //BEGIN JK 06.07.04: Management of sevrals boards
00067 /*
00068   INT i_CJCAvailable=1; 
00069   INT i_CJCPolarity=0;
00070   INT i_CJCGain=2;//changed from 0 to 2 
00071   INT i_InterruptFlag=0;
00072   INT i_ADDIDATAPolarity;
00073   INT i_ADDIDATAGain;                  
00074   INT i_AutoCalibration=0;   //: auto calibration  
00075   INT i_ADDIDATAConversionTime;
00076   INT i_ADDIDATAConversionTimeUnit; 
00077   INT i_ADDIDATAType;
00078   INT i_ChannelNo;
00079   INT i_ChannelCount=0;
00080   INT i_ScanType;
00081   INT i_FirstChannel;
00082   INT i_LastChannel;
00083   INT i_Sum=0;
00084   INT i_Offset;
00085   UINT ui_Channel_num=0;
00086   static int i_Count=0;
00087   INT i_Initialised=0;
00088   UINT ui_InterruptChannelValue[96]; //Buffer
00089 */
00090 str_BoardInfos s_BoardInfos[100];       // 100 will be the max number of boards to be used
00091 //END JK 06.07.04: Management of sevrals boards
00092 
00093 //Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
00094 
00095 /*+----------------------------------------------------------------------------+*/
00096 /*| Function   Name   : INT i_AddiHeaderRW_ReadEeprom                          |*/
00097 /*|                               (INT    i_NbOfWordsToRead,                   |*/
00098 /*|                                DWORD dw_PCIBoardEepromAddress,             |*/
00099 /*|                                WORD   w_EepromStartAddress,                |*/
00100 /*|                                PWORD pw_DataRead)                          |*/
00101 /*+----------------------------------------------------------------------------+*/
00102 /*| Task              : Read word from the 5920 eeprom.                        |*/
00103 /*+----------------------------------------------------------------------------+*/
00104 /*| Input Parameters  : INT    i_NbOfWordsToRead : Nbr. of word to read        |*/
00105 /*|                     DWORD dw_PCIBoardEepromAddress : Address of the eeprom |*/
00106 /*|                     WORD   w_EepromStartAddress : Eeprom strat address     |*/
00107 /*+----------------------------------------------------------------------------+*/
00108 /*| Output Parameters : PWORD pw_DataRead : Read data                          |*/
00109 /*+----------------------------------------------------------------------------+*/
00110 /*| Return Value      : -                                                      |*/
00111 /*+----------------------------------------------------------------------------+*/
00112 
00113 INT i_AddiHeaderRW_ReadEeprom(INT i_NbOfWordsToRead,
00114         DWORD dw_PCIBoardEepromAddress,
00115         WORD w_EepromStartAddress, PWORD pw_DataRead)
00116 {
00117         DWORD dw_eeprom_busy = 0;
00118         INT i_Counter = 0;
00119         INT i_WordCounter;
00120         INT i;
00121         BYTE pb_ReadByte[1];
00122         BYTE b_ReadLowByte = 0;
00123         BYTE b_ReadHighByte = 0;
00124         BYTE b_SelectedAddressLow = 0;
00125         BYTE b_SelectedAddressHigh = 0;
00126         WORD w_ReadWord = 0;
00127 
00128         for (i_WordCounter = 0; i_WordCounter < i_NbOfWordsToRead;
00129                 i_WordCounter++) {
00130                 do {
00131                         dw_eeprom_busy =
00132                                 inl(dw_PCIBoardEepromAddress +
00133                                 AMCC_OP_REG_MCSR);
00134                         dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
00135                 }
00136                 while (dw_eeprom_busy == EEPROM_BUSY);
00137 
00138                 for (i_Counter = 0; i_Counter < 2; i_Counter++) {
00139                         b_SelectedAddressLow = (w_EepromStartAddress + i_Counter) % 256;        //Read the low 8 bit part
00140                         b_SelectedAddressHigh = (w_EepromStartAddress + i_Counter) / 256;       //Read the high 8 bit part
00141 
00142                         //Select the load low address mode
00143                         outb(NVCMD_LOAD_LOW,
00144                                 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
00145                                 3);
00146 
00147                         //Wait on busy
00148                         do {
00149                                 dw_eeprom_busy =
00150                                         inl(dw_PCIBoardEepromAddress +
00151                                         AMCC_OP_REG_MCSR);
00152                                 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
00153                         }
00154                         while (dw_eeprom_busy == EEPROM_BUSY);
00155 
00156                         //Load the low address
00157                         outb(b_SelectedAddressLow,
00158                                 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
00159                                 2);
00160 
00161                         //Wait on busy
00162                         do {
00163                                 dw_eeprom_busy =
00164                                         inl(dw_PCIBoardEepromAddress +
00165                                         AMCC_OP_REG_MCSR);
00166                                 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
00167                         }
00168                         while (dw_eeprom_busy == EEPROM_BUSY);
00169 
00170                         //Select the load high address mode
00171                         outb(NVCMD_LOAD_HIGH,
00172                                 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
00173                                 3);
00174 
00175                         //Wait on busy
00176                         do {
00177                                 dw_eeprom_busy =
00178                                         inl(dw_PCIBoardEepromAddress +
00179                                         AMCC_OP_REG_MCSR);
00180                                 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
00181                         }
00182                         while (dw_eeprom_busy == EEPROM_BUSY);
00183 
00184                         //Load the high address
00185                         outb(b_SelectedAddressHigh,
00186                                 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
00187                                 2);
00188 
00189                         //Wait on busy
00190                         do {
00191                                 dw_eeprom_busy =
00192                                         inl(dw_PCIBoardEepromAddress +
00193                                         AMCC_OP_REG_MCSR);
00194                                 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
00195                         }
00196                         while (dw_eeprom_busy == EEPROM_BUSY);
00197 
00198                         //Select the READ mode
00199                         outb(NVCMD_BEGIN_READ,
00200                                 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
00201                                 3);
00202 
00203                         //Wait on busy
00204                         do {
00205                                 dw_eeprom_busy =
00206                                         inl(dw_PCIBoardEepromAddress +
00207                                         AMCC_OP_REG_MCSR);
00208                                 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
00209                         }
00210                         while (dw_eeprom_busy == EEPROM_BUSY);
00211 
00212                         //Read data into the EEPROM
00213                         *pb_ReadByte =
00214                                 inb(dw_PCIBoardEepromAddress +
00215                                 AMCC_OP_REG_MCSR + 2);
00216 
00217                         //Wait on busy
00218                         do {
00219                                 dw_eeprom_busy =
00220                                         inl(dw_PCIBoardEepromAddress +
00221                                         AMCC_OP_REG_MCSR);
00222                                 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
00223                         }
00224                         while (dw_eeprom_busy == EEPROM_BUSY);
00225 
00226                         //Select the upper address part
00227                         if (i_Counter == 0) {
00228                                 b_ReadLowByte = pb_ReadByte[0];
00229                         } else {
00230                                 b_ReadHighByte = pb_ReadByte[0];
00231                         }
00232 
00233                         //Sleep
00234                         for (i = 0; i < 10000; i++) ;
00235 
00236                 }
00237                 w_ReadWord =
00238                         (b_ReadLowByte | (((unsigned short)b_ReadHighByte) *
00239                                 256));
00240 
00241                 pw_DataRead[i_WordCounter] = w_ReadWord;
00242 
00243                 w_EepromStartAddress += 2;      // to read the next word           
00244 
00245         }                       // for (...) i_NbOfWordsToRead
00246         return (0);
00247 }
00248 
00249 /*+----------------------------------------------------------------------------+*/
00250 /*| Function   Name   : VOID v_GetAPCI3200EepromCalibrationValue (VOID)        |*/
00251 /*+----------------------------------------------------------------------------+*/
00252 /*| Task              : Read calibration value from the APCI-3200 eeprom.      |*/
00253 /*+----------------------------------------------------------------------------+*/
00254 /*| Input Parameters  : -                                                      |*/
00255 /*+----------------------------------------------------------------------------+*/
00256 /*| Output Parameters : -                                                      |*/
00257 /*+----------------------------------------------------------------------------+*/
00258 /*| Return Value      : -                                                      |*/
00259 /*+----------------------------------------------------------------------------+*/
00260 
00261 VOID v_GetAPCI3200EepromCalibrationValue(DWORD dw_PCIBoardEepromAddress,
00262         str_BoardInfos * BoardInformations)
00263 {
00264         WORD w_AnalogInputMainHeaderAddress;
00265         WORD w_AnalogInputComponentAddress;
00266         WORD w_NumberOfModuls = 0;
00267         WORD w_CurrentSources[2];
00268         WORD w_ModulCounter = 0;
00269         WORD w_FirstHeaderSize = 0;
00270         WORD w_NumberOfInputs = 0;
00271         WORD w_CJCFlag = 0;
00272         WORD w_NumberOfGainValue = 0;
00273         WORD w_SingleHeaderAddress = 0;
00274         WORD w_SingleHeaderSize = 0;
00275         WORD w_Input = 0;
00276         WORD w_GainFactorAddress = 0;
00277         WORD w_GainFactorValue[2];
00278         WORD w_GainIndex = 0;
00279         WORD w_GainValue = 0;
00280 
00281   /*****************************************/
00283   /*****************************************/
00284         i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00285                 dw_PCIBoardEepromAddress, 0x116,        //w_EepromStartAddress: Analog input header address
00286                 &w_AnalogInputMainHeaderAddress);
00287 
00288   /*******************************************/
00290   /*******************************************/
00291         w_AnalogInputMainHeaderAddress = w_AnalogInputMainHeaderAddress + 0x100;
00292 
00293   /******************************/
00295   /******************************/
00296         i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00297                 dw_PCIBoardEepromAddress, w_AnalogInputMainHeaderAddress + 0x02,        //w_EepromStartAddress: Number of conponment
00298                 &w_NumberOfModuls);
00299 
00300         for (w_ModulCounter = 0; w_ModulCounter < w_NumberOfModuls;
00301                 w_ModulCounter++) {
00302       /***********************************/
00304       /***********************************/
00305                 w_AnalogInputComponentAddress =
00306                         w_AnalogInputMainHeaderAddress +
00307                         (w_FirstHeaderSize * w_ModulCounter) + 0x04;
00308 
00309       /****************************/
00311       /****************************/
00312                 i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00313                         dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress,        // Address of the first header  
00314                         &w_FirstHeaderSize);
00315 
00316                 w_FirstHeaderSize = w_FirstHeaderSize >> 4;
00317 
00318       /***************************/
00320       /***************************/
00321                 i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00322                         dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 0x06, // Number of inputs for the first modul  
00323                         &w_NumberOfInputs);
00324 
00325                 w_NumberOfInputs = w_NumberOfInputs >> 4;
00326 
00327       /***********************/
00329       /***********************/
00330                 i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00331                         dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 0x08, // CJC flag
00332                         &w_CJCFlag);
00333 
00334                 w_CJCFlag = (w_CJCFlag >> 3) & 0x1;     // Get only the CJC flag
00335 
00336       /*******************************/
00338       /*******************************/
00339                 i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00340                         dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 0x44, // Number of gain value
00341                         &w_NumberOfGainValue);
00342 
00343                 w_NumberOfGainValue = w_NumberOfGainValue & 0xFF;
00344 
00345       /***********************************/
00347       /***********************************/
00348                 w_SingleHeaderAddress =
00349                         w_AnalogInputComponentAddress + 0x46 +
00350                         (((w_NumberOfGainValue / 16) + 1) * 2) +
00351                         (6 * w_NumberOfGainValue) +
00352                         (4 * (((w_NumberOfGainValue / 16) + 1) * 2));
00353 
00354       /********************************************/
00356       /********************************************/
00357                 i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00358                         dw_PCIBoardEepromAddress, w_SingleHeaderAddress,        //w_EepromStartAddress: Single header address
00359                         &w_SingleHeaderSize);
00360 
00361                 w_SingleHeaderSize = w_SingleHeaderSize >> 4;
00362 
00363       /*************************************/
00365       /*************************************/
00366                 w_GainFactorAddress = w_AnalogInputComponentAddress;
00367 
00368                 for (w_GainIndex = 0; w_GainIndex < w_NumberOfGainValue;
00369                         w_GainIndex++) {
00370           /************************************/
00372           /************************************/
00373                         i_AddiHeaderRW_ReadEeprom(1,    //i_NbOfWordsToRead
00374                                 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 70 + (2 * (1 + (w_NumberOfGainValue / 16))) + (0x02 * w_GainIndex),   // Gain value
00375                                 &w_GainValue);
00376 
00377                         BoardInformations->s_Module[w_ModulCounter].
00378                                 w_GainValue[w_GainIndex] = w_GainValue;
00379 
00380 #             ifdef PRINT_INFO
00381                         printk("\n Gain value = %d",
00382                                 BoardInformations->s_Module[w_ModulCounter].
00383                                 w_GainValue[w_GainIndex]);
00384 #             endif
00385 
00386           /*************************************/
00388           /*************************************/
00389                         i_AddiHeaderRW_ReadEeprom(2,    //i_NbOfWordsToRead
00390                                 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 70 + ((2 * w_NumberOfGainValue) + (2 * (1 + (w_NumberOfGainValue / 16)))) + (0x04 * w_GainIndex),     // Gain factor
00391                                 w_GainFactorValue);
00392 
00393                         BoardInformations->s_Module[w_ModulCounter].
00394                                 ul_GainFactor[w_GainIndex] =
00395                                 (w_GainFactorValue[1] << 16) +
00396                                 w_GainFactorValue[0];
00397 
00398 #             ifdef PRINT_INFO
00399                         printk("\n w_GainFactorValue [%d] = %lu", w_GainIndex,
00400                                 BoardInformations->s_Module[w_ModulCounter].
00401                                 ul_GainFactor[w_GainIndex]);
00402 #             endif
00403                 }
00404 
00405       /***************************************************************/
00407       /***************************************************************/
00408                 for (w_Input = 0; w_Input < w_NumberOfInputs; w_Input++) {
00409           /********************************************/
00411           /********************************************/
00412                         i_AddiHeaderRW_ReadEeprom(2,    //i_NbOfWordsToRead
00413                                 dw_PCIBoardEepromAddress,
00414                                 (w_Input * w_SingleHeaderSize) +
00415                                 w_SingleHeaderAddress + 0x0C, w_CurrentSources);
00416 
00417           /************************************/
00419           /************************************/
00420                         BoardInformations->s_Module[w_ModulCounter].
00421                                 ul_CurrentSource[w_Input] =
00422                                 (w_CurrentSources[0] +
00423                                 ((w_CurrentSources[1] & 0xFFF) << 16));
00424 
00425 #             ifdef PRINT_INFO
00426                         printk("\n Current sources [%d] = %lu", w_Input,
00427                                 BoardInformations->s_Module[w_ModulCounter].
00428                                 ul_CurrentSource[w_Input]);
00429 #             endif
00430                 }
00431 
00432       /***************************************/
00434       /***************************************/
00435                 i_AddiHeaderRW_ReadEeprom(2,    //i_NbOfWordsToRead
00436                         dw_PCIBoardEepromAddress,
00437                         (w_Input * w_SingleHeaderSize) + w_SingleHeaderAddress +
00438                         0x0C, w_CurrentSources);
00439 
00440       /************************************/
00442       /************************************/
00443                 BoardInformations->s_Module[w_ModulCounter].
00444                         ul_CurrentSourceCJC =
00445                         (w_CurrentSources[0] +
00446                         ((w_CurrentSources[1] & 0xFFF) << 16));
00447 
00448 #          ifdef PRINT_INFO
00449                 printk("\n Current sources CJC = %lu",
00450                         BoardInformations->s_Module[w_ModulCounter].
00451                         ul_CurrentSourceCJC);
00452 #          endif
00453         }
00454 }
00455 
00456 INT i_APCI3200_GetChannelCalibrationValue(comedi_device * dev,
00457         unsigned int ui_Channel_num, lsampl_t * CJCCurrentSource,
00458         lsampl_t * ChannelCurrentSource, lsampl_t * ChannelGainFactor)
00459 {
00460         int i_DiffChannel = 0;
00461         int i_Module = 0;
00462 
00463 #ifdef PRINT_INFO
00464         printk("\n Channel = %u", ui_Channel_num);
00465 #endif
00466 
00467         //Test if single or differential mode   
00468         if (s_BoardInfos[dev->minor].i_ConnectionType == 1) {
00469                 //if diff
00470 
00471                 if ((ui_Channel_num >= 0) && (ui_Channel_num <= 1))
00472                         i_DiffChannel = ui_Channel_num, i_Module = 0;
00473                 else if ((ui_Channel_num >= 2) && (ui_Channel_num <= 3))
00474                         i_DiffChannel = ui_Channel_num - 2, i_Module = 1;
00475                 else if ((ui_Channel_num >= 4) && (ui_Channel_num <= 5))
00476                         i_DiffChannel = ui_Channel_num - 4, i_Module = 2;
00477                 else if ((ui_Channel_num >= 6) && (ui_Channel_num <= 7))
00478                         i_DiffChannel = ui_Channel_num - 6, i_Module = 3;
00479 
00480         } else {
00481                 // if single
00482                 if ((ui_Channel_num == 0) || (ui_Channel_num == 1))
00483                         i_DiffChannel = 0, i_Module = 0;
00484                 else if ((ui_Channel_num == 2) || (ui_Channel_num == 3))
00485                         i_DiffChannel = 1, i_Module = 0;
00486                 else if ((ui_Channel_num == 4) || (ui_Channel_num == 5))
00487                         i_DiffChannel = 0, i_Module = 1;
00488                 else if ((ui_Channel_num == 6) || (ui_Channel_num == 7))
00489                         i_DiffChannel = 1, i_Module = 1;
00490                 else if ((ui_Channel_num == 8) || (ui_Channel_num == 9))
00491                         i_DiffChannel = 0, i_Module = 2;
00492                 else if ((ui_Channel_num == 10) || (ui_Channel_num == 11))
00493                         i_DiffChannel = 1, i_Module = 2;
00494                 else if ((ui_Channel_num == 12) || (ui_Channel_num == 13))
00495                         i_DiffChannel = 0, i_Module = 3;
00496                 else if ((ui_Channel_num == 14) || (ui_Channel_num == 15))
00497                         i_DiffChannel = 1, i_Module = 3;
00498         }
00499 
00500         //Test if thermocouple or RTD mode
00501         *CJCCurrentSource =
00502                 s_BoardInfos[dev->minor].s_Module[i_Module].ul_CurrentSourceCJC;
00503 #ifdef PRINT_INFO
00504         printk("\n CJCCurrentSource = %lu", *CJCCurrentSource);
00505 #endif
00506 
00507         *ChannelCurrentSource =
00508                 s_BoardInfos[dev->minor].s_Module[i_Module].
00509                 ul_CurrentSource[i_DiffChannel];
00510 #ifdef PRINT_INFO
00511         printk("\n ChannelCurrentSource = %lu", *ChannelCurrentSource);
00512 #endif
00513         //      }    
00514         //   }
00515 
00516         //Channle gain factor 
00517         *ChannelGainFactor =
00518                 s_BoardInfos[dev->minor].s_Module[i_Module].
00519                 ul_GainFactor[s_BoardInfos[dev->minor].i_ADDIDATAGain];
00520 #ifdef PRINT_INFO
00521         printk("\n ChannelGainFactor = %lu", *ChannelGainFactor);
00522 #endif
00523         //End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values   
00524 
00525         return (0);
00526 }
00527 
00528 //End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
00529 
00530 /*
00531   +----------------------------------------------------------------------------+
00532   | Function   Name   : int i_APCI3200_ReadDigitalInput                       |
00533   |                       (comedi_device *dev,comedi_subdevice *s,               | 
00534   |                      comedi_insn *insn,lsampl_t *data)                     |
00535   +----------------------------------------------------------------------------+
00536   | Task              : Read  value  of the selected channel or port           |
00537   +----------------------------------------------------------------------------+
00538   | Input Parameters  : comedi_device *dev      : Driver handle                |
00539   |                     UINT ui_NoOfChannels    : No Of Channels To read  for Port   
00540   Channel Numberfor single channel
00541   |                     UINT data[0]            : 0: Read single channel
00542   1: Read port value   
00543   data[1]              Port number       
00544   +----------------------------------------------------------------------------+
00545   | Output Parameters : --      data[0] :Read status value
00546   +----------------------------------------------------------------------------+
00547   | Return Value      : TRUE  : No error occur                                 |
00548   |                         : FALSE : Error occur. Return the error          |
00549   |                                                                              |
00550   +----------------------------------------------------------------------------+
00551 */
00552 
00553 INT i_APCI3200_ReadDigitalInput(comedi_device * dev, comedi_subdevice * s,
00554         comedi_insn * insn, lsampl_t * data)
00555 {
00556         UINT ui_Temp = 0;
00557         UINT ui_NoOfChannel = 0;
00558         ui_NoOfChannel = CR_CHAN(insn->chanspec);
00559         ui_Temp = data[0];
00560         *data = inl(devpriv->i_IobaseReserved);
00561 
00562         if (ui_Temp == 0) {
00563                 *data = (*data >> ui_NoOfChannel) & 0x1;
00564         }                       //if  (ui_Temp==0)
00565         else {
00566                 if (ui_Temp == 1) {
00567                         if (data[1] < 0 || data[1] > 1) {
00568                                 printk("\nThe port number is in error\n");
00569                                 return -EINVAL;
00570                         }       //if(data[1] < 0 || data[1] >1)
00571                         switch (ui_NoOfChannel) {
00572 
00573                         case 2:
00574                                 *data = (*data >> (2 * data[1])) & 0x3;
00575                                 break;
00576                         case 3:
00577                                 *data = (*data & 15);
00578                                 break;
00579                         default:
00580                                 comedi_error(dev, " chan spec wrong");
00581                                 return -EINVAL; // "sorry channel spec wrong "  
00582 
00583                         }       //switch(ui_NoOfChannels)    
00584                 }               //if  (ui_Temp==1)
00585                 else {
00586                         printk("\nSpecified channel not supported \n");
00587                 }               //elseif  (ui_Temp==1)
00588         }
00589         return insn->n;
00590 }
00591 
00592 /*
00593   +----------------------------------------------------------------------------+
00594   | Function   Name   : int i_APCI3200_ConfigDigitalOutput                     |
00595   |                       (comedi_device *dev,comedi_subdevice *s,                               | 
00596   |                      comedi_insn *insn,lsampl_t *data)                     |
00597   +----------------------------------------------------------------------------+
00598   | Task              : Configures The Digital Output Subdevice.               |
00599   +----------------------------------------------------------------------------+
00600   | Input Parameters  : comedi_device *dev : Driver handle                     |
00601   |                       data[0]  :1  Memory enable
00602   0  Memory Disable                                                                                                              
00603   +----------------------------------------------------------------------------+
00604   | Output Parameters : --                                                                                                       |
00605   +----------------------------------------------------------------------------+
00606   | Return Value      : TRUE  : No error occur                                 |
00607   |                         : FALSE : Error occur. Return the error                      |
00608   |                                                                                                                                      |
00609   +----------------------------------------------------------------------------+
00610 */
00611 int i_APCI3200_ConfigDigitalOutput(comedi_device * dev, comedi_subdevice * s,
00612         comedi_insn * insn, lsampl_t * data)
00613 {
00614 
00615         if ((data[0] != 0) && (data[0] != 1)) {
00616                 comedi_error(dev,
00617                         "Not a valid Data !!! ,Data should be 1 or 0\n");
00618                 return -EINVAL;
00619         }                       //if  ( (data[0]!=0) && (data[0]!=1) ) 
00620         if (data[0]) {
00621                 devpriv->b_OutputMemoryStatus = ADDIDATA_ENABLE;
00622         }                       // if  (data[0])
00623         else {
00624                 devpriv->b_OutputMemoryStatus = ADDIDATA_DISABLE;
00625         }                       //else if  (data[0])
00626         return insn->n;
00627 }
00628 
00629 /*
00630   +----------------------------------------------------------------------------+
00631   | Function   Name   : int i_APCI3200_WriteDigitalOutput                      |
00632   |                       (comedi_device *dev,comedi_subdevice *s,                               | 
00633   |                      comedi_insn *insn,lsampl_t *data)                     |
00634   +----------------------------------------------------------------------------+
00635   | Task              : writes To the digital Output Subdevice                 |
00636   +----------------------------------------------------------------------------+
00637   | Input Parameters  : comedi_device *dev      : Driver handle                |
00638   |                     comedi_subdevice *s     : Subdevice Pointer            |  
00639   |                     comedi_insn *insn       : Insn Structure Pointer       |  
00640   |                     lsampl_t *data          : Data Pointer contains        |
00641   |                                          configuration parameters as below |
00642   |                     data[0]             :Value to output
00643   data[1]             : 0 o/p single channel
00644   1 o/p port
00645   data[2]             : port no
00646   data[3]             :0 set the digital o/p on
00647   1 set the digital o/p off     
00648   +----------------------------------------------------------------------------+
00649   | Output Parameters : --                                                                                                       |
00650   +----------------------------------------------------------------------------+
00651   | Return Value      : TRUE  : No error occur                                 |
00652   |                         : FALSE : Error occur. Return the error              |
00653   |                                                                              |
00654   +----------------------------------------------------------------------------+
00655 */
00656 INT i_APCI3200_WriteDigitalOutput(comedi_device * dev, comedi_subdevice * s,
00657         comedi_insn * insn, lsampl_t * data)
00658 {
00659         UINT ui_Temp = 0, ui_Temp1 = 0;
00660         UINT ui_NoOfChannel = CR_CHAN(insn->chanspec);  // get the channel
00661         if (devpriv->b_OutputMemoryStatus) {
00662                 ui_Temp = inl(devpriv->i_IobaseAddon);
00663 
00664         }                       //if(devpriv->b_OutputMemoryStatus )
00665         else {
00666                 ui_Temp = 0;
00667         }                       //if(devpriv->b_OutputMemoryStatus )
00668         if (data[3] == 0) {
00669                 if (data[1] == 0) {
00670                         data[0] = (data[0] << ui_NoOfChannel) | ui_Temp;
00671                         outl(data[0], devpriv->i_IobaseAddon);
00672                 }               //if(data[1]==0) 
00673                 else {
00674                         if (data[1] == 1) {
00675                                 switch (ui_NoOfChannel) {
00676 
00677                                 case 2:
00678                                         data[0] =
00679                                                 (data[0] << (2 *
00680                                                         data[2])) | ui_Temp;
00681                                         break;
00682                                 case 3:
00683                                         data[0] = (data[0] | ui_Temp);
00684                                         break;
00685                                 }       //switch(ui_NoOfChannels)
00686 
00687                                 outl(data[0], devpriv->i_IobaseAddon);
00688                         }       // if(data[1]==1)
00689                         else {
00690                                 printk("\nSpecified channel not supported\n");
00691                         }       //else if(data[1]==1)
00692                 }               //elseif(data[1]==0)
00693         }                       //if(data[3]==0)
00694         else {
00695                 if (data[3] == 1) {
00696                         if (data[1] == 0) {
00697                                 data[0] = ~data[0] & 0x1;
00698                                 ui_Temp1 = 1;
00699                                 ui_Temp1 = ui_Temp1 << ui_NoOfChannel;
00700                                 ui_Temp = ui_Temp | ui_Temp1;
00701                                 data[0] = (data[0] << ui_NoOfChannel) ^ 0xf;
00702                                 data[0] = data[0] & ui_Temp;
00703                                 outl(data[0], devpriv->i_IobaseAddon);
00704                         }       //if(data[1]==0) 
00705                         else {
00706                                 if (data[1] == 1) {
00707                                         switch (ui_NoOfChannel) {
00708 
00709                                         case 2:
00710                                                 data[0] = ~data[0] & 0x3;
00711                                                 ui_Temp1 = 3;
00712                                                 ui_Temp1 =
00713                                                         ui_Temp1 << 2 * data[2];
00714                                                 ui_Temp = ui_Temp | ui_Temp1;
00715                                                 data[0] =
00716                                                         ((data[0] << (2 *
00717                                                                         data
00718                                                                         [2])) ^
00719                                                         0xf) & ui_Temp;
00720 
00721                                                 break;
00722                                         case 3:
00723                                                 break;
00724 
00725                                         default:
00726                                                 comedi_error(dev,
00727                                                         " chan spec wrong");
00728                                                 return -EINVAL; // "sorry channel spec wrong "  
00729                                         }       //switch(ui_NoOfChannels)
00730 
00731                                         outl(data[0], devpriv->i_IobaseAddon);
00732                                 }       // if(data[1]==1)
00733                                 else {
00734                                         printk("\nSpecified channel not supported\n");
00735                                 }       //else if(data[1]==1)
00736                         }       //elseif(data[1]==0)
00737                 }               //if(data[3]==1);
00738                 else {
00739                         printk("\nSpecified functionality does not exist\n");
00740                         return -EINVAL;
00741                 }               //if else data[3]==1)
00742         }                       //if else data[3]==0) 
00743         return insn->n;
00744 }
00745 
00746 /*
00747   +----------------------------------------------------------------------------+
00748   | Function   Name   : int i_APCI3200_ReadDigitalOutput                       |
00749   |                       (comedi_device *dev,comedi_subdevice *s,               | 
00750   |                      comedi_insn *insn,lsampl_t *data)                     |
00751   +----------------------------------------------------------------------------+
00752   | Task              : Read  value  of the selected channel or port           |
00753   +----------------------------------------------------------------------------+
00754   | Input Parameters  : comedi_device *dev      : Driver handle                |
00755   |                     UINT ui_NoOfChannels    : No Of Channels To read       |
00756   |                     UINT *data              : Data Pointer to read status  |
00757   data[0]                 :0 read single channel
00758   1 read port value
00759   data[1]                  port no
00760                      
00761   +----------------------------------------------------------------------------+
00762   | Output Parameters : --                                                                                                       |
00763   +----------------------------------------------------------------------------+
00764   | Return Value      : TRUE  : No error occur                                 |
00765   |                         : FALSE : Error occur. Return the error          |
00766   |                                                                              |
00767   +----------------------------------------------------------------------------+
00768 */
00769 INT i_APCI3200_ReadDigitalOutput(comedi_device * dev, comedi_subdevice * s,
00770         comedi_insn * insn, lsampl_t * data)
00771 {
00772         UINT ui_Temp;
00773         UINT ui_NoOfChannel;
00774         ui_NoOfChannel = CR_CHAN(insn->chanspec);
00775         ui_Temp = data[0];
00776         *data = inl(devpriv->i_IobaseAddon);
00777         if (ui_Temp == 0) {
00778                 *data = (*data >> ui_NoOfChannel) & 0x1;
00779         }                       // if  (ui_Temp==0)
00780         else {
00781                 if (ui_Temp == 1) {
00782                         if (data[1] < 0 || data[1] > 1) {
00783                                 printk("\nThe port selection is in error\n");
00784                                 return -EINVAL;
00785                         }       //if(data[1] <0 ||data[1] >1)   
00786                         switch (ui_NoOfChannel) {
00787                         case 2:
00788                                 *data = (*data >> (2 * data[1])) & 3;
00789                                 break;
00790 
00791                         case 3:
00792                                 break;
00793 
00794                         default:
00795                                 comedi_error(dev, " chan spec wrong");
00796                                 return -EINVAL; // "sorry channel spec wrong "  
00797                                 break;
00798                         }       // switch(ui_NoOfChannels)    
00799                 }               // if  (ui_Temp==1)
00800                 else {
00801                         printk("\nSpecified channel not supported \n");
00802                 }               // else if (ui_Temp==1)
00803         }                       // else if  (ui_Temp==0)
00804         return insn->n;
00805 }
00806 
00807 /*
00808   +----------------------------------------------------------------------------+
00809   | Function   Name   : INT i_APCI3200_ConfigAnalogInput                       |
00810   |                       (comedi_device *dev,comedi_subdevice *s,               | 
00811   |                      comedi_insn *insn,lsampl_t *data)                     |
00812   +----------------------------------------------------------------------------+
00813   | Task              : Configures The Analog Input Subdevice                  |
00814   +----------------------------------------------------------------------------+
00815   | Input Parameters  : comedi_device *dev      : Driver handle                |
00816   |                     comedi_subdevice *s     : Subdevice Pointer            |  
00817   |                     comedi_insn *insn       : Insn Structure Pointer       |  
00818   |                     lsampl_t *data          : Data Pointer contains        |
00819   |                                          configuration parameters as below |
00820   |                                                                            | 
00821   |                                     data[0]            
00822   |                                               0:Normal AI                  |
00823   |                                               1:RTD                        |  
00824   |                                               2:THERMOCOUPLE               |
00825   |                                 data[1]            : Gain To Use                 |
00826   |                                                                            |
00827   |                           data[2]            : Polarity                                     
00828   |                                                0:Bipolar                   |        
00829   |                                                1:Unipolar                  |        
00830   |                                                                                                                              |      
00831   |                           data[3]            : Offset Range                                 
00832   |                                                                            |        
00833   |                           data[4]            : Coupling                            
00834   |                                                0:DC Coupling               |
00835   |                                                1:AC Coupling               |
00836   |                                                                            |
00837   |                           data[5]            :Differential/Single                   
00838   |                                                0:Single                    |
00839   |                                                1:Differential              |
00840   |                                                                            |
00841   |                           data[6]            :TimerReloadValue                     
00842   |                                                                            |
00843   |                           data[7]            :ConvertingTimeUnit                   
00844   |                                                                            |
00845   |                           data[8]             :0 Analog voltage measurement
00846   1 Resistance measurement
00847   2 Temperature measurement    
00848   |                           data[9]            :Interrupt                            
00849   |                                              0:Disable                         
00850   |                                              1:Enable    
00851   data[10]           :Type of Thermocouple                       
00852   |                          data[11]           : 0: single channel
00853   Module Number                    
00854   |                                        
00855   |                          data[12]                                   
00856   |                                             0:Single Read                           
00857   |                                             1:Read more channel  
00858   2:Single scan                         
00859   |                                             3:Continous Scan                
00860   data[13]          :Number of channels to read         
00861   |                          data[14]          :RTD connection type
00862   :0:RTD not used
00863   1:RTD 2 wire connection
00864   2:RTD 3 wire connection
00865   3:RTD 4 wire connection                                          
00866   |                                                                            | 
00867   |                                                                            | 
00868   |                                                                            |        
00869   +----------------------------------------------------------------------------+
00870   | Output Parameters : --                                                                                                       |
00871   +----------------------------------------------------------------------------+
00872   | Return Value      : TRUE  : No error occur                                 |
00873   |                         : FALSE : Error occur. Return the error          |
00874   |                                                                              |
00875   +----------------------------------------------------------------------------+
00876 */
00877 INT i_APCI3200_ConfigAnalogInput(comedi_device * dev, comedi_subdevice * s,
00878         comedi_insn * insn, lsampl_t * data)
00879 {
00880 
00881         UINT ul_Config = 0, ul_Temp = 0;
00882         UINT ui_ChannelNo = 0;
00883         UINT ui_Dummy = 0;
00884         INT i_err = 0;
00885 
00886         //Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
00887 
00888 #ifdef PRINT_INFO
00889         INT i = 0, i2 = 0;
00890 #endif
00891         //End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
00892 
00893         //BEGIN JK 06.07.04: Management of sevrals boards   
00894         // Initialize the structure
00895         if (s_BoardInfos[dev->minor].b_StructInitialized != 1) {
00896                 s_BoardInfos[dev->minor].i_CJCAvailable = 1;
00897                 s_BoardInfos[dev->minor].i_CJCPolarity = 0;
00898                 s_BoardInfos[dev->minor].i_CJCGain = 2; //changed from 0 to 2 
00899                 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
00900                 s_BoardInfos[dev->minor].i_AutoCalibration = 0; //: auto calibration  
00901                 s_BoardInfos[dev->minor].i_ChannelCount = 0;
00902                 s_BoardInfos[dev->minor].i_Sum = 0;
00903                 s_BoardInfos[dev->minor].ui_Channel_num = 0;
00904                 s_BoardInfos[dev->minor].i_Count = 0;
00905                 s_BoardInfos[dev->minor].i_Initialised = 0;
00906                 s_BoardInfos[dev->minor].b_StructInitialized = 1;
00907 
00908                 //Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values 
00909                 s_BoardInfos[dev->minor].i_ConnectionType = 0;
00910                 //End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values 
00911 
00912                 //Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values 
00913                 memset(s_BoardInfos[dev->minor].s_Module, 0,
00914                         sizeof(s_BoardInfos[dev->minor].s_Module[MAX_MODULE]));
00915 
00916                 v_GetAPCI3200EepromCalibrationValue(devpriv->i_IobaseAmcc,
00917                         &s_BoardInfos[dev->minor]);
00918 
00919 #ifdef PRINT_INFO
00920                 for (i = 0; i < MAX_MODULE; i++) {
00921                         printk("\n s_Module[%i].ul_CurrentSourceCJC = %lu", i,
00922                                 s_BoardInfos[dev->minor].s_Module[i].
00923                                 ul_CurrentSourceCJC);
00924 
00925                         for (i2 = 0; i2 < 5; i2++) {
00926                                 printk("\n s_Module[%i].ul_CurrentSource [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_CurrentSource[i2]);
00927                         }
00928 
00929                         for (i2 = 0; i2 < 8; i2++) {
00930                                 printk("\n s_Module[%i].ul_GainFactor [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_GainFactor[i2]);
00931                         }
00932 
00933                         for (i2 = 0; i2 < 8; i2++) {
00934                                 printk("\n s_Module[%i].w_GainValue [%i] = %u",
00935                                         i, i2,
00936                                         s_BoardInfos[dev->minor].s_Module[i].
00937                                         w_GainValue[i2]);
00938                         }
00939                 }
00940 #endif
00941                 //End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values 
00942         }
00943 
00944         if (data[0] != 0 && data[0] != 1 && data[0] != 2) {
00945                 printk("\nThe selection of acquisition type is in error\n");
00946                 i_err++;
00947         }                       //if(data[0]!=0 && data[0]!=1 && data[0]!=2)
00948         if (data[0] == 1) {
00949                 if (data[14] != 0 && data[14] != 1 && data[14] != 2
00950                         && data[14] != 4) {
00951                         printk("\n Error in selection of RTD connection type\n");
00952                         i_err++;
00953                 }               //if(data[14]!=0 && data[14]!=1 && data[14]!=2 && data[14]!=4)
00954         }                       //if(data[0]==1 )  
00955         if (data[1] < 0 || data[1] > 7) {
00956                 printk("\nThe selection of gain is in error\n");
00957                 i_err++;
00958         }                       // if(data[1]<0 || data[1]>7)
00959         if (data[2] != 0 && data[2] != 1) {
00960                 printk("\nThe selection of polarity is in error\n");
00961                 i_err++;
00962         }                       //if(data[2]!=0 &&  data[2]!=1)
00963         if (data[3] != 0) {
00964                 printk("\nThe selection of offset range  is in error\n");
00965                 i_err++;
00966         }                       // if(data[3]!=0)
00967         if (data[4] != 0 && data[4] != 1) {
00968                 printk("\nThe selection of coupling is in error\n");
00969                 i_err++;
00970         }                       //if(data[4]!=0 &&  data[4]!=1)
00971         if (data[5] != 0 && data[5] != 1) {
00972                 printk("\nThe selection of single/differential mode is in error\n");
00973                 i_err++;
00974         }                       //if(data[5]!=0 &&  data[5]!=1)
00975         if (data[8] != 0 && data[8] != 1 && data[2] != 2) {
00976                 printk("\nError in selection of functionality\n");
00977         }                       //if(data[8]!=0 && data[8]!=1 && data[2]!=2)     
00978         if (data[12] == 0 || data[12] == 1) {
00979                 if (data[6] != 20 && data[6] != 40 && data[6] != 80
00980                         && data[6] != 160) {
00981                         printk("\nThe selection of conversion time reload value is in error\n");
00982                         i_err++;
00983                 }               // if (data[6]!=20 && data[6]!=40 && data[6]!=80 && data[6]!=160 )
00984                 if (data[7] != 2) {
00985                         printk("\nThe selection of conversion time unit  is in error\n");
00986                         i_err++;
00987                 }               // if(data[7]!=2)
00988         }
00989         if (data[9] != 0 && data[9] != 1) {
00990                 printk("\nThe selection of interrupt enable is in error\n");
00991                 i_err++;
00992         }                       //if(data[9]!=0 &&  data[9]!=1)
00993         if (data[11] < 0 || data[11] > 4) {
00994                 printk("\nThe selection of module is in error\n");
00995                 i_err++;
00996         }                       //if(data[11] <0 ||  data[11]>1)
00997         if (data[12] < 0 || data[12] > 3) {
00998                 printk("\nThe selection of singlechannel/scan selection is in error\n");
00999                 i_err++;
01000         }                       //if(data[12] < 0 ||  data[12]> 3) 
01001         if (data[13] < 0 || data[13] > 16) {
01002                 printk("\nThe selection of number of channels is in error\n");
01003                 i_err++;
01004         }                       // if(data[13] <0 ||data[13] >15)
01005 
01006         //BEGIN JK 06.07.04: Management of sevrals boards
01007         /*          
01008            i_ChannelCount=data[13];
01009            i_ScanType=data[12];
01010            i_ADDIDATAPolarity = data[2];
01011            i_ADDIDATAGain=data[1];
01012            i_ADDIDATAConversionTime=data[6];
01013            i_ADDIDATAConversionTimeUnit=data[7];
01014            i_ADDIDATAType=data[0]; 
01015          */
01016 
01017         // Save acquisition configuration for the actual board
01018         s_BoardInfos[dev->minor].i_ChannelCount = data[13];
01019         s_BoardInfos[dev->minor].i_ScanType = data[12];
01020         s_BoardInfos[dev->minor].i_ADDIDATAPolarity = data[2];
01021         s_BoardInfos[dev->minor].i_ADDIDATAGain = data[1];
01022         s_BoardInfos[dev->minor].i_ADDIDATAConversionTime = data[6];
01023         s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit = data[7];
01024         s_BoardInfos[dev->minor].i_ADDIDATAType = data[0];
01025         //Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
01026         s_BoardInfos[dev->minor].i_ConnectionType = data[5];
01027         //End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
01028         //END JK 06.07.04: Management of sevrals boards
01029 
01030         //Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
01031         memset(s_BoardInfos[dev->minor].ui_ScanValueArray, 0, (7 + 12) * sizeof(lsampl_t));     // 7 is the maximal number of channels
01032         //End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68  
01033 
01034         //BEGIN JK 02.07.04 : This while can't be do, it block the process when using severals boards
01035         //while(i_InterruptFlag==1)
01036         while (s_BoardInfos[dev->minor].i_InterruptFlag == 1) {
01037 #ifndef MSXBOX
01038                 udelay(1);
01039 #else
01040                 // In the case where the driver is compiled for the MSX-Box 
01041                 // we used a printk to have a little delay because udelay
01042                 // seems to be broken under the MSX-Box.
01043                 // This solution hat to be studied. 
01044                 printk("");
01045 #endif
01046         }
01047         //END JK 02.07.04 : This while can't be do, it block the process when using severals boards
01048 
01049         ui_ChannelNo = CR_CHAN(insn->chanspec); // get the channel
01050         //BEGIN JK 06.07.04: Management of sevrals boards
01051         //i_ChannelNo=ui_ChannelNo; 
01052         //ui_Channel_num =ui_ChannelNo;
01053 
01054         s_BoardInfos[dev->minor].i_ChannelNo = ui_ChannelNo;
01055         s_BoardInfos[dev->minor].ui_Channel_num = ui_ChannelNo;
01056 
01057         //END JK 06.07.04: Management of sevrals boards
01058 
01059         if (data[5] == 0) {
01060                 if (ui_ChannelNo < 0 || ui_ChannelNo > 15) {
01061                         printk("\nThe Selection of the channel is in error\n");
01062                         i_err++;
01063                 }               // if(ui_ChannelNo<0 || ui_ChannelNo>15)
01064         }                       //if(data[5]==0)
01065         else {
01066                 if (data[14] == 2) {
01067                         if (ui_ChannelNo < 0 || ui_ChannelNo > 3) {
01068                                 printk("\nThe Selection of the channel is in error\n");
01069                                 i_err++;
01070                         }       // if(ui_ChannelNo<0 || ui_ChannelNo>3) 
01071                 }               //if(data[14]==2)
01072                 else {
01073                         if (ui_ChannelNo < 0 || ui_ChannelNo > 7) {
01074                                 printk("\nThe Selection of the channel is in error\n");
01075                                 i_err++;
01076                         }       // if(ui_ChannelNo<0 || ui_ChannelNo>7)
01077                 }               //elseif(data[14]==2)
01078         }                       //elseif(data[5]==0)
01079         if (data[12] == 0 || data[12] == 1) {
01080                 switch (data[5]) {
01081                 case 0:
01082                         if (ui_ChannelNo >= 0 && ui_ChannelNo <= 3) {
01083                                 //BEGIN JK 06.07.04: Management of sevrals boards
01084                                 //i_Offset=0;
01085                                 s_BoardInfos[dev->minor].i_Offset = 0;
01086                                 //END JK 06.07.04: Management of sevrals boards
01087                         }       //if(ui_ChannelNo >=0 && ui_ChannelNo <=3) 
01088                         if (ui_ChannelNo >= 4 && ui_ChannelNo <= 7) {
01089                                 //BEGIN JK 06.07.04: Management of sevrals boards
01090                                 //i_Offset=64;
01091                                 s_BoardInfos[dev->minor].i_Offset = 64;
01092                                 //END JK 06.07.04: Management of sevrals boards
01093                         }       //if(ui_ChannelNo >=4 && ui_ChannelNo <=7) 
01094                         if (ui_ChannelNo >= 8 && ui_ChannelNo <= 11) {
01095                                 //BEGIN JK 06.07.04: Management of sevrals boards
01096                                 //i_Offset=128;
01097                                 s_BoardInfos[dev->minor].i_Offset = 128;
01098                                 //END JK 06.07.04: Management of sevrals boards
01099                         }       //if(ui_ChannelNo >=8 && ui_ChannelNo <=11) 
01100                         if (ui_ChannelNo >= 12 && ui_ChannelNo <= 15) {
01101                                 //BEGIN JK 06.07.04: Management of sevrals boards
01102                                 //i_Offset=192;
01103                                 s_BoardInfos[dev->minor].i_Offset = 192;
01104                                 //END JK 06.07.04: Management of sevrals boards
01105                         }       //if(ui_ChannelNo >=12 && ui_ChannelNo <=15)
01106                         break;
01107                 case 1:
01108                         if (data[14] == 2) {
01109                                 if (ui_ChannelNo == 0) {
01110                                         //BEGIN JK 06.07.04: Management of sevrals boards
01111                                         //i_Offset=0;
01112                                         s_BoardInfos[dev->minor].i_Offset = 0;
01113                                         //END JK 06.07.04: Management of sevrals boards
01114                                 }       //if(ui_ChannelNo ==0 )
01115                                 if (ui_ChannelNo == 1) {
01116                                         //BEGIN JK 06.07.04: Management of sevrals boards
01117                                         //i_Offset=0;
01118                                         s_BoardInfos[dev->minor].i_Offset = 64;
01119                                         //END JK 06.07.04: Management of sevrals boards
01120                                 }       // if(ui_ChannelNo ==1)
01121                                 if (ui_ChannelNo == 2) {
01122                                         //BEGIN JK 06.07.04: Management of sevrals boards
01123                                         //i_Offset=128;
01124                                         s_BoardInfos[dev->minor].i_Offset = 128;
01125                                         //END JK 06.07.04: Management of sevrals boards
01126                                 }       //if(ui_ChannelNo ==2 )
01127                                 if (ui_ChannelNo == 3) {
01128                                         //BEGIN JK 06.07.04: Management of sevrals boards
01129                                         //i_Offset=192;
01130                                         s_BoardInfos[dev->minor].i_Offset = 192;
01131                                         //END JK 06.07.04: Management of sevrals boards
01132                                 }       //if(ui_ChannelNo ==3) 
01133 
01134                                 //BEGIN JK 06.07.04: Management of sevrals boards
01135                                 //i_ChannelNo=0;
01136                                 s_BoardInfos[dev->minor].i_ChannelNo = 0;
01137                                 //END JK 06.07.04: Management of sevrals boards
01138                                 ui_ChannelNo = 0;
01139                                 break;
01140                         }       //if(data[14]==2)
01141                         if (ui_ChannelNo >= 0 && ui_ChannelNo <= 1) {
01142                                 //BEGIN JK 06.07.04: Management of sevrals boards
01143                                 //i_Offset=0;
01144                                 s_BoardInfos[dev->minor].i_Offset = 0;
01145                                 //END JK 06.07.04: Management of sevrals boards
01146                         }       //if(ui_ChannelNo >=0 && ui_ChannelNo <=1) 
01147                         if (ui_ChannelNo >= 2 && ui_ChannelNo <= 3) {
01148                                 //BEGIN JK 06.07.04: Management of sevrals boards
01149                                 //i_ChannelNo=i_ChannelNo-2;
01150                                 //i_Offset=64;
01151                                 s_BoardInfos[dev->minor].i_ChannelNo =
01152                                         s_BoardInfos[dev->minor].i_ChannelNo -
01153                                         2;
01154                                 s_BoardInfos[dev->minor].i_Offset = 64;
01155                                 //END JK 06.07.04: Management of sevrals boards         
01156                                 ui_ChannelNo = ui_ChannelNo - 2;
01157                         }       //if(ui_ChannelNo >=2 && ui_ChannelNo <=3) 
01158                         if (ui_ChannelNo >= 4 && ui_ChannelNo <= 5) {
01159                                 //BEGIN JK 06.07.04: Management of sevrals boards
01160                                 //i_ChannelNo=i_ChannelNo-4;
01161                                 //i_Offset=128;
01162                                 s_BoardInfos[dev->minor].i_ChannelNo =
01163                                         s_BoardInfos[dev->minor].i_ChannelNo -
01164                                         4;
01165                                 s_BoardInfos[dev->minor].i_Offset = 128;
01166                                 //END JK 06.07.04: Management of sevrals boards      
01167                                 ui_ChannelNo = ui_ChannelNo - 4;
01168                         }       //if(ui_ChannelNo >=4 && ui_ChannelNo <=5) 
01169                         if (ui_ChannelNo >= 6 && ui_ChannelNo <= 7) {
01170                                 //BEGIN JK 06.07.04: Management of sevrals boards
01171                                 //i_ChannelNo=i_ChannelNo-6;
01172                                 //i_Offset=192;
01173                                 s_BoardInfos[dev->minor].i_ChannelNo =
01174                                         s_BoardInfos[dev->minor].i_ChannelNo -
01175                                         6;
01176                                 s_BoardInfos[dev->minor].i_Offset = 192;
01177                                 //END JK 06.07.04: Management of sevrals boards    
01178                                 ui_ChannelNo = ui_ChannelNo - 6;
01179                         }       //if(ui_ChannelNo >=6 && ui_ChannelNo <=7) 
01180                         break;
01181 
01182                 default:
01183                         printk("\n This selection of polarity does not exist\n");
01184                         i_err++;
01185                 }               //switch(data[2])         
01186         }                       //if(data[12]==0 || data[12]==1)
01187         else {
01188                 switch (data[11]) {
01189                 case 1:
01190                         //BEGIN JK 06.07.04: Management of sevrals boards
01191                         //i_Offset=0;
01192                         s_BoardInfos[dev->minor].i_Offset = 0;
01193                         //END JK 06.07.04: Management of sevrals boards
01194                         break;
01195                 case 2:
01196                         //BEGIN JK 06.07.04: Management of sevrals boards
01197                         //i_Offset=64;
01198                         s_BoardInfos[dev->minor].i_Offset = 64;
01199                         //END JK 06.07.04: Management of sevrals boards
01200                         break;
01201                 case 3:
01202                         //BEGIN JK 06.07.04: Management of sevrals boards
01203                         //i_Offset=128;
01204                         s_BoardInfos[dev->minor].i_Offset = 128;
01205                         //END JK 06.07.04: Management of sevrals boards
01206                         break;
01207                 case 4:
01208                         //BEGIN JK 06.07.04: Management of sevrals boards
01209                         //i_Offset=192;
01210                         s_BoardInfos[dev->minor].i_Offset = 192;
01211                         //END JK 06.07.04: Management of sevrals boards
01212                         break;
01213                 default:
01214                         printk("\nError in module selection\n");
01215                         i_err++;
01216                 }               // switch(data[11]) 
01217         }                       // elseif(data[12]==0 || data[12]==1)       
01218         if (i_err) {
01219                 i_APCI3200_Reset(dev);
01220                 return -EINVAL;
01221         }
01222         //if(i_ScanType!=1)
01223         if (s_BoardInfos[dev->minor].i_ScanType != 1) {
01224                 //BEGIN JK 06.07.04: Management of sevrals boards
01225                 //i_Count=0;
01226                 //i_Sum=0;
01227                 s_BoardInfos[dev->minor].i_Count = 0;
01228                 s_BoardInfos[dev->minor].i_Sum = 0;
01229                 //END JK 06.07.04: Management of sevrals boards
01230         }                       //if(i_ScanType!=1)
01231 
01232         ul_Config =
01233                 data[1] | (data[2] << 6) | (data[5] << 7) | (data[3] << 8) |
01234                 (data[4] << 9);
01235         //BEGIN JK 06.07.04: Management of sevrals boards                              
01236         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);                   
01237         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01238                                         12) >> 19) & 1) != 1) ;
01239         //END JK 06.07.04: Management of sevrals boards
01240   /*********************************/
01241         /* Write the channel to configure */
01242   /*********************************/
01243         //BEGIN JK 06.07.04: Management of sevrals boards 
01244         //outl(0 | ui_ChannelNo , devpriv->iobase+i_Offset + 0x4);
01245         outl(0 | ui_ChannelNo,
01246                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
01247         //END JK 06.07.04: Management of sevrals boards 
01248 
01249         //BEGIN JK 06.07.04: Management of sevrals boards                
01250         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); 
01251         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01252                                         12) >> 19) & 1) != 1) ;
01253         //END JK 06.07.04: Management of sevrals boards 
01254   /**************************/
01255         /* Reset the configuration */
01256   /**************************/
01257         //BEGIN JK 06.07.04: Management of sevrals boards                
01258         //outl(0 , devpriv->iobase+i_Offset + 0x0);  
01259         outl(0, devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
01260         //END JK 06.07.04: Management of sevrals boards                
01261 
01262         //BEGIN JK 06.07.04: Management of sevrals boards                          
01263         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01264         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01265                                         12) >> 19) & 1) != 1) ;
01266         //END JK 06.07.04: Management of sevrals boards                          
01267 
01268   /***************************/
01269         /* Write the configuration */
01270   /***************************/
01271         //BEGIN JK 06.07.04: Management of sevrals boards                          
01272         //outl(ul_Config , devpriv->iobase+i_Offset + 0x0);
01273         outl(ul_Config,
01274                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
01275         //END JK 06.07.04: Management of sevrals boards                          
01276 
01277   /***************************/
01278         /*Reset the calibration bit */
01279   /***************************/
01280         //BEGIN JK 06.07.04: Management of sevrals boards 
01281         //ul_Temp = inl(devpriv->iobase+i_Offset + 12);
01282         ul_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
01283         //END JK 06.07.04: Management of sevrals boards 
01284 
01285         //BEGIN JK 06.07.04: Management of sevrals boards 
01286         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01287         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01288                                         12) >> 19) & 1) != 1) ;
01289         //END JK 06.07.04: Management of sevrals boards 
01290 
01291         //BEGIN JK 06.07.04: Management of sevrals boards  
01292         //outl((ul_Temp & 0xFFF9FFFF) , devpriv->iobase+.i_Offset + 12);
01293         outl((ul_Temp & 0xFFF9FFFF),
01294                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
01295         //END JK 06.07.04: Management of sevrals boards 
01296 
01297         if (data[9] == 1) {
01298                 devpriv->tsk_Current = current;
01299                 //BEGIN JK 06.07.04: Management of sevrals boards
01300                 //i_InterruptFlag=1;
01301                 s_BoardInfos[dev->minor].i_InterruptFlag = 1;
01302                 //END JK 06.07.04: Management of sevrals boards
01303         }                       // if(data[9]==1)
01304         else {
01305                 //BEGIN JK 06.07.04: Management of sevrals boards
01306                 //i_InterruptFlag=0;
01307                 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
01308                 //END JK 06.07.04: Management of sevrals boards
01309         }                       //else  if(data[9]==1)
01310 
01311         //BEGIN JK 06.07.04: Management of sevrals boards
01312         //i_Initialised=1;
01313         s_BoardInfos[dev->minor].i_Initialised = 1;
01314         //END JK 06.07.04: Management of sevrals boards
01315 
01316         //BEGIN JK 06.07.04: Management of sevrals boards
01317         //if(i_ScanType==1)
01318         if (s_BoardInfos[dev->minor].i_ScanType == 1)
01319                 //END JK 06.07.04: Management of sevrals boards
01320         {
01321                 //BEGIN JK 06.07.04: Management of sevrals boards
01322                 //i_Sum=i_Sum+1;
01323                 s_BoardInfos[dev->minor].i_Sum =
01324                         s_BoardInfos[dev->minor].i_Sum + 1;
01325                 //END JK 06.07.04: Management of sevrals boards
01326 
01327                 insn->unused[0] = 0;
01328                 i_APCI3200_ReadAnalogInput(dev, s, insn, &ui_Dummy);
01329         }
01330 
01331         return insn->n;
01332 }
01333 
01334 /*
01335   +----------------------------------------------------------------------------+
01336   | Function   Name   : int i_APCI3200_ReadAnalogInput                         |
01337   |                               (comedi_device *dev,comedi_subdevice *s,       | 
01338   |                     comedi_insn *insn,lsampl_t *data)                      |
01339   +----------------------------------------------------------------------------+
01340   | Task              : Read  value  of the selected channel                             |
01341   +----------------------------------------------------------------------------+
01342   | Input Parameters  : comedi_device *dev      : Driver handle                |
01343   |                     UINT ui_NoOfChannels    : No Of Channels To read       |
01344   |                     UINT *data              : Data Pointer to read status  |
01345   +----------------------------------------------------------------------------+
01346   | Output Parameters : --                                                                                                       |
01347   |                             data[0]  : Digital Value Of Input             |
01348   |                             data[1]  : Calibration Offset Value           |
01349   |                             data[2]  : Calibration Gain Value          
01350   |                             data[3]  : CJC value  
01351   |                             data[4]  : CJC offset value
01352   |                             data[5]  : CJC gain value 
01353   | Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values 
01354   |                             data[6] : CJC current source from eeprom
01355   |                             data[7] : Channel current source from eeprom
01356   |                             data[8] : Channle gain factor from eeprom
01357   | End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values 
01358   +----------------------------------------------------------------------------+
01359   | Return Value      : TRUE  : No error occur                                 |
01360   |                         : FALSE : Error occur. Return the error          |
01361   |                                                                              |
01362   +----------------------------------------------------------------------------+
01363 */
01364 INT i_APCI3200_ReadAnalogInput(comedi_device * dev, comedi_subdevice * s,
01365         comedi_insn * insn, lsampl_t * data)
01366 {
01367         UINT ui_DummyValue = 0;
01368         int i_ConvertCJCCalibration;
01369         int i = 0;
01370 
01371         //BEGIN JK 06.07.04: Management of sevrals boards
01372         //if(i_Initialised==0)
01373         if (s_BoardInfos[dev->minor].i_Initialised == 0)
01374                 //END JK 06.07.04: Management of sevrals boards     
01375         {
01376                 i_APCI3200_Reset(dev);
01377                 return -EINVAL;
01378         }                       //if(i_Initialised==0);
01379 
01380 #ifdef PRINT_INFO
01381         printk("\n insn->unused[0] = %i", insn->unused[0]);
01382 #endif
01383 
01384         switch (insn->unused[0]) {
01385         case 0:
01386 
01387                 i_APCI3200_Read1AnalogInputChannel(dev, s, insn,
01388                         &ui_DummyValue);
01389                 //BEGIN JK 06.07.04: Management of sevrals boards
01390                 //ui_InterruptChannelValue[i_Count+0]=ui_DummyValue; 
01391                 s_BoardInfos[dev->minor].
01392                         ui_InterruptChannelValue[s_BoardInfos[dev->minor].
01393                         i_Count + 0] = ui_DummyValue;
01394                 //END JK 06.07.04: Management of sevrals boards    
01395 
01396                 //Begin JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values         
01397                 i_APCI3200_GetChannelCalibrationValue(dev,
01398                         s_BoardInfos[dev->minor].ui_Channel_num,
01399                         &s_BoardInfos[dev->minor].
01400                         ui_InterruptChannelValue[s_BoardInfos[dev->minor].
01401                                 i_Count + 6],
01402                         &s_BoardInfos[dev->minor].
01403                         ui_InterruptChannelValue[s_BoardInfos[dev->minor].
01404                                 i_Count + 7],
01405                         &s_BoardInfos[dev->minor].
01406                         ui_InterruptChannelValue[s_BoardInfos[dev->minor].
01407                                 i_Count + 8]);
01408 
01409 #ifdef PRINT_INFO
01410                 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]);
01411 
01412                 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]);
01413 
01414                 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]);
01415 #endif
01416 
01417                 //End JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values             
01418 
01419                 //BEGIN JK 06.07.04: Management of sevrals boards
01420                 //if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1))
01421                 if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
01422                         && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
01423                         && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
01424                         //END JK 06.07.04: Management of sevrals boards             
01425                 {
01426                         i_APCI3200_ReadCJCValue(dev, &ui_DummyValue);
01427                         //BEGIN JK 06.07.04: Management of sevrals boards
01428                         //ui_InterruptChannelValue[i_Count + 3]=ui_DummyValue; 
01429                         s_BoardInfos[dev->minor].
01430                                 ui_InterruptChannelValue[s_BoardInfos[dev->
01431                                         minor].i_Count + 3] = ui_DummyValue;
01432                         //END JK 06.07.04: Management of sevrals boards         
01433                 }               //if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE))
01434                 else {
01435                         //BEGIN JK 06.07.04: Management of sevrals boards
01436                         //ui_InterruptChannelValue[i_Count + 3]=0;
01437                         s_BoardInfos[dev->minor].
01438                                 ui_InterruptChannelValue[s_BoardInfos[dev->
01439                                         minor].i_Count + 3] = 0;
01440                         //END JK 06.07.04: Management of sevrals boards
01441                 }               //elseif((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1))  
01442 
01443                 //BEGIN JK 06.07.04: Management of sevrals boards
01444                 //if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE))    
01445                 if ((s_BoardInfos[dev->minor].i_AutoCalibration == FALSE)
01446                         && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE))
01447                         //END JK 06.07.04: Management of sevrals boards
01448                 {
01449                         i_APCI3200_ReadCalibrationOffsetValue(dev,
01450                                 &ui_DummyValue);
01451                         //BEGIN JK 06.07.04: Management of sevrals boards
01452                         //ui_InterruptChannelValue[i_Count + 1]=ui_DummyValue;
01453                         s_BoardInfos[dev->minor].
01454                                 ui_InterruptChannelValue[s_BoardInfos[dev->
01455                                         minor].i_Count + 1] = ui_DummyValue;
01456                         //END JK 06.07.04: Management of sevrals boards  
01457                         i_APCI3200_ReadCalibrationGainValue(dev,
01458                                 &ui_DummyValue);
01459                         //BEGIN JK 06.07.04: Management of sevrals boards
01460                         //ui_InterruptChannelValue[i_Count + 2]=ui_DummyValue; 
01461                         s_BoardInfos[dev->minor].
01462                                 ui_InterruptChannelValue[s_BoardInfos[dev->
01463                                         minor].i_Count + 2] = ui_DummyValue;
01464                         //END JK 06.07.04: Management of sevrals boards
01465                 }               //if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE)) 
01466 
01467                 //BEGIN JK 06.07.04: Management of sevrals boards
01468                 //if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)&& (i_CJCAvailable==1))
01469                 if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
01470                         && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
01471                         && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
01472                         //END JK 06.07.04: Management of sevrals boards
01473                 {
01474           /**********************************************************/
01475                         /*Test if the Calibration channel must be read for the CJC */
01476           /**********************************************************/
01477           /**********************************/
01478                         /*Test if the polarity is the same */
01479           /**********************************/
01480                         //BEGIN JK 06.07.04: Management of sevrals boards                                   
01481                         //if(i_CJCPolarity!=i_ADDIDATAPolarity)
01482                         if (s_BoardInfos[dev->minor].i_CJCPolarity !=
01483                                 s_BoardInfos[dev->minor].i_ADDIDATAPolarity)
01484                                 //END JK 06.07.04: Management of sevrals boards                                   
01485                         {
01486                                 i_ConvertCJCCalibration = 1;
01487                         }       //if(i_CJCPolarity!=i_ADDIDATAPolarity)
01488                         else {
01489                                 //BEGIN JK 06.07.04: Management of sevrals boards                               
01490                                 //if(i_CJCGain==i_ADDIDATAGain) 
01491                                 if (s_BoardInfos[dev->minor].i_CJCGain ==
01492                                         s_BoardInfos[dev->minor].i_ADDIDATAGain)
01493                                         //END JK 06.07.04: Management of sevrals boards                               
01494                                 {
01495                                         i_ConvertCJCCalibration = 0;
01496                                 }       //if(i_CJCGain==i_ADDIDATAGain) 
01497                                 else {
01498                                         i_ConvertCJCCalibration = 1;
01499                                 }       //elseif(i_CJCGain==i_ADDIDATAGain)  
01500                         }       //elseif(i_CJCPolarity!=i_ADDIDATAPolarity)           
01501                         if (i_ConvertCJCCalibration == 1) {
01502                                 i_APCI3200_ReadCJCCalOffset(dev,
01503                                         &ui_DummyValue);
01504                                 //BEGIN JK 06.07.04: Management of sevrals boards                               
01505                                 //ui_InterruptChannelValue[i_Count+4]=ui_DummyValue;
01506                                 s_BoardInfos[dev->minor].
01507                                         ui_InterruptChannelValue[s_BoardInfos
01508                                         [dev->minor].i_Count + 4] =
01509                                         ui_DummyValue;
01510                                 //END JK 06.07.04: Management of sevrals boards                                 
01511 
01512                                 i_APCI3200_ReadCJCCalGain(dev, &ui_DummyValue);
01513 
01514                                 //BEGIN JK 06.07.04: Management of sevrals boards 
01515                                 //ui_InterruptChannelValue[i_Count+5]=ui_DummyValue;
01516                                 s_BoardInfos[dev->minor].
01517                                         ui_InterruptChannelValue[s_BoardInfos
01518                                         [dev->minor].i_Count + 5] =
01519                                         ui_DummyValue;
01520                                 //END JK 06.07.04: Management of sevrals boards 
01521                         }       //if(i_ConvertCJCCalibration==1)
01522                         else {
01523                                 //BEGIN JK 06.07.04: Management of sevrals boards 
01524                                 //ui_InterruptChannelValue[i_Count+4]=0;
01525                                 //ui_InterruptChannelValue[i_Count+5]=0;
01526 
01527                                 s_BoardInfos[dev->minor].
01528                                         ui_InterruptChannelValue[s_BoardInfos
01529                                         [dev->minor].i_Count + 4] = 0;
01530                                 s_BoardInfos[dev->minor].
01531                                         ui_InterruptChannelValue[s_BoardInfos
01532                                         [dev->minor].i_Count + 5] = 0;
01533                                 //END JK 06.07.04: Management of sevrals boards 
01534                         }       //elseif(i_ConvertCJCCalibration==1) 
01535                 }               //if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)) 
01536 
01537                 //BEGIN JK 06.07.04: Management of sevrals boards 
01538                 //if(i_ScanType!=1)
01539                 if (s_BoardInfos[dev->minor].i_ScanType != 1) {
01540                         //i_Count=0;
01541                         s_BoardInfos[dev->minor].i_Count = 0;
01542                 }               //if(i_ScanType!=1)
01543                 else {
01544                         //i_Count=i_Count +6;
01545                         //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values   
01546                         //s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count +6;
01547                         s_BoardInfos[dev->minor].i_Count =
01548                                 s_BoardInfos[dev->minor].i_Count + 9;
01549                         //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values   
01550                 }               //else if(i_ScanType!=1)  
01551 
01552                 //if((i_ScanType==1) &&(i_InterruptFlag==1))
01553                 if ((s_BoardInfos[dev->minor].i_ScanType == 1)
01554                         && (s_BoardInfos[dev->minor].i_InterruptFlag == 1)) {
01555                         //i_Count=i_Count-6;
01556                         //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
01557                         //s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count-6;
01558                         s_BoardInfos[dev->minor].i_Count =
01559                                 s_BoardInfos[dev->minor].i_Count - 9;
01560                         //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
01561                 }
01562                 //if(i_ScanType==0)
01563                 if (s_BoardInfos[dev->minor].i_ScanType == 0) {
01564                         /*
01565                            data[0]= ui_InterruptChannelValue[0];
01566                            data[1]= ui_InterruptChannelValue[1];
01567                            data[2]= ui_InterruptChannelValue[2];  
01568                            data[3]= ui_InterruptChannelValue[3];
01569                            data[4]= ui_InterruptChannelValue[4];
01570                            data[5]= ui_InterruptChannelValue[5];  
01571                          */
01572 #ifdef PRINT_INFO
01573                         printk("\n data[0]= s_BoardInfos [dev->minor].ui_InterruptChannelValue[0];");
01574 #endif
01575                         data[0] =
01576                                 s_BoardInfos[dev->minor].
01577                                 ui_InterruptChannelValue[0];
01578                         data[1] =
01579                                 s_BoardInfos[dev->minor].
01580                                 ui_InterruptChannelValue[1];
01581                         data[2] =
01582                                 s_BoardInfos[dev->minor].
01583                                 ui_InterruptChannelValue[2];
01584                         data[3] =
01585                                 s_BoardInfos[dev->minor].
01586                                 ui_InterruptChannelValue[3];
01587                         data[4] =
01588                                 s_BoardInfos[dev->minor].
01589                                 ui_InterruptChannelValue[4];
01590                         data[5] =
01591                                 s_BoardInfos[dev->minor].
01592                                 ui_InterruptChannelValue[5];
01593 
01594                         //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
01595                         //printk("\n 0 - i_APCI3200_GetChannelCalibrationValue data [6] = %lu, data [7] = %lu, data [8] = %lu", data [6], data [7], data [8]);
01596                         i_APCI3200_GetChannelCalibrationValue(dev,
01597                                 s_BoardInfos[dev->minor].ui_Channel_num,
01598                                 &data[6], &data[7], &data[8]);
01599                         //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values             
01600                 }
01601                 break;
01602         case 1:
01603 
01604                 for (i = 0; i < insn->n; i++) {
01605                         //data[i]=ui_InterruptChannelValue[i]; 
01606                         data[i] =
01607                                 s_BoardInfos[dev->minor].
01608                                 ui_InterruptChannelValue[i];
01609                 }
01610 
01611                 //i_Count=0;
01612                 //i_Sum=0;
01613                 //if(i_ScanType==1)
01614                 s_BoardInfos[dev->minor].i_Count = 0;
01615                 s_BoardInfos[dev->minor].i_Sum = 0;
01616                 if (s_BoardInfos[dev->minor].i_ScanType == 1) {
01617                         //i_Initialised=0; 
01618                         //i_InterruptFlag=0; 
01619                         s_BoardInfos[dev->minor].i_Initialised = 0;
01620                         s_BoardInfos[dev->minor].i_InterruptFlag = 0;
01621                         //END JK 06.07.04: Management of sevrals boards
01622                 }
01623                 break;
01624         default:
01625                 printk("\nThe parameters passed are in error\n");
01626                 i_APCI3200_Reset(dev);
01627                 return -EINVAL;
01628         }                       //switch(insn->unused[0])   
01629 
01630         return insn->n;
01631 }
01632 
01633 /*
01634   +----------------------------------------------------------------------------+
01635   | Function   Name   : int i_APCI3200_Read1AnalogInputChannel                 |
01636   |                               (comedi_device *dev,comedi_subdevice *s,       | 
01637   |                     comedi_insn *insn,lsampl_t *data)                      |
01638   +----------------------------------------------------------------------------+
01639   | Task              : Read  value  of the selected channel                             |
01640   +----------------------------------------------------------------------------+
01641   | Input Parameters  : comedi_device *dev      : Driver handle                |
01642   |                     UINT ui_NoOfChannel    : Channel No to read            |
01643   |                     UINT *data              : Data Pointer to read status  |
01644   +----------------------------------------------------------------------------+
01645   | Output Parameters : --                                                                                                       |
01646   |                               data[0]  : Digital Value read                   |
01647   |                                                               
01648   +----------------------------------------------------------------------------+
01649   | Return Value      : TRUE  : No error occur                                 |
01650   |                         : FALSE : Error occur. Return the error          |
01651   |                                                                              |
01652   +----------------------------------------------------------------------------+
01653 */
01654 INT i_APCI3200_Read1AnalogInputChannel(comedi_device * dev,
01655         comedi_subdevice * s, comedi_insn * insn, lsampl_t * data)
01656 {
01657         UINT ui_EOC = 0;
01658         UINT ui_ChannelNo = 0;
01659         UINT ui_CommandRegister = 0;
01660 
01661         //BEGIN JK 06.07.04: Management of sevrals boards
01662         //ui_ChannelNo=i_ChannelNo;
01663         ui_ChannelNo = s_BoardInfos[dev->minor].i_ChannelNo;
01664 
01665         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);                   
01666         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01667                                         12) >> 19) & 1) != 1) ;
01668   /*********************************/
01669         /* Write the channel to configure */
01670   /*********************************/
01671         //Begin JK 20.10.2004: Bad channel value is used when using differential mode
01672         //outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4);
01673         //outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4);
01674         outl(0 | s_BoardInfos[dev->minor].i_ChannelNo,
01675                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
01676         //End JK 20.10.2004: Bad channel value is used when using differential mode
01677 
01678   /*******************************/
01679         /* Set the convert timing unit */
01680   /*******************************/
01681         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01682         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01683                                         12) >> 19) & 1) != 1) ;
01684 
01685         //outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36);                             
01686         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
01687                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
01688 
01689   /**************************/
01690         /* Set the convert timing */
01691   /**************************/
01692         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01693         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01694                                         12) >> 19) & 1) != 1) ;
01695 
01696         //outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32);
01697         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
01698                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
01699 
01700   /**************************************************************************/
01701         /* Set the start end stop index to the selected channel and set the start */
01702   /**************************************************************************/
01703 
01704         ui_CommandRegister = ui_ChannelNo | (ui_ChannelNo << 8) | 0x80000;
01705 
01706   /*********************************/
01707         /*Test if the interrupt is enable */
01708   /*********************************/
01709 
01710         //if (i_InterruptFlag == ADDIDATA_ENABLE)
01711         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
01712       /************************/
01713                 /* Enable the interrupt */
01714       /************************/
01715                 ui_CommandRegister = ui_CommandRegister | 0x00100000;
01716         }                       //if (i_InterruptFlag == ADDIDATA_ENABLE)
01717 
01718   /******************************/
01719         /* Write the command register */
01720   /******************************/
01721         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01722         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01723                                         12) >> 19) & 1) != 1) ;
01724 
01725         //outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8);
01726         outl(ui_CommandRegister,
01727                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
01728 
01729   /*****************************/
01730         /*Test if interrupt is enable */
01731   /*****************************/
01732         //if (i_InterruptFlag == ADDIDATA_DISABLE)
01733         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
01734                 do {
01735           /*************************/
01736                         /*Read the EOC Status bit */
01737           /*************************/
01738 
01739                         //ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1;
01740                         ui_EOC = inl(devpriv->iobase +
01741                                 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
01742 
01743                 } while (ui_EOC != 1);
01744 
01745       /***************************************/
01746                 /* Read the digital value of the input */
01747       /***************************************/
01748 
01749                 //data[0] = inl (devpriv->iobase+i_Offset + 28);
01750                 data[0] =
01751                         inl(devpriv->iobase +
01752                         s_BoardInfos[dev->minor].i_Offset + 28);
01753                 //END JK 06.07.04: Management of sevrals boards
01754 
01755         }                       // if (i_InterruptFlag == ADDIDATA_DISABLE)
01756         return 0;
01757 }
01758 
01759 /*
01760   +----------------------------------------------------------------------------+
01761   | Function   Name   : int i_APCI3200_ReadCalibrationOffsetValue              |
01762   |                               (comedi_device *dev,comedi_subdevice *s,       | 
01763   |                     comedi_insn *insn,lsampl_t *data)                      |
01764   +----------------------------------------------------------------------------+
01765   | Task              : Read calibration offset  value  of the selected channel|
01766   +----------------------------------------------------------------------------+
01767   | Input Parameters  : comedi_device *dev      : Driver handle                |
01768   |                     UINT *data              : Data Pointer to read status  |
01769   +----------------------------------------------------------------------------+
01770   | Output Parameters : --                                                                                                       |
01771   |                               data[0]  : Calibration offset Value   |
01772   |                                                               
01773   +----------------------------------------------------------------------------+
01774   | Return Value      : TRUE  : No error occur                                 |
01775   |                         : FALSE : Error occur. Return the error          |
01776   |                                                                              |
01777   +----------------------------------------------------------------------------+
01778 */
01779 int i_APCI3200_ReadCalibrationOffsetValue(comedi_device * dev, UINT * data)
01780 {
01781         UINT ui_Temp = 0, ui_EOC = 0;
01782         UINT ui_CommandRegister = 0;
01783 
01784         //BEGIN JK 06.07.04: Management of sevrals boards
01785         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);                   
01786         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01787                                         12) >> 19) & 1) != 1) ;
01788   /*********************************/
01789         /* Write the channel to configure */
01790   /*********************************/
01791         //Begin JK 20.10.2004: This seems not necessary !
01792         //outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4);
01793         //outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4);
01794         //End JK 20.10.2004: This seems not necessary !
01795 
01796   /*******************************/
01797         /* Set the convert timing unit */
01798   /*******************************/
01799         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01800         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01801                                         12) >> 19) & 1) != 1) ;
01802         //outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36);
01803         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
01804                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
01805   /**************************/
01806         /* Set the convert timing */
01807   /**************************/
01808         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01809         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01810                                         12) >> 19) & 1) != 1) ;
01811         //outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32);
01812         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
01813                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
01814   /*****************************/
01815         /*Read the calibration offset */
01816   /*****************************/
01817         //ui_Temp = inl(devpriv->iobase+i_Offset + 12);
01818         ui_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
01819 
01820   /*********************************/
01821         /*Configure the Offset Conversion */
01822   /*********************************/
01823         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01824         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01825                                         12) >> 19) & 1) != 1) ;
01826         //outl((ui_Temp | 0x00020000), devpriv->iobase+i_Offset + 12);
01827         outl((ui_Temp | 0x00020000),
01828                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
01829   /*******************************/
01830         /*Initialise ui_CommandRegister */
01831   /*******************************/
01832 
01833         ui_CommandRegister = 0;
01834 
01835   /*********************************/
01836         /*Test if the interrupt is enable */
01837   /*********************************/
01838 
01839         //if (i_InterruptFlag == ADDIDATA_ENABLE)
01840         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
01841 
01842       /**********************/
01843                 /*Enable the interrupt */
01844       /**********************/
01845 
01846                 ui_CommandRegister = ui_CommandRegister | 0x00100000;
01847 
01848         }                       //if (i_InterruptFlag == ADDIDATA_ENABLE)
01849 
01850   /**********************/
01851         /*Start the conversion */
01852   /**********************/
01853         ui_CommandRegister = ui_CommandRegister | 0x00080000;
01854 
01855   /***************************/
01856         /*Write the command regiter */
01857   /***************************/
01858         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01859         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01860                                         12) >> 19) & 1) != 1) ;
01861         //outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8);
01862         outl(ui_CommandRegister,
01863                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
01864 
01865   /*****************************/
01866         /*Test if interrupt is enable */
01867   /*****************************/
01868 
01869         //if (i_InterruptFlag == ADDIDATA_DISABLE)
01870         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
01871 
01872                 do {
01873           /*******************/
01874                         /*Read the EOC flag */
01875           /*******************/
01876 
01877                         //ui_EOC = inl (devpriv->iobase+i_Offset + 20) & 1;
01878                         ui_EOC = inl(devpriv->iobase +
01879                                 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
01880 
01881                 } while (ui_EOC != 1);
01882 
01883       /**************************************************/
01884                 /*Read the digital value of the calibration Offset */
01885       /**************************************************/
01886 
01887                 //data[0] = inl(devpriv->iobase+i_Offset+ 28);
01888                 data[0] =
01889                         inl(devpriv->iobase +
01890                         s_BoardInfos[dev->minor].i_Offset + 28);
01891         }                       //if (i_InterruptFlag == ADDIDATA_DISABLE)
01892         return 0;
01893 }
01894 
01895 /*
01896   +----------------------------------------------------------------------------+
01897   | Function   Name   : int i_APCI3200_ReadCalibrationGainValue                |
01898   |                               (comedi_device *dev,comedi_subdevice *s,       | 
01899   |                     comedi_insn *insn,lsampl_t *data)                      |
01900   +----------------------------------------------------------------------------+
01901   | Task              : Read calibration gain  value  of the selected channel  |
01902   +----------------------------------------------------------------------------+
01903   | Input Parameters  : comedi_device *dev      : Driver handle                |
01904   |                     UINT *data              : Data Pointer to read status  |
01905   +----------------------------------------------------------------------------+
01906   | Output Parameters : --                                                                                                       |
01907   |                               data[0]  : Calibration gain Value Of Input     |
01908   |                                                               
01909   +----------------------------------------------------------------------------+
01910   | Return Value      : TRUE  : No error occur                                 |
01911   |                         : FALSE : Error occur. Return the error          |
01912   |                                                                              |
01913   +----------------------------------------------------------------------------+
01914 */
01915 int i_APCI3200_ReadCalibrationGainValue(comedi_device * dev, UINT * data)
01916 {
01917         UINT ui_EOC = 0;
01918         INT ui_CommandRegister = 0;
01919 
01920         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);                   
01921         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01922                                         12) >> 19) & 1) != 1) ;
01923   /*********************************/
01924         /* Write the channel to configure */
01925   /*********************************/
01926         //Begin JK 20.10.2004: This seems not necessary !
01927         //outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4);
01928         //outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4);
01929         //End JK 20.10.2004: This seems not necessary !
01930 
01931   /***************************/
01932         /*Read the calibration gain */
01933   /***************************/
01934   /*******************************/
01935         /* Set the convert timing unit */
01936   /*******************************/
01937         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01938         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01939                                         12) >> 19) & 1) != 1) ;
01940         //outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36);
01941         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
01942                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
01943   /**************************/
01944         /* Set the convert timing */
01945   /**************************/
01946         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01947         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01948                                         12) >> 19) & 1) != 1) ;
01949         //outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32);
01950         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
01951                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
01952   /*******************************/
01953         /*Configure the Gain Conversion */
01954   /*******************************/
01955         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01956         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01957                                         12) >> 19) & 1) != 1) ;
01958         //outl(0x00040000 , devpriv->iobase+i_Offset + 12);
01959         outl(0x00040000,
01960                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
01961 
01962   /*******************************/
01963         /*Initialise ui_CommandRegister */
01964   /*******************************/
01965 
01966         ui_CommandRegister = 0;
01967 
01968   /*********************************/
01969         /*Test if the interrupt is enable */
01970   /*********************************/
01971 
01972         //if (i_InterruptFlag == ADDIDATA_ENABLE)
01973         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
01974 
01975       /**********************/
01976                 /*Enable the interrupt */
01977       /**********************/
01978 
01979                 ui_CommandRegister = ui_CommandRegister | 0x00100000;
01980 
01981         }                       //if (i_InterruptFlag == ADDIDATA_ENABLE)
01982 
01983   /**********************/
01984         /*Start the conversion */
01985   /**********************/
01986 
01987         ui_CommandRegister = ui_CommandRegister | 0x00080000;
01988   /***************************/
01989         /*Write the command regiter */
01990   /***************************/
01991         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
01992         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
01993                                         12) >> 19) & 1) != 1) ;
01994         //outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8);
01995         outl(ui_CommandRegister,
01996                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
01997 
01998   /*****************************/
01999         /*Test if interrupt is enable */
02000   /*****************************/
02001 
02002         //if (i_InterruptFlag == ADDIDATA_DISABLE)
02003         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
02004 
02005                 do {
02006 
02007           /*******************/
02008                         /*Read the EOC flag */
02009           /*******************/
02010 
02011                         //ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1;
02012                         ui_EOC = inl(devpriv->iobase +
02013                                 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
02014 
02015                 } while (ui_EOC != 1);
02016 
02017       /************************************************/
02018                 /*Read the digital value of the calibration Gain */
02019       /************************************************/
02020 
02021                 //data[0] = inl(devpriv->iobase+i_Offset + 28);
02022                 data[0] =
02023                         inl(devpriv->iobase +
02024                         s_BoardInfos[dev->minor].i_Offset + 28);
02025 
02026         }                       //if (i_InterruptFlag == ADDIDATA_DISABLE)
02027         return 0;
02028 }
02029 
02030 /*
02031   +----------------------------------------------------------------------------+
02032   | Function   Name   : int i_APCI3200_ReadCJCValue                            |
02033   |                               (comedi_device *dev,comedi_subdevice *s,       | 
02034   |                     comedi_insn *insn,lsampl_t *data)                      |
02035   +----------------------------------------------------------------------------+
02036   | Task              : Read CJC  value  of the selected channel               |
02037   +----------------------------------------------------------------------------+
02038   | Input Parameters  : comedi_device *dev      : Driver handle                |
02039   |                     UINT *data              : Data Pointer to read status  |
02040   +----------------------------------------------------------------------------+
02041   | Output Parameters : --                                                                                                       |
02042   |                               data[0]  : CJC Value                           |
02043   |                                                               
02044   +----------------------------------------------------------------------------+
02045   | Return Value      : TRUE  : No error occur                                 |
02046   |                         : FALSE : Error occur. Return the error          |
02047   |                                                                              |
02048   +----------------------------------------------------------------------------+
02049 */
02050 
02051 int i_APCI3200_ReadCJCValue(comedi_device * dev, lsampl_t * data)
02052 {
02053         UINT ui_EOC = 0;
02054         INT ui_CommandRegister = 0;
02055 
02056   /******************************/
02057         /*Set the converting time unit */
02058   /******************************/
02059 
02060         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02061         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02062                                         12) >> 19) & 1) != 1) ;
02063 
02064         //outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36);
02065         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
02066                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
02067   /**************************/
02068         /* Set the convert timing */
02069   /**************************/
02070         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02071         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02072                                         12) >> 19) & 1) != 1) ;
02073 
02074         //outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32);  
02075         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
02076                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
02077 
02078   /******************************/
02079         /*Configure the CJC Conversion */
02080   /******************************/
02081         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02082         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02083                                         12) >> 19) & 1) != 1) ;
02084 
02085         //outl( 0x00000400 , devpriv->iobase+i_Offset + 4);
02086         outl(0x00000400,
02087                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
02088   /*******************************/
02089         /*Initialise dw_CommandRegister */
02090   /*******************************/
02091         ui_CommandRegister = 0;
02092   /*********************************/
02093         /*Test if the interrupt is enable */
02094   /*********************************/
02095         //if (i_InterruptFlag == ADDIDATA_ENABLE)
02096         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
02097       /**********************/
02098                 /*Enable the interrupt */
02099       /**********************/
02100                 ui_CommandRegister = ui_CommandRegister | 0x00100000;
02101         }
02102 
02103   /**********************/
02104         /*Start the conversion */
02105   /**********************/
02106 
02107         ui_CommandRegister = ui_CommandRegister | 0x00080000;
02108 
02109   /***************************/
02110         /*Write the command regiter */
02111   /***************************/
02112         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02113         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02114                                         12) >> 19) & 1) != 1) ;
02115         //outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8);
02116         outl(ui_CommandRegister,
02117                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
02118 
02119   /*****************************/
02120         /*Test if interrupt is enable */
02121   /*****************************/
02122 
02123         //if (i_InterruptFlag == ADDIDATA_DISABLE)
02124         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
02125                 do {
02126 
02127           /*******************/
02128                         /*Read the EOC flag */
02129           /*******************/
02130 
02131                         //ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1;
02132                         ui_EOC = inl(devpriv->iobase +
02133                                 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
02134 
02135                 } while (ui_EOC != 1);
02136 
02137       /***********************************/
02138                 /*Read the digital value of the CJC */
02139       /***********************************/
02140 
02141                 //data[0] = inl(devpriv->iobase+i_Offset + 28);
02142                 data[0] =
02143                         inl(devpriv->iobase +
02144                         s_BoardInfos[dev->minor].i_Offset + 28);
02145 
02146         }                       //if (i_InterruptFlag == ADDIDATA_DISABLE) 
02147         return 0;
02148 }
02149 
02150 /*
02151   +----------------------------------------------------------------------------+
02152   | Function   Name   : int i_APCI3200_ReadCJCCalOffset                        |
02153   |                               (comedi_device *dev,comedi_subdevice *s,       | 
02154   |                     comedi_insn *insn,lsampl_t *data)                      |
02155   +----------------------------------------------------------------------------+
02156   | Task              : Read CJC calibration offset  value  of the selected channel  
02157   +----------------------------------------------------------------------------+
02158   | Input Parameters  : comedi_device *dev      : Driver handle                |
02159   |                     UINT *data              : Data Pointer to read status  |
02160   +----------------------------------------------------------------------------+
02161   | Output Parameters : --                                                                                                       |
02162   |                               data[0]  : CJC calibration offset Value                    
02163   |                                                               
02164   +----------------------------------------------------------------------------+
02165   | Return Value      : TRUE  : No error occur                                 |
02166   |                         : FALSE : Error occur. Return the error          |
02167   |                                                                              |
02168   +----------------------------------------------------------------------------+
02169 */
02170 int i_APCI3200_ReadCJCCalOffset(comedi_device * dev, lsampl_t * data)
02171 {
02172         UINT ui_EOC = 0;
02173         INT ui_CommandRegister = 0;
02174   /*******************************************/
02175         /*Read calibration offset value for the CJC */
02176   /*******************************************/
02177   /*******************************/
02178         /* Set the convert timing unit */
02179   /*******************************/
02180         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02181         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02182                                         12) >> 19) & 1) != 1) ;
02183         //outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36);
02184         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
02185                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
02186   /**************************/
02187         /* Set the convert timing */
02188   /**************************/
02189         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02190         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02191                                         12) >> 19) & 1) != 1) ;
02192         //outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32);               
02193         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
02194                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
02195   /******************************/
02196         /*Configure the CJC Conversion */
02197   /******************************/
02198         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02199         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02200                                         12) >> 19) & 1) != 1) ;
02201         //outl(0x00000400 , devpriv->iobase+i_Offset + 4); 
02202         outl(0x00000400,
02203                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
02204   /*********************************/
02205         /*Configure the Offset Conversion */
02206   /*********************************/
02207         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02208         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02209                                         12) >> 19) & 1) != 1) ;
02210         //outl(0x00020000, devpriv->iobase+i_Offset + 12); 
02211         outl(0x00020000,
02212                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
02213   /*******************************/
02214         /*Initialise ui_CommandRegister */
02215   /*******************************/
02216         ui_CommandRegister = 0;
02217   /*********************************/
02218         /*Test if the interrupt is enable */
02219   /*********************************/
02220 
02221         //if (i_InterruptFlag == ADDIDATA_ENABLE)
02222         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
02223       /**********************/
02224                 /*Enable the interrupt */
02225       /**********************/
02226                 ui_CommandRegister = ui_CommandRegister | 0x00100000;
02227 
02228         }
02229 
02230   /**********************/
02231         /*Start the conversion */
02232   /**********************/
02233         ui_CommandRegister = ui_CommandRegister | 0x00080000;
02234   /***************************/
02235         /*Write the command regiter */
02236   /***************************/
02237         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02238         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02239                                         12) >> 19) & 1) != 1) ;
02240         //outl(ui_CommandRegister,devpriv->iobase+i_Offset + 8);  
02241         outl(ui_CommandRegister,
02242                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
02243         //if (i_InterruptFlag == ADDIDATA_DISABLE)
02244         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
02245                 do {
02246           /*******************/
02247                         /*Read the EOC flag */
02248           /*******************/
02249                         //ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1;
02250                         ui_EOC = inl(devpriv->iobase +
02251                                 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
02252                 } while (ui_EOC != 1);
02253 
02254       /**************************************************/
02255                 /*Read the digital value of the calibration Offset */
02256       /**************************************************/
02257                 //data[0] = inl(devpriv->iobase+i_Offset + 28);
02258                 data[0] =
02259                         inl(devpriv->iobase +
02260                         s_BoardInfos[dev->minor].i_Offset + 28);
02261         }                       //if (i_InterruptFlag == ADDIDATA_DISABLE) 
02262         return 0;
02263 }
02264 
02265 /*
02266   +----------------------------------------------------------------------------+
02267   | Function   Name   : int i_APCI3200_ReadCJCGainValue                        |
02268   |                               (comedi_device *dev,comedi_subdevice *s,       | 
02269   |                     comedi_insn *insn,lsampl_t *data)                      |
02270   +----------------------------------------------------------------------------+
02271   | Task              : Read CJC calibration gain value  
02272   +----------------------------------------------------------------------------+
02273   | Input Parameters  : comedi_device *dev      : Driver handle                |
02274   |                     UINT ui_NoOfChannels    : No Of Channels To read       |
02275   |                     UINT *data              : Data Pointer to read status  |
02276   +----------------------------------------------------------------------------+
02277   | Output Parameters : --                                                                                                       |
02278   |                               data[0]  : CJC calibration gain value                      
02279   |                                                               
02280   +----------------------------------------------------------------------------+
02281   | Return Value      : TRUE  : No error occur                                 |
02282   |                         : FALSE : Error occur. Return the error          |
02283   |                                                                              |
02284   +----------------------------------------------------------------------------+
02285 */
02286 int i_APCI3200_ReadCJCCalGain(comedi_device * dev, lsampl_t * data)
02287 {
02288         UINT ui_EOC = 0;
02289         INT ui_CommandRegister = 0;
02290   /*******************************/
02291         /* Set the convert timing unit */
02292   /*******************************/
02293         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02294         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02295                                         12) >> 19) & 1) != 1) ;
02296         //outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36);
02297         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
02298                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
02299   /**************************/
02300         /* Set the convert timing */
02301   /**************************/
02302         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02303         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02304                                         12) >> 19) & 1) != 1) ;
02305         //outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32);
02306         outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
02307                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
02308   /******************************/
02309         /*Configure the CJC Conversion */
02310   /******************************/
02311         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02312         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02313                                         12) >> 19) & 1) != 1) ;
02314         //outl(0x00000400,devpriv->iobase+i_Offset + 4); 
02315         outl(0x00000400,
02316                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
02317   /*******************************/
02318         /*Configure the Gain Conversion */
02319   /*******************************/
02320         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02321         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02322                                         12) >> 19) & 1) != 1) ;
02323         //outl(0x00040000,devpriv->iobase+i_Offset + 12);             
02324         outl(0x00040000,
02325                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
02326 
02327   /*******************************/
02328         /*Initialise dw_CommandRegister */
02329   /*******************************/
02330         ui_CommandRegister = 0;
02331   /*********************************/
02332         /*Test if the interrupt is enable */
02333   /*********************************/
02334         //if (i_InterruptFlag == ADDIDATA_ENABLE)  
02335         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
02336       /**********************/
02337                 /*Enable the interrupt */
02338       /**********************/
02339                 ui_CommandRegister = ui_CommandRegister | 0x00100000;
02340         }
02341   /**********************/
02342         /*Start the conversion */
02343   /**********************/
02344         ui_CommandRegister = ui_CommandRegister | 0x00080000;
02345   /***************************/
02346         /*Write the command regiter */
02347   /***************************/
02348         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02349         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02350                                         12) >> 19) & 1) != 1) ;
02351         //outl(ui_CommandRegister ,devpriv->iobase+i_Offset + 8);
02352         outl(ui_CommandRegister,
02353                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
02354         //if (i_InterruptFlag == ADDIDATA_DISABLE)
02355         if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
02356                 do {
02357           /*******************/
02358                         /*Read the EOC flag */
02359           /*******************/
02360                         //ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1;      
02361                         ui_EOC = inl(devpriv->iobase +
02362                                 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
02363                 } while (ui_EOC != 1);
02364       /************************************************/
02365                 /*Read the digital value of the calibration Gain */
02366       /************************************************/
02367                 //data[0] = inl (devpriv->iobase+i_Offset + 28);           
02368                 data[0] =
02369                         inl(devpriv->iobase +
02370                         s_BoardInfos[dev->minor].i_Offset + 28);
02371         }                       //if (i_InterruptFlag == ADDIDATA_DISABLE)
02372         return 0;
02373 }
02374 
02375 /*
02376   +----------------------------------------------------------------------------+
02377   | Function   Name   : int i_APCI3200_InsnBits_AnalogInput_Test               |
02378   |                       (comedi_device *dev,comedi_subdevice *s,               | 
02379   |                      comedi_insn *insn,lsampl_t *data)                     |
02380   +----------------------------------------------------------------------------+
02381   | Task              : Tests the Selected Anlog Input Channel                 |
02382   +----------------------------------------------------------------------------+
02383   | Input Parameters  : comedi_device *dev      : Driver handle                |
02384   |                     comedi_subdevice *s     : Subdevice Pointer            |  
02385   |                     comedi_insn *insn       : Insn Structure Pointer       |  
02386   |                     lsampl_t *data          : Data Pointer contains        |
02387   |                                          configuration parameters as below |
02388   |                                                                           
02389   |                         
02390   |                           data[0]            : 0 TestAnalogInputShortCircuit                             
02391   |                                                                          1 TestAnalogInputConnection                                                                                                                                                                                                | 
02392 
02393   +----------------------------------------------------------------------------+
02394   | Output Parameters : --                                                                                                       |
02395   |                             data[0]            : Digital value obtained      | 
02396   |                           data[1]            : calibration offset          |
02397   |                           data[2]            : calibration gain            |         
02398   |                                                                              |
02399   |                                                                              |
02400   +----------------------------------------------------------------------------+
02401   | Return Value      : TRUE  : No error occur                                 |
02402   |                         : FALSE : Error occur. Return the error          |
02403   |                                                                              |
02404   +----------------------------------------------------------------------------+
02405 */
02406 
02407 INT i_APCI3200_InsnBits_AnalogInput_Test(comedi_device * dev,
02408         comedi_subdevice * s, comedi_insn * insn, lsampl_t * data)
02409 {
02410         UINT ui_Configuration = 0;
02411         INT i_Temp;             //,i_TimeUnit;
02412         //if(i_Initialised==0)
02413 
02414         if (s_BoardInfos[dev->minor].i_Initialised == 0) {
02415                 i_APCI3200_Reset(dev);
02416                 return -EINVAL;
02417         }                       //if(i_Initialised==0);   
02418         if (data[0] != 0 && data[0] != 1) {
02419                 printk("\nError in selection of functionality\n");
02420                 i_APCI3200_Reset(dev);
02421                 return -EINVAL;
02422         }                       //if(data[0]!=0 && data[0]!=1)
02423 
02424         if (data[0] == 1)       //Perform Short Circuit TEST 
02425         {
02426       /**************************/
02427                 /*Set the short-cicuit bit */
02428       /**************************/
02429                 //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02430                 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
02431                                                 i_Offset + 12) >> 19) & 1) !=
02432                         1) ;
02433                 //outl((0x00001000 |i_ChannelNo) , devpriv->iobase+i_Offset + 4);
02434                 outl((0x00001000 | s_BoardInfos[dev->minor].i_ChannelNo),
02435                         devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02436                         4);
02437       /*************************/
02438                 /*Set the time unit to ns */
02439       /*************************/
02440                 /* i_TimeUnit= i_ADDIDATAConversionTimeUnit;
02441                    i_ADDIDATAConversionTimeUnit= 1; */
02442                 //i_Temp= i_InterruptFlag ;  
02443                 i_Temp = s_BoardInfos[dev->minor].i_InterruptFlag;
02444                 //i_InterruptFlag = ADDIDATA_DISABLE;
02445                 s_BoardInfos[dev->minor].i_InterruptFlag = ADDIDATA_DISABLE;
02446                 i_APCI3200_Read1AnalogInputChannel(dev, s, insn, data);
02447                 //if(i_AutoCalibration == FALSE)
02448                 if (s_BoardInfos[dev->minor].i_AutoCalibration == FALSE) {
02449                         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02450                         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
02451                                                         i_Offset +
02452                                                         12) >> 19) & 1) != 1) ;
02453 
02454                         //outl((0x00001000 |i_ChannelNo) , devpriv->iobase+i_Offset + 4);
02455                         outl((0x00001000 | s_BoardInfos[dev->minor].
02456                                         i_ChannelNo),
02457                                 devpriv->iobase +
02458                                 s_BoardInfos[dev->minor].i_Offset + 4);
02459                         data++;
02460                         i_APCI3200_ReadCalibrationOffsetValue(dev, data);
02461                         data++;
02462                         i_APCI3200_ReadCalibrationGainValue(dev, data);
02463                 }
02464         } else {
02465                 //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02466                 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
02467                                                 i_Offset + 12) >> 19) & 1) !=
02468                         1) ;
02469                 //outl((0x00000800|i_ChannelNo) , devpriv->iobase+i_Offset + 4); 
02470                 outl((0x00000800 | s_BoardInfos[dev->minor].i_ChannelNo),
02471                         devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02472                         4);
02473                 //ui_Configuration = inl(devpriv->iobase+i_Offset + 0);
02474                 ui_Configuration =
02475                         inl(devpriv->iobase +
02476                         s_BoardInfos[dev->minor].i_Offset + 0);
02477       /*************************/
02478                 /*Set the time unit to ns */
02479       /*************************/
02480                 /* i_TimeUnit= i_ADDIDATAConversionTimeUnit;
02481                    i_ADDIDATAConversionTimeUnit= 1; */
02482                 //i_Temp= i_InterruptFlag ;  
02483                 i_Temp = s_BoardInfos[dev->minor].i_InterruptFlag;
02484                 //i_InterruptFlag = ADDIDATA_DISABLE;
02485                 s_BoardInfos[dev->minor].i_InterruptFlag = ADDIDATA_DISABLE;
02486                 i_APCI3200_Read1AnalogInputChannel(dev, s, insn, data);
02487                 //if(i_AutoCalibration == FALSE)
02488                 if (s_BoardInfos[dev->minor].i_AutoCalibration == FALSE) {
02489                         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02490                         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
02491                                                         i_Offset +
02492                                                         12) >> 19) & 1) != 1) ;
02493                         //outl((0x00000800|i_ChannelNo) , devpriv->iobase+i_Offset + 4);
02494                         outl((0x00000800 | s_BoardInfos[dev->minor].
02495                                         i_ChannelNo),
02496                                 devpriv->iobase +
02497                                 s_BoardInfos[dev->minor].i_Offset + 4);
02498                         data++;
02499                         i_APCI3200_ReadCalibrationOffsetValue(dev, data);
02500                         data++;
02501                         i_APCI3200_ReadCalibrationGainValue(dev, data);
02502                 }
02503         }
02504         //i_InterruptFlag=i_Temp ;
02505         s_BoardInfos[dev->minor].i_InterruptFlag = i_Temp;
02506         //printk("\ni_InterruptFlag=%d\n",i_InterruptFlag);
02507         return insn->n;
02508 }
02509 
02510 /*
02511   +----------------------------------------------------------------------------+
02512   | Function   Name   : int i_APCI3200_InsnWriteReleaseAnalogInput             |
02513   |                       (comedi_device *dev,comedi_subdevice *s,               | 
02514   |                      comedi_insn *insn,lsampl_t *data)                     |
02515   +----------------------------------------------------------------------------+
02516   | Task              :  Resets the channels                                                      |
02517   +----------------------------------------------------------------------------+
02518   | Input Parameters  : comedi_device *dev      : Driver handle                |
02519   |                     comedi_subdevice *s     : Subdevice Pointer            |  
02520   |                     comedi_insn *insn       : Insn Structure Pointer       |  
02521   |                     lsampl_t *data          : Data Pointer 
02522   +----------------------------------------------------------------------------+
02523   | Output Parameters : --                                                                                                       |
02524 
02525   +----------------------------------------------------------------------------+
02526   | Return Value      : TRUE  : No error occur                                 |
02527   |                         : FALSE : Error occur. Return the error          |
02528   |                                                                              |
02529   +----------------------------------------------------------------------------+
02530 */
02531 
02532 INT i_APCI3200_InsnWriteReleaseAnalogInput(comedi_device * dev,
02533         comedi_subdevice * s, comedi_insn * insn, lsampl_t * data)
02534 {
02535         i_APCI3200_Reset(dev);
02536         return insn->n;
02537 }
02538 
02539 /*
02540   +----------------------------------------------------------------------------+
02541   | Function name     :int i_APCI3200_CommandTestAnalogInput(comedi_device *dev|
02542   |                     ,comedi_subdevice *s,comedi_cmd *cmd)                            |
02543   |                                                                                                              |
02544   +----------------------------------------------------------------------------+
02545   | Task              : Test validity for a command for cyclic anlog input     |
02546   |                       acquisition                                                                    | 
02547   |                                                                                                                      |
02548   +----------------------------------------------------------------------------+
02549   | Input Parameters  : comedi_device *dev                                                                       |
02550   |                     comedi_subdevice *s                                                                      |
02551   |                     comedi_cmd *cmd                                                          |
02552   |                                                                                                                      |
02553   |           
02554   |                                                                                                                      |
02555   |                                                                                                                      |
02556   |                                                                                                                      |
02557   +----------------------------------------------------------------------------+
02558   | Return Value      :0                                                                     |
02559   |                                                                                                                          |
02560   +----------------------------------------------------------------------------+
02561 */
02562 
02563 int i_APCI3200_CommandTestAnalogInput(comedi_device * dev, comedi_subdevice * s,
02564         comedi_cmd * cmd)
02565 {
02566 
02567         int err = 0;
02568         int tmp;                // divisor1,divisor2;
02569         UINT ui_ConvertTime = 0;
02570         UINT ui_ConvertTimeBase = 0;
02571         UINT ui_DelayTime = 0;
02572         UINT ui_DelayTimeBase = 0;
02573         INT i_Triggermode = 0;
02574         INT i_TriggerEdge = 0;
02575         INT i_NbrOfChannel = 0;
02576         INT i_Cpt = 0;
02577         double d_ConversionTimeForAllChannels = 0.0;
02578         double d_SCANTimeNewUnit = 0.0;
02579         // step 1: make sure trigger sources are trivially valid 
02580 
02581         tmp = cmd->start_src;
02582         cmd->start_src &= TRIG_NOW | TRIG_EXT;
02583         if (!cmd->start_src || tmp != cmd->start_src)
02584                 err++;
02585         tmp = cmd->scan_begin_src;
02586         cmd->scan_begin_src &= TRIG_TIMER | TRIG_FOLLOW;
02587         if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
02588                 err++;
02589         tmp = cmd->convert_src;
02590         cmd->convert_src &= TRIG_TIMER;
02591         if (!cmd->convert_src || tmp != cmd->convert_src)
02592                 err++;
02593         tmp = cmd->scan_end_src;
02594         cmd->scan_end_src &= TRIG_COUNT;
02595         if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
02596                 err++;
02597         tmp = cmd->stop_src;
02598         cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
02599         if (!cmd->stop_src || tmp != cmd->stop_src)
02600                 err++;
02601         //if(i_InterruptFlag==0)
02602         if (s_BoardInfos[dev->minor].i_InterruptFlag == 0) {
02603                 err++;
02604                 //          printk("\nThe interrupt should be enabled\n");
02605         }
02606         if (err) {
02607                 i_APCI3200_Reset(dev);
02608                 return 1;
02609         }
02610 
02611         if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT) {
02612                 err++;
02613         }
02614         if (cmd->start_src == TRIG_EXT) {
02615                 i_TriggerEdge = cmd->start_arg & 0xFFFF;
02616                 i_Triggermode = cmd->start_arg >> 16;
02617                 if (i_TriggerEdge < 1 || i_TriggerEdge > 3) {
02618                         err++;
02619                         printk("\nThe trigger edge selection is in error\n");
02620                 }
02621                 if (i_Triggermode != 2) {
02622                         err++;
02623                         printk("\nThe trigger mode selection is in error\n");
02624                 }
02625         }
02626 
02627         if (cmd->scan_begin_src != TRIG_TIMER &&
02628                 cmd->scan_begin_src != TRIG_FOLLOW)
02629                 err++;
02630 
02631         if (cmd->convert_src != TRIG_TIMER)
02632                 err++;
02633 
02634         if (cmd->scan_end_src != TRIG_COUNT) {
02635                 cmd->scan_end_src = TRIG_COUNT;
02636                 err++;
02637         }
02638 
02639         if (cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_COUNT)
02640                 err++;
02641 
02642         if (err) {
02643                 i_APCI3200_Reset(dev);
02644                 return 2;
02645         }
02646         //i_FirstChannel=cmd->chanlist[0];
02647         s_BoardInfos[dev->minor].i_FirstChannel = cmd->chanlist[0];
02648         //i_LastChannel=cmd->chanlist[1];   
02649         s_BoardInfos[dev->minor].i_LastChannel = cmd->chanlist[1];
02650 
02651         if (cmd->convert_src == TRIG_TIMER) {
02652                 ui_ConvertTime = cmd->convert_arg & 0xFFFF;
02653                 ui_ConvertTimeBase = cmd->convert_arg >> 16;
02654                 if (ui_ConvertTime != 20 && ui_ConvertTime != 40
02655                         && ui_ConvertTime != 80 && ui_ConvertTime != 160)
02656                 {
02657                         printk("\nThe selection of conversion time reload value is in error\n");
02658                         err++;
02659                 }               // if (ui_ConvertTime!=20 && ui_ConvertTime!=40 && ui_ConvertTime!=80 && ui_ConvertTime!=160 ) 
02660                 if (ui_ConvertTimeBase != 2) {
02661                         printk("\nThe selection of conversion time unit  is in error\n");
02662                         err++;
02663                 }               //if(ui_ConvertTimeBase!=2)  
02664         } else {
02665                 ui_ConvertTime = 0;
02666                 ui_ConvertTimeBase = 0;
02667         }
02668         if (cmd->scan_begin_src == TRIG_FOLLOW) {
02669                 ui_DelayTime = 0;
02670                 ui_DelayTimeBase = 0;
02671         }                       //if(cmd->scan_begin_src==TRIG_FOLLOW)
02672         else {
02673                 ui_DelayTime = cmd->scan_begin_arg & 0xFFFF;
02674                 ui_DelayTimeBase = cmd->scan_begin_arg >> 16;
02675                 if (ui_DelayTimeBase != 2 && ui_DelayTimeBase != 3) {
02676                         err++;
02677                         printk("\nThe Delay time base selection is in error\n");
02678                 }
02679                 if (ui_DelayTime < 1 && ui_DelayTime > 1023) {
02680                         err++;
02681                         printk("\nThe Delay time value is in error\n");
02682                 }
02683                 if (err) {
02684                         i_APCI3200_Reset(dev);
02685                         return 3;
02686                 }
02687                 fpu_begin();
02688                 d_SCANTimeNewUnit = (double)ui_DelayTime;
02689                 //i_NbrOfChannel= i_LastChannel-i_FirstChannel + 4;
02690                 i_NbrOfChannel =
02691                         s_BoardInfos[dev->minor].i_LastChannel -
02692                         s_BoardInfos[dev->minor].i_FirstChannel + 4;
02693       /**********************************************************/
02694                 /*calculate the total conversion time for all the channels */
02695       /**********************************************************/
02696                 d_ConversionTimeForAllChannels =
02697                         (double)((double)ui_ConvertTime /
02698                         (double)i_NbrOfChannel);
02699 
02700       /*******************************/
02701                 /*Convert the frequence in time */
02702       /*******************************/
02703                 d_ConversionTimeForAllChannels =
02704                         (double)1.0 / d_ConversionTimeForAllChannels;
02705                 ui_ConvertTimeBase = 3;
02706       /***********************************/
02707                 /*Test if the time unit is the same */
02708       /***********************************/
02709 
02710                 if (ui_DelayTimeBase <= ui_ConvertTimeBase) {
02711 
02712                         for (i_Cpt = 0;
02713                                 i_Cpt < (ui_ConvertTimeBase - ui_DelayTimeBase);
02714                                 i_Cpt++) {
02715 
02716                                 d_ConversionTimeForAllChannels =
02717                                         d_ConversionTimeForAllChannels * 1000;
02718                                 d_ConversionTimeForAllChannels =
02719                                         d_ConversionTimeForAllChannels + 1;
02720                         }
02721                 } else {
02722                         for (i_Cpt = 0;
02723                                 i_Cpt < (ui_DelayTimeBase - ui_ConvertTimeBase);
02724                                 i_Cpt++) {
02725                                 d_SCANTimeNewUnit = d_SCANTimeNewUnit * 1000;
02726 
02727                         }
02728                 }
02729 
02730                 if (d_ConversionTimeForAllChannels >= d_SCANTimeNewUnit) {
02731 
02732                         printk("\nSCAN Delay value cannot be used\n");
02733           /*********************************/
02734                         /*SCAN Delay value cannot be used */
02735           /*********************************/
02736                         err++;
02737                 }
02738                 fpu_end();
02739         }                       //else if(cmd->scan_begin_src==TRIG_FOLLOW) 
02740 
02741         if (err) {
02742                 i_APCI3200_Reset(dev);
02743                 return 4;
02744         }
02745 
02746         return 0;
02747 }
02748 
02749 /*
02750   +----------------------------------------------------------------------------+
02751   | Function name     :int i_APCI3200_StopCyclicAcquisition(comedi_device *dev,|
02752   |                                                                                          comedi_subdevice *s)|
02753   |                                                                                                              |
02754   +----------------------------------------------------------------------------+
02755   | Task              : Stop the  acquisition                                                |
02756   |                                                                                                                      |
02757   +----------------------------------------------------------------------------+
02758   | Input Parameters  : comedi_device *dev                                                                       |
02759   |                     comedi_subdevice *s                                                                      |
02760   |                                                                                              |
02761   +----------------------------------------------------------------------------+
02762   | Return Value      :0                                                                     |
02763   |                                                                                                                          |
02764   +----------------------------------------------------------------------------+
02765 */
02766 
02767 int i_APCI3200_StopCyclicAcquisition(comedi_device * dev, comedi_subdevice * s)
02768 {
02769         UINT ui_Configuration = 0;
02770         //i_InterruptFlag=0;
02771         //i_Initialised=0;
02772         //i_Count=0;
02773         //i_Sum=0;
02774         s_BoardInfos[dev->minor].i_InterruptFlag = 0;
02775         s_BoardInfos[dev->minor].i_Initialised = 0;
02776         s_BoardInfos[dev->minor].i_Count = 0;
02777         s_BoardInfos[dev->minor].i_Sum = 0;
02778 
02779   /*******************/
02780         /*Read the register */
02781   /*******************/
02782         //ui_Configuration = inl(devpriv->iobase+i_Offset + 8);             
02783         ui_Configuration =
02784                 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
02785   /*****************************/
02786         /*Reset the START and IRQ bit */
02787   /*****************************/
02788         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02789         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02790                                         12) >> 19) & 1) != 1) ;
02791         //outl((ui_Configuration & 0xFFE7FFFF),devpriv->iobase+i_Offset + 8);
02792         outl((ui_Configuration & 0xFFE7FFFF),
02793                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
02794         return 0;
02795 }
02796 
02797 /*
02798   +----------------------------------------------------------------------------+
02799   | Function name     : int i_APCI3200_CommandAnalogInput(comedi_device *dev,  |
02800   |                                                                                             comedi_subdevice *s) |
02801   |                                                                                                              |
02802   +----------------------------------------------------------------------------+
02803   | Task              : Does asynchronous acquisition                          |
02804   |                     Determines the mode 1 or 2.                                                  |
02805   |                                                                                                                      |
02806   +----------------------------------------------------------------------------+
02807   | Input Parameters  : comedi_device *dev                                                                       |
02808   |                     comedi_subdevice *s                                                                      |
02809   |                                                                                                                                      |
02810   |                                                                                                                                      |
02811   +----------------------------------------------------------------------------+
02812   | Return Value      :                                                                          |
02813   |                                                                                                                          |
02814   +----------------------------------------------------------------------------+
02815 */
02816 
02817 int i_APCI3200_CommandAnalogInput(comedi_device * dev, comedi_subdevice * s)
02818 {
02819         comedi_cmd *cmd = &s->async->cmd;
02820         UINT ui_Configuration = 0;
02821         //INT  i_CurrentSource = 0; 
02822         UINT ui_Trigger = 0;
02823         UINT ui_TriggerEdge = 0;
02824         UINT ui_Triggermode = 0;
02825         UINT ui_ScanMode = 0;
02826         UINT ui_ConvertTime = 0;
02827         UINT ui_ConvertTimeBase = 0;
02828         UINT ui_DelayTime = 0;
02829         UINT ui_DelayTimeBase = 0;
02830         UINT ui_DelayMode = 0;
02831         //i_FirstChannel=cmd->chanlist[0];
02832         //i_LastChannel=cmd->chanlist[1];
02833         s_BoardInfos[dev->minor].i_FirstChannel = cmd->chanlist[0];
02834         s_BoardInfos[dev->minor].i_LastChannel = cmd->chanlist[1];
02835         if (cmd->start_src == TRIG_EXT) {
02836                 ui_Trigger = 1;
02837                 ui_TriggerEdge = cmd->start_arg & 0xFFFF;
02838                 ui_Triggermode = cmd->start_arg >> 16;
02839         }                       //if(cmd->start_src==TRIG_EXT) 
02840         else {
02841                 ui_Trigger = 0;
02842         }                       //elseif(cmd->start_src==TRIG_EXT)    
02843 
02844         if (cmd->stop_src == TRIG_COUNT) {
02845                 ui_ScanMode = 0;
02846         }                       // if (cmd->stop_src==TRIG_COUNT) 
02847         else {
02848                 ui_ScanMode = 2;
02849         }                       //else if (cmd->stop_src==TRIG_COUNT) 
02850 
02851         if (cmd->scan_begin_src == TRIG_FOLLOW) {
02852                 ui_DelayTime = 0;
02853                 ui_DelayTimeBase = 0;
02854                 ui_DelayMode = 0;
02855         }                       //if(cmd->scan_begin_src==TRIG_FOLLOW)
02856         else {
02857                 ui_DelayTime = cmd->scan_begin_arg & 0xFFFF;
02858                 ui_DelayTimeBase = cmd->scan_begin_arg >> 16;
02859                 ui_DelayMode = 1;
02860         }                       //else if(cmd->scan_begin_src==TRIG_FOLLOW) 
02861         //        printk("\nui_DelayTime=%u\n",ui_DelayTime);
02862         //        printk("\nui_DelayTimeBase=%u\n",ui_DelayTimeBase);
02863         if (cmd->convert_src == TRIG_TIMER) {
02864                 ui_ConvertTime = cmd->convert_arg & 0xFFFF;
02865                 ui_ConvertTimeBase = cmd->convert_arg >> 16;
02866         } else {
02867                 ui_ConvertTime = 0;
02868                 ui_ConvertTimeBase = 0;
02869         }
02870 
02871         // if(i_ADDIDATAType ==1 || ((i_ADDIDATAType==2)))
02872         //   {
02873   /**************************************************/
02874         /*Read the old configuration of the current source */
02875   /**************************************************/
02876         //ui_Configuration = inl(devpriv->iobase+i_Offset + 12);
02877         ui_Configuration =
02878                 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
02879   /***********************************************/
02880         /*Write the configuration of the current source */
02881   /***********************************************/
02882         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02883         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02884                                         12) >> 19) & 1) != 1) ;
02885         //outl((ui_Configuration & 0xFFC00000 ), devpriv->iobase+i_Offset +12);
02886         outl((ui_Configuration & 0xFFC00000),
02887                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
02888         // } 
02889         ui_Configuration = 0;
02890         //     printk("\nfirstchannel=%u\n",i_FirstChannel);
02891         //     printk("\nlastchannel=%u\n",i_LastChannel);
02892         //     printk("\nui_Trigger=%u\n",ui_Trigger); 
02893         //     printk("\nui_TriggerEdge=%u\n",ui_TriggerEdge);
02894         //     printk("\nui_Triggermode=%u\n",ui_Triggermode);   
02895         //      printk("\nui_DelayMode=%u\n",ui_DelayMode);  
02896         //     printk("\nui_ScanMode=%u\n",ui_ScanMode);       
02897 
02898         //ui_Configuration = i_FirstChannel |(i_LastChannel << 8)| 0x00100000 |
02899         ui_Configuration =
02900                 s_BoardInfos[dev->minor].i_FirstChannel | (s_BoardInfos[dev->
02901                         minor].
02902                 i_LastChannel << 8) | 0x00100000 | (ui_Trigger << 24) |
02903                 (ui_TriggerEdge << 25) | (ui_Triggermode << 27) | (ui_DelayMode
02904                 << 18) | (ui_ScanMode << 16);
02905 
02906   /*************************/
02907         /*Write the Configuration */
02908   /*************************/
02909         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02910         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02911                                         12) >> 19) & 1) != 1) ;
02912         //outl( ui_Configuration, devpriv->iobase+i_Offset + 0x8);          
02913         outl(ui_Configuration,
02914                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x8);
02915   /***********************/
02916         /*Write the Delay Value */
02917   /***********************/
02918         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02919         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02920                                         12) >> 19) & 1) != 1) ;
02921         //outl(ui_DelayTime,devpriv->iobase+i_Offset + 40);                      
02922         outl(ui_DelayTime,
02923                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 40);
02924   /***************************/
02925         /*Write the Delay time base */
02926   /***************************/
02927         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02928         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02929                                         12) >> 19) & 1) != 1) ;
02930         //outl(ui_DelayTimeBase,devpriv->iobase+i_Offset + 44);                      
02931         outl(ui_DelayTimeBase,
02932                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 44);
02933   /*********************************/
02934         /*Write the conversion time value */
02935   /*********************************/
02936         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02937         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02938                                         12) >> 19) & 1) != 1) ;
02939         //outl(ui_ConvertTime,devpriv->iobase+i_Offset + 32);                  
02940         outl(ui_ConvertTime,
02941                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
02942 
02943   /********************************/
02944         /*Write the conversion time base */
02945   /********************************/
02946         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02947         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02948                                         12) >> 19) & 1) != 1) ;
02949         //outl(ui_ConvertTimeBase,devpriv->iobase+i_Offset + 36);          
02950         outl(ui_ConvertTimeBase,
02951                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
02952   /*******************/
02953         /*Read the register */
02954   /*******************/
02955         //ui_Configuration = inl(devpriv->iobase+i_Offset + 4);       
02956         ui_Configuration =
02957                 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
02958   /******************/
02959         /*Set the SCAN bit */
02960   /******************/
02961         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02962         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02963                                         12) >> 19) & 1) != 1) ;
02964 
02965         //outl(((ui_Configuration & 0x1E0FF) | 0x00002000),devpriv->iobase+i_Offset + 4);                  
02966         outl(((ui_Configuration & 0x1E0FF) | 0x00002000),
02967                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
02968   /*******************/
02969         /*Read the register */
02970   /*******************/
02971         ui_Configuration = 0;
02972         //ui_Configuration = inl(devpriv->iobase+i_Offset + 8);
02973         ui_Configuration =
02974                 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
02975 
02976   /*******************/
02977         /*Set the START bit */
02978   /*******************/
02979         //while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1);
02980         while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
02981                                         12) >> 19) & 1) != 1) ;
02982         //outl((ui_Configuration | 0x00080000),devpriv->iobase+i_Offset + 8);        
02983         outl((ui_Configuration | 0x00080000),
02984                 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
02985         return 0;
02986 }
02987 
02988 /*
02989   +----------------------------------------------------------------------------+
02990   | Function   Name   :  int i_APCI3200_Reset(comedi_device *dev)                            |
02991   |                                                                                              |
02992   +----------------------------------------------------------------------------+
02993   | Task              :Resets the registers of the card                        |
02994   +----------------------------------------------------------------------------+
02995   | Input Parameters  :                                                        |
02996   +----------------------------------------------------------------------------+
02997   | Output Parameters : --                                                                                                       |
02998   +----------------------------------------------------------------------------+
02999   | Return Value      :                                                        |
03000   |                                                                                      |
03001   +----------------------------------------------------------------------------+
03002 */
03003 
03004 int i_APCI3200_Reset(comedi_device * dev)
03005 {
03006         INT i_Temp;
03007         DWORD dw_Dummy;
03008         //i_InterruptFlag=0;
03009         //i_Initialised==0;
03010         //i_Count=0;
03011         //i_Sum=0;
03012 
03013         s_BoardInfos[dev->minor].i_InterruptFlag = 0;
03014         s_BoardInfos[dev->minor].i_Initialised = 0;
03015         s_BoardInfos[dev->minor].i_Count = 0;
03016         s_BoardInfos[dev->minor].i_Sum = 0;
03017         s_BoardInfos[dev->minor].b_StructInitialized = 0;
03018 
03019         outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
03020 
03021         // Enable the interrupt for the controler 
03022         dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
03023         outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
03024         outl(0, devpriv->i_IobaseAddon);        //Resets the output
03025   /***************/
03026         /*Empty the buffer */
03027   /**************/
03028         for (i_Temp = 0; i_Temp <= 95; i_Temp++) {
03029                 //ui_InterruptChannelValue[i_Temp]=0;
03030                 s_BoardInfos[dev->minor].ui_InterruptChannelValue[i_Temp] = 0;
03031         }                       //for(i_Temp=0;i_Temp<=95;i_Temp++) 
03032   /*****************************/
03033         /*Reset the START and IRQ bit */
03034   /*****************************/
03035         for (i_Temp = 0; i_Temp <= 192;) {
03036                 while (((inl(devpriv->iobase + i_Temp + 12) >> 19) & 1) != 1) ;
03037                 outl(0, devpriv->iobase + i_Temp + 8);
03038                 i_Temp = i_Temp + 64;
03039         }                       //for(i_Temp=0;i_Temp<=192;i_Temp+64) 
03040         return 0;
03041 }
03042 
03043 /*
03044   +----------------------------------------------------------------------------+
03045   | Function   Name   : static void v_APCI3200_Interrupt                                             |
03046   |                                       (int irq , void *d)                            |
03047   +----------------------------------------------------------------------------+
03048   | Task              : Interrupt processing Routine                           |
03049   +----------------------------------------------------------------------------+
03050   | Input Parameters  : int irq                 : irq number                   |
03051   |                     void *d                 : void pointer                 |
03052   +----------------------------------------------------------------------------+
03053   | Output Parameters : --                                                                                                       |
03054   +----------------------------------------------------------------------------+
03055   | Return Value      : TRUE  : No error occur                                 |
03056   |                         : FALSE : Error occur. Return the error                                      |
03057   |                                                                                              |
03058   +----------------------------------------------------------------------------+
03059 */
03060 void v_APCI3200_Interrupt(int irq, void *d)
03061 {
03062         comedi_device *dev = d;
03063         UINT ui_StatusRegister = 0;
03064         UINT ui_ChannelNumber = 0;
03065         INT i_CalibrationFlag = 0;
03066         INT i_CJCFlag = 0;
03067         UINT ui_DummyValue = 0;
03068         UINT ui_DigitalTemperature = 0;
03069         UINT ui_DigitalInput = 0;
03070         int i_ConvertCJCCalibration;
03071 
03072         //BEGIN JK TEST
03073         int i_ReturnValue = 0;
03074         //END JK TEST
03075 
03076         //printk ("\n i_ScanType = %i i_ADDIDATAType = %i", s_BoardInfos [dev->minor].i_ScanType, s_BoardInfos [dev->minor].i_ADDIDATAType);
03077 
03078         //switch(i_ScanType)
03079         switch (s_BoardInfos[dev->minor].i_ScanType) {
03080         case 0:
03081         case 1:
03082                 //switch(i_ADDIDATAType)
03083                 switch (s_BoardInfos[dev->minor].i_ADDIDATAType) {
03084                 case 0:
03085                 case 1:
03086 
03087           /************************************/
03088                         /*Read the interrupt status register */
03089           /************************************/
03090                         //ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16);
03091                         ui_StatusRegister =
03092                                 inl(devpriv->iobase +
03093                                 s_BoardInfos[dev->minor].i_Offset + 16);
03094                         if ((ui_StatusRegister & 0x2) == 0x2) {
03095                                 //i_CalibrationFlag = ((inl(devpriv->iobase+i_Offset + 12) & 0x00060000) >> 17); 
03096                                 i_CalibrationFlag =
03097                                         ((inl(devpriv->iobase +
03098                                                         s_BoardInfos[dev->
03099                                                                 minor].
03100                                                         i_Offset +
03101                                                         12) & 0x00060000) >>
03102                                         17);
03103               /*************************/
03104                                 /*Read the channel number */
03105               /*************************/
03106                                 //ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24);
03107 
03108               /*************************************/
03109                                 /*Read the digital analog input value */
03110               /*************************************/
03111                                 //ui_DigitalInput = inl(devpriv->iobase+i_Offset + 28);
03112                                 ui_DigitalInput =
03113                                         inl(devpriv->iobase +
03114                                         s_BoardInfos[dev->minor].i_Offset + 28);
03115 
03116               /***********************************************/
03117                                 /* Test if the value read is the channel value */
03118               /***********************************************/
03119                                 if (i_CalibrationFlag == 0) {
03120                                         //ui_InterruptChannelValue[i_Count + 0] = ui_DigitalInput;
03121                                         s_BoardInfos[dev->minor].
03122                                                 ui_InterruptChannelValue
03123                                                 [s_BoardInfos[dev->minor].
03124                                                 i_Count + 0] = ui_DigitalInput;
03125 
03126                                         //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
03127                                         /*
03128                                            printk("\n 1 - i_APCI3200_GetChannelCalibrationValue (dev, s_BoardInfos %i", ui_ChannelNumber);
03129                                            i_APCI3200_GetChannelCalibrationValue (dev, s_BoardInfos [dev->minor].ui_Channel_num, 
03130                                            &s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count + 6], 
03131                                            &s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count + 7], 
03132                                            &s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count + 8]);
03133                                          */
03134                                         //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
03135 
03136                   /******************************************************/
03137                                         /*Start the conversion of the calibration offset value */
03138                   /******************************************************/
03139                                         i_APCI3200_ReadCalibrationOffsetValue
03140                                                 (dev, &ui_DummyValue);
03141                                 }       //if (i_CalibrationFlag == 0)
03142               /**********************************************************/
03143                                 /* Test if the value read is the calibration offset value */
03144               /**********************************************************/
03145 
03146                                 if (i_CalibrationFlag == 1) {
03147 
03148                   /******************/
03149                                         /* Save the value */
03150                   /******************/
03151 
03152                                         //ui_InterruptChannelValue[i_Count + 1] = ui_DigitalInput;
03153                                         s_BoardInfos[dev->minor].
03154                                                 ui_InterruptChannelValue
03155                                                 [s_BoardInfos[dev->minor].
03156                                                 i_Count + 1] = ui_DigitalInput;
03157 
03158                   /******************************************************/
03159                                         /* Start the conversion of the calibration gain value */
03160                   /******************************************************/
03161                                         i_APCI3200_ReadCalibrationGainValue(dev,
03162                                                 &ui_DummyValue);
03163                                 }       //if (i_CalibrationFlag == 1)
03164               /******************************************************/
03165                                 /*Test if the value read is the calibration gain value */
03166               /******************************************************/
03167 
03168                                 if (i_CalibrationFlag == 2) {
03169 
03170                   /****************/
03171                                         /*Save the value */
03172                   /****************/
03173                                         //ui_InterruptChannelValue[i_Count + 2] = ui_DigitalInput;
03174                                         s_BoardInfos[dev->minor].
03175                                                 ui_InterruptChannelValue
03176                                                 [s_BoardInfos[dev->minor].
03177                                                 i_Count + 2] = ui_DigitalInput;
03178                                         //if(i_ScanType==1)
03179                                         if (s_BoardInfos[dev->minor].
03180                                                 i_ScanType == 1) {
03181 
03182                                                 //i_InterruptFlag=0;
03183                                                 s_BoardInfos[dev->minor].
03184                                                         i_InterruptFlag = 0;
03185                                                 //i_Count=i_Count + 6;
03186                                                 //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
03187                                                 //s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count + 6;
03188                                                 s_BoardInfos[dev->minor].
03189                                                         i_Count =
03190                                                         s_BoardInfos[dev->
03191                                                         minor].i_Count + 9;
03192                                                 //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
03193                                         }       //if(i_ScanType==1)
03194                                         else {
03195                                                 //i_Count=0;
03196                                                 s_BoardInfos[dev->minor].
03197                                                         i_Count = 0;
03198                                         }       //elseif(i_ScanType==1)
03199                                         //if(i_ScanType!=1)
03200                                         if (s_BoardInfos[dev->minor].
03201                                                 i_ScanType != 1) {
03202                                                 i_ReturnValue = send_sig(SIGIO, devpriv->tsk_Current, 0);       // send signal to the sample                                                                  
03203                                         }       //if(i_ScanType!=1)
03204                                         else {
03205                                                 //if(i_ChannelCount==i_Sum)
03206                                                 if (s_BoardInfos[dev->minor].
03207                                                         i_ChannelCount ==
03208                                                         s_BoardInfos[dev->
03209                                                                 minor].i_Sum) {
03210                                                         send_sig(SIGIO, devpriv->tsk_Current, 0);       // send signal to the sample               
03211                                                 }
03212                                         }       //if(i_ScanType!=1)
03213                                 }       //if (i_CalibrationFlag == 2)
03214                         }       // if ((ui_StatusRegister & 0x2) == 0x2)  
03215 
03216                         break;
03217 
03218                 case 2:
03219           /************************************/
03220                         /*Read the interrupt status register */
03221           /************************************/
03222 
03223                         //ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16);
03224                         ui_StatusRegister =
03225                                 inl(devpriv->iobase +
03226                                 s_BoardInfos[dev->minor].i_Offset + 16);
03227           /*************************/
03228                         /*Test if interrupt occur */
03229           /*************************/
03230 
03231                         if ((ui_StatusRegister & 0x2) == 0x2) {
03232 
03233                                 //i_CJCFlag = ((inl(devpriv->iobase+i_Offset + 4) & 0x00000400) >> 10);
03234                                 i_CJCFlag =
03235                                         ((inl(devpriv->iobase +
03236                                                         s_BoardInfos[dev->
03237                                                                 minor].
03238                                                         i_Offset +
03239                                                         4) & 0x00000400) >> 10);
03240 
03241                                 //i_CalibrationFlag = ((inl(devpriv->iobase+i_Offset + 12) & 0x00060000) >> 17);
03242                                 i_CalibrationFlag =
03243                                         ((inl(devpriv->iobase +
03244                                                         s_BoardInfos[dev->
03245                                                                 minor].
03246                                                         i_Offset +
03247                                                         12) & 0x00060000) >>
03248                                         17);
03249 
03250               /*************************/
03251                                 /*Read the channel number */
03252               /*************************/
03253 
03254                                 //ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24);
03255                                 ui_ChannelNumber =
03256                                         inl(devpriv->iobase +
03257                                         s_BoardInfos[dev->minor].i_Offset + 24);
03258                                 //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
03259                                 s_BoardInfos[dev->minor].ui_Channel_num =
03260                                         ui_ChannelNumber;
03261                                 //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
03262 
03263               /************************************/
03264                                 /*Read the digital temperature value */
03265               /************************************/
03266                                 //ui_DigitalTemperature = inl(devpriv->iobase+i_Offset + 28);
03267                                 ui_DigitalTemperature =
03268                                         inl(devpriv->iobase +
03269                                         s_BoardInfos[dev->minor].i_Offset + 28);
03270 
03271               /*********************************************/
03272                                 /*Test if the value read is the channel value */
03273               /*********************************************/
03274 
03275                                 if ((i_CalibrationFlag == 0)
03276                                         && (i_CJCFlag == 0)) {
03277                                         //ui_InterruptChannelValue[i_Count + 0]=ui_DigitalTemperature;
03278                                         s_BoardInfos[dev->minor].
03279                                                 ui_InterruptChannelValue
03280                                                 [s_BoardInfos[dev->minor].
03281                                                 i_Count + 0] =
03282                                                 ui_DigitalTemperature;
03283 
03284                   /*********************************/
03285                                         /*Start the conversion of the CJC */
03286                   /*********************************/
03287                                         i_APCI3200_ReadCJCValue(dev,
03288                                                 &ui_DummyValue);
03289 
03290                                 }       //if ((i_CalibrationFlag == 0) && (i_CJCFlag == 0))
03291 
03292                  /*****************************************/
03293                                 /*Test if the value read is the CJC value */
03294                  /*****************************************/
03295 
03296                                 if ((i_CJCFlag == 1)
03297                                         && (i_CalibrationFlag == 0)) {
03298                                         //ui_InterruptChannelValue[i_Count + 3]=ui_DigitalTemperature;
03299                                         s_BoardInfos[dev->minor].
03300                                                 ui_InterruptChannelValue
03301                                                 [s_BoardInfos[dev->minor].
03302                                                 i_Count + 3] =
03303                                                 ui_DigitalTemperature;
03304 
03305                   /******************************************************/
03306                                         /*Start the conversion of the calibration offset value */
03307                   /******************************************************/
03308                                         i_APCI3200_ReadCalibrationOffsetValue
03309                                                 (dev, &ui_DummyValue);
03310                                 }       // if ((i_CJCFlag == 1) && (i_CalibrationFlag == 0))
03311 
03312                  /********************************************************/
03313                                 /*Test if the value read is the calibration offset value */
03314                  /********************************************************/
03315 
03316                                 if ((i_CalibrationFlag == 1)
03317                                         && (i_CJCFlag == 0)) {
03318                                         //ui_InterruptChannelValue[i_Count + 1]=ui_DigitalTemperature;
03319                                         s_BoardInfos[dev->minor].
03320                                                 ui_InterruptChannelValue
03321                                                 [s_BoardInfos[dev->minor].
03322                                                 i_Count + 1] =
03323                                                 ui_DigitalTemperature;
03324 
03325                   /****************************************************/
03326                                         /*Start the conversion of the calibration gain value */
03327                   /****************************************************/
03328                                         i_APCI3200_ReadCalibrationGainValue(dev,
03329                                                 &ui_DummyValue);
03330 
03331                                 }       //if ((i_CalibrationFlag == 1) && (i_CJCFlag == 0))
03332 
03333               /******************************************************/
03334                                 /*Test if the value read is the calibration gain value */
03335               /******************************************************/
03336 
03337                                 if ((i_CalibrationFlag == 2)
03338                                         && (i_CJCFlag == 0)) {
03339                                         //ui_InterruptChannelValue[i_Count + 2]=ui_DigitalTemperature;
03340                                         s_BoardInfos[dev->minor].
03341                                                 ui_InterruptChannelValue
03342                                                 [s_BoardInfos[dev->minor].
03343                                                 i_Count + 2] =
03344                                                 ui_DigitalTemperature;
03345 
03346                   /**********************************************************/
03347                                         /*Test if the Calibration channel must be read for the CJC */
03348                   /**********************************************************/
03349 
03350                                         /*Test if the polarity is the same */
03351                   /**********************************/
03352                                         //if(i_CJCPolarity!=i_ADDIDATAPolarity)
03353                                         if (s_BoardInfos[dev->minor].
03354                                                 i_CJCPolarity !=
03355                                                 s_BoardInfos[dev->minor].
03356                                                 i_ADDIDATAPolarity) {
03357                                                 i_ConvertCJCCalibration = 1;
03358                                         }       //if(i_CJCPolarity!=i_ADDIDATAPolarity)
03359                                         else {
03360                                                 //if(i_CJCGain==i_ADDIDATAGain) 
03361                                                 if (s_BoardInfos[dev->minor].
03362                                                         i_CJCGain ==
03363                                                         s_BoardInfos[dev->
03364                                                                 minor].
03365                                                         i_ADDIDATAGain) {
03366                                                         i_ConvertCJCCalibration
03367                                                                 = 0;
03368                                                 }       //if(i_CJCGain==i_ADDIDATAGain)
03369                                                 else {
03370                                                         i_ConvertCJCCalibration
03371                                                                 = 1;
03372                                                 }       //elseif(i_CJCGain==i_ADDIDATAGain)
03373                                         }       //elseif(i_CJCPolarity!=i_ADDIDATAPolarity)          
03374                                         if (i_ConvertCJCCalibration == 1) {
03375                       /****************************************************************/
03376                                                 /*Start the conversion of the calibration gain value for the CJC */
03377                       /****************************************************************/
03378                                                 i_APCI3200_ReadCJCCalOffset(dev,
03379                                                         &ui_DummyValue);
03380 
03381                                         }       //if(i_ConvertCJCCalibration==1)
03382                                         else {
03383                                                 //ui_InterruptChannelValue[i_Count + 4]=0;
03384                                                 //ui_InterruptChannelValue[i_Count + 5]=0;
03385                                                 s_BoardInfos[dev->minor].
03386                                                         ui_InterruptChannelValue
03387                                                         [s_BoardInfos[dev->
03388                                                                 minor].i_Count +
03389                                                         4] = 0;
03390                                                 s_BoardInfos[dev->minor].
03391                                                         ui_InterruptChannelValue
03392                                                         [s_BoardInfos[dev->
03393                                                                 minor].i_Count +
03394                                                         5] = 0;
03395                                         }       //elseif(i_ConvertCJCCalibration==1)
03396                                 }       //else if ((i_CalibrationFlag == 2) && (i_CJCFlag == 0))
03397 
03398                  /********************************************************************/
03399                                 /*Test if the value read is the calibration offset value for the CJC */
03400                  /********************************************************************/
03401 
03402                                 if ((i_CalibrationFlag == 1)
03403                                         && (i_CJCFlag == 1)) {
03404                                         //ui_InterruptChannelValue[i_Count + 4]=ui_DigitalTemperature; 
03405                                         s_BoardInfos[dev->minor].
03406                                                 ui_InterruptChannelValue
03407                                                 [s_BoardInfos[dev->minor].
03408                                                 i_Count + 4] =
03409                                                 ui_DigitalTemperature;
03410 
03411                   /****************************************************************/
03412                                         /*Start the conversion of the calibration gain value for the CJC */
03413                   /****************************************************************/
03414                                         i_APCI3200_ReadCJCCalGain(dev,
03415                                                 &ui_DummyValue);
03416 
03417                                 }       //if ((i_CalibrationFlag == 1) && (i_CJCFlag == 1))
03418 
03419               /******************************************************************/
03420                                 /*Test if the value read is the calibration gain value for the CJC */
03421               /******************************************************************/
03422 
03423                                 if ((i_CalibrationFlag == 2)
03424                                         && (i_CJCFlag == 1)) {
03425                                         //ui_InterruptChannelValue[i_Count + 5]=ui_DigitalTemperature;  
03426                                         s_BoardInfos[dev->minor].
03427                                                 ui_InterruptChannelValue
03428                                                 [s_BoardInfos[dev->minor].
03429                                                 i_Count + 5] =
03430                                                 ui_DigitalTemperature;
03431 
03432                                         //if(i_ScanType==1)
03433                                         if (s_BoardInfos[dev->minor].
03434                                                 i_ScanType == 1) {
03435 
03436                                                 //i_InterruptFlag=0;
03437                                                 s_BoardInfos[dev->minor].
03438                                                         i_InterruptFlag = 0;
03439                                                 //i_Count=i_Count + 6;
03440                                                 //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values        
03441                                                 //s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count + 6;
03442                                                 s_BoardInfos[dev->minor].
03443                                                         i_Count =
03444                                                         s_BoardInfos[dev->
03445                                                         minor].i_Count + 9;
03446                                                 //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values          
03447                                         }       //if(i_ScanType==1)
03448                                         else {
03449                                                 //i_Count=0;
03450                                                 s_BoardInfos[dev->minor].
03451                                                         i_Count = 0;
03452                                         }       //elseif(i_ScanType==1)
03453 
03454                                         //if(i_ScanType!=1)
03455                                         if (s_BoardInfos[dev->minor].
03456                                                 i_ScanType != 1) {
03457                                                 send_sig(SIGIO, devpriv->tsk_Current, 0);       // send signal to the sample
03458                                         }       //if(i_ScanType!=1)
03459                                         else {
03460                                                 //if(i_ChannelCount==i_Sum)
03461                                                 if (s_BoardInfos[dev->minor].
03462                                                         i_ChannelCount ==
03463                                                         s_BoardInfos[dev->
03464                                                                 minor].i_Sum) {
03465                                                         send_sig(SIGIO, devpriv->tsk_Current, 0);       // send signal to the sample
03466 
03467                                                 }       //if(i_ChannelCount==i_Sum)
03468                                         }       //else if(i_ScanType!=1) 
03469                                 }       //if ((i_CalibrationFlag == 2) && (i_CJCFlag == 1))
03470 
03471                         }       //else if ((ui_StatusRegister & 0x2) == 0x2)
03472                         break;
03473                 }               //switch(i_ADDIDATAType) 
03474                 break;
03475         case 2:
03476         case 3:
03477                 i_APCI3200_InterruptHandleEos(dev);
03478                 break;
03479         }                       //switch(i_ScanType)        
03480         return;
03481 }
03482 
03483 /*
03484   +----------------------------------------------------------------------------+
03485   | Function name     :int i_APCI3200_InterruptHandleEos(comedi_device *dev)   |
03486   |                                                                                                              |
03487   |                                                                                              |
03488   +----------------------------------------------------------------------------+
03489   | Task              : .                   |
03490   |                     This function copies the acquired data(from FIFO)      |
03491   |                             to Comedi buffer.                                                                        |
03492   |                                                                                                                      |
03493   +----------------------------------------------------------------------------+
03494   | Input Parameters  : comedi_device *dev                                                                       |
03495   |                                                                                                                                      |
03496   |                                                                                              |
03497   +----------------------------------------------------------------------------+
03498   | Return Value      : 0                                                                        |
03499   |                                                                                                                          |
03500   +----------------------------------------------------------------------------+
03501 */
03502 int i_APCI3200_InterruptHandleEos(comedi_device * dev)
03503 {
03504         UINT ui_StatusRegister = 0;
03505         comedi_subdevice *s = dev->subdevices + 0;
03506 
03507         //BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03508         //comedi_async *async = s->async;
03509         //UINT *data;  
03510         //data=async->data+async->buf_int_ptr;//new samples added from here onwards
03511         int n = 0, i = 0;
03512         //END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03513 
03514   /************************************/
03515         /*Read the interrupt status register */
03516   /************************************/
03517         //ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16);
03518         ui_StatusRegister =
03519                 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 16);
03520 
03521   /*************************/
03522         /*Test if interrupt occur */
03523   /*************************/
03524 
03525         if ((ui_StatusRegister & 0x2) == 0x2) {
03526       /*************************/
03527                 /*Read the channel number */
03528       /*************************/
03529                 //ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24);
03530                 //BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03531                 //This value is not used      
03532                 //ui_ChannelNumber = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 24);
03533                 s->async->events = 0;
03534                 //END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03535 
03536       /*************************************/
03537                 /*Read the digital Analog Input value */
03538       /*************************************/
03539 
03540                 //data[i_Count] = inl(devpriv->iobase+i_Offset + 28);
03541                 //Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03542                 //data[s_BoardInfos [dev->minor].i_Count] = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 28);
03543                 s_BoardInfos[dev->minor].ui_ScanValueArray[s_BoardInfos[dev->
03544                                 minor].i_Count] =
03545                         inl(devpriv->iobase +
03546                         s_BoardInfos[dev->minor].i_Offset + 28);
03547                 //End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03548 
03549                 //if((i_Count == (i_LastChannel-i_FirstChannel+3)))
03550                 if ((s_BoardInfos[dev->minor].i_Count ==
03551                                 (s_BoardInfos[dev->minor].i_LastChannel -
03552                                         s_BoardInfos[dev->minor].
03553                                         i_FirstChannel + 3))) {
03554 
03555                         //Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values 
03556                         s_BoardInfos[dev->minor].i_Count++;
03557 
03558                         for (i = s_BoardInfos[dev->minor].i_FirstChannel;
03559                                 i <= s_BoardInfos[dev->minor].i_LastChannel;
03560                                 i++) {
03561                                 i_APCI3200_GetChannelCalibrationValue(dev, i,
03562                                         &s_BoardInfos[dev->minor].
03563                                         ui_ScanValueArray[s_BoardInfos[dev->
03564                                                         minor].i_Count + ((i -
03565                                                                 s_BoardInfos
03566                                                                 [dev->minor].
03567                                                                 i_FirstChannel)
03568                                                         * 3)],
03569                                         &s_BoardInfos[dev->minor].
03570                                         ui_ScanValueArray[s_BoardInfos[dev->
03571                                                         minor].i_Count + ((i -
03572                                                                 s_BoardInfos
03573                                                                 [dev->minor].
03574                                                                 i_FirstChannel)
03575                                                         * 3) + 1],
03576                                         &s_BoardInfos[dev->minor].
03577                                         ui_ScanValueArray[s_BoardInfos[dev->
03578                                                         minor].i_Count + ((i -
03579                                                                 s_BoardInfos
03580                                                                 [dev->minor].
03581                                                                 i_FirstChannel)
03582                                                         * 3) + 2]);
03583                         }
03584 
03585                         //End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values
03586 
03587                         //i_Count=-1; 
03588 
03589                         s_BoardInfos[dev->minor].i_Count = -1;
03590 
03591                         //async->buf_int_count+=(i_LastChannel-i_FirstChannel+4)*sizeof(UINT);
03592                         //Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03593                         //async->buf_int_count+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(UINT);
03594                         //End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03595                         //async->buf_int_ptr+=(i_LastChannel-i_FirstChannel+4)*sizeof(UINT);
03596                         //Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03597                         //async->buf_int_ptr+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(UINT);
03598                         //comedi_eos(dev,s);
03599 
03600                         // Set the event type (Comedi Buffer End Of Scan) 
03601                         s->async->events |= COMEDI_CB_EOS;
03602 
03603                         // Test if enougth memory is available and allocate it for 7 values
03604                         //n = comedi_buf_write_alloc(s->async, 7*sizeof(lsampl_t));
03605                         n = comedi_buf_write_alloc(s->async,
03606                                 (7 + 12) * sizeof(lsampl_t));
03607 
03608                         // If not enougth memory available, event is set to Comedi Buffer Errror         
03609                         if (n > ((7 + 12) * sizeof(lsampl_t))) {
03610                                 printk("\ncomedi_buf_write_alloc n = %i", n);
03611                                 s->async->events |= COMEDI_CB_ERROR;
03612                         }
03613                         // Write all 7 scan values in the comedi buffer   
03614                         comedi_buf_memcpy_to(s->async, 0,
03615                                 (lsampl_t *) s_BoardInfos[dev->minor].
03616                                 ui_ScanValueArray, (7 + 12) * sizeof(lsampl_t));
03617 
03618                         // Update comedi buffer pinters indexes
03619                         comedi_buf_write_free(s->async,
03620                                 (7 + 12) * sizeof(lsampl_t));
03621 
03622                         // Send events
03623                         comedi_event(dev, s);
03624                         //End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03625 
03626                         //BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68         
03627                         //
03628                         //if (s->async->buf_int_ptr>=s->async->data_len) //  for buffer rool over  
03629                         //  { 
03630                         //    /* buffer rollover */
03631                         //    s->async->buf_int_ptr=0;
03632                         //    comedi_eobuf(dev,s);
03633                         //  } 
03634                         //End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68
03635                 }
03636                 //i_Count++;
03637                 s_BoardInfos[dev->minor].i_Count++;
03638         }
03639         //i_InterruptFlag=0;
03640         s_BoardInfos[dev->minor].i_InterruptFlag = 0;
03641         return 0;
03642 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines