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