![]() |
RTXI 1.3
|
00001 00024 /* 00025 +-----------------------------------------------------------------------+ 00026 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier | 00027 +-----------------------------------------------------------------------+ 00028 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com | 00029 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com | 00030 +-----------------------------------------------------------------------+ 00031 | Project : API APCI1710 | Compiler : gcc | 00032 | Module name : INC_CPT.C | Version : 2.96 | 00033 +-------------------------------+---------------------------------------+ 00034 | Project manager: Eric Stolz | Date : 02/12/2002 | 00035 +-----------------------------------------------------------------------+ 00036 | Description : APCI-1710 incremental counter module | 00037 | | 00038 | | 00039 +-----------------------------------------------------------------------+ 00040 | UPDATES | 00041 +-----------------------------------------------------------------------+ 00042 | Date | Author | Description of updates | 00043 +----------+-----------+------------------------------------------------+ 00044 | | | | 00045 |----------|-----------|------------------------------------------------| 00046 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 | 00047 | | | available | 00048 +-----------------------------------------------------------------------+ 00049 | 29/06/01 | Guinot C. | - 1100/0231 -> 0701/0232 | 00050 | | | See i_APCI1710_DisableFrequencyMeasurement | 00051 +-----------------------------------------------------------------------+ 00052 */ 00053 00054 /* 00055 +----------------------------------------------------------------------------+ 00056 | Included files | 00057 +----------------------------------------------------------------------------+ 00058 */ 00059 00060 #include "APCI1710_INCCPT.h" 00061 00062 /* 00063 +----------------------------------------------------------------------------+ 00064 | INT i_APCI1710_InsnConfigINCCPT(comedi_device *dev,comedi_subdevice *s, 00065 comedi_insn *insn,lsampl_t *data) 00066 00067 +----------------------------------------------------------------------------+ 00068 | Task : Configuration function for INC_CPT | 00069 +----------------------------------------------------------------------------+ 00070 | Input Parameters : | 00071 +----------------------------------------------------------------------------+ 00072 | Output Parameters : *data 00073 +----------------------------------------------------------------------------+ 00074 | Return Value : | 00075 +----------------------------------------------------------------------------+ 00076 */ 00077 00078 INT i_APCI1710_InsnConfigINCCPT(comedi_device * dev, comedi_subdevice * s, 00079 comedi_insn * insn, lsampl_t * data) 00080 { 00081 UINT ui_ConfigType; 00082 INT i_ReturnValue = 0; 00083 ui_ConfigType = CR_CHAN(insn->chanspec); 00084 00085 printk("\nINC_CPT"); 00086 00087 devpriv->tsk_Current = current; // Save the current process task structure 00088 switch (ui_ConfigType) { 00089 case APCI1710_INCCPT_INITCOUNTER: 00090 i_ReturnValue = i_APCI1710_InitCounter(dev, 00091 CR_AREF(insn->chanspec), 00092 (BYTE) data[0], 00093 (BYTE) data[1], 00094 (BYTE) data[2], (BYTE) data[3], (BYTE) data[4]); 00095 break; 00096 00097 case APCI1710_INCCPT_COUNTERAUTOTEST: 00098 i_ReturnValue = i_APCI1710_CounterAutoTest(dev, 00099 (PBYTE) & data[0]); 00100 break; 00101 00102 case APCI1710_INCCPT_INITINDEX: 00103 i_ReturnValue = i_APCI1710_InitIndex(dev, 00104 CR_AREF(insn->chanspec), 00105 (BYTE) data[0], 00106 (BYTE) data[1], (BYTE) data[2], (BYTE) data[3]); 00107 break; 00108 00109 case APCI1710_INCCPT_INITREFERENCE: 00110 i_ReturnValue = i_APCI1710_InitReference(dev, 00111 CR_AREF(insn->chanspec), (BYTE) data[0]); 00112 break; 00113 00114 case APCI1710_INCCPT_INITEXTERNALSTROBE: 00115 i_ReturnValue = i_APCI1710_InitExternalStrobe(dev, 00116 CR_AREF(insn->chanspec), 00117 (BYTE) data[0], (BYTE) data[1]); 00118 break; 00119 00120 case APCI1710_INCCPT_INITCOMPARELOGIC: 00121 i_ReturnValue = i_APCI1710_InitCompareLogic(dev, 00122 CR_AREF(insn->chanspec), (UINT) data[0]); 00123 break; 00124 00125 case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT: 00126 i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev, 00127 CR_AREF(insn->chanspec), 00128 (BYTE) data[0], 00129 (BYTE) data[1], (ULONG) data[2], (PULONG) & data[0]); 00130 break; 00131 00132 default: 00133 printk("Insn Config : Config Parameter Wrong\n"); 00134 00135 } 00136 00137 if (i_ReturnValue >= 0) 00138 i_ReturnValue = insn->n; 00139 return (i_ReturnValue); 00140 } 00141 00142 /* 00143 +----------------------------------------------------------------------------+ 00144 | Function Name : _INT_ i_APCI1710_InitCounter | 00145 | (BYTE_ b_BoardHandle, | 00146 | BYTE_ b_ModulNbr, | 00147 | BYTE_ b_CounterRange, | 00148 | BYTE_ b_FirstCounterModus, | 00149 | BYTE_ b_FirstCounterOption, | 00150 | BYTE_ b_SecondCounterModus, | 00151 | BYTE_ b_SecondCounterOption) | 00152 +----------------------------------------------------------------------------+ 00153 | Task : Configure the counter operating mode from selected | 00154 | module (b_ModulNbr). You must calling this function be | 00155 | for you call any other function witch access of | 00156 | counters. | 00157 | | 00158 | Counter range | 00159 | ------------- | 00160 | +------------------------------------+-----------------------------------+ | 00161 | | Parameter Passed value | Description | | 00162 | |------------------------------------+-----------------------------------| | 00163 | |b_ModulNbr APCI1710_16BIT_COUNTER | The module is configured for | | 00164 | | | two 16-bit counter. | | 00165 | | | - b_FirstCounterModus and | | 00166 | | | b_FirstCounterOption | | 00167 | | | configure the first 16 bit | | 00168 | | | counter. | | 00169 | | | - b_SecondCounterModus and | | 00170 | | | b_SecondCounterOption | | 00171 | | | configure the second 16 bit | | 00172 | | | counter. | | 00173 | |------------------------------------+-----------------------------------| | 00174 | |b_ModulNbr APCI1710_32BIT_COUNTER | The module is configured for one | | 00175 | | | 32-bit counter. | | 00176 | | | - b_FirstCounterModus and | | 00177 | | | b_FirstCounterOption | | 00178 | | | configure the 32 bit counter. | | 00179 | | | - b_SecondCounterModus and | | 00180 | | | b_SecondCounterOption | | 00181 | | | are not used and have no | | 00182 | | | importance. | | 00183 | +------------------------------------+-----------------------------------+ | 00184 | | 00185 | Counter operating mode | 00186 | ---------------------- | 00187 | | 00188 | +--------------------+-------------------------+-------------------------+ | 00189 | | Parameter | Passed value | Description | | 00190 | |--------------------+-------------------------+-------------------------| | 00191 | |b_FirstCounterModus | APCI1710_QUADRUPLE_MODE | In the quadruple mode, | | 00192 | | or | | the edge analysis | | 00193 | |b_SecondCounterModus| | circuit generates a | | 00194 | | | | counting pulse from | | 00195 | | | | each edge of 2 signals | | 00196 | | | | which are phase shifted | | 00197 | | | | in relation to each | | 00198 | | | | other. | | 00199 | |--------------------+-------------------------+-------------------------| | 00200 | |b_FirstCounterModus | APCI1710_DOUBLE_MODE | Functions in the same | | 00201 | | or | | way as the quadruple | | 00202 | |b_SecondCounterModus| | mode, except that only | | 00203 | | | | two of the four edges | | 00204 | | | | are analysed per | | 00205 | | | | period | | 00206 | |--------------------+-------------------------+-------------------------| | 00207 | |b_FirstCounterModus | APCI1710_SIMPLE_MODE | Functions in the same | | 00208 | | or | | way as the quadruple | | 00209 | |b_SecondCounterModus| | mode, except that only | | 00210 | | | | one of the four edges | | 00211 | | | | is analysed per | | 00212 | | | | period. | | 00213 | |--------------------+-------------------------+-------------------------| | 00214 | |b_FirstCounterModus | APCI1710_DIRECT_MODE | In the direct mode the | | 00215 | | or | | both edge analysis | | 00216 | |b_SecondCounterModus| | circuits are inactive. | | 00217 | | | | The inputs A, B in the | | 00218 | | | | 32-bit mode or A, B and | | 00219 | | | | C, D in the 16-bit mode | | 00220 | | | | represent, each, one | | 00221 | | | | clock pulse gate circuit| | 00222 | | | | There by frequency and | | 00223 | | | | pulse duration | | 00224 | | | | measurements can be | | 00225 | | | | performed. | | 00226 | +--------------------+-------------------------+-------------------------+ | 00227 | | 00228 | | 00229 | IMPORTANT! | 00230 | If you have configured the module for two 16-bit counter, a mixed | 00231 | mode with a counter in quadruple/double/single mode | 00232 | and the other counter in direct mode is not possible! | 00233 | | 00234 | | 00235 | Counter operating option for quadruple/double/simple mode | 00236 | --------------------------------------------------------- | 00237 | | 00238 | +----------------------+-------------------------+------------------------+| 00239 | | Parameter | Passed value | Description || 00240 | |----------------------+-------------------------+------------------------|| 00241 | |b_FirstCounterOption | APCI1710_HYSTERESIS_ON | In both edge analysis || 00242 | | or | | circuits is available || 00243 | |b_SecondCounterOption | | one hysteresis circuit.|| 00244 | | | | It suppresses each || 00245 | | | | time the first counting|| 00246 | | | | pulse after a change || 00247 | | | | of rotation. || 00248 | |----------------------+-------------------------+------------------------|| 00249 | |b_FirstCounterOption | APCI1710_HYSTERESIS_OFF | The first counting || 00250 | | or | | pulse is not suppress || 00251 | |b_SecondCounterOption | | after a change of || 00252 | | | | rotation. || 00253 | +----------------------+-------------------------+------------------------+| 00254 | | 00255 | | 00256 | IMPORTANT! | 00257 | This option are only avaible if you have selected the direct mode. | 00258 | | 00259 | | 00260 | Counter operating option for direct mode | 00261 | ---------------------------------------- | 00262 | | 00263 | +----------------------+--------------------+----------------------------+ | 00264 | | Parameter | Passed value | Description | | 00265 | |----------------------+--------------------+----------------------------| | 00266 | |b_FirstCounterOption | APCI1710_INCREMENT | The counter increment for | | 00267 | | or | | each counting pulse | | 00268 | |b_SecondCounterOption | | | | 00269 | |----------------------+--------------------+----------------------------| | 00270 | |b_FirstCounterOption | APCI1710_DECREMENT | The counter decrement for | | 00271 | | or | | each counting pulse | | 00272 | |b_SecondCounterOption | | | | 00273 | +----------------------+--------------------+----------------------------+ | 00274 | | 00275 +----------------------------------------------------------------------------+ 00276 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710| 00277 | BYTE_ b_ModulNbr : Module number to | 00278 | configure (0 to 3) | 00279 | BYTE_ b_CounterRange : Selection form counter | 00280 | range. | 00281 | BYTE_ b_FirstCounterModus : First counter operating | 00282 | mode. | 00283 | BYTE_ b_FirstCounterOption : First counter option. | 00284 | BYTE_ b_SecondCounterModus : Second counter operating | 00285 | mode. | 00286 | BYTE_ b_SecondCounterOption : Second counter option. | 00287 +----------------------------------------------------------------------------+ 00288 | Output Parameters : - | 00289 +----------------------------------------------------------------------------+ 00290 | Return Value : 0: No error | 00291 | -1: The handle parameter of the board is wrong | 00292 | -2: The module is not a counter module | 00293 | -3: The selected counter range is wrong. | 00294 | -4: The selected first counter operating mode is wrong. | 00295 | -5: The selected first counter operating option is wrong| 00296 | -6: The selected second counter operating mode is wrong.| 00297 | -7: The selected second counter operating option is | 00298 | wrong. | 00299 +----------------------------------------------------------------------------+ 00300 */ 00301 00302 INT i_APCI1710_InitCounter(comedi_device * dev, 00303 BYTE b_ModulNbr, 00304 BYTE b_CounterRange, 00305 BYTE b_FirstCounterModus, 00306 BYTE b_FirstCounterOption, 00307 BYTE b_SecondCounterModus, BYTE b_SecondCounterOption) 00308 { 00309 INT i_ReturnValue = 0; 00310 00311 /*******************************/ 00312 /* Test if incremental counter */ 00313 /*******************************/ 00314 00315 if ((devpriv->s_BoardInfos. 00316 dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF0000UL) == 00317 APCI1710_INCREMENTAL_COUNTER) { 00318 /**************************/ 00319 /* Test the counter range */ 00320 /**************************/ 00321 00322 if (b_CounterRange == APCI1710_16BIT_COUNTER 00323 || b_CounterRange == APCI1710_32BIT_COUNTER) { 00324 /********************************/ 00325 /* Test the first counter modus */ 00326 /********************************/ 00327 00328 if (b_FirstCounterModus == APCI1710_QUADRUPLE_MODE || 00329 b_FirstCounterModus == APCI1710_DOUBLE_MODE || 00330 b_FirstCounterModus == APCI1710_SIMPLE_MODE || 00331 b_FirstCounterModus == APCI1710_DIRECT_MODE) { 00332 /*********************************/ 00333 /* Test the first counter option */ 00334 /*********************************/ 00335 00336 if ((b_FirstCounterModus == APCI1710_DIRECT_MODE 00337 && (b_FirstCounterOption == 00338 APCI1710_INCREMENT 00339 || b_FirstCounterOption 00340 == APCI1710_DECREMENT)) 00341 || (b_FirstCounterModus != 00342 APCI1710_DIRECT_MODE 00343 && (b_FirstCounterOption == 00344 APCI1710_HYSTERESIS_ON 00345 || b_FirstCounterOption 00346 == 00347 APCI1710_HYSTERESIS_OFF))) 00348 { 00349 /**************************/ 00350 /* Test if 16-bit counter */ 00351 /**************************/ 00352 00353 if (b_CounterRange == 00354 APCI1710_16BIT_COUNTER) { 00355 /*********************************/ 00356 /* Test the second counter modus */ 00357 /*********************************/ 00358 00359 if ((b_FirstCounterModus != 00360 APCI1710_DIRECT_MODE 00361 && 00362 (b_SecondCounterModus 00363 == 00364 APCI1710_QUADRUPLE_MODE 00365 || 00366 b_SecondCounterModus 00367 == 00368 APCI1710_DOUBLE_MODE 00369 || 00370 b_SecondCounterModus 00371 == 00372 APCI1710_SIMPLE_MODE)) 00373 || (b_FirstCounterModus 00374 == 00375 APCI1710_DIRECT_MODE 00376 && 00377 b_SecondCounterModus 00378 == 00379 APCI1710_DIRECT_MODE)) 00380 { 00381 /**********************************/ 00382 /* Test the second counter option */ 00383 /**********************************/ 00384 00385 if ((b_SecondCounterModus == APCI1710_DIRECT_MODE && (b_SecondCounterOption == APCI1710_INCREMENT || b_SecondCounterOption == APCI1710_DECREMENT)) || (b_SecondCounterModus != APCI1710_DIRECT_MODE && (b_SecondCounterOption == APCI1710_HYSTERESIS_ON || b_SecondCounterOption == APCI1710_HYSTERESIS_OFF))) { 00386 i_ReturnValue = 00387 0; 00388 } else { 00389 /*********************************************************/ 00390 /* The selected second counter operating option is wrong */ 00391 /*********************************************************/ 00392 00393 DPRINTK("The selected second counter operating option is wrong\n"); 00394 i_ReturnValue = 00395 -7; 00396 } 00397 } else { 00398 /*******************************************************/ 00399 /* The selected second counter operating mode is wrong */ 00400 /*******************************************************/ 00401 00402 DPRINTK("The selected second counter operating mode is wrong\n"); 00403 i_ReturnValue = -6; 00404 } 00405 } 00406 } else { 00407 /********************************************************/ 00408 /* The selected first counter operating option is wrong */ 00409 /********************************************************/ 00410 00411 DPRINTK("The selected first counter operating option is wrong\n"); 00412 i_ReturnValue = -5; 00413 } 00414 } else { 00415 /******************************************************/ 00416 /* The selected first counter operating mode is wrong */ 00417 /******************************************************/ 00418 DPRINTK("The selected first counter operating mode is wrong\n"); 00419 i_ReturnValue = -4; 00420 } 00421 } else { 00422 /***************************************/ 00423 /* The selected counter range is wrong */ 00424 /***************************************/ 00425 00426 DPRINTK("The selected counter range is wrong\n"); 00427 i_ReturnValue = -3; 00428 } 00429 00430 /*************************/ 00431 /* Test if a error occur */ 00432 /*************************/ 00433 00434 if (i_ReturnValue == 0) { 00435 /**************************/ 00436 /* Test if 16-Bit counter */ 00437 /**************************/ 00438 00439 if (b_CounterRange == APCI1710_32BIT_COUNTER) { 00440 devpriv-> 00441 s_ModuleInfo[b_ModulNbr]. 00442 s_SiemensCounterInfo. 00443 s_ModeRegister. 00444 s_ByteModeRegister. 00445 b_ModeRegister1 = b_CounterRange | 00446 b_FirstCounterModus | 00447 b_FirstCounterOption; 00448 } else { 00449 devpriv-> 00450 s_ModuleInfo[b_ModulNbr]. 00451 s_SiemensCounterInfo. 00452 s_ModeRegister. 00453 s_ByteModeRegister. 00454 b_ModeRegister1 = b_CounterRange | 00455 (b_FirstCounterModus & 0x5) | 00456 (b_FirstCounterOption & 0x20) | 00457 (b_SecondCounterModus & 0xA) | 00458 (b_SecondCounterOption & 0x40); 00459 00460 /***********************/ 00461 /* Test if direct mode */ 00462 /***********************/ 00463 00464 if (b_FirstCounterModus == APCI1710_DIRECT_MODE) { 00465 devpriv-> 00466 s_ModuleInfo[b_ModulNbr]. 00467 s_SiemensCounterInfo. 00468 s_ModeRegister. 00469 s_ByteModeRegister. 00470 b_ModeRegister1 = devpriv-> 00471 s_ModuleInfo[b_ModulNbr]. 00472 s_SiemensCounterInfo. 00473 s_ModeRegister. 00474 s_ByteModeRegister. 00475 b_ModeRegister1 | 00476 APCI1710_DIRECT_MODE; 00477 } 00478 } 00479 00480 /***************************/ 00481 /* Write the configuration */ 00482 /***************************/ 00483 00484 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 00485 s_SiemensCounterInfo. 00486 s_ModeRegister. 00487 dw_ModeRegister1_2_3_4, 00488 devpriv->s_BoardInfos. 00489 ui_Address + 20 + (64 * b_ModulNbr)); 00490 00491 devpriv-> 00492 s_ModuleInfo[b_ModulNbr]. 00493 s_SiemensCounterInfo. 00494 s_InitFlag.b_CounterInit = 1; 00495 } 00496 } else { 00497 /**************************************/ 00498 /* The module is not a counter module */ 00499 /**************************************/ 00500 00501 DPRINTK("The module is not a counter module\n"); 00502 i_ReturnValue = -2; 00503 } 00504 00505 return (i_ReturnValue); 00506 } 00507 00508 /* 00509 +----------------------------------------------------------------------------+ 00510 | Function Name : _INT_ i_APCI1710_CounterAutoTest | 00511 | (BYTE_ b_BoardHandle, | 00512 | PBYTE_ pb_TestStatus) | 00513 +----------------------------------------------------------------------------+ 00514 | Task : A test mode is intended for testing the component and | 00515 | the connected periphery. All the 8-bit counter chains | 00516 | are operated internally as down counters. | 00517 | Independently from the external signals, | 00518 | all the four 8-bit counter chains are decremented in | 00519 | parallel by each negative clock pulse edge of CLKX. | 00520 | | 00521 | Counter auto test conclusion | 00522 | ---------------------------- | 00523 | +-----------------+-----------------------------+ | 00524 | | pb_TestStatus | Error description | | 00525 | | mask | | | 00526 | |-----------------+-----------------------------| | 00527 | | 0000 | No error detected | | 00528 | |-----------------|-----------------------------| | 00529 | | 0001 | Error detected of counter 0 | | 00530 | |-----------------|-----------------------------| | 00531 | | 0010 | Error detected of counter 1 | | 00532 | |-----------------|-----------------------------| | 00533 | | 0100 | Error detected of counter 2 | | 00534 | |-----------------|-----------------------------| | 00535 | | 1000 | Error detected of counter 3 | | 00536 | +-----------------+-----------------------------+ | 00537 +----------------------------------------------------------------------------+ 00538 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | | 00539 +----------------------------------------------------------------------------+ 00540 | Output Parameters : PBYTE_ pb_TestStatus : Auto test conclusion. See table| 00541 +----------------------------------------------------------------------------+ 00542 | Return Value : 0: No error | 00543 | -1: The handle parameter of the board is wrong | 00544 | -2: No counter module found | 00545 +----------------------------------------------------------------------------+ 00546 */ 00547 00548 INT i_APCI1710_CounterAutoTest(comedi_device * dev, PBYTE pb_TestStatus) 00549 { 00550 BYTE b_ModulCpt = 0; 00551 INT i_ReturnValue = 0; 00552 DWORD dw_LathchValue; 00553 00554 *pb_TestStatus = 0; 00555 00556 /********************************/ 00557 /* Test if counter module found */ 00558 /********************************/ 00559 00560 if ((devpriv->s_BoardInfos. 00561 dw_MolduleConfiguration[0] & 0xFFFF0000UL) == 00562 APCI1710_INCREMENTAL_COUNTER 00563 || (devpriv->s_BoardInfos. 00564 dw_MolduleConfiguration[1] & 0xFFFF0000UL) == 00565 APCI1710_INCREMENTAL_COUNTER 00566 || (devpriv->s_BoardInfos. 00567 dw_MolduleConfiguration[2] & 0xFFFF0000UL) == 00568 APCI1710_INCREMENTAL_COUNTER 00569 || (devpriv->s_BoardInfos. 00570 dw_MolduleConfiguration[3] & 0xFFFF0000UL) == 00571 APCI1710_INCREMENTAL_COUNTER) { 00572 for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) { 00573 /*******************************/ 00574 /* Test if incremental counter */ 00575 /*******************************/ 00576 00577 if ((devpriv->s_BoardInfos. 00578 dw_MolduleConfiguration[b_ModulCpt] & 00579 0xFFFF0000UL) == 00580 APCI1710_INCREMENTAL_COUNTER) { 00581 /******************/ 00582 /* Start the test */ 00583 /******************/ 00584 00585 outl(3, devpriv->s_BoardInfos. 00586 ui_Address + 16 + (64 * b_ModulCpt)); 00587 00588 /*********************/ 00589 /* Tatch the counter */ 00590 /*********************/ 00591 00592 outl(1, devpriv->s_BoardInfos. 00593 ui_Address + (64 * b_ModulCpt)); 00594 00595 /************************/ 00596 /* Read the latch value */ 00597 /************************/ 00598 00599 dw_LathchValue = inl(devpriv->s_BoardInfos. 00600 ui_Address + 4 + (64 * b_ModulCpt)); 00601 00602 if ((dw_LathchValue & 0xFF) != 00603 ((dw_LathchValue >> 8) & 0xFF) 00604 && (dw_LathchValue & 0xFF) != 00605 ((dw_LathchValue >> 16) & 0xFF) 00606 && (dw_LathchValue & 0xFF) != 00607 ((dw_LathchValue >> 24) & 0xFF)) { 00608 *pb_TestStatus = 00609 *pb_TestStatus | (1 << 00610 b_ModulCpt); 00611 } 00612 00613 /*****************/ 00614 /* Stop the test */ 00615 /*****************/ 00616 00617 outl(0, devpriv->s_BoardInfos. 00618 ui_Address + 16 + (64 * b_ModulCpt)); 00619 } 00620 } 00621 } else { 00622 /***************************/ 00623 /* No counter module found */ 00624 /***************************/ 00625 00626 DPRINTK("No counter module found\n"); 00627 i_ReturnValue = -2; 00628 } 00629 00630 return (i_ReturnValue); 00631 } 00632 00633 /* 00634 +----------------------------------------------------------------------------+ 00635 | Function Name : _INT_ i_APCI1710_InitIndex (BYTE_ b_BoardHandle, | 00636 | BYTE_ b_ModulNbr, | 00637 | BYTE_ b_ReferenceAction, | 00638 | BYTE_ b_IndexOperation, | 00639 | BYTE_ b_AutoMode, | 00640 | BYTE_ b_InterruptEnable) | 00641 +----------------------------------------------------------------------------+ 00642 | Task : Initialise the index corresponding to the selected | 00643 | module (b_ModulNbr). If a INDEX flag occur, you have | 00644 | the possibility to clear the 32-Bit counter or to latch| 00645 | the current 32-Bit value in to the first latch | 00646 | register. The b_IndexOperation parameter give the | 00647 | possibility to choice the INDEX action. | 00648 | If you have enabled the automatic mode, each INDEX | 00649 | action is cleared automatically, else you must read | 00650 | the index status ("i_APCI1710_ReadIndexStatus") | 00651 | after each INDEX action. | 00652 | | 00653 | | 00654 | Index action | 00655 | ------------ | 00656 | | 00657 | +------------------------+------------------------------------+ | 00658 | | b_IndexOperation | Operation | | 00659 | |------------------------+------------------------------------| | 00660 | |APCI1710_LATCH_COUNTER | After a index signal, the counter | | 00661 | | | value (32-Bit) is latched in to | | 00662 | | | the first latch register | | 00663 | |------------------------|------------------------------------| | 00664 | |APCI1710_CLEAR_COUNTER | After a index signal, the counter | | 00665 | | | value is cleared (32-Bit) | | 00666 | +------------------------+------------------------------------+ | 00667 +----------------------------------------------------------------------------+ 00668 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 00669 | BYTE_ b_ModulNbr : Module number to configure | 00670 | (0 to 3) | 00671 | BYTE_ b_ReferenceAction : Determine if the reference | 00672 | must set or no for the | 00673 | acceptance from index | 00674 | APCI1710_ENABLE : | 00675 | Reference must be set for | 00676 | accepted the index | 00677 | APCI1710_DISABLE : | 00678 | Reference have not | 00679 | importance | 00680 | BYTE_ b_IndexOperation : Index operating mode. | 00681 | See table. | 00682 | BYTE_ b_AutoMode : Enable or disable the | 00683 | automatic index reset. | 00684 | APCI1710_ENABLE : | 00685 | Enable the automatic mode | 00686 | APCI1710_DISABLE : | 00687 | Disable the automatic mode | 00688 | BYTE_ b_InterruptEnable : Enable or disable the | 00689 | interrupt. | 00690 | APCI1710_ENABLE : | 00691 | Enable the interrupt | 00692 | APCI1710_DISABLE : | 00693 | Disable the interrupt | 00694 +----------------------------------------------------------------------------+ 00695 | Output Parameters : - | 00696 +----------------------------------------------------------------------------+ 00697 | Return Value : 0: No error | 00698 | -1: The handle parameter of the board is wrong | 00699 | -2: No counter module found | 00700 | -3: Counter not initialised see function | 00701 | "i_APCI1710_InitCounter" | 00702 | -4 The reference action parameter is wrong | 00703 | -5: The index operating mode parameter is wrong | 00704 | -6: The auto mode parameter is wrong | 00705 | -7: Interrupt parameter is wrong | 00706 | -8: Interrupt function not initialised. | 00707 | See function "i_APCI1710_SetBoardIntRoutineX" | 00708 +----------------------------------------------------------------------------+ 00709 */ 00710 00711 INT i_APCI1710_InitIndex(comedi_device * dev, 00712 BYTE b_ModulNbr, 00713 BYTE b_ReferenceAction, 00714 BYTE b_IndexOperation, BYTE b_AutoMode, BYTE b_InterruptEnable) 00715 { 00716 INT i_ReturnValue = 0; 00717 00718 /**************************/ 00719 /* Test the module number */ 00720 /**************************/ 00721 00722 if (b_ModulNbr < 4) { 00723 /*******************************/ 00724 /* Test if counter initialised */ 00725 /*******************************/ 00726 00727 if (devpriv-> 00728 s_ModuleInfo[b_ModulNbr]. 00729 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 00730 /********************************/ 00731 /* Test the reference parameter */ 00732 /********************************/ 00733 00734 if (b_ReferenceAction == APCI1710_ENABLE || 00735 b_ReferenceAction == APCI1710_DISABLE) { 00736 /****************************/ 00737 /* Test the index parameter */ 00738 /****************************/ 00739 00740 if (b_IndexOperation == 00741 APCI1710_HIGH_EDGE_LATCH_COUNTER 00742 || b_IndexOperation == 00743 APCI1710_LOW_EDGE_LATCH_COUNTER 00744 || b_IndexOperation == 00745 APCI1710_HIGH_EDGE_CLEAR_COUNTER 00746 || b_IndexOperation == 00747 APCI1710_LOW_EDGE_CLEAR_COUNTER 00748 || b_IndexOperation == 00749 APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER 00750 || b_IndexOperation == 00751 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 00752 { 00753 /********************************/ 00754 /* Test the auto mode parameter */ 00755 /********************************/ 00756 00757 if (b_AutoMode == APCI1710_ENABLE || 00758 b_AutoMode == APCI1710_DISABLE) 00759 { 00760 /***************************/ 00761 /* Test the interrupt mode */ 00762 /***************************/ 00763 00764 if (b_InterruptEnable == 00765 APCI1710_ENABLE 00766 || b_InterruptEnable == 00767 APCI1710_DISABLE) { 00768 00769 /************************************/ 00770 /* Makte the configuration commando */ 00771 /************************************/ 00772 00773 if (b_ReferenceAction == 00774 APCI1710_ENABLE) 00775 { 00776 devpriv-> 00777 s_ModuleInfo 00778 [b_ModulNbr]. 00779 s_SiemensCounterInfo. 00780 s_ModeRegister. 00781 s_ByteModeRegister. 00782 b_ModeRegister2 00783 = 00784 devpriv-> 00785 s_ModuleInfo 00786 [b_ModulNbr]. 00787 s_SiemensCounterInfo. 00788 s_ModeRegister. 00789 s_ByteModeRegister. 00790 b_ModeRegister2 00791 | 00792 APCI1710_ENABLE_INDEX_ACTION; 00793 } else { 00794 devpriv-> 00795 s_ModuleInfo 00796 [b_ModulNbr]. 00797 s_SiemensCounterInfo. 00798 s_ModeRegister. 00799 s_ByteModeRegister. 00800 b_ModeRegister2 00801 = 00802 devpriv-> 00803 s_ModuleInfo 00804 [b_ModulNbr]. 00805 s_SiemensCounterInfo. 00806 s_ModeRegister. 00807 s_ByteModeRegister. 00808 b_ModeRegister2 00809 & 00810 APCI1710_DISABLE_INDEX_ACTION; 00811 } 00812 00813 /****************************************/ 00814 /* Test if low level latch or/and clear */ 00815 /****************************************/ 00816 00817 if (b_IndexOperation == 00818 APCI1710_LOW_EDGE_LATCH_COUNTER 00819 || 00820 b_IndexOperation 00821 == 00822 APCI1710_LOW_EDGE_CLEAR_COUNTER 00823 || 00824 b_IndexOperation 00825 == 00826 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 00827 { 00828 /*************************************/ 00829 /* Set the index level to low (DQ26) */ 00830 /*************************************/ 00831 00832 devpriv-> 00833 s_ModuleInfo 00834 [b_ModulNbr]. 00835 s_SiemensCounterInfo. 00836 s_ModeRegister. 00837 s_ByteModeRegister. 00838 b_ModeRegister4 00839 = 00840 devpriv-> 00841 s_ModuleInfo 00842 [b_ModulNbr]. 00843 s_SiemensCounterInfo. 00844 s_ModeRegister. 00845 s_ByteModeRegister. 00846 b_ModeRegister4 00847 | 00848 APCI1710_SET_LOW_INDEX_LEVEL; 00849 } else { 00850 /**************************************/ 00851 /* Set the index level to high (DQ26) */ 00852 /**************************************/ 00853 00854 devpriv-> 00855 s_ModuleInfo 00856 [b_ModulNbr]. 00857 s_SiemensCounterInfo. 00858 s_ModeRegister. 00859 s_ByteModeRegister. 00860 b_ModeRegister4 00861 = 00862 devpriv-> 00863 s_ModuleInfo 00864 [b_ModulNbr]. 00865 s_SiemensCounterInfo. 00866 s_ModeRegister. 00867 s_ByteModeRegister. 00868 b_ModeRegister4 00869 & 00870 APCI1710_SET_HIGH_INDEX_LEVEL; 00871 } 00872 00873 /***********************************/ 00874 /* Test if latch and clear counter */ 00875 /***********************************/ 00876 00877 if (b_IndexOperation == 00878 APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER 00879 || 00880 b_IndexOperation 00881 == 00882 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 00883 { 00884 /***************************************/ 00885 /* Set the latch and clear flag (DQ27) */ 00886 /***************************************/ 00887 00888 devpriv-> 00889 s_ModuleInfo 00890 [b_ModulNbr]. 00891 s_SiemensCounterInfo. 00892 s_ModeRegister. 00893 s_ByteModeRegister. 00894 b_ModeRegister4 00895 = 00896 devpriv-> 00897 s_ModuleInfo 00898 [b_ModulNbr]. 00899 s_SiemensCounterInfo. 00900 s_ModeRegister. 00901 s_ByteModeRegister. 00902 b_ModeRegister4 00903 | 00904 APCI1710_ENABLE_LATCH_AND_CLEAR; 00905 } // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 00906 else { 00907 /*****************************************/ 00908 /* Clear the latch and clear flag (DQ27) */ 00909 /*****************************************/ 00910 00911 devpriv-> 00912 s_ModuleInfo 00913 [b_ModulNbr]. 00914 s_SiemensCounterInfo. 00915 s_ModeRegister. 00916 s_ByteModeRegister. 00917 b_ModeRegister4 00918 = 00919 devpriv-> 00920 s_ModuleInfo 00921 [b_ModulNbr]. 00922 s_SiemensCounterInfo. 00923 s_ModeRegister. 00924 s_ByteModeRegister. 00925 b_ModeRegister4 00926 & 00927 APCI1710_DISABLE_LATCH_AND_CLEAR; 00928 00929 /*************************/ 00930 /* Test if latch counter */ 00931 /*************************/ 00932 00933 if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_COUNTER) { 00934 /*********************************/ 00935 /* Enable the latch from counter */ 00936 /*********************************/ 00937 00938 devpriv-> 00939 s_ModuleInfo 00940 [b_ModulNbr]. 00941 s_SiemensCounterInfo. 00942 s_ModeRegister. 00943 s_ByteModeRegister. 00944 b_ModeRegister2 00945 = 00946 devpriv-> 00947 s_ModuleInfo 00948 [b_ModulNbr]. 00949 s_SiemensCounterInfo. 00950 s_ModeRegister. 00951 s_ByteModeRegister. 00952 b_ModeRegister2 00953 | 00954 APCI1710_INDEX_LATCH_COUNTER; 00955 } else { 00956 /*********************************/ 00957 /* Enable the clear from counter */ 00958 /*********************************/ 00959 00960 devpriv-> 00961 s_ModuleInfo 00962 [b_ModulNbr]. 00963 s_SiemensCounterInfo. 00964 s_ModeRegister. 00965 s_ByteModeRegister. 00966 b_ModeRegister2 00967 = 00968 devpriv-> 00969 s_ModuleInfo 00970 [b_ModulNbr]. 00971 s_SiemensCounterInfo. 00972 s_ModeRegister. 00973 s_ByteModeRegister. 00974 b_ModeRegister2 00975 & 00976 (~APCI1710_INDEX_LATCH_COUNTER); 00977 } 00978 } // // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 00979 00980 if (b_AutoMode == 00981 APCI1710_DISABLE) 00982 { 00983 devpriv-> 00984 s_ModuleInfo 00985 [b_ModulNbr]. 00986 s_SiemensCounterInfo. 00987 s_ModeRegister. 00988 s_ByteModeRegister. 00989 b_ModeRegister2 00990 = 00991 devpriv-> 00992 s_ModuleInfo 00993 [b_ModulNbr]. 00994 s_SiemensCounterInfo. 00995 s_ModeRegister. 00996 s_ByteModeRegister. 00997 b_ModeRegister2 00998 | 00999 APCI1710_INDEX_AUTO_MODE; 01000 } else { 01001 devpriv-> 01002 s_ModuleInfo 01003 [b_ModulNbr]. 01004 s_SiemensCounterInfo. 01005 s_ModeRegister. 01006 s_ByteModeRegister. 01007 b_ModeRegister2 01008 = 01009 devpriv-> 01010 s_ModuleInfo 01011 [b_ModulNbr]. 01012 s_SiemensCounterInfo. 01013 s_ModeRegister. 01014 s_ByteModeRegister. 01015 b_ModeRegister2 01016 & 01017 (~APCI1710_INDEX_AUTO_MODE); 01018 } 01019 01020 if (b_InterruptEnable == 01021 APCI1710_ENABLE) 01022 { 01023 devpriv-> 01024 s_ModuleInfo 01025 [b_ModulNbr]. 01026 s_SiemensCounterInfo. 01027 s_ModeRegister. 01028 s_ByteModeRegister. 01029 b_ModeRegister3 01030 = 01031 devpriv-> 01032 s_ModuleInfo 01033 [b_ModulNbr]. 01034 s_SiemensCounterInfo. 01035 s_ModeRegister. 01036 s_ByteModeRegister. 01037 b_ModeRegister3 01038 | 01039 APCI1710_ENABLE_INDEX_INT; 01040 } else { 01041 devpriv-> 01042 s_ModuleInfo 01043 [b_ModulNbr]. 01044 s_SiemensCounterInfo. 01045 s_ModeRegister. 01046 s_ByteModeRegister. 01047 b_ModeRegister3 01048 = 01049 devpriv-> 01050 s_ModuleInfo 01051 [b_ModulNbr]. 01052 s_SiemensCounterInfo. 01053 s_ModeRegister. 01054 s_ByteModeRegister. 01055 b_ModeRegister3 01056 & 01057 APCI1710_DISABLE_INDEX_INT; 01058 } 01059 01060 devpriv-> 01061 s_ModuleInfo 01062 [b_ModulNbr]. 01063 s_SiemensCounterInfo. 01064 s_InitFlag. 01065 b_IndexInit = 1; 01066 01067 } else { 01068 /********************************/ 01069 /* Interrupt parameter is wrong */ 01070 /********************************/ 01071 DPRINTK("Interrupt parameter is wrong\n"); 01072 i_ReturnValue = -7; 01073 } 01074 } else { 01075 /************************************/ 01076 /* The auto mode parameter is wrong */ 01077 /************************************/ 01078 01079 DPRINTK("The auto mode parameter is wrong\n"); 01080 i_ReturnValue = -6; 01081 } 01082 } else { 01083 /***********************************************/ 01084 /* The index operating mode parameter is wrong */ 01085 /***********************************************/ 01086 01087 DPRINTK("The index operating mode parameter is wrong\n"); 01088 i_ReturnValue = -5; 01089 } 01090 } else { 01091 /*******************************************/ 01092 /* The reference action parameter is wrong */ 01093 /*******************************************/ 01094 01095 DPRINTK("The reference action parameter is wrong\n"); 01096 i_ReturnValue = -4; 01097 } 01098 } else { 01099 /****************************************/ 01100 /* Counter not initialised see function */ 01101 /* "i_APCI1710_InitCounter" */ 01102 /****************************************/ 01103 01104 DPRINTK("Counter not initialised\n"); 01105 i_ReturnValue = -3; 01106 } 01107 } else { 01108 /*************************************************/ 01109 /* The selected module number parameter is wrong */ 01110 /*************************************************/ 01111 01112 DPRINTK("The selected module number parameter is wrong\n"); 01113 i_ReturnValue = -2; 01114 } 01115 01116 return (i_ReturnValue); 01117 } 01118 01119 /* 01120 +----------------------------------------------------------------------------+ 01121 | Function Name : _INT_ i_APCI1710_InitReference | 01122 | (BYTE_ b_BoardHandle, | 01123 | BYTE_ b_ModulNbr, | 01124 | BYTE_ b_ReferenceLevel) | 01125 +----------------------------------------------------------------------------+ 01126 | Task : Initialise the reference corresponding to the selected | 01127 | module (b_ModulNbr). | 01128 | | 01129 | Reference level | 01130 | --------------- | 01131 | +--------------------+-------------------------+ | 01132 | | b_ReferenceLevel | Operation | | 01133 | +--------------------+-------------------------+ | 01134 | | APCI1710_LOW | Reference occur if "0" | | 01135 | |--------------------|-------------------------| | 01136 | | APCI1710_HIGH | Reference occur if "1" | | 01137 | +--------------------+-------------------------+ | 01138 +----------------------------------------------------------------------------+ 01139 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 01140 | BYTE_ b_ModulNbr : Module number to configure | 01141 | (0 to 3) | 01142 | BYTE_ b_ReferenceLevel : Reference level. | 01143 +----------------------------------------------------------------------------+ 01144 | Output Parameters : - | 01145 +----------------------------------------------------------------------------+ 01146 | Return Value : 0: No error | 01147 | -1: The handle parameter of the board is wrong | 01148 | -2: The selected module number parameter is wrong | 01149 | -3: Counter not initialised see function | 01150 | "i_APCI1710_InitCounter" | 01151 | -4: Reference level parameter is wrong | 01152 +----------------------------------------------------------------------------+ 01153 */ 01154 01155 INT i_APCI1710_InitReference(comedi_device * dev, 01156 BYTE b_ModulNbr, BYTE b_ReferenceLevel) 01157 { 01158 INT i_ReturnValue = 0; 01159 01160 /**************************/ 01161 /* Test the module number */ 01162 /**************************/ 01163 01164 if (b_ModulNbr < 4) { 01165 /*******************************/ 01166 /* Test if counter initialised */ 01167 /*******************************/ 01168 01169 if (devpriv-> 01170 s_ModuleInfo[b_ModulNbr]. 01171 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 01172 /**************************************/ 01173 /* Test the reference level parameter */ 01174 /**************************************/ 01175 01176 if (b_ReferenceLevel == 0 || b_ReferenceLevel == 1) { 01177 if (b_ReferenceLevel == 1) { 01178 devpriv-> 01179 s_ModuleInfo[b_ModulNbr]. 01180 s_SiemensCounterInfo. 01181 s_ModeRegister. 01182 s_ByteModeRegister. 01183 b_ModeRegister2 = devpriv-> 01184 s_ModuleInfo[b_ModulNbr]. 01185 s_SiemensCounterInfo. 01186 s_ModeRegister. 01187 s_ByteModeRegister. 01188 b_ModeRegister2 | 01189 APCI1710_REFERENCE_HIGH; 01190 } else { 01191 devpriv-> 01192 s_ModuleInfo[b_ModulNbr]. 01193 s_SiemensCounterInfo. 01194 s_ModeRegister. 01195 s_ByteModeRegister. 01196 b_ModeRegister2 = devpriv-> 01197 s_ModuleInfo[b_ModulNbr]. 01198 s_SiemensCounterInfo. 01199 s_ModeRegister. 01200 s_ByteModeRegister. 01201 b_ModeRegister2 & 01202 APCI1710_REFERENCE_LOW; 01203 } 01204 01205 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 01206 s_SiemensCounterInfo. 01207 s_ModeRegister. 01208 dw_ModeRegister1_2_3_4, 01209 devpriv->s_BoardInfos.ui_Address + 20 + 01210 (64 * b_ModulNbr)); 01211 01212 devpriv-> 01213 s_ModuleInfo[b_ModulNbr]. 01214 s_SiemensCounterInfo. 01215 s_InitFlag.b_ReferenceInit = 1; 01216 } else { 01217 /**************************************/ 01218 /* Reference level parameter is wrong */ 01219 /**************************************/ 01220 01221 DPRINTK("Reference level parameter is wrong\n"); 01222 i_ReturnValue = -4; 01223 } 01224 } else { 01225 /****************************************/ 01226 /* Counter not initialised see function */ 01227 /* "i_APCI1710_InitCounter" */ 01228 /****************************************/ 01229 01230 DPRINTK("Counter not initialised\n"); 01231 i_ReturnValue = -3; 01232 } 01233 } else { 01234 /*************************************************/ 01235 /* The selected module number parameter is wrong */ 01236 /*************************************************/ 01237 01238 DPRINTK("The selected module number parameter is wrong\n"); 01239 i_ReturnValue = -2; 01240 } 01241 01242 return (i_ReturnValue); 01243 } 01244 01245 /* 01246 +----------------------------------------------------------------------------+ 01247 | Function Name : _INT_ i_APCI1710_InitExternalStrobe | 01248 | (BYTE_ b_BoardHandle, | 01249 | BYTE_ b_ModulNbr, | 01250 | BYTE_ b_ExternalStrobe, | 01251 | BYTE_ b_ExternalStrobeLevel) | 01252 +----------------------------------------------------------------------------+ 01253 | Task : Initialises the external strobe level corresponding to | 01254 | the selected module (b_ModulNbr). | 01255 +----------------------------------------------------------------------------+ 01256 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 01257 | BYTE_ b_ModulNbr : Module number to configure | 01258 | (0 to 3) | 01259 | BYTE_ b_ExternalStrobe : External strobe selection | 01260 | 0 : External strobe A | 01261 | 1 : External strobe B | 01262 | BYTE_ b_ExternalStrobeLevel : External strobe level | 01263 | APCI1710_LOW : | 01264 | External latch occurs if "0" | 01265 | APCI1710_HIGH : | 01266 | External latch occurs if "1" | 01267 +----------------------------------------------------------------------------+ 01268 | Output Parameters : - | 01269 +----------------------------------------------------------------------------+ 01270 | Return Value : 0: No error | 01271 | -1: The handle parameter of the board is wrong | 01272 | -2: The selected module number is wrong | 01273 | -3: Counter not initialised. | 01274 | See function "i_APCI1710_InitCounter" | 01275 | -4: External strobe selection is wrong | 01276 | -5: External strobe level parameter is wrong | 01277 +----------------------------------------------------------------------------+ 01278 */ 01279 01280 INT i_APCI1710_InitExternalStrobe(comedi_device * dev, 01281 BYTE b_ModulNbr, BYTE b_ExternalStrobe, BYTE b_ExternalStrobeLevel) 01282 { 01283 INT i_ReturnValue = 0; 01284 01285 /**************************/ 01286 /* Test the module number */ 01287 /**************************/ 01288 01289 if (b_ModulNbr < 4) { 01290 /*******************************/ 01291 /* Test if counter initialised */ 01292 /*******************************/ 01293 01294 if (devpriv-> 01295 s_ModuleInfo[b_ModulNbr]. 01296 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 01297 /**************************************/ 01298 /* Test the external strobe selection */ 01299 /**************************************/ 01300 01301 if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) { 01302 /******************/ 01303 /* Test the level */ 01304 /******************/ 01305 01306 if ((b_ExternalStrobeLevel == APCI1710_HIGH) || 01307 ((b_ExternalStrobeLevel == APCI1710_LOW 01308 && (devpriv-> 01309 s_BoardInfos. 01310 dw_MolduleConfiguration 01311 [b_ModulNbr] & 01312 0xFFFF) >= 01313 0x3135))) { 01314 /*****************/ 01315 /* Set the level */ 01316 /*****************/ 01317 01318 devpriv-> 01319 s_ModuleInfo[b_ModulNbr]. 01320 s_SiemensCounterInfo. 01321 s_ModeRegister. 01322 s_ByteModeRegister. 01323 b_ModeRegister4 = (devpriv-> 01324 s_ModuleInfo[b_ModulNbr]. 01325 s_SiemensCounterInfo. 01326 s_ModeRegister. 01327 s_ByteModeRegister. 01328 b_ModeRegister4 & (0xFF - 01329 (0x10 << b_ExternalStrobe))) | ((b_ExternalStrobeLevel ^ 1) << (4 + b_ExternalStrobe)); 01330 } else { 01331 /********************************************/ 01332 /* External strobe level parameter is wrong */ 01333 /********************************************/ 01334 01335 DPRINTK("External strobe level parameter is wrong\n"); 01336 i_ReturnValue = -5; 01337 } 01338 } // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) 01339 else { 01340 /**************************************/ 01341 /* External strobe selection is wrong */ 01342 /**************************************/ 01343 01344 DPRINTK("External strobe selection is wrong\n"); 01345 i_ReturnValue = -4; 01346 } // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) 01347 } else { 01348 /****************************************/ 01349 /* Counter not initialised see function */ 01350 /* "i_APCI1710_InitCounter" */ 01351 /****************************************/ 01352 01353 DPRINTK("Counter not initialised\n"); 01354 i_ReturnValue = -3; 01355 } 01356 } else { 01357 /*************************************************/ 01358 /* The selected module number parameter is wrong */ 01359 /*************************************************/ 01360 01361 DPRINTK("The selected module number parameter is wrong\n"); 01362 i_ReturnValue = -2; 01363 } 01364 01365 return (i_ReturnValue); 01366 } 01367 01368 /* 01369 +----------------------------------------------------------------------------+ 01370 | Function Name : _INT_ i_APCI1710_InitCompareLogic | 01371 | (BYTE_ b_BoardHandle, | 01372 | BYTE_ b_ModulNbr, | 01373 | UINT_ ui_CompareValue) | 01374 +----------------------------------------------------------------------------+ 01375 | Task : Set the 32-Bit compare value. At that moment that the | 01376 | incremental counter arrive to the compare value | 01377 | (ui_CompareValue) a interrupt is generated. | 01378 +----------------------------------------------------------------------------+ 01379 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 01380 | BYTE_ b_ModulNbr : Module number to configure | 01381 | (0 to 3) | 01382 | UINT_ ui_CompareValue : 32-Bit compare value | 01383 +----------------------------------------------------------------------------+ 01384 | Output Parameters : - 01385 +----------------------------------------------------------------------------+ 01386 | Return Value : 0: No error | 01387 | -1: The handle parameter of the board is wrong | 01388 | -2: No counter module found | 01389 | -3: Counter not initialised see function | 01390 | "i_APCI1710_InitCounter" | 01391 +----------------------------------------------------------------------------+ 01392 */ 01393 01394 INT i_APCI1710_InitCompareLogic(comedi_device * dev, 01395 BYTE b_ModulNbr, UINT ui_CompareValue) 01396 { 01397 INT i_ReturnValue = 0; 01398 01399 /**************************/ 01400 /* Test the module number */ 01401 /**************************/ 01402 01403 if (b_ModulNbr < 4) { 01404 /*******************************/ 01405 /* Test if counter initialised */ 01406 /*******************************/ 01407 01408 if (devpriv-> 01409 s_ModuleInfo[b_ModulNbr]. 01410 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 01411 01412 outl(ui_CompareValue, devpriv->s_BoardInfos. 01413 ui_Address + 28 + (64 * b_ModulNbr)); 01414 01415 devpriv-> 01416 s_ModuleInfo[b_ModulNbr]. 01417 s_SiemensCounterInfo. 01418 s_InitFlag.b_CompareLogicInit = 1; 01419 } else { 01420 /****************************************/ 01421 /* Counter not initialised see function */ 01422 /* "i_APCI1710_InitCounter" */ 01423 /****************************************/ 01424 01425 DPRINTK("Counter not initialised\n"); 01426 i_ReturnValue = -3; 01427 } 01428 } else { 01429 /*************************************************/ 01430 /* The selected module number parameter is wrong */ 01431 /*************************************************/ 01432 01433 DPRINTK("The selected module number parameter is wrong\n"); 01434 i_ReturnValue = -2; 01435 } 01436 01437 return (i_ReturnValue); 01438 } 01439 01440 /* 01441 +----------------------------------------------------------------------------+ 01442 | Function Name : _INT_ i_APCI1710_InitFrequencyMeasurement | 01443 | (BYTE_ b_BoardHandle, | 01444 | BYTE_ b_ModulNbr, | 01445 | BYTE_ b_PCIInputClock, | 01446 | BYTE_ b_TimingUnity, | 01447 | ULONG_ ul_TimingInterval, | 01448 | PULONG_ pul_RealTimingInterval) | 01449 +----------------------------------------------------------------------------+ 01450 | Task : Sets the time for the frequency measurement. | 01451 | Configures the selected TOR incremental counter of the | 01452 | selected module (b_ModulNbr). The ul_TimingInterval and| 01453 | ul_TimingUnity determine the time base for the | 01454 | measurement. The pul_RealTimingInterval returns the | 01455 | real time value. You must call up this function before | 01456 | you call up any other function which gives access to | 01457 | the frequency measurement. | 01458 +----------------------------------------------------------------------------+ 01459 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 01460 | BYTE_ b_ModulNbr : Number of the module to be | 01461 | configured (0 to 3) | 01462 | BYTE_ b_PCIInputClock : Selection of the PCI bus | 01463 | clock | 01464 | - APCI1710_30MHZ : | 01465 | The PC has a PCI bus clock | 01466 | of 30 MHz | 01467 | - APCI1710_33MHZ : | 01468 | The PC has a PCI bus clock | 01469 | of 33 MHz | 01470 | BYTE_ b_TimingUnity : Base time unit (0 to 2) | 01471 | 0 : ns | 01472 | 1 : æs | 01473 | 2 : ms | 01474 | ULONG_ ul_TimingInterval: Base time value. | 01475 +----------------------------------------------------------------------------+ 01476 | Output Parameters : PULONG_ pul_RealTimingInterval : Real base time value. | 01477 +----------------------------------------------------------------------------+ 01478 | Return Value : 0: No error | 01479 | -1: The handle parameter of the board is wrong | 01480 | -2: The selected module number is wrong | 01481 | -3: Counter not initialised see function | 01482 | "i_APCI1710_InitCounter" | 01483 | -4: The selected PCI input clock is wrong | 01484 | -5: Timing unity selection is wrong | 01485 | -6: Base timing selection is wrong | 01486 | -7: 40MHz quartz not on board | 01487 +----------------------------------------------------------------------------+ 01488 */ 01489 01490 INT i_APCI1710_InitFrequencyMeasurement(comedi_device * dev, 01491 BYTE b_ModulNbr, 01492 BYTE b_PCIInputClock, 01493 BYTE b_TimingUnity, 01494 ULONG ul_TimingInterval, PULONG pul_RealTimingInterval) 01495 { 01496 INT i_ReturnValue = 0; 01497 ULONG ul_TimerValue = 0; 01498 double d_RealTimingInterval; 01499 DWORD dw_Status = 0; 01500 01501 /**************************/ 01502 /* Test the module number */ 01503 /**************************/ 01504 01505 if (b_ModulNbr < 4) { 01506 /*******************************/ 01507 /* Test if counter initialised */ 01508 /*******************************/ 01509 01510 if (devpriv-> 01511 s_ModuleInfo[b_ModulNbr]. 01512 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 01513 /**************************/ 01514 /* Test the PCI bus clock */ 01515 /**************************/ 01516 01517 if ((b_PCIInputClock == APCI1710_30MHZ) || 01518 (b_PCIInputClock == APCI1710_33MHZ) || 01519 (b_PCIInputClock == APCI1710_40MHZ)) { 01520 /************************/ 01521 /* Test the timing unit */ 01522 /************************/ 01523 01524 if (b_TimingUnity <= 2) { 01525 /**********************************/ 01526 /* Test the base timing selection */ 01527 /**********************************/ 01528 01529 if (((b_PCIInputClock == APCI1710_30MHZ) 01530 && (b_TimingUnity == 0) 01531 && (ul_TimingInterval >= 01532 266) 01533 && (ul_TimingInterval <= 01534 8738133UL)) 01535 || ((b_PCIInputClock == 01536 APCI1710_30MHZ) 01537 && (b_TimingUnity == 1) 01538 && (ul_TimingInterval >= 01539 1) 01540 && (ul_TimingInterval <= 01541 8738UL)) 01542 || ((b_PCIInputClock == 01543 APCI1710_30MHZ) 01544 && (b_TimingUnity == 2) 01545 && (ul_TimingInterval >= 01546 1) 01547 && (ul_TimingInterval <= 01548 8UL)) 01549 || ((b_PCIInputClock == 01550 APCI1710_33MHZ) 01551 && (b_TimingUnity == 0) 01552 && (ul_TimingInterval >= 01553 242) 01554 && (ul_TimingInterval <= 01555 7943757UL)) 01556 || ((b_PCIInputClock == 01557 APCI1710_33MHZ) 01558 && (b_TimingUnity == 1) 01559 && (ul_TimingInterval >= 01560 1) 01561 && (ul_TimingInterval <= 01562 7943UL)) 01563 || ((b_PCIInputClock == 01564 APCI1710_33MHZ) 01565 && (b_TimingUnity == 2) 01566 && (ul_TimingInterval >= 01567 1) 01568 && (ul_TimingInterval <= 01569 7UL)) 01570 || ((b_PCIInputClock == 01571 APCI1710_40MHZ) 01572 && (b_TimingUnity == 0) 01573 && (ul_TimingInterval >= 01574 200) 01575 && (ul_TimingInterval <= 01576 6553500UL)) 01577 || ((b_PCIInputClock == 01578 APCI1710_40MHZ) 01579 && (b_TimingUnity == 1) 01580 && (ul_TimingInterval >= 01581 1) 01582 && (ul_TimingInterval <= 01583 6553UL)) 01584 || ((b_PCIInputClock == 01585 APCI1710_40MHZ) 01586 && (b_TimingUnity == 2) 01587 && (ul_TimingInterval >= 01588 1) 01589 && (ul_TimingInterval <= 01590 6UL))) { 01591 /**********************/ 01592 /* Test if 40MHz used */ 01593 /**********************/ 01594 01595 if (b_PCIInputClock == 01596 APCI1710_40MHZ) { 01597 /******************************/ 01598 /* Test if firmware >= Rev1.5 */ 01599 /******************************/ 01600 01601 if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3135) { 01602 /*********************************/ 01603 /* Test if 40MHz quartz on board */ 01604 /*********************************/ 01605 01606 /*INPDW (ps_APCI1710Variable-> 01607 s_Board [b_BoardHandle]. 01608 s_BoardInfos. 01609 ui_Address + 36 + (64 * b_ModulNbr), &dw_Status); */ 01610 dw_Status = 01611 inl 01612 (devpriv-> 01613 s_BoardInfos. 01614 ui_Address 01615 + 36 + 01616 (64 * b_ModulNbr)); 01617 01618 /******************************/ 01619 /* Test the quartz flag (DQ0) */ 01620 /******************************/ 01621 01622 if ((dw_Status & 1) != 1) { 01623 /*****************************/ 01624 /* 40MHz quartz not on board */ 01625 /*****************************/ 01626 01627 DPRINTK("40MHz quartz not on board\n"); 01628 i_ReturnValue 01629 = 01630 -7; 01631 } 01632 } else { 01633 /*****************************/ 01634 /* 40MHz quartz not on board */ 01635 /*****************************/ 01636 DPRINTK("40MHz quartz not on board\n"); 01637 i_ReturnValue = 01638 -7; 01639 } 01640 } // if (b_PCIInputClock == APCI1710_40MHZ) 01641 01642 /***************************/ 01643 /* Test if not error occur */ 01644 /***************************/ 01645 01646 if (i_ReturnValue == 0) { 01647 /****************************/ 01648 /* Test the INC_CPT version */ 01649 /****************************/ 01650 01651 if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131) { 01652 01653 /**********************/ 01654 /* Test if 40MHz used */ 01655 /**********************/ 01656 01657 if (b_PCIInputClock == APCI1710_40MHZ) { 01658 /*********************************/ 01659 /* Enable the 40MHz quarz (DQ30) */ 01660 /*********************************/ 01661 01662 devpriv-> 01663 s_ModuleInfo 01664 [b_ModulNbr]. 01665 s_SiemensCounterInfo. 01666 s_ModeRegister. 01667 s_ByteModeRegister. 01668 b_ModeRegister4 01669 = 01670 devpriv-> 01671 s_ModuleInfo 01672 [b_ModulNbr]. 01673 s_SiemensCounterInfo. 01674 s_ModeRegister. 01675 s_ByteModeRegister. 01676 b_ModeRegister4 01677 | 01678 APCI1710_ENABLE_40MHZ_FREQUENCY; 01679 } // if (b_PCIInputClock == APCI1710_40MHZ) 01680 else { 01681 /**********************************/ 01682 /* Disable the 40MHz quarz (DQ30) */ 01683 /**********************************/ 01684 01685 devpriv-> 01686 s_ModuleInfo 01687 [b_ModulNbr]. 01688 s_SiemensCounterInfo. 01689 s_ModeRegister. 01690 s_ByteModeRegister. 01691 b_ModeRegister4 01692 = 01693 devpriv-> 01694 s_ModuleInfo 01695 [b_ModulNbr]. 01696 s_SiemensCounterInfo. 01697 s_ModeRegister. 01698 s_ByteModeRegister. 01699 b_ModeRegister4 01700 & 01701 APCI1710_DISABLE_40MHZ_FREQUENCY; 01702 01703 } // if (b_PCIInputClock == APCI1710_40MHZ) 01704 01705 /********************************/ 01706 /* Calculate the division fator */ 01707 /********************************/ 01708 01709 fpu_begin(); 01710 switch (b_TimingUnity) { 01711 /******/ 01712 /* ns */ 01713 /******/ 01714 01715 case 0: 01716 01717 /******************/ 01718 /* Timer 0 factor */ 01719 /******************/ 01720 01721 ul_TimerValue 01722 = 01723 (ULONG) 01724 (ul_TimingInterval 01725 * 01726 (0.00025 * b_PCIInputClock)); 01727 01728 /*******************/ 01729 /* Round the value */ 01730 /*******************/ 01731 01732 if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 01733 ul_TimerValue 01734 = 01735 ul_TimerValue 01736 + 01737 1; 01738 } 01739 01740 /*****************************/ 01741 /* Calculate the real timing */ 01742 /*****************************/ 01743 01744 *pul_RealTimingInterval 01745 = 01746 (ULONG) 01747 (ul_TimerValue 01748 / 01749 (0.00025 * (double)b_PCIInputClock)); 01750 d_RealTimingInterval 01751 = 01752 (double) 01753 ul_TimerValue 01754 / 01755 (0.00025 01756 * 01757 (double) 01758 b_PCIInputClock); 01759 01760 if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) { 01761 *pul_RealTimingInterval 01762 = 01763 *pul_RealTimingInterval 01764 + 01765 1; 01766 } 01767 01768 ul_TimingInterval 01769 = 01770 ul_TimingInterval 01771 - 01772 1; 01773 ul_TimerValue 01774 = 01775 ul_TimerValue 01776 - 01777 2; 01778 01779 break; 01780 01781 /******/ 01782 /* æs */ 01783 /******/ 01784 01785 case 1: 01786 01787 /******************/ 01788 /* Timer 0 factor */ 01789 /******************/ 01790 01791 ul_TimerValue 01792 = 01793 (ULONG) 01794 (ul_TimingInterval 01795 * 01796 (0.25 * b_PCIInputClock)); 01797 01798 /*******************/ 01799 /* Round the value */ 01800 /*******************/ 01801 01802 if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 01803 ul_TimerValue 01804 = 01805 ul_TimerValue 01806 + 01807 1; 01808 } 01809 01810 /*****************************/ 01811 /* Calculate the real timing */ 01812 /*****************************/ 01813 01814 *pul_RealTimingInterval 01815 = 01816 (ULONG) 01817 (ul_TimerValue 01818 / 01819 (0.25 * (double)b_PCIInputClock)); 01820 d_RealTimingInterval 01821 = 01822 (double) 01823 ul_TimerValue 01824 / 01825 ( 01826 (double) 01827 0.25 01828 * 01829 (double) 01830 b_PCIInputClock); 01831 01832 if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) { 01833 *pul_RealTimingInterval 01834 = 01835 *pul_RealTimingInterval 01836 + 01837 1; 01838 } 01839 01840 ul_TimingInterval 01841 = 01842 ul_TimingInterval 01843 - 01844 1; 01845 ul_TimerValue 01846 = 01847 ul_TimerValue 01848 - 01849 2; 01850 01851 break; 01852 01853 /******/ 01854 /* ms */ 01855 /******/ 01856 01857 case 2: 01858 01859 /******************/ 01860 /* Timer 0 factor */ 01861 /******************/ 01862 01863 ul_TimerValue 01864 = 01865 ul_TimingInterval 01866 * 01867 (250.0 01868 * 01869 b_PCIInputClock); 01870 01871 /*******************/ 01872 /* Round the value */ 01873 /*******************/ 01874 01875 if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 01876 ul_TimerValue 01877 = 01878 ul_TimerValue 01879 + 01880 1; 01881 } 01882 01883 /*****************************/ 01884 /* Calculate the real timing */ 01885 /*****************************/ 01886 01887 *pul_RealTimingInterval 01888 = 01889 (ULONG) 01890 (ul_TimerValue 01891 / 01892 (250.0 * (double)b_PCIInputClock)); 01893 d_RealTimingInterval 01894 = 01895 (double) 01896 ul_TimerValue 01897 / 01898 (250.0 01899 * 01900 (double) 01901 b_PCIInputClock); 01902 01903 if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) { 01904 *pul_RealTimingInterval 01905 = 01906 *pul_RealTimingInterval 01907 + 01908 1; 01909 } 01910 01911 ul_TimingInterval 01912 = 01913 ul_TimingInterval 01914 - 01915 1; 01916 ul_TimerValue 01917 = 01918 ul_TimerValue 01919 - 01920 2; 01921 01922 break; 01923 } 01924 01925 fpu_end(); 01926 /*************************/ 01927 /* Write the timer value */ 01928 /*************************/ 01929 01930 outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 32 + (64 * b_ModulNbr)); 01931 01932 /*******************************/ 01933 /* Set the initialisation flag */ 01934 /*******************************/ 01935 01936 devpriv-> 01937 s_ModuleInfo 01938 [b_ModulNbr]. 01939 s_SiemensCounterInfo. 01940 s_InitFlag. 01941 b_FrequencyMeasurementInit 01942 = 1; 01943 } else { 01944 /***************************/ 01945 /* Counter not initialised */ 01946 /***************************/ 01947 01948 DPRINTK("Counter not initialised\n"); 01949 i_ReturnValue = 01950 -3; 01951 } 01952 } // if (i_ReturnValue == 0) 01953 } else { 01954 /**********************************/ 01955 /* Base timing selection is wrong */ 01956 /**********************************/ 01957 01958 DPRINTK("Base timing selection is wrong\n"); 01959 i_ReturnValue = -6; 01960 } 01961 } else { 01962 /***********************************/ 01963 /* Timing unity selection is wrong */ 01964 /***********************************/ 01965 01966 DPRINTK("Timing unity selection is wrong\n"); 01967 i_ReturnValue = -5; 01968 } 01969 } else { 01970 /*****************************************/ 01971 /* The selected PCI input clock is wrong */ 01972 /*****************************************/ 01973 01974 DPRINTK("The selected PCI input clock is wrong\n"); 01975 i_ReturnValue = -4; 01976 } 01977 } else { 01978 /****************************************/ 01979 /* Counter not initialised see function */ 01980 /* "i_APCI1710_InitCounter" */ 01981 /****************************************/ 01982 01983 DPRINTK("Counter not initialised\n"); 01984 i_ReturnValue = -3; 01985 } 01986 } else { 01987 /*************************************************/ 01988 /* The selected module number parameter is wrong */ 01989 /*************************************************/ 01990 01991 DPRINTK("The selected module number parameter is wrong\n"); 01992 i_ReturnValue = -2; 01993 } 01994 01995 return (i_ReturnValue); 01996 } 01997 01998 /*########################################################################### */ 01999 02000 //INSN BITS 02001 /*########################################################################### */ 02002 02003 /* 02004 +----------------------------------------------------------------------------+ 02005 | Function Name :INT i_APCI1710_InsnBitsINCCPT(comedi_device *dev,comedi_subdevice *s, 02006 comedi_insn *insn,lsampl_t *data) | 02007 +----------------------------------------------------------------------------+ 02008 | Task : Set & Clear Functions for INC_CPT | 02009 +----------------------------------------------------------------------------+ 02010 | Input Parameters : 02011 +----------------------------------------------------------------------------+ 02012 | Output Parameters : - | 02013 +----------------------------------------------------------------------------+ 02014 | Return Value : 02015 +----------------------------------------------------------------------------+ 02016 */ 02017 02018 INT i_APCI1710_InsnBitsINCCPT(comedi_device * dev, comedi_subdevice * s, 02019 comedi_insn * insn, lsampl_t * data) 02020 { 02021 UINT ui_BitsType; 02022 INT i_ReturnValue = 0; 02023 ui_BitsType = CR_CHAN(insn->chanspec); 02024 devpriv->tsk_Current = current; // Save the current process task structure 02025 02026 switch (ui_BitsType) { 02027 case APCI1710_INCCPT_CLEARCOUNTERVALUE: 02028 i_ReturnValue = i_APCI1710_ClearCounterValue(dev, 02029 (BYTE) CR_AREF(insn->chanspec)); 02030 break; 02031 02032 case APCI1710_INCCPT_CLEARALLCOUNTERVALUE: 02033 i_ReturnValue = i_APCI1710_ClearAllCounterValue(dev); 02034 break; 02035 02036 case APCI1710_INCCPT_SETINPUTFILTER: 02037 i_ReturnValue = i_APCI1710_SetInputFilter(dev, 02038 (BYTE) CR_AREF(insn->chanspec), 02039 (BYTE) data[0], (BYTE) data[1]); 02040 break; 02041 02042 case APCI1710_INCCPT_LATCHCOUNTER: 02043 i_ReturnValue = i_APCI1710_LatchCounter(dev, 02044 (BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]); 02045 break; 02046 02047 case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE: 02048 i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev, 02049 (BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]); 02050 break; 02051 02052 case APCI1710_INCCPT_SETDIGITALCHLON: 02053 i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev, 02054 (BYTE) CR_AREF(insn->chanspec)); 02055 break; 02056 02057 case APCI1710_INCCPT_SETDIGITALCHLOFF: 02058 i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev, 02059 (BYTE) CR_AREF(insn->chanspec)); 02060 break; 02061 02062 default: 02063 printk("Bits Config Parameter Wrong\n"); 02064 } 02065 02066 if (i_ReturnValue >= 0) 02067 i_ReturnValue = insn->n; 02068 return (i_ReturnValue); 02069 } 02070 02071 /* 02072 +----------------------------------------------------------------------------+ 02073 | Function Name : _INT_ i_APCI1710_ClearCounterValue | 02074 | (BYTE_ b_BoardHandle, | 02075 | BYTE_ b_ModulNbr) | 02076 +----------------------------------------------------------------------------+ 02077 | Task : Clear the counter value from selected module | 02078 | (b_ModulNbr). | 02079 +----------------------------------------------------------------------------+ 02080 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 02081 | BYTE_ b_ModulNbr : Module number to configure | 02082 | (0 to 3) | 02083 +----------------------------------------------------------------------------+ 02084 | Output Parameters : - | 02085 +----------------------------------------------------------------------------+ 02086 | Return Value : 0: No error | 02087 | -1: The handle parameter of the board is wrong | 02088 | -2: The selected module number parameter is wrong | 02089 | -3: Counter not initialised see function | 02090 | "i_APCI1710_InitCounter" | 02091 +----------------------------------------------------------------------------+ 02092 */ 02093 02094 INT i_APCI1710_ClearCounterValue(comedi_device * dev, BYTE b_ModulNbr) 02095 { 02096 INT i_ReturnValue = 0; 02097 02098 /**************************/ 02099 /* Test the module number */ 02100 /**************************/ 02101 02102 if (b_ModulNbr < 4) { 02103 /*******************************/ 02104 /* Test if counter initialised */ 02105 /*******************************/ 02106 02107 if (devpriv-> 02108 s_ModuleInfo[b_ModulNbr]. 02109 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 02110 /*********************/ 02111 /* Clear the counter */ 02112 /*********************/ 02113 02114 outl(1, devpriv->s_BoardInfos. 02115 ui_Address + 16 + (64 * b_ModulNbr)); 02116 } else { 02117 /****************************************/ 02118 /* Counter not initialised see function */ 02119 /* "i_APCI1710_InitCounter" */ 02120 /****************************************/ 02121 02122 DPRINTK("Counter not initialised\n"); 02123 i_ReturnValue = -3; 02124 } 02125 } else { 02126 /*************************************************/ 02127 /* The selected module number parameter is wrong */ 02128 /*************************************************/ 02129 02130 DPRINTK("The selected module number parameter is wrong\n"); 02131 i_ReturnValue = -2; 02132 } 02133 02134 return (i_ReturnValue); 02135 } 02136 02137 /* 02138 +----------------------------------------------------------------------------+ 02139 | Function Name : _INT_ i_APCI1710_ClearAllCounterValue | 02140 | (BYTE_ b_BoardHandle) | 02141 +----------------------------------------------------------------------------+ 02142 | Task : Clear all counter value. | 02143 +----------------------------------------------------------------------------+ 02144 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 02145 +----------------------------------------------------------------------------+ 02146 | Output Parameters : - | 02147 +----------------------------------------------------------------------------+ 02148 | Return Value : 0: No error | 02149 | -1: The handle parameter of the board is wrong | 02150 | -2: No counter module found | 02151 +----------------------------------------------------------------------------+ 02152 */ 02153 02154 INT i_APCI1710_ClearAllCounterValue(comedi_device * dev) 02155 { 02156 BYTE b_ModulCpt = 0; 02157 INT i_ReturnValue = 0; 02158 02159 /********************************/ 02160 /* Test if counter module found */ 02161 /********************************/ 02162 02163 if ((devpriv->s_BoardInfos. 02164 dw_MolduleConfiguration[0] & 0xFFFF0000UL) == 02165 APCI1710_INCREMENTAL_COUNTER 02166 || (devpriv->s_BoardInfos. 02167 dw_MolduleConfiguration[1] & 0xFFFF0000UL) == 02168 APCI1710_INCREMENTAL_COUNTER 02169 || (devpriv->s_BoardInfos. 02170 dw_MolduleConfiguration[2] & 0xFFFF0000UL) == 02171 APCI1710_INCREMENTAL_COUNTER 02172 || (devpriv->s_BoardInfos. 02173 dw_MolduleConfiguration[3] & 0xFFFF0000UL) == 02174 APCI1710_INCREMENTAL_COUNTER) { 02175 for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) { 02176 /*******************************/ 02177 /* Test if incremental counter */ 02178 /*******************************/ 02179 02180 if ((devpriv->s_BoardInfos. 02181 dw_MolduleConfiguration[b_ModulCpt] & 02182 0xFFFF0000UL) == 02183 APCI1710_INCREMENTAL_COUNTER) { 02184 /*********************/ 02185 /* Clear the counter */ 02186 /*********************/ 02187 02188 outl(1, devpriv->s_BoardInfos. 02189 ui_Address + 16 + (64 * b_ModulCpt)); 02190 } 02191 } 02192 } else { 02193 /***************************/ 02194 /* No counter module found */ 02195 /***************************/ 02196 02197 DPRINTK("No counter module found\n"); 02198 i_ReturnValue = -2; 02199 } 02200 02201 return (i_ReturnValue); 02202 } 02203 02204 /* 02205 +----------------------------------------------------------------------------+ 02206 | Function Name : _INT_ i_APCI1710_SetInputFilter | 02207 | (BYTE_ b_BoardHandle, | 02208 | BYTE_ b_Module, | 02209 | BYTE_ b_PCIInputClock, | 02210 | BYTE_ b_Filter) | 02211 +----------------------------------------------------------------------------+ 02212 | Task : Disable or enable the software filter from selected | 02213 | module (b_ModulNbr). b_Filter determine the filter time| 02214 +----------------------------------------------------------------------------+ 02215 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 02216 | BYTE_ b_ModulNbr : Number of the module to be | 02217 | configured (0 to 3) | 02218 | BYTE_ b_PCIInputClock : Selection of the PCI bus | 02219 | clock | 02220 | - APCI1710_30MHZ : | 02221 | The PC has a PCI bus clock | 02222 | of 30 MHz | 02223 | - APCI1710_33MHZ : | 02224 | The PC has a PCI bus clock | 02225 | of 33 MHz | 02226 | - APCI1710_40MHZ : | 02227 | The APCI1710 has a 40MHz | 02228 | quartz | 02229 | BYTE_ b_Filter : Filter selection | 02230 | | 02231 | 30 MHz | 02232 | ------ | 02233 | 0: Software filter not used | 02234 | 1: Filter from 266ns (3.750000MHz) | 02235 | 2: Filter from 400ns (2.500000MHz) | 02236 | 3: Filter from 533ns (1.876170MHz) | 02237 | 4: Filter from 666ns (1.501501MHz) | 02238 | 5: Filter from 800ns (1.250000MHz) | 02239 | 6: Filter from 933ns (1.071800MHz) | 02240 | 7: Filter from 1066ns (0.938080MHz) | 02241 | 8: Filter from 1200ns (0.833333MHz) | 02242 | 9: Filter from 1333ns (0.750000MHz) | 02243 | 10: Filter from 1466ns (0.682100MHz) | 02244 | 11: Filter from 1600ns (0.625000MHz) | 02245 | 12: Filter from 1733ns (0.577777MHz) | 02246 | 13: Filter from 1866ns (0.535900MHz) | 02247 | 14: Filter from 2000ns (0.500000MHz) | 02248 | 15: Filter from 2133ns (0.468800MHz) | 02249 | | 02250 | 33 MHz | 02251 | ------ | 02252 | 0: Software filter not used | 02253 | 1: Filter from 242ns (4.125000MHz) | 02254 | 2: Filter from 363ns (2.754820MHz) | 02255 | 3: Filter from 484ns (2.066115MHz) | 02256 | 4: Filter from 605ns (1.652892MHz) | 02257 | 5: Filter from 726ns (1.357741MHz) | 02258 | 6: Filter from 847ns (1.180637MHz) | 02259 | 7: Filter from 968ns (1.033055MHz) | 02260 | 8: Filter from 1089ns (0.918273MHz) | 02261 | 9: Filter from 1210ns (0.826446MHz) | 02262 | 10: Filter from 1331ns (0.751314MHz) | 02263 | 11: Filter from 1452ns (0.688705MHz) | 02264 | 12: Filter from 1573ns (0.635727MHz) | 02265 | 13: Filter from 1694ns (0.590318MHz) | 02266 | 14: Filter from 1815ns (0.550964MHz) | 02267 | 15: Filter from 1936ns (0.516528MHz) | 02268 | | 02269 | 40 MHz | 02270 | ------ | 02271 | 0: Software filter not used | 02272 | 1: Filter from 200ns (5.000000MHz) | 02273 | 2: Filter from 300ns (3.333333MHz) | 02274 | 3: Filter from 400ns (2.500000MHz) | 02275 | 4: Filter from 500ns (2.000000MHz) | 02276 | 5: Filter from 600ns (1.666666MHz) | 02277 | 6: Filter from 700ns (1.428500MHz) | 02278 | 7: Filter from 800ns (1.250000MHz) | 02279 | 8: Filter from 900ns (1.111111MHz) | 02280 | 9: Filter from 1000ns (1.000000MHz) | 02281 | 10: Filter from 1100ns (0.909090MHz) | 02282 | 11: Filter from 1200ns (0.833333MHz) | 02283 | 12: Filter from 1300ns (0.769200MHz) | 02284 | 13: Filter from 1400ns (0.714200MHz) | 02285 | 14: Filter from 1500ns (0.666666MHz) | 02286 | 15: Filter from 1600ns (0.625000MHz) | 02287 +----------------------------------------------------------------------------+ 02288 | Output Parameters : - | 02289 +----------------------------------------------------------------------------+ 02290 | Return Value : 0: No error | 02291 | -1: The handle parameter of the board is wrong | 02292 | -2: The selected module number is wrong | 02293 | -3: The module is not a counter module | 02294 | -4: The selected PCI input clock is wrong | 02295 | -5: The selected filter value is wrong | 02296 | -6: 40MHz quartz not on board | 02297 +----------------------------------------------------------------------------+ 02298 */ 02299 02300 INT i_APCI1710_SetInputFilter(comedi_device * dev, 02301 BYTE b_ModulNbr, BYTE b_PCIInputClock, BYTE b_Filter) 02302 { 02303 INT i_ReturnValue = 0; 02304 DWORD dw_Status = 0; 02305 02306 /**************************/ 02307 /* Test the module number */ 02308 /**************************/ 02309 02310 if (b_ModulNbr < 4) { 02311 /*******************************/ 02312 /* Test if incremental counter */ 02313 /*******************************/ 02314 02315 if ((devpriv->s_BoardInfos. 02316 dw_MolduleConfiguration[b_ModulNbr] & 02317 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) { 02318 /******************************/ 02319 /* Test if firmware >= Rev1.5 */ 02320 /******************************/ 02321 02322 if ((devpriv->s_BoardInfos. 02323 dw_MolduleConfiguration[b_ModulNbr] & 02324 0xFFFF) >= 0x3135) { 02325 /**************************/ 02326 /* Test the PCI bus clock */ 02327 /**************************/ 02328 02329 if ((b_PCIInputClock == APCI1710_30MHZ) || 02330 (b_PCIInputClock == APCI1710_33MHZ) || 02331 (b_PCIInputClock == APCI1710_40MHZ)) { 02332 /*************************/ 02333 /* Test the filter value */ 02334 /*************************/ 02335 02336 if (b_Filter < 16) { 02337 /**********************/ 02338 /* Test if 40MHz used */ 02339 /**********************/ 02340 02341 if (b_PCIInputClock == 02342 APCI1710_40MHZ) { 02343 /*********************************/ 02344 /* Test if 40MHz quartz on board */ 02345 /*********************************/ 02346 02347 dw_Status = 02348 inl(devpriv-> 02349 s_BoardInfos. 02350 ui_Address + 02351 36 + 02352 (64 * b_ModulNbr)); 02353 02354 /******************************/ 02355 /* Test the quartz flag (DQ0) */ 02356 /******************************/ 02357 02358 if ((dw_Status & 1) != 02359 1) { 02360 /*****************************/ 02361 /* 40MHz quartz not on board */ 02362 /*****************************/ 02363 02364 DPRINTK("40MHz quartz not on board\n"); 02365 i_ReturnValue = 02366 -6; 02367 } 02368 } // if (b_PCIInputClock == APCI1710_40MHZ) 02369 02370 /***************************/ 02371 /* Test if error not occur */ 02372 /***************************/ 02373 02374 if (i_ReturnValue == 0) { 02375 /**********************/ 02376 /* Test if 40MHz used */ 02377 /**********************/ 02378 02379 if (b_PCIInputClock == 02380 APCI1710_40MHZ) 02381 { 02382 /*********************************/ 02383 /* Enable the 40MHz quarz (DQ31) */ 02384 /*********************************/ 02385 02386 devpriv-> 02387 s_ModuleInfo 02388 [b_ModulNbr]. 02389 s_SiemensCounterInfo. 02390 s_ModeRegister. 02391 s_ByteModeRegister. 02392 b_ModeRegister4 02393 = 02394 devpriv-> 02395 s_ModuleInfo 02396 [b_ModulNbr]. 02397 s_SiemensCounterInfo. 02398 s_ModeRegister. 02399 s_ByteModeRegister. 02400 b_ModeRegister4 02401 | 02402 APCI1710_ENABLE_40MHZ_FILTER; 02403 02404 } // if (b_PCIInputClock == APCI1710_40MHZ) 02405 else { 02406 /**********************************/ 02407 /* Disable the 40MHz quarz (DQ31) */ 02408 /**********************************/ 02409 02410 devpriv-> 02411 s_ModuleInfo 02412 [b_ModulNbr]. 02413 s_SiemensCounterInfo. 02414 s_ModeRegister. 02415 s_ByteModeRegister. 02416 b_ModeRegister4 02417 = 02418 devpriv-> 02419 s_ModuleInfo 02420 [b_ModulNbr]. 02421 s_SiemensCounterInfo. 02422 s_ModeRegister. 02423 s_ByteModeRegister. 02424 b_ModeRegister4 02425 & 02426 APCI1710_DISABLE_40MHZ_FILTER; 02427 02428 } // if (b_PCIInputClock == APCI1710_40MHZ) 02429 02430 /************************/ 02431 /* Set the filter value */ 02432 /************************/ 02433 02434 devpriv-> 02435 s_ModuleInfo 02436 [b_ModulNbr]. 02437 s_SiemensCounterInfo. 02438 s_ModeRegister. 02439 s_ByteModeRegister. 02440 b_ModeRegister3 02441 = 02442 (devpriv-> 02443 s_ModuleInfo 02444 [b_ModulNbr]. 02445 s_SiemensCounterInfo. 02446 s_ModeRegister. 02447 s_ByteModeRegister. 02448 b_ModeRegister3 02449 & 0x1F) | 02450 ((b_Filter & 02451 0x7) << 02452 5); 02453 02454 devpriv-> 02455 s_ModuleInfo 02456 [b_ModulNbr]. 02457 s_SiemensCounterInfo. 02458 s_ModeRegister. 02459 s_ByteModeRegister. 02460 b_ModeRegister4 02461 = 02462 (devpriv-> 02463 s_ModuleInfo 02464 [b_ModulNbr]. 02465 s_SiemensCounterInfo. 02466 s_ModeRegister. 02467 s_ByteModeRegister. 02468 b_ModeRegister4 02469 & 0xFE) | 02470 ((b_Filter & 02471 0x8) >> 02472 3); 02473 02474 /***************************/ 02475 /* Write the configuration */ 02476 /***************************/ 02477 02478 outl(devpriv-> 02479 s_ModuleInfo 02480 [b_ModulNbr]. 02481 s_SiemensCounterInfo. 02482 s_ModeRegister. 02483 dw_ModeRegister1_2_3_4, 02484 devpriv-> 02485 s_BoardInfos. 02486 ui_Address + 02487 20 + 02488 (64 * b_ModulNbr)); 02489 } // if (i_ReturnValue == 0) 02490 } // if (b_Filter < 16) 02491 else { 02492 /**************************************/ 02493 /* The selected filter value is wrong */ 02494 /**************************************/ 02495 02496 DPRINTK("The selected filter value is wrong\n"); 02497 i_ReturnValue = -5; 02498 } // if (b_Filter < 16) 02499 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) 02500 else { 02501 /*****************************************/ 02502 /* The selected PCI input clock is wrong */ 02503 /*****************************************/ 02504 02505 DPRINTK("The selected PCI input clock is wrong\n"); 02506 i_ReturnValue = 4; 02507 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) 02508 } else { 02509 /**************************************/ 02510 /* The module is not a counter module */ 02511 /**************************************/ 02512 02513 DPRINTK("The module is not a counter module\n"); 02514 i_ReturnValue = -3; 02515 } 02516 } else { 02517 /**************************************/ 02518 /* The module is not a counter module */ 02519 /**************************************/ 02520 02521 DPRINTK("The module is not a counter module\n"); 02522 i_ReturnValue = -3; 02523 } 02524 } else { 02525 /*************************************************/ 02526 /* The selected module number parameter is wrong */ 02527 /*************************************************/ 02528 02529 DPRINTK("The selected module number parameter is wrong\n"); 02530 i_ReturnValue = -2; 02531 } 02532 02533 return (i_ReturnValue); 02534 } 02535 02536 /* 02537 +----------------------------------------------------------------------------+ 02538 | Function Name : _INT_ i_APCI1710_LatchCounter (BYTE_ b_BoardHandle, | 02539 | BYTE_ b_ModulNbr, | 02540 | BYTE_ b_LatchReg) | 02541 +----------------------------------------------------------------------------+ 02542 | Task : Latch the courant value from selected module | 02543 | (b_ModulNbr) in to the selected latch register | 02544 | (b_LatchReg). | 02545 +----------------------------------------------------------------------------+ 02546 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 02547 | BYTE_ b_ModulNbr : Module number to configure | 02548 | (0 to 3) | 02549 | BYTE_ b_LatchReg : Selected latch register | 02550 | 0 : for the first latch register | 02551 | 1 : for the second latch register | 02552 +----------------------------------------------------------------------------+ 02553 | Output Parameters : - | 02554 +----------------------------------------------------------------------------+ 02555 | Return Value : 0: No error | 02556 | -1: The handle parameter of the board is wrong | 02557 | -2: No counter module found | 02558 | -3: Counter not initialised see function | 02559 | "i_APCI1710_InitCounter" | 02560 | -4: The selected latch register parameter is wrong | 02561 +----------------------------------------------------------------------------+ 02562 */ 02563 02564 INT i_APCI1710_LatchCounter(comedi_device * dev, 02565 BYTE b_ModulNbr, BYTE b_LatchReg) 02566 { 02567 INT i_ReturnValue = 0; 02568 02569 /**************************/ 02570 /* Test the module number */ 02571 /**************************/ 02572 02573 if (b_ModulNbr < 4) { 02574 /*******************************/ 02575 /* Test if counter initialised */ 02576 /*******************************/ 02577 02578 if (devpriv-> 02579 s_ModuleInfo[b_ModulNbr]. 02580 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 02581 /*************************************/ 02582 /* Test the latch register parameter */ 02583 /*************************************/ 02584 02585 if (b_LatchReg < 2) { 02586 /*********************/ 02587 /* Tatch the counter */ 02588 /*********************/ 02589 02590 outl(1 << (b_LatchReg * 4), 02591 devpriv->s_BoardInfos.ui_Address + 02592 (64 * b_ModulNbr)); 02593 } else { 02594 /**************************************************/ 02595 /* The selected latch register parameter is wrong */ 02596 /**************************************************/ 02597 02598 DPRINTK("The selected latch register parameter is wrong\n"); 02599 i_ReturnValue = -4; 02600 } 02601 } else { 02602 /****************************************/ 02603 /* Counter not initialised see function */ 02604 /* "i_APCI1710_InitCounter" */ 02605 /****************************************/ 02606 02607 DPRINTK("Counter not initialised\n"); 02608 i_ReturnValue = -3; 02609 } 02610 } else { 02611 /*************************************************/ 02612 /* The selected module number parameter is wrong */ 02613 /*************************************************/ 02614 02615 DPRINTK("The selected module number parameter is wrong\n"); 02616 i_ReturnValue = -2; 02617 } 02618 02619 return (i_ReturnValue); 02620 } 02621 02622 /* 02623 +----------------------------------------------------------------------------+ 02624 | Function Name : _INT_ i_APCI1710_SetIndexAndReferenceSource | 02625 | (BYTE_ b_BoardHandle, | 02626 | BYTE_ b_ModulNbr, | 02627 | BYTE_ b_SourceSelection) | 02628 +----------------------------------------------------------------------------+ 02629 | Task : Determine the hardware source for the index and the | 02630 | reference logic. Per default the index logic is | 02631 | connected to the difference input C and the reference | 02632 | logic is connected to the 24V input E | 02633 +----------------------------------------------------------------------------+ 02634 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 02635 | BYTE_ b_ModulNbr : Module number to configure | 02636 | (0 to 3) | 02637 | BYTE_ b_SourceSelection : APCI1710_SOURCE_0 : | 02638 | The index logic is connected | 02639 | to the difference input C and| 02640 | the reference logic is | 02641 | connected to the 24V input E.| 02642 | This is the default | 02643 | configuration. | 02644 | APCI1710_SOURCE_1 : | 02645 | The reference logic is | 02646 | connected to the difference | 02647 | input C and the index logic | 02648 | is connected to the 24V | 02649 | input E | 02650 +----------------------------------------------------------------------------+ 02651 | Output Parameters : - | 02652 +----------------------------------------------------------------------------+ 02653 | Return Value : 0: No error | 02654 | -1: The handle parameter of the board is wrong | 02655 | -2: The selected module number is wrong | 02656 | -3: The module is not a counter module. | 02657 | -4: The source selection is wrong | 02658 +----------------------------------------------------------------------------+ 02659 */ 02660 02661 INT i_APCI1710_SetIndexAndReferenceSource(comedi_device * dev, 02662 BYTE b_ModulNbr, BYTE b_SourceSelection) 02663 { 02664 INT i_ReturnValue = 0; 02665 02666 /**************************/ 02667 /* Test the module number */ 02668 /**************************/ 02669 02670 if (b_ModulNbr < 4) { 02671 /*******************************/ 02672 /* Test if incremental counter */ 02673 /*******************************/ 02674 02675 if ((devpriv->s_BoardInfos. 02676 dw_MolduleConfiguration[b_ModulNbr] & 02677 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) { 02678 /******************************/ 02679 /* Test if firmware >= Rev1.5 */ 02680 /******************************/ 02681 02682 if ((devpriv->s_BoardInfos. 02683 dw_MolduleConfiguration[b_ModulNbr] & 02684 0xFFFF) >= 0x3135) { 02685 /*****************************/ 02686 /* Test the source selection */ 02687 /*****************************/ 02688 02689 if (b_SourceSelection == APCI1710_SOURCE_0 || 02690 b_SourceSelection == APCI1710_SOURCE_1) 02691 { 02692 /******************************************/ 02693 /* Test if invert the index and reference */ 02694 /******************************************/ 02695 02696 if (b_SourceSelection == 02697 APCI1710_SOURCE_1) { 02698 /********************************************/ 02699 /* Invert index and reference source (DQ25) */ 02700 /********************************************/ 02701 02702 devpriv-> 02703 s_ModuleInfo 02704 [b_ModulNbr]. 02705 s_SiemensCounterInfo. 02706 s_ModeRegister. 02707 s_ByteModeRegister. 02708 b_ModeRegister4 = 02709 devpriv-> 02710 s_ModuleInfo 02711 [b_ModulNbr]. 02712 s_SiemensCounterInfo. 02713 s_ModeRegister. 02714 s_ByteModeRegister. 02715 b_ModeRegister4 | 02716 APCI1710_INVERT_INDEX_RFERENCE; 02717 } else { 02718 /****************************************/ 02719 /* Set the default configuration (DQ25) */ 02720 /****************************************/ 02721 02722 devpriv-> 02723 s_ModuleInfo 02724 [b_ModulNbr]. 02725 s_SiemensCounterInfo. 02726 s_ModeRegister. 02727 s_ByteModeRegister. 02728 b_ModeRegister4 = 02729 devpriv-> 02730 s_ModuleInfo 02731 [b_ModulNbr]. 02732 s_SiemensCounterInfo. 02733 s_ModeRegister. 02734 s_ByteModeRegister. 02735 b_ModeRegister4 & 02736 APCI1710_DEFAULT_INDEX_RFERENCE; 02737 } 02738 } // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) 02739 else { 02740 /*********************************/ 02741 /* The source selection is wrong */ 02742 /*********************************/ 02743 02744 DPRINTK("The source selection is wrong\n"); 02745 i_ReturnValue = -4; 02746 } // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) 02747 } else { 02748 /**************************************/ 02749 /* The module is not a counter module */ 02750 /**************************************/ 02751 02752 DPRINTK("The module is not a counter module\n"); 02753 i_ReturnValue = -3; 02754 } 02755 } else { 02756 /**************************************/ 02757 /* The module is not a counter module */ 02758 /**************************************/ 02759 02760 DPRINTK("The module is not a counter module\n"); 02761 i_ReturnValue = -3; 02762 } 02763 } else { 02764 /***************************************/ 02765 /* The selected module number is wrong */ 02766 /***************************************/ 02767 02768 DPRINTK("The selected module number is wrong\n"); 02769 i_ReturnValue = -2; 02770 } 02771 02772 return (i_ReturnValue); 02773 } 02774 02775 /* 02776 +----------------------------------------------------------------------------+ 02777 | Function Name : _INT_ i_APCI1710_SetDigitalChlOn | 02778 | (BYTE_ b_BoardHandle, | 02779 | BYTE_ b_ModulNbr) | 02780 +----------------------------------------------------------------------------+ 02781 | Task : Sets the digital output H Setting an output means | 02782 | setting an ouput high. | 02783 +----------------------------------------------------------------------------+ 02784 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 02785 | BYTE_ b_ModulNbr : Number of the module to be | 02786 | configured (0 to 3) | 02787 +----------------------------------------------------------------------------+ 02788 | Output Parameters : - | 02789 +----------------------------------------------------------------------------+ 02790 | Return Value : 0: No error | 02791 | -1: The handle parameter of the board is wrong | 02792 | -2: The selected module number is wrong | 02793 | -3: Counter not initialised see function | 02794 | "i_APCI1710_InitCounter" | 02795 +----------------------------------------------------------------------------+ 02796 */ 02797 02798 INT i_APCI1710_SetDigitalChlOn(comedi_device * dev, BYTE b_ModulNbr) 02799 { 02800 INT i_ReturnValue = 0; 02801 02802 /**************************/ 02803 /* Test the module number */ 02804 /**************************/ 02805 02806 if (b_ModulNbr < 4) { 02807 /*******************************/ 02808 /* Test if counter initialised */ 02809 /*******************************/ 02810 02811 if (devpriv-> 02812 s_ModuleInfo[b_ModulNbr]. 02813 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 02814 devpriv-> 02815 s_ModuleInfo[b_ModulNbr]. 02816 s_SiemensCounterInfo. 02817 s_ModeRegister. 02818 s_ByteModeRegister. 02819 b_ModeRegister3 = devpriv-> 02820 s_ModuleInfo[b_ModulNbr]. 02821 s_SiemensCounterInfo. 02822 s_ModeRegister. 02823 s_ByteModeRegister.b_ModeRegister3 | 0x10; 02824 02825 /*********************/ 02826 /* Set the output On */ 02827 /*********************/ 02828 02829 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 02830 s_SiemensCounterInfo. 02831 s_ModeRegister. 02832 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos. 02833 ui_Address + 20 + (64 * b_ModulNbr)); 02834 } else { 02835 /****************************************/ 02836 /* Counter not initialised see function */ 02837 /* "i_APCI1710_InitCounter" */ 02838 /****************************************/ 02839 02840 DPRINTK("Counter not initialised\n"); 02841 i_ReturnValue = -3; 02842 } 02843 } else { 02844 /*************************************************/ 02845 /* The selected module number parameter is wrong */ 02846 /*************************************************/ 02847 02848 DPRINTK("The selected module number parameter is wrong\n"); 02849 i_ReturnValue = -2; 02850 } 02851 02852 return (i_ReturnValue); 02853 } 02854 02855 /* 02856 +----------------------------------------------------------------------------+ 02857 | Function Name : _INT_ i_APCI1710_SetDigitalChlOff | 02858 | (BYTE_ b_BoardHandle, | 02859 | BYTE_ b_ModulNbr) | 02860 +----------------------------------------------------------------------------+ 02861 | Task : Resets the digital output H. Resetting an output means | 02862 | setting an ouput low. | 02863 +----------------------------------------------------------------------------+ 02864 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 02865 | BYTE_ b_ModulNbr : Number of the module to be | 02866 | configured (0 to 3) | 02867 +----------------------------------------------------------------------------+ 02868 | Output Parameters : - | 02869 +----------------------------------------------------------------------------+ 02870 | Return Value : 0: No error | 02871 | -1: The handle parameter of the board is wrong | 02872 | -2: The selected module number is wrong | 02873 | -3: Counter not initialised see function | 02874 | "i_APCI1710_InitCounter" | 02875 +----------------------------------------------------------------------------+ 02876 */ 02877 02878 INT i_APCI1710_SetDigitalChlOff(comedi_device * dev, BYTE b_ModulNbr) 02879 { 02880 INT i_ReturnValue = 0; 02881 02882 /**************************/ 02883 /* Test the module number */ 02884 /**************************/ 02885 02886 if (b_ModulNbr < 4) { 02887 /*******************************/ 02888 /* Test if counter initialised */ 02889 /*******************************/ 02890 02891 if (devpriv-> 02892 s_ModuleInfo[b_ModulNbr]. 02893 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 02894 devpriv-> 02895 s_ModuleInfo[b_ModulNbr]. 02896 s_SiemensCounterInfo. 02897 s_ModeRegister. 02898 s_ByteModeRegister. 02899 b_ModeRegister3 = devpriv-> 02900 s_ModuleInfo[b_ModulNbr]. 02901 s_SiemensCounterInfo. 02902 s_ModeRegister. 02903 s_ByteModeRegister.b_ModeRegister3 & 0xEF; 02904 02905 /**********************/ 02906 /* Set the output Off */ 02907 /**********************/ 02908 02909 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 02910 s_SiemensCounterInfo. 02911 s_ModeRegister. 02912 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos. 02913 ui_Address + 20 + (64 * b_ModulNbr)); 02914 } else { 02915 /****************************************/ 02916 /* Counter not initialised see function */ 02917 /* "i_APCI1710_InitCounter" */ 02918 /****************************************/ 02919 02920 DPRINTK("Counter not initialised\n"); 02921 i_ReturnValue = -3; 02922 } 02923 } else { 02924 /*************************************************/ 02925 /* The selected module number parameter is wrong */ 02926 /*************************************************/ 02927 02928 DPRINTK("The selected module number parameter is wrong\n"); 02929 i_ReturnValue = -2; 02930 } 02931 02932 return (i_ReturnValue); 02933 } 02934 02935 /*########################################################################### */ 02936 02937 // INSN WRITE 02938 /*########################################################################### */ 02939 02940 /* 02941 +----------------------------------------------------------------------------+ 02942 | Function Name :INT i_APCI1710_InsnWriteINCCPT(comedi_device *dev,comedi_subdevice *s, 02943 comedi_insn *insn,lsampl_t *data) | 02944 +----------------------------------------------------------------------------+ 02945 | Task : Enable Disable functions for INC_CPT | 02946 +----------------------------------------------------------------------------+ 02947 | Input Parameters : 02948 +----------------------------------------------------------------------------+ 02949 | Output Parameters : - | 02950 +----------------------------------------------------------------------------+ 02951 | Return Value : 02952 +----------------------------------------------------------------------------+ 02953 */ 02954 INT i_APCI1710_InsnWriteINCCPT(comedi_device * dev, comedi_subdevice * s, 02955 comedi_insn * insn, lsampl_t * data) 02956 { 02957 UINT ui_WriteType; 02958 INT i_ReturnValue = 0; 02959 02960 ui_WriteType = CR_CHAN(insn->chanspec); 02961 devpriv->tsk_Current = current; // Save the current process task structure 02962 02963 switch (ui_WriteType) { 02964 case APCI1710_INCCPT_ENABLELATCHINTERRUPT: 02965 i_ReturnValue = i_APCI1710_EnableLatchInterrupt(dev, 02966 (BYTE) CR_AREF(insn->chanspec)); 02967 break; 02968 02969 case APCI1710_INCCPT_DISABLELATCHINTERRUPT: 02970 i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev, 02971 (BYTE) CR_AREF(insn->chanspec)); 02972 break; 02973 02974 case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE: 02975 i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev, 02976 (BYTE) CR_AREF(insn->chanspec), 02977 (BYTE) data[0], (UINT) data[1]); 02978 break; 02979 02980 case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE: 02981 i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev, 02982 (BYTE) CR_AREF(insn->chanspec), (ULONG) data[0]); 02983 02984 break; 02985 02986 case APCI1710_INCCPT_ENABLEINDEX: 02987 i_APCI1710_EnableIndex(dev, (BYTE) CR_AREF(insn->chanspec)); 02988 break; 02989 02990 case APCI1710_INCCPT_DISABLEINDEX: 02991 i_ReturnValue = i_APCI1710_DisableIndex(dev, 02992 (BYTE) CR_AREF(insn->chanspec)); 02993 break; 02994 02995 case APCI1710_INCCPT_ENABLECOMPARELOGIC: 02996 i_ReturnValue = i_APCI1710_EnableCompareLogic(dev, 02997 (BYTE) CR_AREF(insn->chanspec)); 02998 break; 02999 03000 case APCI1710_INCCPT_DISABLECOMPARELOGIC: 03001 i_ReturnValue = i_APCI1710_DisableCompareLogic(dev, 03002 (BYTE) CR_AREF(insn->chanspec)); 03003 break; 03004 03005 case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT: 03006 i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev, 03007 (BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]); 03008 break; 03009 03010 case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT: 03011 i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev, 03012 (BYTE) CR_AREF(insn->chanspec)); 03013 break; 03014 03015 default: 03016 printk("Write Config Parameter Wrong\n"); 03017 } 03018 03019 if (i_ReturnValue >= 0) 03020 i_ReturnValue = insn->n; 03021 return (i_ReturnValue); 03022 } 03023 03024 /* 03025 +----------------------------------------------------------------------------+ 03026 | Function Name : _INT_ i_APCI1710_EnableLatchInterrupt | 03027 | (BYTE_ b_BoardHandle, | 03028 | BYTE_ b_ModulNbr) | 03029 +----------------------------------------------------------------------------+ 03030 | Task : Enable the latch interrupt from selected module | 03031 | (b_ModulNbr). Each software or hardware latch occur a | 03032 | interrupt. | 03033 +----------------------------------------------------------------------------+ 03034 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03035 | BYTE_ b_ModulNbr : Module number to configure | 03036 | (0 to 3) | 03037 +----------------------------------------------------------------------------+ 03038 | Output Parameters : - | 03039 +----------------------------------------------------------------------------+ 03040 | Return Value : 0: No error | 03041 | -1: The handle parameter of the board is wrong | 03042 | -2: No counter module found | 03043 | -3: Counter not initialised see function | 03044 | "i_APCI1710_InitCounter" | 03045 | -4: Interrupt routine not installed see function | 03046 | "i_APCI1710_SetBoardIntRoutine" | 03047 +----------------------------------------------------------------------------+ 03048 */ 03049 03050 INT i_APCI1710_EnableLatchInterrupt(comedi_device * dev, BYTE b_ModulNbr) 03051 { 03052 INT i_ReturnValue = 0; 03053 03054 /**************************/ 03055 /* Test the module number */ 03056 /**************************/ 03057 03058 if (b_ModulNbr < 4) { 03059 /*******************************/ 03060 /* Test if counter initialised */ 03061 /*******************************/ 03062 03063 if (devpriv->s_ModuleInfo[b_ModulNbr]. 03064 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03065 03066 /********************/ 03067 /* Enable interrupt */ 03068 /********************/ 03069 03070 devpriv->s_ModuleInfo[b_ModulNbr]. 03071 s_SiemensCounterInfo. 03072 s_ModeRegister. 03073 s_ByteModeRegister. 03074 b_ModeRegister2 = devpriv-> 03075 s_ModuleInfo[b_ModulNbr]. 03076 s_SiemensCounterInfo. 03077 s_ModeRegister. 03078 s_ByteModeRegister. 03079 b_ModeRegister2 | APCI1710_ENABLE_LATCH_INT; 03080 03081 /***************************/ 03082 /* Write the configuration */ 03083 /***************************/ 03084 03085 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03086 s_SiemensCounterInfo. 03087 s_ModeRegister. 03088 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos. 03089 ui_Address + 20 + (64 * b_ModulNbr)); 03090 } else { 03091 /****************************************/ 03092 /* Counter not initialised see function */ 03093 /* "i_APCI1710_InitCounter" */ 03094 /****************************************/ 03095 03096 DPRINTK("Counter not initialised\n"); 03097 i_ReturnValue = -3; 03098 } 03099 } else { 03100 /*************************************************/ 03101 /* The selected module number parameter is wrong */ 03102 /*************************************************/ 03103 03104 DPRINTK("The selected module number parameter is wrong\n"); 03105 i_ReturnValue = -2; 03106 } 03107 03108 return (i_ReturnValue); 03109 } 03110 03111 /* 03112 +----------------------------------------------------------------------------+ 03113 | Function Name : _INT_ i_APCI1710_DisableLatchInterrupt | 03114 | (BYTE_ b_BoardHandle, | 03115 | BYTE_ b_ModulNbr) | 03116 +----------------------------------------------------------------------------+ 03117 | Task : Disable the latch interrupt from selected module | 03118 | (b_ModulNbr). | 03119 +----------------------------------------------------------------------------+ 03120 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03121 | BYTE_ b_ModulNbr : Module number to configure | 03122 | (0 to 3) | 03123 +----------------------------------------------------------------------------+ 03124 | Output Parameters : - | 03125 +----------------------------------------------------------------------------+ 03126 | Return Value : 0: No error | 03127 | -1: The handle parameter of the board is wrong | 03128 | -2: No counter module found | 03129 | -3: Counter not initialised see function | 03130 | "i_APCI1710_InitCounter" | 03131 | -4: Interrupt routine not installed see function | 03132 | "i_APCI1710_SetBoardIntRoutine" | 03133 +----------------------------------------------------------------------------+ 03134 */ 03135 03136 INT i_APCI1710_DisableLatchInterrupt(comedi_device * dev, BYTE b_ModulNbr) 03137 { 03138 INT i_ReturnValue = 0; 03139 03140 /**************************/ 03141 /* Test the module number */ 03142 /**************************/ 03143 03144 if (b_ModulNbr < 4) { 03145 /*******************************/ 03146 /* Test if counter initialised */ 03147 /*******************************/ 03148 03149 if (devpriv-> 03150 s_ModuleInfo[b_ModulNbr]. 03151 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03152 03153 /***************************/ 03154 /* Write the configuration */ 03155 /***************************/ 03156 03157 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03158 s_SiemensCounterInfo. 03159 s_ModeRegister. 03160 dw_ModeRegister1_2_3_4 & 03161 ((APCI1710_DISABLE_LATCH_INT << 8) | 0xFF), 03162 devpriv->s_BoardInfos.ui_Address + 20 + 03163 (64 * b_ModulNbr)); 03164 03165 mdelay(1000); 03166 03167 /*********************/ 03168 /* Disable interrupt */ 03169 /*********************/ 03170 03171 devpriv-> 03172 s_ModuleInfo[b_ModulNbr]. 03173 s_SiemensCounterInfo. 03174 s_ModeRegister. 03175 s_ByteModeRegister. 03176 b_ModeRegister2 = devpriv-> 03177 s_ModuleInfo[b_ModulNbr]. 03178 s_SiemensCounterInfo. 03179 s_ModeRegister. 03180 s_ByteModeRegister. 03181 b_ModeRegister2 & APCI1710_DISABLE_LATCH_INT; 03182 03183 } else { 03184 /****************************************/ 03185 /* Counter not initialised see function */ 03186 /* "i_APCI1710_InitCounter" */ 03187 /****************************************/ 03188 03189 DPRINTK("Counter not initialised\n"); 03190 i_ReturnValue = -3; 03191 } 03192 } else { 03193 /*************************************************/ 03194 /* The selected module number parameter is wrong */ 03195 /*************************************************/ 03196 03197 DPRINTK("The selected module number parameter is wrong\n"); 03198 i_ReturnValue = -2; 03199 } 03200 03201 return (i_ReturnValue); 03202 } 03203 03204 /* 03205 +----------------------------------------------------------------------------+ 03206 | Function Name : _INT_ i_APCI1710_Write16BitCounterValue | 03207 | (BYTE_ b_BoardHandle | 03208 | BYTE_ b_ModulNbr, | 03209 | BYTE_ b_SelectedCounter, | 03210 | UINT_ ui_WriteValue) | 03211 +----------------------------------------------------------------------------+ 03212 | Task : Write a 16-Bit value (ui_WriteValue) in to the selected| 03213 | 16-Bit counter (b_SelectedCounter) from selected module| 03214 | (b_ModulNbr). | 03215 +----------------------------------------------------------------------------+ 03216 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03217 | BYTE_ b_ModulNbr : Module number to configure | 03218 | (0 to 3) | 03219 | BYTE_ b_SelectedCounter : Selected 16-Bit counter | 03220 | (0 or 1) | 03221 | UINT_ ui_WriteValue : 16-Bit write value | 03222 +----------------------------------------------------------------------------+ 03223 | Output Parameters : - | 03224 +----------------------------------------------------------------------------+ 03225 | Return Value : 0: No error | 03226 | -1: The handle parameter of the board is wrong | 03227 | -2: No counter module found | 03228 | -3: Counter not initialised see function | 03229 | "i_APCI1710_InitCounter" | 03230 | -4: The selected 16-Bit counter parameter is wrong | 03231 +----------------------------------------------------------------------------+ 03232 */ 03233 03234 INT i_APCI1710_Write16BitCounterValue(comedi_device * dev, 03235 BYTE b_ModulNbr, BYTE b_SelectedCounter, UINT ui_WriteValue) 03236 { 03237 INT i_ReturnValue = 0; 03238 03239 /**************************/ 03240 /* Test the module number */ 03241 /**************************/ 03242 03243 if (b_ModulNbr < 4) { 03244 /*******************************/ 03245 /* Test if counter initialised */ 03246 /*******************************/ 03247 03248 if (devpriv-> 03249 s_ModuleInfo[b_ModulNbr]. 03250 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03251 /******************************/ 03252 /* Test the counter selection */ 03253 /******************************/ 03254 03255 if (b_SelectedCounter < 2) { 03256 /*******************/ 03257 /* Write the value */ 03258 /*******************/ 03259 03260 outl((ULONG) ((ULONG) (ui_WriteValue) << (16 * 03261 b_SelectedCounter)), 03262 devpriv->s_BoardInfos.ui_Address + 8 + 03263 (b_SelectedCounter * 4) + 03264 (64 * b_ModulNbr)); 03265 } else { 03266 /**************************************************/ 03267 /* The selected 16-Bit counter parameter is wrong */ 03268 /**************************************************/ 03269 03270 DPRINTK("The selected 16-Bit counter parameter is wrong\n"); 03271 i_ReturnValue = -4; 03272 } 03273 } else { 03274 /****************************************/ 03275 /* Counter not initialised see function */ 03276 /* "i_APCI1710_InitCounter" */ 03277 /****************************************/ 03278 03279 DPRINTK("Counter not initialised\n"); 03280 i_ReturnValue = -3; 03281 } 03282 } else { 03283 /*************************************************/ 03284 /* The selected module number parameter is wrong */ 03285 /*************************************************/ 03286 03287 DPRINTK("The selected module number parameter is wrong\n"); 03288 i_ReturnValue = -2; 03289 } 03290 03291 return (i_ReturnValue); 03292 } 03293 03294 /* 03295 +----------------------------------------------------------------------------+ 03296 | Function Name : _INT_ i_APCI1710_Write32BitCounterValue | 03297 | (BYTE_ b_BoardHandle | 03298 | BYTE_ b_ModulNbr, | 03299 | ULONG_ ul_WriteValue) | 03300 +----------------------------------------------------------------------------+ 03301 | Task : Write a 32-Bit value (ui_WriteValue) in to the selected| 03302 | module (b_ModulNbr). | 03303 +----------------------------------------------------------------------------+ 03304 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03305 | BYTE_ b_ModulNbr : Module number to configure | 03306 | (0 to 3) | 03307 | ULONG_ ul_WriteValue : 32-Bit write value | 03308 +----------------------------------------------------------------------------+ 03309 | Output Parameters : - | 03310 +----------------------------------------------------------------------------+ 03311 | Return Value : 0: No error | 03312 | -1: The handle parameter of the board is wrong | 03313 | -2: No counter module found | 03314 | -3: Counter not initialised see function | 03315 | "i_APCI1710_InitCounter" | 03316 +----------------------------------------------------------------------------+ 03317 */ 03318 03319 INT i_APCI1710_Write32BitCounterValue(comedi_device * dev, 03320 BYTE b_ModulNbr, ULONG ul_WriteValue) 03321 { 03322 INT i_ReturnValue = 0; 03323 03324 /**************************/ 03325 /* Test the module number */ 03326 /**************************/ 03327 03328 if (b_ModulNbr < 4) { 03329 /*******************************/ 03330 /* Test if counter initialised */ 03331 /*******************************/ 03332 03333 if (devpriv-> 03334 s_ModuleInfo[b_ModulNbr]. 03335 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03336 /*******************/ 03337 /* Write the value */ 03338 /*******************/ 03339 03340 outl(ul_WriteValue, devpriv->s_BoardInfos. 03341 ui_Address + 4 + (64 * b_ModulNbr)); 03342 } else { 03343 /****************************************/ 03344 /* Counter not initialised see function */ 03345 /* "i_APCI1710_InitCounter" */ 03346 /****************************************/ 03347 03348 DPRINTK("Counter not initialised\n"); 03349 i_ReturnValue = -3; 03350 } 03351 } else { 03352 /*************************************************/ 03353 /* The selected module number parameter is wrong */ 03354 /*************************************************/ 03355 03356 DPRINTK("The selected module number parameter is wrong\n"); 03357 i_ReturnValue = -2; 03358 } 03359 03360 return (i_ReturnValue); 03361 } 03362 03363 /* 03364 +----------------------------------------------------------------------------+ 03365 | Function Name : _INT_ i_APCI1710_EnableIndex (BYTE_ b_BoardHandle, | 03366 | BYTE_ b_ModulNbr) | 03367 +----------------------------------------------------------------------------+ 03368 | Task : Enable the INDEX actions | 03369 +----------------------------------------------------------------------------+ 03370 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03371 | BYTE_ b_ModulNbr : Module number to configure | 03372 | (0 to 3) | 03373 +----------------------------------------------------------------------------+ 03374 | Output Parameters : - | 03375 +----------------------------------------------------------------------------+ 03376 | Return Value : 0: No error | 03377 | -1: The handle parameter of the board is wrong | 03378 | -2: No counter module found | 03379 | -3: Counter not initialised see function | 03380 | "i_APCI1710_InitCounter" | 03381 | -4: Index not initialised see function | 03382 | "i_APCI1710_InitIndex" | 03383 +----------------------------------------------------------------------------+ 03384 */ 03385 03386 INT i_APCI1710_EnableIndex(comedi_device * dev, BYTE b_ModulNbr) 03387 { 03388 INT i_ReturnValue = 0; 03389 ULONG ul_InterruptLatchReg; 03390 03391 /**************************/ 03392 /* Test the module number */ 03393 /**************************/ 03394 03395 if (b_ModulNbr < 4) { 03396 /*******************************/ 03397 /* Test if counter initialised */ 03398 /*******************************/ 03399 03400 if (devpriv-> 03401 s_ModuleInfo[b_ModulNbr]. 03402 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03403 /*****************************/ 03404 /* Test if index initialised */ 03405 /*****************************/ 03406 03407 if (devpriv-> 03408 s_ModuleInfo[b_ModulNbr]. 03409 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) { 03410 devpriv-> 03411 s_ModuleInfo[b_ModulNbr]. 03412 s_SiemensCounterInfo. 03413 s_ModeRegister. 03414 s_ByteModeRegister. 03415 b_ModeRegister2 = devpriv-> 03416 s_ModuleInfo[b_ModulNbr]. 03417 s_SiemensCounterInfo. 03418 s_ModeRegister. 03419 s_ByteModeRegister. 03420 b_ModeRegister2 | APCI1710_ENABLE_INDEX; 03421 03422 ul_InterruptLatchReg = 03423 inl(devpriv->s_BoardInfos.ui_Address + 03424 24 + (64 * b_ModulNbr)); 03425 03426 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03427 s_SiemensCounterInfo. 03428 s_ModeRegister. 03429 dw_ModeRegister1_2_3_4, 03430 devpriv->s_BoardInfos.ui_Address + 20 + 03431 (64 * b_ModulNbr)); 03432 } else { 03433 /*************************************************************/ 03434 /* Index not initialised see function "i_APCI1710_InitIndex" */ 03435 /*************************************************************/ 03436 03437 DPRINTK("Index not initialised \n"); 03438 i_ReturnValue = -4; 03439 } 03440 } else { 03441 /****************************************/ 03442 /* Counter not initialised see function */ 03443 /* "i_APCI1710_InitCounter" */ 03444 /****************************************/ 03445 03446 DPRINTK("Counter not initialised\n"); 03447 i_ReturnValue = -3; 03448 } 03449 } else { 03450 /*************************************************/ 03451 /* The selected module number parameter is wrong */ 03452 /*************************************************/ 03453 03454 DPRINTK("The selected module number parameter is wrong\n"); 03455 i_ReturnValue = -2; 03456 } 03457 03458 return (i_ReturnValue); 03459 } 03460 03461 /* 03462 +----------------------------------------------------------------------------+ 03463 | Function Name : _INT_ i_APCI1710_DisableIndex (BYTE_ b_BoardHandle, | 03464 | BYTE_ b_ModulNbr) | 03465 +----------------------------------------------------------------------------+ 03466 | Task : Disable the INDEX actions | 03467 +----------------------------------------------------------------------------+ 03468 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03469 | BYTE_ b_ModulNbr : Module number to configure | 03470 | (0 to 3) | 03471 +----------------------------------------------------------------------------+ 03472 | Output Parameters : - | 03473 +----------------------------------------------------------------------------+ 03474 | Return Value : 0: No error | 03475 | -1: The handle parameter of the board is wrong | 03476 | -2: No counter module found | 03477 | -3: Counter not initialised see function | 03478 | "i_APCI1710_InitCounter" | 03479 | -4: Index not initialised see function | 03480 | "i_APCI1710_InitIndex" | 03481 +----------------------------------------------------------------------------+ 03482 */ 03483 03484 INT i_APCI1710_DisableIndex(comedi_device * dev, BYTE b_ModulNbr) 03485 { 03486 INT i_ReturnValue = 0; 03487 03488 /**************************/ 03489 /* Test the module number */ 03490 /**************************/ 03491 03492 if (b_ModulNbr < 4) { 03493 /*******************************/ 03494 /* Test if counter initialised */ 03495 /*******************************/ 03496 03497 if (devpriv-> 03498 s_ModuleInfo[b_ModulNbr]. 03499 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03500 /*****************************/ 03501 /* Test if index initialised */ 03502 /*****************************/ 03503 03504 if (devpriv-> 03505 s_ModuleInfo[b_ModulNbr]. 03506 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) { 03507 devpriv-> 03508 s_ModuleInfo[b_ModulNbr]. 03509 s_SiemensCounterInfo. 03510 s_ModeRegister. 03511 s_ByteModeRegister. 03512 b_ModeRegister2 = devpriv-> 03513 s_ModuleInfo[b_ModulNbr]. 03514 s_SiemensCounterInfo. 03515 s_ModeRegister. 03516 s_ByteModeRegister. 03517 b_ModeRegister2 & 03518 APCI1710_DISABLE_INDEX; 03519 03520 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03521 s_SiemensCounterInfo. 03522 s_ModeRegister. 03523 dw_ModeRegister1_2_3_4, 03524 devpriv->s_BoardInfos.ui_Address + 20 + 03525 (64 * b_ModulNbr)); 03526 } else { 03527 /*************************************************************/ 03528 /* Index not initialised see function "i_APCI1710_InitIndex" */ 03529 /*************************************************************/ 03530 03531 DPRINTK("Index not initialised \n"); 03532 i_ReturnValue = -4; 03533 } 03534 } else { 03535 /****************************************/ 03536 /* Counter not initialised see function */ 03537 /* "i_APCI1710_InitCounter" */ 03538 /****************************************/ 03539 03540 DPRINTK("Counter not initialised\n"); 03541 i_ReturnValue = -3; 03542 } 03543 } else { 03544 /*************************************************/ 03545 /* The selected module number parameter is wrong */ 03546 /*************************************************/ 03547 03548 DPRINTK("The selected module number parameter is wrong\n"); 03549 i_ReturnValue = -2; 03550 } 03551 03552 return (i_ReturnValue); 03553 } 03554 03555 /* 03556 +----------------------------------------------------------------------------+ 03557 | Function Name : _INT_ i_APCI1710_EnableCompareLogic | 03558 | (BYTE_ b_BoardHandle, | 03559 | BYTE_ b_ModulNbr) | 03560 +----------------------------------------------------------------------------+ 03561 | Task : Enable the 32-Bit compare logic. At that moment that | 03562 | the incremental counter arrive to the compare value a | 03563 | interrupt is generated. | 03564 +----------------------------------------------------------------------------+ 03565 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03566 | BYTE_ b_ModulNbr : Module number to configure | 03567 | (0 to 3) | 03568 +----------------------------------------------------------------------------+ 03569 | Output Parameters : - 03570 +----------------------------------------------------------------------------+ 03571 | Return Value : 0: No error | 03572 | -1: The handle parameter of the board is wrong | 03573 | -2: No counter module found | 03574 | -3: Counter not initialised see function | 03575 | "i_APCI1710_InitCounter" | 03576 | -4: Compare logic not initialised. | 03577 | See function "i_APCI1710_InitCompareLogic" | 03578 | -5: Interrupt function not initialised. | 03579 | See function "i_APCI1710_SetBoardIntRoutineX" | 03580 +----------------------------------------------------------------------------+ 03581 */ 03582 03583 INT i_APCI1710_EnableCompareLogic(comedi_device * dev, BYTE b_ModulNbr) 03584 { 03585 INT i_ReturnValue = 0; 03586 03587 /**************************/ 03588 /* Test the module number */ 03589 /**************************/ 03590 03591 if (b_ModulNbr < 4) { 03592 /*******************************/ 03593 /* Test if counter initialised */ 03594 /*******************************/ 03595 03596 if (devpriv-> 03597 s_ModuleInfo[b_ModulNbr]. 03598 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03599 /*************************************/ 03600 /* Test if compare logic initialised */ 03601 /*************************************/ 03602 03603 if (devpriv-> 03604 s_ModuleInfo[b_ModulNbr]. 03605 s_SiemensCounterInfo. 03606 s_InitFlag.b_CompareLogicInit == 1) { 03607 devpriv-> 03608 s_ModuleInfo[b_ModulNbr]. 03609 s_SiemensCounterInfo. 03610 s_ModeRegister. 03611 s_ByteModeRegister. 03612 b_ModeRegister3 = devpriv-> 03613 s_ModuleInfo[b_ModulNbr]. 03614 s_SiemensCounterInfo. 03615 s_ModeRegister. 03616 s_ByteModeRegister. 03617 b_ModeRegister3 | 03618 APCI1710_ENABLE_COMPARE_INT; 03619 03620 /***************************/ 03621 /* Write the configuration */ 03622 /***************************/ 03623 03624 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03625 s_SiemensCounterInfo. 03626 s_ModeRegister. 03627 dw_ModeRegister1_2_3_4, 03628 devpriv->s_BoardInfos.ui_Address + 20 + 03629 (64 * b_ModulNbr)); 03630 } else { 03631 /*********************************/ 03632 /* Compare logic not initialised */ 03633 /*********************************/ 03634 03635 DPRINTK("Compare logic not initialised\n"); 03636 i_ReturnValue = -4; 03637 } 03638 } else { 03639 /****************************************/ 03640 /* Counter not initialised see function */ 03641 /* "i_APCI1710_InitCounter" */ 03642 /****************************************/ 03643 03644 DPRINTK("Counter not initialised\n"); 03645 i_ReturnValue = -3; 03646 } 03647 } else { 03648 /*************************************************/ 03649 /* The selected module number parameter is wrong */ 03650 /*************************************************/ 03651 03652 DPRINTK("The selected module number parameter is wrong\n"); 03653 i_ReturnValue = -2; 03654 } 03655 03656 return (i_ReturnValue); 03657 } 03658 03659 /* 03660 +----------------------------------------------------------------------------+ 03661 | Function Name : _INT_ i_APCI1710_DisableCompareLogic | 03662 | (BYTE_ b_BoardHandle, | 03663 | BYTE_ b_ModulNbr) | 03664 +----------------------------------------------------------------------------+ 03665 | Task : Disable the 32-Bit compare logic. 03666 +----------------------------------------------------------------------------+ 03667 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03668 | BYTE_ b_ModulNbr : Module number to configure | 03669 | (0 to 3) | 03670 +----------------------------------------------------------------------------+ 03671 | Output Parameters : - 03672 +----------------------------------------------------------------------------+ 03673 | Return Value : 0: No error | 03674 | -1: The handle parameter of the board is wrong | 03675 | -2: No counter module found | 03676 | -3: Counter not initialised see function | 03677 | "i_APCI1710_InitCounter" | 03678 | -4: Compare logic not initialised. | 03679 | See function "i_APCI1710_InitCompareLogic" | 03680 +----------------------------------------------------------------------------+ 03681 */ 03682 03683 INT i_APCI1710_DisableCompareLogic(comedi_device * dev, BYTE b_ModulNbr) 03684 { 03685 INT i_ReturnValue = 0; 03686 03687 /**************************/ 03688 /* Test the module number */ 03689 /**************************/ 03690 03691 if (b_ModulNbr < 4) { 03692 /*******************************/ 03693 /* Test if counter initialised */ 03694 /*******************************/ 03695 03696 if (devpriv-> 03697 s_ModuleInfo[b_ModulNbr]. 03698 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03699 /*************************************/ 03700 /* Test if compare logic initialised */ 03701 /*************************************/ 03702 03703 if (devpriv-> 03704 s_ModuleInfo[b_ModulNbr]. 03705 s_SiemensCounterInfo. 03706 s_InitFlag.b_CompareLogicInit == 1) { 03707 devpriv-> 03708 s_ModuleInfo[b_ModulNbr]. 03709 s_SiemensCounterInfo. 03710 s_ModeRegister. 03711 s_ByteModeRegister. 03712 b_ModeRegister3 = devpriv-> 03713 s_ModuleInfo[b_ModulNbr]. 03714 s_SiemensCounterInfo. 03715 s_ModeRegister. 03716 s_ByteModeRegister. 03717 b_ModeRegister3 & 03718 APCI1710_DISABLE_COMPARE_INT; 03719 03720 /***************************/ 03721 /* Write the configuration */ 03722 /***************************/ 03723 03724 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03725 s_SiemensCounterInfo. 03726 s_ModeRegister. 03727 dw_ModeRegister1_2_3_4, 03728 devpriv->s_BoardInfos.ui_Address + 20 + 03729 (64 * b_ModulNbr)); 03730 } else { 03731 /*********************************/ 03732 /* Compare logic not initialised */ 03733 /*********************************/ 03734 03735 DPRINTK("Compare logic not initialised\n"); 03736 i_ReturnValue = -4; 03737 } 03738 } else { 03739 /****************************************/ 03740 /* Counter not initialised see function */ 03741 /* "i_APCI1710_InitCounter" */ 03742 /****************************************/ 03743 03744 DPRINTK("Counter not initialised\n"); 03745 i_ReturnValue = -3; 03746 } 03747 } else { 03748 /*************************************************/ 03749 /* The selected module number parameter is wrong */ 03750 /*************************************************/ 03751 03752 DPRINTK("The selected module number parameter is wrong\n"); 03753 i_ReturnValue = -2; 03754 } 03755 03756 return (i_ReturnValue); 03757 } 03758 03759 /* 03760 +----------------------------------------------------------------------------+ 03761 | Function Name : _INT_ i_APCI1710_EnableFrequencyMeasurement | 03762 | (BYTE_ b_BoardHandle, | 03763 | BYTE_ b_ModulNbr, | 03764 | BYTE_ b_InterruptEnable) | 03765 +----------------------------------------------------------------------------+ 03766 | Task : Enables the frequency measurement function | 03767 +----------------------------------------------------------------------------+ 03768 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03769 | BYTE_ b_ModulNbr : Number of the module to be | 03770 | configured (0 to 3) | 03771 | BYTE_ b_InterruptEnable: Enable or disable the | 03772 | interrupt. | 03773 | APCI1710_ENABLE: | 03774 | Enable the interrupt | 03775 | APCI1710_DISABLE: | 03776 | Disable the interrupt | 03777 +----------------------------------------------------------------------------+ 03778 | Output Parameters : - | 03779 +----------------------------------------------------------------------------+ 03780 | Return Value : 0: No error | 03781 | -1: The handle parameter of the board is wrong | 03782 | -2: The selected module number is wrong | 03783 | -3: Counter not initialised see function | 03784 | "i_APCI1710_InitCounter" | 03785 | -4: Frequency measurement logic not initialised. | 03786 | See function "i_APCI1710_InitFrequencyMeasurement" | 03787 | -5: Interrupt parameter is wrong | 03788 | -6: Interrupt function not initialised. | 03789 +----------------------------------------------------------------------------+ 03790 */ 03791 03792 INT i_APCI1710_EnableFrequencyMeasurement(comedi_device * dev, 03793 BYTE b_ModulNbr, BYTE b_InterruptEnable) 03794 { 03795 INT i_ReturnValue = 0; 03796 03797 /**************************/ 03798 /* Test the module number */ 03799 /**************************/ 03800 03801 if (b_ModulNbr < 4) { 03802 /*******************************/ 03803 /* Test if counter initialised */ 03804 /*******************************/ 03805 03806 if (devpriv-> 03807 s_ModuleInfo[b_ModulNbr]. 03808 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03809 /********************************************/ 03810 /* Test if frequency mesurement initialised */ 03811 /********************************************/ 03812 03813 if (devpriv-> 03814 s_ModuleInfo[b_ModulNbr]. 03815 s_SiemensCounterInfo. 03816 s_InitFlag.b_FrequencyMeasurementInit == 1) { 03817 /***************************/ 03818 /* Test the interrupt mode */ 03819 /***************************/ 03820 03821 if ((b_InterruptEnable == APCI1710_DISABLE) || 03822 (b_InterruptEnable == APCI1710_ENABLE)) 03823 { 03824 03825 /************************************/ 03826 /* Enable the frequency measurement */ 03827 /************************************/ 03828 03829 devpriv-> 03830 s_ModuleInfo[b_ModulNbr]. 03831 s_SiemensCounterInfo. 03832 s_ModeRegister. 03833 s_ByteModeRegister. 03834 b_ModeRegister3 = devpriv-> 03835 s_ModuleInfo[b_ModulNbr]. 03836 s_SiemensCounterInfo. 03837 s_ModeRegister. 03838 s_ByteModeRegister. 03839 b_ModeRegister3 | 03840 APCI1710_ENABLE_FREQUENCY; 03841 03842 /*********************************************/ 03843 /* Disable or enable the frequency interrupt */ 03844 /*********************************************/ 03845 03846 devpriv-> 03847 s_ModuleInfo[b_ModulNbr]. 03848 s_SiemensCounterInfo. 03849 s_ModeRegister. 03850 s_ByteModeRegister. 03851 b_ModeRegister3 = (devpriv-> 03852 s_ModuleInfo[b_ModulNbr]. 03853 s_SiemensCounterInfo. 03854 s_ModeRegister. 03855 s_ByteModeRegister. 03856 b_ModeRegister3 & 03857 APCI1710_DISABLE_FREQUENCY_INT) 03858 | (b_InterruptEnable << 3); 03859 03860 /***************************/ 03861 /* Write the configuration */ 03862 /***************************/ 03863 03864 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03865 s_SiemensCounterInfo. 03866 s_ModeRegister. 03867 dw_ModeRegister1_2_3_4, 03868 devpriv->s_BoardInfos. 03869 ui_Address + 20 + 03870 (64 * b_ModulNbr)); 03871 03872 devpriv-> 03873 s_ModuleInfo[b_ModulNbr]. 03874 s_SiemensCounterInfo. 03875 s_InitFlag. 03876 b_FrequencyMeasurementEnable = 03877 1; 03878 } else { 03879 /********************************/ 03880 /* Interrupt parameter is wrong */ 03881 /********************************/ 03882 03883 DPRINTK("Interrupt parameter is wrong\n"); 03884 i_ReturnValue = -5; 03885 } 03886 } else { 03887 /***********************************************/ 03888 /* Frequency measurement logic not initialised */ 03889 /***********************************************/ 03890 03891 DPRINTK("Frequency measurement logic not initialised\n"); 03892 i_ReturnValue = -4; 03893 } 03894 } else { 03895 /****************************************/ 03896 /* Counter not initialised see function */ 03897 /* "i_APCI1710_InitCounter" */ 03898 /****************************************/ 03899 03900 DPRINTK("Counter not initialised\n"); 03901 i_ReturnValue = -3; 03902 } 03903 } else { 03904 /*************************************************/ 03905 /* The selected module number parameter is wrong */ 03906 /*************************************************/ 03907 03908 DPRINTK("The selected module number parameter is wrong\n"); 03909 i_ReturnValue = -2; 03910 } 03911 03912 return (i_ReturnValue); 03913 } 03914 03915 /* 03916 +----------------------------------------------------------------------------+ 03917 | Function Name : _INT_ i_APCI1710_DisableFrequencyMeasurement | 03918 | (BYTE_ b_BoardHandle, | 03919 | BYTE_ b_ModulNbr) | 03920 +----------------------------------------------------------------------------+ 03921 | Task : Disables the frequency measurement function | 03922 +----------------------------------------------------------------------------+ 03923 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 03924 | BYTE_ b_ModulNbr : Number of the module to be | 03925 | configured (0 to 3) | 03926 +----------------------------------------------------------------------------+ 03927 | Output Parameters : - | 03928 +----------------------------------------------------------------------------+ 03929 | Return Value : 0: No error | 03930 | -1: The handle parameter of the board is wrong | 03931 | -2: The selected module number is wrong | 03932 | -3: Counter not initialised see function | 03933 | "i_APCI1710_InitCounter" | 03934 | -4: Frequency measurement logic not initialised. | 03935 | See function "i_APCI1710_InitFrequencyMeasurement" | 03936 +----------------------------------------------------------------------------+ 03937 */ 03938 03939 INT i_APCI1710_DisableFrequencyMeasurement(comedi_device * dev, BYTE b_ModulNbr) 03940 { 03941 INT i_ReturnValue = 0; 03942 03943 /**************************/ 03944 /* Test the module number */ 03945 /**************************/ 03946 03947 if (b_ModulNbr < 4) { 03948 /*******************************/ 03949 /* Test if counter initialised */ 03950 /*******************************/ 03951 03952 if (devpriv-> 03953 s_ModuleInfo[b_ModulNbr]. 03954 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 03955 /********************************************/ 03956 /* Test if frequency mesurement initialised */ 03957 /********************************************/ 03958 03959 if (devpriv-> 03960 s_ModuleInfo[b_ModulNbr]. 03961 s_SiemensCounterInfo. 03962 s_InitFlag.b_FrequencyMeasurementInit == 1) { 03963 /*************************************/ 03964 /* Disable the frequency measurement */ 03965 /*************************************/ 03966 03967 devpriv-> 03968 s_ModuleInfo[b_ModulNbr]. 03969 s_SiemensCounterInfo. 03970 s_ModeRegister. 03971 s_ByteModeRegister. 03972 b_ModeRegister3 = devpriv-> 03973 s_ModuleInfo[b_ModulNbr]. 03974 s_SiemensCounterInfo. 03975 s_ModeRegister. 03976 s_ByteModeRegister. 03977 b_ModeRegister3 & 03978 APCI1710_DISABLE_FREQUENCY 03979 // Begin CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared 03980 & APCI1710_DISABLE_FREQUENCY_INT; 03981 // End CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared 03982 03983 /***************************/ 03984 /* Write the configuration */ 03985 /***************************/ 03986 03987 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 03988 s_SiemensCounterInfo. 03989 s_ModeRegister. 03990 dw_ModeRegister1_2_3_4, 03991 devpriv->s_BoardInfos.ui_Address + 20 + 03992 (64 * b_ModulNbr)); 03993 03994 /*************************************/ 03995 /* Disable the frequency measurement */ 03996 /*************************************/ 03997 03998 devpriv-> 03999 s_ModuleInfo[b_ModulNbr]. 04000 s_SiemensCounterInfo. 04001 s_InitFlag. 04002 b_FrequencyMeasurementEnable = 0; 04003 } else { 04004 /***********************************************/ 04005 /* Frequency measurement logic not initialised */ 04006 /***********************************************/ 04007 04008 DPRINTK("Frequency measurement logic not initialised\n"); 04009 i_ReturnValue = -4; 04010 } 04011 } else { 04012 /****************************************/ 04013 /* Counter not initialised see function */ 04014 /* "i_APCI1710_InitCounter" */ 04015 /****************************************/ 04016 04017 DPRINTK("Counter not initialised\n"); 04018 i_ReturnValue = -3; 04019 } 04020 } else { 04021 /*************************************************/ 04022 /* The selected module number parameter is wrong */ 04023 /*************************************************/ 04024 04025 DPRINTK("The selected module number parameter is wrong\n"); 04026 i_ReturnValue = -2; 04027 } 04028 04029 return (i_ReturnValue); 04030 } 04031 04032 /*########################################################################### */ 04033 04034 // INSN READ 04035 04036 /*########################################################################### */ 04037 04038 /* 04039 +----------------------------------------------------------------------------+ 04040 | Function Name :INT i_APCI1710_InsnWriteINCCPT(comedi_device *dev,comedi_subdevice *s, 04041 comedi_insn *insn,lsampl_t *data) | 04042 +----------------------------------------------------------------------------+ 04043 | Task : Read and Get functions for INC_CPT | 04044 +----------------------------------------------------------------------------+ 04045 | Input Parameters : 04046 +----------------------------------------------------------------------------+ 04047 | Output Parameters : - | 04048 +----------------------------------------------------------------------------+ 04049 | Return Value : 04050 +----------------------------------------------------------------------------+ 04051 */ 04052 INT i_APCI1710_InsnReadINCCPT(comedi_device * dev, comedi_subdevice * s, 04053 comedi_insn * insn, lsampl_t * data) 04054 { 04055 UINT ui_ReadType; 04056 INT i_ReturnValue = 0; 04057 04058 ui_ReadType = CR_CHAN(insn->chanspec); 04059 04060 devpriv->tsk_Current = current; // Save the current process task structure 04061 switch (ui_ReadType) { 04062 case APCI1710_INCCPT_READLATCHREGISTERSTATUS: 04063 i_ReturnValue = i_APCI1710_ReadLatchRegisterStatus(dev, 04064 (BYTE) CR_AREF(insn->chanspec), 04065 (BYTE) CR_RANGE(insn->chanspec), (PBYTE) & data[0]); 04066 break; 04067 04068 case APCI1710_INCCPT_READLATCHREGISTERVALUE: 04069 i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev, 04070 (BYTE) CR_AREF(insn->chanspec), 04071 (BYTE) CR_RANGE(insn->chanspec), (PULONG) & data[0]); 04072 printk("Latch Register Value %d\n", data[0]); 04073 break; 04074 04075 case APCI1710_INCCPT_READ16BITCOUNTERVALUE: 04076 i_ReturnValue = i_APCI1710_Read16BitCounterValue(dev, 04077 (BYTE) CR_AREF(insn->chanspec), 04078 (BYTE) CR_RANGE(insn->chanspec), (PUINT) & data[0]); 04079 break; 04080 04081 case APCI1710_INCCPT_READ32BITCOUNTERVALUE: 04082 i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev, 04083 (BYTE) CR_AREF(insn->chanspec), (PULONG) & data[0]); 04084 break; 04085 04086 case APCI1710_INCCPT_GETINDEXSTATUS: 04087 i_ReturnValue = i_APCI1710_GetIndexStatus(dev, 04088 (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]); 04089 break; 04090 04091 case APCI1710_INCCPT_GETREFERENCESTATUS: 04092 i_ReturnValue = i_APCI1710_GetReferenceStatus(dev, 04093 (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]); 04094 break; 04095 04096 case APCI1710_INCCPT_GETUASSTATUS: 04097 i_ReturnValue = i_APCI1710_GetUASStatus(dev, 04098 (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]); 04099 break; 04100 04101 case APCI1710_INCCPT_GETCBSTATUS: 04102 i_ReturnValue = i_APCI1710_GetCBStatus(dev, 04103 (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]); 04104 break; 04105 04106 case APCI1710_INCCPT_GET16BITCBSTATUS: 04107 i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev, 04108 (BYTE) CR_AREF(insn->chanspec), 04109 (PBYTE) & data[0], (PBYTE) & data[1]); 04110 break; 04111 04112 case APCI1710_INCCPT_GETUDSTATUS: 04113 i_ReturnValue = i_APCI1710_GetUDStatus(dev, 04114 (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]); 04115 04116 break; 04117 04118 case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS: 04119 i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev, 04120 (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]); 04121 break; 04122 04123 case APCI1710_INCCPT_READFREQUENCYMEASUREMENT: 04124 i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev, 04125 (BYTE) CR_AREF(insn->chanspec), 04126 (PBYTE) & data[0], 04127 (PBYTE) & data[1], (PULONG) & data[2]); 04128 break; 04129 04130 case APCI1710_INCCPT_READINTERRUPT: 04131 data[0] = devpriv->s_InterruptParameters. 04132 s_FIFOInterruptParameters[devpriv-> 04133 s_InterruptParameters.ui_Read].b_OldModuleMask; 04134 data[1] = devpriv->s_InterruptParameters. 04135 s_FIFOInterruptParameters[devpriv-> 04136 s_InterruptParameters.ui_Read].ul_OldInterruptMask; 04137 data[2] = devpriv->s_InterruptParameters. 04138 s_FIFOInterruptParameters[devpriv-> 04139 s_InterruptParameters.ui_Read].ul_OldCounterLatchValue; 04140 04141 /**************************/ 04142 /* Increment the read FIFO */ 04143 /***************************/ 04144 04145 devpriv-> 04146 s_InterruptParameters. 04147 ui_Read = (devpriv->s_InterruptParameters. 04148 ui_Read + 1) % APCI1710_SAVE_INTERRUPT; 04149 04150 break; 04151 04152 default: 04153 printk("ReadType Parameter wrong\n"); 04154 } 04155 04156 if (i_ReturnValue >= 0) 04157 i_ReturnValue = insn->n; 04158 return (i_ReturnValue); 04159 04160 } 04161 04162 /* 04163 +----------------------------------------------------------------------------+ 04164 | Function Name : _INT_ i_APCI1710_ReadLatchRegisterStatus | 04165 | (BYTE_ b_BoardHandle, | 04166 | BYTE_ b_ModulNbr, | 04167 | BYTE_ b_LatchReg, | 04168 | PBYTE_ pb_LatchStatus) | 04169 +----------------------------------------------------------------------------+ 04170 | Task : Read the latch register status from selected module | 04171 | (b_ModulNbr) and selected latch register (b_LatchReg). | 04172 +----------------------------------------------------------------------------+ 04173 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04174 | BYTE_ b_ModulNbr : Module number to configure | 04175 | (0 to 3) | 04176 | BYTE_ b_LatchReg : Selected latch register | 04177 | 0 : for the first latch register | 04178 | 1 : for the second latch register | 04179 +----------------------------------------------------------------------------+ 04180 | Output Parameters : PBYTE_ pb_LatchStatus : Latch register status. | 04181 | 0 : No latch occur | 04182 | 1 : A software latch occur | 04183 | 2 : A hardware latch occur | 04184 | 3 : A software and hardware | 04185 | latch occur | 04186 +----------------------------------------------------------------------------+ 04187 | Return Value : 0: No error | 04188 | -1: The handle parameter of the board is wrong | 04189 | -2: No counter module found | 04190 | -3: Counter not initialised see function | 04191 | "i_APCI1710_InitCounter" | 04192 | -4: The selected latch register parameter is wrong | 04193 +----------------------------------------------------------------------------+ 04194 */ 04195 04196 INT i_APCI1710_ReadLatchRegisterStatus(comedi_device * dev, 04197 BYTE b_ModulNbr, BYTE b_LatchReg, PBYTE pb_LatchStatus) 04198 { 04199 INT i_ReturnValue = 0; 04200 DWORD dw_LatchReg; 04201 04202 /**************************/ 04203 /* Test the module number */ 04204 /**************************/ 04205 04206 if (b_ModulNbr < 4) { 04207 /*******************************/ 04208 /* Test if counter initialised */ 04209 /*******************************/ 04210 04211 if (devpriv-> 04212 s_ModuleInfo[b_ModulNbr]. 04213 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04214 /*************************************/ 04215 /* Test the latch register parameter */ 04216 /*************************************/ 04217 04218 if (b_LatchReg < 2) { 04219 dw_LatchReg = inl(devpriv->s_BoardInfos. 04220 ui_Address + (64 * b_ModulNbr)); 04221 04222 *pb_LatchStatus = 04223 (BYTE) ((dw_LatchReg >> (b_LatchReg * 04224 4)) & 0x3); 04225 } else { 04226 /**************************************************/ 04227 /* The selected latch register parameter is wrong */ 04228 /**************************************************/ 04229 04230 DPRINTK("The selected latch register parameter is wrong\n"); 04231 i_ReturnValue = -4; 04232 } 04233 } else { 04234 /****************************************/ 04235 /* Counter not initialised see function */ 04236 /* "i_APCI1710_InitCounter" */ 04237 /****************************************/ 04238 04239 DPRINTK("Counter not initialised\n"); 04240 i_ReturnValue = -3; 04241 } 04242 } else { 04243 /*************************************************/ 04244 /* The selected module number parameter is wrong */ 04245 /*************************************************/ 04246 04247 DPRINTK("The selected module number parameter is wrong\n"); 04248 i_ReturnValue = -2; 04249 } 04250 04251 return (i_ReturnValue); 04252 } 04253 04254 /* 04255 +----------------------------------------------------------------------------+ 04256 | Function Name : _INT_ i_APCI1710_ReadLatchRegisterValue | 04257 | (BYTE_ b_BoardHandle,| 04258 | BYTE_ b_ModulNbr, | 04259 | BYTE_ b_LatchReg, | 04260 | PULONG_ pul_LatchValue) | 04261 +----------------------------------------------------------------------------+ 04262 | Task : Read the latch register value from selected module | 04263 | (b_ModulNbr) and selected latch register (b_LatchReg). | 04264 +----------------------------------------------------------------------------+ 04265 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04266 | BYTE_ b_ModulNbr : Module number to configure | 04267 | (0 to 3) | 04268 | BYTE_ b_LatchReg : Selected latch register | 04269 | 0 : for the first latch register | 04270 | 1 : for the second latch register | 04271 +----------------------------------------------------------------------------+ 04272 | Output Parameters : PULONG_ pul_LatchValue : Latch register value | 04273 +----------------------------------------------------------------------------+ 04274 | Return Value : 0: No error | 04275 | -1: The handle parameter of the board is wrong | 04276 | -2: No counter module found | 04277 | -3: Counter not initialised see function | 04278 | "i_APCI1710_InitCounter" | 04279 | -4: The selected latch register parameter is wrong | 04280 +----------------------------------------------------------------------------+ 04281 */ 04282 04283 INT i_APCI1710_ReadLatchRegisterValue(comedi_device * dev, 04284 BYTE b_ModulNbr, BYTE b_LatchReg, PULONG pul_LatchValue) 04285 { 04286 INT i_ReturnValue = 0; 04287 04288 /**************************/ 04289 /* Test the module number */ 04290 /**************************/ 04291 04292 if (b_ModulNbr < 4) { 04293 /*******************************/ 04294 /* Test if counter initialised */ 04295 /*******************************/ 04296 04297 if (devpriv-> 04298 s_ModuleInfo[b_ModulNbr]. 04299 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04300 /*************************************/ 04301 /* Test the latch register parameter */ 04302 /*************************************/ 04303 04304 if (b_LatchReg < 2) { 04305 *pul_LatchValue = inl(devpriv->s_BoardInfos. 04306 ui_Address + ((b_LatchReg + 1) * 4) + 04307 (64 * b_ModulNbr)); 04308 04309 } else { 04310 /**************************************************/ 04311 /* The selected latch register parameter is wrong */ 04312 /**************************************************/ 04313 04314 DPRINTK("The selected latch register parameter is wrong\n"); 04315 i_ReturnValue = -4; 04316 } 04317 } else { 04318 /****************************************/ 04319 /* Counter not initialised see function */ 04320 /* "i_APCI1710_InitCounter" */ 04321 /****************************************/ 04322 04323 DPRINTK("Counter not initialised\n"); 04324 i_ReturnValue = -3; 04325 } 04326 } else { 04327 /*************************************************/ 04328 /* The selected module number parameter is wrong */ 04329 /*************************************************/ 04330 04331 DPRINTK("The selected module number parameter is wrong\n"); 04332 i_ReturnValue = -2; 04333 } 04334 04335 return (i_ReturnValue); 04336 } 04337 04338 /* 04339 +----------------------------------------------------------------------------+ 04340 | Function Name : _INT_ i_APCI1710_Read16BitCounterValue | 04341 | (BYTE_ b_BoardHandle, | 04342 | BYTE_ b_ModulNbr, | 04343 | BYTE_ b_SelectedCounter, | 04344 | PUINT_ pui_CounterValue) | 04345 +----------------------------------------------------------------------------+ 04346 | Task : Latch the selected 16-Bit counter (b_SelectedCounter) | 04347 | from selected module (b_ModulNbr) in to the first | 04348 | latch register and return the latched value. | 04349 +----------------------------------------------------------------------------+ 04350 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04351 | BYTE_ b_ModulNbr : Module number to configure | 04352 | (0 to 3) | 04353 | BYTE_ b_SelectedCounter : Selected 16-Bit counter | 04354 | (0 or 1) | 04355 +----------------------------------------------------------------------------+ 04356 | Output Parameters : PUINT_ pui_CounterValue : 16-Bit counter value | 04357 +----------------------------------------------------------------------------+ 04358 | Return Value : 0: No error | 04359 | -1: The handle parameter of the board is wrong | 04360 | -2: No counter module found | 04361 | -3: Counter not initialised see function | 04362 | "i_APCI1710_InitCounter" | 04363 | -4: The selected 16-Bit counter parameter is wrong | 04364 +----------------------------------------------------------------------------+ 04365 */ 04366 04367 INT i_APCI1710_Read16BitCounterValue(comedi_device * dev, 04368 BYTE b_ModulNbr, BYTE b_SelectedCounter, PUINT pui_CounterValue) 04369 { 04370 INT i_ReturnValue = 0; 04371 DWORD dw_LathchValue = 0; 04372 04373 /**************************/ 04374 /* Test the module number */ 04375 /**************************/ 04376 04377 if (b_ModulNbr < 4) { 04378 /*******************************/ 04379 /* Test if counter initialised */ 04380 /*******************************/ 04381 04382 if (devpriv-> 04383 s_ModuleInfo[b_ModulNbr]. 04384 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04385 /******************************/ 04386 /* Test the counter selection */ 04387 /******************************/ 04388 04389 if (b_SelectedCounter < 2) { 04390 /*********************/ 04391 /* Latch the counter */ 04392 /*********************/ 04393 04394 outl(1, devpriv->s_BoardInfos. 04395 ui_Address + (64 * b_ModulNbr)); 04396 04397 /************************/ 04398 /* Read the latch value */ 04399 /************************/ 04400 04401 dw_LathchValue = inl(devpriv->s_BoardInfos. 04402 ui_Address + 4 + (64 * b_ModulNbr)); 04403 04404 *pui_CounterValue = 04405 (UINT) ((dw_LathchValue >> (16 * 04406 b_SelectedCounter)) & 04407 0xFFFFU); 04408 } else { 04409 /**************************************************/ 04410 /* The selected 16-Bit counter parameter is wrong */ 04411 /**************************************************/ 04412 04413 DPRINTK("The selected 16-Bit counter parameter is wrong\n"); 04414 i_ReturnValue = -4; 04415 } 04416 } else { 04417 /****************************************/ 04418 /* Counter not initialised see function */ 04419 /* "i_APCI1710_InitCounter" */ 04420 /****************************************/ 04421 04422 DPRINTK("Counter not initialised\n"); 04423 i_ReturnValue = -3; 04424 } 04425 } else { 04426 /*************************************************/ 04427 /* The selected module number parameter is wrong */ 04428 /*************************************************/ 04429 04430 DPRINTK("The selected module number parameter is wrong\n"); 04431 i_ReturnValue = -2; 04432 } 04433 04434 return (i_ReturnValue); 04435 } 04436 04437 /* 04438 +----------------------------------------------------------------------------+ 04439 | Function Name : _INT_ i_APCI1710_Read32BitCounterValue | 04440 | (BYTE_ b_BoardHandle, | 04441 | BYTE_ b_ModulNbr, | 04442 | PULONG_ pul_CounterValue) | 04443 +----------------------------------------------------------------------------+ 04444 | Task : Latch the 32-Bit counter from selected module | 04445 | (b_ModulNbr) in to the first latch register and return | 04446 | the latched value. | 04447 +----------------------------------------------------------------------------+ 04448 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04449 | BYTE_ b_ModulNbr : Module number to configure | 04450 | (0 to 3) | 04451 +----------------------------------------------------------------------------+ 04452 | Output Parameters : PULONG_ pul_CounterValue : 32-Bit counter value | 04453 +----------------------------------------------------------------------------+ 04454 | Return Value : 0: No error | 04455 | -1: The handle parameter of the board is wrong | 04456 | -2: No counter module found | 04457 | -3: Counter not initialised see function | 04458 | "i_APCI1710_InitCounter" | 04459 +----------------------------------------------------------------------------+ 04460 */ 04461 04462 INT i_APCI1710_Read32BitCounterValue(comedi_device * dev, 04463 BYTE b_ModulNbr, PULONG pul_CounterValue) 04464 { 04465 INT i_ReturnValue = 0; 04466 04467 /**************************/ 04468 /* Test the module number */ 04469 /**************************/ 04470 04471 if (b_ModulNbr < 4) { 04472 /*******************************/ 04473 /* Test if counter initialised */ 04474 /*******************************/ 04475 04476 if (devpriv-> 04477 s_ModuleInfo[b_ModulNbr]. 04478 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04479 /*********************/ 04480 /* Tatch the counter */ 04481 /*********************/ 04482 04483 outl(1, devpriv->s_BoardInfos. 04484 ui_Address + (64 * b_ModulNbr)); 04485 04486 /************************/ 04487 /* Read the latch value */ 04488 /************************/ 04489 04490 *pul_CounterValue = inl(devpriv->s_BoardInfos. 04491 ui_Address + 4 + (64 * b_ModulNbr)); 04492 } else { 04493 /****************************************/ 04494 /* Counter not initialised see function */ 04495 /* "i_APCI1710_InitCounter" */ 04496 /****************************************/ 04497 04498 DPRINTK("Counter not initialised\n"); 04499 i_ReturnValue = -3; 04500 } 04501 } else { 04502 /*************************************************/ 04503 /* The selected module number parameter is wrong */ 04504 /*************************************************/ 04505 04506 DPRINTK("The selected module number parameter is wrong\n"); 04507 i_ReturnValue = -2; 04508 } 04509 04510 return (i_ReturnValue); 04511 } 04512 04513 /* 04514 +----------------------------------------------------------------------------+ 04515 | Function Name : _INT_ i_APCI1710_GetIndexStatus (BYTE_ b_BoardHandle,| 04516 | BYTE_ b_ModulNbr, | 04517 | PBYTE_ pb_IndexStatus)| 04518 +----------------------------------------------------------------------------+ 04519 | Task : Return the index status | 04520 +----------------------------------------------------------------------------+ 04521 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04522 | BYTE_ b_ModulNbr : Module number to configure | 04523 | (0 to 3) | 04524 +----------------------------------------------------------------------------+ 04525 | Output Parameters : PBYTE_ pb_IndexStatus : 0 : No INDEX occur | 04526 | 1 : A INDEX occur | 04527 +----------------------------------------------------------------------------+ 04528 | Return Value : 0: No error | 04529 | -1: The handle parameter of the board is wrong | 04530 | -2: No counter module found | 04531 | -3: Counter not initialised see function | 04532 | "i_APCI1710_InitCounter" | 04533 | -4: Index not initialised see function | 04534 | "i_APCI1710_InitIndex" | 04535 +----------------------------------------------------------------------------+ 04536 */ 04537 04538 INT i_APCI1710_GetIndexStatus(comedi_device * dev, 04539 BYTE b_ModulNbr, PBYTE pb_IndexStatus) 04540 { 04541 INT i_ReturnValue = 0; 04542 DWORD dw_StatusReg = 0; 04543 04544 /**************************/ 04545 /* Test the module number */ 04546 /**************************/ 04547 04548 if (b_ModulNbr < 4) { 04549 /*******************************/ 04550 /* Test if counter initialised */ 04551 /*******************************/ 04552 04553 if (devpriv-> 04554 s_ModuleInfo[b_ModulNbr]. 04555 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04556 /*****************************/ 04557 /* Test if index initialised */ 04558 /*****************************/ 04559 04560 if (devpriv-> 04561 s_ModuleInfo[b_ModulNbr]. 04562 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) { 04563 dw_StatusReg = inl(devpriv->s_BoardInfos. 04564 ui_Address + 12 + (64 * b_ModulNbr)); 04565 04566 *pb_IndexStatus = (BYTE) (dw_StatusReg & 1); 04567 } else { 04568 /*************************************************************/ 04569 /* Index not initialised see function "i_APCI1710_InitIndex" */ 04570 /*************************************************************/ 04571 04572 DPRINTK("Index not initialised\n"); 04573 i_ReturnValue = -4; 04574 } 04575 } else { 04576 /****************************************/ 04577 /* Counter not initialised see function */ 04578 /* "i_APCI1710_InitCounter" */ 04579 /****************************************/ 04580 04581 DPRINTK("Counter not initialised\n"); 04582 i_ReturnValue = -3; 04583 } 04584 } else { 04585 /*************************************************/ 04586 /* The selected module number parameter is wrong */ 04587 /*************************************************/ 04588 04589 DPRINTK("The selected module number parameter is wrong\n"); 04590 i_ReturnValue = -2; 04591 } 04592 04593 return (i_ReturnValue); 04594 } 04595 04596 /* 04597 +----------------------------------------------------------------------------+ 04598 | Function Name : _INT_ i_APCI1710_GetReferenceStatus | 04599 | (BYTE_ b_BoardHandle, | 04600 | BYTE_ b_ModulNbr, | 04601 | PBYTE_ pb_ReferenceStatus) | 04602 +----------------------------------------------------------------------------+ 04603 | Task : Return the reference status | 04604 +----------------------------------------------------------------------------+ 04605 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04606 | BYTE_ b_ModulNbr : Module number to configure | 04607 | (0 to 3) | 04608 +----------------------------------------------------------------------------+ 04609 | Output Parameters : PBYTE_ pb_ReferenceStatus : 0 : No REFERENCE occur | 04610 | 1 : A REFERENCE occur | 04611 +----------------------------------------------------------------------------+ 04612 | Return Value : 0: No error | 04613 | -1: The handle parameter of the board is wrong | 04614 | -2: No counter module found | 04615 | -3: Counter not initialised see function | 04616 | "i_APCI1710_InitCounter" | 04617 | -4: Reference not initialised see function | 04618 | "i_APCI1710_InitReference" | 04619 +----------------------------------------------------------------------------+ 04620 */ 04621 04622 INT i_APCI1710_GetReferenceStatus(comedi_device * dev, 04623 BYTE b_ModulNbr, PBYTE pb_ReferenceStatus) 04624 { 04625 INT i_ReturnValue = 0; 04626 DWORD dw_StatusReg = 0; 04627 04628 /**************************/ 04629 /* Test the module number */ 04630 /**************************/ 04631 04632 if (b_ModulNbr < 4) { 04633 /*******************************/ 04634 /* Test if counter initialised */ 04635 /*******************************/ 04636 04637 if (devpriv-> 04638 s_ModuleInfo[b_ModulNbr]. 04639 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04640 /*********************************/ 04641 /* Test if reference initialised */ 04642 /*********************************/ 04643 04644 if (devpriv-> 04645 s_ModuleInfo[b_ModulNbr]. 04646 s_SiemensCounterInfo. 04647 s_InitFlag.b_ReferenceInit) { 04648 dw_StatusReg = inl(devpriv->s_BoardInfos. 04649 ui_Address + 24 + (64 * b_ModulNbr)); 04650 04651 *pb_ReferenceStatus = 04652 (BYTE) (~dw_StatusReg & 1); 04653 } else { 04654 /*********************************************************************/ 04655 /* Reference not initialised see function "i_APCI1710_InitReference" */ 04656 /*********************************************************************/ 04657 04658 DPRINTK("Reference not initialised\n"); 04659 i_ReturnValue = -4; 04660 } 04661 } else { 04662 /****************************************/ 04663 /* Counter not initialised see function */ 04664 /* "i_APCI1710_InitCounter" */ 04665 /****************************************/ 04666 04667 DPRINTK("Counter not initialised\n"); 04668 i_ReturnValue = -3; 04669 } 04670 } else { 04671 /*************************************************/ 04672 /* The selected module number parameter is wrong */ 04673 /*************************************************/ 04674 04675 DPRINTK("The selected module number parameter is wrong\n"); 04676 i_ReturnValue = -2; 04677 } 04678 04679 return (i_ReturnValue); 04680 } 04681 04682 /* 04683 +----------------------------------------------------------------------------+ 04684 | Function Name : _INT_ i_APCI1710_GetUASStatus | 04685 | (BYTE_ b_BoardHandle, | 04686 | BYTE_ b_ModulNbr, | 04687 | PBYTE_ pb_UASStatus) | 04688 +----------------------------------------------------------------------------+ 04689 | Task : Return the error signal (UAS) status | 04690 +----------------------------------------------------------------------------+ 04691 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04692 | BYTE_ b_ModulNbr : Module number to configure | 04693 | (0 to 3) | 04694 +----------------------------------------------------------------------------+ 04695 | Output Parameters : PBYTE_ pb_UASStatus : 0 : UAS is low "0" | 04696 | 1 : UAS is high "1" | 04697 +----------------------------------------------------------------------------+ 04698 | Return Value : 0: No error | 04699 | -1: The handle parameter of the board is wrong | 04700 | -2: No counter module found | 04701 | -3: Counter not initialised see function | 04702 | "i_APCI1710_InitCounter" | 04703 +----------------------------------------------------------------------------+ 04704 */ 04705 04706 INT i_APCI1710_GetUASStatus(comedi_device * dev, 04707 BYTE b_ModulNbr, PBYTE pb_UASStatus) 04708 { 04709 INT i_ReturnValue = 0; 04710 DWORD dw_StatusReg = 0; 04711 04712 /**************************/ 04713 /* Test the module number */ 04714 /**************************/ 04715 04716 if (b_ModulNbr < 4) { 04717 /*******************************/ 04718 /* Test if counter initialised */ 04719 /*******************************/ 04720 04721 if (devpriv-> 04722 s_ModuleInfo[b_ModulNbr]. 04723 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04724 dw_StatusReg = inl(devpriv->s_BoardInfos. 04725 ui_Address + 24 + (64 * b_ModulNbr)); 04726 04727 *pb_UASStatus = (BYTE) ((dw_StatusReg >> 1) & 1); 04728 } else { 04729 /****************************************/ 04730 /* Counter not initialised see function */ 04731 /* "i_APCI1710_InitCounter" */ 04732 /****************************************/ 04733 04734 DPRINTK("Counter not initialised\n"); 04735 i_ReturnValue = -3; 04736 } 04737 } else { 04738 /*************************************************/ 04739 /* The selected module number parameter is wrong */ 04740 /*************************************************/ 04741 04742 DPRINTK("The selected module number parameter is wrong\n"); 04743 i_ReturnValue = -2; 04744 04745 } 04746 04747 return (i_ReturnValue); 04748 } 04749 04750 /* 04751 +----------------------------------------------------------------------------+ 04752 | Function Name : _INT_ i_APCI1710_GetCBStatus | 04753 | (BYTE_ b_BoardHandle, | 04754 | BYTE_ b_ModulNbr, | 04755 | PBYTE_ pb_CBStatus) | 04756 +----------------------------------------------------------------------------+ 04757 | Task : Return the counter overflow status | 04758 +----------------------------------------------------------------------------+ 04759 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04760 | BYTE_ b_ModulNbr : Module number to configure | 04761 | (0 to 3) | 04762 +----------------------------------------------------------------------------+ 04763 | Output Parameters : PBYTE_ pb_CBStatus : 0 : Counter no overflow | 04764 | 1 : Counter overflow | 04765 +----------------------------------------------------------------------------+ 04766 | Return Value : 0: No error | 04767 | -1: The handle parameter of the board is wrong | 04768 | -2: No counter module found | 04769 | -3: Counter not initialised see function | 04770 | "i_APCI1710_InitCounter" | 04771 +----------------------------------------------------------------------------+ 04772 */ 04773 04774 INT i_APCI1710_GetCBStatus(comedi_device * dev, 04775 BYTE b_ModulNbr, PBYTE pb_CBStatus) 04776 { 04777 INT i_ReturnValue = 0; 04778 DWORD dw_StatusReg = 0; 04779 04780 /**************************/ 04781 /* Test the module number */ 04782 /**************************/ 04783 04784 if (b_ModulNbr < 4) { 04785 /*******************************/ 04786 /* Test if counter initialised */ 04787 /*******************************/ 04788 04789 if (devpriv-> 04790 s_ModuleInfo[b_ModulNbr]. 04791 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04792 dw_StatusReg = inl(devpriv->s_BoardInfos. 04793 ui_Address + 16 + (64 * b_ModulNbr)); 04794 04795 *pb_CBStatus = (BYTE) (dw_StatusReg & 1); 04796 04797 } else { 04798 /****************************************/ 04799 /* Counter not initialised see function */ 04800 /* "i_APCI1710_InitCounter" */ 04801 /****************************************/ 04802 04803 DPRINTK("Counter not initialised\n"); 04804 i_ReturnValue = -3; 04805 } 04806 } else { 04807 /*************************************************/ 04808 /* The selected module number parameter is wrong */ 04809 /*************************************************/ 04810 04811 DPRINTK("The selected module number parameter is wrong\n"); 04812 i_ReturnValue = -2; 04813 } 04814 04815 return (i_ReturnValue); 04816 } 04817 04818 /* 04819 +----------------------------------------------------------------------------+ 04820 | Function Name : _INT_ i_APCI1710_Get16BitCBStatus | 04821 | (BYTE_ b_BoardHandle, | 04822 | BYTE_ b_ModulNbr, | 04823 | PBYTE_ pb_CBStatusCounter0, | 04824 | PBYTE_ pb_CBStatusCounter1) | 04825 +----------------------------------------------------------------------------+ 04826 | Task : Returns the counter overflow (counter initialised to | 04827 | 2*16-bit) status from selected incremental counter | 04828 | module | 04829 +----------------------------------------------------------------------------+ 04830 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04831 | BYTE_ b_ModulNbr : Module number to configure | 04832 | (0 to 3) | 04833 +----------------------------------------------------------------------------+ 04834 | Output Parameters : PBYTE_ pb_CBStatusCounter0 : 0 : No overflow occur for | 04835 | the first 16-bit | 04836 | counter | 04837 | 1 : Overflow occur for the| 04838 | first 16-bit counter | 04839 | PBYTE_ pb_CBStatusCounter1 : 0 : No overflow occur for | 04840 | the second 16-bit | 04841 | counter | 04842 | 1 : Overflow occur for the| 04843 | second 16-bit counter | 04844 +----------------------------------------------------------------------------+ 04845 | Return Value : 0: No error | 04846 | -1: The handle parameter of the board is wrong | 04847 | -2: No counter module found | 04848 | -3: Counter not initialised see function | 04849 | "i_APCI1710_InitCounter" | 04850 | -4: Counter not initialised to 2*16-bit mode. | 04851 | See function "i_APCI1710_InitCounter" | 04852 | -5: Firmware revision error | 04853 +----------------------------------------------------------------------------+ 04854 */ 04855 04856 INT i_APCI1710_Get16BitCBStatus(comedi_device * dev, 04857 BYTE b_ModulNbr, PBYTE pb_CBStatusCounter0, PBYTE pb_CBStatusCounter1) 04858 { 04859 INT i_ReturnValue = 0; 04860 DWORD dw_StatusReg = 0; 04861 04862 /**************************/ 04863 /* Test the module number */ 04864 /**************************/ 04865 04866 if (b_ModulNbr < 4) { 04867 /*******************************/ 04868 /* Test if counter initialised */ 04869 /*******************************/ 04870 04871 if (devpriv-> 04872 s_ModuleInfo[b_ModulNbr]. 04873 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04874 /*************************/ 04875 /* Test if 2*16-Bit mode */ 04876 /*************************/ 04877 04878 if ((devpriv->s_ModuleInfo[b_ModulNbr]. 04879 s_SiemensCounterInfo. 04880 s_ModeRegister. 04881 s_ByteModeRegister. 04882 b_ModeRegister1 & 0x10) == 0x10) { 04883 /*****************************/ 04884 /* Test the Firmware version */ 04885 /*****************************/ 04886 04887 if ((devpriv->s_BoardInfos. 04888 dw_MolduleConfiguration 04889 [b_ModulNbr] & 0xFFFF) >= 04890 0x3136) { 04891 dw_StatusReg = 04892 inl(devpriv->s_BoardInfos. 04893 ui_Address + 16 + 04894 (64 * b_ModulNbr)); 04895 04896 *pb_CBStatusCounter1 = 04897 (BYTE) ((dw_StatusReg >> 0) & 04898 1); 04899 *pb_CBStatusCounter0 = 04900 (BYTE) ((dw_StatusReg >> 1) & 04901 1); 04902 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) 04903 else { 04904 /****************************/ 04905 /* Firmware revision error */ 04906 /****************************/ 04907 04908 i_ReturnValue = -5; 04909 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) 04910 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) 04911 else { 04912 /********************************************/ 04913 /* Counter not initialised to 2*16-bit mode */ 04914 /* "i_APCI1710_InitCounter" */ 04915 /********************************************/ 04916 04917 DPRINTK("Counter not initialised\n"); 04918 i_ReturnValue = -4; 04919 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) 04920 } // if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) 04921 else { 04922 /****************************************/ 04923 /* Counter not initialised see function */ 04924 /* "i_APCI1710_InitCounter" */ 04925 /****************************************/ 04926 04927 DPRINTK("Counter not initialised\n"); 04928 i_ReturnValue = -3; 04929 } // if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) 04930 } // if (b_ModulNbr < 4) 04931 else { 04932 /*************************************************/ 04933 /* The selected module number parameter is wrong */ 04934 /*************************************************/ 04935 04936 DPRINTK("The selected module number parameter is wrong\n"); 04937 i_ReturnValue = -2; 04938 } // if (b_ModulNbr < 4) 04939 04940 return (i_ReturnValue); 04941 } 04942 04943 /* 04944 +----------------------------------------------------------------------------+ 04945 | Function Name : _INT_ i_APCI1710_GetUDStatus | 04946 | (BYTE_ b_BoardHandle, | 04947 | BYTE_ b_ModulNbr, | 04948 | PBYTE_ pb_UDStatus) | 04949 +----------------------------------------------------------------------------+ 04950 | Task : Return the counter progress status | 04951 +----------------------------------------------------------------------------+ 04952 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 04953 | BYTE_ b_ModulNbr : Module number to configure | 04954 | (0 to 3) | 04955 +----------------------------------------------------------------------------+ 04956 | Output Parameters : PBYTE_ pb_UDStatus : 0 : Counter progress in the | 04957 | selected mode down | 04958 | 1 : Counter progress in the | 04959 | selected mode up | 04960 +----------------------------------------------------------------------------+ 04961 | Return Value : 0: No error | 04962 | -1: The handle parameter of the board is wrong | 04963 | -2: No counter module found | 04964 | -3: Counter not initialised see function | 04965 | "i_APCI1710_InitCounter" | 04966 +----------------------------------------------------------------------------+ 04967 */ 04968 04969 INT i_APCI1710_GetUDStatus(comedi_device * dev, 04970 BYTE b_ModulNbr, PBYTE pb_UDStatus) 04971 { 04972 INT i_ReturnValue = 0; 04973 DWORD dw_StatusReg = 0; 04974 04975 /**************************/ 04976 /* Test the module number */ 04977 /**************************/ 04978 04979 if (b_ModulNbr < 4) { 04980 /*******************************/ 04981 /* Test if counter initialised */ 04982 /*******************************/ 04983 04984 if (devpriv-> 04985 s_ModuleInfo[b_ModulNbr]. 04986 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 04987 dw_StatusReg = inl(devpriv->s_BoardInfos. 04988 ui_Address + 24 + (64 * b_ModulNbr)); 04989 04990 *pb_UDStatus = (BYTE) ((dw_StatusReg >> 2) & 1); 04991 04992 } else { 04993 /****************************************/ 04994 /* Counter not initialised see function */ 04995 /* "i_APCI1710_InitCounter" */ 04996 /****************************************/ 04997 04998 DPRINTK("Counter not initialised\n"); 04999 i_ReturnValue = -3; 05000 } 05001 } else { 05002 /*************************************************/ 05003 /* The selected module number parameter is wrong */ 05004 /*************************************************/ 05005 05006 DPRINTK("The selected module number parameter is wrong\n"); 05007 i_ReturnValue = -2; 05008 } 05009 05010 return (i_ReturnValue); 05011 } 05012 05013 /* 05014 +----------------------------------------------------------------------------+ 05015 | Function Name : _INT_ i_APCI1710_GetInterruptUDLatchedStatus | 05016 | (BYTE_ b_BoardHandle, | 05017 | BYTE_ b_ModulNbr, | 05018 | PBYTE_ pb_UDStatus) | 05019 +----------------------------------------------------------------------------+ 05020 | Task : Return the counter progress latched status after a | 05021 | index interrupt occur. | 05022 +----------------------------------------------------------------------------+ 05023 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 05024 | BYTE_ b_ModulNbr : Module number to configure | 05025 | (0 to 3) | 05026 +----------------------------------------------------------------------------+ 05027 | Output Parameters : PBYTE_ pb_UDStatus : 0 : Counter progress in the | 05028 | selected mode down | 05029 | 1 : Counter progress in the | 05030 | selected mode up | 05031 | 2 : No index interrupt occur | 05032 +----------------------------------------------------------------------------+ 05033 | Return Value : 0: No error | 05034 | -1: The handle parameter of the board is wrong | 05035 | -2: No counter module found | 05036 | -3: Counter not initialised see function | 05037 | "i_APCI1710_InitCounter" | 05038 | -4: Interrupt function not initialised. | 05039 | See function "i_APCI1710_SetBoardIntRoutineX" | 05040 +----------------------------------------------------------------------------+ 05041 */ 05042 05043 INT i_APCI1710_GetInterruptUDLatchedStatus(comedi_device * dev, 05044 BYTE b_ModulNbr, PBYTE pb_UDStatus) 05045 { 05046 INT i_ReturnValue = 0; 05047 DWORD dw_StatusReg = 0; 05048 05049 /**************************/ 05050 /* Test the module number */ 05051 /**************************/ 05052 05053 if (b_ModulNbr < 4) { 05054 /*******************************/ 05055 /* Test if counter initialised */ 05056 /*******************************/ 05057 05058 if (devpriv-> 05059 s_ModuleInfo[b_ModulNbr]. 05060 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 05061 /*********************************/ 05062 /* Test if index interrupt occur */ 05063 /*********************************/ 05064 05065 if (devpriv-> 05066 s_ModuleInfo[b_ModulNbr]. 05067 s_SiemensCounterInfo. 05068 s_InitFlag.b_IndexInterruptOccur == 1) { 05069 devpriv-> 05070 s_ModuleInfo[b_ModulNbr]. 05071 s_SiemensCounterInfo. 05072 s_InitFlag.b_IndexInterruptOccur = 0; 05073 05074 dw_StatusReg = inl(devpriv->s_BoardInfos. 05075 ui_Address + 12 + (64 * b_ModulNbr)); 05076 05077 *pb_UDStatus = (BYTE) ((dw_StatusReg >> 1) & 1); 05078 } else { 05079 /****************************/ 05080 /* No index interrupt occur */ 05081 /****************************/ 05082 05083 *pb_UDStatus = 2; 05084 } 05085 } else { 05086 /****************************************/ 05087 /* Counter not initialised see function */ 05088 /* "i_APCI1710_InitCounter" */ 05089 /****************************************/ 05090 05091 DPRINTK("Counter not initialised\n"); 05092 i_ReturnValue = -3; 05093 } 05094 } else { 05095 /*************************************************/ 05096 /* The selected module number parameter is wrong */ 05097 /*************************************************/ 05098 05099 DPRINTK("The selected module number parameter is wrong\n"); 05100 i_ReturnValue = -2; 05101 } 05102 05103 return (i_ReturnValue); 05104 } 05105 05106 /* 05107 +----------------------------------------------------------------------------+ 05108 | Function Name : _INT_ i_APCI1710_ReadFrequencyMeasurement | 05109 | (BYTE_ b_BoardHandle, | 05110 | BYTE_ b_ModulNbr, | 05111 | PBYTE_ pb_Status, | 05112 | PULONG_ pul_ReadValue) | 05113 +----------------------------------------------------------------------------+ 05114 | Task : Returns the status (pb_Status) and the number of | 05115 | increments in the set time. | 05116 | See function " i_APCI1710_InitFrequencyMeasurement " | 05117 +----------------------------------------------------------------------------+ 05118 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 05119 | BYTE_ b_ModulNbr : Number of the module to be | 05120 | configured (0 to 3) | 05121 +----------------------------------------------------------------------------+ 05122 | Output Parameters : PBYTE_ pb_Status : Returns the frequency | 05123 | measurement status | 05124 | 0 : Counting cycle not | 05125 | started. | 05126 | 1 : Counting cycle started. | 05127 | 2 : Counting cycle stopped. | 05128 | The measurement cycle is | 05129 | completed. | 05130 | PBYTE_ pb_UDStatus : 0 : Counter progress in the | 05131 | selected mode down | 05132 | 1 : Counter progress in the | 05133 | selected mode up | 05134 | PULONG_ pul_ReadValue : Return the number of | 05135 | increments in the defined | 05136 | time base. | 05137 +----------------------------------------------------------------------------+ 05138 | Return Value : 0: No error | 05139 | -1: The handle parameter of the board is wrong | 05140 | -2: The selected module number is wrong | 05141 | -3: Counter not initialised see function | 05142 | "i_APCI1710_InitCounter" | 05143 | -4: Frequency measurement logic not initialised. | 05144 | See function "i_APCI1710_InitFrequencyMeasurement" | 05145 +----------------------------------------------------------------------------+ 05146 */ 05147 05148 INT i_APCI1710_ReadFrequencyMeasurement(comedi_device * dev, 05149 BYTE b_ModulNbr, 05150 PBYTE pb_Status, PBYTE pb_UDStatus, PULONG pul_ReadValue) 05151 { 05152 INT i_ReturnValue = 0; 05153 UINT ui_16BitValue; 05154 DWORD dw_StatusReg; 05155 05156 /**************************/ 05157 /* Test the module number */ 05158 /**************************/ 05159 05160 if (b_ModulNbr < 4) { 05161 /*******************************/ 05162 /* Test if counter initialised */ 05163 /*******************************/ 05164 05165 if (devpriv-> 05166 s_ModuleInfo[b_ModulNbr]. 05167 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 05168 /********************************************/ 05169 /* Test if frequency mesurement initialised */ 05170 /********************************************/ 05171 05172 if (devpriv-> 05173 s_ModuleInfo[b_ModulNbr]. 05174 s_SiemensCounterInfo. 05175 s_InitFlag.b_FrequencyMeasurementInit == 1) { 05176 /******************/ 05177 /* Test if enable */ 05178 /******************/ 05179 05180 if (devpriv-> 05181 s_ModuleInfo[b_ModulNbr]. 05182 s_SiemensCounterInfo. 05183 s_InitFlag. 05184 b_FrequencyMeasurementEnable == 1) { 05185 /*******************/ 05186 /* Read the status */ 05187 /*******************/ 05188 05189 dw_StatusReg = 05190 inl(devpriv->s_BoardInfos. 05191 ui_Address + 32 + 05192 (64 * b_ModulNbr)); 05193 05194 /**************************/ 05195 /* Test if frequency stop */ 05196 /**************************/ 05197 05198 if (dw_StatusReg & 1) { 05199 *pb_Status = 2; 05200 *pb_UDStatus = 05201 (BYTE) ((dw_StatusReg >> 05202 1) & 3); 05203 05204 /******************/ 05205 /* Read the value */ 05206 /******************/ 05207 05208 *pul_ReadValue = 05209 inl(devpriv-> 05210 s_BoardInfos. 05211 ui_Address + 28 + 05212 (64 * b_ModulNbr)); 05213 05214 if (*pb_UDStatus == 0) { 05215 /*************************/ 05216 /* Test the counter mode */ 05217 /*************************/ 05218 05219 if ((devpriv->s_ModuleInfo[b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & APCI1710_16BIT_COUNTER) == APCI1710_16BIT_COUNTER) { 05220 /****************************************/ 05221 /* Test if 16-bit counter 1 pulse occur */ 05222 /****************************************/ 05223 05224 if ((*pul_ReadValue & 0xFFFFU) != 0) { 05225 ui_16BitValue 05226 = 05227 (UINT) 05228 * 05229 pul_ReadValue 05230 & 05231 0xFFFFU; 05232 *pul_ReadValue 05233 = 05234 (*pul_ReadValue 05235 & 05236 0xFFFF0000UL) 05237 | 05238 (0xFFFFU 05239 - 05240 ui_16BitValue); 05241 } 05242 05243 /****************************************/ 05244 /* Test if 16-bit counter 2 pulse occur */ 05245 /****************************************/ 05246 05247 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) { 05248 ui_16BitValue 05249 = 05250 (UINT) 05251 ( 05252 (*pul_ReadValue 05253 >> 05254 16) 05255 & 05256 0xFFFFU); 05257 *pul_ReadValue 05258 = 05259 (*pul_ReadValue 05260 & 05261 0xFFFFUL) 05262 | 05263 ( 05264 (0xFFFFU - ui_16BitValue) << 16); 05265 } 05266 } else { 05267 if (*pul_ReadValue != 0) { 05268 *pul_ReadValue 05269 = 05270 0xFFFFFFFFUL 05271 - 05272 *pul_ReadValue; 05273 } 05274 } 05275 } else { 05276 if (*pb_UDStatus == 1) { 05277 /****************************************/ 05278 /* Test if 16-bit counter 2 pulse occur */ 05279 /****************************************/ 05280 05281 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) { 05282 ui_16BitValue 05283 = 05284 (UINT) 05285 ( 05286 (*pul_ReadValue 05287 >> 05288 16) 05289 & 05290 0xFFFFU); 05291 *pul_ReadValue 05292 = 05293 (*pul_ReadValue 05294 & 05295 0xFFFFUL) 05296 | 05297 ( 05298 (0xFFFFU - ui_16BitValue) << 16); 05299 } 05300 } else { 05301 if (*pb_UDStatus 05302 == 2) { 05303 /****************************************/ 05304 /* Test if 16-bit counter 1 pulse occur */ 05305 /****************************************/ 05306 05307 if ((*pul_ReadValue & 0xFFFFU) != 0) { 05308 ui_16BitValue 05309 = 05310 (UINT) 05311 * 05312 pul_ReadValue 05313 & 05314 0xFFFFU; 05315 *pul_ReadValue 05316 = 05317 (*pul_ReadValue 05318 & 05319 0xFFFF0000UL) 05320 | 05321 (0xFFFFU 05322 - 05323 ui_16BitValue); 05324 } 05325 } 05326 } 05327 } 05328 } else { 05329 *pb_Status = 1; 05330 *pb_UDStatus = 0; 05331 } 05332 } else { 05333 *pb_Status = 0; 05334 *pb_UDStatus = 0; 05335 } 05336 } else { 05337 /***********************************************/ 05338 /* Frequency measurement logic not initialised */ 05339 /***********************************************/ 05340 05341 DPRINTK("Frequency measurement logic not initialised\n"); 05342 i_ReturnValue = -4; 05343 } 05344 } else { 05345 /****************************************/ 05346 /* Counter not initialised see function */ 05347 /* "i_APCI1710_InitCounter" */ 05348 /****************************************/ 05349 05350 DPRINTK("Counter not initialised\n"); 05351 i_ReturnValue = -3; 05352 } 05353 } else { 05354 /*************************************************/ 05355 /* The selected module number parameter is wrong */ 05356 /*************************************************/ 05357 05358 DPRINTK("The selected module number parameter is wrong\n"); 05359 i_ReturnValue = -2; 05360 } 05361 05362 return (i_ReturnValue); 05363 }