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.
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
28 +-----------------------------------------------------------------------+
29 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
30 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
31 +-----------------------------------------------------------------------+
32 | Project : API APCI1710 | Compiler : gcc |
33 | Module name : CHRONO.C | Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-----------------------------------------------------------------------+
37 | Description : APCI-1710 chronometer module |
40 +-----------------------------------------------------------------------+
42 +-----------------------------------------------------------------------+
43 | Date | Author | Description of updates |
44 +----------+-----------+------------------------------------------------+
45 | 29/06/98 | S. Weber | Digital input / output implementation |
46 |----------|-----------|------------------------------------------------|
47 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
49 +-----------------------------------------------------------------------+
52 +-----------------------------------------------------------------------+
56 +----------------------------------------------------------------------------+
58 +----------------------------------------------------------------------------+
60 #include "APCI1710_Chrono.h"
63 +----------------------------------------------------------------------------+
64 | Function Name : _INT_ i_APCI1710_InitChrono |
65 | (BYTE_ b_BoardHandle, |
67 | BYTE_ b_ChronoMode, |
68 | BYTE_ b_PCIInputClock, |
69 | BYTE_ b_TimingUnit, |
70 | ULONG_ ul_TimingInterval, |
71 | PULONG_ pul_RealTimingInterval)
73 +----------------------------------------------------------------------------+
74 | Task : Configure the chronometer operating mode (b_ChronoMode)|
75 | from selected module (b_ModulNbr). |
76 | The ul_TimingInterval and ul_TimingUnit determine the |
77 | timing base for the measurement. |
78 | The pul_RealTimingInterval return the real timing |
79 | value. You must calling this function be for you call |
80 | any other function witch access of the chronometer. |
82 | Witch this functionality from the APCI-1710 you have |
83 | the possibility to measure the timing witch two event. |
85 | The mode 0 and 1 is appropriate for period measurement.|
86 | The mode 2 and 3 is appropriate for frequent |
88 | The mode 4 to 7 is appropriate for measuring the timing|
89 | between two event. |
90 +----------------------------------------------------------------------------+
91 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
92 | BYTE_ b_ModulNbr CR_AREF(insn->chanspec) : Module number to configure |
94 | BYTE_ b_ChronoMode data[0] : Chronometer action mode |
96 | BYTE_ b_PCIInputClock data[1] : Selection from PCI bus clock|
97 | - APCI1710_30MHZ : |
98 | The PC have a PCI bus |
100 | - APCI1710_33MHZ : |
101 | The PC have a PCI bus |
102 | clock from 33 MHz |
104 | The APCI-1710 have a |
107 | BYTE_ b_TimingUnit data[2] : Base timing unity (0 to 4) |
113 | ULONG_ ul_TimingInterval : data[3] Base timing value. |
114 +----------------------------------------------------------------------------+
115 | Output Parameters : PULONG_ pul_RealTimingInterval : Real base timing |
118 +----------------------------------------------------------------------------+
119 | Return Value : 0: No error |
120 | -1: The handle parameter of the board is wrong |
121 | -2: Module selection wrong |
122 | -3: The module is not a Chronometer module |
123 | -4: Chronometer mode selection is wrong |
124 | -5: The selected PCI input clock is wrong |
125 | -6: Timing unity selection is wrong |
126 | -7: Base timing selection is wrong |
127 | -8: You can not used the 40MHz clock selection wich |
129 | -9: You can not used the 40MHz clock selection wich |
130 | this CHRONOS version |
131 +----------------------------------------------------------------------------+
134 INT i_APCI1710_InsnConfigInitChrono(comedi_device * dev, comedi_subdevice * s,
135 comedi_insn * insn, unsigned int * data)
137 INT i_ReturnValue = 0;
138 ULONG ul_TimerValue = 0;
139 ULONG ul_TimingInterval = 0;
140 ULONG ul_RealTimingInterval = 0;
141 double d_RealTimingInterval = 0;
142 DWORD dw_ModeArray[8] =
143 { 0x01, 0x05, 0x00, 0x04, 0x02, 0x0E, 0x0A, 0x06 };
144 BYTE b_ModulNbr, b_ChronoMode, b_PCIInputClock, b_TimingUnit;
146 b_ModulNbr = CR_AREF(insn->chanspec);
147 b_ChronoMode = (BYTE) data[0];
148 b_PCIInputClock = (BYTE) data[1];
149 b_TimingUnit = (BYTE) data[2];
150 ul_TimingInterval = (ULONG) data[3];
151 i_ReturnValue = insn->n;
153 /**************************/
154 /* Test the module number */
155 /**************************/
157 if (b_ModulNbr < 4) {
158 /***********************/
159 /* Test if chronometer */
160 /***********************/
162 if ((devpriv->s_BoardInfos.
163 dw_MolduleConfiguration[b_ModulNbr] &
164 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
165 /*****************************/
166 /* Test the chronometer mode */
167 /*****************************/
169 if (b_ChronoMode <= 7) {
170 /**************************/
171 /* Test the PCI bus clock */
172 /**************************/
174 if ((b_PCIInputClock == APCI1710_30MHZ) ||
175 (b_PCIInputClock == APCI1710_33MHZ) ||
176 (b_PCIInputClock == APCI1710_40MHZ)) {
177 /*************************/
178 /* Test the timing unity */
179 /*************************/
181 if (b_TimingUnit <= 4) {
182 /**********************************/
183 /* Test the base timing selection */
184 /**********************************/
186 if (((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 66) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 143165576UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 143165UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 143UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 2UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 60) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 130150240UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 130150UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 130UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 2UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 50) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 107374182UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 107374UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 107UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 1UL))) {
187 /**************************/
188 /* Test the board version */
189 /**************************/
191 if (((b_PCIInputClock == APCI1710_40MHZ) && (devpriv->s_BoardInfos.b_BoardVersion > 0)) || (b_PCIInputClock != APCI1710_40MHZ)) {
192 /************************/
193 /* Test the TOR version */
194 /************************/
196 if (((b_PCIInputClock == APCI1710_40MHZ) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131)) || (b_PCIInputClock != APCI1710_40MHZ)) {
200 /****************************************/
201 /* Calculate the timer 0 division fator */
202 /****************************************/
204 switch (b_TimingUnit) {
220 (0.001 * b_PCIInputClock));
222 /*******************/
223 /* Round the value */
224 /*******************/
226 if ((double)((double)ul_TimingInterval * (0.001 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
234 /*****************************/
235 /* Calculate the real timing */
236 /*****************************/
238 ul_RealTimingInterval
243 (0.001 * (double)b_PCIInputClock));
254 if ((double)((double)ul_TimerValue / (0.001 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
255 ul_RealTimingInterval
257 ul_RealTimingInterval
272 if (b_PCIInputClock != APCI1710_40MHZ) {
300 (1.0 * b_PCIInputClock));
302 /*******************/
303 /* Round the value */
304 /*******************/
306 if ((double)((double)ul_TimingInterval * (1.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
314 /*****************************/
315 /* Calculate the real timing */
316 /*****************************/
318 ul_RealTimingInterval
323 (1.0 * (double)b_PCIInputClock));
336 if ((double)((double)ul_TimerValue / (1.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
337 ul_RealTimingInterval
339 ul_RealTimingInterval
354 if (b_PCIInputClock != APCI1710_40MHZ) {
385 /*******************/
386 /* Round the value */
387 /*******************/
389 if ((double)((double)ul_TimingInterval * (1000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
397 /*****************************/
398 /* Calculate the real timing */
399 /*****************************/
401 ul_RealTimingInterval
406 (1000.0 * (double)b_PCIInputClock));
417 if ((double)((double)ul_TimerValue / (1000.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
418 ul_RealTimingInterval
420 ul_RealTimingInterval
435 if (b_PCIInputClock != APCI1710_40MHZ) {
467 /*******************/
468 /* Round the value */
469 /*******************/
471 if ((double)((double)ul_TimingInterval * (1000000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
479 /*****************************/
480 /* Calculate the real timing */
481 /*****************************/
483 ul_RealTimingInterval
502 if ((double)((double)ul_TimerValue / (1000000.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
503 ul_RealTimingInterval
505 ul_RealTimingInterval
520 if (b_PCIInputClock != APCI1710_40MHZ) {
555 /*******************/
556 /* Round the value */
557 /*******************/
559 if ((double)((double)(ul_TimingInterval * 60.0) * (1000000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
567 /*****************************/
568 /* Calculate the real timing */
569 /*****************************/
571 ul_RealTimingInterval
588 (0.001 * (double)b_PCIInputClock)) / 60.0;
590 if ((double)(((double)ul_TimerValue / (1000000.0 * (double)b_PCIInputClock)) / 60.0) >= (double)((double)ul_RealTimingInterval + 0.5)) {
591 ul_RealTimingInterval
593 ul_RealTimingInterval
608 if (b_PCIInputClock != APCI1710_40MHZ) {
624 /****************************/
625 /* Save the PCI input clock */
626 /****************************/
636 /*************************/
637 /* Save the timing unity */
638 /*************************/
648 /************************/
649 /* Save the base timing */
650 /************************/
658 d_RealTimingInterval;
660 /****************************/
661 /* Set the chronometer mode */
662 /****************************/
673 /***********************/
674 /* Test if 40 MHz used */
675 /***********************/
677 if (b_PCIInputClock == APCI1710_40MHZ) {
693 outl(devpriv->s_ModuleInfo[b_ModulNbr].s_ChronoModuleInfo.dw_ConfigReg, devpriv->s_BoardInfos.ui_Address + 16 + (64 * b_ModulNbr));
695 /***********************/
696 /* Write timer 0 value */
697 /***********************/
699 outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr));
701 /*********************/
702 /* Chronometer init. */
703 /*********************/
713 /***********************************************/
714 /* TOR version error for 40MHz clock selection */
715 /***********************************************/
717 DPRINTK("TOR version error for 40MHz clock selection\n");
723 /**************************************************************/
724 /* You can not used the 40MHz clock selection wich this board */
725 /**************************************************************/
727 DPRINTK("You can not used the 40MHz clock selection wich this board\n");
732 /**********************************/
733 /* Base timing selection is wrong */
734 /**********************************/
736 DPRINTK("Base timing selection is wrong\n");
739 } // if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4))
741 /***********************************/
742 /* Timing unity selection is wrong */
743 /***********************************/
745 DPRINTK("Timing unity selection is wrong\n");
747 } // if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4))
748 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ))
750 /*****************************************/
751 /* The selected PCI input clock is wrong */
752 /*****************************************/
754 DPRINTK("The selected PCI input clock is wrong\n");
756 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ))
757 } // if (b_ChronoMode >= 0 && b_ChronoMode <= 7)
759 /***************************************/
760 /* Chronometer mode selection is wrong */
761 /***************************************/
763 DPRINTK("Chronometer mode selection is wrong\n");
765 } // if (b_ChronoMode >= 0 && b_ChronoMode <= 7)
767 /******************************************/
768 /* The module is not a Chronometer module */
769 /******************************************/
771 DPRINTK("The module is not a Chronometer module\n");
775 /***********************/
776 /* Module number error */
777 /***********************/
779 DPRINTK("Module number error\n");
782 data[0] = ul_RealTimingInterval;
783 return (i_ReturnValue);
787 +----------------------------------------------------------------------------+
788 | Function Name : _INT_ i_APCI1710_EnableChrono |
789 | (BYTE_ b_BoardHandle, |
790 | BYTE_ b_ModulNbr, |
791 | BYTE_ b_CycleMode, |
792 | BYTE_ b_InterruptEnable)
793 INT i_APCI1710_InsnWriteEnableDisableChrono(comedi_device *dev,
794 comedi_subdevice *s,comedi_insn *insn,unsigned int *data) |
795 +----------------------------------------------------------------------------+
796 | Task : Enable the chronometer from selected module |
797 | (b_ModulNbr). You must calling the |
798 | "i_APCI1710_InitChrono" function be for you call this |
800 | If you enable the chronometer interrupt, the |
801 | chronometer generate a interrupt after the stop signal.|
802 | See function "i_APCI1710_SetBoardIntRoutineX" and the |
803 | Interrupt mask description chapter from this manual. |
804 | The b_CycleMode parameter determine if you will |
805 | measured a single or more cycle.
807 | Disable the chronometer from selected module |
808 | (b_ModulNbr). If you disable the chronometer after a |
809 | start signal occur and you restart the chronometer |
810 | witch the " i_APCI1710_EnableChrono" function, if no |
811 | stop signal occur this start signal is ignored.
812 +----------------------------------------------------------------------------+
813 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
814 | BYTE_ b_ModulNbr CR_AREF(chanspec) : Selected module number (0 to 3) |
815 data[0] ENABle/Disable chrono
816 | BYTE_ b_CycleMode : Selected the chronometer |
817 | data[1] acquisition mode |
818 | BYTE_ b_InterruptEnable : Enable or disable the |
819 | data[2] chronometer interrupt. |
821 | Enable the chronometer |
823 | APCI1710_DISABLE: |
824 | Disable the chronometer |
826 +----------------------------------------------------------------------------+
827 | Output Parameters : - |
828 +----------------------------------------------------------------------------+
829 | Return Value : 0: No error |
830 | -1: The handle parameter of the board is wrong |
831 | -2: Module selection wrong |
832 | -3: The module is not a Chronometer module |
833 | -4: Chronometer not initialised see function |
834 | "i_APCI1710_InitChrono" |
835 | -5: Chronometer acquisition mode cycle is wrong |
836 | -6: Interrupt parameter is wrong |
837 | -7: Interrupt function not initialised. |
838 | See function "i_APCI1710_SetBoardIntRoutineX"
839 -8: data[0] wrong input |
840 +----------------------------------------------------------------------------+
843 INT i_APCI1710_InsnWriteEnableDisableChrono(comedi_device * dev,
844 comedi_subdevice * s, comedi_insn * insn, unsigned int * data)
846 INT i_ReturnValue = 0;
847 BYTE b_ModulNbr, b_CycleMode, b_InterruptEnable, b_Action;
848 b_ModulNbr = CR_AREF(insn->chanspec);
849 b_Action = (BYTE) data[0];
850 b_CycleMode = (BYTE) data[1];
851 b_InterruptEnable = (BYTE) data[2];
852 i_ReturnValue = insn->n;
854 /**************************/
855 /* Test the module number */
856 /**************************/
858 if (b_ModulNbr < 4) {
859 /***********************/
860 /* Test if chronometer */
861 /***********************/
863 if ((devpriv->s_BoardInfos.
864 dw_MolduleConfiguration[b_ModulNbr] &
865 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
866 /***********************************/
867 /* Test if chronometer initialised */
868 /***********************************/
870 if (devpriv->s_ModuleInfo[b_ModulNbr].
871 s_ChronoModuleInfo.b_ChronoInit == 1) {
875 case APCI1710_ENABLE:
877 /*********************************/
878 /* Test the cycle mode parameter */
879 /*********************************/
881 if ((b_CycleMode == APCI1710_SINGLE)
883 APCI1710_CONTINUOUS)) {
884 /***************************/
885 /* Test the interrupt flag */
886 /***************************/
888 if ((b_InterruptEnable ==
890 || (b_InterruptEnable ==
894 /***************************/
895 /* Save the interrupt flag */
896 /***************************/
906 /***********************/
907 /* Save the cycle mode */
908 /***********************/
933 /*****************************/
934 /* Test if interrupt enabled */
935 /*****************************/
937 if (b_InterruptEnable ==
940 /****************************/
941 /* Clear the interrupt flag */
942 /****************************/
954 devpriv->tsk_Current = current; // Save the current process task structure
957 /***********************************/
958 /* Enable or disable the interrupt */
959 /* Enable the chronometer */
960 /***********************************/
973 /*************************/
974 /* Clear status register */
975 /*************************/
983 } // if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE))
985 /********************************/
986 /* Interrupt parameter is wrong */
987 /********************************/
989 DPRINTK("Interrupt parameter is wrong\n");
991 } // if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE))
992 } // if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS))
994 /***********************************************/
995 /* Chronometer acquisition mode cycle is wrong */
996 /***********************************************/
998 DPRINTK("Chronometer acquisition mode cycle is wrong\n");
1000 } // if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS))
1003 case APCI1710_DISABLE:
1005 devpriv->s_ModuleInfo[b_ModulNbr].
1007 b_InterruptMask = 0;
1009 devpriv->s_ModuleInfo[b_ModulNbr].
1013 s_ModuleInfo[b_ModulNbr].
1015 dw_ConfigReg & 0x2F;
1017 /***************************/
1018 /* Disable the interrupt */
1019 /* Disable the chronometer */
1020 /***************************/
1022 outl(devpriv->s_ModuleInfo[b_ModulNbr].
1023 s_ChronoModuleInfo.dw_ConfigReg,
1024 devpriv->s_BoardInfos.
1028 /***************************/
1029 /* Test if continuous mode */
1030 /***************************/
1032 if (devpriv->s_ModuleInfo[b_ModulNbr].
1035 APCI1710_CONTINUOUS) {
1036 /*************************/
1037 /* Clear status register */
1038 /*************************/
1040 outl(0, devpriv->s_BoardInfos.
1047 DPRINTK("Inputs wrong! Enable or Disable chrono\n");
1049 } // switch ENABLE/DISABLE
1051 /*******************************/
1052 /* Chronometer not initialised */
1053 /*******************************/
1055 DPRINTK("Chronometer not initialised\n");
1059 /******************************************/
1060 /* The module is not a Chronometer module */
1061 /******************************************/
1063 DPRINTK("The module is not a Chronometer module\n");
1067 /***********************/
1068 /* Module number error */
1069 /***********************/
1071 DPRINTK("Module number error\n");
1075 return (i_ReturnValue);
1079 +----------------------------------------------------------------------------+
1080 | Function Name :INT i_APCI1710_InsnReadChrono(comedi_device *dev,comedi_subdevice *s,
1081 comedi_insn *insn,unsigned int *data) |
1082 +----------------------------------------------------------------------------+
1083 | Task : Read functions for Timer |
1084 +----------------------------------------------------------------------------+
1085 | Input Parameters :
1086 +----------------------------------------------------------------------------+
1087 | Output Parameters : - |
1088 +----------------------------------------------------------------------------+
1090 +----------------------------------------------------------------------------+
1093 INT i_APCI1710_InsnReadChrono(comedi_device * dev, comedi_subdevice * s,
1094 comedi_insn * insn, unsigned int * data)
1097 INT i_ReturnValue = insn->n;
1099 b_ReadType = CR_CHAN(insn->chanspec);
1101 switch (b_ReadType) {
1102 case APCI1710_CHRONO_PROGRESS_STATUS:
1103 i_ReturnValue = i_APCI1710_GetChronoProgressStatus(dev,
1104 (BYTE) CR_AREF(insn->chanspec), (PBYTE) & data[0]);
1107 case APCI1710_CHRONO_READVALUE:
1108 i_ReturnValue = i_APCI1710_ReadChronoValue(dev,
1109 (BYTE) CR_AREF(insn->chanspec),
1110 (UINT) insn->unused[0],
1111 (PBYTE) & data[0], (PULONG) & data[1]);
1114 case APCI1710_CHRONO_CONVERTVALUE:
1115 i_ReturnValue = i_APCI1710_ConvertChronoValue(dev,
1116 (BYTE) CR_AREF(insn->chanspec),
1117 (ULONG) insn->unused[0],
1122 (PUINT) & data[4], (PUINT) & data[5]);
1125 case APCI1710_CHRONO_READINTERRUPT:
1126 printk("In Chrono Read Interrupt\n");
1128 data[0] = devpriv->s_InterruptParameters.
1129 s_FIFOInterruptParameters[devpriv->
1130 s_InterruptParameters.ui_Read].b_OldModuleMask;
1131 data[1] = devpriv->s_InterruptParameters.
1132 s_FIFOInterruptParameters[devpriv->
1133 s_InterruptParameters.ui_Read].ul_OldInterruptMask;
1134 data[2] = devpriv->s_InterruptParameters.
1135 s_FIFOInterruptParameters[devpriv->
1136 s_InterruptParameters.ui_Read].ul_OldCounterLatchValue;
1138 /**************************/
1139 /* Increment the read FIFO */
1140 /***************************/
1143 s_InterruptParameters.
1144 ui_Read = (devpriv->
1145 s_InterruptParameters.
1146 ui_Read + 1) % APCI1710_SAVE_INTERRUPT;
1150 printk("ReadType Parameter wrong\n");
1153 if (i_ReturnValue >= 0)
1154 i_ReturnValue = insn->n;
1155 return (i_ReturnValue);
1160 +----------------------------------------------------------------------------+
1161 | Function Name : _INT_ i_APCI1710_GetChronoProgressStatus |
1162 | (BYTE_ b_BoardHandle, |
1163 | BYTE_ b_ModulNbr, |
1164 | PBYTE_ pb_ChronoStatus) |
1165 +----------------------------------------------------------------------------+
1166 | Task : Return the chronometer status (pb_ChronoStatus) from |
1167 | selected chronometer module (b_ModulNbr). |
1168 +----------------------------------------------------------------------------+
1169 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
1170 | BYTE_ b_ModulNbr : Selected module number (0 to 3) |
1171 +----------------------------------------------------------------------------+
1172 | Output Parameters : PULONG_ pb_ChronoStatus : Return the chronometer |
1174 | 0 : Measurement not started.|
1175 | No start signal occur. |
1176 | 1 : Measurement started. |
1177 | A start signal occur. |
1178 | 2 : Measurement stopped. |
1179 | A stop signal occur. |
1180 | The measurement is |
1182 | 3: A overflow occur. You |
1183 | must change the base |
1184 | timing witch the |
1186 | "i_APCI1710_InitChrono" |
1187 +----------------------------------------------------------------------------+
1188 | Return Value : 0: No error |
1189 | -1: The handle parameter of the board is wrong |
1190 | -2: Module selection wrong |
1191 | -3: The module is not a Chronometer module |
1192 | -4: Chronometer not initialised see function |
1193 | "i_APCI1710_InitChrono" |
1194 +----------------------------------------------------------------------------+
1197 INT i_APCI1710_GetChronoProgressStatus(comedi_device * dev,
1198 BYTE b_ModulNbr, PBYTE pb_ChronoStatus)
1200 INT i_ReturnValue = 0;
1203 /**************************/
1204 /* Test the module number */
1205 /**************************/
1207 if (b_ModulNbr < 4) {
1208 /***********************/
1209 /* Test if chronometer */
1210 /***********************/
1212 if ((devpriv->s_BoardInfos.
1213 dw_MolduleConfiguration[b_ModulNbr] &
1214 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
1215 /***********************************/
1216 /* Test if chronometer initialised */
1217 /***********************************/
1220 s_ModuleInfo[b_ModulNbr].
1221 s_ChronoModuleInfo.b_ChronoInit == 1) {
1223 dw_Status = inl(devpriv->s_BoardInfos.
1224 ui_Address + 8 + (64 * b_ModulNbr));
1226 /********************/
1227 /* Test if overflow */
1228 /********************/
1230 if ((dw_Status & 8) == 8) {
1231 /******************/
1232 /* Overflow occur */
1233 /******************/
1235 *pb_ChronoStatus = 3;
1236 } // if ((dw_Status & 8) == 8)
1238 /*******************************/
1239 /* Test if measurement stopped */
1240 /*******************************/
1242 if ((dw_Status & 2) == 2) {
1243 /***********************/
1244 /* A stop signal occur */
1245 /***********************/
1247 *pb_ChronoStatus = 2;
1248 } // if ((dw_Status & 2) == 2)
1250 /*******************************/
1251 /* Test if measurement started */
1252 /*******************************/
1254 if ((dw_Status & 1) == 1) {
1255 /************************/
1256 /* A start signal occur */
1257 /************************/
1259 *pb_ChronoStatus = 1;
1260 } // if ((dw_Status & 1) == 1)
1262 /***************************/
1263 /* Measurement not started */
1264 /***************************/
1266 *pb_ChronoStatus = 0;
1267 } // if ((dw_Status & 1) == 1)
1268 } // if ((dw_Status & 2) == 2)
1269 } // if ((dw_Status & 8) == 8)
1271 /*******************************/
1272 /* Chronometer not initialised */
1273 /*******************************/
1274 DPRINTK("Chronometer not initialised\n");
1278 /******************************************/
1279 /* The module is not a Chronometer module */
1280 /******************************************/
1281 DPRINTK("The module is not a Chronometer module\n");
1285 /***********************/
1286 /* Module number error */
1287 /***********************/
1288 DPRINTK("Module number error\n");
1292 return (i_ReturnValue);
1296 +----------------------------------------------------------------------------+
1297 | Function Name : _INT_ i_APCI1710_ReadChronoValue |
1298 | (BYTE_ b_BoardHandle, |
1299 | BYTE_ b_ModulNbr, |
1300 | UINT_ ui_TimeOut, |
1301 | PBYTE_ pb_ChronoStatus, |
1302 | PULONG_ pul_ChronoValue) |
1303 +----------------------------------------------------------------------------+
1304 | Task : Return the chronometer status (pb_ChronoStatus) and the|
1305 | timing value (pul_ChronoValue) after a stop signal |
1306 | occur from selected chronometer module (b_ModulNbr). |
1307 | This function are only avaible if you have disabled |
1308 | the interrupt functionality. See function |
1309 | "i_APCI1710_EnableChrono" and the Interrupt mask |
1310 | description chapter. |
1311 | You can test the chronometer status witch the |
1312 | "i_APCI1710_GetChronoProgressStatus" function. |
1314 | The returned value from pul_ChronoValue parameter is |
1315 | not real measured timing. |
1316 | You must used the "i_APCI1710_ConvertChronoValue" |
1317 | function or make this operation for calculate the |
1320 | Timing = pul_ChronoValue * pul_RealTimingInterval. |
1322 | pul_RealTimingInterval is the returned parameter from |
1323 | "i_APCI1710_InitChrono" function and the time unity is |
1324 | the b_TimingUnit from "i_APCI1710_InitChrono" function|
1325 +----------------------------------------------------------------------------+
1326 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
1327 | BYTE_ b_ModulNbr : Selected module number (0 to 3) |
1328 +----------------------------------------------------------------------------+
1329 | Output Parameters : PULONG_ pb_ChronoStatus : Return the chronometer |
1331 | 0 : Measurement not started.|
1332 | No start signal occur. |
1333 | 1 : Measurement started. |
1334 | A start signal occur. |
1335 | 2 : Measurement stopped. |
1336 | A stop signal occur. |
1337 | The measurement is |
1339 | 3: A overflow occur. You |
1340 | must change the base |
1341 | timing witch the |
1343 | "i_APCI1710_InitChrono" |
1344 | PULONG pul_ChronoValue : Chronometer timing value. |
1345 +----------------------------------------------------------------------------+
1346 | Return Value : 0: No error |
1347 | -1: The handle parameter of the board is wrong |
1348 | -2: Module selection wrong |
1349 | -3: The module is not a Chronometer module |
1350 | -4: Chronometer not initialised see function |
1351 | "i_APCI1710_InitChrono" |
1352 | -5: Timeout parameter is wrong (0 to 65535) |
1353 | -6: Interrupt routine installed. You can not read |
1354 | directly the chronometer measured timing. |
1355 +----------------------------------------------------------------------------+
1358 INT i_APCI1710_ReadChronoValue(comedi_device * dev,
1360 UINT ui_TimeOut, PBYTE pb_ChronoStatus, PULONG pul_ChronoValue)
1362 INT i_ReturnValue = 0;
1364 DWORD dw_TimeOut = 0;
1366 /**************************/
1367 /* Test the module number */
1368 /**************************/
1370 if (b_ModulNbr < 4) {
1371 /***********************/
1372 /* Test if chronometer */
1373 /***********************/
1375 if ((devpriv->s_BoardInfos.
1376 dw_MolduleConfiguration[b_ModulNbr] &
1377 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
1378 /***********************************/
1379 /* Test if chronometer initialised */
1380 /***********************************/
1383 s_ModuleInfo[b_ModulNbr].
1384 s_ChronoModuleInfo.b_ChronoInit == 1) {
1385 /*****************************/
1386 /* Test the timout parameter */
1387 /*****************************/
1389 if ((ui_TimeOut >= 0)
1390 && (ui_TimeOut <= 65535UL)) {
1393 /*******************/
1394 /* Read the status */
1395 /*******************/
1403 /********************/
1404 /* Test if overflow */
1405 /********************/
1407 if ((dw_Status & 8) == 8) {
1408 /******************/
1409 /* Overflow occur */
1410 /******************/
1412 *pb_ChronoStatus = 3;
1414 /***************************/
1415 /* Test if continuous mode */
1416 /***************************/
1423 APCI1710_CONTINUOUS)
1425 /*************************/
1426 /* Clear status register */
1427 /*************************/
1429 outl(0, devpriv->s_BoardInfos.ui_Address + 36 + (64 * b_ModulNbr));
1433 } // if ((dw_Status & 8) == 8)
1435 /*******************************/
1436 /* Test if measurement stopped */
1437 /*******************************/
1439 if ((dw_Status & 2) ==
1441 /***********************/
1442 /* A stop signal occur */
1443 /***********************/
1448 /***************************/
1449 /* Test if continnous mode */
1450 /***************************/
1458 APCI1710_CONTINUOUS)
1460 /*************************/
1461 /* Clear status register */
1462 /*************************/
1464 outl(0, devpriv->s_BoardInfos.ui_Address + 36 + (64 * b_ModulNbr));
1467 } // if ((dw_Status & 2) == 2)
1469 /*******************************/
1470 /* Test if measurement started */
1471 /*******************************/
1473 if ((dw_Status & 1) == 1) {
1474 /************************/
1475 /* A start signal occur */
1476 /************************/
1481 } // if ((dw_Status & 1) == 1)
1483 /***************************/
1484 /* Measurement not started */
1485 /***************************/
1490 } // if ((dw_Status & 1) == 1)
1491 } // if ((dw_Status & 2) == 2)
1492 } // if ((dw_Status & 8) == 8)
1494 if (dw_TimeOut == ui_TimeOut) {
1501 /*************************/
1502 /* Increment the timeout */
1503 /*************************/
1512 /*****************************/
1513 /* Test if stop signal occur */
1514 /*****************************/
1516 if (*pb_ChronoStatus == 2) {
1517 /**********************************/
1518 /* Read the measured timing value */
1519 /**********************************/
1527 if (*pul_ChronoValue != 0) {
1533 /*************************/
1534 /* Test if timeout occur */
1535 /*************************/
1537 if ((*pb_ChronoStatus != 3)
1540 && (ui_TimeOut != 0)) {
1545 *pb_ChronoStatus = 4;
1550 /******************************/
1551 /* Timeout parameter is wrong */
1552 /******************************/
1553 DPRINTK("Timeout parameter is wrong\n");
1557 /*******************************/
1558 /* Chronometer not initialised */
1559 /*******************************/
1560 DPRINTK("Chronometer not initialised\n");
1564 /******************************************/
1565 /* The module is not a Chronometer module */
1566 /******************************************/
1567 DPRINTK("The module is not a Chronometer module\n");
1571 /***********************/
1572 /* Module number error */
1573 /***********************/
1574 DPRINTK("Module number error\n");
1578 return (i_ReturnValue);
1582 +----------------------------------------------------------------------------+
1583 | Function Name : _INT_ i_APCI1710_ConvertChronoValue |
1584 | (BYTE_ b_BoardHandle, |
1585 | BYTE_ b_ModulNbr, |
1586 | ULONG_ ul_ChronoValue, |
1587 | PULONG_ pul_Hour, |
1588 | PBYTE_ pb_Minute, |
1589 | PBYTE_ pb_Second, |
1590 | PUINT_ pui_MilliSecond, |
1591 | PUINT_ pui_MicroSecond, |
1592 | PUINT_ pui_NanoSecond) |
1593 +----------------------------------------------------------------------------+
1594 | Task : Convert the chronometer measured timing |
1595 | (ul_ChronoValue) in to h, mn, s, ms, µs, ns. |
1596 +----------------------------------------------------------------------------+
1597 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
1598 | BYTE_ b_ModulNbr : Selected module number (0 to 3)|
1599 | ULONG_ ul_ChronoValue : Measured chronometer timing |
1601 | See"i_APCI1710_ReadChronoValue"|
1602 +----------------------------------------------------------------------------+
1603 | Output Parameters : PULONG_ pul_Hour : Chronometer timing hour |
1604 | PBYTE_ pb_Minute : Chronometer timing minute |
1605 | PBYTE_ pb_Second : Chronometer timing second |
1606 | PUINT_ pui_MilliSecond : Chronometer timing mini |
1608 | PUINT_ pui_MicroSecond : Chronometer timing micro |
1610 | PUINT_ pui_NanoSecond : Chronometer timing nano |
1612 +----------------------------------------------------------------------------+
1613 | Return Value : 0: No error |
1614 | -1: The handle parameter of the board is wrong |
1615 | -2: Module selection wrong |
1616 | -3: The module is not a Chronometer module |
1617 | -4: Chronometer not initialised see function |
1618 | "i_APCI1710_InitChrono" |
1619 +----------------------------------------------------------------------------+
1622 INT i_APCI1710_ConvertChronoValue(comedi_device * dev,
1624 ULONG ul_ChronoValue,
1628 PUINT pui_MilliSecond, PUINT pui_MicroSecond, PUINT pui_NanoSecond)
1630 INT i_ReturnValue = 0;
1634 double d_MilliSecond;
1635 double d_MicroSecond;
1636 double d_NanoSecond;
1638 /**************************/
1639 /* Test the module number */
1640 /**************************/
1642 if (b_ModulNbr < 4) {
1643 /***********************/
1644 /* Test if chronometer */
1645 /***********************/
1647 if ((devpriv->s_BoardInfos.
1648 dw_MolduleConfiguration[b_ModulNbr] &
1649 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
1650 /***********************************/
1651 /* Test if chronometer initialised */
1652 /***********************************/
1655 s_ModuleInfo[b_ModulNbr].
1656 s_ChronoModuleInfo.b_ChronoInit == 1) {
1659 d_Hour = (double)ul_ChronoValue *(double)
1660 devpriv->s_ModuleInfo[b_ModulNbr].
1661 s_ChronoModuleInfo.d_TimingInterval;
1664 s_ModuleInfo[b_ModulNbr].
1665 s_ChronoModuleInfo.b_TimingUnit) {
1667 d_Hour = d_Hour / (double)1000.0;
1670 d_Hour = d_Hour / (double)1000.0;
1673 d_Hour = d_Hour / (double)1000.0;
1676 d_Hour = d_Hour / (double)60.0;
1679 /**********************/
1680 /* Calculate the hour */
1681 /**********************/
1683 d_Hour = d_Hour / (double)60.0;
1684 *pul_Hour = (ULONG) d_Hour;
1686 /************************/
1687 /* Calculate the minute */
1688 /************************/
1690 d_Minute = d_Hour - *pul_Hour;
1691 d_Minute = d_Minute * 60;
1692 *pb_Minute = (BYTE) d_Minute;
1694 /************************/
1695 /* Calculate the second */
1696 /************************/
1698 d_Second = d_Minute - *pb_Minute;
1699 d_Second = d_Second * 60;
1700 *pb_Second = (BYTE) d_Second;
1702 /*****************************/
1703 /* Calculate the mini second */
1704 /*****************************/
1706 d_MilliSecond = d_Second - *pb_Second;
1707 d_MilliSecond = d_MilliSecond * 1000;
1708 *pui_MilliSecond = (UINT) d_MilliSecond;
1710 /******************************/
1711 /* Calculate the micro second */
1712 /******************************/
1717 d_MicroSecond = d_MicroSecond * 1000;
1718 *pui_MicroSecond = (UINT) d_MicroSecond;
1720 /******************************/
1721 /* Calculate the micro second */
1722 /******************************/
1727 d_NanoSecond = d_NanoSecond * 1000;
1728 *pui_NanoSecond = (UINT) d_NanoSecond;
1734 /*******************************/
1735 /* Chronometer not initialised */
1736 /*******************************/
1737 DPRINTK("Chronometer not initialised\n");
1741 /******************************************/
1742 /* The module is not a Chronometer module */
1743 /******************************************/
1744 DPRINTK("The module is not a Chronometer module\n");
1748 /***********************/
1749 /* Module number error */
1750 /***********************/
1751 DPRINTK("Module number error\n");
1755 return (i_ReturnValue);
1759 +----------------------------------------------------------------------------+
1760 | Function Name : INT i_APCI1710_InsnBitsChronoDigitalIO(comedi_device *dev,comedi_subdevice *s,
1761 comedi_insn *insn,unsigned int *data) |
1762 +----------------------------------------------------------------------------+
1763 | Task : Sets the output witch has been passed with the |
1764 | parameter b_Channel. Setting an output means setting an|
1766 +----------------------------------------------------------------------------+
1767 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
1768 | BYTE_ b_ModulNbr : Selected module number (0 to 3)|
1769 | BYTE_ b_OutputChannel : Selection from digital output |
1770 | CR_CHAN() channel (0 to 2) |
1774 +----------------------------------------------------------------------------+
1775 | Output Parameters : - |
1776 +----------------------------------------------------------------------------+
1777 | Return Value : 0: No error |
1778 | -1: The handle parameter of the board is wrong |
1779 | -2: Module selection wrong |
1780 | -3: The module is not a Chronometer module |
1781 | -4: The selected digital output is wrong |
1782 | -5: Chronometer not initialised see function |
1783 | "i_APCI1710_InitChrono" |
1784 +----------------------------------------------------------------------------+
1788 +----------------------------------------------------------------------------+
1789 | Function Name : _INT_ i_APCI1710_SetChronoChlOff |
1790 | (BYTE_ b_BoardHandle, |
1791 | BYTE_ b_ModulNbr, |
1792 | BYTE_ b_OutputChannel) |
1793 +----------------------------------------------------------------------------+
1794 | Task : Resets the output witch has been passed with the |
1795 | parameter b_Channel. Resetting an output means setting |
1797 +----------------------------------------------------------------------------+
1798 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710
1799 data[0] : Chl ON, Chl OFF , Chl Read , Port Read
1801 | BYTE_ b_ModulNbr CR_AREF : Selected module number (0 to 3)|
1802 | BYTE_ b_OutputChannel CR_CHAN : Selection from digital output |
1803 | channel (0 to 2) |
1807 +----------------------------------------------------------------------------+
1808 | Output Parameters : - |
1809 +----------------------------------------------------------------------------+
1810 | Return Value : 0: No error |
1811 | -1: The handle parameter of the board is wrong |
1812 | -2: Module selection wrong |
1813 | -3: The module is not a Chronometer module |
1814 | -4: The selected digital output is wrong |
1815 | -5: Chronometer not initialised see function |
1816 | "i_APCI1710_InitChrono" |
1817 +----------------------------------------------------------------------------+
1821 +----------------------------------------------------------------------------+
1822 | Function Name : _INT_ i_APCI1710_ReadChronoChlValue |
1823 | (BYTE_ b_BoardHandle, |
1824 | BYTE_ b_ModulNbr, |
1825 | BYTE_ b_InputChannel, |
1826 | PBYTE_ pb_ChannelStatus) |
1827 +----------------------------------------------------------------------------+
1828 | Task : Return the status from selected digital input |
1829 | (b_InputChannel) from selected chronometer |
1830 | module (b_ModulNbr). |
1831 +----------------------------------------------------------------------------+
1832 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
1833 | BYTE_ b_ModulNbr : Selected module number (0 to 3)|
1834 | BYTE_ b_InputChannel : Selection from digital input |
1835 | channel (0 to 2) |
1836 | CR_CHAN() 0 : Channel E |
1839 +----------------------------------------------------------------------------+
1840 | Output Parameters : PBYTE_ pb_ChannelStatus : Digital input channel status.|
1841 | data[0] 0 : Channel is not active |
1842 | 1 : Channel is active |
1843 +----------------------------------------------------------------------------+
1844 | Return Value : 0: No error |
1845 | -1: The handle parameter of the board is wrong |
1846 | -2: Module selection wrong |
1847 | -3: The module is not a Chronometer module |
1848 | -4: The selected digital input is wrong |
1849 | -5: Chronometer not initialised see function |
1850 | "i_APCI1710_InitChrono" |
1851 +----------------------------------------------------------------------------+
1855 +----------------------------------------------------------------------------+
1856 | Function Name : _INT_ i_APCI1710_ReadChronoPortValue |
1857 | (BYTE_ b_BoardHandle, |
1858 | BYTE_ b_ModulNbr, |
1859 | PBYTE_ pb_PortValue) |
1860 +----------------------------------------------------------------------------+
1861 | Task : Return the status from digital inputs port from |
1862 | selected (b_ModulNbr) chronometer module. |
1863 +----------------------------------------------------------------------------+
1864 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
1865 | BYTE_ b_ModulNbr : Selected module number (0 to 3)|
1866 +----------------------------------------------------------------------------+
1867 | Output Parameters : PBYTE_ pb_PortValue : Digital inputs port status.
1869 +----------------------------------------------------------------------------+
1870 | Return Value : 0: No error |
1871 | -1: The handle parameter of the board is wrong |
1872 | -2: Module selection wrong |
1873 | -3: The module is not a Chronometer module |
1874 | -4: Chronometer not initialised see function |
1875 | "i_APCI1710_InitChrono" |
1876 +----------------------------------------------------------------------------+
1879 INT i_APCI1710_InsnBitsChronoDigitalIO(comedi_device * dev,
1880 comedi_subdevice * s, comedi_insn * insn, unsigned int * data)
1882 INT i_ReturnValue = 0;
1883 BYTE b_ModulNbr, b_OutputChannel, b_InputChannel, b_IOType;
1885 PBYTE pb_ChannelStatus;
1888 b_ModulNbr = CR_AREF(insn->chanspec);
1889 i_ReturnValue = insn->n;
1890 b_IOType = (BYTE) data[0];
1892 /**************************/
1893 /* Test the module number */
1894 /**************************/
1896 if (b_ModulNbr < 4) {
1897 /***********************/
1898 /* Test if chronometer */
1899 /***********************/
1901 if ((devpriv->s_BoardInfos.
1902 dw_MolduleConfiguration[b_ModulNbr] &
1903 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
1904 /***********************************/
1905 /* Test if chronometer initialised */
1906 /***********************************/
1908 if (devpriv->s_ModuleInfo[b_ModulNbr].
1909 s_ChronoModuleInfo.b_ChronoInit == 1) {
1910 /***********************************/
1911 /* Test the digital output channel */
1912 /***********************************/
1915 case APCI1710_CHRONO_SET_CHANNELOFF:
1918 (BYTE) CR_CHAN(insn->chanspec);
1919 if (b_OutputChannel <= 2) {
1921 outl(0, devpriv->s_BoardInfos.
1923 (b_OutputChannel * 4) +
1925 } // if ((b_OutputChannel >= 0) && (b_OutputChannel <= 2))
1927 /****************************************/
1928 /* The selected digital output is wrong */
1929 /****************************************/
1931 DPRINTK("The selected digital output is wrong\n");
1934 } // if ((b_OutputChannel >= 0) && (b_OutputChannel <= 2))
1938 case APCI1710_CHRONO_SET_CHANNELON:
1941 (BYTE) CR_CHAN(insn->chanspec);
1942 if (b_OutputChannel <= 2) {
1944 outl(1, devpriv->s_BoardInfos.
1946 (b_OutputChannel * 4) +
1948 } // if ((b_OutputChannel >= 0) && (b_OutputChannel <= 2))
1950 /****************************************/
1951 /* The selected digital output is wrong */
1952 /****************************************/
1954 DPRINTK("The selected digital output is wrong\n");
1957 } // if ((b_OutputChannel >= 0) && (b_OutputChannel <= 2))
1961 case APCI1710_CHRONO_READ_CHANNEL:
1962 /**********************************/
1963 /* Test the digital input channel */
1964 /**********************************/
1965 pb_ChannelStatus = (PBYTE) & data[0];
1967 (BYTE) CR_CHAN(insn->chanspec);
1969 if (b_InputChannel <= 2) {
1978 (BYTE) (((dw_Status >>
1981 } // if ((b_InputChannel >= 0) && (b_InputChannel <= 2))
1983 /***************************************/
1984 /* The selected digital input is wrong */
1985 /***************************************/
1987 DPRINTK("The selected digital input is wrong\n");
1989 } // if ((b_InputChannel >= 0) && (b_InputChannel <= 2))
1993 case APCI1710_CHRONO_READ_PORT:
1995 pb_PortValue = (PBYTE) & data[0];
1998 inl(devpriv->s_BoardInfos.
2003 (BYTE) ((dw_Status & 0x7) ^ 7);
2007 /*******************************/
2008 /* Chronometer not initialised */
2009 /*******************************/
2011 DPRINTK("Chronometer not initialised\n");
2015 /******************************************/
2016 /* The module is not a Chronometer module */
2017 /******************************************/
2019 DPRINTK("The module is not a Chronometer module\n");
2023 /***********************/
2024 /* Module number error */
2025 /***********************/
2027 DPRINTK("Module number error\n");
2031 return (i_ReturnValue);