Merge branch 'for-2.6.31' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
[pandora-kernel.git] / drivers / staging / comedi / drivers / addi-data / APCI1710_INCCPT.c
1 /**
2 @verbatim
3
4 Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
5
6         ADDI-DATA GmbH
7         Dieselstrasse 3
8         D-77833 Ottersweier
9         Tel: +19(0)7223/9493-0
10         Fax: +49(0)7223/9493-92
11         http://www.addi-data-com
12         info@addi-data.com
13
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 You shoud also find the complete GPL in the COPYING file accompanying this source code.
21
22 @endverbatim
23 */
24 /*
25   +-----------------------------------------------------------------------+
26   | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
27   +-----------------------------------------------------------------------+
28   | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
29   | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
30   +-----------------------------------------------------------------------+
31   | Project     : API APCI1710    | Compiler : gcc                        |
32   | Module name : INC_CPT.C       | Version  : 2.96                       |
33   +-------------------------------+---------------------------------------+
34   | Project manager: Eric Stolz   | Date     :  02/12/2002                |
35   +-----------------------------------------------------------------------+
36   | Description :   APCI-1710 incremental counter module                  |
37   |                                                                       |
38   |                                                                       |
39   +-----------------------------------------------------------------------+
40   |                             UPDATES                                   |
41   +-----------------------------------------------------------------------+
42   |   Date   |   Author  |          Description of updates                |
43   +----------+-----------+------------------------------------------------+
44   |          |           |                                                |
45   |----------|-----------|------------------------------------------------|
46   | 08/05/00 | Guinot C  | - 0400/0228 All Function in RING 0             |
47   |          |           |   available                                    |
48   +-----------------------------------------------------------------------+
49   | 29/06/01 | Guinot C. | - 1100/0231 -> 0701/0232                       |
50   |          |           | See i_APCI1710_DisableFrequencyMeasurement     |
51   +-----------------------------------------------------------------------+
52 */
53
54 /*
55 +----------------------------------------------------------------------------+
56 |                               Included files                               |
57 +----------------------------------------------------------------------------+
58 */
59
60 #include "APCI1710_INCCPT.h"
61
62 /*
63 +----------------------------------------------------------------------------+
64 | int   i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
65 struct comedi_insn *insn,unsigned int *data)
66
67 +----------------------------------------------------------------------------+
68 | Task              : Configuration function for INC_CPT                             |
69 +----------------------------------------------------------------------------+
70 | Input Parameters  :                                                                                                            |
71 +----------------------------------------------------------------------------+
72 | Output Parameters : *data
73 +----------------------------------------------------------------------------+
74 | Return Value      :                 |
75 +----------------------------------------------------------------------------+
76 */
77
78 int i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
79         struct comedi_insn *insn, unsigned int *data)
80 {
81         unsigned int ui_ConfigType;
82         int i_ReturnValue = 0;
83         ui_ConfigType = CR_CHAN(insn->chanspec);
84
85         printk("\nINC_CPT");
86
87         devpriv->tsk_Current = current; /*  Save the current process task structure */
88         switch (ui_ConfigType) {
89         case APCI1710_INCCPT_INITCOUNTER:
90                 i_ReturnValue = i_APCI1710_InitCounter(dev,
91                         CR_AREF(insn->chanspec),
92                         (unsigned char) data[0],
93                         (unsigned char) data[1],
94                         (unsigned char) data[2], (unsigned char) data[3], (unsigned char) data[4]);
95                 break;
96
97         case APCI1710_INCCPT_COUNTERAUTOTEST:
98                 i_ReturnValue = i_APCI1710_CounterAutoTest(dev,
99                         (unsigned char *) &data[0]);
100                 break;
101
102         case APCI1710_INCCPT_INITINDEX:
103                 i_ReturnValue = i_APCI1710_InitIndex(dev,
104                         CR_AREF(insn->chanspec),
105                         (unsigned char) data[0],
106                         (unsigned char) data[1], (unsigned char) data[2], (unsigned char) data[3]);
107                 break;
108
109         case APCI1710_INCCPT_INITREFERENCE:
110                 i_ReturnValue = i_APCI1710_InitReference(dev,
111                         CR_AREF(insn->chanspec), (unsigned char) data[0]);
112                 break;
113
114         case APCI1710_INCCPT_INITEXTERNALSTROBE:
115                 i_ReturnValue = i_APCI1710_InitExternalStrobe(dev,
116                         CR_AREF(insn->chanspec),
117                         (unsigned char) data[0], (unsigned char) data[1]);
118                 break;
119
120         case APCI1710_INCCPT_INITCOMPARELOGIC:
121                 i_ReturnValue = i_APCI1710_InitCompareLogic(dev,
122                         CR_AREF(insn->chanspec), (unsigned int) data[0]);
123                 break;
124
125         case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT:
126                 i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev,
127                         CR_AREF(insn->chanspec),
128                         (unsigned char) data[0],
129                         (unsigned char) data[1], (unsigned int) data[2], (unsigned int *) &data[0]);
130                 break;
131
132         default:
133                 printk("Insn Config : Config Parameter Wrong\n");
134
135         }
136
137         if (i_ReturnValue >= 0)
138                 i_ReturnValue = insn->n;
139         return i_ReturnValue;
140 }
141
142 /*
143 +----------------------------------------------------------------------------+
144 | Function Name     : _INT_ i_APCI1710_InitCounter                           |
145 |                               (unsigned char_          b_BoardHandle,               |
146 |                                unsigned char_          b_ModulNbr,                  |
147 |                                unsigned char_          b_CounterRange,              |
148 |                                unsigned char_          b_FirstCounterModus,         |
149 |                                unsigned char_          b_FirstCounterOption,        |
150 |                                unsigned char_          b_SecondCounterModus,        |
151 |                                unsigned char_          b_SecondCounterOption)       |
152 +----------------------------------------------------------------------------+
153 | Task              : Configure the counter operating mode from selected     |
154 |                     module (b_ModulNbr). You must calling this function be |
155 |                     for you call any other function witch access of        |
156 |                     counters.                                              |
157 |                                                                            |
158 |                          Counter range                                     |
159 |                          -------------                                     |
160 | +------------------------------------+-----------------------------------+ |
161 | | Parameter       Passed value       |        Description                | |
162 | |------------------------------------+-----------------------------------| |
163 | |b_ModulNbr   APCI1710_16BIT_COUNTER |  The module is configured for     | |
164 | |                                    |  two 16-bit counter.              | |
165 | |                                    |  - b_FirstCounterModus and        | |
166 | |                                    |    b_FirstCounterOption           | |
167 | |                                    |    configure the first 16 bit     | |
168 | |                                    |    counter.                       | |
169 | |                                    |  - b_SecondCounterModus and       | |
170 | |                                    |    b_SecondCounterOption          | |
171 | |                                    |    configure the second 16 bit    | |
172 | |                                    |    counter.                       | |
173 | |------------------------------------+-----------------------------------| |
174 | |b_ModulNbr   APCI1710_32BIT_COUNTER |  The module is configured for one | |
175 | |                                    |  32-bit counter.                  | |
176 | |                                    |  - b_FirstCounterModus and        | |
177 | |                                    |    b_FirstCounterOption           | |
178 | |                                    |    configure the 32 bit counter.  | |
179 | |                                    |  - b_SecondCounterModus and       | |
180 | |                                    |    b_SecondCounterOption          | |
181 | |                                    |    are not used and have no       | |
182 | |                                    |    importance.                    | |
183 | +------------------------------------+-----------------------------------+ |
184 |                                                                            |
185 |                      Counter operating mode                                |
186 |                      ----------------------                                |
187 |                                                                            |
188 | +--------------------+-------------------------+-------------------------+ |
189 | |    Parameter       |     Passed value        |    Description          | |
190 | |--------------------+-------------------------+-------------------------| |
191 | |b_FirstCounterModus | APCI1710_QUADRUPLE_MODE | In the quadruple mode,  | |
192 | |       or           |                         | the edge analysis       | |
193 | |b_SecondCounterModus|                         | circuit generates a     | |
194 | |                    |                         | counting pulse from     | |
195 | |                    |                         | each edge of 2 signals  | |
196 | |                    |                         | which are phase shifted | |
197 | |                    |                         | in relation to each     | |
198 | |                    |                         | other.                  | |
199 | |--------------------+-------------------------+-------------------------| |
200 | |b_FirstCounterModus |   APCI1710_DOUBLE_MODE  | Functions in the same   | |
201 | |       or           |                         | way as the quadruple    | |
202 | |b_SecondCounterModus|                         | mode, except that only  | |
203 | |                    |                         | two of the four edges   | |
204 | |                    |                         | are analysed per        | |
205 | |                    |                         | period                  | |
206 | |--------------------+-------------------------+-------------------------| |
207 | |b_FirstCounterModus |   APCI1710_SIMPLE_MODE  | Functions in the same   | |
208 | |       or           |                         | way as the quadruple    | |
209 | |b_SecondCounterModus|                         | mode, except that only  | |
210 | |                    |                         | one of the four edges   | |
211 | |                    |                         | is analysed per         | |
212 | |                    |                         | period.                 | |
213 | |--------------------+-------------------------+-------------------------| |
214 | |b_FirstCounterModus |   APCI1710_DIRECT_MODE  | In the direct mode the  | |
215 | |       or           |                         | both edge analysis      | |
216 | |b_SecondCounterModus|                         | circuits are inactive.  | |
217 | |                    |                         | The inputs A, B in the  | |
218 | |                    |                         | 32-bit mode or A, B and | |
219 | |                    |                         | C, D in the 16-bit mode | |
220 | |                    |                         | represent, each, one    | |
221 | |                    |                         | clock pulse gate circuit| |
222 | |                    |                         | There by frequency and  | |
223 | |                    |                         | pulse duration          | |
224 | |                    |                         | measurements can be     | |
225 | |                    |                         | performed.              | |
226 | +--------------------+-------------------------+-------------------------+ |
227 |                                                                            |
228 |                                                                            |
229 |       IMPORTANT!                                                           |
230 |       If you have configured the module for two 16-bit counter, a mixed    |
231 |       mode with a counter in quadruple/double/single mode                  |
232 |       and the other counter in direct mode is not possible!                |
233 |                                                                            |
234 |                                                                            |
235 |         Counter operating option for quadruple/double/simple mode          |
236 |         ---------------------------------------------------------          |
237 |                                                                            |
238 | +----------------------+-------------------------+------------------------+|
239 | |       Parameter      |     Passed value        |  Description           ||
240 | |----------------------+-------------------------+------------------------||
241 | |b_FirstCounterOption  | APCI1710_HYSTERESIS_ON  | In both edge analysis  ||
242 | |        or            |                         | circuits is available  ||
243 | |b_SecondCounterOption |                         | one hysteresis circuit.||
244 | |                      |                         | It suppresses each     ||
245 | |                      |                         | time the first counting||
246 | |                      |                         | pulse after a change   ||
247 | |                      |                         | of rotation.           ||
248 | |----------------------+-------------------------+------------------------||
249 | |b_FirstCounterOption  | APCI1710_HYSTERESIS_OFF | The first counting     ||
250 | |       or             |                         | pulse is not suppress  ||
251 | |b_SecondCounterOption |                         | after a change of      ||
252 | |                      |                         | rotation.              ||
253 | +----------------------+-------------------------+------------------------+|
254 |                                                                            |
255 |                                                                            |
256 |       IMPORTANT!                                                           |
257 |       This option are only avaible if you have selected the direct mode.   |
258 |                                                                            |
259 |                                                                            |
260 |               Counter operating option for direct mode                     |
261 |               ----------------------------------------                     |
262 |                                                                            |
263 | +----------------------+--------------------+----------------------------+ |
264 | |      Parameter       |     Passed value   |       Description          | |
265 | |----------------------+--------------------+----------------------------| |
266 | |b_FirstCounterOption  | APCI1710_INCREMENT | The counter increment for  | |
267 | |       or             |                    | each counting pulse        | |
268 | |b_SecondCounterOption |                    |                            | |
269 | |----------------------+--------------------+----------------------------| |
270 | |b_FirstCounterOption  | APCI1710_DECREMENT | The counter decrement for  | |
271 | |       or             |                    | each counting pulse        | |
272 | |b_SecondCounterOption |                    |                            | |
273 | +----------------------+--------------------+----------------------------+ |
274 |                                                                            |
275 +----------------------------------------------------------------------------+
276 | Input Parameters  : unsigned char_ b_BoardHandle         : Handle of board APCI-1710|
277 |                     unsigned char_ b_ModulNbr            : Module number to         |
278 |                                                   configure (0 to 3)       |
279 |                     unsigned char_ b_CounterRange        : Selection form counter   |
280 |                                                   range.                   |
281 |                     unsigned char_ b_FirstCounterModus   : First counter operating  |
282 |                                                   mode.                    |
283 |                     unsigned char_ b_FirstCounterOption  : First counter  option.   |
284 |                     unsigned char_ b_SecondCounterModus  : Second counter operating |
285 |                                                   mode.                    |
286 |                     unsigned char_ b_SecondCounterOption : Second counter  option.  |
287 +----------------------------------------------------------------------------+
288 | Output Parameters : -                                                      |
289 +----------------------------------------------------------------------------+
290 | Return Value      : 0: No error                                            |
291 |                    -1: The handle parameter of the board is wrong          |
292 |                    -2: The module is not a counter module                  |
293 |                    -3: The selected counter range is wrong.                |
294 |                    -4: The selected first counter operating mode is wrong. |
295 |                    -5: The selected first counter operating option is wrong|
296 |                    -6: The selected second counter operating mode is wrong.|
297 |                    -7: The selected second counter operating option is     |
298 |                        wrong.                                              |
299 +----------------------------------------------------------------------------+
300 */
301
302 int i_APCI1710_InitCounter(struct comedi_device *dev,
303         unsigned char b_ModulNbr,
304         unsigned char b_CounterRange,
305         unsigned char b_FirstCounterModus,
306         unsigned char b_FirstCounterOption,
307         unsigned char b_SecondCounterModus, unsigned char b_SecondCounterOption)
308 {
309         int i_ReturnValue = 0;
310
311         /*******************************/
312         /* Test if incremental counter */
313         /*******************************/
314
315         if ((devpriv->s_BoardInfos.
316                         dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF0000UL) ==
317                 APCI1710_INCREMENTAL_COUNTER) {
318            /**************************/
319                 /* Test the counter range */
320            /**************************/
321
322                 if (b_CounterRange == APCI1710_16BIT_COUNTER
323                         || b_CounterRange == APCI1710_32BIT_COUNTER) {
324               /********************************/
325                         /* Test the first counter modus */
326               /********************************/
327
328                         if (b_FirstCounterModus == APCI1710_QUADRUPLE_MODE ||
329                                 b_FirstCounterModus == APCI1710_DOUBLE_MODE ||
330                                 b_FirstCounterModus == APCI1710_SIMPLE_MODE ||
331                                 b_FirstCounterModus == APCI1710_DIRECT_MODE) {
332                  /*********************************/
333                                 /* Test the first counter option */
334                  /*********************************/
335
336                                 if ((b_FirstCounterModus == APCI1710_DIRECT_MODE
337                                                 && (b_FirstCounterOption ==
338                                                         APCI1710_INCREMENT
339                                                         || b_FirstCounterOption
340                                                         == APCI1710_DECREMENT))
341                                         || (b_FirstCounterModus !=
342                                                 APCI1710_DIRECT_MODE
343                                                 && (b_FirstCounterOption ==
344                                                         APCI1710_HYSTERESIS_ON
345                                                         || b_FirstCounterOption
346                                                         ==
347                                                         APCI1710_HYSTERESIS_OFF)))
348                                 {
349                     /**************************/
350                                         /* Test if 16-bit counter */
351                     /**************************/
352
353                                         if (b_CounterRange ==
354                                                 APCI1710_16BIT_COUNTER) {
355                        /*********************************/
356                                                 /* Test the second counter modus */
357                        /*********************************/
358
359                                                 if ((b_FirstCounterModus !=
360                                                                 APCI1710_DIRECT_MODE
361                                                                 &&
362                                                                 (b_SecondCounterModus
363                                                                         ==
364                                                                         APCI1710_QUADRUPLE_MODE
365                                                                         ||
366                                                                         b_SecondCounterModus
367                                                                         ==
368                                                                         APCI1710_DOUBLE_MODE
369                                                                         ||
370                                                                         b_SecondCounterModus
371                                                                         ==
372                                                                         APCI1710_SIMPLE_MODE))
373                                                         || (b_FirstCounterModus
374                                                                 ==
375                                                                 APCI1710_DIRECT_MODE
376                                                                 &&
377                                                                 b_SecondCounterModus
378                                                                 ==
379                                                                 APCI1710_DIRECT_MODE))
380                                                 {
381                           /**********************************/
382                                                         /* Test the second counter option */
383                           /**********************************/
384
385                                                         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))) {
386                                                                 i_ReturnValue =
387                                                                         0;
388                                                         } else {
389                              /*********************************************************/
390                                                                 /* The selected second counter operating option is wrong */
391                              /*********************************************************/
392
393                                                                 DPRINTK("The selected second counter operating option is wrong\n");
394                                                                 i_ReturnValue =
395                                                                         -7;
396                                                         }
397                                                 } else {
398                           /*******************************************************/
399                                                         /* The selected second counter operating mode is wrong */
400                           /*******************************************************/
401
402                                                         DPRINTK("The selected second counter operating mode is wrong\n");
403                                                         i_ReturnValue = -6;
404                                                 }
405                                         }
406                                 } else {
407                     /********************************************************/
408                                         /* The selected first counter operating option is wrong */
409                     /********************************************************/
410
411                                         DPRINTK("The selected first counter operating option is wrong\n");
412                                         i_ReturnValue = -5;
413                                 }
414                         } else {
415                  /******************************************************/
416                                 /* The selected first counter operating mode is wrong */
417                  /******************************************************/
418                                 DPRINTK("The selected first counter operating mode is wrong\n");
419                                 i_ReturnValue = -4;
420                         }
421                 } else {
422               /***************************************/
423                         /* The selected counter range is wrong */
424               /***************************************/
425
426                         DPRINTK("The selected counter range is wrong\n");
427                         i_ReturnValue = -3;
428                 }
429
430            /*************************/
431                 /* Test if a error occur */
432            /*************************/
433
434                 if (i_ReturnValue == 0) {
435               /**************************/
436                         /* Test if 16-Bit counter */
437               /**************************/
438
439                         if (b_CounterRange == APCI1710_32BIT_COUNTER) {
440                                 devpriv->
441                                         s_ModuleInfo[b_ModulNbr].
442                                         s_SiemensCounterInfo.
443                                         s_ModeRegister.
444                                         s_ByteModeRegister.
445                                         b_ModeRegister1 = b_CounterRange |
446                                         b_FirstCounterModus |
447                                         b_FirstCounterOption;
448                         } else {
449                                 devpriv->
450                                         s_ModuleInfo[b_ModulNbr].
451                                         s_SiemensCounterInfo.
452                                         s_ModeRegister.
453                                         s_ByteModeRegister.
454                                         b_ModeRegister1 = b_CounterRange |
455                                         (b_FirstCounterModus & 0x5) |
456                                         (b_FirstCounterOption & 0x20) |
457                                         (b_SecondCounterModus & 0xA) |
458                                         (b_SecondCounterOption & 0x40);
459
460                  /***********************/
461                                 /* Test if direct mode */
462                  /***********************/
463
464                                 if (b_FirstCounterModus == APCI1710_DIRECT_MODE) {
465                                         devpriv->
466                                                 s_ModuleInfo[b_ModulNbr].
467                                                 s_SiemensCounterInfo.
468                                                 s_ModeRegister.
469                                                 s_ByteModeRegister.
470                                                 b_ModeRegister1 = devpriv->
471                                                 s_ModuleInfo[b_ModulNbr].
472                                                 s_SiemensCounterInfo.
473                                                 s_ModeRegister.
474                                                 s_ByteModeRegister.
475                                                 b_ModeRegister1 |
476                                                 APCI1710_DIRECT_MODE;
477                                 }
478                         }
479
480               /***************************/
481                         /* Write the configuration */
482               /***************************/
483
484                         outl(devpriv->s_ModuleInfo[b_ModulNbr].
485                                 s_SiemensCounterInfo.
486                                 s_ModeRegister.
487                                 dw_ModeRegister1_2_3_4,
488                                 devpriv->s_BoardInfos.
489                                 ui_Address + 20 + (64 * b_ModulNbr));
490
491                         devpriv->
492                                 s_ModuleInfo[b_ModulNbr].
493                                 s_SiemensCounterInfo.
494                                 s_InitFlag.b_CounterInit = 1;
495                 }
496         } else {
497            /**************************************/
498                 /* The module is not a counter module */
499            /**************************************/
500
501                 DPRINTK("The module is not a counter module\n");
502                 i_ReturnValue = -2;
503         }
504
505         return i_ReturnValue;
506 }
507
508 /*
509 +----------------------------------------------------------------------------+
510 | Function Name     : _INT_ i_APCI1710_CounterAutoTest                       |
511 |                                               (unsigned char_     b_BoardHandle,    |
512 |                                                unsigned char *_   pb_TestStatus)     |
513 +----------------------------------------------------------------------------+
514 | Task              : A test mode is intended for testing the component and  |
515 |                     the connected periphery. All the 8-bit counter chains  |
516 |                     are operated internally as down counters.              |
517 |                     Independently from the external signals,               |
518 |                     all the four 8-bit counter chains are decremented in   |
519 |                     parallel by each negative clock pulse edge of CLKX.    |
520 |                                                                            |
521 |                       Counter auto test conclusion                         |
522 |                       ----------------------------                         |
523 |              +-----------------+-----------------------------+             |
524 |              | pb_TestStatus   |    Error description        |             |
525 |              |     mask        |                             |             |
526 |              |-----------------+-----------------------------|             |
527 |              |    0000         |     No error detected       |             |
528 |              |-----------------|-----------------------------|             |
529 |              |    0001         | Error detected of counter 0 |             |
530 |              |-----------------|-----------------------------|             |
531 |              |    0010         | Error detected of counter 1 |             |
532 |              |-----------------|-----------------------------|             |
533 |              |    0100         | Error detected of counter 2 |             |
534 |              |-----------------|-----------------------------|             |
535 |              |    1000         | Error detected of counter 3 |             |
536 |              +-----------------+-----------------------------+             |
537 +----------------------------------------------------------------------------+
538 | Input Parameters  : unsigned char_   b_BoardHandle : Handle of board APCI-1710      |  |
539 +----------------------------------------------------------------------------+
540 | Output Parameters : unsigned char *_ pb_TestStatus  : Auto test conclusion. See table|
541 +----------------------------------------------------------------------------+
542 | Return Value      :  0: No error                                           |
543 |                     -1: The handle parameter of the board is wrong         |
544 |                     -2: No counter module found                            |
545 +----------------------------------------------------------------------------+
546 */
547
548 int i_APCI1710_CounterAutoTest(struct comedi_device *dev, unsigned char *pb_TestStatus)
549 {
550         unsigned char b_ModulCpt = 0;
551         int i_ReturnValue = 0;
552         unsigned int dw_LathchValue;
553
554         *pb_TestStatus = 0;
555
556         /********************************/
557         /* Test if counter module found */
558         /********************************/
559
560         if ((devpriv->s_BoardInfos.
561                         dw_MolduleConfiguration[0] & 0xFFFF0000UL) ==
562                 APCI1710_INCREMENTAL_COUNTER
563                 || (devpriv->s_BoardInfos.
564                         dw_MolduleConfiguration[1] & 0xFFFF0000UL) ==
565                 APCI1710_INCREMENTAL_COUNTER
566                 || (devpriv->s_BoardInfos.
567                         dw_MolduleConfiguration[2] & 0xFFFF0000UL) ==
568                 APCI1710_INCREMENTAL_COUNTER
569                 || (devpriv->s_BoardInfos.
570                         dw_MolduleConfiguration[3] & 0xFFFF0000UL) ==
571                 APCI1710_INCREMENTAL_COUNTER) {
572                 for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) {
573               /*******************************/
574                         /* Test if incremental counter */
575               /*******************************/
576
577                         if ((devpriv->s_BoardInfos.
578                                         dw_MolduleConfiguration[b_ModulCpt] &
579                                         0xFFFF0000UL) ==
580                                 APCI1710_INCREMENTAL_COUNTER) {
581                  /******************/
582                                 /* Start the test */
583                  /******************/
584
585                                 outl(3, devpriv->s_BoardInfos.
586                                         ui_Address + 16 + (64 * b_ModulCpt));
587
588                  /*********************/
589                                 /* Tatch the counter */
590                  /*********************/
591
592                                 outl(1, devpriv->s_BoardInfos.
593                                         ui_Address + (64 * b_ModulCpt));
594
595                  /************************/
596                                 /* Read the latch value */
597                  /************************/
598
599                                 dw_LathchValue = inl(devpriv->s_BoardInfos.
600                                         ui_Address + 4 + (64 * b_ModulCpt));
601
602                                 if ((dw_LathchValue & 0xFF) !=
603                                         ((dw_LathchValue >> 8) & 0xFF)
604                                         && (dw_LathchValue & 0xFF) !=
605                                         ((dw_LathchValue >> 16) & 0xFF)
606                                         && (dw_LathchValue & 0xFF) !=
607                                         ((dw_LathchValue >> 24) & 0xFF)) {
608                                         *pb_TestStatus =
609                                                 *pb_TestStatus | (1 <<
610                                                 b_ModulCpt);
611                                 }
612
613                  /*****************/
614                                 /* Stop the test */
615                  /*****************/
616
617                                 outl(0, devpriv->s_BoardInfos.
618                                         ui_Address + 16 + (64 * b_ModulCpt));
619                         }
620                 }
621         } else {
622            /***************************/
623                 /* No counter module found */
624            /***************************/
625
626                 DPRINTK("No counter module found\n");
627                 i_ReturnValue = -2;
628         }
629
630         return i_ReturnValue;
631 }
632
633 /*
634 +----------------------------------------------------------------------------+
635 | Function Name     : _INT_ i_APCI1710_InitIndex (unsigned char_ b_BoardHandle,       |
636 |                                                 unsigned char_ b_ModulNbr,          |
637 |                                                 unsigned char_ b_ReferenceAction,   |
638 |                                                 unsigned char_ b_IndexOperation,    |
639 |                                                 unsigned char_ b_AutoMode,          |
640 |                                                 unsigned char_ b_InterruptEnable)   |
641 +----------------------------------------------------------------------------+
642 | Task              : Initialise the index corresponding to the selected     |
643 |                     module (b_ModulNbr). If a INDEX flag occur, you have   |
644 |                     the possibility to clear the 32-Bit counter or to latch|
645 |                     the current 32-Bit value in to the first latch         |
646 |                     register. The b_IndexOperation parameter give the      |
647 |                     possibility to choice the INDEX action.                |
648 |                     If you have enabled the automatic mode, each INDEX     |
649 |                     action is cleared automatically, else you must read    |
650 |                     the index status ("i_APCI1710_ReadIndexStatus")        |
651 |                     after each INDEX action.                               |
652 |                                                                            |
653 |                                                                            |
654 |                               Index action                                 |
655 |                               ------------                                 |
656 |                                                                            |
657 |           +------------------------+------------------------------------+  |
658 |           |   b_IndexOperation     |         Operation                  |  |
659 |           |------------------------+------------------------------------|  |
660 |           |APCI1710_LATCH_COUNTER  | After a index signal, the counter  |  |
661 |           |                        | value (32-Bit) is latched in to    |  |
662 |           |                        | the first latch register           |  |
663 |           |------------------------|------------------------------------|  |
664 |           |APCI1710_CLEAR_COUNTER  | After a index signal, the counter  |  |
665 |           |                        | value is cleared (32-Bit)          |  |
666 |           +------------------------+------------------------------------+  |
667 +----------------------------------------------------------------------------+
668 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
669 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
670 |                                               (0 to 3)                     |
671 |                     unsigned char_ b_ReferenceAction : Determine if the reference   |
672 |                                               must set or no for the       |
673 |                                               acceptance from index        |
674 |                                               APCI1710_ENABLE :            |
675 |                                                  Reference must be set for |
676 |                                                  accepted the index        |
677 |                                               APCI1710_DISABLE :           |
678 |                                                  Reference have not        |
679 |                                                  importance                |
680 |                     unsigned char_ b_IndexOperation  : Index operating mode.        |
681 |                                               See table.                   |
682 |                     unsigned char_ b_AutoMode        : Enable or disable the        |
683 |                                               automatic index reset.       |
684 |                                               APCI1710_ENABLE :            |
685 |                                                 Enable the automatic mode  |
686 |                                               APCI1710_DISABLE :           |
687 |                                                 Disable the automatic mode |
688 |                     unsigned char_ b_InterruptEnable : Enable or disable the        |
689 |                                               interrupt.                   |
690 |                                               APCI1710_ENABLE :            |
691 |                                               Enable the interrupt         |
692 |                                               APCI1710_DISABLE :           |
693 |                                               Disable the interrupt        |
694 +----------------------------------------------------------------------------+
695 | Output Parameters : -                                                      |
696 +----------------------------------------------------------------------------+
697 | Return Value      :  0: No error                                           |
698 |                     -1: The handle parameter of the board is wrong         |
699 |                     -2: No counter module found                            |
700 |                     -3: Counter not initialised see function               |
701 |                         "i_APCI1710_InitCounter"                           |
702 |                     -4  The reference action parameter is wrong            |
703 |                     -5: The index operating mode parameter is wrong        |
704 |                     -6: The auto mode parameter is wrong                   |
705 |                     -7: Interrupt parameter is wrong                       |
706 |                     -8: Interrupt function not initialised.                |
707 |                         See function "i_APCI1710_SetBoardIntRoutineX"      |
708 +----------------------------------------------------------------------------+
709 */
710
711 int i_APCI1710_InitIndex(struct comedi_device *dev,
712         unsigned char b_ModulNbr,
713         unsigned char b_ReferenceAction,
714         unsigned char b_IndexOperation, unsigned char b_AutoMode, unsigned char b_InterruptEnable)
715 {
716         int i_ReturnValue = 0;
717
718         /**************************/
719         /* Test the module number */
720         /**************************/
721
722         if (b_ModulNbr < 4) {
723            /*******************************/
724                 /* Test if counter initialised */
725            /*******************************/
726
727                 if (devpriv->
728                         s_ModuleInfo[b_ModulNbr].
729                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
730               /********************************/
731                         /* Test the reference parameter */
732               /********************************/
733
734                         if (b_ReferenceAction == APCI1710_ENABLE ||
735                                 b_ReferenceAction == APCI1710_DISABLE) {
736                  /****************************/
737                                 /* Test the index parameter */
738                  /****************************/
739
740                                 if (b_IndexOperation ==
741                                         APCI1710_HIGH_EDGE_LATCH_COUNTER
742                                         || b_IndexOperation ==
743                                         APCI1710_LOW_EDGE_LATCH_COUNTER
744                                         || b_IndexOperation ==
745                                         APCI1710_HIGH_EDGE_CLEAR_COUNTER
746                                         || b_IndexOperation ==
747                                         APCI1710_LOW_EDGE_CLEAR_COUNTER
748                                         || b_IndexOperation ==
749                                         APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER
750                                         || b_IndexOperation ==
751                                         APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
752                                 {
753                     /********************************/
754                                         /* Test the auto mode parameter */
755                     /********************************/
756
757                                         if (b_AutoMode == APCI1710_ENABLE ||
758                                                 b_AutoMode == APCI1710_DISABLE)
759                                         {
760                        /***************************/
761                                                 /* Test the interrupt mode */
762                        /***************************/
763
764                                                 if (b_InterruptEnable ==
765                                                         APCI1710_ENABLE
766                                                         || b_InterruptEnable ==
767                                                         APCI1710_DISABLE) {
768
769                              /************************************/
770                                                         /* Makte the configuration commando */
771                              /************************************/
772
773                                                         if (b_ReferenceAction ==
774                                                                 APCI1710_ENABLE)
775                                                         {
776                                                                 devpriv->
777                                                                         s_ModuleInfo
778                                                                         [b_ModulNbr].
779                                                                         s_SiemensCounterInfo.
780                                                                         s_ModeRegister.
781                                                                         s_ByteModeRegister.
782                                                                         b_ModeRegister2
783                                                                         =
784                                                                         devpriv->
785                                                                         s_ModuleInfo
786                                                                         [b_ModulNbr].
787                                                                         s_SiemensCounterInfo.
788                                                                         s_ModeRegister.
789                                                                         s_ByteModeRegister.
790                                                                         b_ModeRegister2
791                                                                         |
792                                                                         APCI1710_ENABLE_INDEX_ACTION;
793                                                         } else {
794                                                                 devpriv->
795                                                                         s_ModuleInfo
796                                                                         [b_ModulNbr].
797                                                                         s_SiemensCounterInfo.
798                                                                         s_ModeRegister.
799                                                                         s_ByteModeRegister.
800                                                                         b_ModeRegister2
801                                                                         =
802                                                                         devpriv->
803                                                                         s_ModuleInfo
804                                                                         [b_ModulNbr].
805                                                                         s_SiemensCounterInfo.
806                                                                         s_ModeRegister.
807                                                                         s_ByteModeRegister.
808                                                                         b_ModeRegister2
809                                                                         &
810                                                                         APCI1710_DISABLE_INDEX_ACTION;
811                                                         }
812
813                              /****************************************/
814                                                         /* Test if low level latch or/and clear */
815                              /****************************************/
816
817                                                         if (b_IndexOperation ==
818                                                                 APCI1710_LOW_EDGE_LATCH_COUNTER
819                                                                 ||
820                                                                 b_IndexOperation
821                                                                 ==
822                                                                 APCI1710_LOW_EDGE_CLEAR_COUNTER
823                                                                 ||
824                                                                 b_IndexOperation
825                                                                 ==
826                                                                 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
827                                                         {
828                                 /*************************************/
829                                                                 /* Set the index level to low (DQ26) */
830                                 /*************************************/
831
832                                                                 devpriv->
833                                                                         s_ModuleInfo
834                                                                         [b_ModulNbr].
835                                                                         s_SiemensCounterInfo.
836                                                                         s_ModeRegister.
837                                                                         s_ByteModeRegister.
838                                                                         b_ModeRegister4
839                                                                         =
840                                                                         devpriv->
841                                                                         s_ModuleInfo
842                                                                         [b_ModulNbr].
843                                                                         s_SiemensCounterInfo.
844                                                                         s_ModeRegister.
845                                                                         s_ByteModeRegister.
846                                                                         b_ModeRegister4
847                                                                         |
848                                                                         APCI1710_SET_LOW_INDEX_LEVEL;
849                                                         } else {
850                                 /**************************************/
851                                                                 /* Set the index level to high (DQ26) */
852                                 /**************************************/
853
854                                                                 devpriv->
855                                                                         s_ModuleInfo
856                                                                         [b_ModulNbr].
857                                                                         s_SiemensCounterInfo.
858                                                                         s_ModeRegister.
859                                                                         s_ByteModeRegister.
860                                                                         b_ModeRegister4
861                                                                         =
862                                                                         devpriv->
863                                                                         s_ModuleInfo
864                                                                         [b_ModulNbr].
865                                                                         s_SiemensCounterInfo.
866                                                                         s_ModeRegister.
867                                                                         s_ByteModeRegister.
868                                                                         b_ModeRegister4
869                                                                         &
870                                                                         APCI1710_SET_HIGH_INDEX_LEVEL;
871                                                         }
872
873                              /***********************************/
874                                                         /* Test if latch and clear counter */
875                              /***********************************/
876
877                                                         if (b_IndexOperation ==
878                                                                 APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER
879                                                                 ||
880                                                                 b_IndexOperation
881                                                                 ==
882                                                                 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
883                                                         {
884                                 /***************************************/
885                                                                 /* Set the latch and clear flag (DQ27) */
886                                 /***************************************/
887
888                                                                 devpriv->
889                                                                         s_ModuleInfo
890                                                                         [b_ModulNbr].
891                                                                         s_SiemensCounterInfo.
892                                                                         s_ModeRegister.
893                                                                         s_ByteModeRegister.
894                                                                         b_ModeRegister4
895                                                                         =
896                                                                         devpriv->
897                                                                         s_ModuleInfo
898                                                                         [b_ModulNbr].
899                                                                         s_SiemensCounterInfo.
900                                                                         s_ModeRegister.
901                                                                         s_ByteModeRegister.
902                                                                         b_ModeRegister4
903                                                                         |
904                                                                         APCI1710_ENABLE_LATCH_AND_CLEAR;
905                                                         }       /*  if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) */
906                                                         else {
907                                 /*****************************************/
908                                                                 /* Clear the latch and clear flag (DQ27) */
909                                 /*****************************************/
910
911                                                                 devpriv->
912                                                                         s_ModuleInfo
913                                                                         [b_ModulNbr].
914                                                                         s_SiemensCounterInfo.
915                                                                         s_ModeRegister.
916                                                                         s_ByteModeRegister.
917                                                                         b_ModeRegister4
918                                                                         =
919                                                                         devpriv->
920                                                                         s_ModuleInfo
921                                                                         [b_ModulNbr].
922                                                                         s_SiemensCounterInfo.
923                                                                         s_ModeRegister.
924                                                                         s_ByteModeRegister.
925                                                                         b_ModeRegister4
926                                                                         &
927                                                                         APCI1710_DISABLE_LATCH_AND_CLEAR;
928
929                                 /*************************/
930                                                                 /* Test if latch counter */
931                                 /*************************/
932
933                                                                 if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_COUNTER) {
934                                    /*********************************/
935                                                                         /* Enable the latch from counter */
936                                    /*********************************/
937
938                                                                         devpriv->
939                                                                                 s_ModuleInfo
940                                                                                 [b_ModulNbr].
941                                                                                 s_SiemensCounterInfo.
942                                                                                 s_ModeRegister.
943                                                                                 s_ByteModeRegister.
944                                                                                 b_ModeRegister2
945                                                                                 =
946                                                                                 devpriv->
947                                                                                 s_ModuleInfo
948                                                                                 [b_ModulNbr].
949                                                                                 s_SiemensCounterInfo.
950                                                                                 s_ModeRegister.
951                                                                                 s_ByteModeRegister.
952                                                                                 b_ModeRegister2
953                                                                                 |
954                                                                                 APCI1710_INDEX_LATCH_COUNTER;
955                                                                 } else {
956                                    /*********************************/
957                                                                         /* Enable the clear from counter */
958                                    /*********************************/
959
960                                                                         devpriv->
961                                                                                 s_ModuleInfo
962                                                                                 [b_ModulNbr].
963                                                                                 s_SiemensCounterInfo.
964                                                                                 s_ModeRegister.
965                                                                                 s_ByteModeRegister.
966                                                                                 b_ModeRegister2
967                                                                                 =
968                                                                                 devpriv->
969                                                                                 s_ModuleInfo
970                                                                                 [b_ModulNbr].
971                                                                                 s_SiemensCounterInfo.
972                                                                                 s_ModeRegister.
973                                                                                 s_ByteModeRegister.
974                                                                                 b_ModeRegister2
975                                                                                 &
976                                                                                 (~APCI1710_INDEX_LATCH_COUNTER);
977                                                                 }
978                                                         }       /*  // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) */
979
980                                                         if (b_AutoMode ==
981                                                                 APCI1710_DISABLE)
982                                                         {
983                                                                 devpriv->
984                                                                         s_ModuleInfo
985                                                                         [b_ModulNbr].
986                                                                         s_SiemensCounterInfo.
987                                                                         s_ModeRegister.
988                                                                         s_ByteModeRegister.
989                                                                         b_ModeRegister2
990                                                                         =
991                                                                         devpriv->
992                                                                         s_ModuleInfo
993                                                                         [b_ModulNbr].
994                                                                         s_SiemensCounterInfo.
995                                                                         s_ModeRegister.
996                                                                         s_ByteModeRegister.
997                                                                         b_ModeRegister2
998                                                                         |
999                                                                         APCI1710_INDEX_AUTO_MODE;
1000                                                         } else {
1001                                                                 devpriv->
1002                                                                         s_ModuleInfo
1003                                                                         [b_ModulNbr].
1004                                                                         s_SiemensCounterInfo.
1005                                                                         s_ModeRegister.
1006                                                                         s_ByteModeRegister.
1007                                                                         b_ModeRegister2
1008                                                                         =
1009                                                                         devpriv->
1010                                                                         s_ModuleInfo
1011                                                                         [b_ModulNbr].
1012                                                                         s_SiemensCounterInfo.
1013                                                                         s_ModeRegister.
1014                                                                         s_ByteModeRegister.
1015                                                                         b_ModeRegister2
1016                                                                         &
1017                                                                         (~APCI1710_INDEX_AUTO_MODE);
1018                                                         }
1019
1020                                                         if (b_InterruptEnable ==
1021                                                                 APCI1710_ENABLE)
1022                                                         {
1023                                                                 devpriv->
1024                                                                         s_ModuleInfo
1025                                                                         [b_ModulNbr].
1026                                                                         s_SiemensCounterInfo.
1027                                                                         s_ModeRegister.
1028                                                                         s_ByteModeRegister.
1029                                                                         b_ModeRegister3
1030                                                                         =
1031                                                                         devpriv->
1032                                                                         s_ModuleInfo
1033                                                                         [b_ModulNbr].
1034                                                                         s_SiemensCounterInfo.
1035                                                                         s_ModeRegister.
1036                                                                         s_ByteModeRegister.
1037                                                                         b_ModeRegister3
1038                                                                         |
1039                                                                         APCI1710_ENABLE_INDEX_INT;
1040                                                         } else {
1041                                                                 devpriv->
1042                                                                         s_ModuleInfo
1043                                                                         [b_ModulNbr].
1044                                                                         s_SiemensCounterInfo.
1045                                                                         s_ModeRegister.
1046                                                                         s_ByteModeRegister.
1047                                                                         b_ModeRegister3
1048                                                                         =
1049                                                                         devpriv->
1050                                                                         s_ModuleInfo
1051                                                                         [b_ModulNbr].
1052                                                                         s_SiemensCounterInfo.
1053                                                                         s_ModeRegister.
1054                                                                         s_ByteModeRegister.
1055                                                                         b_ModeRegister3
1056                                                                         &
1057                                                                         APCI1710_DISABLE_INDEX_INT;
1058                                                         }
1059
1060                                                         devpriv->
1061                                                                 s_ModuleInfo
1062                                                                 [b_ModulNbr].
1063                                                                 s_SiemensCounterInfo.
1064                                                                 s_InitFlag.
1065                                                                 b_IndexInit = 1;
1066
1067                                                 } else {
1068                           /********************************/
1069                                                         /* Interrupt parameter is wrong */
1070                           /********************************/
1071                                                         DPRINTK("Interrupt parameter is wrong\n");
1072                                                         i_ReturnValue = -7;
1073                                                 }
1074                                         } else {
1075                        /************************************/
1076                                                 /* The auto mode parameter is wrong */
1077                        /************************************/
1078
1079                                                 DPRINTK("The auto mode parameter is wrong\n");
1080                                                 i_ReturnValue = -6;
1081                                         }
1082                                 } else {
1083                     /***********************************************/
1084                                         /* The index operating mode parameter is wrong */
1085                     /***********************************************/
1086
1087                                         DPRINTK("The index operating mode parameter is wrong\n");
1088                                         i_ReturnValue = -5;
1089                                 }
1090                         } else {
1091                  /*******************************************/
1092                                 /* The reference action parameter is wrong */
1093                  /*******************************************/
1094
1095                                 DPRINTK("The reference action parameter is wrong\n");
1096                                 i_ReturnValue = -4;
1097                         }
1098                 } else {
1099               /****************************************/
1100                         /* Counter not initialised see function */
1101                         /* "i_APCI1710_InitCounter"             */
1102               /****************************************/
1103
1104                         DPRINTK("Counter not initialised\n");
1105                         i_ReturnValue = -3;
1106                 }
1107         } else {
1108            /*************************************************/
1109                 /* The selected module number parameter is wrong */
1110            /*************************************************/
1111
1112                 DPRINTK("The selected module number parameter is wrong\n");
1113                 i_ReturnValue = -2;
1114         }
1115
1116         return i_ReturnValue;
1117 }
1118
1119 /*
1120 +----------------------------------------------------------------------------+
1121 | Function Name     : _INT_ i_APCI1710_InitReference                         |
1122 |                                                (unsigned char_ b_BoardHandle,       |
1123 |                                                 unsigned char_ b_ModulNbr,          |
1124 |                                                 unsigned char_ b_ReferenceLevel)    |
1125 +----------------------------------------------------------------------------+
1126 | Task              : Initialise the reference corresponding to the selected |
1127 |                     module (b_ModulNbr).                                   |
1128 |                                                                            |
1129 |                               Reference level                              |
1130 |                               ---------------                              |
1131 |             +--------------------+-------------------------+               |
1132 |             | b_ReferenceLevel   |         Operation       |               |
1133 |             +--------------------+-------------------------+               |
1134 |             |   APCI1710_LOW     |  Reference occur if "0" |               |
1135 |             |--------------------|-------------------------|               |
1136 |             |   APCI1710_HIGH    |  Reference occur if "1" |               |
1137 |             +--------------------+-------------------------+               |
1138 +----------------------------------------------------------------------------+
1139 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
1140 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
1141 |                                               (0 to 3)                     |
1142 |                     unsigned char_ b_ReferenceLevel  : Reference level.             |
1143 +----------------------------------------------------------------------------+
1144 | Output Parameters : -                                                      |
1145 +----------------------------------------------------------------------------+
1146 | Return Value      :  0: No error                                           |
1147 |                     -1: The handle parameter of the board is wrong         |
1148 |                     -2: The selected module number parameter is wrong      |
1149 |                     -3: Counter not initialised see function               |
1150 |                         "i_APCI1710_InitCounter"                           |
1151 |                     -4: Reference level parameter is wrong                 |
1152 +----------------------------------------------------------------------------+
1153 */
1154
1155 int i_APCI1710_InitReference(struct comedi_device *dev,
1156         unsigned char b_ModulNbr, unsigned char b_ReferenceLevel)
1157 {
1158         int i_ReturnValue = 0;
1159
1160         /**************************/
1161         /* Test the module number */
1162         /**************************/
1163
1164         if (b_ModulNbr < 4) {
1165            /*******************************/
1166                 /* Test if counter initialised */
1167            /*******************************/
1168
1169                 if (devpriv->
1170                         s_ModuleInfo[b_ModulNbr].
1171                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1172               /**************************************/
1173                         /* Test the reference level parameter */
1174               /**************************************/
1175
1176                         if (b_ReferenceLevel == 0 || b_ReferenceLevel == 1) {
1177                                 if (b_ReferenceLevel == 1) {
1178                                         devpriv->
1179                                                 s_ModuleInfo[b_ModulNbr].
1180                                                 s_SiemensCounterInfo.
1181                                                 s_ModeRegister.
1182                                                 s_ByteModeRegister.
1183                                                 b_ModeRegister2 = devpriv->
1184                                                 s_ModuleInfo[b_ModulNbr].
1185                                                 s_SiemensCounterInfo.
1186                                                 s_ModeRegister.
1187                                                 s_ByteModeRegister.
1188                                                 b_ModeRegister2 |
1189                                                 APCI1710_REFERENCE_HIGH;
1190                                 } else {
1191                                         devpriv->
1192                                                 s_ModuleInfo[b_ModulNbr].
1193                                                 s_SiemensCounterInfo.
1194                                                 s_ModeRegister.
1195                                                 s_ByteModeRegister.
1196                                                 b_ModeRegister2 = devpriv->
1197                                                 s_ModuleInfo[b_ModulNbr].
1198                                                 s_SiemensCounterInfo.
1199                                                 s_ModeRegister.
1200                                                 s_ByteModeRegister.
1201                                                 b_ModeRegister2 &
1202                                                 APCI1710_REFERENCE_LOW;
1203                                 }
1204
1205                                 outl(devpriv->s_ModuleInfo[b_ModulNbr].
1206                                         s_SiemensCounterInfo.
1207                                         s_ModeRegister.
1208                                         dw_ModeRegister1_2_3_4,
1209                                         devpriv->s_BoardInfos.ui_Address + 20 +
1210                                         (64 * b_ModulNbr));
1211
1212                                 devpriv->
1213                                         s_ModuleInfo[b_ModulNbr].
1214                                         s_SiemensCounterInfo.
1215                                         s_InitFlag.b_ReferenceInit = 1;
1216                         } else {
1217                  /**************************************/
1218                                 /* Reference level parameter is wrong */
1219                  /**************************************/
1220
1221                                 DPRINTK("Reference level parameter is wrong\n");
1222                                 i_ReturnValue = -4;
1223                         }
1224                 } else {
1225               /****************************************/
1226                         /* Counter not initialised see function */
1227                         /* "i_APCI1710_InitCounter"             */
1228               /****************************************/
1229
1230                         DPRINTK("Counter not initialised\n");
1231                         i_ReturnValue = -3;
1232                 }
1233         } else {
1234            /*************************************************/
1235                 /* The selected module number parameter is wrong */
1236            /*************************************************/
1237
1238                 DPRINTK("The selected module number parameter is wrong\n");
1239                 i_ReturnValue = -2;
1240         }
1241
1242         return i_ReturnValue;
1243 }
1244
1245 /*
1246 +----------------------------------------------------------------------------+
1247 | Function Name     : _INT_     i_APCI1710_InitExternalStrobe                |
1248 |                                       (unsigned char_ b_BoardHandle,                |
1249 |                                        unsigned char_ b_ModulNbr,                   |
1250 |                                        unsigned char_ b_ExternalStrobe,             |
1251 |                                        unsigned char_ b_ExternalStrobeLevel)        |
1252 +----------------------------------------------------------------------------+
1253 | Task              : Initialises the external strobe level corresponding to |
1254 |                     the selected module (b_ModulNbr).                      |
1255 +----------------------------------------------------------------------------+
1256 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
1257 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
1258 |                                               (0 to 3)                     |
1259 |                     unsigned char_ b_ExternalStrobe  : External strobe selection    |
1260 |                                               0 : External strobe A        |
1261 |                                               1 : External strobe B        |
1262 |                     unsigned char_ b_ExternalStrobeLevel : External strobe level    |
1263 |                                               APCI1710_LOW :               |
1264 |                                               External latch occurs if "0" |
1265 |                                               APCI1710_HIGH :              |
1266 |                                               External latch occurs if "1" |
1267 +----------------------------------------------------------------------------+
1268 | Output Parameters : -                                                      |
1269 +----------------------------------------------------------------------------+
1270 | Return Value      :  0: No error                                           |
1271 |                     -1: The handle parameter of the board is wrong         |
1272 |                     -2: The selected module number is wrong                |
1273 |                     -3: Counter not initialised.                           |
1274 |                         See function "i_APCI1710_InitCounter"              |
1275 |                     -4: External strobe selection is wrong                 |
1276 |                     -5: External strobe level parameter is wrong           |
1277 +----------------------------------------------------------------------------+
1278 */
1279
1280 int i_APCI1710_InitExternalStrobe(struct comedi_device *dev,
1281         unsigned char b_ModulNbr, unsigned char b_ExternalStrobe, unsigned char b_ExternalStrobeLevel)
1282 {
1283         int i_ReturnValue = 0;
1284
1285         /**************************/
1286         /* Test the module number */
1287         /**************************/
1288
1289         if (b_ModulNbr < 4) {
1290            /*******************************/
1291                 /* Test if counter initialised */
1292            /*******************************/
1293
1294                 if (devpriv->
1295                         s_ModuleInfo[b_ModulNbr].
1296                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1297               /**************************************/
1298                         /* Test the external strobe selection */
1299               /**************************************/
1300
1301                         if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) {
1302                  /******************/
1303                                 /* Test the level */
1304                  /******************/
1305
1306                                 if ((b_ExternalStrobeLevel == APCI1710_HIGH) ||
1307                                         ((b_ExternalStrobeLevel == APCI1710_LOW
1308                                                         && (devpriv->
1309                                                                 s_BoardInfos.
1310                                                                 dw_MolduleConfiguration
1311                                                                 [b_ModulNbr] &
1312                                                                 0xFFFF) >=
1313                                                         0x3135))) {
1314                     /*****************/
1315                                         /* Set the level */
1316                     /*****************/
1317
1318                                         devpriv->
1319                                                 s_ModuleInfo[b_ModulNbr].
1320                                                 s_SiemensCounterInfo.
1321                                                 s_ModeRegister.
1322                                                 s_ByteModeRegister.
1323                                                 b_ModeRegister4 = (devpriv->
1324                                                 s_ModuleInfo[b_ModulNbr].
1325                                                 s_SiemensCounterInfo.
1326                                                 s_ModeRegister.
1327                                                 s_ByteModeRegister.
1328                                                 b_ModeRegister4 & (0xFF -
1329                                                         (0x10 << b_ExternalStrobe))) | ((b_ExternalStrobeLevel ^ 1) << (4 + b_ExternalStrobe));
1330                                 } else {
1331                     /********************************************/
1332                                         /* External strobe level parameter is wrong */
1333                     /********************************************/
1334
1335                                         DPRINTK("External strobe level parameter is wrong\n");
1336                                         i_ReturnValue = -5;
1337                                 }
1338                         }       /*  if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) */
1339                         else {
1340                  /**************************************/
1341                                 /* External strobe selection is wrong */
1342                  /**************************************/
1343
1344                                 DPRINTK("External strobe selection is wrong\n");
1345                                 i_ReturnValue = -4;
1346                         }       /*  if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) */
1347                 } else {
1348               /****************************************/
1349                         /* Counter not initialised see function */
1350                         /* "i_APCI1710_InitCounter"             */
1351               /****************************************/
1352
1353                         DPRINTK("Counter not initialised\n");
1354                         i_ReturnValue = -3;
1355                 }
1356         } else {
1357            /*************************************************/
1358                 /* The selected module number parameter is wrong */
1359            /*************************************************/
1360
1361                 DPRINTK("The selected module number parameter is wrong\n");
1362                 i_ReturnValue = -2;
1363         }
1364
1365         return i_ReturnValue;
1366 }
1367
1368         /*
1369            +----------------------------------------------------------------------------+
1370            | Function Name     : _INT_ i_APCI1710_InitCompareLogic                      |
1371            |                               (unsigned char_   b_BoardHandle,                      |
1372            |                                unsigned char_   b_ModulNbr,                         |
1373            |                                unsigned int_  ui_CompareValue)                     |
1374            +----------------------------------------------------------------------------+
1375            | Task              : Set the 32-Bit compare value. At that moment that the  |
1376            |                     incremental counter arrive to the compare value        |
1377            |                     (ui_CompareValue) a interrupt is generated.            |
1378            +----------------------------------------------------------------------------+
1379            | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
1380            |                     unsigned char_  b_ModulNbr       : Module number to configure   |
1381            |                                               (0 to 3)                     |
1382            |                     unsigned int_ ui_CompareValue   : 32-Bit compare value         |
1383            +----------------------------------------------------------------------------+
1384            | Output Parameters : -
1385            +----------------------------------------------------------------------------+
1386            | Return Value      :  0: No error                                           |
1387            |                     -1: The handle parameter of the board is wrong         |
1388            |                     -2: No counter module found                            |
1389            |                     -3: Counter not initialised see function               |
1390            |                         "i_APCI1710_InitCounter"                           |
1391            +----------------------------------------------------------------------------+
1392          */
1393
1394 int i_APCI1710_InitCompareLogic(struct comedi_device *dev,
1395         unsigned char b_ModulNbr, unsigned int ui_CompareValue)
1396 {
1397         int i_ReturnValue = 0;
1398
1399         /**************************/
1400         /* Test the module number */
1401         /**************************/
1402
1403         if (b_ModulNbr < 4) {
1404            /*******************************/
1405                 /* Test if counter initialised */
1406            /*******************************/
1407
1408                 if (devpriv->
1409                         s_ModuleInfo[b_ModulNbr].
1410                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1411
1412                         outl(ui_CompareValue, devpriv->s_BoardInfos.
1413                                 ui_Address + 28 + (64 * b_ModulNbr));
1414
1415                         devpriv->
1416                                 s_ModuleInfo[b_ModulNbr].
1417                                 s_SiemensCounterInfo.
1418                                 s_InitFlag.b_CompareLogicInit = 1;
1419                 } else {
1420               /****************************************/
1421                         /* Counter not initialised see function */
1422                         /* "i_APCI1710_InitCounter"             */
1423               /****************************************/
1424
1425                         DPRINTK("Counter not initialised\n");
1426                         i_ReturnValue = -3;
1427                 }
1428         } else {
1429            /*************************************************/
1430                 /* The selected module number parameter is wrong */
1431            /*************************************************/
1432
1433                 DPRINTK("The selected module number parameter is wrong\n");
1434                 i_ReturnValue = -2;
1435         }
1436
1437         return i_ReturnValue;
1438 }
1439
1440 /*
1441 +----------------------------------------------------------------------------+
1442 | Function Name     : _INT_ i_APCI1710_InitFrequencyMeasurement              |
1443 |                               (unsigned char_          b_BoardHandle,              |
1444 |                                unsigned char_          b_ModulNbr,                 |
1445 |                                unsigned char_          b_PCIInputClock,            |
1446 |                                unsigned char_          b_TimingUnity,              |
1447 |                                ULONG_         ul_TimingInterval,           |
1448 |                                PULONG_       pul_RealTimingInterval)       |
1449 +----------------------------------------------------------------------------+
1450 | Task              : Sets the time for the frequency measurement.           |
1451 |                     Configures the selected TOR incremental counter of the |
1452 |                     selected module (b_ModulNbr). The ul_TimingInterval and|
1453 |                     ul_TimingUnity determine the time base for the         |
1454 |                     measurement. The pul_RealTimingInterval returns the    |
1455 |                     real time value. You must call up this function before |
1456 |                     you call up any other function which gives access to   |
1457 |                     the frequency measurement.                             |
1458 +----------------------------------------------------------------------------+
1459 | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
1460 |                     unsigned char_  b_ModulNbr              : Number of the module to be   |
1461 |                                               configured (0 to 3)          |
1462 |                     unsigned char_  b_PCIInputClock  :        Selection of the PCI bus     |
1463 |                                               clock                        |
1464 |                                               - APCI1710_30MHZ :           |
1465 |                                                 The PC has a PCI bus clock |
1466 |                                                 of 30 MHz                  |
1467 |                                               - APCI1710_33MHZ :           |
1468 |                                                 The PC has a PCI bus clock |
1469 |                                                 of 33 MHz                  |
1470 |                     unsigned char_  b_TimingUnity    : Base time unit (0 to 2)      |
1471 |                                                 0 : ns                     |
1472 |                                                 1 : æs                     |
1473 |                                                 2 : ms                     |
1474 |                     ULONG_ ul_TimingInterval: Base time value.             |
1475 +----------------------------------------------------------------------------+
1476 | Output Parameters : PULONG_ pul_RealTimingInterval : Real base time value. |
1477 +----------------------------------------------------------------------------+
1478 | Return Value      :  0: No error                                           |
1479 |                     -1: The handle parameter of the board is wrong         |
1480 |                     -2: The selected module number is wrong                |
1481 |                     -3: Counter not initialised see function               |
1482 |                         "i_APCI1710_InitCounter"                           |
1483 |                     -4: The selected PCI input clock is wrong              |
1484 |                     -5: Timing unity selection is wrong                    |
1485 |                     -6: Base timing selection is wrong                     |
1486 |                     -7: 40MHz quartz not on board                          |
1487 +----------------------------------------------------------------------------+
1488 */
1489
1490 int i_APCI1710_InitFrequencyMeasurement(struct comedi_device *dev,
1491         unsigned char b_ModulNbr,
1492         unsigned char b_PCIInputClock,
1493         unsigned char b_TimingUnity,
1494         unsigned int ul_TimingInterval, unsigned int *pul_RealTimingInterval)
1495 {
1496         int i_ReturnValue = 0;
1497         unsigned int ul_TimerValue = 0;
1498         double d_RealTimingInterval;
1499         unsigned int dw_Status = 0;
1500
1501         /**************************/
1502         /* Test the module number */
1503         /**************************/
1504
1505         if (b_ModulNbr < 4) {
1506            /*******************************/
1507                 /* Test if counter initialised */
1508            /*******************************/
1509
1510                 if (devpriv->
1511                         s_ModuleInfo[b_ModulNbr].
1512                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1513               /**************************/
1514                         /* Test the PCI bus clock */
1515               /**************************/
1516
1517                         if ((b_PCIInputClock == APCI1710_30MHZ) ||
1518                                 (b_PCIInputClock == APCI1710_33MHZ) ||
1519                                 (b_PCIInputClock == APCI1710_40MHZ)) {
1520                  /************************/
1521                                 /* Test the timing unit */
1522                  /************************/
1523
1524                                 if (b_TimingUnity <= 2) {
1525                     /**********************************/
1526                                         /* Test the base timing selection */
1527                     /**********************************/
1528
1529                                         if (((b_PCIInputClock == APCI1710_30MHZ)
1530                                                         && (b_TimingUnity == 0)
1531                                                         && (ul_TimingInterval >=
1532                                                                 266)
1533                                                         && (ul_TimingInterval <=
1534                                                                 8738133UL))
1535                                                 || ((b_PCIInputClock ==
1536                                                                 APCI1710_30MHZ)
1537                                                         && (b_TimingUnity == 1)
1538                                                         && (ul_TimingInterval >=
1539                                                                 1)
1540                                                         && (ul_TimingInterval <=
1541                                                                 8738UL))
1542                                                 || ((b_PCIInputClock ==
1543                                                                 APCI1710_30MHZ)
1544                                                         && (b_TimingUnity == 2)
1545                                                         && (ul_TimingInterval >=
1546                                                                 1)
1547                                                         && (ul_TimingInterval <=
1548                                                                 8UL))
1549                                                 || ((b_PCIInputClock ==
1550                                                                 APCI1710_33MHZ)
1551                                                         && (b_TimingUnity == 0)
1552                                                         && (ul_TimingInterval >=
1553                                                                 242)
1554                                                         && (ul_TimingInterval <=
1555                                                                 7943757UL))
1556                                                 || ((b_PCIInputClock ==
1557                                                                 APCI1710_33MHZ)
1558                                                         && (b_TimingUnity == 1)
1559                                                         && (ul_TimingInterval >=
1560                                                                 1)
1561                                                         && (ul_TimingInterval <=
1562                                                                 7943UL))
1563                                                 || ((b_PCIInputClock ==
1564                                                                 APCI1710_33MHZ)
1565                                                         && (b_TimingUnity == 2)
1566                                                         && (ul_TimingInterval >=
1567                                                                 1)
1568                                                         && (ul_TimingInterval <=
1569                                                                 7UL))
1570                                                 || ((b_PCIInputClock ==
1571                                                                 APCI1710_40MHZ)
1572                                                         && (b_TimingUnity == 0)
1573                                                         && (ul_TimingInterval >=
1574                                                                 200)
1575                                                         && (ul_TimingInterval <=
1576                                                                 6553500UL))
1577                                                 || ((b_PCIInputClock ==
1578                                                                 APCI1710_40MHZ)
1579                                                         && (b_TimingUnity == 1)
1580                                                         && (ul_TimingInterval >=
1581                                                                 1)
1582                                                         && (ul_TimingInterval <=
1583                                                                 6553UL))
1584                                                 || ((b_PCIInputClock ==
1585                                                                 APCI1710_40MHZ)
1586                                                         && (b_TimingUnity == 2)
1587                                                         && (ul_TimingInterval >=
1588                                                                 1)
1589                                                         && (ul_TimingInterval <=
1590                                                                 6UL))) {
1591                        /**********************/
1592                                                 /* Test if 40MHz used */
1593                        /**********************/
1594
1595                                                 if (b_PCIInputClock ==
1596                                                         APCI1710_40MHZ) {
1597                           /******************************/
1598                                                         /* Test if firmware >= Rev1.5 */
1599                           /******************************/
1600
1601                                                         if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3135) {
1602                              /*********************************/
1603                                                                 /* Test if 40MHz quartz on board */
1604                              /*********************************/
1605
1606                                                                 /*INPDW (ps_APCI1710Variable->
1607                                                                    s_Board [b_BoardHandle].
1608                                                                    s_BoardInfos.
1609                                                                    ui_Address + 36 + (64 * b_ModulNbr), &dw_Status); */
1610                                                                 dw_Status =
1611                                                                         inl
1612                                                                         (devpriv->
1613                                                                         s_BoardInfos.
1614                                                                         ui_Address
1615                                                                         + 36 +
1616                                                                         (64 * b_ModulNbr));
1617
1618                              /******************************/
1619                                                                 /* Test the quartz flag (DQ0) */
1620                              /******************************/
1621
1622                                                                 if ((dw_Status & 1) != 1) {
1623                                 /*****************************/
1624                                                                         /* 40MHz quartz not on board */
1625                                 /*****************************/
1626
1627                                                                         DPRINTK("40MHz quartz not on board\n");
1628                                                                         i_ReturnValue
1629                                                                                 =
1630                                                                                 -7;
1631                                                                 }
1632                                                         } else {
1633                              /*****************************/
1634                                                                 /* 40MHz quartz not on board */
1635                              /*****************************/
1636                                                                 DPRINTK("40MHz quartz not on board\n");
1637                                                                 i_ReturnValue =
1638                                                                         -7;
1639                                                         }
1640                                                 }       /*  if (b_PCIInputClock == APCI1710_40MHZ) */
1641
1642                        /***************************/
1643                                                 /* Test if not error occur */
1644                        /***************************/
1645
1646                                                 if (i_ReturnValue == 0) {
1647                           /****************************/
1648                                                         /* Test the INC_CPT version */
1649                           /****************************/
1650
1651                                                         if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131) {
1652
1653                                 /**********************/
1654                                                                 /* Test if 40MHz used */
1655                                 /**********************/
1656
1657                                                                 if (b_PCIInputClock == APCI1710_40MHZ) {
1658                                    /*********************************/
1659                                                                         /* Enable the 40MHz quarz (DQ30) */
1660                                    /*********************************/
1661
1662                                                                         devpriv->
1663                                                                                 s_ModuleInfo
1664                                                                                 [b_ModulNbr].
1665                                                                                 s_SiemensCounterInfo.
1666                                                                                 s_ModeRegister.
1667                                                                                 s_ByteModeRegister.
1668                                                                                 b_ModeRegister4
1669                                                                                 =
1670                                                                                 devpriv->
1671                                                                                 s_ModuleInfo
1672                                                                                 [b_ModulNbr].
1673                                                                                 s_SiemensCounterInfo.
1674                                                                                 s_ModeRegister.
1675                                                                                 s_ByteModeRegister.
1676                                                                                 b_ModeRegister4
1677                                                                                 |
1678                                                                                 APCI1710_ENABLE_40MHZ_FREQUENCY;
1679                                                                 }       /*  if (b_PCIInputClock == APCI1710_40MHZ) */
1680                                                                 else {
1681                                    /**********************************/
1682                                                                         /* Disable the 40MHz quarz (DQ30) */
1683                                    /**********************************/
1684
1685                                                                         devpriv->
1686                                                                                 s_ModuleInfo
1687                                                                                 [b_ModulNbr].
1688                                                                                 s_SiemensCounterInfo.
1689                                                                                 s_ModeRegister.
1690                                                                                 s_ByteModeRegister.
1691                                                                                 b_ModeRegister4
1692                                                                                 =
1693                                                                                 devpriv->
1694                                                                                 s_ModuleInfo
1695                                                                                 [b_ModulNbr].
1696                                                                                 s_SiemensCounterInfo.
1697                                                                                 s_ModeRegister.
1698                                                                                 s_ByteModeRegister.
1699                                                                                 b_ModeRegister4
1700                                                                                 &
1701                                                                                 APCI1710_DISABLE_40MHZ_FREQUENCY;
1702
1703                                                                 }       /*  if (b_PCIInputClock == APCI1710_40MHZ) */
1704
1705                              /********************************/
1706                                                                 /* Calculate the division fator */
1707                              /********************************/
1708
1709                                                                 fpu_begin();
1710                                                                 switch (b_TimingUnity) {
1711                                 /******/
1712                                                                         /* ns */
1713                                 /******/
1714
1715                                                                 case 0:
1716
1717                                         /******************/
1718                                                                         /* Timer 0 factor */
1719                                         /******************/
1720
1721                                                                         ul_TimerValue
1722                                                                                 =
1723                                                                                 (unsigned int)
1724                                                                                 (ul_TimingInterval
1725                                                                                 *
1726                                                                                 (0.00025 * b_PCIInputClock));
1727
1728                                         /*******************/
1729                                                                         /* Round the value */
1730                                         /*******************/
1731
1732                                                                         if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
1733                                                                                 ul_TimerValue
1734                                                                                         =
1735                                                                                         ul_TimerValue
1736                                                                                         +
1737                                                                                         1;
1738                                                                         }
1739
1740                                         /*****************************/
1741                                                                         /* Calculate the real timing */
1742                                         /*****************************/
1743
1744                                                                         *pul_RealTimingInterval
1745                                                                                 =
1746                                                                                 (unsigned int)
1747                                                                                 (ul_TimerValue
1748                                                                                 /
1749                                                                                 (0.00025 * (double)b_PCIInputClock));
1750                                                                         d_RealTimingInterval
1751                                                                                 =
1752                                                                                 (double)
1753                                                                                 ul_TimerValue
1754                                                                                 /
1755                                                                                 (0.00025
1756                                                                                 *
1757                                                                                 (double)
1758                                                                                 b_PCIInputClock);
1759
1760                                                                         if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
1761                                                                                 *pul_RealTimingInterval
1762                                                                                         =
1763                                                                                         *pul_RealTimingInterval
1764                                                                                         +
1765                                                                                         1;
1766                                                                         }
1767
1768                                                                         ul_TimingInterval
1769                                                                                 =
1770                                                                                 ul_TimingInterval
1771                                                                                 -
1772                                                                                 1;
1773                                                                         ul_TimerValue
1774                                                                                 =
1775                                                                                 ul_TimerValue
1776                                                                                 -
1777                                                                                 2;
1778
1779                                                                         break;
1780
1781                                 /******/
1782                                                                         /* æs */
1783                                 /******/
1784
1785                                                                 case 1:
1786
1787                                         /******************/
1788                                                                         /* Timer 0 factor */
1789                                         /******************/
1790
1791                                                                         ul_TimerValue
1792                                                                                 =
1793                                                                                 (unsigned int)
1794                                                                                 (ul_TimingInterval
1795                                                                                 *
1796                                                                                 (0.25 * b_PCIInputClock));
1797
1798                                         /*******************/
1799                                                                         /* Round the value */
1800                                         /*******************/
1801
1802                                                                         if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
1803                                                                                 ul_TimerValue
1804                                                                                         =
1805                                                                                         ul_TimerValue
1806                                                                                         +
1807                                                                                         1;
1808                                                                         }
1809
1810                                         /*****************************/
1811                                                                         /* Calculate the real timing */
1812                                         /*****************************/
1813
1814                                                                         *pul_RealTimingInterval
1815                                                                                 =
1816                                                                                 (unsigned int)
1817                                                                                 (ul_TimerValue
1818                                                                                 /
1819                                                                                 (0.25 * (double)b_PCIInputClock));
1820                                                                         d_RealTimingInterval
1821                                                                                 =
1822                                                                                 (double)
1823                                                                                 ul_TimerValue
1824                                                                                 /
1825                                                                                 (
1826                                                                                 (double)
1827                                                                                 0.25
1828                                                                                 *
1829                                                                                 (double)
1830                                                                                 b_PCIInputClock);
1831
1832                                                                         if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
1833                                                                                 *pul_RealTimingInterval
1834                                                                                         =
1835                                                                                         *pul_RealTimingInterval
1836                                                                                         +
1837                                                                                         1;
1838                                                                         }
1839
1840                                                                         ul_TimingInterval
1841                                                                                 =
1842                                                                                 ul_TimingInterval
1843                                                                                 -
1844                                                                                 1;
1845                                                                         ul_TimerValue
1846                                                                                 =
1847                                                                                 ul_TimerValue
1848                                                                                 -
1849                                                                                 2;
1850
1851                                                                         break;
1852
1853                                 /******/
1854                                                                         /* ms */
1855                                 /******/
1856
1857                                                                 case 2:
1858
1859                                         /******************/
1860                                                                         /* Timer 0 factor */
1861                                         /******************/
1862
1863                                                                         ul_TimerValue
1864                                                                                 =
1865                                                                                 ul_TimingInterval
1866                                                                                 *
1867                                                                                 (250.0
1868                                                                                 *
1869                                                                                 b_PCIInputClock);
1870
1871                                         /*******************/
1872                                                                         /* Round the value */
1873                                         /*******************/
1874
1875                                                                         if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
1876                                                                                 ul_TimerValue
1877                                                                                         =
1878                                                                                         ul_TimerValue
1879                                                                                         +
1880                                                                                         1;
1881                                                                         }
1882
1883                                         /*****************************/
1884                                                                         /* Calculate the real timing */
1885                                         /*****************************/
1886
1887                                                                         *pul_RealTimingInterval
1888                                                                                 =
1889                                                                                 (unsigned int)
1890                                                                                 (ul_TimerValue
1891                                                                                 /
1892                                                                                 (250.0 * (double)b_PCIInputClock));
1893                                                                         d_RealTimingInterval
1894                                                                                 =
1895                                                                                 (double)
1896                                                                                 ul_TimerValue
1897                                                                                 /
1898                                                                                 (250.0
1899                                                                                 *
1900                                                                                 (double)
1901                                                                                 b_PCIInputClock);
1902
1903                                                                         if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
1904                                                                                 *pul_RealTimingInterval
1905                                                                                         =
1906                                                                                         *pul_RealTimingInterval
1907                                                                                         +
1908                                                                                         1;
1909                                                                         }
1910
1911                                                                         ul_TimingInterval
1912                                                                                 =
1913                                                                                 ul_TimingInterval
1914                                                                                 -
1915                                                                                 1;
1916                                                                         ul_TimerValue
1917                                                                                 =
1918                                                                                 ul_TimerValue
1919                                                                                 -
1920                                                                                 2;
1921
1922                                                                         break;
1923                                                                 }
1924
1925                                                                 fpu_end();
1926                              /*************************/
1927                                                                 /* Write the timer value */
1928                              /*************************/
1929
1930                                                                 outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 32 + (64 * b_ModulNbr));
1931
1932                              /*******************************/
1933                                                                 /* Set the initialisation flag */
1934                              /*******************************/
1935
1936                                                                 devpriv->
1937                                                                         s_ModuleInfo
1938                                                                         [b_ModulNbr].
1939                                                                         s_SiemensCounterInfo.
1940                                                                         s_InitFlag.
1941                                                                         b_FrequencyMeasurementInit
1942                                                                         = 1;
1943                                                         } else {
1944                              /***************************/
1945                                                                 /* Counter not initialised */
1946                              /***************************/
1947
1948                                                                 DPRINTK("Counter not initialised\n");
1949                                                                 i_ReturnValue =
1950                                                                         -3;
1951                                                         }
1952                                                 }       /*  if (i_ReturnValue == 0) */
1953                                         } else {
1954                        /**********************************/
1955                                                 /* Base timing selection is wrong */
1956                        /**********************************/
1957
1958                                                 DPRINTK("Base timing selection is wrong\n");
1959                                                 i_ReturnValue = -6;
1960                                         }
1961                                 } else {
1962                     /***********************************/
1963                                         /* Timing unity selection is wrong */
1964                     /***********************************/
1965
1966                                         DPRINTK("Timing unity selection is wrong\n");
1967                                         i_ReturnValue = -5;
1968                                 }
1969                         } else {
1970                  /*****************************************/
1971                                 /* The selected PCI input clock is wrong */
1972                  /*****************************************/
1973
1974                                 DPRINTK("The selected PCI input clock is wrong\n");
1975                                 i_ReturnValue = -4;
1976                         }
1977                 } else {
1978               /****************************************/
1979                         /* Counter not initialised see function */
1980                         /* "i_APCI1710_InitCounter"             */
1981               /****************************************/
1982
1983                         DPRINTK("Counter not initialised\n");
1984                         i_ReturnValue = -3;
1985                 }
1986         } else {
1987            /*************************************************/
1988                 /* The selected module number parameter is wrong */
1989            /*************************************************/
1990
1991                 DPRINTK("The selected module number parameter is wrong\n");
1992                 i_ReturnValue = -2;
1993         }
1994
1995         return i_ReturnValue;
1996 }
1997
1998 /*########################################################################### */
1999
2000                                                         /* INSN BITS */
2001 /*########################################################################### */
2002
2003 /*
2004 +----------------------------------------------------------------------------+
2005 | Function Name     :INT        i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
2006 struct comedi_insn *insn,unsigned int *data)                   |
2007 +----------------------------------------------------------------------------+
2008 | Task              : Set & Clear Functions for INC_CPT                                          |
2009 +----------------------------------------------------------------------------+
2010 | Input Parameters  :
2011 +----------------------------------------------------------------------------+
2012 | Output Parameters : -                                                      |
2013 +----------------------------------------------------------------------------+
2014 | Return Value      :
2015 +----------------------------------------------------------------------------+
2016 */
2017
2018 int i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
2019         struct comedi_insn *insn, unsigned int *data)
2020 {
2021         unsigned int ui_BitsType;
2022         int i_ReturnValue = 0;
2023         ui_BitsType = CR_CHAN(insn->chanspec);
2024         devpriv->tsk_Current = current; /*  Save the current process task structure */
2025
2026         switch (ui_BitsType) {
2027         case APCI1710_INCCPT_CLEARCOUNTERVALUE:
2028                 i_ReturnValue = i_APCI1710_ClearCounterValue(dev,
2029                         (unsigned char) CR_AREF(insn->chanspec));
2030                 break;
2031
2032         case APCI1710_INCCPT_CLEARALLCOUNTERVALUE:
2033                 i_ReturnValue = i_APCI1710_ClearAllCounterValue(dev);
2034                 break;
2035
2036         case APCI1710_INCCPT_SETINPUTFILTER:
2037                 i_ReturnValue = i_APCI1710_SetInputFilter(dev,
2038                         (unsigned char) CR_AREF(insn->chanspec),
2039                         (unsigned char) data[0], (unsigned char) data[1]);
2040                 break;
2041
2042         case APCI1710_INCCPT_LATCHCOUNTER:
2043                 i_ReturnValue = i_APCI1710_LatchCounter(dev,
2044                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
2045                 break;
2046
2047         case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE:
2048                 i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev,
2049                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
2050                 break;
2051
2052         case APCI1710_INCCPT_SETDIGITALCHLON:
2053                 i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev,
2054                         (unsigned char) CR_AREF(insn->chanspec));
2055                 break;
2056
2057         case APCI1710_INCCPT_SETDIGITALCHLOFF:
2058                 i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev,
2059                         (unsigned char) CR_AREF(insn->chanspec));
2060                 break;
2061
2062         default:
2063                 printk("Bits Config Parameter Wrong\n");
2064         }
2065
2066         if (i_ReturnValue >= 0)
2067                 i_ReturnValue = insn->n;
2068         return i_ReturnValue;
2069 }
2070
2071 /*
2072 +----------------------------------------------------------------------------+
2073 | Function Name     : _INT_ i_APCI1710_ClearCounterValue                     |
2074 |                               (unsigned char_      b_BoardHandle,                   |
2075 |                                unsigned char_       b_ModulNbr)                     |
2076 +----------------------------------------------------------------------------+
2077 | Task              : Clear the counter value from selected module           |
2078 |                     (b_ModulNbr).                                          |
2079 +----------------------------------------------------------------------------+
2080 | Input Parameters  : unsigned char_ b_BoardHandle : Handle of board APCI-1710        |
2081 |                     unsigned char_ b_ModulNbr    : Module number to configure       |
2082 |                                           (0 to 3)                         |
2083 +----------------------------------------------------------------------------+
2084 | Output Parameters : -                                                      |
2085 +----------------------------------------------------------------------------+
2086 | Return Value      :  0: No error                                           |
2087 |                     -1: The handle parameter of the board is wrong         |
2088 |                     -2: The selected module number parameter is wrong      |
2089 |                     -3: Counter not initialised see function               |
2090 |                         "i_APCI1710_InitCounter"                           |
2091 +----------------------------------------------------------------------------+
2092 */
2093
2094 int i_APCI1710_ClearCounterValue(struct comedi_device *dev, unsigned char b_ModulNbr)
2095 {
2096         int i_ReturnValue = 0;
2097
2098         /**************************/
2099         /* Test the module number */
2100         /**************************/
2101
2102         if (b_ModulNbr < 4) {
2103            /*******************************/
2104                 /* Test if counter initialised */
2105            /*******************************/
2106
2107                 if (devpriv->
2108                         s_ModuleInfo[b_ModulNbr].
2109                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2110               /*********************/
2111                         /* Clear the counter */
2112               /*********************/
2113
2114                         outl(1, devpriv->s_BoardInfos.
2115                                 ui_Address + 16 + (64 * b_ModulNbr));
2116                 } else {
2117               /****************************************/
2118                         /* Counter not initialised see function */
2119                         /* "i_APCI1710_InitCounter"             */
2120               /****************************************/
2121
2122                         DPRINTK("Counter not initialised\n");
2123                         i_ReturnValue = -3;
2124                 }
2125         } else {
2126            /*************************************************/
2127                 /* The selected module number parameter is wrong */
2128            /*************************************************/
2129
2130                 DPRINTK("The selected module number parameter is wrong\n");
2131                 i_ReturnValue = -2;
2132         }
2133
2134         return i_ReturnValue;
2135 }
2136
2137 /*
2138 +----------------------------------------------------------------------------+
2139 | Function Name     : _INT_ i_APCI1710_ClearAllCounterValue                  |
2140 |                               (unsigned char_      b_BoardHandle)                   |
2141 +----------------------------------------------------------------------------+
2142 | Task              : Clear all counter value.                               |
2143 +----------------------------------------------------------------------------+
2144 | Input Parameters  : unsigned char_ b_BoardHandle : Handle of board APCI-1710        |
2145 +----------------------------------------------------------------------------+
2146 | Output Parameters : -                                                      |
2147 +----------------------------------------------------------------------------+
2148 | Return Value      :  0: No error                                           |
2149 |                     -1: The handle parameter of the board is wrong         |
2150 |                     -2: No counter module found                            |
2151 +----------------------------------------------------------------------------+
2152 */
2153
2154 int i_APCI1710_ClearAllCounterValue(struct comedi_device *dev)
2155 {
2156         unsigned char b_ModulCpt = 0;
2157         int i_ReturnValue = 0;
2158
2159         /********************************/
2160         /* Test if counter module found */
2161         /********************************/
2162
2163         if ((devpriv->s_BoardInfos.
2164                         dw_MolduleConfiguration[0] & 0xFFFF0000UL) ==
2165                 APCI1710_INCREMENTAL_COUNTER
2166                 || (devpriv->s_BoardInfos.
2167                         dw_MolduleConfiguration[1] & 0xFFFF0000UL) ==
2168                 APCI1710_INCREMENTAL_COUNTER
2169                 || (devpriv->s_BoardInfos.
2170                         dw_MolduleConfiguration[2] & 0xFFFF0000UL) ==
2171                 APCI1710_INCREMENTAL_COUNTER
2172                 || (devpriv->s_BoardInfos.
2173                         dw_MolduleConfiguration[3] & 0xFFFF0000UL) ==
2174                 APCI1710_INCREMENTAL_COUNTER) {
2175                 for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) {
2176               /*******************************/
2177                         /* Test if incremental counter */
2178               /*******************************/
2179
2180                         if ((devpriv->s_BoardInfos.
2181                                         dw_MolduleConfiguration[b_ModulCpt] &
2182                                         0xFFFF0000UL) ==
2183                                 APCI1710_INCREMENTAL_COUNTER) {
2184                  /*********************/
2185                                 /* Clear the counter */
2186                  /*********************/
2187
2188                                 outl(1, devpriv->s_BoardInfos.
2189                                         ui_Address + 16 + (64 * b_ModulCpt));
2190                         }
2191                 }
2192         } else {
2193            /***************************/
2194                 /* No counter module found */
2195            /***************************/
2196
2197                 DPRINTK("No counter module found\n");
2198                 i_ReturnValue = -2;
2199         }
2200
2201         return i_ReturnValue;
2202 }
2203
2204 /*
2205 +----------------------------------------------------------------------------+
2206 | Function Name     : _INT_ i_APCI1710_SetInputFilter                        |
2207 |                                       (unsigned char_ b_BoardHandle,                |
2208 |                                        unsigned char_ b_Module,                     |
2209 |                                        unsigned char_ b_PCIInputClock,              |
2210 |                                        unsigned char_ b_Filter)                    |
2211 +----------------------------------------------------------------------------+
2212 | Task              : Disable or enable the software filter from selected    |
2213 |                     module (b_ModulNbr). b_Filter determine the filter time|
2214 +----------------------------------------------------------------------------+
2215 | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
2216 |                     unsigned char_  b_ModulNbr              : Number of the module to be   |
2217 |                                               configured (0 to 3)          |
2218 |                     unsigned char_  b_PCIInputClock  :        Selection of the PCI bus     |
2219 |                                               clock                        |
2220 |                                               - APCI1710_30MHZ :           |
2221 |                                                 The PC has a PCI bus clock |
2222 |                                                 of 30 MHz                  |
2223 |                                               - APCI1710_33MHZ :           |
2224 |                                                 The PC has a PCI bus clock |
2225 |                                                 of 33 MHz                  |
2226 |                                               - APCI1710_40MHZ :           |
2227 |                                                 The APCI1710 has a 40MHz    |
2228 |                                                 quartz                     |
2229 |                     unsigned char_  b_Filter        : Filter selection             |
2230 |                                                                            |
2231 |                               30 MHz                                       |
2232 |                               ------                                       |
2233 |                                       0:  Software filter not used         |
2234 |                                       1:  Filter from 266ns  (3.750000MHz) |
2235 |                                       2:  Filter from 400ns  (2.500000MHz) |
2236 |                                       3:  Filter from 533ns  (1.876170MHz) |
2237 |                                       4:  Filter from 666ns  (1.501501MHz) |
2238 |                                       5:  Filter from 800ns  (1.250000MHz) |
2239 |                                       6:  Filter from 933ns  (1.071800MHz) |
2240 |                                       7:  Filter from 1066ns (0.938080MHz) |
2241 |                                       8:  Filter from 1200ns (0.833333MHz) |
2242 |                                       9:  Filter from 1333ns (0.750000MHz) |
2243 |                                       10: Filter from 1466ns (0.682100MHz) |
2244 |                                       11: Filter from 1600ns (0.625000MHz) |
2245 |                                       12: Filter from 1733ns (0.577777MHz) |
2246 |                                       13: Filter from 1866ns (0.535900MHz) |
2247 |                                       14: Filter from 2000ns (0.500000MHz) |
2248 |                                       15: Filter from 2133ns (0.468800MHz) |
2249 |                                                                            |
2250 |                               33 MHz                                       |
2251 |                               ------                                       |
2252 |                                       0:  Software filter not used         |
2253 |                                       1:  Filter from 242ns  (4.125000MHz) |
2254 |                                       2:  Filter from 363ns  (2.754820MHz) |
2255 |                                       3:  Filter from 484ns  (2.066115MHz) |
2256 |                                       4:  Filter from 605ns  (1.652892MHz) |
2257 |                                       5:  Filter from 726ns  (1.357741MHz) |
2258 |                                       6:  Filter from 847ns  (1.180637MHz) |
2259 |                                       7:  Filter from 968ns  (1.033055MHz) |
2260 |                                       8:  Filter from 1089ns (0.918273MHz) |
2261 |                                       9:  Filter from 1210ns (0.826446MHz) |
2262 |                                       10: Filter from 1331ns (0.751314MHz) |
2263 |                                       11: Filter from 1452ns (0.688705MHz) |
2264 |                                       12: Filter from 1573ns (0.635727MHz) |
2265 |                                       13: Filter from 1694ns (0.590318MHz) |
2266 |                                       14: Filter from 1815ns (0.550964MHz) |
2267 |                                       15: Filter from 1936ns (0.516528MHz) |
2268 |                                                                            |
2269 |                               40 MHz                                       |
2270 |                               ------                                       |
2271 |                                       0:  Software filter not used         |
2272 |                                       1:  Filter from 200ns  (5.000000MHz) |
2273 |                                       2:  Filter from 300ns  (3.333333MHz) |
2274 |                                       3:  Filter from 400ns  (2.500000MHz) |
2275 |                                       4:  Filter from 500ns  (2.000000MHz) |
2276 |                                       5:  Filter from 600ns  (1.666666MHz) |
2277 |                                       6:  Filter from 700ns  (1.428500MHz) |
2278 |                                       7:  Filter from 800ns  (1.250000MHz) |
2279 |                                       8:  Filter from 900ns  (1.111111MHz) |
2280 |                                       9:  Filter from 1000ns (1.000000MHz) |
2281 |                                       10: Filter from 1100ns (0.909090MHz) |
2282 |                                       11: Filter from 1200ns (0.833333MHz) |
2283 |                                       12: Filter from 1300ns (0.769200MHz) |
2284 |                                       13: Filter from 1400ns (0.714200MHz) |
2285 |                                       14: Filter from 1500ns (0.666666MHz) |
2286 |                                       15: Filter from 1600ns (0.625000MHz) |
2287 +----------------------------------------------------------------------------+
2288 | Output Parameters : -                                                      |
2289 +----------------------------------------------------------------------------+
2290 | Return Value      :  0: No error                                           |
2291 |                     -1: The handle parameter of the board is wrong         |
2292 |                     -2: The selected module number is wrong                |
2293 |                     -3: The module is not a counter module                 |
2294 |                                         -4: The selected PCI input clock is wrong              |
2295 |                                         -5: The selected filter value is wrong                 |
2296 |                                         -6: 40MHz quartz not on board                          |
2297 +----------------------------------------------------------------------------+
2298 */
2299
2300 int i_APCI1710_SetInputFilter(struct comedi_device *dev,
2301         unsigned char b_ModulNbr, unsigned char b_PCIInputClock, unsigned char b_Filter)
2302 {
2303         int i_ReturnValue = 0;
2304         unsigned int dw_Status = 0;
2305
2306         /**************************/
2307         /* Test the module number */
2308         /**************************/
2309
2310         if (b_ModulNbr < 4) {
2311            /*******************************/
2312                 /* Test if incremental counter */
2313            /*******************************/
2314
2315                 if ((devpriv->s_BoardInfos.
2316                                 dw_MolduleConfiguration[b_ModulNbr] &
2317                                 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
2318               /******************************/
2319                         /* Test if firmware >= Rev1.5 */
2320               /******************************/
2321
2322                         if ((devpriv->s_BoardInfos.
2323                                         dw_MolduleConfiguration[b_ModulNbr] &
2324                                         0xFFFF) >= 0x3135) {
2325                  /**************************/
2326                                 /* Test the PCI bus clock */
2327                  /**************************/
2328
2329                                 if ((b_PCIInputClock == APCI1710_30MHZ) ||
2330                                         (b_PCIInputClock == APCI1710_33MHZ) ||
2331                                         (b_PCIInputClock == APCI1710_40MHZ)) {
2332                     /*************************/
2333                                         /* Test the filter value */
2334                     /*************************/
2335
2336                                         if (b_Filter < 16) {
2337                        /**********************/
2338                                                 /* Test if 40MHz used */
2339                        /**********************/
2340
2341                                                 if (b_PCIInputClock ==
2342                                                         APCI1710_40MHZ) {
2343                           /*********************************/
2344                                                         /* Test if 40MHz quartz on board */
2345                           /*********************************/
2346
2347                                                         dw_Status =
2348                                                                 inl(devpriv->
2349                                                                 s_BoardInfos.
2350                                                                 ui_Address +
2351                                                                 36 +
2352                                                                 (64 * b_ModulNbr));
2353
2354                           /******************************/
2355                                                         /* Test the quartz flag (DQ0) */
2356                           /******************************/
2357
2358                                                         if ((dw_Status & 1) !=
2359                                                                 1) {
2360                              /*****************************/
2361                                                                 /* 40MHz quartz not on board */
2362                              /*****************************/
2363
2364                                                                 DPRINTK("40MHz quartz not on board\n");
2365                                                                 i_ReturnValue =
2366                                                                         -6;
2367                                                         }
2368                                                 }       /*  if (b_PCIInputClock == APCI1710_40MHZ) */
2369
2370                        /***************************/
2371                                                 /* Test if error not occur */
2372                        /***************************/
2373
2374                                                 if (i_ReturnValue == 0) {
2375                           /**********************/
2376                                                         /* Test if 40MHz used */
2377                           /**********************/
2378
2379                                                         if (b_PCIInputClock ==
2380                                                                 APCI1710_40MHZ)
2381                                                         {
2382                              /*********************************/
2383                                                                 /* Enable the 40MHz quarz (DQ31) */
2384                              /*********************************/
2385
2386                                                                 devpriv->
2387                                                                         s_ModuleInfo
2388                                                                         [b_ModulNbr].
2389                                                                         s_SiemensCounterInfo.
2390                                                                         s_ModeRegister.
2391                                                                         s_ByteModeRegister.
2392                                                                         b_ModeRegister4
2393                                                                         =
2394                                                                         devpriv->
2395                                                                         s_ModuleInfo
2396                                                                         [b_ModulNbr].
2397                                                                         s_SiemensCounterInfo.
2398                                                                         s_ModeRegister.
2399                                                                         s_ByteModeRegister.
2400                                                                         b_ModeRegister4
2401                                                                         |
2402                                                                         APCI1710_ENABLE_40MHZ_FILTER;
2403
2404                                                         }       /*  if (b_PCIInputClock == APCI1710_40MHZ) */
2405                                                         else {
2406                              /**********************************/
2407                                                                 /* Disable the 40MHz quarz (DQ31) */
2408                              /**********************************/
2409
2410                                                                 devpriv->
2411                                                                         s_ModuleInfo
2412                                                                         [b_ModulNbr].
2413                                                                         s_SiemensCounterInfo.
2414                                                                         s_ModeRegister.
2415                                                                         s_ByteModeRegister.
2416                                                                         b_ModeRegister4
2417                                                                         =
2418                                                                         devpriv->
2419                                                                         s_ModuleInfo
2420                                                                         [b_ModulNbr].
2421                                                                         s_SiemensCounterInfo.
2422                                                                         s_ModeRegister.
2423                                                                         s_ByteModeRegister.
2424                                                                         b_ModeRegister4
2425                                                                         &
2426                                                                         APCI1710_DISABLE_40MHZ_FILTER;
2427
2428                                                         }       /*  if (b_PCIInputClock == APCI1710_40MHZ) */
2429
2430                           /************************/
2431                                                         /* Set the filter value */
2432                           /************************/
2433
2434                                                         devpriv->
2435                                                                 s_ModuleInfo
2436                                                                 [b_ModulNbr].
2437                                                                 s_SiemensCounterInfo.
2438                                                                 s_ModeRegister.
2439                                                                 s_ByteModeRegister.
2440                                                                 b_ModeRegister3
2441                                                                 =
2442                                                                 (devpriv->
2443                                                                 s_ModuleInfo
2444                                                                 [b_ModulNbr].
2445                                                                 s_SiemensCounterInfo.
2446                                                                 s_ModeRegister.
2447                                                                 s_ByteModeRegister.
2448                                                                 b_ModeRegister3
2449                                                                 & 0x1F) |
2450                                                                 ((b_Filter &
2451                                                                         0x7) <<
2452                                                                 5);
2453
2454                                                         devpriv->
2455                                                                 s_ModuleInfo
2456                                                                 [b_ModulNbr].
2457                                                                 s_SiemensCounterInfo.
2458                                                                 s_ModeRegister.
2459                                                                 s_ByteModeRegister.
2460                                                                 b_ModeRegister4
2461                                                                 =
2462                                                                 (devpriv->
2463                                                                 s_ModuleInfo
2464                                                                 [b_ModulNbr].
2465                                                                 s_SiemensCounterInfo.
2466                                                                 s_ModeRegister.
2467                                                                 s_ByteModeRegister.
2468                                                                 b_ModeRegister4
2469                                                                 & 0xFE) |
2470                                                                 ((b_Filter &
2471                                                                         0x8) >>
2472                                                                 3);
2473
2474                           /***************************/
2475                                                         /* Write the configuration */
2476                           /***************************/
2477
2478                                                         outl(devpriv->
2479                                                                 s_ModuleInfo
2480                                                                 [b_ModulNbr].
2481                                                                 s_SiemensCounterInfo.
2482                                                                 s_ModeRegister.
2483                                                                 dw_ModeRegister1_2_3_4,
2484                                                                 devpriv->
2485                                                                 s_BoardInfos.
2486                                                                 ui_Address +
2487                                                                 20 +
2488                                                                 (64 * b_ModulNbr));
2489                                                 }       /*  if (i_ReturnValue == 0) */
2490                                         }       /*  if (b_Filter < 16) */
2491                                         else {
2492                        /**************************************/
2493                                                 /* The selected filter value is wrong */
2494                        /**************************************/
2495
2496                                                 DPRINTK("The selected filter value is wrong\n");
2497                                                 i_ReturnValue = -5;
2498                                         }       /*  if (b_Filter < 16) */
2499                                 }       /*  if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) */
2500                                 else {
2501                     /*****************************************/
2502                                         /* The selected PCI input clock is wrong */
2503                     /*****************************************/
2504
2505                                         DPRINTK("The selected PCI input clock is wrong\n");
2506                                         i_ReturnValue = 4;
2507                                 }       /*  if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) */
2508                         } else {
2509                  /**************************************/
2510                                 /* The module is not a counter module */
2511                  /**************************************/
2512
2513                                 DPRINTK("The module is not a counter module\n");
2514                                 i_ReturnValue = -3;
2515                         }
2516                 } else {
2517               /**************************************/
2518                         /* The module is not a counter module */
2519               /**************************************/
2520
2521                         DPRINTK("The module is not a counter module\n");
2522                         i_ReturnValue = -3;
2523                 }
2524         } else {
2525            /*************************************************/
2526                 /* The selected module number parameter is wrong */
2527            /*************************************************/
2528
2529                 DPRINTK("The selected module number parameter is wrong\n");
2530                 i_ReturnValue = -2;
2531         }
2532
2533         return i_ReturnValue;
2534 }
2535
2536 /*
2537 +----------------------------------------------------------------------------+
2538 | Function Name     : _INT_ i_APCI1710_LatchCounter (unsigned char_ b_BoardHandle,    |
2539 |                                                    unsigned char_ b_ModulNbr,       |
2540 |                                                    unsigned char_ b_LatchReg)       |
2541 +----------------------------------------------------------------------------+
2542 | Task              : Latch the courant value from selected module           |
2543 |                     (b_ModulNbr) in to the selected latch register         |
2544 |                     (b_LatchReg).                                          |
2545 +----------------------------------------------------------------------------+
2546 | Input Parameters  : unsigned char_ b_BoardHandle : Handle of board APCI-1710        |
2547 |                     unsigned char_ b_ModulNbr    : Module number to configure       |
2548 |                                           (0 to 3)                         |
2549 |                     unsigned char_ b_LatchReg    : Selected latch register          |
2550 |                               0 : for the first latch register             |
2551 |                               1 : for the second latch register            |
2552 +----------------------------------------------------------------------------+
2553 | Output Parameters : -                                                      |
2554 +----------------------------------------------------------------------------+
2555 | Return Value      :  0: No error                                           |
2556 |                     -1: The handle parameter of the board is wrong         |
2557 |                     -2: No counter module found                            |
2558 |                     -3: Counter not initialised see function               |
2559 |                         "i_APCI1710_InitCounter"                           |
2560 |                     -4: The selected latch register parameter is wrong     |
2561 +----------------------------------------------------------------------------+
2562 */
2563
2564 int i_APCI1710_LatchCounter(struct comedi_device *dev,
2565         unsigned char b_ModulNbr, unsigned char b_LatchReg)
2566 {
2567         int i_ReturnValue = 0;
2568
2569         /**************************/
2570         /* Test the module number */
2571         /**************************/
2572
2573         if (b_ModulNbr < 4) {
2574            /*******************************/
2575                 /* Test if counter initialised */
2576            /*******************************/
2577
2578                 if (devpriv->
2579                         s_ModuleInfo[b_ModulNbr].
2580                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2581               /*************************************/
2582                         /* Test the latch register parameter */
2583               /*************************************/
2584
2585                         if (b_LatchReg < 2) {
2586                  /*********************/
2587                                 /* Tatch the counter */
2588                  /*********************/
2589
2590                                 outl(1 << (b_LatchReg * 4),
2591                                         devpriv->s_BoardInfos.ui_Address +
2592                                         (64 * b_ModulNbr));
2593                         } else {
2594                  /**************************************************/
2595                                 /* The selected latch register parameter is wrong */
2596                  /**************************************************/
2597
2598                                 DPRINTK("The selected latch register parameter is wrong\n");
2599                                 i_ReturnValue = -4;
2600                         }
2601                 } else {
2602               /****************************************/
2603                         /* Counter not initialised see function */
2604                         /* "i_APCI1710_InitCounter"             */
2605               /****************************************/
2606
2607                         DPRINTK("Counter not initialised\n");
2608                         i_ReturnValue = -3;
2609                 }
2610         } else {
2611            /*************************************************/
2612                 /* The selected module number parameter is wrong */
2613            /*************************************************/
2614
2615                 DPRINTK("The selected module number parameter is wrong\n");
2616                 i_ReturnValue = -2;
2617         }
2618
2619         return i_ReturnValue;
2620 }
2621
2622 /*
2623 +----------------------------------------------------------------------------+
2624 | Function Name     : _INT_     i_APCI1710_SetIndexAndReferenceSource        |
2625 |                                       (unsigned char_ b_BoardHandle,                |
2626 |                                        unsigned char_ b_ModulNbr,                   |
2627 |                                        unsigned char_ b_SourceSelection)            |
2628 +----------------------------------------------------------------------------+
2629 | Task              : Determine the hardware source for the index and the    |
2630 |                     reference logic. Per default the index logic is        |
2631 |                     connected to the difference input C and the reference  |
2632 |                     logic is connected to the 24V input E                  |
2633 +----------------------------------------------------------------------------+
2634 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
2635 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
2636 |                                               (0 to 3)                     |
2637 |                     unsigned char_ b_SourceSelection : APCI1710_SOURCE_0 :          |
2638 |                                               The index logic is connected |
2639 |                                               to the difference input C and|
2640 |                                               the reference logic is       |
2641 |                                               connected to the 24V input E.|
2642 |                                               This is the default          |
2643 |                                               configuration.               |
2644 |                                               APCI1710_SOURCE_1 :          |
2645 |                                               The reference logic is       |
2646 |                                               connected to the difference  |
2647 |                                               input C and the index logic  |
2648 |                                               is connected to the 24V      |
2649 |                                               input E                      |
2650 +----------------------------------------------------------------------------+
2651 | Output Parameters : -                                                      |
2652 +----------------------------------------------------------------------------+
2653 | Return Value      :  0: No error                                           |
2654 |                     -1: The handle parameter of the board is wrong         |
2655 |                     -2: The selected module number is wrong                |
2656 |                     -3: The module is not a counter module.                |
2657 |                     -4: The source selection is wrong                      |
2658 +----------------------------------------------------------------------------+
2659 */
2660
2661 int i_APCI1710_SetIndexAndReferenceSource(struct comedi_device *dev,
2662         unsigned char b_ModulNbr, unsigned char b_SourceSelection)
2663 {
2664         int i_ReturnValue = 0;
2665
2666         /**************************/
2667         /* Test the module number */
2668         /**************************/
2669
2670         if (b_ModulNbr < 4) {
2671            /*******************************/
2672                 /* Test if incremental counter */
2673            /*******************************/
2674
2675                 if ((devpriv->s_BoardInfos.
2676                                 dw_MolduleConfiguration[b_ModulNbr] &
2677                                 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
2678               /******************************/
2679                         /* Test if firmware >= Rev1.5 */
2680               /******************************/
2681
2682                         if ((devpriv->s_BoardInfos.
2683                                         dw_MolduleConfiguration[b_ModulNbr] &
2684                                         0xFFFF) >= 0x3135) {
2685                  /*****************************/
2686                                 /* Test the source selection */
2687                  /*****************************/
2688
2689                                 if (b_SourceSelection == APCI1710_SOURCE_0 ||
2690                                         b_SourceSelection == APCI1710_SOURCE_1)
2691                                 {
2692                     /******************************************/
2693                                         /* Test if invert the index and reference */
2694                     /******************************************/
2695
2696                                         if (b_SourceSelection ==
2697                                                 APCI1710_SOURCE_1) {
2698                        /********************************************/
2699                                                 /* Invert index and reference source (DQ25) */
2700                        /********************************************/
2701
2702                                                 devpriv->
2703                                                         s_ModuleInfo
2704                                                         [b_ModulNbr].
2705                                                         s_SiemensCounterInfo.
2706                                                         s_ModeRegister.
2707                                                         s_ByteModeRegister.
2708                                                         b_ModeRegister4 =
2709                                                         devpriv->
2710                                                         s_ModuleInfo
2711                                                         [b_ModulNbr].
2712                                                         s_SiemensCounterInfo.
2713                                                         s_ModeRegister.
2714                                                         s_ByteModeRegister.
2715                                                         b_ModeRegister4 |
2716                                                         APCI1710_INVERT_INDEX_RFERENCE;
2717                                         } else {
2718                        /****************************************/
2719                                                 /* Set the default configuration (DQ25) */
2720                        /****************************************/
2721
2722                                                 devpriv->
2723                                                         s_ModuleInfo
2724                                                         [b_ModulNbr].
2725                                                         s_SiemensCounterInfo.
2726                                                         s_ModeRegister.
2727                                                         s_ByteModeRegister.
2728                                                         b_ModeRegister4 =
2729                                                         devpriv->
2730                                                         s_ModuleInfo
2731                                                         [b_ModulNbr].
2732                                                         s_SiemensCounterInfo.
2733                                                         s_ModeRegister.
2734                                                         s_ByteModeRegister.
2735                                                         b_ModeRegister4 &
2736                                                         APCI1710_DEFAULT_INDEX_RFERENCE;
2737                                         }
2738                                 }       /*  if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) */
2739                                 else {
2740                     /*********************************/
2741                                         /* The source selection is wrong */
2742                     /*********************************/
2743
2744                                         DPRINTK("The source selection is wrong\n");
2745                                         i_ReturnValue = -4;
2746                                 }       /*  if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) */
2747                         } else {
2748                  /**************************************/
2749                                 /* The module is not a counter module */
2750                  /**************************************/
2751
2752                                 DPRINTK("The module is not a counter module\n");
2753                                 i_ReturnValue = -3;
2754                         }
2755                 } else {
2756               /**************************************/
2757                         /* The module is not a counter module */
2758               /**************************************/
2759
2760                         DPRINTK("The module is not a counter module\n");
2761                         i_ReturnValue = -3;
2762                 }
2763         } else {
2764            /***************************************/
2765                 /* The selected module number is wrong */
2766            /***************************************/
2767
2768                 DPRINTK("The selected module number is wrong\n");
2769                 i_ReturnValue = -2;
2770         }
2771
2772         return i_ReturnValue;
2773 }
2774
2775 /*
2776 +----------------------------------------------------------------------------+
2777 | Function Name     : _INT_     i_APCI1710_SetDigitalChlOn                   |
2778 |                                  (unsigned char_  b_BoardHandle,                    |
2779 |                                   unsigned char_  b_ModulNbr)                       |
2780 +----------------------------------------------------------------------------+
2781 | Task              : Sets the digital output H Setting an output means      |
2782 |                     setting an ouput high.                                 |
2783 +----------------------------------------------------------------------------+
2784 | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
2785 |                     unsigned char_  b_ModulNbr              : Number of the module to be   |
2786 |                                               configured (0 to 3)          |
2787 +----------------------------------------------------------------------------+
2788 | Output Parameters : -                                                      |
2789 +----------------------------------------------------------------------------+
2790 | Return Value      :  0: No error                                           |
2791 |                     -1: The handle parameter of the board is wrong         |
2792 |                     -2: The selected module number is wrong                |
2793 |                     -3: Counter not initialised see function               |
2794 |                         "i_APCI1710_InitCounter"                           |
2795 +----------------------------------------------------------------------------+
2796 */
2797
2798 int i_APCI1710_SetDigitalChlOn(struct comedi_device *dev, unsigned char b_ModulNbr)
2799 {
2800         int i_ReturnValue = 0;
2801
2802         /**************************/
2803         /* Test the module number */
2804         /**************************/
2805
2806         if (b_ModulNbr < 4) {
2807            /*******************************/
2808                 /* Test if counter initialised */
2809            /*******************************/
2810
2811                 if (devpriv->
2812                         s_ModuleInfo[b_ModulNbr].
2813                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2814                         devpriv->
2815                                 s_ModuleInfo[b_ModulNbr].
2816                                 s_SiemensCounterInfo.
2817                                 s_ModeRegister.
2818                                 s_ByteModeRegister.
2819                                 b_ModeRegister3 = devpriv->
2820                                 s_ModuleInfo[b_ModulNbr].
2821                                 s_SiemensCounterInfo.
2822                                 s_ModeRegister.
2823                                 s_ByteModeRegister.b_ModeRegister3 | 0x10;
2824
2825               /*********************/
2826                         /* Set the output On */
2827               /*********************/
2828
2829                         outl(devpriv->s_ModuleInfo[b_ModulNbr].
2830                                 s_SiemensCounterInfo.
2831                                 s_ModeRegister.
2832                                 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
2833                                 ui_Address + 20 + (64 * b_ModulNbr));
2834                 } else {
2835               /****************************************/
2836                         /* Counter not initialised see function */
2837                         /* "i_APCI1710_InitCounter"             */
2838               /****************************************/
2839
2840                         DPRINTK("Counter not initialised\n");
2841                         i_ReturnValue = -3;
2842                 }
2843         } else {
2844            /*************************************************/
2845                 /* The selected module number parameter is wrong */
2846            /*************************************************/
2847
2848                 DPRINTK("The selected module number parameter is wrong\n");
2849                 i_ReturnValue = -2;
2850         }
2851
2852         return i_ReturnValue;
2853 }
2854
2855 /*
2856 +----------------------------------------------------------------------------+
2857 | Function Name     : _INT_     i_APCI1710_SetDigitalChlOff                  |
2858 |                                  (unsigned char_  b_BoardHandle,                    |
2859 |                                   unsigned char_  b_ModulNbr)                       |
2860 +----------------------------------------------------------------------------+
2861 | Task              : Resets the digital output H. Resetting an output means |
2862 |                     setting an ouput low.                                  |
2863 +----------------------------------------------------------------------------+
2864 | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
2865 |                     unsigned char_  b_ModulNbr              : Number of the module to be   |
2866 |                                               configured (0 to 3)          |
2867 +----------------------------------------------------------------------------+
2868 | Output Parameters : -                                                      |
2869 +----------------------------------------------------------------------------+
2870 | Return Value      :  0: No error                                           |
2871 |                     -1: The handle parameter of the board is wrong         |
2872 |                     -2: The selected module number is wrong                |
2873 |                     -3: Counter not initialised see function               |
2874 |                         "i_APCI1710_InitCounter"                           |
2875 +----------------------------------------------------------------------------+
2876 */
2877
2878 int i_APCI1710_SetDigitalChlOff(struct comedi_device *dev, unsigned char b_ModulNbr)
2879 {
2880         int i_ReturnValue = 0;
2881
2882         /**************************/
2883         /* Test the module number */
2884         /**************************/
2885
2886         if (b_ModulNbr < 4) {
2887            /*******************************/
2888                 /* Test if counter initialised */
2889            /*******************************/
2890
2891                 if (devpriv->
2892                         s_ModuleInfo[b_ModulNbr].
2893                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2894                         devpriv->
2895                                 s_ModuleInfo[b_ModulNbr].
2896                                 s_SiemensCounterInfo.
2897                                 s_ModeRegister.
2898                                 s_ByteModeRegister.
2899                                 b_ModeRegister3 = devpriv->
2900                                 s_ModuleInfo[b_ModulNbr].
2901                                 s_SiemensCounterInfo.
2902                                 s_ModeRegister.
2903                                 s_ByteModeRegister.b_ModeRegister3 & 0xEF;
2904
2905               /**********************/
2906                         /* Set the output Off */
2907               /**********************/
2908
2909                         outl(devpriv->s_ModuleInfo[b_ModulNbr].
2910                                 s_SiemensCounterInfo.
2911                                 s_ModeRegister.
2912                                 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
2913                                 ui_Address + 20 + (64 * b_ModulNbr));
2914                 } else {
2915               /****************************************/
2916                         /* Counter not initialised see function */
2917                         /* "i_APCI1710_InitCounter"             */
2918               /****************************************/
2919
2920                         DPRINTK("Counter not initialised\n");
2921                         i_ReturnValue = -3;
2922                 }
2923         } else {
2924            /*************************************************/
2925                 /* The selected module number parameter is wrong */
2926            /*************************************************/
2927
2928                 DPRINTK("The selected module number parameter is wrong\n");
2929                 i_ReturnValue = -2;
2930         }
2931
2932         return i_ReturnValue;
2933 }
2934
2935 /*########################################################################### */
2936
2937                                                         /*  INSN WRITE */
2938 /*########################################################################### */
2939
2940 /*
2941 +----------------------------------------------------------------------------+
2942 | Function Name     :INT        i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
2943 struct comedi_insn *insn,unsigned int *data)                   |
2944 +----------------------------------------------------------------------------+
2945 | Task              : Enable Disable functions for INC_CPT                                       |
2946 +----------------------------------------------------------------------------+
2947 | Input Parameters  :
2948 +----------------------------------------------------------------------------+
2949 | Output Parameters : -                                                      |
2950 +----------------------------------------------------------------------------+
2951 | Return Value      :
2952 +----------------------------------------------------------------------------+
2953 */
2954 int i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
2955         struct comedi_insn *insn, unsigned int *data)
2956 {
2957         unsigned int ui_WriteType;
2958         int i_ReturnValue = 0;
2959
2960         ui_WriteType = CR_CHAN(insn->chanspec);
2961         devpriv->tsk_Current = current; /*  Save the current process task structure */
2962
2963         switch (ui_WriteType) {
2964         case APCI1710_INCCPT_ENABLELATCHINTERRUPT:
2965                 i_ReturnValue = i_APCI1710_EnableLatchInterrupt(dev,
2966                         (unsigned char) CR_AREF(insn->chanspec));
2967                 break;
2968
2969         case APCI1710_INCCPT_DISABLELATCHINTERRUPT:
2970                 i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev,
2971                         (unsigned char) CR_AREF(insn->chanspec));
2972                 break;
2973
2974         case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE:
2975                 i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev,
2976                         (unsigned char) CR_AREF(insn->chanspec),
2977                         (unsigned char) data[0], (unsigned int) data[1]);
2978                 break;
2979
2980         case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE:
2981                 i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev,
2982                         (unsigned char) CR_AREF(insn->chanspec), (unsigned int) data[0]);
2983
2984                 break;
2985
2986         case APCI1710_INCCPT_ENABLEINDEX:
2987                 i_APCI1710_EnableIndex(dev, (unsigned char) CR_AREF(insn->chanspec));
2988                 break;
2989
2990         case APCI1710_INCCPT_DISABLEINDEX:
2991                 i_ReturnValue = i_APCI1710_DisableIndex(dev,
2992                         (unsigned char) CR_AREF(insn->chanspec));
2993                 break;
2994
2995         case APCI1710_INCCPT_ENABLECOMPARELOGIC:
2996                 i_ReturnValue = i_APCI1710_EnableCompareLogic(dev,
2997                         (unsigned char) CR_AREF(insn->chanspec));
2998                 break;
2999
3000         case APCI1710_INCCPT_DISABLECOMPARELOGIC:
3001                 i_ReturnValue = i_APCI1710_DisableCompareLogic(dev,
3002                         (unsigned char) CR_AREF(insn->chanspec));
3003                 break;
3004
3005         case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT:
3006                 i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev,
3007                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
3008                 break;
3009
3010         case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT:
3011                 i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev,
3012                         (unsigned char) CR_AREF(insn->chanspec));
3013                 break;
3014
3015         default:
3016                 printk("Write Config Parameter Wrong\n");
3017         }
3018
3019         if (i_ReturnValue >= 0)
3020                 i_ReturnValue = insn->n;
3021         return i_ReturnValue;
3022 }
3023
3024 /*
3025 +----------------------------------------------------------------------------+
3026 | Function Name     : _INT_ i_APCI1710_EnableLatchInterrupt                  |
3027 |                               (unsigned char_ b_BoardHandle,                        |
3028 |                                unsigned char_ b_ModulNbr)                           |
3029 +----------------------------------------------------------------------------+
3030 | Task              : Enable the latch interrupt from selected module        |
3031 |                     (b_ModulNbr). Each software or hardware latch occur a  |
3032 |                     interrupt.                                             |
3033 +----------------------------------------------------------------------------+
3034 | Input Parameters  : unsigned char_ b_BoardHandle : Handle of board APCI-1710        |
3035 |                     unsigned char_ b_ModulNbr    : Module number to configure       |
3036 |                                           (0 to 3)                         |
3037 +----------------------------------------------------------------------------+
3038 | Output Parameters : -                                                      |
3039 +----------------------------------------------------------------------------+
3040 | Return Value      :  0: No error                                           |
3041 |                     -1: The handle parameter of the board is wrong         |
3042 |                     -2: No counter module found                            |
3043 |                     -3: Counter not initialised see function               |
3044 |                         "i_APCI1710_InitCounter"                           |
3045 |                     -4: Interrupt routine not installed see function       |
3046 |                         "i_APCI1710_SetBoardIntRoutine"                    |
3047 +----------------------------------------------------------------------------+
3048 */
3049
3050 int i_APCI1710_EnableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr)
3051 {
3052         int i_ReturnValue = 0;
3053
3054         /**************************/
3055         /* Test the module number */
3056         /**************************/
3057
3058         if (b_ModulNbr < 4) {
3059            /*******************************/
3060                 /* Test if counter initialised */
3061            /*******************************/
3062
3063                 if (devpriv->s_ModuleInfo[b_ModulNbr].
3064                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3065
3066                  /********************/
3067                         /* Enable interrupt */
3068                  /********************/
3069
3070                         devpriv->s_ModuleInfo[b_ModulNbr].
3071                                 s_SiemensCounterInfo.
3072                                 s_ModeRegister.
3073                                 s_ByteModeRegister.
3074                                 b_ModeRegister2 = devpriv->
3075                                 s_ModuleInfo[b_ModulNbr].
3076                                 s_SiemensCounterInfo.
3077                                 s_ModeRegister.
3078                                 s_ByteModeRegister.
3079                                 b_ModeRegister2 | APCI1710_ENABLE_LATCH_INT;
3080
3081                  /***************************/
3082                         /* Write the configuration */
3083                  /***************************/
3084
3085                         outl(devpriv->s_ModuleInfo[b_ModulNbr].
3086                                 s_SiemensCounterInfo.
3087                                 s_ModeRegister.
3088                                 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
3089                                 ui_Address + 20 + (64 * b_ModulNbr));
3090                 } else {
3091               /****************************************/
3092                         /* Counter not initialised see function */
3093                         /* "i_APCI1710_InitCounter"             */
3094               /****************************************/
3095
3096                         DPRINTK("Counter not initialised\n");
3097                         i_ReturnValue = -3;
3098                 }
3099         } else {
3100            /*************************************************/
3101                 /* The selected module number parameter is wrong */
3102            /*************************************************/
3103
3104                 DPRINTK("The selected module number parameter is wrong\n");
3105                 i_ReturnValue = -2;
3106         }
3107
3108         return i_ReturnValue;
3109 }
3110
3111 /*
3112 +----------------------------------------------------------------------------+
3113 | Function Name     : _INT_ i_APCI1710_DisableLatchInterrupt                 |
3114 |                               (unsigned char_ b_BoardHandle,                        |
3115 |                                unsigned char_ b_ModulNbr)                           |
3116 +----------------------------------------------------------------------------+
3117 | Task              : Disable the latch interrupt from selected module       |
3118 |                     (b_ModulNbr).                                          |
3119 +----------------------------------------------------------------------------+
3120 | Input Parameters  : unsigned char_ b_BoardHandle : Handle of board APCI-1710        |
3121 |                     unsigned char_ b_ModulNbr    : Module number to configure       |
3122 |                                           (0 to 3)                         |
3123 +----------------------------------------------------------------------------+
3124 | Output Parameters : -                                                      |
3125 +----------------------------------------------------------------------------+
3126 | Return Value      :  0: No error                                           |
3127 |                     -1: The handle parameter of the board is wrong         |
3128 |                     -2: No counter module found                            |
3129 |                     -3: Counter not initialised see function               |
3130 |                         "i_APCI1710_InitCounter"                           |
3131 |                     -4: Interrupt routine not installed see function       |
3132 |                         "i_APCI1710_SetBoardIntRoutine"                    |
3133 +----------------------------------------------------------------------------+
3134 */
3135
3136 int i_APCI1710_DisableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr)
3137 {
3138         int i_ReturnValue = 0;
3139
3140         /**************************/
3141         /* Test the module number */
3142         /**************************/
3143
3144         if (b_ModulNbr < 4) {
3145            /*******************************/
3146                 /* Test if counter initialised */
3147            /*******************************/
3148
3149                 if (devpriv->
3150                         s_ModuleInfo[b_ModulNbr].
3151                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3152
3153                  /***************************/
3154                         /* Write the configuration */
3155                  /***************************/
3156
3157                         outl(devpriv->s_ModuleInfo[b_ModulNbr].
3158                                 s_SiemensCounterInfo.
3159                                 s_ModeRegister.
3160                                 dw_ModeRegister1_2_3_4 &
3161                                 ((APCI1710_DISABLE_LATCH_INT << 8) | 0xFF),
3162                                 devpriv->s_BoardInfos.ui_Address + 20 +
3163                                 (64 * b_ModulNbr));
3164
3165                         mdelay(1000);
3166
3167                  /*********************/
3168                         /* Disable interrupt */
3169                  /*********************/
3170
3171                         devpriv->
3172                                 s_ModuleInfo[b_ModulNbr].
3173                                 s_SiemensCounterInfo.
3174                                 s_ModeRegister.
3175                                 s_ByteModeRegister.
3176                                 b_ModeRegister2 = devpriv->
3177                                 s_ModuleInfo[b_ModulNbr].
3178                                 s_SiemensCounterInfo.
3179                                 s_ModeRegister.
3180                                 s_ByteModeRegister.
3181                                 b_ModeRegister2 & APCI1710_DISABLE_LATCH_INT;
3182
3183                 } else {
3184               /****************************************/
3185                         /* Counter not initialised see function */
3186                         /* "i_APCI1710_InitCounter"             */
3187               /****************************************/
3188
3189                         DPRINTK("Counter not initialised\n");
3190                         i_ReturnValue = -3;
3191                 }
3192         } else {
3193            /*************************************************/
3194                 /* The selected module number parameter is wrong */
3195            /*************************************************/
3196
3197                 DPRINTK("The selected module number parameter is wrong\n");
3198                 i_ReturnValue = -2;
3199         }
3200
3201         return i_ReturnValue;
3202 }
3203
3204 /*
3205 +----------------------------------------------------------------------------+
3206 | Function Name     : _INT_ i_APCI1710_Write16BitCounterValue                |
3207 |                                               (unsigned char_  b_BoardHandle        |
3208 |                                                unsigned char_  b_ModulNbr,          |
3209 |                                                unsigned char_  b_SelectedCounter,   |
3210 |                                                unsigned int_ ui_WriteValue)        |
3211 +----------------------------------------------------------------------------+
3212 | Task              : Write a 16-Bit value (ui_WriteValue) in to the selected|
3213 |                     16-Bit counter (b_SelectedCounter) from selected module|
3214 |                     (b_ModulNbr).                                          |
3215 +----------------------------------------------------------------------------+
3216 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
3217 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
3218 |                                              (0 to 3)                      |
3219 |                     unsigned char_ b_SelectedCounter : Selected 16-Bit counter      |
3220 |                                               (0 or 1)                     |
3221 |                     unsigned int_ ui_WriteValue     : 16-Bit write value           |
3222 +----------------------------------------------------------------------------+
3223 | Output Parameters : -                                                      |
3224 +----------------------------------------------------------------------------+
3225 | Return Value      :  0: No error                                           |
3226 |                     -1: The handle parameter of the board is wrong         |
3227 |                     -2: No counter module found                            |
3228 |                     -3: Counter not initialised see function               |
3229 |                         "i_APCI1710_InitCounter"                           |
3230 |                     -4: The selected 16-Bit counter parameter is wrong     |
3231 +----------------------------------------------------------------------------+
3232 */
3233
3234 int i_APCI1710_Write16BitCounterValue(struct comedi_device *dev,
3235         unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int ui_WriteValue)
3236 {
3237         int i_ReturnValue = 0;
3238
3239         /**************************/
3240         /* Test the module number */
3241         /**************************/
3242
3243         if (b_ModulNbr < 4) {
3244            /*******************************/
3245                 /* Test if counter initialised */
3246            /*******************************/
3247
3248                 if (devpriv->
3249                         s_ModuleInfo[b_ModulNbr].
3250                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3251               /******************************/
3252                         /* Test the counter selection */
3253               /******************************/
3254
3255                         if (b_SelectedCounter < 2) {
3256                  /*******************/
3257                                 /* Write the value */
3258                  /*******************/
3259
3260                                 outl((unsigned int) ((unsigned int) (ui_WriteValue) << (16 *
3261                                                         b_SelectedCounter)),
3262                                         devpriv->s_BoardInfos.ui_Address + 8 +
3263                                         (b_SelectedCounter * 4) +
3264                                         (64 * b_ModulNbr));
3265                         } else {
3266                  /**************************************************/
3267                                 /* The selected 16-Bit counter parameter is wrong */
3268                  /**************************************************/
3269
3270                                 DPRINTK("The selected 16-Bit counter parameter is wrong\n");
3271                                 i_ReturnValue = -4;
3272                         }
3273                 } else {
3274               /****************************************/
3275                         /* Counter not initialised see function */
3276                         /* "i_APCI1710_InitCounter"             */
3277               /****************************************/
3278
3279                         DPRINTK("Counter not initialised\n");
3280                         i_ReturnValue = -3;
3281                 }
3282         } else {
3283            /*************************************************/
3284                 /* The selected module number parameter is wrong */
3285            /*************************************************/
3286
3287                 DPRINTK("The selected module number parameter is wrong\n");
3288                 i_ReturnValue = -2;
3289         }
3290
3291         return i_ReturnValue;
3292 }
3293
3294 /*
3295 +----------------------------------------------------------------------------+
3296 | Function Name     : _INT_ i_APCI1710_Write32BitCounterValue                |
3297 |                                               (unsigned char_   b_BoardHandle       |
3298 |                                                unsigned char_   b_ModulNbr,         |
3299 |                                                ULONG_ ul_WriteValue)       |
3300 +----------------------------------------------------------------------------+
3301 | Task              : Write a 32-Bit value (ui_WriteValue) in to the selected|
3302 |                     module (b_ModulNbr).                                   |
3303 +----------------------------------------------------------------------------+
3304 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
3305 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
3306 |                                              (0 to 3)                      |
3307 |                     ULONG_ ul_WriteValue    : 32-Bit write value           |
3308 +----------------------------------------------------------------------------+
3309 | Output Parameters : -                                                      |
3310 +----------------------------------------------------------------------------+
3311 | Return Value      :  0: No error                                           |
3312 |                     -1: The handle parameter of the board is wrong         |
3313 |                     -2: No counter module found                            |
3314 |                     -3: Counter not initialised see function               |
3315 |                         "i_APCI1710_InitCounter"                           |
3316 +----------------------------------------------------------------------------+
3317 */
3318
3319 int i_APCI1710_Write32BitCounterValue(struct comedi_device *dev,
3320         unsigned char b_ModulNbr, unsigned int ul_WriteValue)
3321 {
3322         int i_ReturnValue = 0;
3323
3324         /**************************/
3325         /* Test the module number */
3326         /**************************/
3327
3328         if (b_ModulNbr < 4) {
3329            /*******************************/
3330                 /* Test if counter initialised */
3331            /*******************************/
3332
3333                 if (devpriv->
3334                         s_ModuleInfo[b_ModulNbr].
3335                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3336               /*******************/
3337                         /* Write the value */
3338               /*******************/
3339
3340                         outl(ul_WriteValue, devpriv->s_BoardInfos.
3341                                 ui_Address + 4 + (64 * b_ModulNbr));
3342                 } else {
3343               /****************************************/
3344                         /* Counter not initialised see function */
3345                         /* "i_APCI1710_InitCounter"             */
3346               /****************************************/
3347
3348                         DPRINTK("Counter not initialised\n");
3349                         i_ReturnValue = -3;
3350                 }
3351         } else {
3352            /*************************************************/
3353                 /* The selected module number parameter is wrong */
3354            /*************************************************/
3355
3356                 DPRINTK("The selected module number parameter is wrong\n");
3357                 i_ReturnValue = -2;
3358         }
3359
3360         return i_ReturnValue;
3361 }
3362
3363 /*
3364 +----------------------------------------------------------------------------+
3365 | Function Name     : _INT_ i_APCI1710_EnableIndex (unsigned char_  b_BoardHandle,    |
3366 |                                                   unsigned char_  b_ModulNbr)       |
3367 +----------------------------------------------------------------------------+
3368 | Task              : Enable the INDEX actions                               |
3369 +----------------------------------------------------------------------------+
3370 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
3371 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
3372 |                                               (0 to 3)                     |
3373 +----------------------------------------------------------------------------+
3374 | Output Parameters : -                                                      |
3375 +----------------------------------------------------------------------------+
3376 | Return Value      :  0: No error                                           |
3377 |                     -1: The handle parameter of the board is wrong         |
3378 |                     -2: No counter module found                            |
3379 |                     -3: Counter not initialised see function               |
3380 |                         "i_APCI1710_InitCounter"                           |
3381 |                     -4: Index not initialised see function                 |
3382 |                         "i_APCI1710_InitIndex"                             |
3383 +----------------------------------------------------------------------------+
3384 */
3385
3386 int i_APCI1710_EnableIndex(struct comedi_device *dev, unsigned char b_ModulNbr)
3387 {
3388         int i_ReturnValue = 0;
3389         unsigned int ul_InterruptLatchReg;
3390
3391         /**************************/
3392         /* Test the module number */
3393         /**************************/
3394
3395         if (b_ModulNbr < 4) {
3396            /*******************************/
3397                 /* Test if counter initialised */
3398            /*******************************/
3399
3400                 if (devpriv->
3401                         s_ModuleInfo[b_ModulNbr].
3402                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3403               /*****************************/
3404                         /* Test if index initialised */
3405               /*****************************/
3406
3407                         if (devpriv->
3408                                 s_ModuleInfo[b_ModulNbr].
3409                                 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
3410                                 devpriv->
3411                                         s_ModuleInfo[b_ModulNbr].
3412                                         s_SiemensCounterInfo.
3413                                         s_ModeRegister.
3414                                         s_ByteModeRegister.
3415                                         b_ModeRegister2 = devpriv->
3416                                         s_ModuleInfo[b_ModulNbr].
3417                                         s_SiemensCounterInfo.
3418                                         s_ModeRegister.
3419                                         s_ByteModeRegister.
3420                                         b_ModeRegister2 | APCI1710_ENABLE_INDEX;
3421
3422                                 ul_InterruptLatchReg =
3423                                         inl(devpriv->s_BoardInfos.ui_Address +
3424                                         24 + (64 * b_ModulNbr));
3425
3426                                 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3427                                         s_SiemensCounterInfo.
3428                                         s_ModeRegister.
3429                                         dw_ModeRegister1_2_3_4,
3430                                         devpriv->s_BoardInfos.ui_Address + 20 +
3431                                         (64 * b_ModulNbr));
3432                         } else {
3433                  /*************************************************************/
3434                                 /* Index not initialised see function "i_APCI1710_InitIndex" */
3435                  /*************************************************************/
3436
3437                                 DPRINTK("Index not initialised \n");
3438                                 i_ReturnValue = -4;
3439                         }
3440                 } else {
3441               /****************************************/
3442                         /* Counter not initialised see function */
3443                         /* "i_APCI1710_InitCounter"             */
3444               /****************************************/
3445
3446                         DPRINTK("Counter not initialised\n");
3447                         i_ReturnValue = -3;
3448                 }
3449         } else {
3450            /*************************************************/
3451                 /* The selected module number parameter is wrong */
3452            /*************************************************/
3453
3454                 DPRINTK("The selected module number parameter is wrong\n");
3455                 i_ReturnValue = -2;
3456         }
3457
3458         return i_ReturnValue;
3459 }
3460
3461 /*
3462 +----------------------------------------------------------------------------+
3463 | Function Name     : _INT_ i_APCI1710_DisableIndex (unsigned char_  b_BoardHandle,   |
3464 |                                                    unsigned char_  b_ModulNbr)      |
3465 +----------------------------------------------------------------------------+
3466 | Task              : Disable the INDEX actions                              |
3467 +----------------------------------------------------------------------------+
3468 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
3469 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
3470 |                                               (0 to 3)                     |
3471 +----------------------------------------------------------------------------+
3472 | Output Parameters : -                                                      |
3473 +----------------------------------------------------------------------------+
3474 | Return Value      :  0: No error                                           |
3475 |                     -1: The handle parameter of the board is wrong         |
3476 |                     -2: No counter module found                            |
3477 |                     -3: Counter not initialised see function               |
3478 |                         "i_APCI1710_InitCounter"                           |
3479 |                     -4: Index not initialised see function                 |
3480 |                         "i_APCI1710_InitIndex"                             |
3481 +----------------------------------------------------------------------------+
3482 */
3483
3484 int i_APCI1710_DisableIndex(struct comedi_device *dev, unsigned char b_ModulNbr)
3485 {
3486         int i_ReturnValue = 0;
3487
3488         /**************************/
3489         /* Test the module number */
3490         /**************************/
3491
3492         if (b_ModulNbr < 4) {
3493            /*******************************/
3494                 /* Test if counter initialised */
3495            /*******************************/
3496
3497                 if (devpriv->
3498                         s_ModuleInfo[b_ModulNbr].
3499                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3500               /*****************************/
3501                         /* Test if index initialised */
3502               /*****************************/
3503
3504                         if (devpriv->
3505                                 s_ModuleInfo[b_ModulNbr].
3506                                 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
3507                                 devpriv->
3508                                         s_ModuleInfo[b_ModulNbr].
3509                                         s_SiemensCounterInfo.
3510                                         s_ModeRegister.
3511                                         s_ByteModeRegister.
3512                                         b_ModeRegister2 = devpriv->
3513                                         s_ModuleInfo[b_ModulNbr].
3514                                         s_SiemensCounterInfo.
3515                                         s_ModeRegister.
3516                                         s_ByteModeRegister.
3517                                         b_ModeRegister2 &
3518                                         APCI1710_DISABLE_INDEX;
3519
3520                                 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3521                                         s_SiemensCounterInfo.
3522                                         s_ModeRegister.
3523                                         dw_ModeRegister1_2_3_4,
3524                                         devpriv->s_BoardInfos.ui_Address + 20 +
3525                                         (64 * b_ModulNbr));
3526                         } else {
3527                  /*************************************************************/
3528                                 /* Index not initialised see function "i_APCI1710_InitIndex" */
3529                  /*************************************************************/
3530
3531                                 DPRINTK("Index not initialised  \n");
3532                                 i_ReturnValue = -4;
3533                         }
3534                 } else {
3535               /****************************************/
3536                         /* Counter not initialised see function */
3537                         /* "i_APCI1710_InitCounter"             */
3538               /****************************************/
3539
3540                         DPRINTK("Counter not initialised\n");
3541                         i_ReturnValue = -3;
3542                 }
3543         } else {
3544            /*************************************************/
3545                 /* The selected module number parameter is wrong */
3546            /*************************************************/
3547
3548                 DPRINTK("The selected module number parameter is wrong\n");
3549                 i_ReturnValue = -2;
3550         }
3551
3552         return i_ReturnValue;
3553 }
3554
3555 /*
3556 +----------------------------------------------------------------------------+
3557 | Function Name     : _INT_ i_APCI1710_EnableCompareLogic                    |
3558 |                               (unsigned char_   b_BoardHandle,                      |
3559 |                                unsigned char_   b_ModulNbr)                         |
3560 +----------------------------------------------------------------------------+
3561 | Task              : Enable the 32-Bit compare logic. At that moment that   |
3562 |                     the incremental counter arrive to the compare value a  |
3563 |                     interrupt is generated.                                |
3564 +----------------------------------------------------------------------------+
3565 | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
3566 |                     unsigned char_  b_ModulNbr       : Module number to configure   |
3567 |                                               (0 to 3)                     |
3568 +----------------------------------------------------------------------------+
3569 | Output Parameters : -
3570 +----------------------------------------------------------------------------+
3571 | Return Value      :  0: No error                                           |
3572 |                     -1: The handle parameter of the board is wrong         |
3573 |                     -2: No counter module found                            |
3574 |                     -3: Counter not initialised see function               |
3575 |                         "i_APCI1710_InitCounter"                           |
3576 |                     -4: Compare logic not initialised.                     |
3577 |                         See function "i_APCI1710_InitCompareLogic"         |
3578 |                     -5: Interrupt function not initialised.                |
3579 |                         See function "i_APCI1710_SetBoardIntRoutineX"      |
3580 +----------------------------------------------------------------------------+
3581 */
3582
3583 int i_APCI1710_EnableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr)
3584 {
3585         int i_ReturnValue = 0;
3586
3587         /**************************/
3588         /* Test the module number */
3589         /**************************/
3590
3591         if (b_ModulNbr < 4) {
3592            /*******************************/
3593                 /* Test if counter initialised */
3594            /*******************************/
3595
3596                 if (devpriv->
3597                         s_ModuleInfo[b_ModulNbr].
3598                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3599               /*************************************/
3600                         /* Test if compare logic initialised */
3601               /*************************************/
3602
3603                         if (devpriv->
3604                                 s_ModuleInfo[b_ModulNbr].
3605                                 s_SiemensCounterInfo.
3606                                 s_InitFlag.b_CompareLogicInit == 1) {
3607                                 devpriv->
3608                                         s_ModuleInfo[b_ModulNbr].
3609                                         s_SiemensCounterInfo.
3610                                         s_ModeRegister.
3611                                         s_ByteModeRegister.
3612                                         b_ModeRegister3 = devpriv->
3613                                         s_ModuleInfo[b_ModulNbr].
3614                                         s_SiemensCounterInfo.
3615                                         s_ModeRegister.
3616                                         s_ByteModeRegister.
3617                                         b_ModeRegister3 |
3618                                         APCI1710_ENABLE_COMPARE_INT;
3619
3620                     /***************************/
3621                                 /* Write the configuration */
3622                     /***************************/
3623
3624                                 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3625                                         s_SiemensCounterInfo.
3626                                         s_ModeRegister.
3627                                         dw_ModeRegister1_2_3_4,
3628                                         devpriv->s_BoardInfos.ui_Address + 20 +
3629                                         (64 * b_ModulNbr));
3630                         } else {
3631                  /*********************************/
3632                                 /* Compare logic not initialised */
3633                  /*********************************/
3634
3635                                 DPRINTK("Compare logic not initialised\n");
3636                                 i_ReturnValue = -4;
3637                         }
3638                 } else {
3639               /****************************************/
3640                         /* Counter not initialised see function */
3641                         /* "i_APCI1710_InitCounter"             */
3642               /****************************************/
3643
3644                         DPRINTK("Counter not initialised\n");
3645                         i_ReturnValue = -3;
3646                 }
3647         } else {
3648            /*************************************************/
3649                 /* The selected module number parameter is wrong */
3650            /*************************************************/
3651
3652                 DPRINTK("The selected module number parameter is wrong\n");
3653                 i_ReturnValue = -2;
3654         }
3655
3656         return i_ReturnValue;
3657 }
3658
3659 /*
3660 +----------------------------------------------------------------------------+
3661 | Function Name     : _INT_ i_APCI1710_DisableCompareLogic                   |
3662 |                               (unsigned char_   b_BoardHandle,                      |
3663 |                                unsigned char_   b_ModulNbr)                         |
3664 +----------------------------------------------------------------------------+
3665 | Task              : Disable the 32-Bit compare logic.
3666 +----------------------------------------------------------------------------+
3667 | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
3668 |                     unsigned char_  b_ModulNbr       : Module number to configure   |
3669 |                                               (0 to 3)                     |
3670 +----------------------------------------------------------------------------+
3671 | Output Parameters : -
3672 +----------------------------------------------------------------------------+
3673 | Return Value      :  0: No error                                           |
3674 |                     -1: The handle parameter of the board is wrong         |
3675 |                     -2: No counter module found                            |
3676 |                     -3: Counter not initialised see function               |
3677 |                         "i_APCI1710_InitCounter"                           |
3678 |                     -4: Compare logic not initialised.                     |
3679 |                         See function "i_APCI1710_InitCompareLogic"         |
3680 +----------------------------------------------------------------------------+
3681 */
3682
3683 int i_APCI1710_DisableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr)
3684 {
3685         int i_ReturnValue = 0;
3686
3687         /**************************/
3688         /* Test the module number */
3689         /**************************/
3690
3691         if (b_ModulNbr < 4) {
3692            /*******************************/
3693                 /* Test if counter initialised */
3694            /*******************************/
3695
3696                 if (devpriv->
3697                         s_ModuleInfo[b_ModulNbr].
3698                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3699               /*************************************/
3700                         /* Test if compare logic initialised */
3701               /*************************************/
3702
3703                         if (devpriv->
3704                                 s_ModuleInfo[b_ModulNbr].
3705                                 s_SiemensCounterInfo.
3706                                 s_InitFlag.b_CompareLogicInit == 1) {
3707                                 devpriv->
3708                                         s_ModuleInfo[b_ModulNbr].
3709                                         s_SiemensCounterInfo.
3710                                         s_ModeRegister.
3711                                         s_ByteModeRegister.
3712                                         b_ModeRegister3 = devpriv->
3713                                         s_ModuleInfo[b_ModulNbr].
3714                                         s_SiemensCounterInfo.
3715                                         s_ModeRegister.
3716                                         s_ByteModeRegister.
3717                                         b_ModeRegister3 &
3718                                         APCI1710_DISABLE_COMPARE_INT;
3719
3720                  /***************************/
3721                                 /* Write the configuration */
3722                  /***************************/
3723
3724                                 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3725                                         s_SiemensCounterInfo.
3726                                         s_ModeRegister.
3727                                         dw_ModeRegister1_2_3_4,
3728                                         devpriv->s_BoardInfos.ui_Address + 20 +
3729                                         (64 * b_ModulNbr));
3730                         } else {
3731                  /*********************************/
3732                                 /* Compare logic not initialised */
3733                  /*********************************/
3734
3735                                 DPRINTK("Compare logic not initialised\n");
3736                                 i_ReturnValue = -4;
3737                         }
3738                 } else {
3739               /****************************************/
3740                         /* Counter not initialised see function */
3741                         /* "i_APCI1710_InitCounter"             */
3742               /****************************************/
3743
3744                         DPRINTK("Counter not initialised\n");
3745                         i_ReturnValue = -3;
3746                 }
3747         } else {
3748            /*************************************************/
3749                 /* The selected module number parameter is wrong */
3750            /*************************************************/
3751
3752                 DPRINTK("The selected module number parameter is wrong\n");
3753                 i_ReturnValue = -2;
3754         }
3755
3756         return i_ReturnValue;
3757 }
3758
3759         /*
3760            +----------------------------------------------------------------------------+
3761            | Function Name     : _INT_ i_APCI1710_EnableFrequencyMeasurement            |
3762            |                            (unsigned char_   b_BoardHandle,                      |
3763            |                             unsigned char_   b_ModulNbr,                         |
3764            |                             unsigned char_   b_InterruptEnable)                  |
3765            +----------------------------------------------------------------------------+
3766            | Task              : Enables the frequency measurement function             |
3767            +----------------------------------------------------------------------------+
3768            | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
3769            |                  unsigned char_  b_ModulNbr       : Number of the module to be   |
3770            |                                            configured (0 to 3)          |
3771            |                  unsigned char_  b_InterruptEnable: Enable or disable the        |
3772            |                                            interrupt.                   |
3773            |                                            APCI1710_ENABLE:             |
3774            |                                            Enable the interrupt         |
3775            |                                            APCI1710_DISABLE:            |
3776            |                                            Disable the interrupt        |
3777            +----------------------------------------------------------------------------+
3778            | Output Parameters : -                                                      |
3779            +----------------------------------------------------------------------------+
3780            | Return Value      :  0: No error                                           |
3781            |                     -1: The handle parameter of the board is wrong         |
3782            |                     -2: The selected module number is wrong                |
3783            |                     -3: Counter not initialised see function               |
3784            |                      "i_APCI1710_InitCounter"                           |
3785            |                     -4: Frequency measurement logic not initialised.       |
3786            |                      See function "i_APCI1710_InitFrequencyMeasurement" |
3787            |                     -5: Interrupt parameter is wrong                       |
3788            |                     -6: Interrupt function not initialised.                |
3789            +----------------------------------------------------------------------------+
3790          */
3791
3792 int i_APCI1710_EnableFrequencyMeasurement(struct comedi_device *dev,
3793         unsigned char b_ModulNbr, unsigned char b_InterruptEnable)
3794 {
3795         int i_ReturnValue = 0;
3796
3797         /**************************/
3798         /* Test the module number */
3799         /**************************/
3800
3801         if (b_ModulNbr < 4) {
3802            /*******************************/
3803                 /* Test if counter initialised */
3804            /*******************************/
3805
3806                 if (devpriv->
3807                         s_ModuleInfo[b_ModulNbr].
3808                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3809               /********************************************/
3810                         /* Test if frequency mesurement initialised */
3811               /********************************************/
3812
3813                         if (devpriv->
3814                                 s_ModuleInfo[b_ModulNbr].
3815                                 s_SiemensCounterInfo.
3816                                 s_InitFlag.b_FrequencyMeasurementInit == 1) {
3817                  /***************************/
3818                                 /* Test the interrupt mode */
3819                  /***************************/
3820
3821                                 if ((b_InterruptEnable == APCI1710_DISABLE) ||
3822                                         (b_InterruptEnable == APCI1710_ENABLE))
3823                                 {
3824
3825                        /************************************/
3826                                         /* Enable the frequency measurement */
3827                        /************************************/
3828
3829                                         devpriv->
3830                                                 s_ModuleInfo[b_ModulNbr].
3831                                                 s_SiemensCounterInfo.
3832                                                 s_ModeRegister.
3833                                                 s_ByteModeRegister.
3834                                                 b_ModeRegister3 = devpriv->
3835                                                 s_ModuleInfo[b_ModulNbr].
3836                                                 s_SiemensCounterInfo.
3837                                                 s_ModeRegister.
3838                                                 s_ByteModeRegister.
3839                                                 b_ModeRegister3 |
3840                                                 APCI1710_ENABLE_FREQUENCY;
3841
3842                        /*********************************************/
3843                                         /* Disable or enable the frequency interrupt */
3844                        /*********************************************/
3845
3846                                         devpriv->
3847                                                 s_ModuleInfo[b_ModulNbr].
3848                                                 s_SiemensCounterInfo.
3849                                                 s_ModeRegister.
3850                                                 s_ByteModeRegister.
3851                                                 b_ModeRegister3 = (devpriv->
3852                                                 s_ModuleInfo[b_ModulNbr].
3853                                                 s_SiemensCounterInfo.
3854                                                 s_ModeRegister.
3855                                                 s_ByteModeRegister.
3856                                                 b_ModeRegister3 &
3857                                                 APCI1710_DISABLE_FREQUENCY_INT)
3858                                                 | (b_InterruptEnable << 3);
3859
3860                        /***************************/
3861                                         /* Write the configuration */
3862                        /***************************/
3863
3864                                         outl(devpriv->s_ModuleInfo[b_ModulNbr].
3865                                                 s_SiemensCounterInfo.
3866                                                 s_ModeRegister.
3867                                                 dw_ModeRegister1_2_3_4,
3868                                                 devpriv->s_BoardInfos.
3869                                                 ui_Address + 20 +
3870                                                 (64 * b_ModulNbr));
3871
3872                                         devpriv->
3873                                                 s_ModuleInfo[b_ModulNbr].
3874                                                 s_SiemensCounterInfo.
3875                                                 s_InitFlag.
3876                                                 b_FrequencyMeasurementEnable =
3877                                                 1;
3878                                 } else {
3879                     /********************************/
3880                                         /* Interrupt parameter is wrong */
3881                     /********************************/
3882
3883                                         DPRINTK("Interrupt parameter is wrong\n");
3884                                         i_ReturnValue = -5;
3885                                 }
3886                         } else {
3887                  /***********************************************/
3888                                 /* Frequency measurement logic not initialised */
3889                  /***********************************************/
3890
3891                                 DPRINTK("Frequency measurement logic not initialised\n");
3892                                 i_ReturnValue = -4;
3893                         }
3894                 } else {
3895               /****************************************/
3896                         /* Counter not initialised see function */
3897                         /* "i_APCI1710_InitCounter"             */
3898               /****************************************/
3899
3900                         DPRINTK("Counter not initialised\n");
3901                         i_ReturnValue = -3;
3902                 }
3903         } else {
3904            /*************************************************/
3905                 /* The selected module number parameter is wrong */
3906            /*************************************************/
3907
3908                 DPRINTK("The selected module number parameter is wrong\n");
3909                 i_ReturnValue = -2;
3910         }
3911
3912         return i_ReturnValue;
3913 }
3914
3915         /*
3916            +----------------------------------------------------------------------------+
3917            | Function Name     : _INT_ i_APCI1710_DisableFrequencyMeasurement           |
3918            |                            (unsigned char_   b_BoardHandle,                      |
3919            |                             unsigned char_   b_ModulNbr)                         |
3920            +----------------------------------------------------------------------------+
3921            | Task              : Disables the frequency measurement function             |
3922            +----------------------------------------------------------------------------+
3923            | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
3924            |                  unsigned char_  b_ModulNbr       : Number of the module to be   |
3925            |                                            configured (0 to 3)          |
3926            +----------------------------------------------------------------------------+
3927            | Output Parameters : -                                                      |
3928            +----------------------------------------------------------------------------+
3929            | Return Value      :  0: No error                                           |
3930            |                     -1: The handle parameter of the board is wrong         |
3931            |                     -2: The selected module number is wrong                |
3932            |                     -3: Counter not initialised see function               |
3933            |                      "i_APCI1710_InitCounter"                           |
3934            |                     -4: Frequency measurement logic not initialised.       |
3935            |                      See function "i_APCI1710_InitFrequencyMeasurement" |
3936            +----------------------------------------------------------------------------+
3937          */
3938
3939 int i_APCI1710_DisableFrequencyMeasurement(struct comedi_device *dev, unsigned char b_ModulNbr)
3940 {
3941         int i_ReturnValue = 0;
3942
3943         /**************************/
3944         /* Test the module number */
3945         /**************************/
3946
3947         if (b_ModulNbr < 4) {
3948            /*******************************/
3949                 /* Test if counter initialised */
3950            /*******************************/
3951
3952                 if (devpriv->
3953                         s_ModuleInfo[b_ModulNbr].
3954                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3955               /********************************************/
3956                         /* Test if frequency mesurement initialised */
3957               /********************************************/
3958
3959                         if (devpriv->
3960                                 s_ModuleInfo[b_ModulNbr].
3961                                 s_SiemensCounterInfo.
3962                                 s_InitFlag.b_FrequencyMeasurementInit == 1) {
3963                  /*************************************/
3964                                 /* Disable the frequency measurement */
3965                  /*************************************/
3966
3967                                 devpriv->
3968                                         s_ModuleInfo[b_ModulNbr].
3969                                         s_SiemensCounterInfo.
3970                                         s_ModeRegister.
3971                                         s_ByteModeRegister.
3972                                         b_ModeRegister3 = devpriv->
3973                                         s_ModuleInfo[b_ModulNbr].
3974                                         s_SiemensCounterInfo.
3975                                         s_ModeRegister.
3976                                         s_ByteModeRegister.
3977                                         b_ModeRegister3 &
3978                                         APCI1710_DISABLE_FREQUENCY
3979                                         /*  Begin CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared */
3980                                         & APCI1710_DISABLE_FREQUENCY_INT;
3981                                 /*  End CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared */
3982
3983                  /***************************/
3984                                 /* Write the configuration */
3985                  /***************************/
3986
3987                                 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3988                                         s_SiemensCounterInfo.
3989                                         s_ModeRegister.
3990                                         dw_ModeRegister1_2_3_4,
3991                                         devpriv->s_BoardInfos.ui_Address + 20 +
3992                                         (64 * b_ModulNbr));
3993
3994                  /*************************************/
3995                                 /* Disable the frequency measurement */
3996                  /*************************************/
3997
3998                                 devpriv->
3999                                         s_ModuleInfo[b_ModulNbr].
4000                                         s_SiemensCounterInfo.
4001                                         s_InitFlag.
4002                                         b_FrequencyMeasurementEnable = 0;
4003                         } else {
4004                  /***********************************************/
4005                                 /* Frequency measurement logic not initialised */
4006                  /***********************************************/
4007
4008                                 DPRINTK("Frequency measurement logic not initialised\n");
4009                                 i_ReturnValue = -4;
4010                         }
4011                 } else {
4012               /****************************************/
4013                         /* Counter not initialised see function */
4014                         /* "i_APCI1710_InitCounter"             */
4015               /****************************************/
4016
4017                         DPRINTK("Counter not initialised\n");
4018                         i_ReturnValue = -3;
4019                 }
4020         } else {
4021            /*************************************************/
4022                 /* The selected module number parameter is wrong */
4023            /*************************************************/
4024
4025                 DPRINTK("The selected module number parameter is wrong\n");
4026                 i_ReturnValue = -2;
4027         }
4028
4029         return i_ReturnValue;
4030 }
4031
4032 /*########################################################################### */
4033
4034                                                         /*  INSN READ */
4035
4036 /*########################################################################### */
4037
4038 /*
4039 +----------------------------------------------------------------------------+
4040 | Function Name     :INT        i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
4041 struct comedi_insn *insn,unsigned int *data)                   |
4042 +----------------------------------------------------------------------------+
4043 | Task              : Read and Get functions for INC_CPT                                       |
4044 +----------------------------------------------------------------------------+
4045 | Input Parameters  :
4046 +----------------------------------------------------------------------------+
4047 | Output Parameters : -                                                      |
4048 +----------------------------------------------------------------------------+
4049 | Return Value      :
4050 +----------------------------------------------------------------------------+
4051 */
4052 int i_APCI1710_InsnReadINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
4053         struct comedi_insn *insn, unsigned int *data)
4054 {
4055         unsigned int ui_ReadType;
4056         int i_ReturnValue = 0;
4057
4058         ui_ReadType = CR_CHAN(insn->chanspec);
4059
4060         devpriv->tsk_Current = current; /*  Save the current process task structure */
4061         switch (ui_ReadType) {
4062         case APCI1710_INCCPT_READLATCHREGISTERSTATUS:
4063                 i_ReturnValue = i_APCI1710_ReadLatchRegisterStatus(dev,
4064                         (unsigned char) CR_AREF(insn->chanspec),
4065                         (unsigned char) CR_RANGE(insn->chanspec), (unsigned char *) &data[0]);
4066                 break;
4067
4068         case APCI1710_INCCPT_READLATCHREGISTERVALUE:
4069                 i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev,
4070                         (unsigned char) CR_AREF(insn->chanspec),
4071                         (unsigned char) CR_RANGE(insn->chanspec), (unsigned int *) &data[0]);
4072                 printk("Latch Register Value %d\n", data[0]);
4073                 break;
4074
4075         case APCI1710_INCCPT_READ16BITCOUNTERVALUE:
4076                 i_ReturnValue = i_APCI1710_Read16BitCounterValue(dev,
4077                         (unsigned char) CR_AREF(insn->chanspec),
4078                         (unsigned char) CR_RANGE(insn->chanspec), (unsigned int *) &data[0]);
4079                 break;
4080
4081         case APCI1710_INCCPT_READ32BITCOUNTERVALUE:
4082                 i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev,
4083                         (unsigned char) CR_AREF(insn->chanspec), (unsigned int *) &data[0]);
4084                 break;
4085
4086         case APCI1710_INCCPT_GETINDEXSTATUS:
4087                 i_ReturnValue = i_APCI1710_GetIndexStatus(dev,
4088                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
4089                 break;
4090
4091         case APCI1710_INCCPT_GETREFERENCESTATUS:
4092                 i_ReturnValue = i_APCI1710_GetReferenceStatus(dev,
4093                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
4094                 break;
4095
4096         case APCI1710_INCCPT_GETUASSTATUS:
4097                 i_ReturnValue = i_APCI1710_GetUASStatus(dev,
4098                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
4099                 break;
4100
4101         case APCI1710_INCCPT_GETCBSTATUS:
4102                 i_ReturnValue = i_APCI1710_GetCBStatus(dev,
4103                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
4104                 break;
4105
4106         case APCI1710_INCCPT_GET16BITCBSTATUS:
4107                 i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev,
4108                         (unsigned char) CR_AREF(insn->chanspec),
4109                         (unsigned char *) &data[0], (unsigned char *) &data[1]);
4110                 break;
4111
4112         case APCI1710_INCCPT_GETUDSTATUS:
4113                 i_ReturnValue = i_APCI1710_GetUDStatus(dev,
4114                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
4115
4116                 break;
4117
4118         case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS:
4119                 i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev,
4120                         (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
4121                 break;
4122
4123         case APCI1710_INCCPT_READFREQUENCYMEASUREMENT:
4124                 i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev,
4125                         (unsigned char) CR_AREF(insn->chanspec),
4126                         (unsigned char *) &data[0],
4127                         (unsigned char *) &data[1], (unsigned int *) &data[2]);
4128                 break;
4129
4130         case APCI1710_INCCPT_READINTERRUPT:
4131                 data[0] = devpriv->s_InterruptParameters.
4132                         s_FIFOInterruptParameters[devpriv->
4133                         s_InterruptParameters.ui_Read].b_OldModuleMask;
4134                 data[1] = devpriv->s_InterruptParameters.
4135                         s_FIFOInterruptParameters[devpriv->
4136                         s_InterruptParameters.ui_Read].ul_OldInterruptMask;
4137                 data[2] = devpriv->s_InterruptParameters.
4138                         s_FIFOInterruptParameters[devpriv->
4139                         s_InterruptParameters.ui_Read].ul_OldCounterLatchValue;
4140
4141                 /**************************/
4142                 /* Increment the read FIFO */
4143                 /***************************/
4144
4145                 devpriv->
4146                         s_InterruptParameters.
4147                         ui_Read = (devpriv->s_InterruptParameters.
4148                         ui_Read + 1) % APCI1710_SAVE_INTERRUPT;
4149
4150                 break;
4151
4152         default:
4153                 printk("ReadType Parameter wrong\n");
4154         }
4155
4156         if (i_ReturnValue >= 0)
4157                 i_ReturnValue = insn->n;
4158         return i_ReturnValue;
4159
4160 }
4161
4162 /*
4163 +----------------------------------------------------------------------------+
4164 | Function Name     : _INT_ i_APCI1710_ReadLatchRegisterStatus               |
4165 |                                                   (unsigned char_   b_BoardHandle,  |
4166 |                                                    unsigned char_   b_ModulNbr,     |
4167 |                                                    unsigned char_   b_LatchReg,     |
4168 |                                                    unsigned char *_ pb_LatchStatus)  |
4169 +----------------------------------------------------------------------------+
4170 | Task              : Read the latch register status from selected module    |
4171 |                     (b_ModulNbr) and selected latch register (b_LatchReg). |
4172 +----------------------------------------------------------------------------+
4173 | Input Parameters  : unsigned char_ b_BoardHandle : Handle of board APCI-1710        |
4174 |                     unsigned char_ b_ModulNbr    : Module number to configure       |
4175 |                                           (0 to 3)                         |
4176 |                     unsigned char_ b_LatchReg    : Selected latch register          |
4177 |                               0 : for the first latch register             |
4178 |                               1 : for the second latch register            |
4179 +----------------------------------------------------------------------------+
4180 | Output Parameters : unsigned char *_ pb_LatchStatus :   Latch register status.       |
4181 |                                               0 : No latch occur           |
4182 |                                               1 : A software latch occur   |
4183 |                                               2 : A hardware latch occur   |
4184 |                                               3 : A software and hardware  |
4185 |                                                   latch occur              |
4186 +----------------------------------------------------------------------------+
4187 | Return Value      :  0: No error                                           |
4188 |                     -1: The handle parameter of the board is wrong         |
4189 |                     -2: No counter module found                            |
4190 |                     -3: Counter not initialised see function               |
4191 |                         "i_APCI1710_InitCounter"                           |
4192 |                     -4: The selected latch register parameter is wrong     |
4193 +----------------------------------------------------------------------------+
4194 */
4195
4196 int i_APCI1710_ReadLatchRegisterStatus(struct comedi_device *dev,
4197         unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned char *pb_LatchStatus)
4198 {
4199         int i_ReturnValue = 0;
4200         unsigned int dw_LatchReg;
4201
4202         /**************************/
4203         /* Test the module number */
4204         /**************************/
4205
4206         if (b_ModulNbr < 4) {
4207            /*******************************/
4208                 /* Test if counter initialised */
4209            /*******************************/
4210
4211                 if (devpriv->
4212                         s_ModuleInfo[b_ModulNbr].
4213                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4214               /*************************************/
4215                         /* Test the latch register parameter */
4216               /*************************************/
4217
4218                         if (b_LatchReg < 2) {
4219                                 dw_LatchReg = inl(devpriv->s_BoardInfos.
4220                                         ui_Address + (64 * b_ModulNbr));
4221
4222                                 *pb_LatchStatus =
4223                                         (unsigned char) ((dw_LatchReg >> (b_LatchReg *
4224                                                         4)) & 0x3);
4225                         } else {
4226                  /**************************************************/
4227                                 /* The selected latch register parameter is wrong */
4228                  /**************************************************/
4229
4230                                 DPRINTK("The selected latch register parameter is wrong\n");
4231                                 i_ReturnValue = -4;
4232                         }
4233                 } else {
4234               /****************************************/
4235                         /* Counter not initialised see function */
4236                         /* "i_APCI1710_InitCounter"             */
4237               /****************************************/
4238
4239                         DPRINTK("Counter not initialised\n");
4240                         i_ReturnValue = -3;
4241                 }
4242         } else {
4243            /*************************************************/
4244                 /* The selected module number parameter is wrong */
4245            /*************************************************/
4246
4247                 DPRINTK("The selected module number parameter is wrong\n");
4248                 i_ReturnValue = -2;
4249         }
4250
4251         return i_ReturnValue;
4252 }
4253
4254 /*
4255 +----------------------------------------------------------------------------+
4256 | Function Name     : _INT_ i_APCI1710_ReadLatchRegisterValue                |
4257 |                                                   (unsigned char_     b_BoardHandle,|
4258 |                                                    unsigned char_     b_ModulNbr,   |
4259 |                                                    unsigned char_     b_LatchReg,   |
4260 |                                                    PULONG_ pul_LatchValue) |
4261 +----------------------------------------------------------------------------+
4262 | Task              : Read the latch register value from selected module     |
4263 |                     (b_ModulNbr) and selected latch register (b_LatchReg). |
4264 +----------------------------------------------------------------------------+
4265 | Input Parameters  : unsigned char_ b_BoardHandle : Handle of board APCI-1710        |
4266 |                     unsigned char_ b_ModulNbr    : Module number to configure       |
4267 |                                           (0 to 3)                         |
4268 |                     unsigned char_ b_LatchReg    : Selected latch register          |
4269 |                               0 : for the first latch register             |
4270 |                               1 : for the second latch register            |
4271 +----------------------------------------------------------------------------+
4272 | Output Parameters : PULONG_ pul_LatchValue : Latch register value          |
4273 +----------------------------------------------------------------------------+
4274 | Return Value      :  0: No error                                           |
4275 |                     -1: The handle parameter of the board is wrong         |
4276 |                     -2: No counter module found                            |
4277 |                     -3: Counter not initialised see function               |
4278 |                         "i_APCI1710_InitCounter"                           |
4279 |                     -4: The selected latch register parameter is wrong     |
4280 +----------------------------------------------------------------------------+
4281 */
4282
4283 int i_APCI1710_ReadLatchRegisterValue(struct comedi_device *dev,
4284         unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned int *pul_LatchValue)
4285 {
4286         int i_ReturnValue = 0;
4287
4288         /**************************/
4289         /* Test the module number */
4290         /**************************/
4291
4292         if (b_ModulNbr < 4) {
4293            /*******************************/
4294                 /* Test if counter initialised */
4295            /*******************************/
4296
4297                 if (devpriv->
4298                         s_ModuleInfo[b_ModulNbr].
4299                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4300               /*************************************/
4301                         /* Test the latch register parameter */
4302               /*************************************/
4303
4304                         if (b_LatchReg < 2) {
4305                                 *pul_LatchValue = inl(devpriv->s_BoardInfos.
4306                                         ui_Address + ((b_LatchReg + 1) * 4) +
4307                                         (64 * b_ModulNbr));
4308
4309                         } else {
4310                  /**************************************************/
4311                                 /* The selected latch register parameter is wrong */
4312                  /**************************************************/
4313
4314                                 DPRINTK("The selected latch register parameter is wrong\n");
4315                                 i_ReturnValue = -4;
4316                         }
4317                 } else {
4318               /****************************************/
4319                         /* Counter not initialised see function */
4320                         /* "i_APCI1710_InitCounter"             */
4321               /****************************************/
4322
4323                         DPRINTK("Counter not initialised\n");
4324                         i_ReturnValue = -3;
4325                 }
4326         } else {
4327            /*************************************************/
4328                 /* The selected module number parameter is wrong */
4329            /*************************************************/
4330
4331                 DPRINTK("The selected module number parameter is wrong\n");
4332                 i_ReturnValue = -2;
4333         }
4334
4335         return i_ReturnValue;
4336 }
4337
4338 /*
4339 +----------------------------------------------------------------------------+
4340 | Function Name     : _INT_ i_APCI1710_Read16BitCounterValue                 |
4341 |                                       (unsigned char_     b_BoardHandle,            |
4342 |                                        unsigned char_     b_ModulNbr,               |
4343 |                                        unsigned char_     b_SelectedCounter,        |
4344 |                                        unsigned int *_   pui_CounterValue)          |
4345 +----------------------------------------------------------------------------+
4346 | Task              : Latch the selected 16-Bit counter (b_SelectedCounter)  |
4347 |                     from selected module (b_ModulNbr) in to the first      |
4348 |                     latch register and return the latched value.           |
4349 +----------------------------------------------------------------------------+
4350 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4351 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4352 |                                              (0 to 3)                      |
4353 |                     unsigned char_ b_SelectedCounter : Selected 16-Bit counter      |
4354 |                                               (0 or 1)                     |
4355 +----------------------------------------------------------------------------+
4356 | Output Parameters : unsigned int *_ pui_CounterValue : 16-Bit counter value         |
4357 +----------------------------------------------------------------------------+
4358 | Return Value      :  0: No error                                           |
4359 |                     -1: The handle parameter of the board is wrong         |
4360 |                     -2: No counter module found                            |
4361 |                     -3: Counter not initialised see function               |
4362 |                         "i_APCI1710_InitCounter"                           |
4363 |                     -4: The selected 16-Bit counter parameter is wrong     |
4364 +----------------------------------------------------------------------------+
4365 */
4366
4367 int i_APCI1710_Read16BitCounterValue(struct comedi_device *dev,
4368         unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int *pui_CounterValue)
4369 {
4370         int i_ReturnValue = 0;
4371         unsigned int dw_LathchValue = 0;
4372
4373         /**************************/
4374         /* Test the module number */
4375         /**************************/
4376
4377         if (b_ModulNbr < 4) {
4378            /*******************************/
4379                 /* Test if counter initialised */
4380            /*******************************/
4381
4382                 if (devpriv->
4383                         s_ModuleInfo[b_ModulNbr].
4384                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4385               /******************************/
4386                         /* Test the counter selection */
4387               /******************************/
4388
4389                         if (b_SelectedCounter < 2) {
4390                  /*********************/
4391                                 /* Latch the counter */
4392                  /*********************/
4393
4394                                 outl(1, devpriv->s_BoardInfos.
4395                                         ui_Address + (64 * b_ModulNbr));
4396
4397                  /************************/
4398                                 /* Read the latch value */
4399                  /************************/
4400
4401                                 dw_LathchValue = inl(devpriv->s_BoardInfos.
4402                                         ui_Address + 4 + (64 * b_ModulNbr));
4403
4404                                 *pui_CounterValue =
4405                                         (unsigned int) ((dw_LathchValue >> (16 *
4406                                                         b_SelectedCounter)) &
4407                                         0xFFFFU);
4408                         } else {
4409                  /**************************************************/
4410                                 /* The selected 16-Bit counter parameter is wrong */
4411                  /**************************************************/
4412
4413                                 DPRINTK("The selected 16-Bit counter parameter is wrong\n");
4414                                 i_ReturnValue = -4;
4415                         }
4416                 } else {
4417               /****************************************/
4418                         /* Counter not initialised see function */
4419                         /* "i_APCI1710_InitCounter"             */
4420               /****************************************/
4421
4422                         DPRINTK("Counter not initialised\n");
4423                         i_ReturnValue = -3;
4424                 }
4425         } else {
4426            /*************************************************/
4427                 /* The selected module number parameter is wrong */
4428            /*************************************************/
4429
4430                 DPRINTK("The selected module number parameter is wrong\n");
4431                 i_ReturnValue = -2;
4432         }
4433
4434         return i_ReturnValue;
4435 }
4436
4437 /*
4438 +----------------------------------------------------------------------------+
4439 | Function Name     : _INT_ i_APCI1710_Read32BitCounterValue                 |
4440 |                                       (unsigned char_     b_BoardHandle,            |
4441 |                                        unsigned char_     b_ModulNbr,               |
4442 |                                        PULONG_ pul_CounterValue)           |
4443 +----------------------------------------------------------------------------+
4444 | Task              : Latch the 32-Bit counter from selected module          |
4445 |                     (b_ModulNbr) in to the first latch register and return |
4446 |                     the latched value.                                     |
4447 +----------------------------------------------------------------------------+
4448 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4449 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4450 |                                              (0 to 3)                      |
4451 +----------------------------------------------------------------------------+
4452 | Output Parameters : PULONG_  pul_CounterValue : 32-Bit counter value       |
4453 +----------------------------------------------------------------------------+
4454 | Return Value      :  0: No error                                           |
4455 |                     -1: The handle parameter of the board is wrong         |
4456 |                     -2: No counter module found                            |
4457 |                     -3: Counter not initialised see function               |
4458 |                         "i_APCI1710_InitCounter"                           |
4459 +----------------------------------------------------------------------------+
4460 */
4461
4462 int i_APCI1710_Read32BitCounterValue(struct comedi_device *dev,
4463         unsigned char b_ModulNbr, unsigned int *pul_CounterValue)
4464 {
4465         int i_ReturnValue = 0;
4466
4467         /**************************/
4468         /* Test the module number */
4469         /**************************/
4470
4471         if (b_ModulNbr < 4) {
4472            /*******************************/
4473                 /* Test if counter initialised */
4474            /*******************************/
4475
4476                 if (devpriv->
4477                         s_ModuleInfo[b_ModulNbr].
4478                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4479               /*********************/
4480                         /* Tatch the counter */
4481               /*********************/
4482
4483                         outl(1, devpriv->s_BoardInfos.
4484                                 ui_Address + (64 * b_ModulNbr));
4485
4486               /************************/
4487                         /* Read the latch value */
4488               /************************/
4489
4490                         *pul_CounterValue = inl(devpriv->s_BoardInfos.
4491                                 ui_Address + 4 + (64 * b_ModulNbr));
4492                 } else {
4493               /****************************************/
4494                         /* Counter not initialised see function */
4495                         /* "i_APCI1710_InitCounter"             */
4496               /****************************************/
4497
4498                         DPRINTK("Counter not initialised\n");
4499                         i_ReturnValue = -3;
4500                 }
4501         } else {
4502            /*************************************************/
4503                 /* The selected module number parameter is wrong */
4504            /*************************************************/
4505
4506                 DPRINTK("The selected module number parameter is wrong\n");
4507                 i_ReturnValue = -2;
4508         }
4509
4510         return i_ReturnValue;
4511 }
4512
4513 /*
4514 +----------------------------------------------------------------------------+
4515 | Function Name     : _INT_ i_APCI1710_GetIndexStatus (unsigned char_   b_BoardHandle,|
4516 |                                                      unsigned char_   b_ModulNbr,   |
4517 |                                                      unsigned char *_ pb_IndexStatus)|
4518 +----------------------------------------------------------------------------+
4519 | Task              : Return the index status                                |
4520 +----------------------------------------------------------------------------+
4521 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4522 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4523 |                                               (0 to 3)                     |
4524 +----------------------------------------------------------------------------+
4525 | Output Parameters : unsigned char *_ pb_IndexStatus   : 0 : No INDEX occur           |
4526 |                                               1 : A INDEX occur            |
4527 +----------------------------------------------------------------------------+
4528 | Return Value      :  0: No error                                           |
4529 |                     -1: The handle parameter of the board is wrong         |
4530 |                     -2: No counter module found                            |
4531 |                     -3: Counter not initialised see function               |
4532 |                         "i_APCI1710_InitCounter"                           |
4533 |                     -4: Index not initialised see function                 |
4534 |                         "i_APCI1710_InitIndex"                             |
4535 +----------------------------------------------------------------------------+
4536 */
4537
4538 int i_APCI1710_GetIndexStatus(struct comedi_device *dev,
4539         unsigned char b_ModulNbr, unsigned char *pb_IndexStatus)
4540 {
4541         int i_ReturnValue = 0;
4542         unsigned int dw_StatusReg = 0;
4543
4544         /**************************/
4545         /* Test the module number */
4546         /**************************/
4547
4548         if (b_ModulNbr < 4) {
4549            /*******************************/
4550                 /* Test if counter initialised */
4551            /*******************************/
4552
4553                 if (devpriv->
4554                         s_ModuleInfo[b_ModulNbr].
4555                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4556               /*****************************/
4557                         /* Test if index initialised */
4558               /*****************************/
4559
4560                         if (devpriv->
4561                                 s_ModuleInfo[b_ModulNbr].
4562                                 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
4563                                 dw_StatusReg = inl(devpriv->s_BoardInfos.
4564                                         ui_Address + 12 + (64 * b_ModulNbr));
4565
4566                                 *pb_IndexStatus = (unsigned char) (dw_StatusReg & 1);
4567                         } else {
4568                  /*************************************************************/
4569                                 /* Index not initialised see function "i_APCI1710_InitIndex" */
4570                  /*************************************************************/
4571
4572                                 DPRINTK("Index not initialised\n");
4573                                 i_ReturnValue = -4;
4574                         }
4575                 } else {
4576               /****************************************/
4577                         /* Counter not initialised see function */
4578                         /* "i_APCI1710_InitCounter"             */
4579               /****************************************/
4580
4581                         DPRINTK("Counter not initialised\n");
4582                         i_ReturnValue = -3;
4583                 }
4584         } else {
4585            /*************************************************/
4586                 /* The selected module number parameter is wrong */
4587            /*************************************************/
4588
4589                 DPRINTK("The selected module number parameter is wrong\n");
4590                 i_ReturnValue = -2;
4591         }
4592
4593         return i_ReturnValue;
4594 }
4595
4596 /*
4597 +----------------------------------------------------------------------------+
4598 | Function Name     : _INT_ i_APCI1710_GetReferenceStatus                    |
4599 |                                                (unsigned char_   b_BoardHandle,     |
4600 |                                                 unsigned char_   b_ModulNbr,        |
4601 |                                                 unsigned char *_ pb_ReferenceStatus) |
4602 +----------------------------------------------------------------------------+
4603 | Task              : Return the reference status                            |
4604 +----------------------------------------------------------------------------+
4605 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4606 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4607 |                                               (0 to 3)                     |
4608 +----------------------------------------------------------------------------+
4609 | Output Parameters : unsigned char *_ pb_ReferenceStatus   : 0 : No REFERENCE occur   |
4610 |                                                   1 : A REFERENCE occur    |
4611 +----------------------------------------------------------------------------+
4612 | Return Value      :  0: No error                                           |
4613 |                     -1: The handle parameter of the board is wrong         |
4614 |                     -2: No counter module found                            |
4615 |                     -3: Counter not initialised see function               |
4616 |                         "i_APCI1710_InitCounter"                           |
4617 |                     -4: Reference not initialised see function             |
4618 |                         "i_APCI1710_InitReference"                         |
4619 +----------------------------------------------------------------------------+
4620 */
4621
4622 int i_APCI1710_GetReferenceStatus(struct comedi_device *dev,
4623         unsigned char b_ModulNbr, unsigned char *pb_ReferenceStatus)
4624 {
4625         int i_ReturnValue = 0;
4626         unsigned int dw_StatusReg = 0;
4627
4628         /**************************/
4629         /* Test the module number */
4630         /**************************/
4631
4632         if (b_ModulNbr < 4) {
4633            /*******************************/
4634                 /* Test if counter initialised */
4635            /*******************************/
4636
4637                 if (devpriv->
4638                         s_ModuleInfo[b_ModulNbr].
4639                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4640               /*********************************/
4641                         /* Test if reference initialised */
4642               /*********************************/
4643
4644                         if (devpriv->
4645                                 s_ModuleInfo[b_ModulNbr].
4646                                 s_SiemensCounterInfo.
4647                                 s_InitFlag.b_ReferenceInit) {
4648                                 dw_StatusReg = inl(devpriv->s_BoardInfos.
4649                                         ui_Address + 24 + (64 * b_ModulNbr));
4650
4651                                 *pb_ReferenceStatus =
4652                                         (unsigned char) (~dw_StatusReg & 1);
4653                         } else {
4654                  /*********************************************************************/
4655                                 /* Reference not initialised see function "i_APCI1710_InitReference" */
4656                  /*********************************************************************/
4657
4658                                 DPRINTK("Reference not initialised\n");
4659                                 i_ReturnValue = -4;
4660                         }
4661                 } else {
4662               /****************************************/
4663                         /* Counter not initialised see function */
4664                         /* "i_APCI1710_InitCounter"             */
4665               /****************************************/
4666
4667                         DPRINTK("Counter not initialised\n");
4668                         i_ReturnValue = -3;
4669                 }
4670         } else {
4671            /*************************************************/
4672                 /* The selected module number parameter is wrong */
4673            /*************************************************/
4674
4675                 DPRINTK("The selected module number parameter is wrong\n");
4676                 i_ReturnValue = -2;
4677         }
4678
4679         return i_ReturnValue;
4680 }
4681
4682 /*
4683 +----------------------------------------------------------------------------+
4684 | Function Name     : _INT_ i_APCI1710_GetUASStatus                          |
4685 |                               (unsigned char_   b_BoardHandle,                      |
4686 |                                unsigned char_   b_ModulNbr,                         |
4687 |                                unsigned char *_ pb_UASStatus)                        |
4688 +----------------------------------------------------------------------------+
4689 | Task              : Return the error signal (UAS) status                   |
4690 +----------------------------------------------------------------------------+
4691 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4692 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4693 |                                               (0 to 3)                     |
4694 +----------------------------------------------------------------------------+
4695 | Output Parameters : unsigned char *_ pb_UASStatus      : 0 : UAS is low "0"          |
4696 |                                                1 : UAS is high "1"         |
4697 +----------------------------------------------------------------------------+
4698 | Return Value      :  0: No error                                           |
4699 |                     -1: The handle parameter of the board is wrong         |
4700 |                     -2: No counter module found                            |
4701 |                     -3: Counter not initialised see function               |
4702 |                         "i_APCI1710_InitCounter"                           |
4703 +----------------------------------------------------------------------------+
4704 */
4705
4706 int i_APCI1710_GetUASStatus(struct comedi_device *dev,
4707         unsigned char b_ModulNbr, unsigned char *pb_UASStatus)
4708 {
4709         int i_ReturnValue = 0;
4710         unsigned int dw_StatusReg = 0;
4711
4712         /**************************/
4713         /* Test the module number */
4714         /**************************/
4715
4716         if (b_ModulNbr < 4) {
4717            /*******************************/
4718                 /* Test if counter initialised */
4719            /*******************************/
4720
4721                 if (devpriv->
4722                         s_ModuleInfo[b_ModulNbr].
4723                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4724                         dw_StatusReg = inl(devpriv->s_BoardInfos.
4725                                 ui_Address + 24 + (64 * b_ModulNbr));
4726
4727                         *pb_UASStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
4728                 } else {
4729               /****************************************/
4730                         /* Counter not initialised see function */
4731                         /* "i_APCI1710_InitCounter"             */
4732               /****************************************/
4733
4734                         DPRINTK("Counter not initialised\n");
4735                         i_ReturnValue = -3;
4736                 }
4737         } else {
4738            /*************************************************/
4739                 /* The selected module number parameter is wrong */
4740            /*************************************************/
4741
4742                 DPRINTK("The selected module number parameter is wrong\n");
4743                 i_ReturnValue = -2;
4744
4745         }
4746
4747         return i_ReturnValue;
4748 }
4749
4750 /*
4751 +----------------------------------------------------------------------------+
4752 | Function Name     : _INT_ i_APCI1710_GetCBStatus                           |
4753 |                               (unsigned char_   b_BoardHandle,                      |
4754 |                                unsigned char_   b_ModulNbr,                         |
4755 |                                unsigned char *_ pb_CBStatus)                         |
4756 +----------------------------------------------------------------------------+
4757 | Task              : Return the counter overflow status                     |
4758 +----------------------------------------------------------------------------+
4759 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4760 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4761 |                                               (0 to 3)                     |
4762 +----------------------------------------------------------------------------+
4763 | Output Parameters : unsigned char *_ pb_CBStatus      : 0 : Counter no overflow      |
4764 |                                               1 : Counter overflow         |
4765 +----------------------------------------------------------------------------+
4766 | Return Value      :  0: No error                                           |
4767 |                     -1: The handle parameter of the board is wrong         |
4768 |                     -2: No counter module found                            |
4769 |                     -3: Counter not initialised see function               |
4770 |                         "i_APCI1710_InitCounter"                           |
4771 +----------------------------------------------------------------------------+
4772 */
4773
4774 int i_APCI1710_GetCBStatus(struct comedi_device *dev,
4775         unsigned char b_ModulNbr, unsigned char *pb_CBStatus)
4776 {
4777         int i_ReturnValue = 0;
4778         unsigned int dw_StatusReg = 0;
4779
4780         /**************************/
4781         /* Test the module number */
4782         /**************************/
4783
4784         if (b_ModulNbr < 4) {
4785            /*******************************/
4786                 /* Test if counter initialised */
4787            /*******************************/
4788
4789                 if (devpriv->
4790                         s_ModuleInfo[b_ModulNbr].
4791                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4792                         dw_StatusReg = inl(devpriv->s_BoardInfos.
4793                                 ui_Address + 16 + (64 * b_ModulNbr));
4794
4795                         *pb_CBStatus = (unsigned char) (dw_StatusReg & 1);
4796
4797                 } else {
4798               /****************************************/
4799                         /* Counter not initialised see function */
4800                         /* "i_APCI1710_InitCounter"             */
4801               /****************************************/
4802
4803                         DPRINTK("Counter not initialised\n");
4804                         i_ReturnValue = -3;
4805                 }
4806         } else {
4807            /*************************************************/
4808                 /* The selected module number parameter is wrong */
4809            /*************************************************/
4810
4811                 DPRINTK("The selected module number parameter is wrong\n");
4812                 i_ReturnValue = -2;
4813         }
4814
4815         return i_ReturnValue;
4816 }
4817
4818 /*
4819 +----------------------------------------------------------------------------+
4820 | Function Name     : _INT_ i_APCI1710_Get16BitCBStatus                      |
4821 |                                       (unsigned char_     b_BoardHandle,            |
4822 |                                        unsigned char_     b_ModulNbr,               |
4823 |                                        unsigned char *_ pb_CBStatusCounter0,         |
4824 |                                        unsigned char *_ pb_CBStatusCounter1)         |
4825 +----------------------------------------------------------------------------+
4826 | Task              : Returns the counter overflow (counter initialised to   |
4827 |                     2*16-bit) status from selected incremental counter     |
4828 |                     module                                                 |
4829 +----------------------------------------------------------------------------+
4830 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4831 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4832 |                                               (0 to 3)                     |
4833 +----------------------------------------------------------------------------+
4834 | Output Parameters : unsigned char *_ pb_CBStatusCounter0 : 0 : No overflow occur for |
4835 |                                                      the first 16-bit      |
4836 |                                                      counter               |
4837 |                                                  1 : Overflow occur for the|
4838 |                                                      first 16-bit counter  |
4839 |                     unsigned char *_ pb_CBStatusCounter1 : 0 : No overflow occur for |
4840 |                                                      the second 16-bit     |
4841 |                                                      counter               |
4842 |                                                  1 : Overflow occur for the|
4843 |                                                      second 16-bit counter |
4844 +----------------------------------------------------------------------------+
4845 | Return Value      :  0: No error                                           |
4846 |                     -1: The handle parameter of the board is wrong         |
4847 |                     -2: No counter module found                            |
4848 |                     -3: Counter not initialised see function               |
4849 |                         "i_APCI1710_InitCounter"                           |
4850 |                     -4: Counter not initialised to 2*16-bit mode.          |
4851 |                         See function "i_APCI1710_InitCounter"              |
4852 |                     -5: Firmware revision error                            |
4853 +----------------------------------------------------------------------------+
4854 */
4855
4856 int i_APCI1710_Get16BitCBStatus(struct comedi_device *dev,
4857         unsigned char b_ModulNbr, unsigned char *pb_CBStatusCounter0, unsigned char *pb_CBStatusCounter1)
4858 {
4859         int i_ReturnValue = 0;
4860         unsigned int dw_StatusReg = 0;
4861
4862         /**************************/
4863         /* Test the module number */
4864         /**************************/
4865
4866         if (b_ModulNbr < 4) {
4867            /*******************************/
4868                 /* Test if counter initialised */
4869            /*******************************/
4870
4871                 if (devpriv->
4872                         s_ModuleInfo[b_ModulNbr].
4873                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4874               /*************************/
4875                         /* Test if 2*16-Bit mode */
4876               /*************************/
4877
4878                         if ((devpriv->s_ModuleInfo[b_ModulNbr].
4879                                         s_SiemensCounterInfo.
4880                                         s_ModeRegister.
4881                                         s_ByteModeRegister.
4882                                         b_ModeRegister1 & 0x10) == 0x10) {
4883                  /*****************************/
4884                                 /* Test the Firmware version */
4885                  /*****************************/
4886
4887                                 if ((devpriv->s_BoardInfos.
4888                                                 dw_MolduleConfiguration
4889                                                 [b_ModulNbr] & 0xFFFF) >=
4890                                         0x3136) {
4891                                         dw_StatusReg =
4892                                                 inl(devpriv->s_BoardInfos.
4893                                                 ui_Address + 16 +
4894                                                 (64 * b_ModulNbr));
4895
4896                                         *pb_CBStatusCounter1 =
4897                                                 (unsigned char) ((dw_StatusReg >> 0) &
4898                                                 1);
4899                                         *pb_CBStatusCounter0 =
4900                                                 (unsigned char) ((dw_StatusReg >> 1) &
4901                                                 1);
4902                                 }       /*  if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) */
4903                                 else {
4904                     /****************************/
4905                                         /* Firmware revision error  */
4906                     /****************************/
4907
4908                                         i_ReturnValue = -5;
4909                                 }       /*  if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) */
4910                         }       /*  if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) */
4911                         else {
4912                  /********************************************/
4913                                 /* Counter not initialised to 2*16-bit mode */
4914                                 /* "i_APCI1710_InitCounter"                 */
4915                  /********************************************/
4916
4917                                 DPRINTK("Counter not initialised\n");
4918                                 i_ReturnValue = -4;
4919                         }       /*  if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) */
4920                 }               /*  if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) */
4921                 else {
4922               /****************************************/
4923                         /* Counter not initialised see function */
4924                         /* "i_APCI1710_InitCounter"             */
4925               /****************************************/
4926
4927                         DPRINTK("Counter not initialised\n");
4928                         i_ReturnValue = -3;
4929                 }               /*  if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) */
4930         }                       /*  if (b_ModulNbr < 4) */
4931         else {
4932            /*************************************************/
4933                 /* The selected module number parameter is wrong */
4934            /*************************************************/
4935
4936                 DPRINTK("The selected module number parameter is wrong\n");
4937                 i_ReturnValue = -2;
4938         }                       /*  if (b_ModulNbr < 4) */
4939
4940         return i_ReturnValue;
4941 }
4942
4943 /*
4944 +----------------------------------------------------------------------------+
4945 | Function Name     : _INT_ i_APCI1710_GetUDStatus                           |
4946 |                               (unsigned char_   b_BoardHandle,                      |
4947 |                                unsigned char_   b_ModulNbr,                         |
4948 |                                unsigned char *_ pb_UDStatus)                         |
4949 +----------------------------------------------------------------------------+
4950 | Task              : Return the counter progress status                     |
4951 +----------------------------------------------------------------------------+
4952 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
4953 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
4954 |                                               (0 to 3)                     |
4955 +----------------------------------------------------------------------------+
4956 | Output Parameters : unsigned char *_ pb_UDStatus      : 0 : Counter progress in the  |
4957 |                                                   selected mode down       |
4958 |                                               1 : Counter progress in the  |
4959 |                                                   selected mode up         |
4960 +----------------------------------------------------------------------------+
4961 | Return Value      :  0: No error                                           |
4962 |                     -1: The handle parameter of the board is wrong         |
4963 |                     -2: No counter module found                            |
4964 |                     -3: Counter not initialised see function               |
4965 |                         "i_APCI1710_InitCounter"                           |
4966 +----------------------------------------------------------------------------+
4967 */
4968
4969 int i_APCI1710_GetUDStatus(struct comedi_device *dev,
4970         unsigned char b_ModulNbr, unsigned char *pb_UDStatus)
4971 {
4972         int i_ReturnValue = 0;
4973         unsigned int dw_StatusReg = 0;
4974
4975         /**************************/
4976         /* Test the module number */
4977         /**************************/
4978
4979         if (b_ModulNbr < 4) {
4980            /*******************************/
4981                 /* Test if counter initialised */
4982            /*******************************/
4983
4984                 if (devpriv->
4985                         s_ModuleInfo[b_ModulNbr].
4986                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4987                         dw_StatusReg = inl(devpriv->s_BoardInfos.
4988                                 ui_Address + 24 + (64 * b_ModulNbr));
4989
4990                         *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 2) & 1);
4991
4992                 } else {
4993               /****************************************/
4994                         /* Counter not initialised see function */
4995                         /* "i_APCI1710_InitCounter"             */
4996               /****************************************/
4997
4998                         DPRINTK("Counter not initialised\n");
4999                         i_ReturnValue = -3;
5000                 }
5001         } else {
5002            /*************************************************/
5003                 /* The selected module number parameter is wrong */
5004            /*************************************************/
5005
5006                 DPRINTK("The selected module number parameter is wrong\n");
5007                 i_ReturnValue = -2;
5008         }
5009
5010         return i_ReturnValue;
5011 }
5012
5013 /*
5014 +----------------------------------------------------------------------------+
5015 | Function Name     : _INT_ i_APCI1710_GetInterruptUDLatchedStatus           |
5016 |                               (unsigned char_   b_BoardHandle,                      |
5017 |                                unsigned char_   b_ModulNbr,                         |
5018 |                                unsigned char *_ pb_UDStatus)                         |
5019 +----------------------------------------------------------------------------+
5020 | Task              : Return the counter progress latched status after a     |
5021 |                     index interrupt occur.                                 |
5022 +----------------------------------------------------------------------------+
5023 | Input Parameters  : unsigned char_ b_BoardHandle     : Handle of board APCI-1710    |
5024 |                     unsigned char_ b_ModulNbr        : Module number to configure   |
5025 |                                               (0 to 3)                     |
5026 +----------------------------------------------------------------------------+
5027 | Output Parameters : unsigned char *_ pb_UDStatus      : 0 : Counter progress in the  |
5028 |                                                   selected mode down       |
5029 |                                               1 : Counter progress in the  |
5030 |                                                   selected mode up         |
5031 |                                               2 : No index interrupt occur |
5032 +----------------------------------------------------------------------------+
5033 | Return Value      :  0: No error                                           |
5034 |                     -1: The handle parameter of the board is wrong         |
5035 |                     -2: No counter module found                            |
5036 |                     -3: Counter not initialised see function               |
5037 |                         "i_APCI1710_InitCounter"                           |
5038 |                     -4: Interrupt function not initialised.                |
5039 |                         See function "i_APCI1710_SetBoardIntRoutineX"      |
5040 +----------------------------------------------------------------------------+
5041 */
5042
5043 int i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device *dev,
5044         unsigned char b_ModulNbr, unsigned char *pb_UDStatus)
5045 {
5046         int i_ReturnValue = 0;
5047         unsigned int dw_StatusReg = 0;
5048
5049         /**************************/
5050         /* Test the module number */
5051         /**************************/
5052
5053         if (b_ModulNbr < 4) {
5054            /*******************************/
5055                 /* Test if counter initialised */
5056            /*******************************/
5057
5058                 if (devpriv->
5059                         s_ModuleInfo[b_ModulNbr].
5060                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
5061                  /*********************************/
5062                         /* Test if index interrupt occur */
5063                  /*********************************/
5064
5065                         if (devpriv->
5066                                 s_ModuleInfo[b_ModulNbr].
5067                                 s_SiemensCounterInfo.
5068                                 s_InitFlag.b_IndexInterruptOccur == 1) {
5069                                 devpriv->
5070                                         s_ModuleInfo[b_ModulNbr].
5071                                         s_SiemensCounterInfo.
5072                                         s_InitFlag.b_IndexInterruptOccur = 0;
5073
5074                                 dw_StatusReg = inl(devpriv->s_BoardInfos.
5075                                         ui_Address + 12 + (64 * b_ModulNbr));
5076
5077                                 *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
5078                         } else {
5079                     /****************************/
5080                                 /* No index interrupt occur */
5081                     /****************************/
5082
5083                                 *pb_UDStatus = 2;
5084                         }
5085                 } else {
5086               /****************************************/
5087                         /* Counter not initialised see function */
5088                         /* "i_APCI1710_InitCounter"             */
5089               /****************************************/
5090
5091                         DPRINTK("Counter not initialised\n");
5092                         i_ReturnValue = -3;
5093                 }
5094         } else {
5095            /*************************************************/
5096                 /* The selected module number parameter is wrong */
5097            /*************************************************/
5098
5099                 DPRINTK("The selected module number parameter is wrong\n");
5100                 i_ReturnValue = -2;
5101         }
5102
5103         return i_ReturnValue;
5104 }
5105
5106         /*
5107            +----------------------------------------------------------------------------+
5108            | Function Name     : _INT_ i_APCI1710_ReadFrequencyMeasurement              |
5109            |                            (unsigned char_            b_BoardHandle,             |
5110            |                             unsigned char_            b_ModulNbr,                |
5111            |                             unsigned char *_          pb_Status,                  |
5112            |                             PULONG_        pul_ReadValue)               |
5113            +----------------------------------------------------------------------------+
5114            | Task              : Returns the status (pb_Status) and the number of       |
5115            |                  increments in the set time.                            |
5116            |                  See function " i_APCI1710_InitFrequencyMeasurement "   |
5117            +----------------------------------------------------------------------------+
5118            | Input Parameters  : unsigned char_  b_BoardHandle    : Handle of board APCI-1710    |
5119            |                  unsigned char_  b_ModulNbr       : Number of the module to be   |
5120            |                                            configured (0 to 3)          |
5121            +----------------------------------------------------------------------------+
5122            | Output Parameters : unsigned char *_ pb_Status     : Returns the frequency        |
5123            |                                            measurement status           |
5124            |                                            0 : Counting cycle not       |
5125            |                                                started.                 |
5126            |                                            1 : Counting cycle started.  |
5127            |                                            2 : Counting cycle stopped.  |
5128            |                                                The measurement cycle is |
5129            |                                                completed.               |
5130            |                  unsigned char *_ pb_UDStatus      : 0 : Counter progress in the  |
5131            |                                                   selected mode down       |
5132            |                                               1 : Counter progress in the  |
5133            |                                                   selected mode up         |
5134            |                  PULONG_ pul_ReadValue   : Return the number of         |
5135            |                                            increments in the defined    |
5136            |                                            time base.                   |
5137            +----------------------------------------------------------------------------+
5138            | Return Value      :  0: No error                                           |
5139            |                     -1: The handle parameter of the board is wrong         |
5140            |                     -2: The selected module number is wrong                |
5141            |                     -3: Counter not initialised see function               |
5142            |                      "i_APCI1710_InitCounter"                           |
5143            |                     -4: Frequency measurement logic not initialised.       |
5144            |                      See function "i_APCI1710_InitFrequencyMeasurement" |
5145            +----------------------------------------------------------------------------+
5146          */
5147
5148 int i_APCI1710_ReadFrequencyMeasurement(struct comedi_device *dev,
5149         unsigned char b_ModulNbr,
5150         unsigned char *pb_Status, unsigned char *pb_UDStatus, unsigned int *pul_ReadValue)
5151 {
5152         int i_ReturnValue = 0;
5153         unsigned int ui_16BitValue;
5154         unsigned int dw_StatusReg;
5155
5156         /**************************/
5157         /* Test the module number */
5158         /**************************/
5159
5160         if (b_ModulNbr < 4) {
5161            /*******************************/
5162                 /* Test if counter initialised */
5163            /*******************************/
5164
5165                 if (devpriv->
5166                         s_ModuleInfo[b_ModulNbr].
5167                         s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
5168               /********************************************/
5169                         /* Test if frequency mesurement initialised */
5170               /********************************************/
5171
5172                         if (devpriv->
5173                                 s_ModuleInfo[b_ModulNbr].
5174                                 s_SiemensCounterInfo.
5175                                 s_InitFlag.b_FrequencyMeasurementInit == 1) {
5176                  /******************/
5177                                 /* Test if enable */
5178                  /******************/
5179
5180                                 if (devpriv->
5181                                         s_ModuleInfo[b_ModulNbr].
5182                                         s_SiemensCounterInfo.
5183                                         s_InitFlag.
5184                                         b_FrequencyMeasurementEnable == 1) {
5185                     /*******************/
5186                                         /* Read the status */
5187                     /*******************/
5188
5189                                         dw_StatusReg =
5190                                                 inl(devpriv->s_BoardInfos.
5191                                                 ui_Address + 32 +
5192                                                 (64 * b_ModulNbr));
5193
5194                     /**************************/
5195                                         /* Test if frequency stop */
5196                     /**************************/
5197
5198                                         if (dw_StatusReg & 1) {
5199                                                 *pb_Status = 2;
5200                                                 *pb_UDStatus =
5201                                                         (unsigned char) ((dw_StatusReg >>
5202                                                                 1) & 3);
5203
5204                        /******************/
5205                                                 /* Read the value */
5206                        /******************/
5207
5208                                                 *pul_ReadValue =
5209                                                         inl(devpriv->
5210                                                         s_BoardInfos.
5211                                                         ui_Address + 28 +
5212                                                         (64 * b_ModulNbr));
5213
5214                                                 if (*pb_UDStatus == 0) {
5215                           /*************************/
5216                                                         /* Test the counter mode */
5217                           /*************************/
5218
5219                                                         if ((devpriv->s_ModuleInfo[b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & APCI1710_16BIT_COUNTER) == APCI1710_16BIT_COUNTER) {
5220                              /****************************************/
5221                                                                 /* Test if 16-bit counter 1 pulse occur */
5222                              /****************************************/
5223
5224                                                                 if ((*pul_ReadValue & 0xFFFFU) != 0) {
5225                                                                         ui_16BitValue
5226                                                                                 =
5227                                                                                 (unsigned int)
5228                                                                                 *
5229                                                                                 pul_ReadValue
5230                                                                                 &
5231                                                                                 0xFFFFU;
5232                                                                         *pul_ReadValue
5233                                                                                 =
5234                                                                                 (*pul_ReadValue
5235                                                                                 &
5236                                                                                 0xFFFF0000UL)
5237                                                                                 |
5238                                                                                 (0xFFFFU
5239                                                                                 -
5240                                                                                 ui_16BitValue);
5241                                                                 }
5242
5243                              /****************************************/
5244                                                                 /* Test if 16-bit counter 2 pulse occur */
5245                              /****************************************/
5246
5247                                                                 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
5248                                                                         ui_16BitValue
5249                                                                                 =
5250                                                                                 (unsigned int)
5251                                                                                 (
5252                                                                                 (*pul_ReadValue
5253                                                                                         >>
5254                                                                                         16)
5255                                                                                 &
5256                                                                                 0xFFFFU);
5257                                                                         *pul_ReadValue
5258                                                                                 =
5259                                                                                 (*pul_ReadValue
5260                                                                                 &
5261                                                                                 0xFFFFUL)
5262                                                                                 |
5263                                                                                 (
5264                                                                                 (0xFFFFU - ui_16BitValue) << 16);
5265                                                                 }
5266                                                         } else {
5267                                                                 if (*pul_ReadValue != 0) {
5268                                                                         *pul_ReadValue
5269                                                                                 =
5270                                                                                 0xFFFFFFFFUL
5271                                                                                 -
5272                                                                                 *pul_ReadValue;
5273                                                                 }
5274                                                         }
5275                                                 } else {
5276                                                         if (*pb_UDStatus == 1) {
5277                              /****************************************/
5278                                                                 /* Test if 16-bit counter 2 pulse occur */
5279                              /****************************************/
5280
5281                                                                 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
5282                                                                         ui_16BitValue
5283                                                                                 =
5284                                                                                 (unsigned int)
5285                                                                                 (
5286                                                                                 (*pul_ReadValue
5287                                                                                         >>
5288                                                                                         16)
5289                                                                                 &
5290                                                                                 0xFFFFU);
5291                                                                         *pul_ReadValue
5292                                                                                 =
5293                                                                                 (*pul_ReadValue
5294                                                                                 &
5295                                                                                 0xFFFFUL)
5296                                                                                 |
5297                                                                                 (
5298                                                                                 (0xFFFFU - ui_16BitValue) << 16);
5299                                                                 }
5300                                                         } else {
5301                                                                 if (*pb_UDStatus
5302                                                                         == 2) {
5303                                 /****************************************/
5304                                                                         /* Test if 16-bit counter 1 pulse occur */
5305                                 /****************************************/
5306
5307                                                                         if ((*pul_ReadValue & 0xFFFFU) != 0) {
5308                                                                                 ui_16BitValue
5309                                                                                         =
5310                                                                                         (unsigned int)
5311                                                                                         *
5312                                                                                         pul_ReadValue
5313                                                                                         &
5314                                                                                         0xFFFFU;
5315                                                                                 *pul_ReadValue
5316                                                                                         =
5317                                                                                         (*pul_ReadValue
5318                                                                                         &
5319                                                                                         0xFFFF0000UL)
5320                                                                                         |
5321                                                                                         (0xFFFFU
5322                                                                                         -
5323                                                                                         ui_16BitValue);
5324                                                                         }
5325                                                                 }
5326                                                         }
5327                                                 }
5328                                         } else {
5329                                                 *pb_Status = 1;
5330                                                 *pb_UDStatus = 0;
5331                                         }
5332                                 } else {
5333                                         *pb_Status = 0;
5334                                         *pb_UDStatus = 0;
5335                                 }
5336                         } else {
5337                  /***********************************************/
5338                                 /* Frequency measurement logic not initialised */
5339                  /***********************************************/
5340
5341                                 DPRINTK("Frequency measurement logic not initialised\n");
5342                                 i_ReturnValue = -4;
5343                         }
5344                 } else {
5345               /****************************************/
5346                         /* Counter not initialised see function */
5347                         /* "i_APCI1710_InitCounter"             */
5348               /****************************************/
5349
5350                         DPRINTK("Counter not initialised\n");
5351                         i_ReturnValue = -3;
5352                 }
5353         } else {
5354            /*************************************************/
5355                 /* The selected module number parameter is wrong */
5356            /*************************************************/
5357
5358                 DPRINTK("The selected module number parameter is wrong\n");
5359                 i_ReturnValue = -2;
5360         }
5361
5362         return i_ReturnValue;
5363 }