]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blame - 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
CommitLineData
c995fe94
ADG
1/**
2@verbatim
3
4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
6 ADDI-DATA GmbH
7 Dieselstrasse 3
8 D-77833 Ottersweier
9 Tel: +19(0)7223/9493-0
10 Fax: +49(0)7223/9493-92
11 http://www.addi-data-com
12 info@addi-data.com
13
14This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20You shoud also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25 +-----------------------------------------------------------------------+
26 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
27 +-----------------------------------------------------------------------+
28 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
29 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
30 +-----------------------------------------------------------------------+
31 | Project : API APCI1710 | Compiler : gcc |
32 | Module name : INC_CPT.C | Version : 2.96 |
33 +-------------------------------+---------------------------------------+
34 | Project manager: Eric Stolz | Date : 02/12/2002 |
35 +-----------------------------------------------------------------------+
36 | Description : APCI-1710 incremental counter module |
37 | |
38 | |
39 +-----------------------------------------------------------------------+
40 | UPDATES |
41 +-----------------------------------------------------------------------+
42 | Date | Author | Description of updates |
43 +----------+-----------+------------------------------------------------+
44 | | | |
45 |----------|-----------|------------------------------------------------|
46 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
47 | | | available |
48 +-----------------------------------------------------------------------+
49 | 29/06/01 | Guinot C. | - 1100/0231 -> 0701/0232 |
50 | | | See i_APCI1710_DisableFrequencyMeasurement |
51 +-----------------------------------------------------------------------+
52*/
53
54/*
55+----------------------------------------------------------------------------+
56| Included files |
57+----------------------------------------------------------------------------+
58*/
59
60#include "APCI1710_INCCPT.h"
61
62/*
63+----------------------------------------------------------------------------+
74b894e5 64| int i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
90035c08 65struct comedi_insn *insn,unsigned int *data)
c995fe94
ADG
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
da91b269
BP
78int i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
79 struct comedi_insn *insn, unsigned int *data)
c995fe94 80{
117102b0 81 unsigned int ui_ConfigType;
74b894e5 82 int i_ReturnValue = 0;
c995fe94
ADG
83 ui_ConfigType = CR_CHAN(insn->chanspec);
84
85 printk("\nINC_CPT");
86
2696fb57 87 devpriv->tsk_Current = current; /* Save the current process task structure */
c995fe94
ADG
88 switch (ui_ConfigType) {
89 case APCI1710_INCCPT_INITCOUNTER:
90 i_ReturnValue = i_APCI1710_InitCounter(dev,
91 CR_AREF(insn->chanspec),
1783fbfe
BP
92 (unsigned char) data[0],
93 (unsigned char) data[1],
94 (unsigned char) data[2], (unsigned char) data[3], (unsigned char) data[4]);
c995fe94
ADG
95 break;
96
97 case APCI1710_INCCPT_COUNTERAUTOTEST:
98 i_ReturnValue = i_APCI1710_CounterAutoTest(dev,
1783fbfe 99 (unsigned char *) & data[0]);
c995fe94
ADG
100 break;
101
102 case APCI1710_INCCPT_INITINDEX:
103 i_ReturnValue = i_APCI1710_InitIndex(dev,
104 CR_AREF(insn->chanspec),
1783fbfe
BP
105 (unsigned char) data[0],
106 (unsigned char) data[1], (unsigned char) data[2], (unsigned char) data[3]);
c995fe94
ADG
107 break;
108
109 case APCI1710_INCCPT_INITREFERENCE:
110 i_ReturnValue = i_APCI1710_InitReference(dev,
1783fbfe 111 CR_AREF(insn->chanspec), (unsigned char) data[0]);
c995fe94
ADG
112 break;
113
114 case APCI1710_INCCPT_INITEXTERNALSTROBE:
115 i_ReturnValue = i_APCI1710_InitExternalStrobe(dev,
116 CR_AREF(insn->chanspec),
1783fbfe 117 (unsigned char) data[0], (unsigned char) data[1]);
c995fe94
ADG
118 break;
119
120 case APCI1710_INCCPT_INITCOMPARELOGIC:
121 i_ReturnValue = i_APCI1710_InitCompareLogic(dev,
117102b0 122 CR_AREF(insn->chanspec), (unsigned int) data[0]);
c995fe94
ADG
123 break;
124
125 case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT:
126 i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev,
127 CR_AREF(insn->chanspec),
1783fbfe 128 (unsigned char) data[0],
82a6e2e7 129 (unsigned char) data[1], (unsigned int) data[2], (unsigned int *) & data[0]);
c995fe94
ADG
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 |
1783fbfe
BP
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) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
276| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710|
277| unsigned char_ b_ModulNbr : Module number to |
c995fe94 278| configure (0 to 3) |
1783fbfe 279| unsigned char_ b_CounterRange : Selection form counter |
c995fe94 280| range. |
1783fbfe 281| unsigned char_ b_FirstCounterModus : First counter operating |
c995fe94 282| mode. |
1783fbfe
BP
283| unsigned char_ b_FirstCounterOption : First counter option. |
284| unsigned char_ b_SecondCounterModus : Second counter operating |
c995fe94 285| mode. |
1783fbfe 286| unsigned char_ b_SecondCounterOption : Second counter option. |
c995fe94
ADG
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
da91b269 302int i_APCI1710_InitCounter(struct comedi_device *dev,
1783fbfe
BP
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)
c995fe94 308{
74b894e5 309 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
511| (unsigned char_ b_BoardHandle, |
512| unsigned char *_ pb_TestStatus) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe 538| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | |
c995fe94 539+----------------------------------------------------------------------------+
1783fbfe 540| Output Parameters : unsigned char *_ pb_TestStatus : Auto test conclusion. See table|
c995fe94
ADG
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
da91b269 548int i_APCI1710_CounterAutoTest(struct comedi_device *dev, unsigned char *pb_TestStatus)
c995fe94 549{
1783fbfe 550 unsigned char b_ModulCpt = 0;
74b894e5 551 int i_ReturnValue = 0;
756e9d7c 552 unsigned int dw_LathchValue;
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
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) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
668| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
669| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 670| (0 to 3) |
1783fbfe 671| unsigned char_ b_ReferenceAction : Determine if the reference |
c995fe94
ADG
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 |
1783fbfe 680| unsigned char_ b_IndexOperation : Index operating mode. |
c995fe94 681| See table. |
1783fbfe 682| unsigned char_ b_AutoMode : Enable or disable the |
c995fe94
ADG
683| automatic index reset. |
684| APCI1710_ENABLE : |
685| Enable the automatic mode |
686| APCI1710_DISABLE : |
687| Disable the automatic mode |
1783fbfe 688| unsigned char_ b_InterruptEnable : Enable or disable the |
c995fe94
ADG
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
da91b269 711int i_APCI1710_InitIndex(struct comedi_device *dev,
1783fbfe
BP
712 unsigned char b_ModulNbr,
713 unsigned char b_ReferenceAction,
714 unsigned char b_IndexOperation, unsigned char b_AutoMode, unsigned char b_InterruptEnable)
c995fe94 715{
74b894e5 716 int i_ReturnValue = 0;
c995fe94
ADG
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;
2696fb57 905 } /* if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) */
c995fe94
ADG
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 }
2696fb57 978 } /* // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) */
c995fe94
ADG
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 |
1783fbfe
BP
1122| (unsigned char_ b_BoardHandle, |
1123| unsigned char_ b_ModulNbr, |
1124| unsigned char_ b_ReferenceLevel) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
1139| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1140| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 1141| (0 to 3) |
1783fbfe 1142| unsigned char_ b_ReferenceLevel : Reference level. |
c995fe94
ADG
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
da91b269 1155int i_APCI1710_InitReference(struct comedi_device *dev,
1783fbfe 1156 unsigned char b_ModulNbr, unsigned char b_ReferenceLevel)
c995fe94 1157{
74b894e5 1158 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
1248| (unsigned char_ b_BoardHandle, |
1249| unsigned char_ b_ModulNbr, |
1250| unsigned char_ b_ExternalStrobe, |
1251| unsigned char_ b_ExternalStrobeLevel) |
c995fe94
ADG
1252+----------------------------------------------------------------------------+
1253| Task : Initialises the external strobe level corresponding to |
1254| the selected module (b_ModulNbr). |
1255+----------------------------------------------------------------------------+
1783fbfe
BP
1256| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1257| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 1258| (0 to 3) |
1783fbfe 1259| unsigned char_ b_ExternalStrobe : External strobe selection |
c995fe94
ADG
1260| 0 : External strobe A |
1261| 1 : External strobe B |
1783fbfe 1262| unsigned char_ b_ExternalStrobeLevel : External strobe level |
c995fe94
ADG
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
da91b269 1280int i_APCI1710_InitExternalStrobe(struct comedi_device *dev,
1783fbfe 1281 unsigned char b_ModulNbr, unsigned char b_ExternalStrobe, unsigned char b_ExternalStrobeLevel)
c995fe94 1282{
74b894e5 1283 int i_ReturnValue = 0;
c995fe94
ADG
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 }
2696fb57 1338 } /* if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) */
c995fe94
ADG
1339 else {
1340 /**************************************/
1341 /* External strobe selection is wrong */
1342 /**************************************/
1343
1344 DPRINTK("External strobe selection is wrong\n");
1345 i_ReturnValue = -4;
2696fb57 1346 } /* if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) */
c995fe94
ADG
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 |
1783fbfe
BP
1371 | (unsigned char_ b_BoardHandle, |
1372 | unsigned char_ b_ModulNbr, |
117102b0 1373 | unsigned int_ ui_CompareValue) |
c995fe94
ADG
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 +----------------------------------------------------------------------------+
1783fbfe
BP
1379 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1380 | unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 1381 | (0 to 3) |
117102b0 1382 | unsigned int_ ui_CompareValue : 32-Bit compare value |
c995fe94
ADG
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
da91b269 1394int i_APCI1710_InitCompareLogic(struct comedi_device *dev,
117102b0 1395 unsigned char b_ModulNbr, unsigned int ui_CompareValue)
c995fe94 1396{
74b894e5 1397 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
1443| (unsigned char_ b_BoardHandle, |
1444| unsigned char_ b_ModulNbr, |
1445| unsigned char_ b_PCIInputClock, |
1446| unsigned char_ b_TimingUnity, |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
1459| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1460| unsigned char_ b_ModulNbr : Number of the module to be |
c995fe94 1461| configured (0 to 3) |
1783fbfe 1462| unsigned char_ b_PCIInputClock : Selection of the PCI bus |
c995fe94
ADG
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 |
1783fbfe 1470| unsigned char_ b_TimingUnity : Base time unit (0 to 2) |
c995fe94
ADG
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
da91b269 1490int i_APCI1710_InitFrequencyMeasurement(struct comedi_device *dev,
1783fbfe
BP
1491 unsigned char b_ModulNbr,
1492 unsigned char b_PCIInputClock,
1493 unsigned char b_TimingUnity,
da91b269 1494 unsigned int ul_TimingInterval, unsigned int *pul_RealTimingInterval)
c995fe94 1495{
74b894e5 1496 int i_ReturnValue = 0;
82a6e2e7 1497 unsigned int ul_TimerValue = 0;
c995fe94 1498 double d_RealTimingInterval;
756e9d7c 1499 unsigned int dw_Status = 0;
c995fe94
ADG
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 }
2696fb57 1640 } /* if (b_PCIInputClock == APCI1710_40MHZ) */
c995fe94
ADG
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;
2696fb57 1679 } /* if (b_PCIInputClock == APCI1710_40MHZ) */
c995fe94
ADG
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
2696fb57 1703 } /* if (b_PCIInputClock == APCI1710_40MHZ) */
c995fe94
ADG
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 =
82a6e2e7 1723 (unsigned int)
c995fe94
ADG
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 =
82a6e2e7 1746 (unsigned int)
c995fe94
ADG
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 =
82a6e2e7 1793 (unsigned int)
c995fe94
ADG
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 =
82a6e2e7 1816 (unsigned int)
c995fe94
ADG
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 =
82a6e2e7 1889 (unsigned int)
c995fe94
ADG
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 }
2696fb57 1952 } /* if (i_ReturnValue == 0) */
c995fe94
ADG
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
2696fb57 2000 /* INSN BITS */
c995fe94
ADG
2001/*########################################################################### */
2002
2003/*
2004+----------------------------------------------------------------------------+
34c43922 2005| Function Name :INT i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
90035c08 2006struct comedi_insn *insn,unsigned int *data) |
c995fe94
ADG
2007+----------------------------------------------------------------------------+
2008| Task : Set & Clear Functions for INC_CPT |
2009+----------------------------------------------------------------------------+
2010| Input Parameters :
2011+----------------------------------------------------------------------------+
2012| Output Parameters : - |
2013+----------------------------------------------------------------------------+
2014| Return Value :
2015+----------------------------------------------------------------------------+
2016*/
2017
da91b269
BP
2018int i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
2019 struct comedi_insn *insn, unsigned int *data)
c995fe94 2020{
117102b0 2021 unsigned int ui_BitsType;
74b894e5 2022 int i_ReturnValue = 0;
c995fe94 2023 ui_BitsType = CR_CHAN(insn->chanspec);
2696fb57 2024 devpriv->tsk_Current = current; /* Save the current process task structure */
c995fe94
ADG
2025
2026 switch (ui_BitsType) {
2027 case APCI1710_INCCPT_CLEARCOUNTERVALUE:
2028 i_ReturnValue = i_APCI1710_ClearCounterValue(dev,
1783fbfe 2029 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
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,
1783fbfe
BP
2038 (unsigned char) CR_AREF(insn->chanspec),
2039 (unsigned char) data[0], (unsigned char) data[1]);
c995fe94
ADG
2040 break;
2041
2042 case APCI1710_INCCPT_LATCHCOUNTER:
2043 i_ReturnValue = i_APCI1710_LatchCounter(dev,
1783fbfe 2044 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
c995fe94
ADG
2045 break;
2046
2047 case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE:
2048 i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev,
1783fbfe 2049 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
c995fe94
ADG
2050 break;
2051
2052 case APCI1710_INCCPT_SETDIGITALCHLON:
2053 i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev,
1783fbfe 2054 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
2055 break;
2056
2057 case APCI1710_INCCPT_SETDIGITALCHLOFF:
2058 i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev,
1783fbfe 2059 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
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 |
1783fbfe
BP
2074| (unsigned char_ b_BoardHandle, |
2075| unsigned char_ b_ModulNbr) |
c995fe94
ADG
2076+----------------------------------------------------------------------------+
2077| Task : Clear the counter value from selected module |
2078| (b_ModulNbr). |
2079+----------------------------------------------------------------------------+
1783fbfe
BP
2080| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2081| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 2094int i_APCI1710_ClearCounterValue(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 2095{
74b894e5 2096 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe 2140| (unsigned char_ b_BoardHandle) |
c995fe94
ADG
2141+----------------------------------------------------------------------------+
2142| Task : Clear all counter value. |
2143+----------------------------------------------------------------------------+
1783fbfe 2144| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
c995fe94
ADG
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
da91b269 2154int i_APCI1710_ClearAllCounterValue(struct comedi_device *dev)
c995fe94 2155{
1783fbfe 2156 unsigned char b_ModulCpt = 0;
74b894e5 2157 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
2207| (unsigned char_ b_BoardHandle, |
2208| unsigned char_ b_Module, |
2209| unsigned char_ b_PCIInputClock, |
2210| unsigned char_ b_Filter) |
c995fe94
ADG
2211+----------------------------------------------------------------------------+
2212| Task : Disable or enable the software filter from selected |
2213| module (b_ModulNbr). b_Filter determine the filter time|
2214+----------------------------------------------------------------------------+
1783fbfe
BP
2215| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2216| unsigned char_ b_ModulNbr : Number of the module to be |
c995fe94 2217| configured (0 to 3) |
1783fbfe 2218| unsigned char_ b_PCIInputClock : Selection of the PCI bus |
c995fe94
ADG
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 |
1783fbfe 2229| unsigned char_ b_Filter : Filter selection |
c995fe94
ADG
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
da91b269 2300int i_APCI1710_SetInputFilter(struct comedi_device *dev,
1783fbfe 2301 unsigned char b_ModulNbr, unsigned char b_PCIInputClock, unsigned char b_Filter)
c995fe94 2302{
74b894e5 2303 int i_ReturnValue = 0;
756e9d7c 2304 unsigned int dw_Status = 0;
c995fe94
ADG
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 }
2696fb57 2368 } /* if (b_PCIInputClock == APCI1710_40MHZ) */
c995fe94
ADG
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
2696fb57 2404 } /* if (b_PCIInputClock == APCI1710_40MHZ) */
c995fe94
ADG
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
2696fb57 2428 } /* if (b_PCIInputClock == APCI1710_40MHZ) */
c995fe94
ADG
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));
2696fb57
BP
2489 } /* if (i_ReturnValue == 0) */
2490 } /* if (b_Filter < 16) */
c995fe94
ADG
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;
2696fb57
BP
2498 } /* if (b_Filter < 16) */
2499 } /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) */
c995fe94
ADG
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;
2696fb57 2507 } /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) */
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
2538| Function Name : _INT_ i_APCI1710_LatchCounter (unsigned char_ b_BoardHandle, |
2539| unsigned char_ b_ModulNbr, |
2540| unsigned char_ b_LatchReg) |
c995fe94
ADG
2541+----------------------------------------------------------------------------+
2542| Task : Latch the courant value from selected module |
2543| (b_ModulNbr) in to the selected latch register |
2544| (b_LatchReg). |
2545+----------------------------------------------------------------------------+
1783fbfe
BP
2546| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2547| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 2548| (0 to 3) |
1783fbfe 2549| unsigned char_ b_LatchReg : Selected latch register |
c995fe94
ADG
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
da91b269 2564int i_APCI1710_LatchCounter(struct comedi_device *dev,
1783fbfe 2565 unsigned char b_ModulNbr, unsigned char b_LatchReg)
c995fe94 2566{
74b894e5 2567 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
2625| (unsigned char_ b_BoardHandle, |
2626| unsigned char_ b_ModulNbr, |
2627| unsigned char_ b_SourceSelection) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
2634| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2635| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 2636| (0 to 3) |
1783fbfe 2637| unsigned char_ b_SourceSelection : APCI1710_SOURCE_0 : |
c995fe94
ADG
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
da91b269 2661int i_APCI1710_SetIndexAndReferenceSource(struct comedi_device *dev,
1783fbfe 2662 unsigned char b_ModulNbr, unsigned char b_SourceSelection)
c995fe94 2663{
74b894e5 2664 int i_ReturnValue = 0;
c995fe94
ADG
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 }
2696fb57 2738 } /* if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) */
c995fe94
ADG
2739 else {
2740 /*********************************/
2741 /* The source selection is wrong */
2742 /*********************************/
2743
2744 DPRINTK("The source selection is wrong\n");
2745 i_ReturnValue = -4;
2696fb57 2746 } /* if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) */
c995fe94
ADG
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 |
1783fbfe
BP
2778| (unsigned char_ b_BoardHandle, |
2779| unsigned char_ b_ModulNbr) |
c995fe94
ADG
2780+----------------------------------------------------------------------------+
2781| Task : Sets the digital output H Setting an output means |
2782| setting an ouput high. |
2783+----------------------------------------------------------------------------+
1783fbfe
BP
2784| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2785| unsigned char_ b_ModulNbr : Number of the module to be |
c995fe94
ADG
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
da91b269 2798int i_APCI1710_SetDigitalChlOn(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 2799{
74b894e5 2800 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
2858| (unsigned char_ b_BoardHandle, |
2859| unsigned char_ b_ModulNbr) |
c995fe94
ADG
2860+----------------------------------------------------------------------------+
2861| Task : Resets the digital output H. Resetting an output means |
2862| setting an ouput low. |
2863+----------------------------------------------------------------------------+
1783fbfe
BP
2864| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2865| unsigned char_ b_ModulNbr : Number of the module to be |
c995fe94
ADG
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
da91b269 2878int i_APCI1710_SetDigitalChlOff(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 2879{
74b894e5 2880 int i_ReturnValue = 0;
c995fe94
ADG
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
2696fb57 2937 /* INSN WRITE */
c995fe94
ADG
2938/*########################################################################### */
2939
2940/*
2941+----------------------------------------------------------------------------+
34c43922 2942| Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
90035c08 2943struct comedi_insn *insn,unsigned int *data) |
c995fe94
ADG
2944+----------------------------------------------------------------------------+
2945| Task : Enable Disable functions for INC_CPT |
2946+----------------------------------------------------------------------------+
2947| Input Parameters :
2948+----------------------------------------------------------------------------+
2949| Output Parameters : - |
2950+----------------------------------------------------------------------------+
2951| Return Value :
2952+----------------------------------------------------------------------------+
2953*/
da91b269
BP
2954int i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
2955 struct comedi_insn *insn, unsigned int *data)
c995fe94 2956{
117102b0 2957 unsigned int ui_WriteType;
74b894e5 2958 int i_ReturnValue = 0;
c995fe94
ADG
2959
2960 ui_WriteType = CR_CHAN(insn->chanspec);
2696fb57 2961 devpriv->tsk_Current = current; /* Save the current process task structure */
c995fe94
ADG
2962
2963 switch (ui_WriteType) {
2964 case APCI1710_INCCPT_ENABLELATCHINTERRUPT:
2965 i_ReturnValue = i_APCI1710_EnableLatchInterrupt(dev,
1783fbfe 2966 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
2967 break;
2968
2969 case APCI1710_INCCPT_DISABLELATCHINTERRUPT:
2970 i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev,
1783fbfe 2971 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
2972 break;
2973
2974 case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE:
2975 i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev,
1783fbfe 2976 (unsigned char) CR_AREF(insn->chanspec),
117102b0 2977 (unsigned char) data[0], (unsigned int) data[1]);
c995fe94
ADG
2978 break;
2979
2980 case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE:
2981 i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev,
82a6e2e7 2982 (unsigned char) CR_AREF(insn->chanspec), (unsigned int) data[0]);
c995fe94
ADG
2983
2984 break;
2985
2986 case APCI1710_INCCPT_ENABLEINDEX:
1783fbfe 2987 i_APCI1710_EnableIndex(dev, (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
2988 break;
2989
2990 case APCI1710_INCCPT_DISABLEINDEX:
2991 i_ReturnValue = i_APCI1710_DisableIndex(dev,
1783fbfe 2992 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
2993 break;
2994
2995 case APCI1710_INCCPT_ENABLECOMPARELOGIC:
2996 i_ReturnValue = i_APCI1710_EnableCompareLogic(dev,
1783fbfe 2997 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
2998 break;
2999
3000 case APCI1710_INCCPT_DISABLECOMPARELOGIC:
3001 i_ReturnValue = i_APCI1710_DisableCompareLogic(dev,
1783fbfe 3002 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
3003 break;
3004
3005 case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT:
3006 i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev,
1783fbfe 3007 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
c995fe94
ADG
3008 break;
3009
3010 case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT:
3011 i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev,
1783fbfe 3012 (unsigned char) CR_AREF(insn->chanspec));
c995fe94
ADG
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 |
1783fbfe
BP
3027| (unsigned char_ b_BoardHandle, |
3028| unsigned char_ b_ModulNbr) |
c995fe94
ADG
3029+----------------------------------------------------------------------------+
3030| Task : Enable the latch interrupt from selected module |
3031| (b_ModulNbr). Each software or hardware latch occur a |
3032| interrupt. |
3033+----------------------------------------------------------------------------+
1783fbfe
BP
3034| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3035| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 3050int i_APCI1710_EnableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 3051{
74b894e5 3052 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
3114| (unsigned char_ b_BoardHandle, |
3115| unsigned char_ b_ModulNbr) |
c995fe94
ADG
3116+----------------------------------------------------------------------------+
3117| Task : Disable the latch interrupt from selected module |
3118| (b_ModulNbr). |
3119+----------------------------------------------------------------------------+
1783fbfe
BP
3120| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3121| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 3136int i_APCI1710_DisableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 3137{
74b894e5 3138 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
3207| (unsigned char_ b_BoardHandle |
3208| unsigned char_ b_ModulNbr, |
3209| unsigned char_ b_SelectedCounter, |
117102b0 3210| unsigned int_ ui_WriteValue) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
3216| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3217| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 3218| (0 to 3) |
1783fbfe 3219| unsigned char_ b_SelectedCounter : Selected 16-Bit counter |
c995fe94 3220| (0 or 1) |
117102b0 3221| unsigned int_ ui_WriteValue : 16-Bit write value |
c995fe94
ADG
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
da91b269 3234int i_APCI1710_Write16BitCounterValue(struct comedi_device *dev,
117102b0 3235 unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int ui_WriteValue)
c995fe94 3236{
74b894e5 3237 int i_ReturnValue = 0;
c995fe94
ADG
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
82a6e2e7 3260 outl((unsigned int) ((unsigned int) (ui_WriteValue) << (16 *
c995fe94
ADG
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 |
1783fbfe
BP
3297| (unsigned char_ b_BoardHandle |
3298| unsigned char_ b_ModulNbr, |
c995fe94
ADG
3299| ULONG_ ul_WriteValue) |
3300+----------------------------------------------------------------------------+
3301| Task : Write a 32-Bit value (ui_WriteValue) in to the selected|
3302| module (b_ModulNbr). |
3303+----------------------------------------------------------------------------+
1783fbfe
BP
3304| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3305| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 3319int i_APCI1710_Write32BitCounterValue(struct comedi_device *dev,
82a6e2e7 3320 unsigned char b_ModulNbr, unsigned int ul_WriteValue)
c995fe94 3321{
74b894e5 3322 int i_ReturnValue = 0;
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
3365| Function Name : _INT_ i_APCI1710_EnableIndex (unsigned char_ b_BoardHandle, |
3366| unsigned char_ b_ModulNbr) |
c995fe94
ADG
3367+----------------------------------------------------------------------------+
3368| Task : Enable the INDEX actions |
3369+----------------------------------------------------------------------------+
1783fbfe
BP
3370| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3371| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 3386int i_APCI1710_EnableIndex(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 3387{
74b894e5 3388 int i_ReturnValue = 0;
82a6e2e7 3389 unsigned int ul_InterruptLatchReg;
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
3463| Function Name : _INT_ i_APCI1710_DisableIndex (unsigned char_ b_BoardHandle, |
3464| unsigned char_ b_ModulNbr) |
c995fe94
ADG
3465+----------------------------------------------------------------------------+
3466| Task : Disable the INDEX actions |
3467+----------------------------------------------------------------------------+
1783fbfe
BP
3468| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3469| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 3484int i_APCI1710_DisableIndex(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 3485{
74b894e5 3486 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
3558| (unsigned char_ b_BoardHandle, |
3559| unsigned char_ b_ModulNbr) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
3565| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3566| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 3583int i_APCI1710_EnableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 3584{
74b894e5 3585 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
3662| (unsigned char_ b_BoardHandle, |
3663| unsigned char_ b_ModulNbr) |
c995fe94
ADG
3664+----------------------------------------------------------------------------+
3665| Task : Disable the 32-Bit compare logic.
3666+----------------------------------------------------------------------------+
1783fbfe
BP
3667| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3668| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269 3683int i_APCI1710_DisableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 3684{
74b894e5 3685 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
3762 | (unsigned char_ b_BoardHandle, |
3763 | unsigned char_ b_ModulNbr, |
3764 | unsigned char_ b_InterruptEnable) |
c995fe94
ADG
3765 +----------------------------------------------------------------------------+
3766 | Task : Enables the frequency measurement function |
3767 +----------------------------------------------------------------------------+
1783fbfe
BP
3768 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3769 | unsigned char_ b_ModulNbr : Number of the module to be |
c995fe94 3770 | configured (0 to 3) |
1783fbfe 3771 | unsigned char_ b_InterruptEnable: Enable or disable the |
c995fe94
ADG
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
da91b269 3792int i_APCI1710_EnableFrequencyMeasurement(struct comedi_device *dev,
1783fbfe 3793 unsigned char b_ModulNbr, unsigned char b_InterruptEnable)
c995fe94 3794{
74b894e5 3795 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
3918 | (unsigned char_ b_BoardHandle, |
3919 | unsigned char_ b_ModulNbr) |
c995fe94
ADG
3920 +----------------------------------------------------------------------------+
3921 | Task : Disables the frequency measurement function |
3922 +----------------------------------------------------------------------------+
1783fbfe
BP
3923 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3924 | unsigned char_ b_ModulNbr : Number of the module to be |
c995fe94
ADG
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
da91b269 3939int i_APCI1710_DisableFrequencyMeasurement(struct comedi_device *dev, unsigned char b_ModulNbr)
c995fe94 3940{
74b894e5 3941 int i_ReturnValue = 0;
c995fe94
ADG
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
2696fb57 3979 /* Begin CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared */
c995fe94 3980 & APCI1710_DISABLE_FREQUENCY_INT;
2696fb57 3981 /* End CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared */
c995fe94
ADG
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
2696fb57 4034 /* INSN READ */
c995fe94
ADG
4035
4036/*########################################################################### */
4037
4038/*
4039+----------------------------------------------------------------------------+
34c43922 4040| Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
90035c08 4041struct comedi_insn *insn,unsigned int *data) |
c995fe94
ADG
4042+----------------------------------------------------------------------------+
4043| Task : Read and Get functions for INC_CPT |
4044+----------------------------------------------------------------------------+
4045| Input Parameters :
4046+----------------------------------------------------------------------------+
4047| Output Parameters : - |
4048+----------------------------------------------------------------------------+
4049| Return Value :
4050+----------------------------------------------------------------------------+
4051*/
da91b269
BP
4052int i_APCI1710_InsnReadINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
4053 struct comedi_insn *insn, unsigned int *data)
c995fe94 4054{
117102b0 4055 unsigned int ui_ReadType;
74b894e5 4056 int i_ReturnValue = 0;
c995fe94
ADG
4057
4058 ui_ReadType = CR_CHAN(insn->chanspec);
4059
2696fb57 4060 devpriv->tsk_Current = current; /* Save the current process task structure */
c995fe94
ADG
4061 switch (ui_ReadType) {
4062 case APCI1710_INCCPT_READLATCHREGISTERSTATUS:
4063 i_ReturnValue = i_APCI1710_ReadLatchRegisterStatus(dev,
1783fbfe
BP
4064 (unsigned char) CR_AREF(insn->chanspec),
4065 (unsigned char) CR_RANGE(insn->chanspec), (unsigned char *) & data[0]);
c995fe94
ADG
4066 break;
4067
4068 case APCI1710_INCCPT_READLATCHREGISTERVALUE:
4069 i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev,
1783fbfe 4070 (unsigned char) CR_AREF(insn->chanspec),
82a6e2e7 4071 (unsigned char) CR_RANGE(insn->chanspec), (unsigned int *) & data[0]);
c995fe94
ADG
4072 printk("Latch Register Value %d\n", data[0]);
4073 break;
4074
4075 case APCI1710_INCCPT_READ16BITCOUNTERVALUE:
4076 i_ReturnValue = i_APCI1710_Read16BitCounterValue(dev,
1783fbfe 4077 (unsigned char) CR_AREF(insn->chanspec),
117102b0 4078 (unsigned char) CR_RANGE(insn->chanspec), (unsigned int *) & data[0]);
c995fe94
ADG
4079 break;
4080
4081 case APCI1710_INCCPT_READ32BITCOUNTERVALUE:
4082 i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev,
82a6e2e7 4083 (unsigned char) CR_AREF(insn->chanspec), (unsigned int *) & data[0]);
c995fe94
ADG
4084 break;
4085
4086 case APCI1710_INCCPT_GETINDEXSTATUS:
4087 i_ReturnValue = i_APCI1710_GetIndexStatus(dev,
1783fbfe 4088 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
c995fe94
ADG
4089 break;
4090
4091 case APCI1710_INCCPT_GETREFERENCESTATUS:
4092 i_ReturnValue = i_APCI1710_GetReferenceStatus(dev,
1783fbfe 4093 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
c995fe94
ADG
4094 break;
4095
4096 case APCI1710_INCCPT_GETUASSTATUS:
4097 i_ReturnValue = i_APCI1710_GetUASStatus(dev,
1783fbfe 4098 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
c995fe94
ADG
4099 break;
4100
4101 case APCI1710_INCCPT_GETCBSTATUS:
4102 i_ReturnValue = i_APCI1710_GetCBStatus(dev,
1783fbfe 4103 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
c995fe94
ADG
4104 break;
4105
4106 case APCI1710_INCCPT_GET16BITCBSTATUS:
4107 i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev,
1783fbfe
BP
4108 (unsigned char) CR_AREF(insn->chanspec),
4109 (unsigned char *) & data[0], (unsigned char *) & data[1]);
c995fe94
ADG
4110 break;
4111
4112 case APCI1710_INCCPT_GETUDSTATUS:
4113 i_ReturnValue = i_APCI1710_GetUDStatus(dev,
1783fbfe 4114 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
c995fe94
ADG
4115
4116 break;
4117
4118 case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS:
4119 i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev,
1783fbfe 4120 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
c995fe94
ADG
4121 break;
4122
4123 case APCI1710_INCCPT_READFREQUENCYMEASUREMENT:
4124 i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev,
1783fbfe
BP
4125 (unsigned char) CR_AREF(insn->chanspec),
4126 (unsigned char *) & data[0],
82a6e2e7 4127 (unsigned char *) & data[1], (unsigned int *) & data[2]);
c995fe94
ADG
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 |
1783fbfe
BP
4165| (unsigned char_ b_BoardHandle, |
4166| unsigned char_ b_ModulNbr, |
4167| unsigned char_ b_LatchReg, |
4168| unsigned char *_ pb_LatchStatus) |
c995fe94
ADG
4169+----------------------------------------------------------------------------+
4170| Task : Read the latch register status from selected module |
4171| (b_ModulNbr) and selected latch register (b_LatchReg). |
4172+----------------------------------------------------------------------------+
1783fbfe
BP
4173| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4174| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 4175| (0 to 3) |
1783fbfe 4176| unsigned char_ b_LatchReg : Selected latch register |
c995fe94
ADG
4177| 0 : for the first latch register |
4178| 1 : for the second latch register |
4179+----------------------------------------------------------------------------+
1783fbfe 4180| Output Parameters : unsigned char *_ pb_LatchStatus : Latch register status. |
c995fe94
ADG
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
da91b269
BP
4196int i_APCI1710_ReadLatchRegisterStatus(struct comedi_device *dev,
4197 unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned char *pb_LatchStatus)
c995fe94 4198{
74b894e5 4199 int i_ReturnValue = 0;
756e9d7c 4200 unsigned int dw_LatchReg;
c995fe94
ADG
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 =
1783fbfe 4223 (unsigned char) ((dw_LatchReg >> (b_LatchReg *
c995fe94
ADG
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 |
1783fbfe
BP
4257| (unsigned char_ b_BoardHandle,|
4258| unsigned char_ b_ModulNbr, |
4259| unsigned char_ b_LatchReg, |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
4265| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4266| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 4267| (0 to 3) |
1783fbfe 4268| unsigned char_ b_LatchReg : Selected latch register |
c995fe94
ADG
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
da91b269
BP
4283int i_APCI1710_ReadLatchRegisterValue(struct comedi_device *dev,
4284 unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned int *pul_LatchValue)
c995fe94 4285{
74b894e5 4286 int i_ReturnValue = 0;
c995fe94
ADG
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 |
1783fbfe
BP
4341| (unsigned char_ b_BoardHandle, |
4342| unsigned char_ b_ModulNbr, |
4343| unsigned char_ b_SelectedCounter, |
117102b0 4344| unsigned int *_ pui_CounterValue) |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
4350| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4351| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94 4352| (0 to 3) |
1783fbfe 4353| unsigned char_ b_SelectedCounter : Selected 16-Bit counter |
c995fe94
ADG
4354| (0 or 1) |
4355+----------------------------------------------------------------------------+
117102b0 4356| Output Parameters : unsigned int *_ pui_CounterValue : 16-Bit counter value |
c995fe94
ADG
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
da91b269
BP
4367int i_APCI1710_Read16BitCounterValue(struct comedi_device *dev,
4368 unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int *pui_CounterValue)
c995fe94 4369{
74b894e5 4370 int i_ReturnValue = 0;
756e9d7c 4371 unsigned int dw_LathchValue = 0;
c995fe94
ADG
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 =
117102b0 4405 (unsigned int) ((dw_LathchValue >> (16 *
c995fe94
ADG
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 |
1783fbfe
BP
4440| (unsigned char_ b_BoardHandle, |
4441| unsigned char_ b_ModulNbr, |
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
4448| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4449| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
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
da91b269
BP
4462int i_APCI1710_Read32BitCounterValue(struct comedi_device *dev,
4463 unsigned char b_ModulNbr, unsigned int *pul_CounterValue)
c995fe94 4464{
74b894e5 4465 int i_ReturnValue = 0;
c995fe94
ADG
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+----------------------------------------------------------------------------+
1783fbfe
BP
4515| Function Name : _INT_ i_APCI1710_GetIndexStatus (unsigned char_ b_BoardHandle,|
4516| unsigned char_ b_ModulNbr, |
4517| unsigned char *_ pb_IndexStatus)|
c995fe94
ADG
4518+----------------------------------------------------------------------------+
4519| Task : Return the index status |
4520+----------------------------------------------------------------------------+
1783fbfe
BP
4521| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4522| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
4523| (0 to 3) |
4524+----------------------------------------------------------------------------+
1783fbfe 4525| Output Parameters : unsigned char *_ pb_IndexStatus : 0 : No INDEX occur |
c995fe94
ADG
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
da91b269
BP
4538int i_APCI1710_GetIndexStatus(struct comedi_device *dev,
4539 unsigned char b_ModulNbr, unsigned char *pb_IndexStatus)
c995fe94 4540{
74b894e5 4541 int i_ReturnValue = 0;
756e9d7c 4542 unsigned int dw_StatusReg = 0;
c995fe94
ADG
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
1783fbfe 4566 *pb_IndexStatus = (unsigned char) (dw_StatusReg & 1);
c995fe94
ADG
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 |
1783fbfe
BP
4599| (unsigned char_ b_BoardHandle, |
4600| unsigned char_ b_ModulNbr, |
4601| unsigned char *_ pb_ReferenceStatus) |
c995fe94
ADG
4602+----------------------------------------------------------------------------+
4603| Task : Return the reference status |
4604+----------------------------------------------------------------------------+
1783fbfe
BP
4605| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4606| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
4607| (0 to 3) |
4608+----------------------------------------------------------------------------+
1783fbfe 4609| Output Parameters : unsigned char *_ pb_ReferenceStatus : 0 : No REFERENCE occur |
c995fe94
ADG
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
da91b269
BP
4622int i_APCI1710_GetReferenceStatus(struct comedi_device *dev,
4623 unsigned char b_ModulNbr, unsigned char *pb_ReferenceStatus)
c995fe94 4624{
74b894e5 4625 int i_ReturnValue = 0;
756e9d7c 4626 unsigned int dw_StatusReg = 0;
c995fe94
ADG
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 =
1783fbfe 4652 (unsigned char) (~dw_StatusReg & 1);
c995fe94
ADG
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 |
1783fbfe
BP
4685| (unsigned char_ b_BoardHandle, |
4686| unsigned char_ b_ModulNbr, |
4687| unsigned char *_ pb_UASStatus) |
c995fe94
ADG
4688+----------------------------------------------------------------------------+
4689| Task : Return the error signal (UAS) status |
4690+----------------------------------------------------------------------------+
1783fbfe
BP
4691| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4692| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
4693| (0 to 3) |
4694+----------------------------------------------------------------------------+
1783fbfe 4695| Output Parameters : unsigned char *_ pb_UASStatus : 0 : UAS is low "0" |
c995fe94
ADG
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
da91b269
BP
4706int i_APCI1710_GetUASStatus(struct comedi_device *dev,
4707 unsigned char b_ModulNbr, unsigned char *pb_UASStatus)
c995fe94 4708{
74b894e5 4709 int i_ReturnValue = 0;
756e9d7c 4710 unsigned int dw_StatusReg = 0;
c995fe94
ADG
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
1783fbfe 4727 *pb_UASStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
c995fe94
ADG
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 |
1783fbfe
BP
4753| (unsigned char_ b_BoardHandle, |
4754| unsigned char_ b_ModulNbr, |
4755| unsigned char *_ pb_CBStatus) |
c995fe94
ADG
4756+----------------------------------------------------------------------------+
4757| Task : Return the counter overflow status |
4758+----------------------------------------------------------------------------+
1783fbfe
BP
4759| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4760| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
4761| (0 to 3) |
4762+----------------------------------------------------------------------------+
1783fbfe 4763| Output Parameters : unsigned char *_ pb_CBStatus : 0 : Counter no overflow |
c995fe94
ADG
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
da91b269
BP
4774int i_APCI1710_GetCBStatus(struct comedi_device *dev,
4775 unsigned char b_ModulNbr, unsigned char *pb_CBStatus)
c995fe94 4776{
74b894e5 4777 int i_ReturnValue = 0;
756e9d7c 4778 unsigned int dw_StatusReg = 0;
c995fe94
ADG
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
1783fbfe 4795 *pb_CBStatus = (unsigned char) (dw_StatusReg & 1);
c995fe94
ADG
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 |
1783fbfe
BP
4821| (unsigned char_ b_BoardHandle, |
4822| unsigned char_ b_ModulNbr, |
4823| unsigned char *_ pb_CBStatusCounter0, |
4824| unsigned char *_ pb_CBStatusCounter1) |
c995fe94
ADG
4825+----------------------------------------------------------------------------+
4826| Task : Returns the counter overflow (counter initialised to |
4827| 2*16-bit) status from selected incremental counter |
4828| module |
4829+----------------------------------------------------------------------------+
1783fbfe
BP
4830| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4831| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
4832| (0 to 3) |
4833+----------------------------------------------------------------------------+
1783fbfe 4834| Output Parameters : unsigned char *_ pb_CBStatusCounter0 : 0 : No overflow occur for |
c995fe94
ADG
4835| the first 16-bit |
4836| counter |
4837| 1 : Overflow occur for the|
4838| first 16-bit counter |
1783fbfe 4839| unsigned char *_ pb_CBStatusCounter1 : 0 : No overflow occur for |
c995fe94
ADG
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
da91b269
BP
4856int i_APCI1710_Get16BitCBStatus(struct comedi_device *dev,
4857 unsigned char b_ModulNbr, unsigned char *pb_CBStatusCounter0, unsigned char *pb_CBStatusCounter1)
c995fe94 4858{
74b894e5 4859 int i_ReturnValue = 0;
756e9d7c 4860 unsigned int dw_StatusReg = 0;
c995fe94
ADG
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 =
1783fbfe 4897 (unsigned char) ((dw_StatusReg >> 0) &
c995fe94
ADG
4898 1);
4899 *pb_CBStatusCounter0 =
1783fbfe 4900 (unsigned char) ((dw_StatusReg >> 1) &
c995fe94 4901 1);
2696fb57 4902 } /* if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) */
c995fe94
ADG
4903 else {
4904 /****************************/
4905 /* Firmware revision error */
4906 /****************************/
4907
4908 i_ReturnValue = -5;
2696fb57
BP
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) */
c995fe94
ADG
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;
2696fb57
BP
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) */
c995fe94
ADG
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;
2696fb57
BP
4929 } /* if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) */
4930 } /* if (b_ModulNbr < 4) */
c995fe94
ADG
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;
2696fb57 4938 } /* if (b_ModulNbr < 4) */
c995fe94
ADG
4939
4940 return (i_ReturnValue);
4941}
4942
4943/*
4944+----------------------------------------------------------------------------+
4945| Function Name : _INT_ i_APCI1710_GetUDStatus |
1783fbfe
BP
4946| (unsigned char_ b_BoardHandle, |
4947| unsigned char_ b_ModulNbr, |
4948| unsigned char *_ pb_UDStatus) |
c995fe94
ADG
4949+----------------------------------------------------------------------------+
4950| Task : Return the counter progress status |
4951+----------------------------------------------------------------------------+
1783fbfe
BP
4952| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4953| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
4954| (0 to 3) |
4955+----------------------------------------------------------------------------+
1783fbfe 4956| Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
c995fe94
ADG
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
da91b269
BP
4969int i_APCI1710_GetUDStatus(struct comedi_device *dev,
4970 unsigned char b_ModulNbr, unsigned char *pb_UDStatus)
c995fe94 4971{
74b894e5 4972 int i_ReturnValue = 0;
756e9d7c 4973 unsigned int dw_StatusReg = 0;
c995fe94
ADG
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
1783fbfe 4990 *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 2) & 1);
c995fe94
ADG
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 |
1783fbfe
BP
5016| (unsigned char_ b_BoardHandle, |
5017| unsigned char_ b_ModulNbr, |
5018| unsigned char *_ pb_UDStatus) |
c995fe94
ADG
5019+----------------------------------------------------------------------------+
5020| Task : Return the counter progress latched status after a |
5021| index interrupt occur. |
5022+----------------------------------------------------------------------------+
1783fbfe
BP
5023| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
5024| unsigned char_ b_ModulNbr : Module number to configure |
c995fe94
ADG
5025| (0 to 3) |
5026+----------------------------------------------------------------------------+
1783fbfe 5027| Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
c995fe94
ADG
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
da91b269
BP
5043int i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device *dev,
5044 unsigned char b_ModulNbr, unsigned char *pb_UDStatus)
c995fe94 5045{
74b894e5 5046 int i_ReturnValue = 0;
756e9d7c 5047 unsigned int dw_StatusReg = 0;
c995fe94
ADG
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
1783fbfe 5077 *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
c995fe94
ADG
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 |
1783fbfe
BP
5109 | (unsigned char_ b_BoardHandle, |
5110 | unsigned char_ b_ModulNbr, |
5111 | unsigned char *_ pb_Status, |
c995fe94
ADG
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 +----------------------------------------------------------------------------+
1783fbfe
BP
5118 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
5119 | unsigned char_ b_ModulNbr : Number of the module to be |
c995fe94
ADG
5120 | configured (0 to 3) |
5121 +----------------------------------------------------------------------------+
1783fbfe 5122 | Output Parameters : unsigned char *_ pb_Status : Returns the frequency |
c995fe94
ADG
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. |
1783fbfe 5130 | unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
c995fe94
ADG
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
da91b269 5148int i_APCI1710_ReadFrequencyMeasurement(struct comedi_device *dev,
1783fbfe 5149 unsigned char b_ModulNbr,
da91b269 5150 unsigned char *pb_Status, unsigned char *pb_UDStatus, unsigned int *pul_ReadValue)
c995fe94 5151{
74b894e5 5152 int i_ReturnValue = 0;
117102b0 5153 unsigned int ui_16BitValue;
756e9d7c 5154 unsigned int dw_StatusReg;
c995fe94
ADG
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 =
1783fbfe 5201 (unsigned char) ((dw_StatusReg >>
c995fe94
ADG
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 =
117102b0 5227 (unsigned int)
c995fe94
ADG
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 =
117102b0 5250 (unsigned int)
c995fe94
ADG
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 =
117102b0 5284 (unsigned int)
c995fe94
ADG
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 =
117102b0 5310 (unsigned int)
c995fe94
ADG
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}