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