APCI1710_INCCPT.c revision 34c43922e62708d45e9660eee4b4f1fb7b4bf2c7
1/**
2@verbatim
3
4Copyright (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
14This 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
16This 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
18You 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
20You 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,
65comedi_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
78INT i_APCI1710_InsnConfigINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
79	comedi_insn * insn, unsigned int * data)
80{
81	UINT 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			(BYTE) data[0],
93			(BYTE) data[1],
94			(BYTE) data[2], (BYTE) data[3], (BYTE) data[4]);
95		break;
96
97	case APCI1710_INCCPT_COUNTERAUTOTEST:
98		i_ReturnValue = i_APCI1710_CounterAutoTest(dev,
99			(PBYTE) & data[0]);
100		break;
101
102	case APCI1710_INCCPT_INITINDEX:
103		i_ReturnValue = i_APCI1710_InitIndex(dev,
104			CR_AREF(insn->chanspec),
105			(BYTE) data[0],
106			(BYTE) data[1], (BYTE) data[2], (BYTE) data[3]);
107		break;
108
109	case APCI1710_INCCPT_INITREFERENCE:
110		i_ReturnValue = i_APCI1710_InitReference(dev,
111			CR_AREF(insn->chanspec), (BYTE) data[0]);
112		break;
113
114	case APCI1710_INCCPT_INITEXTERNALSTROBE:
115		i_ReturnValue = i_APCI1710_InitExternalStrobe(dev,
116			CR_AREF(insn->chanspec),
117			(BYTE) data[0], (BYTE) data[1]);
118		break;
119
120	case APCI1710_INCCPT_INITCOMPARELOGIC:
121		i_ReturnValue = i_APCI1710_InitCompareLogic(dev,
122			CR_AREF(insn->chanspec), (UINT) data[0]);
123		break;
124
125	case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT:
126		i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev,
127			CR_AREF(insn->chanspec),
128			(BYTE) data[0],
129			(BYTE) data[1], (ULONG) data[2], (PULONG) & 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|                               (BYTE_          b_BoardHandle,               |
146|                                BYTE_          b_ModulNbr,                  |
147|                                BYTE_          b_CounterRange,              |
148|                                BYTE_          b_FirstCounterModus,         |
149|                                BYTE_          b_FirstCounterOption,        |
150|                                BYTE_          b_SecondCounterModus,        |
151|                                BYTE_          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  : BYTE_ b_BoardHandle         : Handle of board APCI-1710|
277|                     BYTE_ b_ModulNbr            : Module number to         |
278|                                                   configure (0 to 3)       |
279|                     BYTE_ b_CounterRange        : Selection form counter   |
280|                                                   range.                   |
281|                     BYTE_ b_FirstCounterModus   : First counter operating  |
282|                                                   mode.                    |
283|                     BYTE_ b_FirstCounterOption  : First counter  option.   |
284|                     BYTE_ b_SecondCounterModus  : Second counter operating |
285|                                                   mode.                    |
286|                     BYTE_ 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
302INT i_APCI1710_InitCounter(struct comedi_device * dev,
303	BYTE b_ModulNbr,
304	BYTE b_CounterRange,
305	BYTE b_FirstCounterModus,
306	BYTE b_FirstCounterOption,
307	BYTE b_SecondCounterModus, BYTE 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|                                               (BYTE_     b_BoardHandle,    |
512|                                                PBYTE_   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  : BYTE_   b_BoardHandle : Handle of board APCI-1710      |  |
539+----------------------------------------------------------------------------+
540| Output Parameters : PBYTE_ 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
548INT i_APCI1710_CounterAutoTest(struct comedi_device * dev, PBYTE pb_TestStatus)
549{
550	BYTE b_ModulCpt = 0;
551	INT i_ReturnValue = 0;
552	DWORD 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 (BYTE_ b_BoardHandle,       |
636|                                                 BYTE_ b_ModulNbr,          |
637|                                                 BYTE_ b_ReferenceAction,   |
638|                                                 BYTE_ b_IndexOperation,    |
639|                                                 BYTE_ b_AutoMode,          |
640|                                                 BYTE_ 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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
669|                     BYTE_ b_ModulNbr        : Module number to configure   |
670|                                               (0 to 3)                     |
671|                     BYTE_ 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|                     BYTE_ b_IndexOperation  : Index operating mode.        |
681|                                               See table.                   |
682|                     BYTE_ 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|                     BYTE_ 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
711INT i_APCI1710_InitIndex(struct comedi_device * dev,
712	BYTE b_ModulNbr,
713	BYTE b_ReferenceAction,
714	BYTE b_IndexOperation, BYTE b_AutoMode, BYTE 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|                                                (BYTE_ b_BoardHandle,       |
1123|                                                 BYTE_ b_ModulNbr,          |
1124|                                                 BYTE_ 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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
1140|                     BYTE_ b_ModulNbr        : Module number to configure   |
1141|                                               (0 to 3)                     |
1142|                     BYTE_ 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
1155INT i_APCI1710_InitReference(struct comedi_device * dev,
1156	BYTE b_ModulNbr, BYTE 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|					(BYTE_ b_BoardHandle,                |
1249|					 BYTE_ b_ModulNbr,                   |
1250|					 BYTE_ b_ExternalStrobe,             |
1251|					 BYTE_ b_ExternalStrobeLevel)        |
1252+----------------------------------------------------------------------------+
1253| Task              : Initialises the external strobe level corresponding to |
1254|		      the selected module (b_ModulNbr).                      |
1255+----------------------------------------------------------------------------+
1256| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
1257|                     BYTE_ b_ModulNbr        : Module number to configure   |
1258|                                               (0 to 3)                     |
1259|		      BYTE_ b_ExternalStrobe  : External strobe selection    |
1260|						0 : External strobe A        |
1261|						1 : External strobe B        |
1262|		      BYTE_ 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
1280INT i_APCI1710_InitExternalStrobe(struct comedi_device * dev,
1281	BYTE b_ModulNbr, BYTE b_ExternalStrobe, BYTE 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	   |                               (BYTE_   b_BoardHandle,                      |
1372	   |                                BYTE_   b_ModulNbr,                         |
1373	   |                                UINT_  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  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
1380	   |                     BYTE_  b_ModulNbr       : Module number to configure   |
1381	   |                                               (0 to 3)                     |
1382	   |                     UINT_ 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
1394INT i_APCI1710_InitCompareLogic(struct comedi_device * dev,
1395	BYTE b_ModulNbr, UINT 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|				(BYTE_		 b_BoardHandle,              |
1444|				 BYTE_		 b_ModulNbr,                 |
1445|				 BYTE_		 b_PCIInputClock,            |
1446|				 BYTE_		 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  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
1460|		      BYTE_  b_ModulNbr	      :	Number of the module to be   |
1461|						configured (0 to 3)          |
1462|		      BYTE_  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|		      BYTE_  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
1490INT i_APCI1710_InitFrequencyMeasurement(struct comedi_device * dev,
1491	BYTE b_ModulNbr,
1492	BYTE b_PCIInputClock,
1493	BYTE b_TimingUnity,
1494	ULONG ul_TimingInterval, PULONG pul_RealTimingInterval)
1495{
1496	INT i_ReturnValue = 0;
1497	ULONG ul_TimerValue = 0;
1498	double d_RealTimingInterval;
1499	DWORD 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										(ULONG)
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										(ULONG)
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										(ULONG)
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										(ULONG)
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										(ULONG)
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,
2006comedi_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
2018INT i_APCI1710_InsnBitsINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
2019	comedi_insn * insn, unsigned int * data)
2020{
2021	UINT 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			(BYTE) 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			(BYTE) CR_AREF(insn->chanspec),
2039			(BYTE) data[0], (BYTE) data[1]);
2040		break;
2041
2042	case APCI1710_INCCPT_LATCHCOUNTER:
2043		i_ReturnValue = i_APCI1710_LatchCounter(dev,
2044			(BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]);
2045		break;
2046
2047	case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE:
2048		i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev,
2049			(BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]);
2050		break;
2051
2052	case APCI1710_INCCPT_SETDIGITALCHLON:
2053		i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev,
2054			(BYTE) CR_AREF(insn->chanspec));
2055		break;
2056
2057	case APCI1710_INCCPT_SETDIGITALCHLOFF:
2058		i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev,
2059			(BYTE) 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|                               (BYTE_      b_BoardHandle,                   |
2075|                                BYTE_       b_ModulNbr)                     |
2076+----------------------------------------------------------------------------+
2077| Task              : Clear the counter value from selected module           |
2078|                     (b_ModulNbr).                                          |
2079+----------------------------------------------------------------------------+
2080| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
2081|                     BYTE_ 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
2094INT i_APCI1710_ClearCounterValue(struct comedi_device * dev, BYTE 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|                               (BYTE_      b_BoardHandle)                   |
2141+----------------------------------------------------------------------------+
2142| Task              : Clear all counter value.                               |
2143+----------------------------------------------------------------------------+
2144| Input Parameters  : BYTE_ 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
2154INT i_APCI1710_ClearAllCounterValue(struct comedi_device * dev)
2155{
2156	BYTE 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|					(BYTE_ b_BoardHandle,                |
2208|					 BYTE_ b_Module,                     |
2209|					 BYTE_ b_PCIInputClock,              |
2210|					 BYTE_ 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  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
2216|		      BYTE_  b_ModulNbr	      :	Number of the module to be   |
2217|						configured (0 to 3)          |
2218|		      BYTE_  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|		      BYTE_  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
2300INT i_APCI1710_SetInputFilter(struct comedi_device * dev,
2301	BYTE b_ModulNbr, BYTE b_PCIInputClock, BYTE b_Filter)
2302{
2303	INT i_ReturnValue = 0;
2304	DWORD 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 (BYTE_ b_BoardHandle,    |
2539|                                                    BYTE_ b_ModulNbr,       |
2540|                                                    BYTE_ 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  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
2547|                     BYTE_ b_ModulNbr    : Module number to configure       |
2548|                                           (0 to 3)                         |
2549|                     BYTE_ 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
2564INT i_APCI1710_LatchCounter(struct comedi_device * dev,
2565	BYTE b_ModulNbr, BYTE 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|					(BYTE_ b_BoardHandle,                |
2626|					 BYTE_ b_ModulNbr,                   |
2627|					 BYTE_ 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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
2635|                     BYTE_ b_ModulNbr        : Module number to configure   |
2636|                                               (0 to 3)                     |
2637|		      BYTE_ 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
2661INT i_APCI1710_SetIndexAndReferenceSource(struct comedi_device * dev,
2662	BYTE b_ModulNbr, BYTE 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|				   (BYTE_  b_BoardHandle,                    |
2779|				    BYTE_  b_ModulNbr)                       |
2780+----------------------------------------------------------------------------+
2781| Task              : Sets the digital output H Setting an output means      |
2782|		      setting an ouput high.                                 |
2783+----------------------------------------------------------------------------+
2784| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
2785|		      BYTE_  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
2798INT i_APCI1710_SetDigitalChlOn(struct comedi_device * dev, BYTE 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|				   (BYTE_  b_BoardHandle,                    |
2859|				    BYTE_  b_ModulNbr)                       |
2860+----------------------------------------------------------------------------+
2861| Task              : Resets the digital output H. Resetting an output means |
2862|		      setting an ouput low.                                  |
2863+----------------------------------------------------------------------------+
2864| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
2865|		      BYTE_  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
2878INT i_APCI1710_SetDigitalChlOff(struct comedi_device * dev, BYTE 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,
2943comedi_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*/
2954INT i_APCI1710_InsnWriteINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
2955	comedi_insn * insn, unsigned int * data)
2956{
2957	UINT 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			(BYTE) CR_AREF(insn->chanspec));
2967		break;
2968
2969	case APCI1710_INCCPT_DISABLELATCHINTERRUPT:
2970		i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev,
2971			(BYTE) CR_AREF(insn->chanspec));
2972		break;
2973
2974	case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE:
2975		i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev,
2976			(BYTE) CR_AREF(insn->chanspec),
2977			(BYTE) data[0], (UINT) data[1]);
2978		break;
2979
2980	case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE:
2981		i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev,
2982			(BYTE) CR_AREF(insn->chanspec), (ULONG) data[0]);
2983
2984		break;
2985
2986	case APCI1710_INCCPT_ENABLEINDEX:
2987		i_APCI1710_EnableIndex(dev, (BYTE) CR_AREF(insn->chanspec));
2988		break;
2989
2990	case APCI1710_INCCPT_DISABLEINDEX:
2991		i_ReturnValue = i_APCI1710_DisableIndex(dev,
2992			(BYTE) CR_AREF(insn->chanspec));
2993		break;
2994
2995	case APCI1710_INCCPT_ENABLECOMPARELOGIC:
2996		i_ReturnValue = i_APCI1710_EnableCompareLogic(dev,
2997			(BYTE) CR_AREF(insn->chanspec));
2998		break;
2999
3000	case APCI1710_INCCPT_DISABLECOMPARELOGIC:
3001		i_ReturnValue = i_APCI1710_DisableCompareLogic(dev,
3002			(BYTE) CR_AREF(insn->chanspec));
3003		break;
3004
3005	case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT:
3006		i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev,
3007			(BYTE) CR_AREF(insn->chanspec), (BYTE) data[0]);
3008		break;
3009
3010	case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT:
3011		i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev,
3012			(BYTE) 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|                               (BYTE_ b_BoardHandle,                        |
3028|                                BYTE_ 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  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
3035|                     BYTE_ 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
3050INT i_APCI1710_EnableLatchInterrupt(struct comedi_device * dev, BYTE 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|                               (BYTE_ b_BoardHandle,                        |
3115|                                BYTE_ b_ModulNbr)                           |
3116+----------------------------------------------------------------------------+
3117| Task              : Disable the latch interrupt from selected module       |
3118|                     (b_ModulNbr).                                          |
3119+----------------------------------------------------------------------------+
3120| Input Parameters  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
3121|                     BYTE_ 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
3136INT i_APCI1710_DisableLatchInterrupt(struct comedi_device * dev, BYTE 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|                                               (BYTE_  b_BoardHandle        |
3208|                                                BYTE_  b_ModulNbr,          |
3209|                                                BYTE_  b_SelectedCounter,   |
3210|                                                UINT_ 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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
3217|                     BYTE_ b_ModulNbr        : Module number to configure   |
3218|                                              (0 to 3)                      |
3219|                     BYTE_ b_SelectedCounter : Selected 16-Bit counter      |
3220|                                               (0 or 1)                     |
3221|                     UINT_ 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
3234INT i_APCI1710_Write16BitCounterValue(struct comedi_device * dev,
3235	BYTE b_ModulNbr, BYTE b_SelectedCounter, UINT 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((ULONG) ((ULONG) (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|                                               (BYTE_   b_BoardHandle       |
3298|                                                BYTE_   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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
3305|                     BYTE_ 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
3319INT i_APCI1710_Write32BitCounterValue(struct comedi_device * dev,
3320	BYTE b_ModulNbr, ULONG 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 (BYTE_  b_BoardHandle,    |
3366|                                                   BYTE_  b_ModulNbr)       |
3367+----------------------------------------------------------------------------+
3368| Task              : Enable the INDEX actions                               |
3369+----------------------------------------------------------------------------+
3370| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
3371|                     BYTE_ 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
3386INT i_APCI1710_EnableIndex(struct comedi_device * dev, BYTE b_ModulNbr)
3387{
3388	INT i_ReturnValue = 0;
3389	ULONG 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 (BYTE_  b_BoardHandle,   |
3464|                                                    BYTE_  b_ModulNbr)      |
3465+----------------------------------------------------------------------------+
3466| Task              : Disable the INDEX actions                              |
3467+----------------------------------------------------------------------------+
3468| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
3469|                     BYTE_ 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
3484INT i_APCI1710_DisableIndex(struct comedi_device * dev, BYTE 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|                               (BYTE_   b_BoardHandle,                      |
3559|                                BYTE_   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  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
3566|                     BYTE_  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
3583INT i_APCI1710_EnableCompareLogic(struct comedi_device * dev, BYTE 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|                               (BYTE_   b_BoardHandle,                      |
3663|                                BYTE_   b_ModulNbr)                         |
3664+----------------------------------------------------------------------------+
3665| Task              : Disable the 32-Bit compare logic.
3666+----------------------------------------------------------------------------+
3667| Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
3668|                     BYTE_  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
3683INT i_APCI1710_DisableCompareLogic(struct comedi_device * dev, BYTE 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	   |                            (BYTE_   b_BoardHandle,                      |
3763	   |                             BYTE_   b_ModulNbr,                         |
3764	   |                             BYTE_   b_InterruptEnable)                  |
3765	   +----------------------------------------------------------------------------+
3766	   | Task              : Enables the frequency measurement function             |
3767	   +----------------------------------------------------------------------------+
3768	   | Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
3769	   |                  BYTE_  b_ModulNbr       : Number of the module to be   |
3770	   |                                            configured (0 to 3)          |
3771	   |                  BYTE_  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
3792INT i_APCI1710_EnableFrequencyMeasurement(struct comedi_device * dev,
3793	BYTE b_ModulNbr, BYTE 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	   |                            (BYTE_   b_BoardHandle,                      |
3919	   |                             BYTE_   b_ModulNbr)                         |
3920	   +----------------------------------------------------------------------------+
3921	   | Task              : Disables the frequency measurement function             |
3922	   +----------------------------------------------------------------------------+
3923	   | Input Parameters  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
3924	   |                  BYTE_  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
3939INT i_APCI1710_DisableFrequencyMeasurement(struct comedi_device * dev, BYTE 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,
4041comedi_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*/
4052INT i_APCI1710_InsnReadINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
4053	comedi_insn * insn, unsigned int * data)
4054{
4055	UINT 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			(BYTE) CR_AREF(insn->chanspec),
4065			(BYTE) CR_RANGE(insn->chanspec), (PBYTE) & data[0]);
4066		break;
4067
4068	case APCI1710_INCCPT_READLATCHREGISTERVALUE:
4069		i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev,
4070			(BYTE) CR_AREF(insn->chanspec),
4071			(BYTE) CR_RANGE(insn->chanspec), (PULONG) & 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			(BYTE) CR_AREF(insn->chanspec),
4078			(BYTE) CR_RANGE(insn->chanspec), (PUINT) & data[0]);
4079		break;
4080
4081	case APCI1710_INCCPT_READ32BITCOUNTERVALUE:
4082		i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev,
4083			(BYTE) CR_AREF(insn->chanspec), (PULONG) & data[0]);
4084		break;
4085
4086	case APCI1710_INCCPT_GETINDEXSTATUS:
4087		i_ReturnValue = i_APCI1710_GetIndexStatus(dev,
4088			(BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
4089		break;
4090
4091	case APCI1710_INCCPT_GETREFERENCESTATUS:
4092		i_ReturnValue = i_APCI1710_GetReferenceStatus(dev,
4093			(BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
4094		break;
4095
4096	case APCI1710_INCCPT_GETUASSTATUS:
4097		i_ReturnValue = i_APCI1710_GetUASStatus(dev,
4098			(BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
4099		break;
4100
4101	case APCI1710_INCCPT_GETCBSTATUS:
4102		i_ReturnValue = i_APCI1710_GetCBStatus(dev,
4103			(BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
4104		break;
4105
4106	case APCI1710_INCCPT_GET16BITCBSTATUS:
4107		i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev,
4108			(BYTE) CR_AREF(insn->chanspec),
4109			(PBYTE) & data[0], (PBYTE) & data[1]);
4110		break;
4111
4112	case APCI1710_INCCPT_GETUDSTATUS:
4113		i_ReturnValue = i_APCI1710_GetUDStatus(dev,
4114			(BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
4115
4116		break;
4117
4118	case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS:
4119		i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev,
4120			(BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
4121		break;
4122
4123	case APCI1710_INCCPT_READFREQUENCYMEASUREMENT:
4124		i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev,
4125			(BYTE) CR_AREF(insn->chanspec),
4126			(PBYTE) & data[0],
4127			(PBYTE) & data[1], (PULONG) & 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|                                                   (BYTE_   b_BoardHandle,  |
4166|                                                    BYTE_   b_ModulNbr,     |
4167|                                                    BYTE_   b_LatchReg,     |
4168|                                                    PBYTE_ 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  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
4174|                     BYTE_ b_ModulNbr    : Module number to configure       |
4175|                                           (0 to 3)                         |
4176|                     BYTE_ b_LatchReg    : Selected latch register          |
4177|                               0 : for the first latch register             |
4178|                               1 : for the second latch register            |
4179+----------------------------------------------------------------------------+
4180| Output Parameters : PBYTE_ 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
4196INT i_APCI1710_ReadLatchRegisterStatus(struct comedi_device * dev,
4197	BYTE b_ModulNbr, BYTE b_LatchReg, PBYTE pb_LatchStatus)
4198{
4199	INT i_ReturnValue = 0;
4200	DWORD 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					(BYTE) ((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|                                                   (BYTE_     b_BoardHandle,|
4258|                                                    BYTE_     b_ModulNbr,   |
4259|                                                    BYTE_     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  : BYTE_ b_BoardHandle : Handle of board APCI-1710        |
4266|                     BYTE_ b_ModulNbr    : Module number to configure       |
4267|                                           (0 to 3)                         |
4268|                     BYTE_ 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
4283INT i_APCI1710_ReadLatchRegisterValue(struct comedi_device * dev,
4284	BYTE b_ModulNbr, BYTE b_LatchReg, PULONG 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|                                       (BYTE_     b_BoardHandle,            |
4342|                                        BYTE_     b_ModulNbr,               |
4343|                                        BYTE_     b_SelectedCounter,        |
4344|                                        PUINT_   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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4351|                     BYTE_ b_ModulNbr        : Module number to configure   |
4352|                                              (0 to 3)                      |
4353|                     BYTE_ b_SelectedCounter : Selected 16-Bit counter      |
4354|                                               (0 or 1)                     |
4355+----------------------------------------------------------------------------+
4356| Output Parameters : PUINT_ 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
4367INT i_APCI1710_Read16BitCounterValue(struct comedi_device * dev,
4368	BYTE b_ModulNbr, BYTE b_SelectedCounter, PUINT pui_CounterValue)
4369{
4370	INT i_ReturnValue = 0;
4371	DWORD 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					(UINT) ((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|                                       (BYTE_     b_BoardHandle,            |
4441|                                        BYTE_     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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4449|                     BYTE_ 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
4462INT i_APCI1710_Read32BitCounterValue(struct comedi_device * dev,
4463	BYTE b_ModulNbr, PULONG 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 (BYTE_   b_BoardHandle,|
4516|                                                      BYTE_   b_ModulNbr,   |
4517|                                                      PBYTE_ pb_IndexStatus)|
4518+----------------------------------------------------------------------------+
4519| Task              : Return the index status                                |
4520+----------------------------------------------------------------------------+
4521| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4522|                     BYTE_ b_ModulNbr        : Module number to configure   |
4523|                                               (0 to 3)                     |
4524+----------------------------------------------------------------------------+
4525| Output Parameters : PBYTE_ 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
4538INT i_APCI1710_GetIndexStatus(struct comedi_device * dev,
4539	BYTE b_ModulNbr, PBYTE pb_IndexStatus)
4540{
4541	INT i_ReturnValue = 0;
4542	DWORD 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 = (BYTE) (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|                                                (BYTE_   b_BoardHandle,     |
4600|                                                 BYTE_   b_ModulNbr,        |
4601|                                                 PBYTE_ pb_ReferenceStatus) |
4602+----------------------------------------------------------------------------+
4603| Task              : Return the reference status                            |
4604+----------------------------------------------------------------------------+
4605| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4606|                     BYTE_ b_ModulNbr        : Module number to configure   |
4607|                                               (0 to 3)                     |
4608+----------------------------------------------------------------------------+
4609| Output Parameters : PBYTE_ 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
4622INT i_APCI1710_GetReferenceStatus(struct comedi_device * dev,
4623	BYTE b_ModulNbr, PBYTE pb_ReferenceStatus)
4624{
4625	INT i_ReturnValue = 0;
4626	DWORD 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					(BYTE) (~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|                               (BYTE_   b_BoardHandle,                      |
4686|                                BYTE_   b_ModulNbr,                         |
4687|                                PBYTE_ pb_UASStatus)                        |
4688+----------------------------------------------------------------------------+
4689| Task              : Return the error signal (UAS) status                   |
4690+----------------------------------------------------------------------------+
4691| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4692|                     BYTE_ b_ModulNbr        : Module number to configure   |
4693|                                               (0 to 3)                     |
4694+----------------------------------------------------------------------------+
4695| Output Parameters : PBYTE_ 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
4706INT i_APCI1710_GetUASStatus(struct comedi_device * dev,
4707	BYTE b_ModulNbr, PBYTE pb_UASStatus)
4708{
4709	INT i_ReturnValue = 0;
4710	DWORD 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 = (BYTE) ((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|                               (BYTE_   b_BoardHandle,                      |
4754|                                BYTE_   b_ModulNbr,                         |
4755|                                PBYTE_ pb_CBStatus)                         |
4756+----------------------------------------------------------------------------+
4757| Task              : Return the counter overflow status                     |
4758+----------------------------------------------------------------------------+
4759| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4760|                     BYTE_ b_ModulNbr        : Module number to configure   |
4761|                                               (0 to 3)                     |
4762+----------------------------------------------------------------------------+
4763| Output Parameters : PBYTE_ 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
4774INT i_APCI1710_GetCBStatus(struct comedi_device * dev,
4775	BYTE b_ModulNbr, PBYTE pb_CBStatus)
4776{
4777	INT i_ReturnValue = 0;
4778	DWORD 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 = (BYTE) (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|					(BYTE_     b_BoardHandle,            |
4822|					 BYTE_     b_ModulNbr,               |
4823|					 PBYTE_ pb_CBStatusCounter0,         |
4824|					 PBYTE_ 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  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4831|                     BYTE_ b_ModulNbr        : Module number to configure   |
4832|                                               (0 to 3)                     |
4833+----------------------------------------------------------------------------+
4834| Output Parameters : PBYTE_ 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|		      PBYTE_ 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
4856INT i_APCI1710_Get16BitCBStatus(struct comedi_device * dev,
4857	BYTE b_ModulNbr, PBYTE pb_CBStatusCounter0, PBYTE pb_CBStatusCounter1)
4858{
4859	INT i_ReturnValue = 0;
4860	DWORD 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						(BYTE) ((dw_StatusReg >> 0) &
4898						1);
4899					*pb_CBStatusCounter0 =
4900						(BYTE) ((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|                               (BYTE_   b_BoardHandle,                      |
4947|                                BYTE_   b_ModulNbr,                         |
4948|                                PBYTE_ pb_UDStatus)                         |
4949+----------------------------------------------------------------------------+
4950| Task              : Return the counter progress status                     |
4951+----------------------------------------------------------------------------+
4952| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
4953|                     BYTE_ b_ModulNbr        : Module number to configure   |
4954|                                               (0 to 3)                     |
4955+----------------------------------------------------------------------------+
4956| Output Parameters : PBYTE_ 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
4969INT i_APCI1710_GetUDStatus(struct comedi_device * dev,
4970	BYTE b_ModulNbr, PBYTE pb_UDStatus)
4971{
4972	INT i_ReturnValue = 0;
4973	DWORD 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 = (BYTE) ((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|                               (BYTE_   b_BoardHandle,                      |
5017|                                BYTE_   b_ModulNbr,                         |
5018|                                PBYTE_ pb_UDStatus)                         |
5019+----------------------------------------------------------------------------+
5020| Task              : Return the counter progress latched status after a     |
5021|                     index interrupt occur.                                 |
5022+----------------------------------------------------------------------------+
5023| Input Parameters  : BYTE_ b_BoardHandle     : Handle of board APCI-1710    |
5024|                     BYTE_ b_ModulNbr        : Module number to configure   |
5025|                                               (0 to 3)                     |
5026+----------------------------------------------------------------------------+
5027| Output Parameters : PBYTE_ 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
5043INT i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device * dev,
5044	BYTE b_ModulNbr, PBYTE pb_UDStatus)
5045{
5046	INT i_ReturnValue = 0;
5047	DWORD 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 = (BYTE) ((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	   |                            (BYTE_            b_BoardHandle,             |
5110	   |                             BYTE_            b_ModulNbr,                |
5111	   |                             PBYTE_          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  : BYTE_  b_BoardHandle    : Handle of board APCI-1710    |
5119	   |                  BYTE_  b_ModulNbr       : Number of the module to be   |
5120	   |                                            configured (0 to 3)          |
5121	   +----------------------------------------------------------------------------+
5122	   | Output Parameters : PBYTE_ 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	   |                  PBYTE_ 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
5148INT i_APCI1710_ReadFrequencyMeasurement(struct comedi_device * dev,
5149	BYTE b_ModulNbr,
5150	PBYTE pb_Status, PBYTE pb_UDStatus, PULONG pul_ReadValue)
5151{
5152	INT i_ReturnValue = 0;
5153	UINT ui_16BitValue;
5154	DWORD 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							(BYTE) ((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										(UINT)
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										(UINT)
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										(UINT)
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											(UINT)
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}
5364