4 Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
10 Fax: +49(0)7223/9493-92
11 http://www.addi-data-com
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 You shoud also find the complete GPL in the COPYING file accompanying this source code.
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 |
39 +-----------------------------------------------------------------------+
41 +-----------------------------------------------------------------------+
42 | Date | Author | Description of updates |
43 +----------+-----------+------------------------------------------------+
45 |----------|-----------|------------------------------------------------|
46 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
48 +-----------------------------------------------------------------------+
49 | 29/06/01 | Guinot C. | - 1100/0231 -> 0701/0232 |
50 | | | See i_APCI1710_DisableFrequencyMeasurement |
51 +-----------------------------------------------------------------------+
55 +----------------------------------------------------------------------------+
57 +----------------------------------------------------------------------------+
60 #include "APCI1710_INCCPT.h"
63 +----------------------------------------------------------------------------+
64 | INT i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
65 struct comedi_insn *insn,unsigned int *data)
67 +----------------------------------------------------------------------------+
68 | Task : Configuration function for INC_CPT |
69 +----------------------------------------------------------------------------+
70 | Input Parameters : |
71 +----------------------------------------------------------------------------+
72 | Output Parameters : *data
73 +----------------------------------------------------------------------------+
75 +----------------------------------------------------------------------------+
78 INT i_APCI1710_InsnConfigINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
79 struct comedi_insn * insn, unsigned int * data)
82 INT i_ReturnValue = 0;
83 ui_ConfigType = CR_CHAN(insn->chanspec);
87 devpriv->tsk_Current = current; // Save the current process task structure
88 switch (ui_ConfigType) {
89 case APCI1710_INCCPT_INITCOUNTER:
90 i_ReturnValue = i_APCI1710_InitCounter(dev,
91 CR_AREF(insn->chanspec),
92 (unsigned char) data[0],
93 (unsigned char) data[1],
94 (unsigned char) data[2], (unsigned char) data[3], (unsigned char) data[4]);
97 case APCI1710_INCCPT_COUNTERAUTOTEST:
98 i_ReturnValue = i_APCI1710_CounterAutoTest(dev,
99 (unsigned char *) & data[0]);
102 case APCI1710_INCCPT_INITINDEX:
103 i_ReturnValue = i_APCI1710_InitIndex(dev,
104 CR_AREF(insn->chanspec),
105 (unsigned char) data[0],
106 (unsigned char) data[1], (unsigned char) data[2], (unsigned char) data[3]);
109 case APCI1710_INCCPT_INITREFERENCE:
110 i_ReturnValue = i_APCI1710_InitReference(dev,
111 CR_AREF(insn->chanspec), (unsigned char) data[0]);
114 case APCI1710_INCCPT_INITEXTERNALSTROBE:
115 i_ReturnValue = i_APCI1710_InitExternalStrobe(dev,
116 CR_AREF(insn->chanspec),
117 (unsigned char) data[0], (unsigned char) data[1]);
120 case APCI1710_INCCPT_INITCOMPARELOGIC:
121 i_ReturnValue = i_APCI1710_InitCompareLogic(dev,
122 CR_AREF(insn->chanspec), (UINT) data[0]);
125 case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT:
126 i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev,
127 CR_AREF(insn->chanspec),
128 (unsigned char) data[0],
129 (unsigned char) data[1], (ULONG) data[2], (PULONG) & data[0]);
133 printk("Insn Config : Config Parameter Wrong\n");
137 if (i_ReturnValue >= 0)
138 i_ReturnValue = insn->n;
139 return (i_ReturnValue);
143 +----------------------------------------------------------------------------+
144 | Function Name : _INT_ i_APCI1710_InitCounter |
145 | (unsigned char_ b_BoardHandle, |
146 | unsigned char_ b_ModulNbr, |
147 | unsigned char_ b_CounterRange, |
148 | unsigned char_ b_FirstCounterModus, |
149 | unsigned char_ b_FirstCounterOption, |
150 | unsigned char_ b_SecondCounterModus, |
151 | unsigned char_ b_SecondCounterOption) |
152 +----------------------------------------------------------------------------+
153 | Task : Configure the counter operating mode from selected |
154 | module (b_ModulNbr). You must calling this function be |
155 | for you call any other function witch access of |
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 | |
169 | | | - b_SecondCounterModus and | |
170 | | | b_SecondCounterOption | |
171 | | | configure the second 16 bit | |
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 | +------------------------------------+-----------------------------------+ |
185 | Counter operating mode |
186 | ---------------------- |
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 | |
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 | |
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 | |
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 | +--------------------+-------------------------+-------------------------+ |
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! |
235 | Counter operating option for quadruple/double/simple mode |
236 | --------------------------------------------------------- |
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 ||
253 | +----------------------+-------------------------+------------------------+|
257 | This option are only avaible if you have selected the direct mode. |
260 | Counter operating option for direct mode |
261 | ---------------------------------------- |
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 | +----------------------+--------------------+----------------------------+ |
275 +----------------------------------------------------------------------------+
276 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710|
277 | unsigned char_ b_ModulNbr : Module number to |
278 | configure (0 to 3) |
279 | unsigned char_ b_CounterRange : Selection form counter |
281 | unsigned char_ b_FirstCounterModus : First counter operating |
283 | unsigned char_ b_FirstCounterOption : First counter option. |
284 | unsigned char_ b_SecondCounterModus : Second counter operating |
286 | unsigned char_ b_SecondCounterOption : Second counter option. |
287 +----------------------------------------------------------------------------+
288 | Output Parameters : - |
289 +----------------------------------------------------------------------------+
290 | Return Value : 0: No error |
291 | -1: The handle parameter of the board is wrong |
292 | -2: The module is not a counter module |
293 | -3: The selected counter range is wrong. |
294 | -4: The selected first counter operating mode is wrong. |
295 | -5: The selected first counter operating option is wrong|
296 | -6: The selected second counter operating mode is wrong.|
297 | -7: The selected second counter operating option is |
299 +----------------------------------------------------------------------------+
302 INT i_APCI1710_InitCounter(struct comedi_device * dev,
303 unsigned char b_ModulNbr,
304 unsigned char b_CounterRange,
305 unsigned char b_FirstCounterModus,
306 unsigned char b_FirstCounterOption,
307 unsigned char b_SecondCounterModus, unsigned char b_SecondCounterOption)
309 INT i_ReturnValue = 0;
311 /*******************************/
312 /* Test if incremental counter */
313 /*******************************/
315 if ((devpriv->s_BoardInfos.
316 dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF0000UL) ==
317 APCI1710_INCREMENTAL_COUNTER) {
318 /**************************/
319 /* Test the counter range */
320 /**************************/
322 if (b_CounterRange == APCI1710_16BIT_COUNTER
323 || b_CounterRange == APCI1710_32BIT_COUNTER) {
324 /********************************/
325 /* Test the first counter modus */
326 /********************************/
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 /*********************************/
336 if ((b_FirstCounterModus == APCI1710_DIRECT_MODE
337 && (b_FirstCounterOption ==
339 || b_FirstCounterOption
340 == APCI1710_DECREMENT))
341 || (b_FirstCounterModus !=
343 && (b_FirstCounterOption ==
344 APCI1710_HYSTERESIS_ON
345 || b_FirstCounterOption
347 APCI1710_HYSTERESIS_OFF)))
349 /**************************/
350 /* Test if 16-bit counter */
351 /**************************/
353 if (b_CounterRange ==
354 APCI1710_16BIT_COUNTER) {
355 /*********************************/
356 /* Test the second counter modus */
357 /*********************************/
359 if ((b_FirstCounterModus !=
362 (b_SecondCounterModus
364 APCI1710_QUADRUPLE_MODE
372 APCI1710_SIMPLE_MODE))
373 || (b_FirstCounterModus
379 APCI1710_DIRECT_MODE))
381 /**********************************/
382 /* Test the second counter option */
383 /**********************************/
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))) {
389 /*********************************************************/
390 /* The selected second counter operating option is wrong */
391 /*********************************************************/
393 DPRINTK("The selected second counter operating option is wrong\n");
398 /*******************************************************/
399 /* The selected second counter operating mode is wrong */
400 /*******************************************************/
402 DPRINTK("The selected second counter operating mode is wrong\n");
407 /********************************************************/
408 /* The selected first counter operating option is wrong */
409 /********************************************************/
411 DPRINTK("The selected first counter operating option is wrong\n");
415 /******************************************************/
416 /* The selected first counter operating mode is wrong */
417 /******************************************************/
418 DPRINTK("The selected first counter operating mode is wrong\n");
422 /***************************************/
423 /* The selected counter range is wrong */
424 /***************************************/
426 DPRINTK("The selected counter range is wrong\n");
430 /*************************/
431 /* Test if a error occur */
432 /*************************/
434 if (i_ReturnValue == 0) {
435 /**************************/
436 /* Test if 16-Bit counter */
437 /**************************/
439 if (b_CounterRange == APCI1710_32BIT_COUNTER) {
441 s_ModuleInfo[b_ModulNbr].
442 s_SiemensCounterInfo.
445 b_ModeRegister1 = b_CounterRange |
446 b_FirstCounterModus |
447 b_FirstCounterOption;
450 s_ModuleInfo[b_ModulNbr].
451 s_SiemensCounterInfo.
454 b_ModeRegister1 = b_CounterRange |
455 (b_FirstCounterModus & 0x5) |
456 (b_FirstCounterOption & 0x20) |
457 (b_SecondCounterModus & 0xA) |
458 (b_SecondCounterOption & 0x40);
460 /***********************/
461 /* Test if direct mode */
462 /***********************/
464 if (b_FirstCounterModus == APCI1710_DIRECT_MODE) {
466 s_ModuleInfo[b_ModulNbr].
467 s_SiemensCounterInfo.
470 b_ModeRegister1 = devpriv->
471 s_ModuleInfo[b_ModulNbr].
472 s_SiemensCounterInfo.
476 APCI1710_DIRECT_MODE;
480 /***************************/
481 /* Write the configuration */
482 /***************************/
484 outl(devpriv->s_ModuleInfo[b_ModulNbr].
485 s_SiemensCounterInfo.
487 dw_ModeRegister1_2_3_4,
488 devpriv->s_BoardInfos.
489 ui_Address + 20 + (64 * b_ModulNbr));
492 s_ModuleInfo[b_ModulNbr].
493 s_SiemensCounterInfo.
494 s_InitFlag.b_CounterInit = 1;
497 /**************************************/
498 /* The module is not a counter module */
499 /**************************************/
501 DPRINTK("The module is not a counter module\n");
505 return (i_ReturnValue);
509 +----------------------------------------------------------------------------+
510 | Function Name : _INT_ i_APCI1710_CounterAutoTest |
511 | (unsigned char_ b_BoardHandle, |
512 | unsigned char *_ pb_TestStatus) |
513 +----------------------------------------------------------------------------+
514 | Task : A test mode is intended for testing the component and |
515 | the connected periphery. All the 8-bit counter chains |
516 | are operated internally as down counters. |
517 | Independently from the external signals, |
518 | all the four 8-bit counter chains are decremented in |
519 | parallel by each negative clock pulse edge of CLKX. |
521 | Counter auto test conclusion |
522 | ---------------------------- |
523 | +-----------------+-----------------------------+ |
524 | | pb_TestStatus | Error description | |
526 | |-----------------+-----------------------------| |
527 | | 0000 | No error detected | |
528 | |-----------------|-----------------------------| |
529 | | 0001 | Error detected of counter 0 | |
530 | |-----------------|-----------------------------| |
531 | | 0010 | Error detected of counter 1 | |
532 | |-----------------|-----------------------------| |
533 | | 0100 | Error detected of counter 2 | |
534 | |-----------------|-----------------------------| |
535 | | 1000 | Error detected of counter 3 | |
536 | +-----------------+-----------------------------+ |
537 +----------------------------------------------------------------------------+
538 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | |
539 +----------------------------------------------------------------------------+
540 | Output Parameters : unsigned char *_ pb_TestStatus : Auto test conclusion. See table|
541 +----------------------------------------------------------------------------+
542 | Return Value : 0: No error |
543 | -1: The handle parameter of the board is wrong |
544 | -2: No counter module found |
545 +----------------------------------------------------------------------------+
548 INT i_APCI1710_CounterAutoTest(struct comedi_device * dev, unsigned char * pb_TestStatus)
550 unsigned char b_ModulCpt = 0;
551 INT i_ReturnValue = 0;
552 DWORD dw_LathchValue;
556 /********************************/
557 /* Test if counter module found */
558 /********************************/
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 /*******************************/
577 if ((devpriv->s_BoardInfos.
578 dw_MolduleConfiguration[b_ModulCpt] &
580 APCI1710_INCREMENTAL_COUNTER) {
585 outl(3, devpriv->s_BoardInfos.
586 ui_Address + 16 + (64 * b_ModulCpt));
588 /*********************/
589 /* Tatch the counter */
590 /*********************/
592 outl(1, devpriv->s_BoardInfos.
593 ui_Address + (64 * b_ModulCpt));
595 /************************/
596 /* Read the latch value */
597 /************************/
599 dw_LathchValue = inl(devpriv->s_BoardInfos.
600 ui_Address + 4 + (64 * b_ModulCpt));
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)) {
609 *pb_TestStatus | (1 <<
617 outl(0, devpriv->s_BoardInfos.
618 ui_Address + 16 + (64 * b_ModulCpt));
622 /***************************/
623 /* No counter module found */
624 /***************************/
626 DPRINTK("No counter module found\n");
630 return (i_ReturnValue);
634 +----------------------------------------------------------------------------+
635 | Function Name : _INT_ i_APCI1710_InitIndex (unsigned char_ b_BoardHandle, |
636 | unsigned char_ b_ModulNbr, |
637 | unsigned char_ b_ReferenceAction, |
638 | unsigned char_ b_IndexOperation, |
639 | unsigned char_ b_AutoMode, |
640 | unsigned char_ b_InterruptEnable) |
641 +----------------------------------------------------------------------------+
642 | Task : Initialise the index corresponding to the selected |
643 | module (b_ModulNbr). If a INDEX flag occur, you have |
644 | the possibility to clear the 32-Bit counter or to latch|
645 | the current 32-Bit value in to the first latch |
646 | register. The b_IndexOperation parameter give the |
647 | possibility to choice the INDEX action. |
648 | If you have enabled the automatic mode, each INDEX |
649 | action is cleared automatically, else you must read |
650 | the index status ("i_APCI1710_ReadIndexStatus") |
651 | after each INDEX action. |
657 | +------------------------+------------------------------------+ |
658 | | b_IndexOperation | Operation | |
659 | |------------------------+------------------------------------| |
660 | |APCI1710_LATCH_COUNTER | After a index signal, the counter | |
661 | | | value (32-Bit) is latched in to | |
662 | | | the first latch register | |
663 | |------------------------|------------------------------------| |
664 | |APCI1710_CLEAR_COUNTER | After a index signal, the counter | |
665 | | | value is cleared (32-Bit) | |
666 | +------------------------+------------------------------------+ |
667 +----------------------------------------------------------------------------+
668 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
669 | unsigned char_ b_ModulNbr : Module number to configure |
671 | unsigned char_ b_ReferenceAction : Determine if the reference |
672 | must set or no for the |
673 | acceptance from index |
674 | APCI1710_ENABLE : |
675 | Reference must be set for |
676 | accepted the index |
677 | APCI1710_DISABLE : |
678 | Reference have not |
680 | unsigned char_ b_IndexOperation : Index operating mode. |
682 | unsigned char_ b_AutoMode : Enable or disable the |
683 | automatic index reset. |
684 | APCI1710_ENABLE : |
685 | Enable the automatic mode |
686 | APCI1710_DISABLE : |
687 | Disable the automatic mode |
688 | unsigned char_ b_InterruptEnable : Enable or disable the |
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 +----------------------------------------------------------------------------+
711 INT i_APCI1710_InitIndex(struct comedi_device * dev,
712 unsigned char b_ModulNbr,
713 unsigned char b_ReferenceAction,
714 unsigned char b_IndexOperation, unsigned char b_AutoMode, unsigned char b_InterruptEnable)
716 INT i_ReturnValue = 0;
718 /**************************/
719 /* Test the module number */
720 /**************************/
722 if (b_ModulNbr < 4) {
723 /*******************************/
724 /* Test if counter initialised */
725 /*******************************/
728 s_ModuleInfo[b_ModulNbr].
729 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
730 /********************************/
731 /* Test the reference parameter */
732 /********************************/
734 if (b_ReferenceAction == APCI1710_ENABLE ||
735 b_ReferenceAction == APCI1710_DISABLE) {
736 /****************************/
737 /* Test the index parameter */
738 /****************************/
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)
753 /********************************/
754 /* Test the auto mode parameter */
755 /********************************/
757 if (b_AutoMode == APCI1710_ENABLE ||
758 b_AutoMode == APCI1710_DISABLE)
760 /***************************/
761 /* Test the interrupt mode */
762 /***************************/
764 if (b_InterruptEnable ==
766 || b_InterruptEnable ==
769 /************************************/
770 /* Makte the configuration commando */
771 /************************************/
773 if (b_ReferenceAction ==
779 s_SiemensCounterInfo.
787 s_SiemensCounterInfo.
792 APCI1710_ENABLE_INDEX_ACTION;
797 s_SiemensCounterInfo.
805 s_SiemensCounterInfo.
810 APCI1710_DISABLE_INDEX_ACTION;
813 /****************************************/
814 /* Test if low level latch or/and clear */
815 /****************************************/
817 if (b_IndexOperation ==
818 APCI1710_LOW_EDGE_LATCH_COUNTER
822 APCI1710_LOW_EDGE_CLEAR_COUNTER
826 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
828 /*************************************/
829 /* Set the index level to low (DQ26) */
830 /*************************************/
835 s_SiemensCounterInfo.
843 s_SiemensCounterInfo.
848 APCI1710_SET_LOW_INDEX_LEVEL;
850 /**************************************/
851 /* Set the index level to high (DQ26) */
852 /**************************************/
857 s_SiemensCounterInfo.
865 s_SiemensCounterInfo.
870 APCI1710_SET_HIGH_INDEX_LEVEL;
873 /***********************************/
874 /* Test if latch and clear counter */
875 /***********************************/
877 if (b_IndexOperation ==
878 APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER
882 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
884 /***************************************/
885 /* Set the latch and clear flag (DQ27) */
886 /***************************************/
891 s_SiemensCounterInfo.
899 s_SiemensCounterInfo.
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)
907 /*****************************************/
908 /* Clear the latch and clear flag (DQ27) */
909 /*****************************************/
914 s_SiemensCounterInfo.
922 s_SiemensCounterInfo.
927 APCI1710_DISABLE_LATCH_AND_CLEAR;
929 /*************************/
930 /* Test if latch counter */
931 /*************************/
933 if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_COUNTER) {
934 /*********************************/
935 /* Enable the latch from counter */
936 /*********************************/
941 s_SiemensCounterInfo.
949 s_SiemensCounterInfo.
954 APCI1710_INDEX_LATCH_COUNTER;
956 /*********************************/
957 /* Enable the clear from counter */
958 /*********************************/
963 s_SiemensCounterInfo.
971 s_SiemensCounterInfo.
976 (~APCI1710_INDEX_LATCH_COUNTER);
978 } // // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
986 s_SiemensCounterInfo.
994 s_SiemensCounterInfo.
999 APCI1710_INDEX_AUTO_MODE;
1004 s_SiemensCounterInfo.
1012 s_SiemensCounterInfo.
1017 (~APCI1710_INDEX_AUTO_MODE);
1020 if (b_InterruptEnable ==
1026 s_SiemensCounterInfo.
1034 s_SiemensCounterInfo.
1039 APCI1710_ENABLE_INDEX_INT;
1044 s_SiemensCounterInfo.
1052 s_SiemensCounterInfo.
1057 APCI1710_DISABLE_INDEX_INT;
1063 s_SiemensCounterInfo.
1068 /********************************/
1069 /* Interrupt parameter is wrong */
1070 /********************************/
1071 DPRINTK("Interrupt parameter is wrong\n");
1075 /************************************/
1076 /* The auto mode parameter is wrong */
1077 /************************************/
1079 DPRINTK("The auto mode parameter is wrong\n");
1083 /***********************************************/
1084 /* The index operating mode parameter is wrong */
1085 /***********************************************/
1087 DPRINTK("The index operating mode parameter is wrong\n");
1091 /*******************************************/
1092 /* The reference action parameter is wrong */
1093 /*******************************************/
1095 DPRINTK("The reference action parameter is wrong\n");
1099 /****************************************/
1100 /* Counter not initialised see function */
1101 /* "i_APCI1710_InitCounter" */
1102 /****************************************/
1104 DPRINTK("Counter not initialised\n");
1108 /*************************************************/
1109 /* The selected module number parameter is wrong */
1110 /*************************************************/
1112 DPRINTK("The selected module number parameter is wrong\n");
1116 return (i_ReturnValue);
1120 +----------------------------------------------------------------------------+
1121 | Function Name : _INT_ i_APCI1710_InitReference |
1122 | (unsigned char_ b_BoardHandle, |
1123 | unsigned char_ b_ModulNbr, |
1124 | unsigned char_ b_ReferenceLevel) |
1125 +----------------------------------------------------------------------------+
1126 | Task : Initialise the reference corresponding to the selected |
1127 | module (b_ModulNbr). |
1131 | +--------------------+-------------------------+ |
1132 | | b_ReferenceLevel | Operation | |
1133 | +--------------------+-------------------------+ |
1134 | | APCI1710_LOW | Reference occur if "0" | |
1135 | |--------------------|-------------------------| |
1136 | | APCI1710_HIGH | Reference occur if "1" | |
1137 | +--------------------+-------------------------+ |
1138 +----------------------------------------------------------------------------+
1139 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1140 | unsigned char_ b_ModulNbr : Module number to configure |
1142 | unsigned char_ b_ReferenceLevel : Reference level. |
1143 +----------------------------------------------------------------------------+
1144 | Output Parameters : - |
1145 +----------------------------------------------------------------------------+
1146 | Return Value : 0: No error |
1147 | -1: The handle parameter of the board is wrong |
1148 | -2: The selected module number parameter is wrong |
1149 | -3: Counter not initialised see function |
1150 | "i_APCI1710_InitCounter" |
1151 | -4: Reference level parameter is wrong |
1152 +----------------------------------------------------------------------------+
1155 INT i_APCI1710_InitReference(struct comedi_device * dev,
1156 unsigned char b_ModulNbr, unsigned char b_ReferenceLevel)
1158 INT i_ReturnValue = 0;
1160 /**************************/
1161 /* Test the module number */
1162 /**************************/
1164 if (b_ModulNbr < 4) {
1165 /*******************************/
1166 /* Test if counter initialised */
1167 /*******************************/
1170 s_ModuleInfo[b_ModulNbr].
1171 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1172 /**************************************/
1173 /* Test the reference level parameter */
1174 /**************************************/
1176 if (b_ReferenceLevel == 0 || b_ReferenceLevel == 1) {
1177 if (b_ReferenceLevel == 1) {
1179 s_ModuleInfo[b_ModulNbr].
1180 s_SiemensCounterInfo.
1183 b_ModeRegister2 = devpriv->
1184 s_ModuleInfo[b_ModulNbr].
1185 s_SiemensCounterInfo.
1189 APCI1710_REFERENCE_HIGH;
1192 s_ModuleInfo[b_ModulNbr].
1193 s_SiemensCounterInfo.
1196 b_ModeRegister2 = devpriv->
1197 s_ModuleInfo[b_ModulNbr].
1198 s_SiemensCounterInfo.
1202 APCI1710_REFERENCE_LOW;
1205 outl(devpriv->s_ModuleInfo[b_ModulNbr].
1206 s_SiemensCounterInfo.
1208 dw_ModeRegister1_2_3_4,
1209 devpriv->s_BoardInfos.ui_Address + 20 +
1213 s_ModuleInfo[b_ModulNbr].
1214 s_SiemensCounterInfo.
1215 s_InitFlag.b_ReferenceInit = 1;
1217 /**************************************/
1218 /* Reference level parameter is wrong */
1219 /**************************************/
1221 DPRINTK("Reference level parameter is wrong\n");
1225 /****************************************/
1226 /* Counter not initialised see function */
1227 /* "i_APCI1710_InitCounter" */
1228 /****************************************/
1230 DPRINTK("Counter not initialised\n");
1234 /*************************************************/
1235 /* The selected module number parameter is wrong */
1236 /*************************************************/
1238 DPRINTK("The selected module number parameter is wrong\n");
1242 return (i_ReturnValue);
1246 +----------------------------------------------------------------------------+
1247 | Function Name : _INT_ i_APCI1710_InitExternalStrobe |
1248 | (unsigned char_ b_BoardHandle, |
1249 | unsigned char_ b_ModulNbr, |
1250 | unsigned char_ b_ExternalStrobe, |
1251 | unsigned char_ b_ExternalStrobeLevel) |
1252 +----------------------------------------------------------------------------+
1253 | Task : Initialises the external strobe level corresponding to |
1254 | the selected module (b_ModulNbr). |
1255 +----------------------------------------------------------------------------+
1256 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1257 | unsigned char_ b_ModulNbr : Module number to configure |
1259 | unsigned char_ b_ExternalStrobe : External strobe selection |
1260 | 0 : External strobe A |
1261 | 1 : External strobe B |
1262 | unsigned char_ b_ExternalStrobeLevel : External strobe level |
1264 | External latch occurs if "0" |
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 +----------------------------------------------------------------------------+
1280 INT i_APCI1710_InitExternalStrobe(struct comedi_device * dev,
1281 unsigned char b_ModulNbr, unsigned char b_ExternalStrobe, unsigned char b_ExternalStrobeLevel)
1283 INT i_ReturnValue = 0;
1285 /**************************/
1286 /* Test the module number */
1287 /**************************/
1289 if (b_ModulNbr < 4) {
1290 /*******************************/
1291 /* Test if counter initialised */
1292 /*******************************/
1295 s_ModuleInfo[b_ModulNbr].
1296 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1297 /**************************************/
1298 /* Test the external strobe selection */
1299 /**************************************/
1301 if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) {
1302 /******************/
1303 /* Test the level */
1304 /******************/
1306 if ((b_ExternalStrobeLevel == APCI1710_HIGH) ||
1307 ((b_ExternalStrobeLevel == APCI1710_LOW
1310 dw_MolduleConfiguration
1319 s_ModuleInfo[b_ModulNbr].
1320 s_SiemensCounterInfo.
1323 b_ModeRegister4 = (devpriv->
1324 s_ModuleInfo[b_ModulNbr].
1325 s_SiemensCounterInfo.
1328 b_ModeRegister4 & (0xFF -
1329 (0x10 << b_ExternalStrobe))) | ((b_ExternalStrobeLevel ^ 1) << (4 + b_ExternalStrobe));
1331 /********************************************/
1332 /* External strobe level parameter is wrong */
1333 /********************************************/
1335 DPRINTK("External strobe level parameter is wrong\n");
1338 } // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1)
1340 /**************************************/
1341 /* External strobe selection is wrong */
1342 /**************************************/
1344 DPRINTK("External strobe selection is wrong\n");
1346 } // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1)
1348 /****************************************/
1349 /* Counter not initialised see function */
1350 /* "i_APCI1710_InitCounter" */
1351 /****************************************/
1353 DPRINTK("Counter not initialised\n");
1357 /*************************************************/
1358 /* The selected module number parameter is wrong */
1359 /*************************************************/
1361 DPRINTK("The selected module number parameter is wrong\n");
1365 return (i_ReturnValue);
1369 +----------------------------------------------------------------------------+
1370 | Function Name : _INT_ i_APCI1710_InitCompareLogic |
1371 | (unsigned char_ b_BoardHandle, |
1372 | unsigned char_ 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 : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1380 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
1394 INT i_APCI1710_InitCompareLogic(struct comedi_device * dev,
1395 unsigned char b_ModulNbr, UINT ui_CompareValue)
1397 INT i_ReturnValue = 0;
1399 /**************************/
1400 /* Test the module number */
1401 /**************************/
1403 if (b_ModulNbr < 4) {
1404 /*******************************/
1405 /* Test if counter initialised */
1406 /*******************************/
1409 s_ModuleInfo[b_ModulNbr].
1410 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1412 outl(ui_CompareValue, devpriv->s_BoardInfos.
1413 ui_Address + 28 + (64 * b_ModulNbr));
1416 s_ModuleInfo[b_ModulNbr].
1417 s_SiemensCounterInfo.
1418 s_InitFlag.b_CompareLogicInit = 1;
1420 /****************************************/
1421 /* Counter not initialised see function */
1422 /* "i_APCI1710_InitCounter" */
1423 /****************************************/
1425 DPRINTK("Counter not initialised\n");
1429 /*************************************************/
1430 /* The selected module number parameter is wrong */
1431 /*************************************************/
1433 DPRINTK("The selected module number parameter is wrong\n");
1437 return (i_ReturnValue);
1441 +----------------------------------------------------------------------------+
1442 | Function Name : _INT_ i_APCI1710_InitFrequencyMeasurement |
1443 | (unsigned char_ b_BoardHandle, |
1444 | unsigned char_ b_ModulNbr, |
1445 | unsigned char_ b_PCIInputClock, |
1446 | unsigned char_ b_TimingUnity, |
1447 | ULONG_ ul_TimingInterval, |
1448 | PULONG_ pul_RealTimingInterval) |
1449 +----------------------------------------------------------------------------+
1450 | Task : Sets the time for the frequency measurement. |
1451 | Configures the selected TOR incremental counter of the |
1452 | selected module (b_ModulNbr). The ul_TimingInterval and|
1453 | ul_TimingUnity determine the time base for the |
1454 | measurement. The pul_RealTimingInterval returns the |
1455 | real time value. You must call up this function before |
1456 | you call up any other function which gives access to |
1457 | the frequency measurement. |
1458 +----------------------------------------------------------------------------+
1459 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
1460 | unsigned char_ b_ModulNbr : Number of the module to be |
1461 | configured (0 to 3) |
1462 | unsigned char_ b_PCIInputClock : Selection of the PCI bus |
1464 | - APCI1710_30MHZ : |
1465 | The PC has a PCI bus clock |
1467 | - APCI1710_33MHZ : |
1468 | The PC has a PCI bus clock |
1470 | unsigned char_ b_TimingUnity : Base time unit (0 to 2) |
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 +----------------------------------------------------------------------------+
1490 INT i_APCI1710_InitFrequencyMeasurement(struct comedi_device * dev,
1491 unsigned char b_ModulNbr,
1492 unsigned char b_PCIInputClock,
1493 unsigned char b_TimingUnity,
1494 ULONG ul_TimingInterval, PULONG pul_RealTimingInterval)
1496 INT i_ReturnValue = 0;
1497 ULONG ul_TimerValue = 0;
1498 double d_RealTimingInterval;
1499 DWORD dw_Status = 0;
1501 /**************************/
1502 /* Test the module number */
1503 /**************************/
1505 if (b_ModulNbr < 4) {
1506 /*******************************/
1507 /* Test if counter initialised */
1508 /*******************************/
1511 s_ModuleInfo[b_ModulNbr].
1512 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
1513 /**************************/
1514 /* Test the PCI bus clock */
1515 /**************************/
1517 if ((b_PCIInputClock == APCI1710_30MHZ) ||
1518 (b_PCIInputClock == APCI1710_33MHZ) ||
1519 (b_PCIInputClock == APCI1710_40MHZ)) {
1520 /************************/
1521 /* Test the timing unit */
1522 /************************/
1524 if (b_TimingUnity <= 2) {
1525 /**********************************/
1526 /* Test the base timing selection */
1527 /**********************************/
1529 if (((b_PCIInputClock == APCI1710_30MHZ)
1530 && (b_TimingUnity == 0)
1531 && (ul_TimingInterval >=
1533 && (ul_TimingInterval <=
1535 || ((b_PCIInputClock ==
1537 && (b_TimingUnity == 1)
1538 && (ul_TimingInterval >=
1540 && (ul_TimingInterval <=
1542 || ((b_PCIInputClock ==
1544 && (b_TimingUnity == 2)
1545 && (ul_TimingInterval >=
1547 && (ul_TimingInterval <=
1549 || ((b_PCIInputClock ==
1551 && (b_TimingUnity == 0)
1552 && (ul_TimingInterval >=
1554 && (ul_TimingInterval <=
1556 || ((b_PCIInputClock ==
1558 && (b_TimingUnity == 1)
1559 && (ul_TimingInterval >=
1561 && (ul_TimingInterval <=
1563 || ((b_PCIInputClock ==
1565 && (b_TimingUnity == 2)
1566 && (ul_TimingInterval >=
1568 && (ul_TimingInterval <=
1570 || ((b_PCIInputClock ==
1572 && (b_TimingUnity == 0)
1573 && (ul_TimingInterval >=
1575 && (ul_TimingInterval <=
1577 || ((b_PCIInputClock ==
1579 && (b_TimingUnity == 1)
1580 && (ul_TimingInterval >=
1582 && (ul_TimingInterval <=
1584 || ((b_PCIInputClock ==
1586 && (b_TimingUnity == 2)
1587 && (ul_TimingInterval >=
1589 && (ul_TimingInterval <=
1591 /**********************/
1592 /* Test if 40MHz used */
1593 /**********************/
1595 if (b_PCIInputClock ==
1597 /******************************/
1598 /* Test if firmware >= Rev1.5 */
1599 /******************************/
1601 if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3135) {
1602 /*********************************/
1603 /* Test if 40MHz quartz on board */
1604 /*********************************/
1606 /*INPDW (ps_APCI1710Variable->
1607 s_Board [b_BoardHandle].
1609 ui_Address + 36 + (64 * b_ModulNbr), &dw_Status); */
1618 /******************************/
1619 /* Test the quartz flag (DQ0) */
1620 /******************************/
1622 if ((dw_Status & 1) != 1) {
1623 /*****************************/
1624 /* 40MHz quartz not on board */
1625 /*****************************/
1627 DPRINTK("40MHz quartz not on board\n");
1633 /*****************************/
1634 /* 40MHz quartz not on board */
1635 /*****************************/
1636 DPRINTK("40MHz quartz not on board\n");
1640 } // if (b_PCIInputClock == APCI1710_40MHZ)
1642 /***************************/
1643 /* Test if not error occur */
1644 /***************************/
1646 if (i_ReturnValue == 0) {
1647 /****************************/
1648 /* Test the INC_CPT version */
1649 /****************************/
1651 if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131) {
1653 /**********************/
1654 /* Test if 40MHz used */
1655 /**********************/
1657 if (b_PCIInputClock == APCI1710_40MHZ) {
1658 /*********************************/
1659 /* Enable the 40MHz quarz (DQ30) */
1660 /*********************************/
1665 s_SiemensCounterInfo.
1673 s_SiemensCounterInfo.
1678 APCI1710_ENABLE_40MHZ_FREQUENCY;
1679 } // if (b_PCIInputClock == APCI1710_40MHZ)
1681 /**********************************/
1682 /* Disable the 40MHz quarz (DQ30) */
1683 /**********************************/
1688 s_SiemensCounterInfo.
1696 s_SiemensCounterInfo.
1701 APCI1710_DISABLE_40MHZ_FREQUENCY;
1703 } // if (b_PCIInputClock == APCI1710_40MHZ)
1705 /********************************/
1706 /* Calculate the division fator */
1707 /********************************/
1710 switch (b_TimingUnity) {
1717 /******************/
1718 /* Timer 0 factor */
1719 /******************/
1726 (0.00025 * b_PCIInputClock));
1728 /*******************/
1729 /* Round the value */
1730 /*******************/
1732 if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
1740 /*****************************/
1741 /* Calculate the real timing */
1742 /*****************************/
1744 *pul_RealTimingInterval
1749 (0.00025 * (double)b_PCIInputClock));
1750 d_RealTimingInterval
1760 if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
1761 *pul_RealTimingInterval
1763 *pul_RealTimingInterval
1787 /******************/
1788 /* Timer 0 factor */
1789 /******************/
1796 (0.25 * b_PCIInputClock));
1798 /*******************/
1799 /* Round the value */
1800 /*******************/
1802 if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
1810 /*****************************/
1811 /* Calculate the real timing */
1812 /*****************************/
1814 *pul_RealTimingInterval
1819 (0.25 * (double)b_PCIInputClock));
1820 d_RealTimingInterval
1832 if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
1833 *pul_RealTimingInterval
1835 *pul_RealTimingInterval
1859 /******************/
1860 /* Timer 0 factor */
1861 /******************/
1871 /*******************/
1872 /* Round the value */
1873 /*******************/
1875 if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
1883 /*****************************/
1884 /* Calculate the real timing */
1885 /*****************************/
1887 *pul_RealTimingInterval
1892 (250.0 * (double)b_PCIInputClock));
1893 d_RealTimingInterval
1903 if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
1904 *pul_RealTimingInterval
1906 *pul_RealTimingInterval
1926 /*************************/
1927 /* Write the timer value */
1928 /*************************/
1930 outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 32 + (64 * b_ModulNbr));
1932 /*******************************/
1933 /* Set the initialisation flag */
1934 /*******************************/
1939 s_SiemensCounterInfo.
1941 b_FrequencyMeasurementInit
1944 /***************************/
1945 /* Counter not initialised */
1946 /***************************/
1948 DPRINTK("Counter not initialised\n");
1952 } // if (i_ReturnValue == 0)
1954 /**********************************/
1955 /* Base timing selection is wrong */
1956 /**********************************/
1958 DPRINTK("Base timing selection is wrong\n");
1962 /***********************************/
1963 /* Timing unity selection is wrong */
1964 /***********************************/
1966 DPRINTK("Timing unity selection is wrong\n");
1970 /*****************************************/
1971 /* The selected PCI input clock is wrong */
1972 /*****************************************/
1974 DPRINTK("The selected PCI input clock is wrong\n");
1978 /****************************************/
1979 /* Counter not initialised see function */
1980 /* "i_APCI1710_InitCounter" */
1981 /****************************************/
1983 DPRINTK("Counter not initialised\n");
1987 /*************************************************/
1988 /* The selected module number parameter is wrong */
1989 /*************************************************/
1991 DPRINTK("The selected module number parameter is wrong\n");
1995 return (i_ReturnValue);
1998 /*########################################################################### */
2001 /*########################################################################### */
2004 +----------------------------------------------------------------------------+
2005 | Function Name :INT i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
2006 struct comedi_insn *insn,unsigned int *data) |
2007 +----------------------------------------------------------------------------+
2008 | Task : Set & Clear Functions for INC_CPT |
2009 +----------------------------------------------------------------------------+
2010 | Input Parameters :
2011 +----------------------------------------------------------------------------+
2012 | Output Parameters : - |
2013 +----------------------------------------------------------------------------+
2015 +----------------------------------------------------------------------------+
2018 INT i_APCI1710_InsnBitsINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
2019 struct comedi_insn * insn, unsigned int * data)
2022 INT i_ReturnValue = 0;
2023 ui_BitsType = CR_CHAN(insn->chanspec);
2024 devpriv->tsk_Current = current; // Save the current process task structure
2026 switch (ui_BitsType) {
2027 case APCI1710_INCCPT_CLEARCOUNTERVALUE:
2028 i_ReturnValue = i_APCI1710_ClearCounterValue(dev,
2029 (unsigned char) CR_AREF(insn->chanspec));
2032 case APCI1710_INCCPT_CLEARALLCOUNTERVALUE:
2033 i_ReturnValue = i_APCI1710_ClearAllCounterValue(dev);
2036 case APCI1710_INCCPT_SETINPUTFILTER:
2037 i_ReturnValue = i_APCI1710_SetInputFilter(dev,
2038 (unsigned char) CR_AREF(insn->chanspec),
2039 (unsigned char) data[0], (unsigned char) data[1]);
2042 case APCI1710_INCCPT_LATCHCOUNTER:
2043 i_ReturnValue = i_APCI1710_LatchCounter(dev,
2044 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
2047 case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE:
2048 i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev,
2049 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
2052 case APCI1710_INCCPT_SETDIGITALCHLON:
2053 i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev,
2054 (unsigned char) CR_AREF(insn->chanspec));
2057 case APCI1710_INCCPT_SETDIGITALCHLOFF:
2058 i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev,
2059 (unsigned char) CR_AREF(insn->chanspec));
2063 printk("Bits Config Parameter Wrong\n");
2066 if (i_ReturnValue >= 0)
2067 i_ReturnValue = insn->n;
2068 return (i_ReturnValue);
2072 +----------------------------------------------------------------------------+
2073 | Function Name : _INT_ i_APCI1710_ClearCounterValue |
2074 | (unsigned char_ b_BoardHandle, |
2075 | unsigned char_ b_ModulNbr) |
2076 +----------------------------------------------------------------------------+
2077 | Task : Clear the counter value from selected module |
2079 +----------------------------------------------------------------------------+
2080 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2081 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
2094 INT i_APCI1710_ClearCounterValue(struct comedi_device * dev, unsigned char b_ModulNbr)
2096 INT i_ReturnValue = 0;
2098 /**************************/
2099 /* Test the module number */
2100 /**************************/
2102 if (b_ModulNbr < 4) {
2103 /*******************************/
2104 /* Test if counter initialised */
2105 /*******************************/
2108 s_ModuleInfo[b_ModulNbr].
2109 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2110 /*********************/
2111 /* Clear the counter */
2112 /*********************/
2114 outl(1, devpriv->s_BoardInfos.
2115 ui_Address + 16 + (64 * b_ModulNbr));
2117 /****************************************/
2118 /* Counter not initialised see function */
2119 /* "i_APCI1710_InitCounter" */
2120 /****************************************/
2122 DPRINTK("Counter not initialised\n");
2126 /*************************************************/
2127 /* The selected module number parameter is wrong */
2128 /*************************************************/
2130 DPRINTK("The selected module number parameter is wrong\n");
2134 return (i_ReturnValue);
2138 +----------------------------------------------------------------------------+
2139 | Function Name : _INT_ i_APCI1710_ClearAllCounterValue |
2140 | (unsigned char_ b_BoardHandle) |
2141 +----------------------------------------------------------------------------+
2142 | Task : Clear all counter value. |
2143 +----------------------------------------------------------------------------+
2144 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2145 +----------------------------------------------------------------------------+
2146 | Output Parameters : - |
2147 +----------------------------------------------------------------------------+
2148 | Return Value : 0: No error |
2149 | -1: The handle parameter of the board is wrong |
2150 | -2: No counter module found |
2151 +----------------------------------------------------------------------------+
2154 INT i_APCI1710_ClearAllCounterValue(struct comedi_device * dev)
2156 unsigned char b_ModulCpt = 0;
2157 INT i_ReturnValue = 0;
2159 /********************************/
2160 /* Test if counter module found */
2161 /********************************/
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 /*******************************/
2180 if ((devpriv->s_BoardInfos.
2181 dw_MolduleConfiguration[b_ModulCpt] &
2183 APCI1710_INCREMENTAL_COUNTER) {
2184 /*********************/
2185 /* Clear the counter */
2186 /*********************/
2188 outl(1, devpriv->s_BoardInfos.
2189 ui_Address + 16 + (64 * b_ModulCpt));
2193 /***************************/
2194 /* No counter module found */
2195 /***************************/
2197 DPRINTK("No counter module found\n");
2201 return (i_ReturnValue);
2205 +----------------------------------------------------------------------------+
2206 | Function Name : _INT_ i_APCI1710_SetInputFilter |
2207 | (unsigned char_ b_BoardHandle, |
2208 | unsigned char_ b_Module, |
2209 | unsigned char_ b_PCIInputClock, |
2210 | unsigned char_ b_Filter) |
2211 +----------------------------------------------------------------------------+
2212 | Task : Disable or enable the software filter from selected |
2213 | module (b_ModulNbr). b_Filter determine the filter time|
2214 +----------------------------------------------------------------------------+
2215 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2216 | unsigned char_ b_ModulNbr : Number of the module to be |
2217 | configured (0 to 3) |
2218 | unsigned char_ b_PCIInputClock : Selection of the PCI bus |
2220 | - APCI1710_30MHZ : |
2221 | The PC has a PCI bus clock |
2223 | - APCI1710_33MHZ : |
2224 | The PC has a PCI bus clock |
2226 | - APCI1710_40MHZ : |
2227 | The APCI1710 has a 40MHz |
2229 | unsigned char_ b_Filter : Filter selection |
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) |
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) |
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 +----------------------------------------------------------------------------+
2300 INT i_APCI1710_SetInputFilter(struct comedi_device * dev,
2301 unsigned char b_ModulNbr, unsigned char b_PCIInputClock, unsigned char b_Filter)
2303 INT i_ReturnValue = 0;
2304 DWORD dw_Status = 0;
2306 /**************************/
2307 /* Test the module number */
2308 /**************************/
2310 if (b_ModulNbr < 4) {
2311 /*******************************/
2312 /* Test if incremental counter */
2313 /*******************************/
2315 if ((devpriv->s_BoardInfos.
2316 dw_MolduleConfiguration[b_ModulNbr] &
2317 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
2318 /******************************/
2319 /* Test if firmware >= Rev1.5 */
2320 /******************************/
2322 if ((devpriv->s_BoardInfos.
2323 dw_MolduleConfiguration[b_ModulNbr] &
2324 0xFFFF) >= 0x3135) {
2325 /**************************/
2326 /* Test the PCI bus clock */
2327 /**************************/
2329 if ((b_PCIInputClock == APCI1710_30MHZ) ||
2330 (b_PCIInputClock == APCI1710_33MHZ) ||
2331 (b_PCIInputClock == APCI1710_40MHZ)) {
2332 /*************************/
2333 /* Test the filter value */
2334 /*************************/
2336 if (b_Filter < 16) {
2337 /**********************/
2338 /* Test if 40MHz used */
2339 /**********************/
2341 if (b_PCIInputClock ==
2343 /*********************************/
2344 /* Test if 40MHz quartz on board */
2345 /*********************************/
2354 /******************************/
2355 /* Test the quartz flag (DQ0) */
2356 /******************************/
2358 if ((dw_Status & 1) !=
2360 /*****************************/
2361 /* 40MHz quartz not on board */
2362 /*****************************/
2364 DPRINTK("40MHz quartz not on board\n");
2368 } // if (b_PCIInputClock == APCI1710_40MHZ)
2370 /***************************/
2371 /* Test if error not occur */
2372 /***************************/
2374 if (i_ReturnValue == 0) {
2375 /**********************/
2376 /* Test if 40MHz used */
2377 /**********************/
2379 if (b_PCIInputClock ==
2382 /*********************************/
2383 /* Enable the 40MHz quarz (DQ31) */
2384 /*********************************/
2389 s_SiemensCounterInfo.
2397 s_SiemensCounterInfo.
2402 APCI1710_ENABLE_40MHZ_FILTER;
2404 } // if (b_PCIInputClock == APCI1710_40MHZ)
2406 /**********************************/
2407 /* Disable the 40MHz quarz (DQ31) */
2408 /**********************************/
2413 s_SiemensCounterInfo.
2421 s_SiemensCounterInfo.
2426 APCI1710_DISABLE_40MHZ_FILTER;
2428 } // if (b_PCIInputClock == APCI1710_40MHZ)
2430 /************************/
2431 /* Set the filter value */
2432 /************************/
2437 s_SiemensCounterInfo.
2445 s_SiemensCounterInfo.
2457 s_SiemensCounterInfo.
2465 s_SiemensCounterInfo.
2474 /***************************/
2475 /* Write the configuration */
2476 /***************************/
2481 s_SiemensCounterInfo.
2483 dw_ModeRegister1_2_3_4,
2489 } // if (i_ReturnValue == 0)
2490 } // if (b_Filter < 16)
2492 /**************************************/
2493 /* The selected filter value is wrong */
2494 /**************************************/
2496 DPRINTK("The selected filter value is wrong\n");
2498 } // if (b_Filter < 16)
2499 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ))
2501 /*****************************************/
2502 /* The selected PCI input clock is wrong */
2503 /*****************************************/
2505 DPRINTK("The selected PCI input clock is wrong\n");
2507 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ))
2509 /**************************************/
2510 /* The module is not a counter module */
2511 /**************************************/
2513 DPRINTK("The module is not a counter module\n");
2517 /**************************************/
2518 /* The module is not a counter module */
2519 /**************************************/
2521 DPRINTK("The module is not a counter module\n");
2525 /*************************************************/
2526 /* The selected module number parameter is wrong */
2527 /*************************************************/
2529 DPRINTK("The selected module number parameter is wrong\n");
2533 return (i_ReturnValue);
2537 +----------------------------------------------------------------------------+
2538 | Function Name : _INT_ i_APCI1710_LatchCounter (unsigned char_ b_BoardHandle, |
2539 | unsigned char_ b_ModulNbr, |
2540 | unsigned char_ b_LatchReg) |
2541 +----------------------------------------------------------------------------+
2542 | Task : Latch the courant value from selected module |
2543 | (b_ModulNbr) in to the selected latch register |
2545 +----------------------------------------------------------------------------+
2546 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2547 | unsigned char_ b_ModulNbr : Module number to configure |
2549 | unsigned char_ b_LatchReg : Selected latch register |
2550 | 0 : for the first latch register |
2551 | 1 : for the second latch register |
2552 +----------------------------------------------------------------------------+
2553 | Output Parameters : - |
2554 +----------------------------------------------------------------------------+
2555 | Return Value : 0: No error |
2556 | -1: The handle parameter of the board is wrong |
2557 | -2: No counter module found |
2558 | -3: Counter not initialised see function |
2559 | "i_APCI1710_InitCounter" |
2560 | -4: The selected latch register parameter is wrong |
2561 +----------------------------------------------------------------------------+
2564 INT i_APCI1710_LatchCounter(struct comedi_device * dev,
2565 unsigned char b_ModulNbr, unsigned char b_LatchReg)
2567 INT i_ReturnValue = 0;
2569 /**************************/
2570 /* Test the module number */
2571 /**************************/
2573 if (b_ModulNbr < 4) {
2574 /*******************************/
2575 /* Test if counter initialised */
2576 /*******************************/
2579 s_ModuleInfo[b_ModulNbr].
2580 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2581 /*************************************/
2582 /* Test the latch register parameter */
2583 /*************************************/
2585 if (b_LatchReg < 2) {
2586 /*********************/
2587 /* Tatch the counter */
2588 /*********************/
2590 outl(1 << (b_LatchReg * 4),
2591 devpriv->s_BoardInfos.ui_Address +
2594 /**************************************************/
2595 /* The selected latch register parameter is wrong */
2596 /**************************************************/
2598 DPRINTK("The selected latch register parameter is wrong\n");
2602 /****************************************/
2603 /* Counter not initialised see function */
2604 /* "i_APCI1710_InitCounter" */
2605 /****************************************/
2607 DPRINTK("Counter not initialised\n");
2611 /*************************************************/
2612 /* The selected module number parameter is wrong */
2613 /*************************************************/
2615 DPRINTK("The selected module number parameter is wrong\n");
2619 return (i_ReturnValue);
2623 +----------------------------------------------------------------------------+
2624 | Function Name : _INT_ i_APCI1710_SetIndexAndReferenceSource |
2625 | (unsigned char_ b_BoardHandle, |
2626 | unsigned char_ b_ModulNbr, |
2627 | unsigned char_ b_SourceSelection) |
2628 +----------------------------------------------------------------------------+
2629 | Task : Determine the hardware source for the index and the |
2630 | reference logic. Per default the index logic is |
2631 | connected to the difference input C and the reference |
2632 | logic is connected to the 24V input E |
2633 +----------------------------------------------------------------------------+
2634 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2635 | unsigned char_ b_ModulNbr : Module number to configure |
2637 | unsigned char_ b_SourceSelection : APCI1710_SOURCE_0 : |
2638 | The index logic is connected |
2639 | to the difference input C and|
2640 | the reference logic is |
2641 | connected to the 24V input E.|
2642 | This is the default |
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 |
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 +----------------------------------------------------------------------------+
2661 INT i_APCI1710_SetIndexAndReferenceSource(struct comedi_device * dev,
2662 unsigned char b_ModulNbr, unsigned char b_SourceSelection)
2664 INT i_ReturnValue = 0;
2666 /**************************/
2667 /* Test the module number */
2668 /**************************/
2670 if (b_ModulNbr < 4) {
2671 /*******************************/
2672 /* Test if incremental counter */
2673 /*******************************/
2675 if ((devpriv->s_BoardInfos.
2676 dw_MolduleConfiguration[b_ModulNbr] &
2677 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
2678 /******************************/
2679 /* Test if firmware >= Rev1.5 */
2680 /******************************/
2682 if ((devpriv->s_BoardInfos.
2683 dw_MolduleConfiguration[b_ModulNbr] &
2684 0xFFFF) >= 0x3135) {
2685 /*****************************/
2686 /* Test the source selection */
2687 /*****************************/
2689 if (b_SourceSelection == APCI1710_SOURCE_0 ||
2690 b_SourceSelection == APCI1710_SOURCE_1)
2692 /******************************************/
2693 /* Test if invert the index and reference */
2694 /******************************************/
2696 if (b_SourceSelection ==
2697 APCI1710_SOURCE_1) {
2698 /********************************************/
2699 /* Invert index and reference source (DQ25) */
2700 /********************************************/
2705 s_SiemensCounterInfo.
2712 s_SiemensCounterInfo.
2716 APCI1710_INVERT_INDEX_RFERENCE;
2718 /****************************************/
2719 /* Set the default configuration (DQ25) */
2720 /****************************************/
2725 s_SiemensCounterInfo.
2732 s_SiemensCounterInfo.
2736 APCI1710_DEFAULT_INDEX_RFERENCE;
2738 } // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1)
2740 /*********************************/
2741 /* The source selection is wrong */
2742 /*********************************/
2744 DPRINTK("The source selection is wrong\n");
2746 } // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1)
2748 /**************************************/
2749 /* The module is not a counter module */
2750 /**************************************/
2752 DPRINTK("The module is not a counter module\n");
2756 /**************************************/
2757 /* The module is not a counter module */
2758 /**************************************/
2760 DPRINTK("The module is not a counter module\n");
2764 /***************************************/
2765 /* The selected module number is wrong */
2766 /***************************************/
2768 DPRINTK("The selected module number is wrong\n");
2772 return (i_ReturnValue);
2776 +----------------------------------------------------------------------------+
2777 | Function Name : _INT_ i_APCI1710_SetDigitalChlOn |
2778 | (unsigned char_ b_BoardHandle, |
2779 | unsigned char_ b_ModulNbr) |
2780 +----------------------------------------------------------------------------+
2781 | Task : Sets the digital output H Setting an output means |
2782 | setting an ouput high. |
2783 +----------------------------------------------------------------------------+
2784 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2785 | unsigned char_ b_ModulNbr : Number of the module to be |
2786 | configured (0 to 3) |
2787 +----------------------------------------------------------------------------+
2788 | Output Parameters : - |
2789 +----------------------------------------------------------------------------+
2790 | Return Value : 0: No error |
2791 | -1: The handle parameter of the board is wrong |
2792 | -2: The selected module number is wrong |
2793 | -3: Counter not initialised see function |
2794 | "i_APCI1710_InitCounter" |
2795 +----------------------------------------------------------------------------+
2798 INT i_APCI1710_SetDigitalChlOn(struct comedi_device * dev, unsigned char b_ModulNbr)
2800 INT i_ReturnValue = 0;
2802 /**************************/
2803 /* Test the module number */
2804 /**************************/
2806 if (b_ModulNbr < 4) {
2807 /*******************************/
2808 /* Test if counter initialised */
2809 /*******************************/
2812 s_ModuleInfo[b_ModulNbr].
2813 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2815 s_ModuleInfo[b_ModulNbr].
2816 s_SiemensCounterInfo.
2819 b_ModeRegister3 = devpriv->
2820 s_ModuleInfo[b_ModulNbr].
2821 s_SiemensCounterInfo.
2823 s_ByteModeRegister.b_ModeRegister3 | 0x10;
2825 /*********************/
2826 /* Set the output On */
2827 /*********************/
2829 outl(devpriv->s_ModuleInfo[b_ModulNbr].
2830 s_SiemensCounterInfo.
2832 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
2833 ui_Address + 20 + (64 * b_ModulNbr));
2835 /****************************************/
2836 /* Counter not initialised see function */
2837 /* "i_APCI1710_InitCounter" */
2838 /****************************************/
2840 DPRINTK("Counter not initialised\n");
2844 /*************************************************/
2845 /* The selected module number parameter is wrong */
2846 /*************************************************/
2848 DPRINTK("The selected module number parameter is wrong\n");
2852 return (i_ReturnValue);
2856 +----------------------------------------------------------------------------+
2857 | Function Name : _INT_ i_APCI1710_SetDigitalChlOff |
2858 | (unsigned char_ b_BoardHandle, |
2859 | unsigned char_ b_ModulNbr) |
2860 +----------------------------------------------------------------------------+
2861 | Task : Resets the digital output H. Resetting an output means |
2862 | setting an ouput low. |
2863 +----------------------------------------------------------------------------+
2864 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
2865 | unsigned char_ b_ModulNbr : Number of the module to be |
2866 | configured (0 to 3) |
2867 +----------------------------------------------------------------------------+
2868 | Output Parameters : - |
2869 +----------------------------------------------------------------------------+
2870 | Return Value : 0: No error |
2871 | -1: The handle parameter of the board is wrong |
2872 | -2: The selected module number is wrong |
2873 | -3: Counter not initialised see function |
2874 | "i_APCI1710_InitCounter" |
2875 +----------------------------------------------------------------------------+
2878 INT i_APCI1710_SetDigitalChlOff(struct comedi_device * dev, unsigned char b_ModulNbr)
2880 INT i_ReturnValue = 0;
2882 /**************************/
2883 /* Test the module number */
2884 /**************************/
2886 if (b_ModulNbr < 4) {
2887 /*******************************/
2888 /* Test if counter initialised */
2889 /*******************************/
2892 s_ModuleInfo[b_ModulNbr].
2893 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
2895 s_ModuleInfo[b_ModulNbr].
2896 s_SiemensCounterInfo.
2899 b_ModeRegister3 = devpriv->
2900 s_ModuleInfo[b_ModulNbr].
2901 s_SiemensCounterInfo.
2903 s_ByteModeRegister.b_ModeRegister3 & 0xEF;
2905 /**********************/
2906 /* Set the output Off */
2907 /**********************/
2909 outl(devpriv->s_ModuleInfo[b_ModulNbr].
2910 s_SiemensCounterInfo.
2912 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
2913 ui_Address + 20 + (64 * b_ModulNbr));
2915 /****************************************/
2916 /* Counter not initialised see function */
2917 /* "i_APCI1710_InitCounter" */
2918 /****************************************/
2920 DPRINTK("Counter not initialised\n");
2924 /*************************************************/
2925 /* The selected module number parameter is wrong */
2926 /*************************************************/
2928 DPRINTK("The selected module number parameter is wrong\n");
2932 return (i_ReturnValue);
2935 /*########################################################################### */
2938 /*########################################################################### */
2941 +----------------------------------------------------------------------------+
2942 | Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
2943 struct comedi_insn *insn,unsigned int *data) |
2944 +----------------------------------------------------------------------------+
2945 | Task : Enable Disable functions for INC_CPT |
2946 +----------------------------------------------------------------------------+
2947 | Input Parameters :
2948 +----------------------------------------------------------------------------+
2949 | Output Parameters : - |
2950 +----------------------------------------------------------------------------+
2952 +----------------------------------------------------------------------------+
2954 INT i_APCI1710_InsnWriteINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
2955 struct comedi_insn * insn, unsigned int * data)
2958 INT i_ReturnValue = 0;
2960 ui_WriteType = CR_CHAN(insn->chanspec);
2961 devpriv->tsk_Current = current; // Save the current process task structure
2963 switch (ui_WriteType) {
2964 case APCI1710_INCCPT_ENABLELATCHINTERRUPT:
2965 i_ReturnValue = i_APCI1710_EnableLatchInterrupt(dev,
2966 (unsigned char) CR_AREF(insn->chanspec));
2969 case APCI1710_INCCPT_DISABLELATCHINTERRUPT:
2970 i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev,
2971 (unsigned char) CR_AREF(insn->chanspec));
2974 case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE:
2975 i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev,
2976 (unsigned char) CR_AREF(insn->chanspec),
2977 (unsigned char) data[0], (UINT) data[1]);
2980 case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE:
2981 i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev,
2982 (unsigned char) CR_AREF(insn->chanspec), (ULONG) data[0]);
2986 case APCI1710_INCCPT_ENABLEINDEX:
2987 i_APCI1710_EnableIndex(dev, (unsigned char) CR_AREF(insn->chanspec));
2990 case APCI1710_INCCPT_DISABLEINDEX:
2991 i_ReturnValue = i_APCI1710_DisableIndex(dev,
2992 (unsigned char) CR_AREF(insn->chanspec));
2995 case APCI1710_INCCPT_ENABLECOMPARELOGIC:
2996 i_ReturnValue = i_APCI1710_EnableCompareLogic(dev,
2997 (unsigned char) CR_AREF(insn->chanspec));
3000 case APCI1710_INCCPT_DISABLECOMPARELOGIC:
3001 i_ReturnValue = i_APCI1710_DisableCompareLogic(dev,
3002 (unsigned char) CR_AREF(insn->chanspec));
3005 case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT:
3006 i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev,
3007 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
3010 case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT:
3011 i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev,
3012 (unsigned char) CR_AREF(insn->chanspec));
3016 printk("Write Config Parameter Wrong\n");
3019 if (i_ReturnValue >= 0)
3020 i_ReturnValue = insn->n;
3021 return (i_ReturnValue);
3025 +----------------------------------------------------------------------------+
3026 | Function Name : _INT_ i_APCI1710_EnableLatchInterrupt |
3027 | (unsigned char_ b_BoardHandle, |
3028 | unsigned char_ b_ModulNbr) |
3029 +----------------------------------------------------------------------------+
3030 | Task : Enable the latch interrupt from selected module |
3031 | (b_ModulNbr). Each software or hardware latch occur a |
3033 +----------------------------------------------------------------------------+
3034 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3035 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
3050 INT i_APCI1710_EnableLatchInterrupt(struct comedi_device * dev, unsigned char b_ModulNbr)
3052 INT i_ReturnValue = 0;
3054 /**************************/
3055 /* Test the module number */
3056 /**************************/
3058 if (b_ModulNbr < 4) {
3059 /*******************************/
3060 /* Test if counter initialised */
3061 /*******************************/
3063 if (devpriv->s_ModuleInfo[b_ModulNbr].
3064 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3066 /********************/
3067 /* Enable interrupt */
3068 /********************/
3070 devpriv->s_ModuleInfo[b_ModulNbr].
3071 s_SiemensCounterInfo.
3074 b_ModeRegister2 = devpriv->
3075 s_ModuleInfo[b_ModulNbr].
3076 s_SiemensCounterInfo.
3079 b_ModeRegister2 | APCI1710_ENABLE_LATCH_INT;
3081 /***************************/
3082 /* Write the configuration */
3083 /***************************/
3085 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3086 s_SiemensCounterInfo.
3088 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
3089 ui_Address + 20 + (64 * b_ModulNbr));
3091 /****************************************/
3092 /* Counter not initialised see function */
3093 /* "i_APCI1710_InitCounter" */
3094 /****************************************/
3096 DPRINTK("Counter not initialised\n");
3100 /*************************************************/
3101 /* The selected module number parameter is wrong */
3102 /*************************************************/
3104 DPRINTK("The selected module number parameter is wrong\n");
3108 return (i_ReturnValue);
3112 +----------------------------------------------------------------------------+
3113 | Function Name : _INT_ i_APCI1710_DisableLatchInterrupt |
3114 | (unsigned char_ b_BoardHandle, |
3115 | unsigned char_ b_ModulNbr) |
3116 +----------------------------------------------------------------------------+
3117 | Task : Disable the latch interrupt from selected module |
3119 +----------------------------------------------------------------------------+
3120 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3121 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
3136 INT i_APCI1710_DisableLatchInterrupt(struct comedi_device * dev, unsigned char b_ModulNbr)
3138 INT i_ReturnValue = 0;
3140 /**************************/
3141 /* Test the module number */
3142 /**************************/
3144 if (b_ModulNbr < 4) {
3145 /*******************************/
3146 /* Test if counter initialised */
3147 /*******************************/
3150 s_ModuleInfo[b_ModulNbr].
3151 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3153 /***************************/
3154 /* Write the configuration */
3155 /***************************/
3157 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3158 s_SiemensCounterInfo.
3160 dw_ModeRegister1_2_3_4 &
3161 ((APCI1710_DISABLE_LATCH_INT << 8) | 0xFF),
3162 devpriv->s_BoardInfos.ui_Address + 20 +
3167 /*********************/
3168 /* Disable interrupt */
3169 /*********************/
3172 s_ModuleInfo[b_ModulNbr].
3173 s_SiemensCounterInfo.
3176 b_ModeRegister2 = devpriv->
3177 s_ModuleInfo[b_ModulNbr].
3178 s_SiemensCounterInfo.
3181 b_ModeRegister2 & APCI1710_DISABLE_LATCH_INT;
3184 /****************************************/
3185 /* Counter not initialised see function */
3186 /* "i_APCI1710_InitCounter" */
3187 /****************************************/
3189 DPRINTK("Counter not initialised\n");
3193 /*************************************************/
3194 /* The selected module number parameter is wrong */
3195 /*************************************************/
3197 DPRINTK("The selected module number parameter is wrong\n");
3201 return (i_ReturnValue);
3205 +----------------------------------------------------------------------------+
3206 | Function Name : _INT_ i_APCI1710_Write16BitCounterValue |
3207 | (unsigned char_ b_BoardHandle |
3208 | unsigned char_ b_ModulNbr, |
3209 | unsigned char_ 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|
3215 +----------------------------------------------------------------------------+
3216 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3217 | unsigned char_ b_ModulNbr : Module number to configure |
3219 | unsigned char_ b_SelectedCounter : Selected 16-Bit counter |
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 +----------------------------------------------------------------------------+
3234 INT i_APCI1710_Write16BitCounterValue(struct comedi_device * dev,
3235 unsigned char b_ModulNbr, unsigned char b_SelectedCounter, UINT ui_WriteValue)
3237 INT i_ReturnValue = 0;
3239 /**************************/
3240 /* Test the module number */
3241 /**************************/
3243 if (b_ModulNbr < 4) {
3244 /*******************************/
3245 /* Test if counter initialised */
3246 /*******************************/
3249 s_ModuleInfo[b_ModulNbr].
3250 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3251 /******************************/
3252 /* Test the counter selection */
3253 /******************************/
3255 if (b_SelectedCounter < 2) {
3256 /*******************/
3257 /* Write the value */
3258 /*******************/
3260 outl((ULONG) ((ULONG) (ui_WriteValue) << (16 *
3261 b_SelectedCounter)),
3262 devpriv->s_BoardInfos.ui_Address + 8 +
3263 (b_SelectedCounter * 4) +
3266 /**************************************************/
3267 /* The selected 16-Bit counter parameter is wrong */
3268 /**************************************************/
3270 DPRINTK("The selected 16-Bit counter parameter is wrong\n");
3274 /****************************************/
3275 /* Counter not initialised see function */
3276 /* "i_APCI1710_InitCounter" */
3277 /****************************************/
3279 DPRINTK("Counter not initialised\n");
3283 /*************************************************/
3284 /* The selected module number parameter is wrong */
3285 /*************************************************/
3287 DPRINTK("The selected module number parameter is wrong\n");
3291 return (i_ReturnValue);
3295 +----------------------------------------------------------------------------+
3296 | Function Name : _INT_ i_APCI1710_Write32BitCounterValue |
3297 | (unsigned char_ b_BoardHandle |
3298 | unsigned char_ b_ModulNbr, |
3299 | ULONG_ ul_WriteValue) |
3300 +----------------------------------------------------------------------------+
3301 | Task : Write a 32-Bit value (ui_WriteValue) in to the selected|
3302 | module (b_ModulNbr). |
3303 +----------------------------------------------------------------------------+
3304 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3305 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
3319 INT i_APCI1710_Write32BitCounterValue(struct comedi_device * dev,
3320 unsigned char b_ModulNbr, ULONG ul_WriteValue)
3322 INT i_ReturnValue = 0;
3324 /**************************/
3325 /* Test the module number */
3326 /**************************/
3328 if (b_ModulNbr < 4) {
3329 /*******************************/
3330 /* Test if counter initialised */
3331 /*******************************/
3334 s_ModuleInfo[b_ModulNbr].
3335 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3336 /*******************/
3337 /* Write the value */
3338 /*******************/
3340 outl(ul_WriteValue, devpriv->s_BoardInfos.
3341 ui_Address + 4 + (64 * b_ModulNbr));
3343 /****************************************/
3344 /* Counter not initialised see function */
3345 /* "i_APCI1710_InitCounter" */
3346 /****************************************/
3348 DPRINTK("Counter not initialised\n");
3352 /*************************************************/
3353 /* The selected module number parameter is wrong */
3354 /*************************************************/
3356 DPRINTK("The selected module number parameter is wrong\n");
3360 return (i_ReturnValue);
3364 +----------------------------------------------------------------------------+
3365 | Function Name : _INT_ i_APCI1710_EnableIndex (unsigned char_ b_BoardHandle, |
3366 | unsigned char_ b_ModulNbr) |
3367 +----------------------------------------------------------------------------+
3368 | Task : Enable the INDEX actions |
3369 +----------------------------------------------------------------------------+
3370 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3371 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
3386 INT i_APCI1710_EnableIndex(struct comedi_device * dev, unsigned char b_ModulNbr)
3388 INT i_ReturnValue = 0;
3389 ULONG ul_InterruptLatchReg;
3391 /**************************/
3392 /* Test the module number */
3393 /**************************/
3395 if (b_ModulNbr < 4) {
3396 /*******************************/
3397 /* Test if counter initialised */
3398 /*******************************/
3401 s_ModuleInfo[b_ModulNbr].
3402 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3403 /*****************************/
3404 /* Test if index initialised */
3405 /*****************************/
3408 s_ModuleInfo[b_ModulNbr].
3409 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
3411 s_ModuleInfo[b_ModulNbr].
3412 s_SiemensCounterInfo.
3415 b_ModeRegister2 = devpriv->
3416 s_ModuleInfo[b_ModulNbr].
3417 s_SiemensCounterInfo.
3420 b_ModeRegister2 | APCI1710_ENABLE_INDEX;
3422 ul_InterruptLatchReg =
3423 inl(devpriv->s_BoardInfos.ui_Address +
3424 24 + (64 * b_ModulNbr));
3426 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3427 s_SiemensCounterInfo.
3429 dw_ModeRegister1_2_3_4,
3430 devpriv->s_BoardInfos.ui_Address + 20 +
3433 /*************************************************************/
3434 /* Index not initialised see function "i_APCI1710_InitIndex" */
3435 /*************************************************************/
3437 DPRINTK("Index not initialised \n");
3441 /****************************************/
3442 /* Counter not initialised see function */
3443 /* "i_APCI1710_InitCounter" */
3444 /****************************************/
3446 DPRINTK("Counter not initialised\n");
3450 /*************************************************/
3451 /* The selected module number parameter is wrong */
3452 /*************************************************/
3454 DPRINTK("The selected module number parameter is wrong\n");
3458 return (i_ReturnValue);
3462 +----------------------------------------------------------------------------+
3463 | Function Name : _INT_ i_APCI1710_DisableIndex (unsigned char_ b_BoardHandle, |
3464 | unsigned char_ b_ModulNbr) |
3465 +----------------------------------------------------------------------------+
3466 | Task : Disable the INDEX actions |
3467 +----------------------------------------------------------------------------+
3468 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3469 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
3484 INT i_APCI1710_DisableIndex(struct comedi_device * dev, unsigned char b_ModulNbr)
3486 INT i_ReturnValue = 0;
3488 /**************************/
3489 /* Test the module number */
3490 /**************************/
3492 if (b_ModulNbr < 4) {
3493 /*******************************/
3494 /* Test if counter initialised */
3495 /*******************************/
3498 s_ModuleInfo[b_ModulNbr].
3499 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3500 /*****************************/
3501 /* Test if index initialised */
3502 /*****************************/
3505 s_ModuleInfo[b_ModulNbr].
3506 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
3508 s_ModuleInfo[b_ModulNbr].
3509 s_SiemensCounterInfo.
3512 b_ModeRegister2 = devpriv->
3513 s_ModuleInfo[b_ModulNbr].
3514 s_SiemensCounterInfo.
3518 APCI1710_DISABLE_INDEX;
3520 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3521 s_SiemensCounterInfo.
3523 dw_ModeRegister1_2_3_4,
3524 devpriv->s_BoardInfos.ui_Address + 20 +
3527 /*************************************************************/
3528 /* Index not initialised see function "i_APCI1710_InitIndex" */
3529 /*************************************************************/
3531 DPRINTK("Index not initialised \n");
3535 /****************************************/
3536 /* Counter not initialised see function */
3537 /* "i_APCI1710_InitCounter" */
3538 /****************************************/
3540 DPRINTK("Counter not initialised\n");
3544 /*************************************************/
3545 /* The selected module number parameter is wrong */
3546 /*************************************************/
3548 DPRINTK("The selected module number parameter is wrong\n");
3552 return (i_ReturnValue);
3556 +----------------------------------------------------------------------------+
3557 | Function Name : _INT_ i_APCI1710_EnableCompareLogic |
3558 | (unsigned char_ b_BoardHandle, |
3559 | unsigned char_ b_ModulNbr) |
3560 +----------------------------------------------------------------------------+
3561 | Task : Enable the 32-Bit compare logic. At that moment that |
3562 | the incremental counter arrive to the compare value a |
3563 | interrupt is generated. |
3564 +----------------------------------------------------------------------------+
3565 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3566 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
3583 INT i_APCI1710_EnableCompareLogic(struct comedi_device * dev, unsigned char b_ModulNbr)
3585 INT i_ReturnValue = 0;
3587 /**************************/
3588 /* Test the module number */
3589 /**************************/
3591 if (b_ModulNbr < 4) {
3592 /*******************************/
3593 /* Test if counter initialised */
3594 /*******************************/
3597 s_ModuleInfo[b_ModulNbr].
3598 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3599 /*************************************/
3600 /* Test if compare logic initialised */
3601 /*************************************/
3604 s_ModuleInfo[b_ModulNbr].
3605 s_SiemensCounterInfo.
3606 s_InitFlag.b_CompareLogicInit == 1) {
3608 s_ModuleInfo[b_ModulNbr].
3609 s_SiemensCounterInfo.
3612 b_ModeRegister3 = devpriv->
3613 s_ModuleInfo[b_ModulNbr].
3614 s_SiemensCounterInfo.
3618 APCI1710_ENABLE_COMPARE_INT;
3620 /***************************/
3621 /* Write the configuration */
3622 /***************************/
3624 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3625 s_SiemensCounterInfo.
3627 dw_ModeRegister1_2_3_4,
3628 devpriv->s_BoardInfos.ui_Address + 20 +
3631 /*********************************/
3632 /* Compare logic not initialised */
3633 /*********************************/
3635 DPRINTK("Compare logic not initialised\n");
3639 /****************************************/
3640 /* Counter not initialised see function */
3641 /* "i_APCI1710_InitCounter" */
3642 /****************************************/
3644 DPRINTK("Counter not initialised\n");
3648 /*************************************************/
3649 /* The selected module number parameter is wrong */
3650 /*************************************************/
3652 DPRINTK("The selected module number parameter is wrong\n");
3656 return (i_ReturnValue);
3660 +----------------------------------------------------------------------------+
3661 | Function Name : _INT_ i_APCI1710_DisableCompareLogic |
3662 | (unsigned char_ b_BoardHandle, |
3663 | unsigned char_ b_ModulNbr) |
3664 +----------------------------------------------------------------------------+
3665 | Task : Disable the 32-Bit compare logic.
3666 +----------------------------------------------------------------------------+
3667 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3668 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
3683 INT i_APCI1710_DisableCompareLogic(struct comedi_device * dev, unsigned char b_ModulNbr)
3685 INT i_ReturnValue = 0;
3687 /**************************/
3688 /* Test the module number */
3689 /**************************/
3691 if (b_ModulNbr < 4) {
3692 /*******************************/
3693 /* Test if counter initialised */
3694 /*******************************/
3697 s_ModuleInfo[b_ModulNbr].
3698 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3699 /*************************************/
3700 /* Test if compare logic initialised */
3701 /*************************************/
3704 s_ModuleInfo[b_ModulNbr].
3705 s_SiemensCounterInfo.
3706 s_InitFlag.b_CompareLogicInit == 1) {
3708 s_ModuleInfo[b_ModulNbr].
3709 s_SiemensCounterInfo.
3712 b_ModeRegister3 = devpriv->
3713 s_ModuleInfo[b_ModulNbr].
3714 s_SiemensCounterInfo.
3718 APCI1710_DISABLE_COMPARE_INT;
3720 /***************************/
3721 /* Write the configuration */
3722 /***************************/
3724 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3725 s_SiemensCounterInfo.
3727 dw_ModeRegister1_2_3_4,
3728 devpriv->s_BoardInfos.ui_Address + 20 +
3731 /*********************************/
3732 /* Compare logic not initialised */
3733 /*********************************/
3735 DPRINTK("Compare logic not initialised\n");
3739 /****************************************/
3740 /* Counter not initialised see function */
3741 /* "i_APCI1710_InitCounter" */
3742 /****************************************/
3744 DPRINTK("Counter not initialised\n");
3748 /*************************************************/
3749 /* The selected module number parameter is wrong */
3750 /*************************************************/
3752 DPRINTK("The selected module number parameter is wrong\n");
3756 return (i_ReturnValue);
3760 +----------------------------------------------------------------------------+
3761 | Function Name : _INT_ i_APCI1710_EnableFrequencyMeasurement |
3762 | (unsigned char_ b_BoardHandle, |
3763 | unsigned char_ b_ModulNbr, |
3764 | unsigned char_ b_InterruptEnable) |
3765 +----------------------------------------------------------------------------+
3766 | Task : Enables the frequency measurement function |
3767 +----------------------------------------------------------------------------+
3768 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3769 | unsigned char_ b_ModulNbr : Number of the module to be |
3770 | configured (0 to 3) |
3771 | unsigned char_ b_InterruptEnable: Enable or disable the |
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 +----------------------------------------------------------------------------+
3792 INT i_APCI1710_EnableFrequencyMeasurement(struct comedi_device * dev,
3793 unsigned char b_ModulNbr, unsigned char b_InterruptEnable)
3795 INT i_ReturnValue = 0;
3797 /**************************/
3798 /* Test the module number */
3799 /**************************/
3801 if (b_ModulNbr < 4) {
3802 /*******************************/
3803 /* Test if counter initialised */
3804 /*******************************/
3807 s_ModuleInfo[b_ModulNbr].
3808 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3809 /********************************************/
3810 /* Test if frequency mesurement initialised */
3811 /********************************************/
3814 s_ModuleInfo[b_ModulNbr].
3815 s_SiemensCounterInfo.
3816 s_InitFlag.b_FrequencyMeasurementInit == 1) {
3817 /***************************/
3818 /* Test the interrupt mode */
3819 /***************************/
3821 if ((b_InterruptEnable == APCI1710_DISABLE) ||
3822 (b_InterruptEnable == APCI1710_ENABLE))
3825 /************************************/
3826 /* Enable the frequency measurement */
3827 /************************************/
3830 s_ModuleInfo[b_ModulNbr].
3831 s_SiemensCounterInfo.
3834 b_ModeRegister3 = devpriv->
3835 s_ModuleInfo[b_ModulNbr].
3836 s_SiemensCounterInfo.
3840 APCI1710_ENABLE_FREQUENCY;
3842 /*********************************************/
3843 /* Disable or enable the frequency interrupt */
3844 /*********************************************/
3847 s_ModuleInfo[b_ModulNbr].
3848 s_SiemensCounterInfo.
3851 b_ModeRegister3 = (devpriv->
3852 s_ModuleInfo[b_ModulNbr].
3853 s_SiemensCounterInfo.
3857 APCI1710_DISABLE_FREQUENCY_INT)
3858 | (b_InterruptEnable << 3);
3860 /***************************/
3861 /* Write the configuration */
3862 /***************************/
3864 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3865 s_SiemensCounterInfo.
3867 dw_ModeRegister1_2_3_4,
3868 devpriv->s_BoardInfos.
3873 s_ModuleInfo[b_ModulNbr].
3874 s_SiemensCounterInfo.
3876 b_FrequencyMeasurementEnable =
3879 /********************************/
3880 /* Interrupt parameter is wrong */
3881 /********************************/
3883 DPRINTK("Interrupt parameter is wrong\n");
3887 /***********************************************/
3888 /* Frequency measurement logic not initialised */
3889 /***********************************************/
3891 DPRINTK("Frequency measurement logic not initialised\n");
3895 /****************************************/
3896 /* Counter not initialised see function */
3897 /* "i_APCI1710_InitCounter" */
3898 /****************************************/
3900 DPRINTK("Counter not initialised\n");
3904 /*************************************************/
3905 /* The selected module number parameter is wrong */
3906 /*************************************************/
3908 DPRINTK("The selected module number parameter is wrong\n");
3912 return (i_ReturnValue);
3916 +----------------------------------------------------------------------------+
3917 | Function Name : _INT_ i_APCI1710_DisableFrequencyMeasurement |
3918 | (unsigned char_ b_BoardHandle, |
3919 | unsigned char_ b_ModulNbr) |
3920 +----------------------------------------------------------------------------+
3921 | Task : Disables the frequency measurement function |
3922 +----------------------------------------------------------------------------+
3923 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
3924 | unsigned char_ b_ModulNbr : Number of the module to be |
3925 | configured (0 to 3) |
3926 +----------------------------------------------------------------------------+
3927 | Output Parameters : - |
3928 +----------------------------------------------------------------------------+
3929 | Return Value : 0: No error |
3930 | -1: The handle parameter of the board is wrong |
3931 | -2: The selected module number is wrong |
3932 | -3: Counter not initialised see function |
3933 | "i_APCI1710_InitCounter" |
3934 | -4: Frequency measurement logic not initialised. |
3935 | See function "i_APCI1710_InitFrequencyMeasurement" |
3936 +----------------------------------------------------------------------------+
3939 INT i_APCI1710_DisableFrequencyMeasurement(struct comedi_device * dev, unsigned char b_ModulNbr)
3941 INT i_ReturnValue = 0;
3943 /**************************/
3944 /* Test the module number */
3945 /**************************/
3947 if (b_ModulNbr < 4) {
3948 /*******************************/
3949 /* Test if counter initialised */
3950 /*******************************/
3953 s_ModuleInfo[b_ModulNbr].
3954 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
3955 /********************************************/
3956 /* Test if frequency mesurement initialised */
3957 /********************************************/
3960 s_ModuleInfo[b_ModulNbr].
3961 s_SiemensCounterInfo.
3962 s_InitFlag.b_FrequencyMeasurementInit == 1) {
3963 /*************************************/
3964 /* Disable the frequency measurement */
3965 /*************************************/
3968 s_ModuleInfo[b_ModulNbr].
3969 s_SiemensCounterInfo.
3972 b_ModeRegister3 = devpriv->
3973 s_ModuleInfo[b_ModulNbr].
3974 s_SiemensCounterInfo.
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
3983 /***************************/
3984 /* Write the configuration */
3985 /***************************/
3987 outl(devpriv->s_ModuleInfo[b_ModulNbr].
3988 s_SiemensCounterInfo.
3990 dw_ModeRegister1_2_3_4,
3991 devpriv->s_BoardInfos.ui_Address + 20 +
3994 /*************************************/
3995 /* Disable the frequency measurement */
3996 /*************************************/
3999 s_ModuleInfo[b_ModulNbr].
4000 s_SiemensCounterInfo.
4002 b_FrequencyMeasurementEnable = 0;
4004 /***********************************************/
4005 /* Frequency measurement logic not initialised */
4006 /***********************************************/
4008 DPRINTK("Frequency measurement logic not initialised\n");
4012 /****************************************/
4013 /* Counter not initialised see function */
4014 /* "i_APCI1710_InitCounter" */
4015 /****************************************/
4017 DPRINTK("Counter not initialised\n");
4021 /*************************************************/
4022 /* The selected module number parameter is wrong */
4023 /*************************************************/
4025 DPRINTK("The selected module number parameter is wrong\n");
4029 return (i_ReturnValue);
4032 /*########################################################################### */
4036 /*########################################################################### */
4039 +----------------------------------------------------------------------------+
4040 | Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
4041 struct comedi_insn *insn,unsigned int *data) |
4042 +----------------------------------------------------------------------------+
4043 | Task : Read and Get functions for INC_CPT |
4044 +----------------------------------------------------------------------------+
4045 | Input Parameters :
4046 +----------------------------------------------------------------------------+
4047 | Output Parameters : - |
4048 +----------------------------------------------------------------------------+
4050 +----------------------------------------------------------------------------+
4052 INT i_APCI1710_InsnReadINCCPT(struct comedi_device * dev, struct comedi_subdevice * s,
4053 struct comedi_insn * insn, unsigned int * data)
4056 INT i_ReturnValue = 0;
4058 ui_ReadType = CR_CHAN(insn->chanspec);
4060 devpriv->tsk_Current = current; // Save the current process task structure
4061 switch (ui_ReadType) {
4062 case APCI1710_INCCPT_READLATCHREGISTERSTATUS:
4063 i_ReturnValue = i_APCI1710_ReadLatchRegisterStatus(dev,
4064 (unsigned char) CR_AREF(insn->chanspec),
4065 (unsigned char) CR_RANGE(insn->chanspec), (unsigned char *) & data[0]);
4068 case APCI1710_INCCPT_READLATCHREGISTERVALUE:
4069 i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev,
4070 (unsigned char) CR_AREF(insn->chanspec),
4071 (unsigned char) CR_RANGE(insn->chanspec), (PULONG) & data[0]);
4072 printk("Latch Register Value %d\n", data[0]);
4075 case APCI1710_INCCPT_READ16BITCOUNTERVALUE:
4076 i_ReturnValue = i_APCI1710_Read16BitCounterValue(dev,
4077 (unsigned char) CR_AREF(insn->chanspec),
4078 (unsigned char) CR_RANGE(insn->chanspec), (PUINT) & data[0]);
4081 case APCI1710_INCCPT_READ32BITCOUNTERVALUE:
4082 i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev,
4083 (unsigned char) CR_AREF(insn->chanspec), (PULONG) & data[0]);
4086 case APCI1710_INCCPT_GETINDEXSTATUS:
4087 i_ReturnValue = i_APCI1710_GetIndexStatus(dev,
4088 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
4091 case APCI1710_INCCPT_GETREFERENCESTATUS:
4092 i_ReturnValue = i_APCI1710_GetReferenceStatus(dev,
4093 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
4096 case APCI1710_INCCPT_GETUASSTATUS:
4097 i_ReturnValue = i_APCI1710_GetUASStatus(dev,
4098 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
4101 case APCI1710_INCCPT_GETCBSTATUS:
4102 i_ReturnValue = i_APCI1710_GetCBStatus(dev,
4103 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
4106 case APCI1710_INCCPT_GET16BITCBSTATUS:
4107 i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev,
4108 (unsigned char) CR_AREF(insn->chanspec),
4109 (unsigned char *) & data[0], (unsigned char *) & data[1]);
4112 case APCI1710_INCCPT_GETUDSTATUS:
4113 i_ReturnValue = i_APCI1710_GetUDStatus(dev,
4114 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
4118 case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS:
4119 i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev,
4120 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]);
4123 case APCI1710_INCCPT_READFREQUENCYMEASUREMENT:
4124 i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev,
4125 (unsigned char) CR_AREF(insn->chanspec),
4126 (unsigned char *) & data[0],
4127 (unsigned char *) & data[1], (PULONG) & data[2]);
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;
4141 /**************************/
4142 /* Increment the read FIFO */
4143 /***************************/
4146 s_InterruptParameters.
4147 ui_Read = (devpriv->s_InterruptParameters.
4148 ui_Read + 1) % APCI1710_SAVE_INTERRUPT;
4153 printk("ReadType Parameter wrong\n");
4156 if (i_ReturnValue >= 0)
4157 i_ReturnValue = insn->n;
4158 return (i_ReturnValue);
4163 +----------------------------------------------------------------------------+
4164 | Function Name : _INT_ i_APCI1710_ReadLatchRegisterStatus |
4165 | (unsigned char_ b_BoardHandle, |
4166 | unsigned char_ b_ModulNbr, |
4167 | unsigned char_ b_LatchReg, |
4168 | unsigned char *_ pb_LatchStatus) |
4169 +----------------------------------------------------------------------------+
4170 | Task : Read the latch register status from selected module |
4171 | (b_ModulNbr) and selected latch register (b_LatchReg). |
4172 +----------------------------------------------------------------------------+
4173 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4174 | unsigned char_ b_ModulNbr : Module number to configure |
4176 | unsigned char_ b_LatchReg : Selected latch register |
4177 | 0 : for the first latch register |
4178 | 1 : for the second latch register |
4179 +----------------------------------------------------------------------------+
4180 | Output Parameters : unsigned char *_ pb_LatchStatus : Latch register status. |
4181 | 0 : No latch occur |
4182 | 1 : A software latch occur |
4183 | 2 : A hardware latch occur |
4184 | 3 : A software and hardware |
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 +----------------------------------------------------------------------------+
4196 INT i_APCI1710_ReadLatchRegisterStatus(struct comedi_device * dev,
4197 unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned char * pb_LatchStatus)
4199 INT i_ReturnValue = 0;
4202 /**************************/
4203 /* Test the module number */
4204 /**************************/
4206 if (b_ModulNbr < 4) {
4207 /*******************************/
4208 /* Test if counter initialised */
4209 /*******************************/
4212 s_ModuleInfo[b_ModulNbr].
4213 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4214 /*************************************/
4215 /* Test the latch register parameter */
4216 /*************************************/
4218 if (b_LatchReg < 2) {
4219 dw_LatchReg = inl(devpriv->s_BoardInfos.
4220 ui_Address + (64 * b_ModulNbr));
4223 (unsigned char) ((dw_LatchReg >> (b_LatchReg *
4226 /**************************************************/
4227 /* The selected latch register parameter is wrong */
4228 /**************************************************/
4230 DPRINTK("The selected latch register parameter is wrong\n");
4234 /****************************************/
4235 /* Counter not initialised see function */
4236 /* "i_APCI1710_InitCounter" */
4237 /****************************************/
4239 DPRINTK("Counter not initialised\n");
4243 /*************************************************/
4244 /* The selected module number parameter is wrong */
4245 /*************************************************/
4247 DPRINTK("The selected module number parameter is wrong\n");
4251 return (i_ReturnValue);
4255 +----------------------------------------------------------------------------+
4256 | Function Name : _INT_ i_APCI1710_ReadLatchRegisterValue |
4257 | (unsigned char_ b_BoardHandle,|
4258 | unsigned char_ b_ModulNbr, |
4259 | unsigned char_ b_LatchReg, |
4260 | PULONG_ pul_LatchValue) |
4261 +----------------------------------------------------------------------------+
4262 | Task : Read the latch register value from selected module |
4263 | (b_ModulNbr) and selected latch register (b_LatchReg). |
4264 +----------------------------------------------------------------------------+
4265 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4266 | unsigned char_ b_ModulNbr : Module number to configure |
4268 | unsigned char_ b_LatchReg : Selected latch register |
4269 | 0 : for the first latch register |
4270 | 1 : for the second latch register |
4271 +----------------------------------------------------------------------------+
4272 | Output Parameters : PULONG_ pul_LatchValue : Latch register value |
4273 +----------------------------------------------------------------------------+
4274 | Return Value : 0: No error |
4275 | -1: The handle parameter of the board is wrong |
4276 | -2: No counter module found |
4277 | -3: Counter not initialised see function |
4278 | "i_APCI1710_InitCounter" |
4279 | -4: The selected latch register parameter is wrong |
4280 +----------------------------------------------------------------------------+
4283 INT i_APCI1710_ReadLatchRegisterValue(struct comedi_device * dev,
4284 unsigned char b_ModulNbr, unsigned char b_LatchReg, PULONG pul_LatchValue)
4286 INT i_ReturnValue = 0;
4288 /**************************/
4289 /* Test the module number */
4290 /**************************/
4292 if (b_ModulNbr < 4) {
4293 /*******************************/
4294 /* Test if counter initialised */
4295 /*******************************/
4298 s_ModuleInfo[b_ModulNbr].
4299 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4300 /*************************************/
4301 /* Test the latch register parameter */
4302 /*************************************/
4304 if (b_LatchReg < 2) {
4305 *pul_LatchValue = inl(devpriv->s_BoardInfos.
4306 ui_Address + ((b_LatchReg + 1) * 4) +
4310 /**************************************************/
4311 /* The selected latch register parameter is wrong */
4312 /**************************************************/
4314 DPRINTK("The selected latch register parameter is wrong\n");
4318 /****************************************/
4319 /* Counter not initialised see function */
4320 /* "i_APCI1710_InitCounter" */
4321 /****************************************/
4323 DPRINTK("Counter not initialised\n");
4327 /*************************************************/
4328 /* The selected module number parameter is wrong */
4329 /*************************************************/
4331 DPRINTK("The selected module number parameter is wrong\n");
4335 return (i_ReturnValue);
4339 +----------------------------------------------------------------------------+
4340 | Function Name : _INT_ i_APCI1710_Read16BitCounterValue |
4341 | (unsigned char_ b_BoardHandle, |
4342 | unsigned char_ b_ModulNbr, |
4343 | unsigned char_ 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 : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4351 | unsigned char_ b_ModulNbr : Module number to configure |
4353 | unsigned char_ b_SelectedCounter : Selected 16-Bit counter |
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 +----------------------------------------------------------------------------+
4367 INT i_APCI1710_Read16BitCounterValue(struct comedi_device * dev,
4368 unsigned char b_ModulNbr, unsigned char b_SelectedCounter, PUINT pui_CounterValue)
4370 INT i_ReturnValue = 0;
4371 DWORD dw_LathchValue = 0;
4373 /**************************/
4374 /* Test the module number */
4375 /**************************/
4377 if (b_ModulNbr < 4) {
4378 /*******************************/
4379 /* Test if counter initialised */
4380 /*******************************/
4383 s_ModuleInfo[b_ModulNbr].
4384 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4385 /******************************/
4386 /* Test the counter selection */
4387 /******************************/
4389 if (b_SelectedCounter < 2) {
4390 /*********************/
4391 /* Latch the counter */
4392 /*********************/
4394 outl(1, devpriv->s_BoardInfos.
4395 ui_Address + (64 * b_ModulNbr));
4397 /************************/
4398 /* Read the latch value */
4399 /************************/
4401 dw_LathchValue = inl(devpriv->s_BoardInfos.
4402 ui_Address + 4 + (64 * b_ModulNbr));
4405 (UINT) ((dw_LathchValue >> (16 *
4406 b_SelectedCounter)) &
4409 /**************************************************/
4410 /* The selected 16-Bit counter parameter is wrong */
4411 /**************************************************/
4413 DPRINTK("The selected 16-Bit counter parameter is wrong\n");
4417 /****************************************/
4418 /* Counter not initialised see function */
4419 /* "i_APCI1710_InitCounter" */
4420 /****************************************/
4422 DPRINTK("Counter not initialised\n");
4426 /*************************************************/
4427 /* The selected module number parameter is wrong */
4428 /*************************************************/
4430 DPRINTK("The selected module number parameter is wrong\n");
4434 return (i_ReturnValue);
4438 +----------------------------------------------------------------------------+
4439 | Function Name : _INT_ i_APCI1710_Read32BitCounterValue |
4440 | (unsigned char_ b_BoardHandle, |
4441 | unsigned char_ b_ModulNbr, |
4442 | PULONG_ pul_CounterValue) |
4443 +----------------------------------------------------------------------------+
4444 | Task : Latch the 32-Bit counter from selected module |
4445 | (b_ModulNbr) in to the first latch register and return |
4446 | the latched value. |
4447 +----------------------------------------------------------------------------+
4448 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4449 | unsigned char_ b_ModulNbr : Module number to configure |
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 +----------------------------------------------------------------------------+
4462 INT i_APCI1710_Read32BitCounterValue(struct comedi_device * dev,
4463 unsigned char b_ModulNbr, PULONG pul_CounterValue)
4465 INT i_ReturnValue = 0;
4467 /**************************/
4468 /* Test the module number */
4469 /**************************/
4471 if (b_ModulNbr < 4) {
4472 /*******************************/
4473 /* Test if counter initialised */
4474 /*******************************/
4477 s_ModuleInfo[b_ModulNbr].
4478 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4479 /*********************/
4480 /* Tatch the counter */
4481 /*********************/
4483 outl(1, devpriv->s_BoardInfos.
4484 ui_Address + (64 * b_ModulNbr));
4486 /************************/
4487 /* Read the latch value */
4488 /************************/
4490 *pul_CounterValue = inl(devpriv->s_BoardInfos.
4491 ui_Address + 4 + (64 * b_ModulNbr));
4493 /****************************************/
4494 /* Counter not initialised see function */
4495 /* "i_APCI1710_InitCounter" */
4496 /****************************************/
4498 DPRINTK("Counter not initialised\n");
4502 /*************************************************/
4503 /* The selected module number parameter is wrong */
4504 /*************************************************/
4506 DPRINTK("The selected module number parameter is wrong\n");
4510 return (i_ReturnValue);
4514 +----------------------------------------------------------------------------+
4515 | Function Name : _INT_ i_APCI1710_GetIndexStatus (unsigned char_ b_BoardHandle,|
4516 | unsigned char_ b_ModulNbr, |
4517 | unsigned char *_ pb_IndexStatus)|
4518 +----------------------------------------------------------------------------+
4519 | Task : Return the index status |
4520 +----------------------------------------------------------------------------+
4521 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4522 | unsigned char_ b_ModulNbr : Module number to configure |
4524 +----------------------------------------------------------------------------+
4525 | Output Parameters : unsigned char *_ pb_IndexStatus : 0 : No INDEX occur |
4526 | 1 : A INDEX occur |
4527 +----------------------------------------------------------------------------+
4528 | Return Value : 0: No error |
4529 | -1: The handle parameter of the board is wrong |
4530 | -2: No counter module found |
4531 | -3: Counter not initialised see function |
4532 | "i_APCI1710_InitCounter" |
4533 | -4: Index not initialised see function |
4534 | "i_APCI1710_InitIndex" |
4535 +----------------------------------------------------------------------------+
4538 INT i_APCI1710_GetIndexStatus(struct comedi_device * dev,
4539 unsigned char b_ModulNbr, unsigned char * pb_IndexStatus)
4541 INT i_ReturnValue = 0;
4542 DWORD dw_StatusReg = 0;
4544 /**************************/
4545 /* Test the module number */
4546 /**************************/
4548 if (b_ModulNbr < 4) {
4549 /*******************************/
4550 /* Test if counter initialised */
4551 /*******************************/
4554 s_ModuleInfo[b_ModulNbr].
4555 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4556 /*****************************/
4557 /* Test if index initialised */
4558 /*****************************/
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));
4566 *pb_IndexStatus = (unsigned char) (dw_StatusReg & 1);
4568 /*************************************************************/
4569 /* Index not initialised see function "i_APCI1710_InitIndex" */
4570 /*************************************************************/
4572 DPRINTK("Index not initialised\n");
4576 /****************************************/
4577 /* Counter not initialised see function */
4578 /* "i_APCI1710_InitCounter" */
4579 /****************************************/
4581 DPRINTK("Counter not initialised\n");
4585 /*************************************************/
4586 /* The selected module number parameter is wrong */
4587 /*************************************************/
4589 DPRINTK("The selected module number parameter is wrong\n");
4593 return (i_ReturnValue);
4597 +----------------------------------------------------------------------------+
4598 | Function Name : _INT_ i_APCI1710_GetReferenceStatus |
4599 | (unsigned char_ b_BoardHandle, |
4600 | unsigned char_ b_ModulNbr, |
4601 | unsigned char *_ pb_ReferenceStatus) |
4602 +----------------------------------------------------------------------------+
4603 | Task : Return the reference status |
4604 +----------------------------------------------------------------------------+
4605 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4606 | unsigned char_ b_ModulNbr : Module number to configure |
4608 +----------------------------------------------------------------------------+
4609 | Output Parameters : unsigned char *_ pb_ReferenceStatus : 0 : No REFERENCE occur |
4610 | 1 : A REFERENCE occur |
4611 +----------------------------------------------------------------------------+
4612 | Return Value : 0: No error |
4613 | -1: The handle parameter of the board is wrong |
4614 | -2: No counter module found |
4615 | -3: Counter not initialised see function |
4616 | "i_APCI1710_InitCounter" |
4617 | -4: Reference not initialised see function |
4618 | "i_APCI1710_InitReference" |
4619 +----------------------------------------------------------------------------+
4622 INT i_APCI1710_GetReferenceStatus(struct comedi_device * dev,
4623 unsigned char b_ModulNbr, unsigned char * pb_ReferenceStatus)
4625 INT i_ReturnValue = 0;
4626 DWORD dw_StatusReg = 0;
4628 /**************************/
4629 /* Test the module number */
4630 /**************************/
4632 if (b_ModulNbr < 4) {
4633 /*******************************/
4634 /* Test if counter initialised */
4635 /*******************************/
4638 s_ModuleInfo[b_ModulNbr].
4639 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4640 /*********************************/
4641 /* Test if reference initialised */
4642 /*********************************/
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));
4651 *pb_ReferenceStatus =
4652 (unsigned char) (~dw_StatusReg & 1);
4654 /*********************************************************************/
4655 /* Reference not initialised see function "i_APCI1710_InitReference" */
4656 /*********************************************************************/
4658 DPRINTK("Reference not initialised\n");
4662 /****************************************/
4663 /* Counter not initialised see function */
4664 /* "i_APCI1710_InitCounter" */
4665 /****************************************/
4667 DPRINTK("Counter not initialised\n");
4671 /*************************************************/
4672 /* The selected module number parameter is wrong */
4673 /*************************************************/
4675 DPRINTK("The selected module number parameter is wrong\n");
4679 return (i_ReturnValue);
4683 +----------------------------------------------------------------------------+
4684 | Function Name : _INT_ i_APCI1710_GetUASStatus |
4685 | (unsigned char_ b_BoardHandle, |
4686 | unsigned char_ b_ModulNbr, |
4687 | unsigned char *_ pb_UASStatus) |
4688 +----------------------------------------------------------------------------+
4689 | Task : Return the error signal (UAS) status |
4690 +----------------------------------------------------------------------------+
4691 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4692 | unsigned char_ b_ModulNbr : Module number to configure |
4694 +----------------------------------------------------------------------------+
4695 | Output Parameters : unsigned char *_ pb_UASStatus : 0 : UAS is low "0" |
4696 | 1 : UAS is high "1" |
4697 +----------------------------------------------------------------------------+
4698 | Return Value : 0: No error |
4699 | -1: The handle parameter of the board is wrong |
4700 | -2: No counter module found |
4701 | -3: Counter not initialised see function |
4702 | "i_APCI1710_InitCounter" |
4703 +----------------------------------------------------------------------------+
4706 INT i_APCI1710_GetUASStatus(struct comedi_device * dev,
4707 unsigned char b_ModulNbr, unsigned char * pb_UASStatus)
4709 INT i_ReturnValue = 0;
4710 DWORD dw_StatusReg = 0;
4712 /**************************/
4713 /* Test the module number */
4714 /**************************/
4716 if (b_ModulNbr < 4) {
4717 /*******************************/
4718 /* Test if counter initialised */
4719 /*******************************/
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));
4727 *pb_UASStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
4729 /****************************************/
4730 /* Counter not initialised see function */
4731 /* "i_APCI1710_InitCounter" */
4732 /****************************************/
4734 DPRINTK("Counter not initialised\n");
4738 /*************************************************/
4739 /* The selected module number parameter is wrong */
4740 /*************************************************/
4742 DPRINTK("The selected module number parameter is wrong\n");
4747 return (i_ReturnValue);
4751 +----------------------------------------------------------------------------+
4752 | Function Name : _INT_ i_APCI1710_GetCBStatus |
4753 | (unsigned char_ b_BoardHandle, |
4754 | unsigned char_ b_ModulNbr, |
4755 | unsigned char *_ pb_CBStatus) |
4756 +----------------------------------------------------------------------------+
4757 | Task : Return the counter overflow status |
4758 +----------------------------------------------------------------------------+
4759 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4760 | unsigned char_ b_ModulNbr : Module number to configure |
4762 +----------------------------------------------------------------------------+
4763 | Output Parameters : unsigned char *_ pb_CBStatus : 0 : Counter no overflow |
4764 | 1 : Counter overflow |
4765 +----------------------------------------------------------------------------+
4766 | Return Value : 0: No error |
4767 | -1: The handle parameter of the board is wrong |
4768 | -2: No counter module found |
4769 | -3: Counter not initialised see function |
4770 | "i_APCI1710_InitCounter" |
4771 +----------------------------------------------------------------------------+
4774 INT i_APCI1710_GetCBStatus(struct comedi_device * dev,
4775 unsigned char b_ModulNbr, unsigned char * pb_CBStatus)
4777 INT i_ReturnValue = 0;
4778 DWORD dw_StatusReg = 0;
4780 /**************************/
4781 /* Test the module number */
4782 /**************************/
4784 if (b_ModulNbr < 4) {
4785 /*******************************/
4786 /* Test if counter initialised */
4787 /*******************************/
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));
4795 *pb_CBStatus = (unsigned char) (dw_StatusReg & 1);
4798 /****************************************/
4799 /* Counter not initialised see function */
4800 /* "i_APCI1710_InitCounter" */
4801 /****************************************/
4803 DPRINTK("Counter not initialised\n");
4807 /*************************************************/
4808 /* The selected module number parameter is wrong */
4809 /*************************************************/
4811 DPRINTK("The selected module number parameter is wrong\n");
4815 return (i_ReturnValue);
4819 +----------------------------------------------------------------------------+
4820 | Function Name : _INT_ i_APCI1710_Get16BitCBStatus |
4821 | (unsigned char_ b_BoardHandle, |
4822 | unsigned char_ b_ModulNbr, |
4823 | unsigned char *_ pb_CBStatusCounter0, |
4824 | unsigned char *_ pb_CBStatusCounter1) |
4825 +----------------------------------------------------------------------------+
4826 | Task : Returns the counter overflow (counter initialised to |
4827 | 2*16-bit) status from selected incremental counter |
4829 +----------------------------------------------------------------------------+
4830 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4831 | unsigned char_ b_ModulNbr : Module number to configure |
4833 +----------------------------------------------------------------------------+
4834 | Output Parameters : unsigned char *_ pb_CBStatusCounter0 : 0 : No overflow occur for |
4835 | the first 16-bit |
4837 | 1 : Overflow occur for the|
4838 | first 16-bit counter |
4839 | unsigned char *_ pb_CBStatusCounter1 : 0 : No overflow occur for |
4840 | the second 16-bit |
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 +----------------------------------------------------------------------------+
4856 INT i_APCI1710_Get16BitCBStatus(struct comedi_device * dev,
4857 unsigned char b_ModulNbr, unsigned char * pb_CBStatusCounter0, unsigned char * pb_CBStatusCounter1)
4859 INT i_ReturnValue = 0;
4860 DWORD dw_StatusReg = 0;
4862 /**************************/
4863 /* Test the module number */
4864 /**************************/
4866 if (b_ModulNbr < 4) {
4867 /*******************************/
4868 /* Test if counter initialised */
4869 /*******************************/
4872 s_ModuleInfo[b_ModulNbr].
4873 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
4874 /*************************/
4875 /* Test if 2*16-Bit mode */
4876 /*************************/
4878 if ((devpriv->s_ModuleInfo[b_ModulNbr].
4879 s_SiemensCounterInfo.
4882 b_ModeRegister1 & 0x10) == 0x10) {
4883 /*****************************/
4884 /* Test the Firmware version */
4885 /*****************************/
4887 if ((devpriv->s_BoardInfos.
4888 dw_MolduleConfiguration
4889 [b_ModulNbr] & 0xFFFF) >=
4892 inl(devpriv->s_BoardInfos.
4896 *pb_CBStatusCounter1 =
4897 (unsigned char) ((dw_StatusReg >> 0) &
4899 *pb_CBStatusCounter0 =
4900 (unsigned char) ((dw_StatusReg >> 1) &
4902 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136)
4904 /****************************/
4905 /* Firmware revision error */
4906 /****************************/
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)
4912 /********************************************/
4913 /* Counter not initialised to 2*16-bit mode */
4914 /* "i_APCI1710_InitCounter" */
4915 /********************************************/
4917 DPRINTK("Counter not initialised\n");
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)
4922 /****************************************/
4923 /* Counter not initialised see function */
4924 /* "i_APCI1710_InitCounter" */
4925 /****************************************/
4927 DPRINTK("Counter not initialised\n");
4929 } // if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1)
4930 } // if (b_ModulNbr < 4)
4932 /*************************************************/
4933 /* The selected module number parameter is wrong */
4934 /*************************************************/
4936 DPRINTK("The selected module number parameter is wrong\n");
4938 } // if (b_ModulNbr < 4)
4940 return (i_ReturnValue);
4944 +----------------------------------------------------------------------------+
4945 | Function Name : _INT_ i_APCI1710_GetUDStatus |
4946 | (unsigned char_ b_BoardHandle, |
4947 | unsigned char_ b_ModulNbr, |
4948 | unsigned char *_ pb_UDStatus) |
4949 +----------------------------------------------------------------------------+
4950 | Task : Return the counter progress status |
4951 +----------------------------------------------------------------------------+
4952 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
4953 | unsigned char_ b_ModulNbr : Module number to configure |
4955 +----------------------------------------------------------------------------+
4956 | Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
4957 | selected mode down |
4958 | 1 : Counter progress in the |
4959 | selected mode up |
4960 +----------------------------------------------------------------------------+
4961 | Return Value : 0: No error |
4962 | -1: The handle parameter of the board is wrong |
4963 | -2: No counter module found |
4964 | -3: Counter not initialised see function |
4965 | "i_APCI1710_InitCounter" |
4966 +----------------------------------------------------------------------------+
4969 INT i_APCI1710_GetUDStatus(struct comedi_device * dev,
4970 unsigned char b_ModulNbr, unsigned char * pb_UDStatus)
4972 INT i_ReturnValue = 0;
4973 DWORD dw_StatusReg = 0;
4975 /**************************/
4976 /* Test the module number */
4977 /**************************/
4979 if (b_ModulNbr < 4) {
4980 /*******************************/
4981 /* Test if counter initialised */
4982 /*******************************/
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));
4990 *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 2) & 1);
4993 /****************************************/
4994 /* Counter not initialised see function */
4995 /* "i_APCI1710_InitCounter" */
4996 /****************************************/
4998 DPRINTK("Counter not initialised\n");
5002 /*************************************************/
5003 /* The selected module number parameter is wrong */
5004 /*************************************************/
5006 DPRINTK("The selected module number parameter is wrong\n");
5010 return (i_ReturnValue);
5014 +----------------------------------------------------------------------------+
5015 | Function Name : _INT_ i_APCI1710_GetInterruptUDLatchedStatus |
5016 | (unsigned char_ b_BoardHandle, |
5017 | unsigned char_ b_ModulNbr, |
5018 | unsigned char *_ pb_UDStatus) |
5019 +----------------------------------------------------------------------------+
5020 | Task : Return the counter progress latched status after a |
5021 | index interrupt occur. |
5022 +----------------------------------------------------------------------------+
5023 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
5024 | unsigned char_ b_ModulNbr : Module number to configure |
5026 +----------------------------------------------------------------------------+
5027 | Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
5028 | selected mode down |
5029 | 1 : Counter progress in the |
5030 | selected mode up |
5031 | 2 : No index interrupt occur |
5032 +----------------------------------------------------------------------------+
5033 | Return Value : 0: No error |
5034 | -1: The handle parameter of the board is wrong |
5035 | -2: No counter module found |
5036 | -3: Counter not initialised see function |
5037 | "i_APCI1710_InitCounter" |
5038 | -4: Interrupt function not initialised. |
5039 | See function "i_APCI1710_SetBoardIntRoutineX" |
5040 +----------------------------------------------------------------------------+
5043 INT i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device * dev,
5044 unsigned char b_ModulNbr, unsigned char * pb_UDStatus)
5046 INT i_ReturnValue = 0;
5047 DWORD dw_StatusReg = 0;
5049 /**************************/
5050 /* Test the module number */
5051 /**************************/
5053 if (b_ModulNbr < 4) {
5054 /*******************************/
5055 /* Test if counter initialised */
5056 /*******************************/
5059 s_ModuleInfo[b_ModulNbr].
5060 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
5061 /*********************************/
5062 /* Test if index interrupt occur */
5063 /*********************************/
5066 s_ModuleInfo[b_ModulNbr].
5067 s_SiemensCounterInfo.
5068 s_InitFlag.b_IndexInterruptOccur == 1) {
5070 s_ModuleInfo[b_ModulNbr].
5071 s_SiemensCounterInfo.
5072 s_InitFlag.b_IndexInterruptOccur = 0;
5074 dw_StatusReg = inl(devpriv->s_BoardInfos.
5075 ui_Address + 12 + (64 * b_ModulNbr));
5077 *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
5079 /****************************/
5080 /* No index interrupt occur */
5081 /****************************/
5086 /****************************************/
5087 /* Counter not initialised see function */
5088 /* "i_APCI1710_InitCounter" */
5089 /****************************************/
5091 DPRINTK("Counter not initialised\n");
5095 /*************************************************/
5096 /* The selected module number parameter is wrong */
5097 /*************************************************/
5099 DPRINTK("The selected module number parameter is wrong\n");
5103 return (i_ReturnValue);
5107 +----------------------------------------------------------------------------+
5108 | Function Name : _INT_ i_APCI1710_ReadFrequencyMeasurement |
5109 | (unsigned char_ b_BoardHandle, |
5110 | unsigned char_ b_ModulNbr, |
5111 | unsigned char *_ pb_Status, |
5112 | PULONG_ pul_ReadValue) |
5113 +----------------------------------------------------------------------------+
5114 | Task : Returns the status (pb_Status) and the number of |
5115 | increments in the set time. |
5116 | See function " i_APCI1710_InitFrequencyMeasurement " |
5117 +----------------------------------------------------------------------------+
5118 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
5119 | unsigned char_ b_ModulNbr : Number of the module to be |
5120 | configured (0 to 3) |
5121 +----------------------------------------------------------------------------+
5122 | Output Parameters : unsigned char *_ pb_Status : Returns the frequency |
5123 | measurement status |
5124 | 0 : Counting cycle not |
5126 | 1 : Counting cycle started. |
5127 | 2 : Counting cycle stopped. |
5128 | The measurement cycle is |
5130 | unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
5131 | selected mode down |
5132 | 1 : Counter progress in the |
5133 | selected mode up |
5134 | PULONG_ pul_ReadValue : Return the number of |
5135 | increments in the defined |
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 +----------------------------------------------------------------------------+
5148 INT i_APCI1710_ReadFrequencyMeasurement(struct comedi_device * dev,
5149 unsigned char b_ModulNbr,
5150 unsigned char * pb_Status, unsigned char * pb_UDStatus, PULONG pul_ReadValue)
5152 INT i_ReturnValue = 0;
5156 /**************************/
5157 /* Test the module number */
5158 /**************************/
5160 if (b_ModulNbr < 4) {
5161 /*******************************/
5162 /* Test if counter initialised */
5163 /*******************************/
5166 s_ModuleInfo[b_ModulNbr].
5167 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
5168 /********************************************/
5169 /* Test if frequency mesurement initialised */
5170 /********************************************/
5173 s_ModuleInfo[b_ModulNbr].
5174 s_SiemensCounterInfo.
5175 s_InitFlag.b_FrequencyMeasurementInit == 1) {
5176 /******************/
5177 /* Test if enable */
5178 /******************/
5181 s_ModuleInfo[b_ModulNbr].
5182 s_SiemensCounterInfo.
5184 b_FrequencyMeasurementEnable == 1) {
5185 /*******************/
5186 /* Read the status */
5187 /*******************/
5190 inl(devpriv->s_BoardInfos.
5194 /**************************/
5195 /* Test if frequency stop */
5196 /**************************/
5198 if (dw_StatusReg & 1) {
5201 (unsigned char) ((dw_StatusReg >>
5204 /******************/
5205 /* Read the value */
5206 /******************/
5214 if (*pb_UDStatus == 0) {
5215 /*************************/
5216 /* Test the counter mode */
5217 /*************************/
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 /****************************************/
5224 if ((*pul_ReadValue & 0xFFFFU) != 0) {
5243 /****************************************/
5244 /* Test if 16-bit counter 2 pulse occur */
5245 /****************************************/
5247 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
5264 (0xFFFFU - ui_16BitValue) << 16);
5267 if (*pul_ReadValue != 0) {
5276 if (*pb_UDStatus == 1) {
5277 /****************************************/
5278 /* Test if 16-bit counter 2 pulse occur */
5279 /****************************************/
5281 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
5298 (0xFFFFU - ui_16BitValue) << 16);
5303 /****************************************/
5304 /* Test if 16-bit counter 1 pulse occur */
5305 /****************************************/
5307 if ((*pul_ReadValue & 0xFFFFU) != 0) {
5337 /***********************************************/
5338 /* Frequency measurement logic not initialised */
5339 /***********************************************/
5341 DPRINTK("Frequency measurement logic not initialised\n");
5345 /****************************************/
5346 /* Counter not initialised see function */
5347 /* "i_APCI1710_InitCounter" */
5348 /****************************************/
5350 DPRINTK("Counter not initialised\n");
5354 /*************************************************/
5355 /* The selected module number parameter is wrong */
5356 /*************************************************/
5358 DPRINTK("The selected module number parameter is wrong\n");
5362 return (i_ReturnValue);