![]() |
RTXI 1.3
|
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 }