4 Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
10 Fax: +49(0)7223/9493-92
11 http://www.addi-data-com
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 You shoud also find the complete GPL in the COPYING file accompanying this source code.
25 +-----------------------------------------------------------------------+
26 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
27 +-----------------------------------------------------------------------+
28 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
29 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
30 +-------------------------------+---------------------------------------+
31 | Project : 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 Acces For APCI-1710 |
37 +-----------------------------------------------------------------------+
39 +----------+-----------+------------------------------------------------+
40 | Date | Author | Description of updates |
41 +----------+-----------+------------------------------------------------+
45 +----------+-----------+------------------------------------------------+
47 #include "hwdrv_APCI1710.h"
48 #include "APCI1710_Inp_cpt.c"
50 #include "APCI1710_Ssi.c"
51 #include "APCI1710_Tor.c"
52 #include "APCI1710_Ttl.c"
53 #include "APCI1710_Dig_io.c"
54 #include "APCI1710_82x54.c"
55 #include "APCI1710_Chrono.c"
56 #include "APCI1710_Pwm.c"
57 #include "APCI1710_INCCPT.c"
59 void i_ADDI_AttachPCI1710(struct comedi_device * dev)
61 struct comedi_subdevice *s;
65 //Update-0.7.57->0.7.68dev->n_subdevices = 9;
66 if ((ret = alloc_subdevices(dev, n_subdevices)) < 0)
69 // Allocate and Initialise Timer Subdevice Structures
70 s = dev->subdevices + 0;
72 s->type = COMEDI_SUBD_TIMER;
73 s->subdev_flags = SDF_WRITEABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
77 s->range_table = &range_digital;
78 s->insn_write = i_APCI1710_InsnWriteEnableDisableTimer;
79 s->insn_read = i_APCI1710_InsnReadAllTimerValue;
80 s->insn_config = i_APCI1710_InsnConfigInitTimer;
81 s->insn_bits = i_APCI1710_InsnBitsTimer;
83 // Allocate and Initialise DIO Subdevice Structures
84 s = dev->subdevices + 1;
86 s->type = COMEDI_SUBD_DIO;
88 SDF_WRITEABLE | SDF_READABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
92 s->range_table = &range_digital;
93 s->insn_config = i_APCI1710_InsnConfigDigitalIO;
94 s->insn_read = i_APCI1710_InsnReadDigitalIOChlValue;
95 s->insn_bits = i_APCI1710_InsnBitsDigitalIOPortOnOff;
96 s->insn_write = i_APCI1710_InsnWriteDigitalIOChlOnOff;
98 // Allocate and Initialise Chrono Subdevice Structures
99 s = dev->subdevices + 2;
101 s->type = COMEDI_SUBD_CHRONO;
102 s->subdev_flags = SDF_WRITEABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
106 s->range_table = &range_digital;
107 s->insn_write = i_APCI1710_InsnWriteEnableDisableChrono;
108 s->insn_read = i_APCI1710_InsnReadChrono;
109 s->insn_config = i_APCI1710_InsnConfigInitChrono;
110 s->insn_bits = i_APCI1710_InsnBitsChronoDigitalIO;
112 // Allocate and Initialise PWM Subdevice Structures
113 s = dev->subdevices + 3;
114 s->type = COMEDI_SUBD_PWM;
116 SDF_WRITEABLE | SDF_READABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
120 s->range_table = &range_digital;
121 s->io_bits = 0; //all bits input
122 s->insn_config = i_APCI1710_InsnConfigPWM;
123 s->insn_read = i_APCI1710_InsnReadGetPWMStatus;
124 s->insn_write = i_APCI1710_InsnWritePWM;
125 s->insn_bits = i_APCI1710_InsnBitsReadPWMInterrupt;
127 // Allocate and Initialise TTLIO Subdevice Structures
128 s = dev->subdevices + 4;
129 s->type = COMEDI_SUBD_TTLIO;
131 SDF_WRITEABLE | SDF_READABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
135 s->range_table = &range_apci1710_ttl; // to pass arguments in range
136 s->insn_config = i_APCI1710_InsnConfigInitTTLIO;
137 s->insn_bits = i_APCI1710_InsnBitsReadTTLIO;
138 s->insn_write = i_APCI1710_InsnWriteSetTTLIOChlOnOff;
139 s->insn_read = i_APCI1710_InsnReadTTLIOAllPortValue;
141 // Allocate and Initialise TOR Subdevice Structures
142 s = dev->subdevices + 5;
143 s->type = COMEDI_SUBD_TOR;
145 SDF_WRITEABLE | SDF_READABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
149 s->range_table = &range_digital;
150 s->io_bits = 0; //all bits input
151 s->insn_config = i_APCI1710_InsnConfigInitTorCounter;
152 s->insn_read = i_APCI1710_InsnReadGetTorCounterInitialisation;
153 s->insn_write = i_APCI1710_InsnWriteEnableDisableTorCounter;
154 s->insn_bits = i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue;
156 // Allocate and Initialise SSI Subdevice Structures
157 s = dev->subdevices + 6;
158 s->type = COMEDI_SUBD_SSI;
160 SDF_WRITEABLE | SDF_READABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
164 s->range_table = &range_apci1710_ssi;
165 s->insn_config = i_APCI1710_InsnConfigInitSSI;
166 s->insn_read = i_APCI1710_InsnReadSSIValue;
167 s->insn_bits = i_APCI1710_InsnBitsSSIDigitalIO;
169 // Allocate and Initialise PULSEENCODER Subdevice Structures
170 s = dev->subdevices + 7;
171 s->type = COMEDI_SUBD_PULSEENCODER;
173 SDF_WRITEABLE | SDF_READABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
177 s->range_table = &range_digital;
178 s->insn_config = i_APCI1710_InsnConfigInitPulseEncoder;
179 s->insn_write = i_APCI1710_InsnWriteEnableDisablePulseEncoder;
180 s->insn_bits = i_APCI1710_InsnBitsReadWritePulseEncoder;
181 s->insn_read = i_APCI1710_InsnReadInterruptPulseEncoder;
183 // Allocate and Initialise INCREMENTALCOUNTER Subdevice Structures
184 s = dev->subdevices + 8;
185 s->type = COMEDI_SUBD_INCREMENTALCOUNTER;
187 SDF_WRITEABLE | SDF_READABLE | SDF_RT | SDF_GROUND | SDF_COMMON;
190 s->len_chanlist = 500;
191 s->range_table = &range_apci1710_inccpt;
192 s->insn_config = i_APCI1710_InsnConfigINCCPT;
193 s->insn_write = i_APCI1710_InsnWriteINCCPT;
194 s->insn_read = i_APCI1710_InsnReadINCCPT;
195 s->insn_bits = i_APCI1710_InsnBitsINCCPT;
198 int i_APCI1710_Reset(struct comedi_device * dev);
199 void v_APCI1710_Interrupt(int irq, void *d);
202 int i_APCI1710_Reset(struct comedi_device * dev)
205 unsigned int dw_Dummy;
207 /*********************************/
208 /* Read all module configuration */
209 /*********************************/
210 ret = inl(devpriv->s_BoardInfos.ui_Address + 60);
211 devpriv->s_BoardInfos.dw_MolduleConfiguration[0] = ret;
213 ret = inl(devpriv->s_BoardInfos.ui_Address + 124);
214 devpriv->s_BoardInfos.dw_MolduleConfiguration[1] = ret;
216 ret = inl(devpriv->s_BoardInfos.ui_Address + 188);
217 devpriv->s_BoardInfos.dw_MolduleConfiguration[2] = ret;
219 ret = inl(devpriv->s_BoardInfos.ui_Address + 252);
220 devpriv->s_BoardInfos.dw_MolduleConfiguration[3] = ret;
222 // outl(0x80808082,devpriv->s_BoardInfos.ui_Address+0x60);
223 outl(0x83838383, devpriv->s_BoardInfos.ui_Address + 0x60);
225 devpriv->s_BoardInfos.b_BoardVersion = 1;
227 // Enable the interrupt for the controler
228 dw_Dummy = inl(devpriv->s_BoardInfos.ui_Address + 0x38);
229 outl(dw_Dummy | 0x2000, devpriv->s_BoardInfos.ui_Address + 0x38);
235 +----------------------------------------------------------------------------+
236 | Function's Name : __void__ v_APCI1710_InterruptFunction |
237 | (unsigned char b_Interrupt, __CPPARGS) |
238 +----------------------------------------------------------------------------+
239 | Task : APCI-1710 interrupt function |
240 +----------------------------------------------------------------------------+
241 | Input Parameters : unsigned char b_Interrupt : Interrupt number |
242 +----------------------------------------------------------------------------+
243 | Output Parameters : - |
244 +----------------------------------------------------------------------------+
245 | Return Value : 0 : OK |
247 +----------------------------------------------------------------------------+
250 void v_APCI1710_Interrupt(int irq, void *d)
252 struct comedi_device *dev = d;
253 unsigned char b_ModuleCpt = 0;
254 unsigned char b_InterruptFlag = 0;
255 unsigned char b_PWMCpt = 0;
256 unsigned char b_TorCounterCpt = 0;
257 unsigned char b_PulseIncoderCpt = 0;
258 unsigned int ui_16BitValue;
259 unsigned int ul_InterruptLatchReg = 0;
260 unsigned int ul_LatchRegisterValue = 0;
261 unsigned int ul_82X54InterruptStatus;
262 unsigned int ul_StatusRegister;
264 str_ModuleInfo *ps_ModuleInfo;
266 printk("APCI1710 Interrupt\n");
267 for (b_ModuleCpt = 0; b_ModuleCpt < 4; b_ModuleCpt++, ps_ModuleInfo++) {
269 /**************************/
270 /* 1199/0225 to 0100/0226 */
271 /**************************/
272 ps_ModuleInfo = &devpriv->s_ModuleInfo[b_ModuleCpt];
274 /***********************/
275 /* Test if 82X54 timer */
276 /***********************/
278 if ((devpriv->s_BoardInfos.
279 dw_MolduleConfiguration[b_ModuleCpt] &
280 0xFFFF0000UL) == APCI1710_82X54_TIMER) {
282 //printk("TIMER Interrupt Occurred\n");
283 ul_82X54InterruptStatus = inl(devpriv->s_BoardInfos.
284 ui_Address + 12 + (64 * b_ModuleCpt));
286 /***************************/
287 /* Test if interrupt occur */
288 /***************************/
290 if ((ul_82X54InterruptStatus & ps_ModuleInfo->
292 b_InterruptMask) != 0) {
294 s_InterruptParameters.
295 s_FIFOInterruptParameters[devpriv->
296 s_InterruptParameters.
298 ul_OldInterruptMask =
299 (ul_82X54InterruptStatus &
300 ps_ModuleInfo->s_82X54ModuleInfo.
301 b_InterruptMask) << 4;
304 s_InterruptParameters.
305 s_FIFOInterruptParameters[devpriv->
306 s_InterruptParameters.
308 b_OldModuleMask = 1 << b_ModuleCpt;
311 s_InterruptParameters.
312 s_FIFOInterruptParameters[devpriv->
313 s_InterruptParameters.
314 ui_Write].ul_OldCounterLatchValue = 0;
317 s_InterruptParameters.
320 /****************************/
321 /* Increment the write FIFO */
322 /****************************/
325 s_InterruptParameters.
326 ui_Write = (devpriv->
327 s_InterruptParameters.
328 ui_Write + 1) % APCI1710_SAVE_INTERRUPT;
332 /**********************/
333 /* Call user function */
334 /**********************/
335 //Send a signal to from kernel to user space
336 send_sig(SIGIO, devpriv->tsk_Current, 0);
338 } // if ((ul_82X54InterruptStatus & 0x7) != 0)
341 /***************************/
342 /* Test if increm. counter */
343 /***************************/
345 if ((devpriv->s_BoardInfos.
346 dw_MolduleConfiguration[b_ModuleCpt] &
347 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
349 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
350 ui_Address + (64 * b_ModuleCpt));
352 /*********************/
353 /* Test if interrupt */
354 /*********************/
356 if ((ul_InterruptLatchReg & 0x22) && (ps_ModuleInfo->
357 s_SiemensCounterInfo.
360 b_ModeRegister2 & 0x80)) {
361 /************************************/
362 /* Test if strobe latch I interrupt */
363 /************************************/
365 if (ul_InterruptLatchReg & 2) {
366 ul_LatchRegisterValue =
367 inl(devpriv->s_BoardInfos.
372 s_InterruptParameters.
373 s_FIFOInterruptParameters
374 [devpriv->s_InterruptParameters.
375 ui_Write].ul_OldInterruptMask =
379 s_InterruptParameters.
380 s_FIFOInterruptParameters
381 [devpriv->s_InterruptParameters.
382 ui_Write].b_OldModuleMask =
386 s_InterruptParameters.
387 s_FIFOInterruptParameters
388 [devpriv->s_InterruptParameters.
390 ul_OldCounterLatchValue =
391 ul_LatchRegisterValue;
394 s_InterruptParameters.
397 /****************************/
398 /* 0899/0224 to 1199/0225 */
399 /****************************/
400 /* Increment the write FIFO */
401 /****************************/
404 s_InterruptParameters.
405 ui_Write = (devpriv->
406 s_InterruptParameters.
408 1) % APCI1710_SAVE_INTERRUPT;
412 /**********************/
413 /* Call user function */
414 /**********************/
415 //Send a signal to from kernel to user space
416 send_sig(SIGIO, devpriv->tsk_Current,
421 /*************************************/
422 /* Test if strobe latch II interrupt */
423 /*************************************/
425 if (ul_InterruptLatchReg & 0x20) {
427 ul_LatchRegisterValue =
428 inl(devpriv->s_BoardInfos.
433 s_InterruptParameters.
434 s_FIFOInterruptParameters
435 [devpriv->s_InterruptParameters.
436 ui_Write].ul_OldInterruptMask =
440 s_InterruptParameters.
441 s_FIFOInterruptParameters
442 [devpriv->s_InterruptParameters.
443 ui_Write].b_OldModuleMask =
447 s_InterruptParameters.
448 s_FIFOInterruptParameters
449 [devpriv->s_InterruptParameters.
451 ul_OldCounterLatchValue =
452 ul_LatchRegisterValue;
455 s_InterruptParameters.
458 /****************************/
459 /* 0899/0224 to 1199/0225 */
460 /****************************/
461 /* Increment the write FIFO */
462 /****************************/
465 s_InterruptParameters.
466 ui_Write = (devpriv->
467 s_InterruptParameters.
469 1) % APCI1710_SAVE_INTERRUPT;
473 /**********************/
474 /* Call user function */
475 /**********************/
476 //Send a signal to from kernel to user space
477 send_sig(SIGIO, devpriv->tsk_Current,
483 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
484 ui_Address + 24 + (64 * b_ModuleCpt));
486 /***************************/
487 /* Test if index interrupt */
488 /***************************/
490 if (ul_InterruptLatchReg & 0x8) {
492 s_SiemensCounterInfo.
493 s_InitFlag.b_IndexInterruptOccur = 1;
496 s_SiemensCounterInfo.
500 APCI1710_INDEX_AUTO_MODE) {
503 s_SiemensCounterInfo.
505 dw_ModeRegister1_2_3_4,
506 devpriv->s_BoardInfos.
511 /*****************************/
512 /* Test if interrupt enabled */
513 /*****************************/
516 s_SiemensCounterInfo.
520 APCI1710_ENABLE_INDEX_INT) ==
521 APCI1710_ENABLE_INDEX_INT) {
522 devpriv->s_InterruptParameters.
523 s_FIFOInterruptParameters
524 [devpriv->s_InterruptParameters.
525 ui_Write].ul_OldInterruptMask =
529 s_InterruptParameters.
530 s_FIFOInterruptParameters
531 [devpriv->s_InterruptParameters.
532 ui_Write].b_OldModuleMask =
536 s_InterruptParameters.
537 s_FIFOInterruptParameters
538 [devpriv->s_InterruptParameters.
540 ul_OldCounterLatchValue =
541 ul_LatchRegisterValue;
544 s_InterruptParameters.
547 /****************************/
548 /* 0899/0224 to 1199/0225 */
549 /****************************/
550 /* Increment the write FIFO */
551 /****************************/
554 s_InterruptParameters.
555 ui_Write = (devpriv->
556 s_InterruptParameters.
558 1) % APCI1710_SAVE_INTERRUPT;
562 /**********************/
563 /* Call user function */
564 /**********************/
565 //Send a signal to from kernel to user space
566 send_sig(SIGIO, devpriv->tsk_Current,
572 /*****************************/
573 /* Test if compare interrupt */
574 /*****************************/
576 if (ul_InterruptLatchReg & 0x10) {
577 /*****************************/
578 /* Test if interrupt enabled */
579 /*****************************/
582 s_SiemensCounterInfo.
586 APCI1710_ENABLE_COMPARE_INT) ==
587 APCI1710_ENABLE_COMPARE_INT) {
588 devpriv->s_InterruptParameters.
589 s_FIFOInterruptParameters
590 [devpriv->s_InterruptParameters.
591 ui_Write].ul_OldInterruptMask =
595 s_InterruptParameters.
596 s_FIFOInterruptParameters
597 [devpriv->s_InterruptParameters.
598 ui_Write].b_OldModuleMask =
602 s_InterruptParameters.
603 s_FIFOInterruptParameters
604 [devpriv->s_InterruptParameters.
606 ul_OldCounterLatchValue =
607 ul_LatchRegisterValue;
610 s_InterruptParameters.
613 /****************************/
614 /* 0899/0224 to 1199/0225 */
615 /****************************/
616 /* Increment the write FIFO */
617 /****************************/
620 s_InterruptParameters.
621 ui_Write = (devpriv->
622 s_InterruptParameters.
624 1) % APCI1710_SAVE_INTERRUPT;
628 /**********************/
629 /* Call user function */
630 /**********************/
631 //Send a signal to from kernel to user space
632 send_sig(SIGIO, devpriv->tsk_Current,
638 /*******************************************/
639 /* Test if frequency measurement interrupt */
640 /*******************************************/
642 if (ul_InterruptLatchReg & 0x20) {
643 /*******************/
644 /* Read the status */
645 /*******************/
647 ul_StatusRegister = inl(devpriv->s_BoardInfos.
648 ui_Address + 32 + (64 * b_ModuleCpt));
654 ul_LatchRegisterValue =
655 inl(devpriv->s_BoardInfos.ui_Address +
656 28 + (64 * b_ModuleCpt));
658 switch ((ul_StatusRegister >> 1) & 3) {
660 /*************************/
661 /* Test the counter mode */
662 /*************************/
664 if ((devpriv->s_ModuleInfo[b_ModuleCpt].
665 s_SiemensCounterInfo.
669 APCI1710_16BIT_COUNTER)
670 == APCI1710_16BIT_COUNTER) {
671 /****************************************/
672 /* Test if 16-bit counter 1 pulse occur */
673 /****************************************/
675 if ((ul_LatchRegisterValue &
679 ul_LatchRegisterValue
681 ul_LatchRegisterValue =
682 (ul_LatchRegisterValue
688 /****************************************/
689 /* Test if 16-bit counter 2 pulse occur */
690 /****************************************/
692 if ((ul_LatchRegisterValue &
697 (ul_LatchRegisterValue
700 ul_LatchRegisterValue =
701 (ul_LatchRegisterValue
708 if (ul_LatchRegisterValue != 0) {
709 ul_LatchRegisterValue =
711 ul_LatchRegisterValue;
717 /****************************************/
718 /* Test if 16-bit counter 2 pulse occur */
719 /****************************************/
721 if ((ul_LatchRegisterValue &
722 0xFFFF0000UL) != 0) {
725 (ul_LatchRegisterValue
728 ul_LatchRegisterValue =
729 (ul_LatchRegisterValue &
730 0xFFFFUL) | ((0xFFFFU -
737 /****************************************/
738 /* Test if 16-bit counter 1 pulse occur */
739 /****************************************/
741 if ((ul_LatchRegisterValue & 0xFFFFU) !=
745 ul_LatchRegisterValue &
747 ul_LatchRegisterValue =
748 (ul_LatchRegisterValue &
749 0xFFFF0000UL) | (0xFFFFU
756 s_InterruptParameters.
757 s_FIFOInterruptParameters[devpriv->
758 s_InterruptParameters.
760 ul_OldInterruptMask = 0x10000UL;
763 s_InterruptParameters.
764 s_FIFOInterruptParameters[devpriv->
765 s_InterruptParameters.
767 b_OldModuleMask = 1 << b_ModuleCpt;
770 s_InterruptParameters.
771 s_FIFOInterruptParameters[devpriv->
772 s_InterruptParameters.
774 ul_OldCounterLatchValue =
775 ul_LatchRegisterValue;
778 s_InterruptParameters.
781 /****************************/
782 /* 0899/0224 to 1199/0225 */
783 /****************************/
784 /* Increment the write FIFO */
785 /****************************/
788 s_InterruptParameters.
789 ui_Write = (devpriv->
790 s_InterruptParameters.
791 ui_Write + 1) % APCI1710_SAVE_INTERRUPT;
795 /**********************/
796 /* Call user function */
797 /**********************/
798 //Send a signal to from kernel to user space
799 send_sig(SIGIO, devpriv->tsk_Current, 0);
802 } // Incremental counter
808 if ((devpriv->s_BoardInfos.
809 dw_MolduleConfiguration[b_ModuleCpt] &
810 0xFFFF0000UL) == APCI1710_CDA) {
811 /******************************************/
812 /* Test if CDA enable and functionality 0 */
813 /******************************************/
815 if ((devpriv->s_ModuleInfo[b_ModuleCpt].
817 b_CDAEnable == APCI1710_ENABLE)
818 && (devpriv->s_ModuleInfo[b_ModuleCpt].
819 s_CDAModuleInfo.b_FctSelection == 0)) {
820 /****************************/
821 /* Get the interrupt status */
822 /****************************/
824 ul_StatusRegister = inl(devpriv->s_BoardInfos.
825 ui_Address + 16 + (64 * b_ModuleCpt));
826 /***************************/
827 /* Test if interrupt occur */
828 /***************************/
830 if (ul_StatusRegister & 1) {
832 s_InterruptParameters.
833 s_FIFOInterruptParameters
834 [devpriv->s_InterruptParameters.
835 ui_Write].ul_OldInterruptMask =
839 s_InterruptParameters.
840 s_FIFOInterruptParameters
841 [devpriv->s_InterruptParameters.
842 ui_Write].b_OldModuleMask =
846 s_InterruptParameters.
847 s_FIFOInterruptParameters
848 [devpriv->s_InterruptParameters.
850 ul_OldCounterLatchValue = 0;
853 s_InterruptParameters.
856 /****************************/
857 /* Increment the write FIFO */
858 /****************************/
861 s_InterruptParameters.
862 ui_Write = (devpriv->
863 s_InterruptParameters.
865 1) % APCI1710_SAVE_INTERRUPT;
869 /**********************/
870 /* Call user function */
871 /**********************/
873 //Send a signal to from kernel to user space
874 send_sig(SIGIO, devpriv->tsk_Current,
877 } // if (ul_StatusRegister & 1)
882 /***********************/
883 /* Test if PWM counter */
884 /***********************/
886 if ((devpriv->s_BoardInfos.
887 dw_MolduleConfiguration[b_ModuleCpt] &
888 0xFFFF0000UL) == APCI1710_PWM) {
889 for (b_PWMCpt = 0; b_PWMCpt < 2; b_PWMCpt++) {
890 /*************************************/
891 /* Test if PWM interrupt initialised */
892 /*************************************/
895 s_ModuleInfo[b_ModuleCpt].
898 b_InterruptEnable == APCI1710_ENABLE) {
899 /*****************************/
900 /* Read the interrupt status */
901 /*****************************/
904 inl(devpriv->s_BoardInfos.
909 /***************************/
910 /* Test if interrupt occur */
911 /***************************/
913 if (ul_StatusRegister & 0x1) {
915 s_InterruptParameters.
916 s_FIFOInterruptParameters
918 s_InterruptParameters.
920 ul_OldInterruptMask =
921 0x4000UL << b_PWMCpt;
924 s_InterruptParameters.
925 s_FIFOInterruptParameters
927 s_InterruptParameters.
933 s_InterruptParameters.
936 /****************************/
937 /* Increment the write FIFO */
938 /****************************/
941 s_InterruptParameters.
942 ui_Write = (devpriv->
943 s_InterruptParameters.
946 APCI1710_SAVE_INTERRUPT;
950 /**********************/
951 /* Call user function */
952 /**********************/
953 //Send a signal to from kernel to user space
955 devpriv->tsk_Current,
958 } // if (ul_StatusRegister & 0x1)
959 } // if (APCI1710_ENABLE)
960 } // for (b_PWMCpt == 0; b_PWMCpt < 0; b_PWMCpt ++)
963 /***********************/
964 /* Test if tor counter */
965 /***********************/
967 if ((devpriv->s_BoardInfos.
968 dw_MolduleConfiguration[b_ModuleCpt] &
969 0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
970 for (b_TorCounterCpt = 0; b_TorCounterCpt < 2;
972 /*************************************/
973 /* Test if tor interrupt initialised */
974 /*************************************/
977 s_ModuleInfo[b_ModuleCpt].
978 s_TorCounterModuleInfo.
979 s_TorCounterInfo[b_TorCounterCpt].
980 b_InterruptEnable == APCI1710_ENABLE) {
981 /*****************************/
982 /* Read the interrupt status */
983 /*****************************/
986 inl(devpriv->s_BoardInfos.
988 (16 * b_TorCounterCpt) +
991 /***************************/
992 /* Test if interrupt occur */
993 /***************************/
995 if (ul_StatusRegister & 0x1) {
996 /******************************/
997 /* Read the tor counter value */
998 /******************************/
1000 ul_LatchRegisterValue =
1004 (16 * b_TorCounterCpt) +
1005 (64 * b_ModuleCpt));
1008 s_InterruptParameters.
1009 s_FIFOInterruptParameters
1011 s_InterruptParameters.
1013 ul_OldInterruptMask =
1018 s_InterruptParameters.
1019 s_FIFOInterruptParameters
1021 s_InterruptParameters.
1027 s_InterruptParameters.
1028 s_FIFOInterruptParameters
1030 s_InterruptParameters.
1032 ul_OldCounterLatchValue
1033 = ul_LatchRegisterValue;
1036 s_InterruptParameters.
1037 ul_InterruptOccur++;
1039 /****************************/
1040 /* Increment the write FIFO */
1041 /****************************/
1044 s_InterruptParameters.
1045 ui_Write = (devpriv->
1046 s_InterruptParameters.
1049 APCI1710_SAVE_INTERRUPT;
1051 b_InterruptFlag = 1;
1053 /**********************/
1054 /* Call user function */
1055 /**********************/
1057 //Send a signal to from kernel to user space
1059 devpriv->tsk_Current,
1061 } // if (ul_StatusRegister & 0x1)
1062 } // if (APCI1710_ENABLE)
1063 } // for (b_TorCounterCpt == 0; b_TorCounterCpt < 0; b_TorCounterCpt ++)
1066 /***********************/
1067 /* Test if chronometer */
1068 /***********************/
1070 if ((devpriv->s_BoardInfos.
1071 dw_MolduleConfiguration[b_ModuleCpt] &
1072 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
1074 //printk("APCI1710 Chrono Interrupt\n");
1075 /*****************************/
1076 /* Read the interrupt status */
1077 /*****************************/
1079 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
1080 ui_Address + 12 + (64 * b_ModuleCpt));
1082 /***************************/
1083 /* Test if interrupt occur */
1084 /***************************/
1086 if ((ul_InterruptLatchReg & 0x8) == 0x8) {
1087 /****************************/
1088 /* Clear the interrupt flag */
1089 /****************************/
1091 outl(0, devpriv->s_BoardInfos.
1092 ui_Address + 32 + (64 * b_ModuleCpt));
1094 /***************************/
1095 /* Test if continuous mode */
1096 /***************************/
1100 b_CycleMode == APCI1710_ENABLE) {
1101 /********************/
1102 /* Clear the status */
1103 /********************/
1105 outl(0, devpriv->s_BoardInfos.
1107 (64 * b_ModuleCpt));
1110 /*************************/
1111 /* Read the timing value */
1112 /*************************/
1114 ul_LatchRegisterValue =
1115 inl(devpriv->s_BoardInfos.ui_Address +
1116 4 + (64 * b_ModuleCpt));
1118 /*****************************/
1119 /* Test if interrupt enabled */
1120 /*****************************/
1123 s_ChronoModuleInfo.b_InterruptMask) {
1125 s_InterruptParameters.
1126 s_FIFOInterruptParameters
1127 [devpriv->s_InterruptParameters.
1128 ui_Write].ul_OldInterruptMask =
1132 s_InterruptParameters.
1133 s_FIFOInterruptParameters
1134 [devpriv->s_InterruptParameters.
1135 ui_Write].b_OldModuleMask =
1139 s_InterruptParameters.
1140 s_FIFOInterruptParameters
1141 [devpriv->s_InterruptParameters.
1143 ul_OldCounterLatchValue =
1144 ul_LatchRegisterValue;
1147 s_InterruptParameters.
1148 ul_InterruptOccur++;
1150 /****************************/
1151 /* Increment the write FIFO */
1152 /****************************/
1155 s_InterruptParameters.
1156 ui_Write = (devpriv->
1157 s_InterruptParameters.
1159 1) % APCI1710_SAVE_INTERRUPT;
1161 b_InterruptFlag = 1;
1163 /**********************/
1164 /* Call user function */
1165 /**********************/
1166 //Send a signal to from kernel to user space
1167 send_sig(SIGIO, devpriv->tsk_Current,
1174 /*************************/
1175 /* Test if pulse encoder */
1176 /*************************/
1178 if ((devpriv->s_BoardInfos.
1179 dw_MolduleConfiguration[b_ModuleCpt] &
1180 0xFFFF0000UL) == APCI1710_PULSE_ENCODER) {
1181 /****************************/
1182 /* Read the status register */
1183 /****************************/
1185 ul_StatusRegister = inl(devpriv->s_BoardInfos.
1186 ui_Address + 20 + (64 * b_ModuleCpt));
1188 if (ul_StatusRegister & 0xF) {
1189 for (b_PulseIncoderCpt = 0;
1190 b_PulseIncoderCpt < 4;
1191 b_PulseIncoderCpt++) {
1192 /*************************************/
1193 /* Test if pulse encoder initialised */
1194 /*************************************/
1196 if ((ps_ModuleInfo->
1197 s_PulseEncoderModuleInfo.
1199 [b_PulseIncoderCpt].
1200 b_PulseEncoderInit == 1)
1201 && (((ps_ModuleInfo->s_PulseEncoderModuleInfo.dw_SetRegister >> b_PulseIncoderCpt) & 1) == 1) && (((ul_StatusRegister >> (b_PulseIncoderCpt)) & 1) == 1)) {
1202 devpriv->s_InterruptParameters.
1203 s_FIFOInterruptParameters
1205 s_InterruptParameters.
1207 ul_OldInterruptMask =
1212 s_InterruptParameters.
1213 s_FIFOInterruptParameters
1215 s_InterruptParameters.
1221 s_InterruptParameters.
1222 s_FIFOInterruptParameters
1224 s_InterruptParameters.
1226 ul_OldCounterLatchValue
1227 = ul_LatchRegisterValue;
1230 s_InterruptParameters.
1231 ul_InterruptOccur++;
1233 /****************************/
1234 /* 0899/0224 to 1199/0225 */
1235 /****************************/
1236 /* Increment the write FIFO */
1237 /****************************/
1240 s_InterruptParameters.
1241 ui_Write = (devpriv->
1242 s_InterruptParameters.
1245 APCI1710_SAVE_INTERRUPT;
1247 b_InterruptFlag = 1;
1249 /**********************/
1250 /* Call user function */
1251 /**********************/
1252 //Send a signal to from kernel to user space
1254 devpriv->tsk_Current,