4 Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
10 Fax: +49(0)7223/9493-92
11 http://www.addi-data.com
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 You should also find the complete GPL in the COPYING file accompanying this source code.
25 +-----------------------------------------------------------------------+
26 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
27 +-----------------------------------------------------------------------+
28 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
29 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
30 +-------------------------------+---------------------------------------+
31 | Project : APCI-1710 | Compiler : GCC |
32 | Module name : hwdrv_apci1710.c| Version : 2.96 |
33 +-------------------------------+---------------------------------------+
34 | Project manager: Eric Stolz | Date : 02/12/2002 |
35 +-------------------------------+---------------------------------------+
36 | Description : Hardware Layer Access For APCI-1710 |
37 +-----------------------------------------------------------------------+
39 +----------+-----------+------------------------------------------------+
40 | Date | Author | Description of updates |
41 +----------+-----------+------------------------------------------------+
45 +----------+-----------+------------------------------------------------+
48 #define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
49 #define COMEDI_SUBD_PWM 12 /* Pulse width Measurement */
50 #define COMEDI_SUBD_SSI 13 /* Synchronous serial interface */
51 #define COMEDI_SUBD_TOR 14 /* Tor counter */
52 #define COMEDI_SUBD_CHRONO 15 /* Chrono meter */
53 #define COMEDI_SUBD_PULSEENCODER 16 /* Pulse Encoder INP CPT */
54 #define COMEDI_SUBD_INCREMENTALCOUNTER 17 /* Incremental Counter */
56 #define APCI1710_BOARD_NAME "apci1710"
57 #define APCI1710_BOARD_DEVICE_ID 0x818F
58 #define APCI1710_ADDRESS_RANGE 256
59 #define APCI1710_CONFIG_ADDRESS_RANGE 8
60 #define APCI1710_INCREMENTAL_COUNTER 0x53430000UL
61 #define APCI1710_SSI_COUNTER 0x53490000UL
62 #define APCI1710_TTL_IO 0x544C0000UL
63 #define APCI1710_DIGITAL_IO 0x44490000UL
64 #define APCI1710_82X54_TIMER 0x49430000UL
65 #define APCI1710_CHRONOMETER 0x43480000UL
66 #define APCI1710_PULSE_ENCODER 0x495A0000UL
67 #define APCI1710_TOR_COUNTER 0x544F0000UL
68 #define APCI1710_PWM 0x50570000UL
69 #define APCI1710_ETM 0x45540000UL
70 #define APCI1710_CDA 0x43440000UL
71 #define APCI1710_DISABLE 0
72 #define APCI1710_ENABLE 1
73 #define APCI1710_SYNCHRONOUS_MODE 1
74 #define APCI1710_ASYNCHRONOUS_MODE 0
76 #include "APCI1710_Inp_cpt.c"
78 #include "APCI1710_Ssi.c"
79 #include "APCI1710_Tor.c"
80 #include "APCI1710_Ttl.c"
81 #include "APCI1710_Dig_io.c"
82 #include "APCI1710_82x54.c"
83 #include "APCI1710_Chrono.c"
84 #include "APCI1710_Pwm.c"
85 #include "APCI1710_INCCPT.c"
87 static const struct comedi_lrange range_apci1710_ttl = {
96 static const struct comedi_lrange range_apci1710_ssi = {
105 static const struct comedi_lrange range_apci1710_inccpt = {
114 static void i_ADDI_AttachPCI1710(struct comedi_device *dev)
116 struct comedi_subdevice *s;
118 int n_subdevices = 9;
120 ret = comedi_alloc_subdevices(dev, n_subdevices);
124 /* Allocate and Initialise Timer Subdevice Structures */
125 s = &dev->subdevices[0];
127 s->type = COMEDI_SUBD_TIMER;
128 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
132 s->range_table = &range_digital;
133 s->insn_write = i_APCI1710_InsnWriteEnableDisableTimer;
134 s->insn_read = i_APCI1710_InsnReadAllTimerValue;
135 s->insn_config = i_APCI1710_InsnConfigInitTimer;
136 s->insn_bits = i_APCI1710_InsnBitsTimer;
138 /* Allocate and Initialise DIO Subdevice Structures */
139 s = &dev->subdevices[1];
141 s->type = COMEDI_SUBD_DIO;
143 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
147 s->range_table = &range_digital;
148 s->insn_config = i_APCI1710_InsnConfigDigitalIO;
149 s->insn_read = i_APCI1710_InsnReadDigitalIOChlValue;
150 s->insn_bits = i_APCI1710_InsnBitsDigitalIOPortOnOff;
151 s->insn_write = i_APCI1710_InsnWriteDigitalIOChlOnOff;
153 /* Allocate and Initialise Chrono Subdevice Structures */
154 s = &dev->subdevices[2];
156 s->type = COMEDI_SUBD_CHRONO;
157 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
161 s->range_table = &range_digital;
162 s->insn_write = i_APCI1710_InsnWriteEnableDisableChrono;
163 s->insn_read = i_APCI1710_InsnReadChrono;
164 s->insn_config = i_APCI1710_InsnConfigInitChrono;
165 s->insn_bits = i_APCI1710_InsnBitsChronoDigitalIO;
167 /* Allocate and Initialise PWM Subdevice Structures */
168 s = &dev->subdevices[3];
169 s->type = COMEDI_SUBD_PWM;
171 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
175 s->range_table = &range_digital;
176 s->io_bits = 0; /* all bits input */
177 s->insn_config = i_APCI1710_InsnConfigPWM;
178 s->insn_read = i_APCI1710_InsnReadGetPWMStatus;
179 s->insn_write = i_APCI1710_InsnWritePWM;
180 s->insn_bits = i_APCI1710_InsnBitsReadPWMInterrupt;
182 /* Allocate and Initialise TTLIO Subdevice Structures */
183 s = &dev->subdevices[4];
184 s->type = COMEDI_SUBD_TTLIO;
186 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
190 s->range_table = &range_apci1710_ttl; /* to pass arguments in range */
191 s->insn_config = i_APCI1710_InsnConfigInitTTLIO;
192 s->insn_bits = i_APCI1710_InsnBitsReadTTLIO;
193 s->insn_write = i_APCI1710_InsnWriteSetTTLIOChlOnOff;
194 s->insn_read = i_APCI1710_InsnReadTTLIOAllPortValue;
196 /* Allocate and Initialise TOR Subdevice Structures */
197 s = &dev->subdevices[5];
198 s->type = COMEDI_SUBD_TOR;
200 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
204 s->range_table = &range_digital;
205 s->io_bits = 0; /* all bits input */
206 s->insn_config = i_APCI1710_InsnConfigInitTorCounter;
207 s->insn_read = i_APCI1710_InsnReadGetTorCounterInitialisation;
208 s->insn_write = i_APCI1710_InsnWriteEnableDisableTorCounter;
209 s->insn_bits = i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue;
211 /* Allocate and Initialise SSI Subdevice Structures */
212 s = &dev->subdevices[6];
213 s->type = COMEDI_SUBD_SSI;
215 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
219 s->range_table = &range_apci1710_ssi;
220 s->insn_config = i_APCI1710_InsnConfigInitSSI;
221 s->insn_read = i_APCI1710_InsnReadSSIValue;
222 s->insn_bits = i_APCI1710_InsnBitsSSIDigitalIO;
224 /* Allocate and Initialise PULSEENCODER Subdevice Structures */
225 s = &dev->subdevices[7];
226 s->type = COMEDI_SUBD_PULSEENCODER;
228 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
232 s->range_table = &range_digital;
233 s->insn_config = i_APCI1710_InsnConfigInitPulseEncoder;
234 s->insn_write = i_APCI1710_InsnWriteEnableDisablePulseEncoder;
235 s->insn_bits = i_APCI1710_InsnBitsReadWritePulseEncoder;
236 s->insn_read = i_APCI1710_InsnReadInterruptPulseEncoder;
238 /* Allocate and Initialise INCREMENTALCOUNTER Subdevice Structures */
239 s = &dev->subdevices[8];
240 s->type = COMEDI_SUBD_INCREMENTALCOUNTER;
242 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
245 s->len_chanlist = 500;
246 s->range_table = &range_apci1710_inccpt;
247 s->insn_config = i_APCI1710_InsnConfigINCCPT;
248 s->insn_write = i_APCI1710_InsnWriteINCCPT;
249 s->insn_read = i_APCI1710_InsnReadINCCPT;
250 s->insn_bits = i_APCI1710_InsnBitsINCCPT;
253 static int i_APCI1710_Reset(struct comedi_device *dev)
255 struct addi_private *devpriv = dev->private;
257 unsigned int dw_Dummy;
259 /*********************************/
260 /* Read all module configuration */
261 /*********************************/
262 ret = inl(devpriv->s_BoardInfos.ui_Address + 60);
263 devpriv->s_BoardInfos.dw_MolduleConfiguration[0] = ret;
265 ret = inl(devpriv->s_BoardInfos.ui_Address + 124);
266 devpriv->s_BoardInfos.dw_MolduleConfiguration[1] = ret;
268 ret = inl(devpriv->s_BoardInfos.ui_Address + 188);
269 devpriv->s_BoardInfos.dw_MolduleConfiguration[2] = ret;
271 ret = inl(devpriv->s_BoardInfos.ui_Address + 252);
272 devpriv->s_BoardInfos.dw_MolduleConfiguration[3] = ret;
274 /* outl(0x80808082,devpriv->s_BoardInfos.ui_Address+0x60); */
275 outl(0x83838383, devpriv->s_BoardInfos.ui_Address + 0x60);
277 devpriv->s_BoardInfos.b_BoardVersion = 1;
279 /* Enable the interrupt for the controller */
280 dw_Dummy = inl(devpriv->s_BoardInfos.ui_Address + 0x38);
281 outl(dw_Dummy | 0x2000, devpriv->s_BoardInfos.ui_Address + 0x38);
287 +----------------------------------------------------------------------------+
288 | Function's Name : __void__ v_APCI1710_InterruptFunction |
289 | (unsigned char b_Interrupt, __CPPARGS) |
290 +----------------------------------------------------------------------------+
291 | Task : APCI-1710 interrupt function |
292 +----------------------------------------------------------------------------+
293 | Input Parameters : unsigned char b_Interrupt : Interrupt number |
294 +----------------------------------------------------------------------------+
295 | Output Parameters : - |
296 +----------------------------------------------------------------------------+
297 | Return Value : 0 : OK |
299 +----------------------------------------------------------------------------+
302 static void v_APCI1710_Interrupt(int irq, void *d)
304 struct comedi_device *dev = d;
305 struct addi_private *devpriv = dev->private;
306 unsigned char b_ModuleCpt = 0;
307 unsigned char b_InterruptFlag = 0;
308 unsigned char b_PWMCpt = 0;
309 unsigned char b_TorCounterCpt = 0;
310 unsigned char b_PulseIncoderCpt = 0;
311 unsigned int ui_16BitValue;
312 unsigned int ul_InterruptLatchReg = 0;
313 unsigned int ul_LatchRegisterValue = 0;
314 unsigned int ul_82X54InterruptStatus;
315 unsigned int ul_StatusRegister;
317 union str_ModuleInfo *ps_ModuleInfo;
319 printk("APCI1710 Interrupt\n");
320 for (b_ModuleCpt = 0; b_ModuleCpt < 4; b_ModuleCpt++, ps_ModuleInfo++) {
322 /**************************/
323 /* 1199/0225 to 0100/0226 */
324 /**************************/
325 ps_ModuleInfo = &devpriv->s_ModuleInfo[b_ModuleCpt];
327 /***********************/
328 /* Test if 82X54 timer */
329 /***********************/
331 if ((devpriv->s_BoardInfos.
332 dw_MolduleConfiguration[b_ModuleCpt] &
333 0xFFFF0000UL) == APCI1710_82X54_TIMER) {
335 /* printk("TIMER Interrupt Occurred\n"); */
336 ul_82X54InterruptStatus = inl(devpriv->s_BoardInfos.
337 ui_Address + 12 + (64 * b_ModuleCpt));
339 /***************************/
340 /* Test if interrupt occur */
341 /***************************/
343 if ((ul_82X54InterruptStatus & ps_ModuleInfo->
345 b_InterruptMask) != 0) {
347 s_InterruptParameters.
348 s_FIFOInterruptParameters[devpriv->
349 s_InterruptParameters.
351 ul_OldInterruptMask =
352 (ul_82X54InterruptStatus &
353 ps_ModuleInfo->s_82X54ModuleInfo.
354 b_InterruptMask) << 4;
357 s_InterruptParameters.
358 s_FIFOInterruptParameters[devpriv->
359 s_InterruptParameters.
361 b_OldModuleMask = 1 << b_ModuleCpt;
364 s_InterruptParameters.
365 s_FIFOInterruptParameters[devpriv->
366 s_InterruptParameters.
367 ui_Write].ul_OldCounterLatchValue = 0;
370 s_InterruptParameters.
373 /****************************/
374 /* Increment the write FIFO */
375 /****************************/
378 s_InterruptParameters.
379 ui_Write = (devpriv->
380 s_InterruptParameters.
381 ui_Write + 1) % APCI1710_SAVE_INTERRUPT;
385 /**********************/
386 /* Call user function */
387 /**********************/
388 /* Send a signal to from kernel to user space */
389 send_sig(SIGIO, devpriv->tsk_Current, 0);
391 } /* if ((ul_82X54InterruptStatus & 0x7) != 0) */
394 /***************************/
395 /* Test if increm. counter */
396 /***************************/
398 if ((devpriv->s_BoardInfos.
399 dw_MolduleConfiguration[b_ModuleCpt] &
400 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
402 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
403 ui_Address + (64 * b_ModuleCpt));
405 /*********************/
406 /* Test if interrupt */
407 /*********************/
409 if ((ul_InterruptLatchReg & 0x22) && (ps_ModuleInfo->
410 s_SiemensCounterInfo.
413 b_ModeRegister2 & 0x80)) {
414 /************************************/
415 /* Test if strobe latch I interrupt */
416 /************************************/
418 if (ul_InterruptLatchReg & 2) {
419 ul_LatchRegisterValue =
420 inl(devpriv->s_BoardInfos.
425 s_InterruptParameters.
426 s_FIFOInterruptParameters
427 [devpriv->s_InterruptParameters.
428 ui_Write].ul_OldInterruptMask =
432 s_InterruptParameters.
433 s_FIFOInterruptParameters
434 [devpriv->s_InterruptParameters.
435 ui_Write].b_OldModuleMask =
439 s_InterruptParameters.
440 s_FIFOInterruptParameters
441 [devpriv->s_InterruptParameters.
443 ul_OldCounterLatchValue =
444 ul_LatchRegisterValue;
447 s_InterruptParameters.
450 /****************************/
451 /* 0899/0224 to 1199/0225 */
452 /****************************/
453 /* Increment the write FIFO */
454 /****************************/
457 s_InterruptParameters.
458 ui_Write = (devpriv->
459 s_InterruptParameters.
461 1) % APCI1710_SAVE_INTERRUPT;
465 /**********************/
466 /* Call user function */
467 /**********************/
468 /* Send a signal to from kernel to user space */
469 send_sig(SIGIO, devpriv->tsk_Current,
474 /*************************************/
475 /* Test if strobe latch II interrupt */
476 /*************************************/
478 if (ul_InterruptLatchReg & 0x20) {
480 ul_LatchRegisterValue =
481 inl(devpriv->s_BoardInfos.
486 s_InterruptParameters.
487 s_FIFOInterruptParameters
488 [devpriv->s_InterruptParameters.
489 ui_Write].ul_OldInterruptMask =
493 s_InterruptParameters.
494 s_FIFOInterruptParameters
495 [devpriv->s_InterruptParameters.
496 ui_Write].b_OldModuleMask =
500 s_InterruptParameters.
501 s_FIFOInterruptParameters
502 [devpriv->s_InterruptParameters.
504 ul_OldCounterLatchValue =
505 ul_LatchRegisterValue;
508 s_InterruptParameters.
511 /****************************/
512 /* 0899/0224 to 1199/0225 */
513 /****************************/
514 /* Increment the write FIFO */
515 /****************************/
518 s_InterruptParameters.
519 ui_Write = (devpriv->
520 s_InterruptParameters.
522 1) % APCI1710_SAVE_INTERRUPT;
526 /**********************/
527 /* Call user function */
528 /**********************/
529 /* Send a signal to from kernel to user space */
530 send_sig(SIGIO, devpriv->tsk_Current,
536 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
537 ui_Address + 24 + (64 * b_ModuleCpt));
539 /***************************/
540 /* Test if index interrupt */
541 /***************************/
543 if (ul_InterruptLatchReg & 0x8) {
545 s_SiemensCounterInfo.
546 s_InitFlag.b_IndexInterruptOccur = 1;
549 s_SiemensCounterInfo.
553 APCI1710_INDEX_AUTO_MODE) {
556 s_SiemensCounterInfo.
558 dw_ModeRegister1_2_3_4,
559 devpriv->s_BoardInfos.
564 /*****************************/
565 /* Test if interrupt enabled */
566 /*****************************/
569 s_SiemensCounterInfo.
573 APCI1710_ENABLE_INDEX_INT) ==
574 APCI1710_ENABLE_INDEX_INT) {
575 devpriv->s_InterruptParameters.
576 s_FIFOInterruptParameters
577 [devpriv->s_InterruptParameters.
578 ui_Write].ul_OldInterruptMask =
582 s_InterruptParameters.
583 s_FIFOInterruptParameters
584 [devpriv->s_InterruptParameters.
585 ui_Write].b_OldModuleMask =
589 s_InterruptParameters.
590 s_FIFOInterruptParameters
591 [devpriv->s_InterruptParameters.
593 ul_OldCounterLatchValue =
594 ul_LatchRegisterValue;
597 s_InterruptParameters.
600 /****************************/
601 /* 0899/0224 to 1199/0225 */
602 /****************************/
603 /* Increment the write FIFO */
604 /****************************/
607 s_InterruptParameters.
608 ui_Write = (devpriv->
609 s_InterruptParameters.
611 1) % APCI1710_SAVE_INTERRUPT;
615 /**********************/
616 /* Call user function */
617 /**********************/
618 /* Send a signal to from kernel to user space */
619 send_sig(SIGIO, devpriv->tsk_Current,
625 /*****************************/
626 /* Test if compare interrupt */
627 /*****************************/
629 if (ul_InterruptLatchReg & 0x10) {
630 /*****************************/
631 /* Test if interrupt enabled */
632 /*****************************/
635 s_SiemensCounterInfo.
639 APCI1710_ENABLE_COMPARE_INT) ==
640 APCI1710_ENABLE_COMPARE_INT) {
641 devpriv->s_InterruptParameters.
642 s_FIFOInterruptParameters
643 [devpriv->s_InterruptParameters.
644 ui_Write].ul_OldInterruptMask =
648 s_InterruptParameters.
649 s_FIFOInterruptParameters
650 [devpriv->s_InterruptParameters.
651 ui_Write].b_OldModuleMask =
655 s_InterruptParameters.
656 s_FIFOInterruptParameters
657 [devpriv->s_InterruptParameters.
659 ul_OldCounterLatchValue =
660 ul_LatchRegisterValue;
663 s_InterruptParameters.
666 /****************************/
667 /* 0899/0224 to 1199/0225 */
668 /****************************/
669 /* Increment the write FIFO */
670 /****************************/
673 s_InterruptParameters.
674 ui_Write = (devpriv->
675 s_InterruptParameters.
677 1) % APCI1710_SAVE_INTERRUPT;
681 /**********************/
682 /* Call user function */
683 /**********************/
684 /* Send a signal to from kernel to user space */
685 send_sig(SIGIO, devpriv->tsk_Current,
691 /*******************************************/
692 /* Test if frequency measurement interrupt */
693 /*******************************************/
695 if (ul_InterruptLatchReg & 0x20) {
696 /*******************/
697 /* Read the status */
698 /*******************/
700 ul_StatusRegister = inl(devpriv->s_BoardInfos.
701 ui_Address + 32 + (64 * b_ModuleCpt));
707 ul_LatchRegisterValue =
708 inl(devpriv->s_BoardInfos.ui_Address +
709 28 + (64 * b_ModuleCpt));
711 switch ((ul_StatusRegister >> 1) & 3) {
713 /*************************/
714 /* Test the counter mode */
715 /*************************/
717 if ((devpriv->s_ModuleInfo[b_ModuleCpt].
718 s_SiemensCounterInfo.
722 APCI1710_16BIT_COUNTER)
723 == APCI1710_16BIT_COUNTER) {
724 /****************************************/
725 /* Test if 16-bit counter 1 pulse occur */
726 /****************************************/
728 if ((ul_LatchRegisterValue &
732 ul_LatchRegisterValue
734 ul_LatchRegisterValue =
735 (ul_LatchRegisterValue
741 /****************************************/
742 /* Test if 16-bit counter 2 pulse occur */
743 /****************************************/
745 if ((ul_LatchRegisterValue &
750 (ul_LatchRegisterValue
753 ul_LatchRegisterValue =
754 (ul_LatchRegisterValue
761 if (ul_LatchRegisterValue != 0) {
762 ul_LatchRegisterValue =
764 ul_LatchRegisterValue;
770 /****************************************/
771 /* Test if 16-bit counter 2 pulse occur */
772 /****************************************/
774 if ((ul_LatchRegisterValue &
775 0xFFFF0000UL) != 0) {
778 (ul_LatchRegisterValue
781 ul_LatchRegisterValue =
782 (ul_LatchRegisterValue &
783 0xFFFFUL) | ((0xFFFFU -
790 /****************************************/
791 /* Test if 16-bit counter 1 pulse occur */
792 /****************************************/
794 if ((ul_LatchRegisterValue & 0xFFFFU) !=
798 ul_LatchRegisterValue &
800 ul_LatchRegisterValue =
801 (ul_LatchRegisterValue &
802 0xFFFF0000UL) | (0xFFFFU
809 s_InterruptParameters.
810 s_FIFOInterruptParameters[devpriv->
811 s_InterruptParameters.
813 ul_OldInterruptMask = 0x10000UL;
816 s_InterruptParameters.
817 s_FIFOInterruptParameters[devpriv->
818 s_InterruptParameters.
820 b_OldModuleMask = 1 << b_ModuleCpt;
823 s_InterruptParameters.
824 s_FIFOInterruptParameters[devpriv->
825 s_InterruptParameters.
827 ul_OldCounterLatchValue =
828 ul_LatchRegisterValue;
831 s_InterruptParameters.
834 /****************************/
835 /* 0899/0224 to 1199/0225 */
836 /****************************/
837 /* Increment the write FIFO */
838 /****************************/
841 s_InterruptParameters.
842 ui_Write = (devpriv->
843 s_InterruptParameters.
844 ui_Write + 1) % APCI1710_SAVE_INTERRUPT;
848 /**********************/
849 /* Call user function */
850 /**********************/
851 /* Send a signal to from kernel to user space */
852 send_sig(SIGIO, devpriv->tsk_Current, 0);
855 } /* Incremental counter */
861 if ((devpriv->s_BoardInfos.
862 dw_MolduleConfiguration[b_ModuleCpt] &
863 0xFFFF0000UL) == APCI1710_CDA) {
864 /******************************************/
865 /* Test if CDA enable and functionality 0 */
866 /******************************************/
868 if ((devpriv->s_ModuleInfo[b_ModuleCpt].
870 b_CDAEnable == APCI1710_ENABLE)
871 && (devpriv->s_ModuleInfo[b_ModuleCpt].
872 s_CDAModuleInfo.b_FctSelection == 0)) {
873 /****************************/
874 /* Get the interrupt status */
875 /****************************/
877 ul_StatusRegister = inl(devpriv->s_BoardInfos.
878 ui_Address + 16 + (64 * b_ModuleCpt));
879 /***************************/
880 /* Test if interrupt occur */
881 /***************************/
883 if (ul_StatusRegister & 1) {
885 s_InterruptParameters.
886 s_FIFOInterruptParameters
887 [devpriv->s_InterruptParameters.
888 ui_Write].ul_OldInterruptMask =
892 s_InterruptParameters.
893 s_FIFOInterruptParameters
894 [devpriv->s_InterruptParameters.
895 ui_Write].b_OldModuleMask =
899 s_InterruptParameters.
900 s_FIFOInterruptParameters
901 [devpriv->s_InterruptParameters.
903 ul_OldCounterLatchValue = 0;
906 s_InterruptParameters.
909 /****************************/
910 /* Increment the write FIFO */
911 /****************************/
914 s_InterruptParameters.
915 ui_Write = (devpriv->
916 s_InterruptParameters.
918 1) % APCI1710_SAVE_INTERRUPT;
922 /**********************/
923 /* Call user function */
924 /**********************/
926 /* Send a signal to from kernel to user space */
927 send_sig(SIGIO, devpriv->tsk_Current,
930 } /* if (ul_StatusRegister & 1) */
935 /***********************/
936 /* Test if PWM counter */
937 /***********************/
939 if ((devpriv->s_BoardInfos.
940 dw_MolduleConfiguration[b_ModuleCpt] &
941 0xFFFF0000UL) == APCI1710_PWM) {
942 for (b_PWMCpt = 0; b_PWMCpt < 2; b_PWMCpt++) {
943 /*************************************/
944 /* Test if PWM interrupt initialised */
945 /*************************************/
948 s_ModuleInfo[b_ModuleCpt].
951 b_InterruptEnable == APCI1710_ENABLE) {
952 /*****************************/
953 /* Read the interrupt status */
954 /*****************************/
957 inl(devpriv->s_BoardInfos.
962 /***************************/
963 /* Test if interrupt occur */
964 /***************************/
966 if (ul_StatusRegister & 0x1) {
968 s_InterruptParameters.
969 s_FIFOInterruptParameters
971 s_InterruptParameters.
973 ul_OldInterruptMask =
974 0x4000UL << b_PWMCpt;
977 s_InterruptParameters.
978 s_FIFOInterruptParameters
980 s_InterruptParameters.
986 s_InterruptParameters.
989 /****************************/
990 /* Increment the write FIFO */
991 /****************************/
994 s_InterruptParameters.
995 ui_Write = (devpriv->
996 s_InterruptParameters.
999 APCI1710_SAVE_INTERRUPT;
1001 b_InterruptFlag = 1;
1003 /**********************/
1004 /* Call user function */
1005 /**********************/
1006 /* Send a signal to from kernel to user space */
1008 devpriv->tsk_Current,
1011 } /* if (ul_StatusRegister & 0x1) */
1012 } /* if (APCI1710_ENABLE) */
1013 } /* for (b_PWMCpt == 0; b_PWMCpt < 0; b_PWMCpt ++) */
1016 /***********************/
1017 /* Test if tor counter */
1018 /***********************/
1020 if ((devpriv->s_BoardInfos.
1021 dw_MolduleConfiguration[b_ModuleCpt] &
1022 0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
1023 for (b_TorCounterCpt = 0; b_TorCounterCpt < 2;
1024 b_TorCounterCpt++) {
1025 /*************************************/
1026 /* Test if tor interrupt initialised */
1027 /*************************************/
1030 s_ModuleInfo[b_ModuleCpt].
1031 s_TorCounterModuleInfo.
1032 s_TorCounterInfo[b_TorCounterCpt].
1033 b_InterruptEnable == APCI1710_ENABLE) {
1034 /*****************************/
1035 /* Read the interrupt status */
1036 /*****************************/
1039 inl(devpriv->s_BoardInfos.
1041 (16 * b_TorCounterCpt) +
1042 (64 * b_ModuleCpt));
1044 /***************************/
1045 /* Test if interrupt occur */
1046 /***************************/
1048 if (ul_StatusRegister & 0x1) {
1049 /******************************/
1050 /* Read the tor counter value */
1051 /******************************/
1053 ul_LatchRegisterValue =
1057 (16 * b_TorCounterCpt) +
1058 (64 * b_ModuleCpt));
1061 s_InterruptParameters.
1062 s_FIFOInterruptParameters
1064 s_InterruptParameters.
1066 ul_OldInterruptMask =
1071 s_InterruptParameters.
1072 s_FIFOInterruptParameters
1074 s_InterruptParameters.
1080 s_InterruptParameters.
1081 s_FIFOInterruptParameters
1083 s_InterruptParameters.
1085 ul_OldCounterLatchValue
1086 = ul_LatchRegisterValue;
1089 s_InterruptParameters.
1090 ul_InterruptOccur++;
1092 /****************************/
1093 /* Increment the write FIFO */
1094 /****************************/
1097 s_InterruptParameters.
1098 ui_Write = (devpriv->
1099 s_InterruptParameters.
1102 APCI1710_SAVE_INTERRUPT;
1104 b_InterruptFlag = 1;
1106 /**********************/
1107 /* Call user function */
1108 /**********************/
1110 /* Send a signal to from kernel to user space */
1112 devpriv->tsk_Current,
1114 } /* if (ul_StatusRegister & 0x1) */
1115 } /* if (APCI1710_ENABLE) */
1116 } /* for (b_TorCounterCpt == 0; b_TorCounterCpt < 0; b_TorCounterCpt ++) */
1119 /***********************/
1120 /* Test if chronometer */
1121 /***********************/
1123 if ((devpriv->s_BoardInfos.
1124 dw_MolduleConfiguration[b_ModuleCpt] &
1125 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
1127 /* printk("APCI1710 Chrono Interrupt\n"); */
1128 /*****************************/
1129 /* Read the interrupt status */
1130 /*****************************/
1132 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
1133 ui_Address + 12 + (64 * b_ModuleCpt));
1135 /***************************/
1136 /* Test if interrupt occur */
1137 /***************************/
1139 if ((ul_InterruptLatchReg & 0x8) == 0x8) {
1140 /****************************/
1141 /* Clear the interrupt flag */
1142 /****************************/
1144 outl(0, devpriv->s_BoardInfos.
1145 ui_Address + 32 + (64 * b_ModuleCpt));
1147 /***************************/
1148 /* Test if continuous mode */
1149 /***************************/
1153 b_CycleMode == APCI1710_ENABLE) {
1154 /********************/
1155 /* Clear the status */
1156 /********************/
1158 outl(0, devpriv->s_BoardInfos.
1160 (64 * b_ModuleCpt));
1163 /*************************/
1164 /* Read the timing value */
1165 /*************************/
1167 ul_LatchRegisterValue =
1168 inl(devpriv->s_BoardInfos.ui_Address +
1169 4 + (64 * b_ModuleCpt));
1171 /*****************************/
1172 /* Test if interrupt enabled */
1173 /*****************************/
1176 s_ChronoModuleInfo.b_InterruptMask) {
1178 s_InterruptParameters.
1179 s_FIFOInterruptParameters
1180 [devpriv->s_InterruptParameters.
1181 ui_Write].ul_OldInterruptMask =
1185 s_InterruptParameters.
1186 s_FIFOInterruptParameters
1187 [devpriv->s_InterruptParameters.
1188 ui_Write].b_OldModuleMask =
1192 s_InterruptParameters.
1193 s_FIFOInterruptParameters
1194 [devpriv->s_InterruptParameters.
1196 ul_OldCounterLatchValue =
1197 ul_LatchRegisterValue;
1200 s_InterruptParameters.
1201 ul_InterruptOccur++;
1203 /****************************/
1204 /* Increment the write FIFO */
1205 /****************************/
1208 s_InterruptParameters.
1209 ui_Write = (devpriv->
1210 s_InterruptParameters.
1212 1) % APCI1710_SAVE_INTERRUPT;
1214 b_InterruptFlag = 1;
1216 /**********************/
1217 /* Call user function */
1218 /**********************/
1219 /* Send a signal to from kernel to user space */
1220 send_sig(SIGIO, devpriv->tsk_Current,
1227 /*************************/
1228 /* Test if pulse encoder */
1229 /*************************/
1231 if ((devpriv->s_BoardInfos.
1232 dw_MolduleConfiguration[b_ModuleCpt] &
1233 0xFFFF0000UL) == APCI1710_PULSE_ENCODER) {
1234 /****************************/
1235 /* Read the status register */
1236 /****************************/
1238 ul_StatusRegister = inl(devpriv->s_BoardInfos.
1239 ui_Address + 20 + (64 * b_ModuleCpt));
1241 if (ul_StatusRegister & 0xF) {
1242 for (b_PulseIncoderCpt = 0;
1243 b_PulseIncoderCpt < 4;
1244 b_PulseIncoderCpt++) {
1245 /*************************************/
1246 /* Test if pulse encoder initialised */
1247 /*************************************/
1249 if ((ps_ModuleInfo->
1250 s_PulseEncoderModuleInfo.
1252 [b_PulseIncoderCpt].
1253 b_PulseEncoderInit == 1)
1254 && (((ps_ModuleInfo->s_PulseEncoderModuleInfo.dw_SetRegister >> b_PulseIncoderCpt) & 1) == 1) && (((ul_StatusRegister >> (b_PulseIncoderCpt)) & 1) == 1)) {
1255 devpriv->s_InterruptParameters.
1256 s_FIFOInterruptParameters
1258 s_InterruptParameters.
1260 ul_OldInterruptMask =
1265 s_InterruptParameters.
1266 s_FIFOInterruptParameters
1268 s_InterruptParameters.
1274 s_InterruptParameters.
1275 s_FIFOInterruptParameters
1277 s_InterruptParameters.
1279 ul_OldCounterLatchValue
1280 = ul_LatchRegisterValue;
1283 s_InterruptParameters.
1284 ul_InterruptOccur++;
1286 /****************************/
1287 /* 0899/0224 to 1199/0225 */
1288 /****************************/
1289 /* Increment the write FIFO */
1290 /****************************/
1293 s_InterruptParameters.
1294 ui_Write = (devpriv->
1295 s_InterruptParameters.
1298 APCI1710_SAVE_INTERRUPT;
1300 b_InterruptFlag = 1;
1302 /**********************/
1303 /* Call user function */
1304 /**********************/
1305 /* Send a signal to from kernel to user space */
1307 devpriv->tsk_Current,
1313 } /* pulse encoder */