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