RTXI 1.3
comedi/comedi/drivers/addi-data/APCI1710_INCCPT.c
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines