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.
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstrasse 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 : ADDI DATA | Compiler : GCC |
33 | Modulname : addi_common.c | Version : 2.96 |
34 +-------------------------------+---------------------------------------+
36 +-----------------------------------------------------------------------+
37 | Description : ADDI COMMON Main Module |
38 +-----------------------------------------------------------------------+
40 | option[0] - PCI bus number - if bus number and slot number are 0, |
41 | then driver search for first unused card |
42 | option[1] - PCI slot number |
44 | option[2] = 0 - DMA ENABLE |
46 +----------+-----------+------------------------------------------------+
49 #include <linux/kernel.h>
50 #include <linux/module.h>
51 #include <linux/sched.h>
53 #include <linux/slab.h>
54 #include <linux/errno.h>
55 #include <linux/ioport.h>
56 #include <linux/delay.h>
57 #include <linux/interrupt.h>
58 #include <linux/timex.h>
59 #include <linux/timer.h>
60 #include <linux/pci.h>
61 #include "../../comedidev.h"
63 #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
66 #include "../comedi_fc.h"
68 #include "addi_common.h"
69 #include "addi_amcc_s5933.h"
71 /* Update-0.7.57->0.7.68MODULE_AUTHOR("ADDI-DATA GmbH <info@addi-data.com>"); */
72 /* Update-0.7.57->0.7.68MODULE_DESCRIPTION("Comedi ADDI-DATA module"); */
73 /* Update-0.7.57->0.7.68MODULE_LICENSE("GPL"); */
75 #define devpriv ((struct addi_private *)dev->private)
76 #define this_board ((struct addi_board *)dev->board_ptr)
78 #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
79 /* BYTE b_SaveFPUReg [94]; */
83 /* asm ("fstenv b_SaveFPUReg"); */
89 /* asm ("frstor b_SaveFPUReg"); */
94 #include "addi_eeprom.c"
95 #if (defined (CONFIG_APCI_3120) || defined (CONFIG_APCI_3001))
96 #include "hwdrv_apci3120.c"
98 #ifdef CONFIG_APCI_1032
99 #include "hwdrv_apci1032.c"
101 #ifdef CONFIG_APCI_1516
102 #include "hwdrv_apci1516.c"
104 #ifdef CONFIG_APCI_2016
105 #include "hwdrv_apci2016.c"
107 #ifdef CONFIG_APCI_2032
108 #include "hwdrv_apci2032.c"
110 #ifdef CONFIG_APCI_2200
111 #include "hwdrv_apci2200.c"
113 #ifdef CONFIG_APCI_1564
114 #include "hwdrv_apci1564.c"
116 #ifdef CONFIG_APCI_1500
117 #include "hwdrv_apci1500.c"
119 #ifdef CONFIG_APCI_3501
120 #include "hwdrv_apci3501.c"
122 #ifdef CONFIG_APCI_035
123 #include "hwdrv_apci035.c"
125 #if (defined (CONFIG_APCI_3200) || defined (CONFIG_APCI_3300))
126 #include "hwdrv_apci3200.c"
128 #ifdef CONFIG_APCI_1710
129 #include "hwdrv_APCI1710.c"
131 #ifdef CONFIG_APCI_16XX
132 #include "hwdrv_apci16xx.c"
134 #ifdef CONFIG_APCI_3XXX
135 #include "hwdrv_apci3xxx.c"
138 #ifndef COMEDI_SUBD_TTLIO
139 #define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
142 static DEFINE_PCI_DEVICE_TABLE(addi_apci_tbl
) = {
143 #ifdef CONFIG_APCI_3120
144 {APCI3120_BOARD_VENDOR_ID
, 0x818D, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
146 #ifdef CONFIG_APCI_1032
147 {APCI1032_BOARD_VENDOR_ID
, 0x1003, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
149 #ifdef CONFIG_APCI_1516
150 {APCI1516_BOARD_VENDOR_ID
, 0x1001, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
152 #ifdef CONFIG_APCI_2016
153 {APCI2016_BOARD_VENDOR_ID
, 0x1002, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
155 #ifdef CONFIG_APCI_2032
156 {APCI2032_BOARD_VENDOR_ID
, 0x1004, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
158 #ifdef CONFIG_APCI_2200
159 {APCI2200_BOARD_VENDOR_ID
, 0x1005, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
161 #ifdef CONFIG_APCI_1564
162 {APCI1564_BOARD_VENDOR_ID
, 0x1006, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
164 #ifdef CONFIG_APCI_1500
165 {APCI1500_BOARD_VENDOR_ID
, 0x80fc, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
167 #ifdef CONFIG_APCI_3001
168 {APCI3120_BOARD_VENDOR_ID
, 0x828D, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
170 #ifdef CONFIG_APCI_3501
171 {APCI3501_BOARD_VENDOR_ID
, 0x3001, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
173 #ifdef CONFIG_APCI_035
174 {APCI035_BOARD_VENDOR_ID
, 0x0300, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
176 #ifdef CONFIG_APCI_3200
177 {APCI3200_BOARD_VENDOR_ID
, 0x3000, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
179 #ifdef CONFIG_APCI_3300
180 {APCI3200_BOARD_VENDOR_ID
, 0x3007, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
182 #ifdef CONFIG_APCI_1710
183 {APCI1710_BOARD_VENDOR_ID
, APCI1710_BOARD_DEVICE_ID
,
184 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
186 #ifdef CONFIG_APCI_16XX
187 {0x15B8, 0x1009, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
188 {0x15B8, 0x100A, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
190 #ifdef CONFIG_APCI_3XXX
191 {0x15B8, 0x3010, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
192 {0x15B8, 0x300F, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
193 {0x15B8, 0x300E, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
194 {0x15B8, 0x3013, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
195 {0x15B8, 0x3014, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
196 {0x15B8, 0x3015, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
197 {0x15B8, 0x3016, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
198 {0x15B8, 0x3017, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
199 {0x15B8, 0x3018, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
200 {0x15B8, 0x3019, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
201 {0x15B8, 0x301A, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
202 {0x15B8, 0x301B, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
203 {0x15B8, 0x301C, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
204 {0x15B8, 0x301D, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
205 {0x15B8, 0x301E, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
206 {0x15B8, 0x301F, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
207 {0x15B8, 0x3020, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
208 {0x15B8, 0x3021, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
209 {0x15B8, 0x3022, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
210 {0x15B8, 0x3023, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
211 {0x15B8, 0x300B, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
212 {0x15B8, 0x3002, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
213 {0x15B8, 0x3003, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
214 {0x15B8, 0x3004, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
215 {0x15B8, 0x3024, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
220 MODULE_DEVICE_TABLE(pci
, addi_apci_tbl
);
222 static const struct addi_board boardtypes
[] = {
223 #ifdef CONFIG_APCI_3120
225 APCI3120_BOARD_VENDOR_ID
,
228 APCI3120_ADDRESS_RANGE
,
251 v_APCI3120_Interrupt
,
253 i_APCI3120_InsnConfigAnalogInput
,
254 i_APCI3120_InsnReadAnalogInput
,
257 i_APCI3120_CommandTestAnalogInput
,
258 i_APCI3120_CommandAnalogInput
,
259 i_APCI3120_StopCyclicAcquisition
,
261 i_APCI3120_InsnWriteAnalogOutput
,
264 i_APCI3120_InsnReadDigitalInput
,
266 i_APCI3120_InsnBitsDigitalInput
,
267 i_APCI3120_InsnConfigDigitalOutput
,
268 i_APCI3120_InsnWriteDigitalOutput
,
269 i_APCI3120_InsnBitsDigitalOutput
,
271 i_APCI3120_InsnConfigTimer
,
272 i_APCI3120_InsnWriteTimer
,
273 i_APCI3120_InsnReadTimer
,
280 #ifdef CONFIG_APCI_1032
282 APCI1032_BOARD_VENDOR_ID
,
285 APCI1032_ADDRESS_RANGE
,
308 v_APCI1032_Interrupt
,
320 i_APCI1032_ConfigDigitalInput
,
321 i_APCI1032_Read1DigitalInput
,
323 i_APCI1032_ReadMoreDigitalInput
,
337 #ifdef CONFIG_APCI_1516
339 APCI1516_BOARD_VENDOR_ID
,
342 APCI1516_ADDRESS_RANGE
,
377 i_APCI1516_Read1DigitalInput
,
379 i_APCI1516_ReadMoreDigitalInput
,
380 i_APCI1516_ConfigDigitalOutput
,
381 i_APCI1516_WriteDigitalOutput
,
382 i_APCI1516_ReadDigitalOutput
,
384 i_APCI1516_ConfigWatchdog
,
385 i_APCI1516_StartStopWriteWatchdog
,
386 i_APCI1516_ReadWatchdog
,
393 #ifdef CONFIG_APCI_2016
395 APCI2016_BOARD_VENDOR_ID
,
398 APCI2016_ADDRESS_RANGE
,
437 i_APCI2016_ConfigDigitalOutput
,
438 i_APCI2016_WriteDigitalOutput
,
439 i_APCI2016_BitsDigitalOutput
,
441 i_APCI2016_ConfigWatchdog
,
442 i_APCI2016_StartStopWriteWatchdog
,
443 i_APCI2016_ReadWatchdog
,
450 #ifdef CONFIG_APCI_2032
452 APCI2032_BOARD_VENDOR_ID
,
455 APCI2032_ADDRESS_RANGE
,
478 v_APCI2032_Interrupt
,
493 i_APCI2032_ConfigDigitalOutput
,
494 i_APCI2032_WriteDigitalOutput
,
495 i_APCI2032_ReadDigitalOutput
,
496 i_APCI2032_ReadInterruptStatus
,
497 i_APCI2032_ConfigWatchdog
,
498 i_APCI2032_StartStopWriteWatchdog
,
499 i_APCI2032_ReadWatchdog
,
506 #ifdef CONFIG_APCI_2200
508 APCI2200_BOARD_VENDOR_ID
,
511 APCI2200_ADDRESS_RANGE
,
546 i_APCI2200_Read1DigitalInput
,
548 i_APCI2200_ReadMoreDigitalInput
,
549 i_APCI2200_ConfigDigitalOutput
,
550 i_APCI2200_WriteDigitalOutput
,
551 i_APCI2200_ReadDigitalOutput
,
553 i_APCI2200_ConfigWatchdog
,
554 i_APCI2200_StartStopWriteWatchdog
,
555 i_APCI2200_ReadWatchdog
,
562 #ifdef CONFIG_APCI_1564
564 APCI1564_BOARD_VENDOR_ID
,
567 APCI1564_ADDRESS_RANGE
,
590 v_APCI1564_Interrupt
,
602 i_APCI1564_ConfigDigitalInput
,
603 i_APCI1564_Read1DigitalInput
,
605 i_APCI1564_ReadMoreDigitalInput
,
606 i_APCI1564_ConfigDigitalOutput
,
607 i_APCI1564_WriteDigitalOutput
,
608 i_APCI1564_ReadDigitalOutput
,
609 i_APCI1564_ReadInterruptStatus
,
610 i_APCI1564_ConfigTimerCounterWatchdog
,
611 i_APCI1564_StartStopWriteTimerCounterWatchdog
,
612 i_APCI1564_ReadTimerCounterWatchdog
,
619 #ifdef CONFIG_APCI_1500
621 APCI1500_BOARD_VENDOR_ID
,
624 APCI1500_ADDRESS_RANGE
,
647 v_APCI1500_Interrupt
,
659 i_APCI1500_ConfigDigitalInputEvent
,
660 i_APCI1500_Initialisation
,
661 i_APCI1500_StartStopInputEvent
,
662 i_APCI1500_ReadMoreDigitalInput
,
663 i_APCI1500_ConfigDigitalOutputErrorInterrupt
,
664 i_APCI1500_WriteDigitalOutput
,
665 i_APCI1500_ConfigureInterrupt
,
667 i_APCI1500_ConfigCounterTimerWatchdog
,
668 i_APCI1500_StartStopTriggerTimerCounterWatchdog
,
669 i_APCI1500_ReadInterruptMask
,
670 i_APCI1500_ReadCounterTimerWatchdog
,
676 #ifdef CONFIG_APCI_3001
678 APCI3120_BOARD_VENDOR_ID
,
681 APCI3120_ADDRESS_RANGE
,
704 v_APCI3120_Interrupt
,
706 i_APCI3120_InsnConfigAnalogInput
,
707 i_APCI3120_InsnReadAnalogInput
,
710 i_APCI3120_CommandTestAnalogInput
,
711 i_APCI3120_CommandAnalogInput
,
712 i_APCI3120_StopCyclicAcquisition
,
717 i_APCI3120_InsnReadDigitalInput
,
719 i_APCI3120_InsnBitsDigitalInput
,
720 i_APCI3120_InsnConfigDigitalOutput
,
721 i_APCI3120_InsnWriteDigitalOutput
,
722 i_APCI3120_InsnBitsDigitalOutput
,
724 i_APCI3120_InsnConfigTimer
,
725 i_APCI3120_InsnWriteTimer
,
726 i_APCI3120_InsnReadTimer
,
733 #ifdef CONFIG_APCI_3501
735 APCI3501_BOARD_VENDOR_ID
,
738 APCI3501_ADDRESS_RANGE
,
761 v_APCI3501_Interrupt
,
769 i_APCI3501_ConfigAnalogOutput
,
770 i_APCI3501_WriteAnalogOutput
,
775 i_APCI3501_ReadDigitalInput
,
776 i_APCI3501_ConfigDigitalOutput
,
777 i_APCI3501_WriteDigitalOutput
,
778 i_APCI3501_ReadDigitalOutput
,
780 i_APCI3501_ConfigTimerCounterWatchdog
,
781 i_APCI3501_StartStopWriteTimerCounterWatchdog
,
782 i_APCI3501_ReadTimerCounterWatchdog
,
789 #ifdef CONFIG_APCI_035
791 APCI035_BOARD_VENDOR_ID
,
794 APCI035_ADDRESS_RANGE
,
819 i_APCI035_ConfigAnalogInput
,
820 i_APCI035_ReadAnalogInput
,
837 i_APCI035_ConfigTimerWatchdog
,
838 i_APCI035_StartStopWriteTimerWatchdog
,
839 i_APCI035_ReadTimerWatchdog
,
846 #ifdef CONFIG_APCI_3200
848 APCI3200_BOARD_VENDOR_ID
,
874 v_APCI3200_Interrupt
,
876 i_APCI3200_ConfigAnalogInput
,
877 i_APCI3200_ReadAnalogInput
,
878 i_APCI3200_InsnWriteReleaseAnalogInput
,
879 i_APCI3200_InsnBits_AnalogInput_Test
,
880 i_APCI3200_CommandTestAnalogInput
,
881 i_APCI3200_CommandAnalogInput
,
882 i_APCI3200_StopCyclicAcquisition
,
889 i_APCI3200_ReadDigitalInput
,
890 i_APCI3200_ConfigDigitalOutput
,
891 i_APCI3200_WriteDigitalOutput
,
892 i_APCI3200_ReadDigitalOutput
,
903 #ifdef CONFIG_APCI_3300
904 /* Begin JK .20.10.2004 = APCI-3300 integration */
906 APCI3200_BOARD_VENDOR_ID
,
932 v_APCI3200_Interrupt
,
934 i_APCI3200_ConfigAnalogInput
,
935 i_APCI3200_ReadAnalogInput
,
936 i_APCI3200_InsnWriteReleaseAnalogInput
,
937 i_APCI3200_InsnBits_AnalogInput_Test
,
938 i_APCI3200_CommandTestAnalogInput
,
939 i_APCI3200_CommandAnalogInput
,
940 i_APCI3200_StopCyclicAcquisition
,
947 i_APCI3200_ReadDigitalInput
,
948 i_APCI3200_ConfigDigitalOutput
,
949 i_APCI3200_WriteDigitalOutput
,
950 i_APCI3200_ReadDigitalOutput
,
961 #ifdef CONFIG_APCI_1710
962 {"apci1710", APCI1710_BOARD_VENDOR_ID
, APCI1710_BOARD_DEVICE_ID
,
987 v_APCI1710_Interrupt
,
1016 #ifdef CONFIG_APCI_16XX
1038 &range_apci16xx_ttl
,
1068 i_APCI16XX_InsnConfigInitTTLIO
,
1069 i_APCI16XX_InsnBitsReadTTLIO
,
1070 i_APCI16XX_InsnReadTTLIOAllPortValue
,
1071 i_APCI16XX_InsnBitsWriteTTLIO
},
1094 &range_apci16xx_ttl
,
1124 i_APCI16XX_InsnConfigInitTTLIO
,
1125 i_APCI16XX_InsnBitsReadTTLIO
,
1126 i_APCI16XX_InsnReadTTLIOAllPortValue
,
1127 i_APCI16XX_InsnBitsWriteTTLIO
},
1129 #ifdef CONFIG_APCI_3XXX
1151 &range_apci3XXX_ttl
,
1157 v_APCI3XXX_Interrupt
,
1159 i_APCI3XXX_InsnConfigAnalogInput
,
1160 i_APCI3XXX_InsnReadAnalogInput
,
1181 i_APCI3XXX_InsnConfigInitTTLIO
,
1182 i_APCI3XXX_InsnBitsTTLIO
,
1183 i_APCI3XXX_InsnReadTTLIO
,
1184 i_APCI3XXX_InsnWriteTTLIO
},
1207 &range_apci3XXX_ttl
,
1213 v_APCI3XXX_Interrupt
,
1215 i_APCI3XXX_InsnConfigAnalogInput
,
1216 i_APCI3XXX_InsnReadAnalogInput
,
1237 i_APCI3XXX_InsnConfigInitTTLIO
,
1238 i_APCI3XXX_InsnBitsTTLIO
,
1239 i_APCI3XXX_InsnReadTTLIO
,
1240 i_APCI3XXX_InsnWriteTTLIO
},
1263 &range_apci3XXX_ttl
,
1269 v_APCI3XXX_Interrupt
,
1271 i_APCI3XXX_InsnConfigAnalogInput
,
1272 i_APCI3XXX_InsnReadAnalogInput
,
1293 i_APCI3XXX_InsnConfigInitTTLIO
,
1294 i_APCI3XXX_InsnBitsTTLIO
,
1295 i_APCI3XXX_InsnReadTTLIO
,
1296 i_APCI3XXX_InsnWriteTTLIO
},
1319 &range_apci3XXX_ttl
,
1325 v_APCI3XXX_Interrupt
,
1327 i_APCI3XXX_InsnConfigAnalogInput
,
1328 i_APCI3XXX_InsnReadAnalogInput
,
1349 i_APCI3XXX_InsnConfigInitTTLIO
,
1350 i_APCI3XXX_InsnBitsTTLIO
,
1351 i_APCI3XXX_InsnReadTTLIO
,
1352 i_APCI3XXX_InsnWriteTTLIO
},
1375 &range_apci3XXX_ttl
,
1381 v_APCI3XXX_Interrupt
,
1383 i_APCI3XXX_InsnConfigAnalogInput
,
1384 i_APCI3XXX_InsnReadAnalogInput
,
1405 i_APCI3XXX_InsnConfigInitTTLIO
,
1406 i_APCI3XXX_InsnBitsTTLIO
,
1407 i_APCI3XXX_InsnReadTTLIO
,
1408 i_APCI3XXX_InsnWriteTTLIO
},
1431 &range_apci3XXX_ttl
,
1437 v_APCI3XXX_Interrupt
,
1439 i_APCI3XXX_InsnConfigAnalogInput
,
1440 i_APCI3XXX_InsnReadAnalogInput
,
1461 i_APCI3XXX_InsnConfigInitTTLIO
,
1462 i_APCI3XXX_InsnBitsTTLIO
,
1463 i_APCI3XXX_InsnReadTTLIO
,
1464 i_APCI3XXX_InsnWriteTTLIO
},
1487 &range_apci3XXX_ttl
,
1493 v_APCI3XXX_Interrupt
,
1495 i_APCI3XXX_InsnConfigAnalogInput
,
1496 i_APCI3XXX_InsnReadAnalogInput
,
1506 i_APCI3XXX_InsnReadDigitalInput
,
1508 i_APCI3XXX_InsnBitsDigitalInput
,
1510 i_APCI3XXX_InsnWriteDigitalOutput
,
1511 i_APCI3XXX_InsnBitsDigitalOutput
,
1512 i_APCI3XXX_InsnReadDigitalOutput
,
1517 i_APCI3XXX_InsnConfigInitTTLIO
,
1518 i_APCI3XXX_InsnBitsTTLIO
,
1519 i_APCI3XXX_InsnReadTTLIO
,
1520 i_APCI3XXX_InsnWriteTTLIO
},
1543 &range_apci3XXX_ttl
,
1549 v_APCI3XXX_Interrupt
,
1551 i_APCI3XXX_InsnConfigAnalogInput
,
1552 i_APCI3XXX_InsnReadAnalogInput
,
1562 i_APCI3XXX_InsnReadDigitalInput
,
1564 i_APCI3XXX_InsnBitsDigitalInput
,
1566 i_APCI3XXX_InsnWriteDigitalOutput
,
1567 i_APCI3XXX_InsnBitsDigitalOutput
,
1568 i_APCI3XXX_InsnReadDigitalOutput
,
1573 i_APCI3XXX_InsnConfigInitTTLIO
,
1574 i_APCI3XXX_InsnBitsTTLIO
,
1575 i_APCI3XXX_InsnReadTTLIO
,
1576 i_APCI3XXX_InsnWriteTTLIO
},
1599 &range_apci3XXX_ttl
,
1605 v_APCI3XXX_Interrupt
,
1607 i_APCI3XXX_InsnConfigAnalogInput
,
1608 i_APCI3XXX_InsnReadAnalogInput
,
1618 i_APCI3XXX_InsnReadDigitalInput
,
1620 i_APCI3XXX_InsnBitsDigitalInput
,
1622 i_APCI3XXX_InsnWriteDigitalOutput
,
1623 i_APCI3XXX_InsnBitsDigitalOutput
,
1624 i_APCI3XXX_InsnReadDigitalOutput
,
1629 i_APCI3XXX_InsnConfigInitTTLIO
,
1630 i_APCI3XXX_InsnBitsTTLIO
,
1631 i_APCI3XXX_InsnReadTTLIO
,
1632 i_APCI3XXX_InsnWriteTTLIO
},
1655 &range_apci3XXX_ttl
,
1661 v_APCI3XXX_Interrupt
,
1663 i_APCI3XXX_InsnConfigAnalogInput
,
1664 i_APCI3XXX_InsnReadAnalogInput
,
1674 i_APCI3XXX_InsnReadDigitalInput
,
1676 i_APCI3XXX_InsnBitsDigitalInput
,
1678 i_APCI3XXX_InsnWriteDigitalOutput
,
1679 i_APCI3XXX_InsnBitsDigitalOutput
,
1680 i_APCI3XXX_InsnReadDigitalOutput
,
1685 i_APCI3XXX_InsnConfigInitTTLIO
,
1686 i_APCI3XXX_InsnBitsTTLIO
,
1687 i_APCI3XXX_InsnReadTTLIO
,
1688 i_APCI3XXX_InsnWriteTTLIO
},
1711 &range_apci3XXX_ttl
,
1717 v_APCI3XXX_Interrupt
,
1719 i_APCI3XXX_InsnConfigAnalogInput
,
1720 i_APCI3XXX_InsnReadAnalogInput
,
1730 i_APCI3XXX_InsnReadDigitalInput
,
1732 i_APCI3XXX_InsnBitsDigitalInput
,
1734 i_APCI3XXX_InsnWriteDigitalOutput
,
1735 i_APCI3XXX_InsnBitsDigitalOutput
,
1736 i_APCI3XXX_InsnReadDigitalOutput
,
1741 i_APCI3XXX_InsnConfigInitTTLIO
,
1742 i_APCI3XXX_InsnBitsTTLIO
,
1743 i_APCI3XXX_InsnReadTTLIO
,
1744 i_APCI3XXX_InsnWriteTTLIO
},
1767 &range_apci3XXX_ttl
,
1773 v_APCI3XXX_Interrupt
,
1775 i_APCI3XXX_InsnConfigAnalogInput
,
1776 i_APCI3XXX_InsnReadAnalogInput
,
1786 i_APCI3XXX_InsnReadDigitalInput
,
1788 i_APCI3XXX_InsnBitsDigitalInput
,
1790 i_APCI3XXX_InsnWriteDigitalOutput
,
1791 i_APCI3XXX_InsnBitsDigitalOutput
,
1792 i_APCI3XXX_InsnReadDigitalOutput
,
1797 i_APCI3XXX_InsnConfigInitTTLIO
,
1798 i_APCI3XXX_InsnBitsTTLIO
,
1799 i_APCI3XXX_InsnReadTTLIO
,
1800 i_APCI3XXX_InsnWriteTTLIO
},
1823 &range_apci3XXX_ttl
,
1829 v_APCI3XXX_Interrupt
,
1831 i_APCI3XXX_InsnConfigAnalogInput
,
1832 i_APCI3XXX_InsnReadAnalogInput
,
1839 i_APCI3XXX_InsnWriteAnalogOutput
,
1853 i_APCI3XXX_InsnConfigInitTTLIO
,
1854 i_APCI3XXX_InsnBitsTTLIO
,
1855 i_APCI3XXX_InsnReadTTLIO
,
1856 i_APCI3XXX_InsnWriteTTLIO
},
1879 &range_apci3XXX_ttl
,
1885 v_APCI3XXX_Interrupt
,
1887 i_APCI3XXX_InsnConfigAnalogInput
,
1888 i_APCI3XXX_InsnReadAnalogInput
,
1895 i_APCI3XXX_InsnWriteAnalogOutput
,
1909 i_APCI3XXX_InsnConfigInitTTLIO
,
1910 i_APCI3XXX_InsnBitsTTLIO
,
1911 i_APCI3XXX_InsnReadTTLIO
,
1912 i_APCI3XXX_InsnWriteTTLIO
},
1935 &range_apci3XXX_ttl
,
1941 v_APCI3XXX_Interrupt
,
1943 i_APCI3XXX_InsnConfigAnalogInput
,
1944 i_APCI3XXX_InsnReadAnalogInput
,
1951 i_APCI3XXX_InsnWriteAnalogOutput
,
1965 i_APCI3XXX_InsnConfigInitTTLIO
,
1966 i_APCI3XXX_InsnBitsTTLIO
,
1967 i_APCI3XXX_InsnReadTTLIO
,
1968 i_APCI3XXX_InsnWriteTTLIO
},
1991 &range_apci3XXX_ttl
,
1997 v_APCI3XXX_Interrupt
,
1999 i_APCI3XXX_InsnConfigAnalogInput
,
2000 i_APCI3XXX_InsnReadAnalogInput
,
2007 i_APCI3XXX_InsnWriteAnalogOutput
,
2021 i_APCI3XXX_InsnConfigInitTTLIO
,
2022 i_APCI3XXX_InsnBitsTTLIO
,
2023 i_APCI3XXX_InsnReadTTLIO
,
2024 i_APCI3XXX_InsnWriteTTLIO
},
2047 &range_apci3XXX_ttl
,
2053 v_APCI3XXX_Interrupt
,
2055 i_APCI3XXX_InsnConfigAnalogInput
,
2056 i_APCI3XXX_InsnReadAnalogInput
,
2063 i_APCI3XXX_InsnWriteAnalogOutput
,
2066 i_APCI3XXX_InsnReadDigitalInput
,
2068 i_APCI3XXX_InsnBitsDigitalInput
,
2070 i_APCI3XXX_InsnWriteDigitalOutput
,
2071 i_APCI3XXX_InsnBitsDigitalOutput
,
2072 i_APCI3XXX_InsnReadDigitalOutput
,
2077 i_APCI3XXX_InsnConfigInitTTLIO
,
2078 i_APCI3XXX_InsnBitsTTLIO
,
2079 i_APCI3XXX_InsnReadTTLIO
,
2080 i_APCI3XXX_InsnWriteTTLIO
},
2103 &range_apci3XXX_ttl
,
2109 v_APCI3XXX_Interrupt
,
2111 i_APCI3XXX_InsnConfigAnalogInput
,
2112 i_APCI3XXX_InsnReadAnalogInput
,
2119 i_APCI3XXX_InsnWriteAnalogOutput
,
2122 i_APCI3XXX_InsnReadDigitalInput
,
2124 i_APCI3XXX_InsnBitsDigitalInput
,
2126 i_APCI3XXX_InsnWriteDigitalOutput
,
2127 i_APCI3XXX_InsnBitsDigitalOutput
,
2128 i_APCI3XXX_InsnReadDigitalOutput
,
2133 i_APCI3XXX_InsnConfigInitTTLIO
,
2134 i_APCI3XXX_InsnBitsTTLIO
,
2135 i_APCI3XXX_InsnReadTTLIO
,
2136 i_APCI3XXX_InsnWriteTTLIO
},
2159 &range_apci3XXX_ttl
,
2165 v_APCI3XXX_Interrupt
,
2167 i_APCI3XXX_InsnConfigAnalogInput
,
2168 i_APCI3XXX_InsnReadAnalogInput
,
2175 i_APCI3XXX_InsnWriteAnalogOutput
,
2178 i_APCI3XXX_InsnReadDigitalInput
,
2180 i_APCI3XXX_InsnBitsDigitalInput
,
2182 i_APCI3XXX_InsnWriteDigitalOutput
,
2183 i_APCI3XXX_InsnBitsDigitalOutput
,
2184 i_APCI3XXX_InsnReadDigitalOutput
,
2189 i_APCI3XXX_InsnConfigInitTTLIO
,
2190 i_APCI3XXX_InsnBitsTTLIO
,
2191 i_APCI3XXX_InsnReadTTLIO
,
2192 i_APCI3XXX_InsnWriteTTLIO
},
2215 &range_apci3XXX_ttl
,
2221 v_APCI3XXX_Interrupt
,
2223 i_APCI3XXX_InsnConfigAnalogInput
,
2224 i_APCI3XXX_InsnReadAnalogInput
,
2231 i_APCI3XXX_InsnWriteAnalogOutput
,
2234 i_APCI3XXX_InsnReadDigitalInput
,
2236 i_APCI3XXX_InsnBitsDigitalInput
,
2238 i_APCI3XXX_InsnWriteDigitalOutput
,
2239 i_APCI3XXX_InsnBitsDigitalOutput
,
2240 i_APCI3XXX_InsnReadDigitalOutput
,
2245 i_APCI3XXX_InsnConfigInitTTLIO
,
2246 i_APCI3XXX_InsnBitsTTLIO
,
2247 i_APCI3XXX_InsnReadTTLIO
,
2248 i_APCI3XXX_InsnWriteTTLIO
},
2277 v_APCI3XXX_Interrupt
,
2279 i_APCI3XXX_InsnConfigAnalogInput
,
2280 i_APCI3XXX_InsnReadAnalogInput
,
2290 i_APCI3XXX_InsnReadDigitalInput
,
2292 i_APCI3XXX_InsnBitsDigitalInput
,
2294 i_APCI3XXX_InsnWriteDigitalOutput
,
2295 i_APCI3XXX_InsnBitsDigitalOutput
,
2296 i_APCI3XXX_InsnReadDigitalOutput
,
2332 v_APCI3XXX_Interrupt
,
2334 i_APCI3XXX_InsnConfigAnalogInput
,
2335 i_APCI3XXX_InsnReadAnalogInput
,
2345 i_APCI3XXX_InsnReadDigitalInput
,
2347 i_APCI3XXX_InsnBitsDigitalInput
,
2349 i_APCI3XXX_InsnWriteDigitalOutput
,
2350 i_APCI3XXX_InsnBitsDigitalOutput
,
2351 i_APCI3XXX_InsnReadDigitalOutput
,
2387 v_APCI3XXX_Interrupt
,
2389 i_APCI3XXX_InsnConfigAnalogInput
,
2390 i_APCI3XXX_InsnReadAnalogInput
,
2400 i_APCI3XXX_InsnReadDigitalInput
,
2402 i_APCI3XXX_InsnBitsDigitalInput
,
2404 i_APCI3XXX_InsnWriteDigitalOutput
,
2405 i_APCI3XXX_InsnBitsDigitalOutput
,
2406 i_APCI3XXX_InsnReadDigitalOutput
,
2442 v_APCI3XXX_Interrupt
,
2444 i_APCI3XXX_InsnConfigAnalogInput
,
2445 i_APCI3XXX_InsnReadAnalogInput
,
2455 i_APCI3XXX_InsnReadDigitalInput
,
2457 i_APCI3XXX_InsnBitsDigitalInput
,
2459 i_APCI3XXX_InsnWriteDigitalOutput
,
2460 i_APCI3XXX_InsnBitsDigitalOutput
,
2461 i_APCI3XXX_InsnReadDigitalOutput
,
2491 &range_apci3XXX_ttl
,
2497 v_APCI3XXX_Interrupt
,
2507 i_APCI3XXX_InsnWriteAnalogOutput
,
2521 i_APCI3XXX_InsnConfigInitTTLIO
,
2522 i_APCI3XXX_InsnBitsTTLIO
,
2523 i_APCI3XXX_InsnReadTTLIO
,
2524 i_APCI3XXX_InsnWriteTTLIO
},
2528 #define n_boardtypes (sizeof(boardtypes)/sizeof(struct addi_board))
2530 struct comedi_driver driver_addi
= {
2531 .driver_name
= "addi_common",
2532 .module
= THIS_MODULE
,
2533 .attach
= i_ADDI_Attach
,
2534 .detach
= i_ADDI_Detach
,
2535 .num_names
= n_boardtypes
,
2536 .board_name
= &boardtypes
[0].pc_DriverName
,
2537 .offset
= sizeof(struct addi_board
),
2540 COMEDI_PCI_INITCLEANUP(driver_addi
, addi_apci_tbl
);
2543 +----------------------------------------------------------------------------+
2544 | Function name :static int i_ADDI_Attach(struct comedi_device *dev, |
2545 | struct comedi_devconfig *it) |
2547 +----------------------------------------------------------------------------+
2548 | Task :Detects the card. |
2549 | Configure the driver for a particular board. |
2550 | This function does all the initializations and memory |
2551 | allocation of data structures for the driver. |
2552 +----------------------------------------------------------------------------+
2553 | Input Parameters :struct comedi_device *dev |
2554 | struct comedi_devconfig *it |
2556 +----------------------------------------------------------------------------+
2557 | Return Value : 0 |
2559 +----------------------------------------------------------------------------+
2562 static int i_ADDI_Attach(struct comedi_device
*dev
, struct comedi_devconfig
*it
)
2564 struct comedi_subdevice
*s
;
2565 int ret
, pages
, i
, n_subdevices
;
2566 unsigned int dw_Dummy
;
2567 resource_size_t io_addr
[5];
2569 resource_size_t iobase_a
, iobase_main
, iobase_addon
, iobase_reserved
;
2570 struct pcilst_struct
*card
= NULL
;
2571 unsigned char pci_bus
, pci_slot
, pci_func
;
2573 static char c_Identifier
[150];
2575 sprintf(c_Identifier
, "Addi-Data GmbH Comedi %s",
2576 this_board
->pc_DriverName
);
2578 ret
= alloc_private(dev
, sizeof(struct addi_private
));
2582 if (!pci_list_builded
) {
2583 v_pci_card_list_init(this_board
->i_VendorId
, 1); /* 1 for displaying the list.. */
2584 pci_list_builded
= 1;
2586 /* printk("comedi%d: addi_common: board=%s",dev->minor,this_board->pc_DriverName); */
2588 if ((this_board
->i_Dma
) && (it
->options
[2] == 0)) {
2592 card
= ptr_select_and_alloc_pci_card(this_board
->i_VendorId
,
2593 this_board
->i_DeviceId
,
2595 it
->options
[1], i_Dma
);
2600 devpriv
->allocated
= 1;
2602 if ((i_pci_card_data(card
, &pci_bus
, &pci_slot
, &pci_func
, &io_addr
[0],
2604 i_pci_card_free(card
);
2605 printk(" - Can't get AMCC data!\n");
2609 iobase_a
= io_addr
[0];
2610 iobase_main
= io_addr
[1];
2611 iobase_addon
= io_addr
[2];
2612 iobase_reserved
= io_addr
[3];
2613 printk("\nBus %d: Slot %d: Funct%d\nBase0: 0x%8llx\nBase1: 0x%8llx\nBase2: 0x%8llx\nBase3: 0x%8llx\n", pci_bus
, pci_slot
, pci_func
, (unsigned long long)io_addr
[0], (unsigned long long)io_addr
[1], (unsigned long long)io_addr
[2], (unsigned long long)io_addr
[3]);
2615 if ((this_board
->pc_EepromChip
== NULL
)
2616 || (strcmp(this_board
->pc_EepromChip
, ADDIDATA_9054
) != 0)) {
2617 /************************************/
2618 /* Test if more that 1 address used */
2619 /************************************/
2621 if (this_board
->i_IorangeBase1
!= 0) {
2622 dev
->iobase
= (unsigned long)iobase_main
; /* DAQ base address... */
2624 dev
->iobase
= (unsigned long)iobase_a
; /* DAQ base address... */
2627 dev
->board_name
= this_board
->pc_DriverName
;
2628 devpriv
->amcc
= card
;
2629 devpriv
->iobase
= (int) dev
->iobase
;
2630 devpriv
->i_IobaseAmcc
= (int) iobase_a
; /* AMCC base address... */
2631 devpriv
->i_IobaseAddon
= (int) iobase_addon
; /* ADD ON base address.... */
2632 devpriv
->i_IobaseReserved
= (int) iobase_reserved
;
2633 devpriv
->ps_BoardInfo
= this_board
;
2635 dev
->board_name
= this_board
->pc_DriverName
;
2636 dev
->iobase
= (unsigned long)io_addr
[2];
2637 devpriv
->amcc
= card
;
2638 devpriv
->iobase
= (int) io_addr
[2];
2639 devpriv
->ps_BoardInfo
= this_board
;
2640 devpriv
->i_IobaseReserved
= (int) io_addr
[3];
2641 printk("\nioremap begin");
2642 devpriv
->dw_AiBase
=
2643 (unsigned long) ioremap(io_addr
[3],
2644 this_board
->i_IorangeBase3
);
2645 printk("\nioremap end");
2651 if (request_irq(irq
, v_ADDI_Interrupt
, IRQF_SHARED
,
2652 c_Identifier
, dev
) < 0) {
2653 printk(", unable to allocate IRQ %u, DISABLING IT",
2655 irq
= 0; /* Can't use IRQ */
2657 printk("\nirq=%u", irq
);
2660 printk(", IRQ disabled");
2663 printk("\nOption %d %d %d\n", it
->options
[0], it
->options
[1],
2667 /* Read eepeom and fill addi_board Structure */
2669 if (this_board
->i_PCIEeprom
) {
2670 printk("\nPCI Eeprom used");
2671 if (!(strcmp(this_board
->pc_EepromChip
, "S5920"))) {
2672 /* Set 3 wait stait */
2673 if (!(strcmp(this_board
->pc_DriverName
, "apci035"))) {
2674 outl(0x80808082, devpriv
->i_IobaseAmcc
+ 0x60);
2676 outl(0x83838383, devpriv
->i_IobaseAmcc
+ 0x60);
2678 /* Enable the interrupt for the controler */
2679 dw_Dummy
= inl(devpriv
->i_IobaseAmcc
+ 0x38);
2680 outl(dw_Dummy
| 0x2000, devpriv
->i_IobaseAmcc
+ 0x38);
2681 printk("\nEnable the interrupt for the controler");
2683 printk("\nRead Eeprom");
2684 i_EepromReadMainHeader(io_addr
[0], this_board
->pc_EepromChip
,
2687 printk("\nPCI Eeprom unused");
2690 if (it
->options
[2] > 0) {
2691 devpriv
->us_UseDma
= ADDI_DISABLE
;
2693 devpriv
->us_UseDma
= ADDI_ENABLE
;
2696 if (this_board
->i_Dma
) {
2697 printk("\nDMA used");
2698 if (devpriv
->us_UseDma
== ADDI_ENABLE
) {
2699 /* alloc DMA buffers */
2700 devpriv
->b_DmaDoubleBuffer
= 0;
2701 for (i
= 0; i
< 2; i
++) {
2702 for (pages
= 4; pages
>= 0; pages
--) {
2703 devpriv
->ul_DmaBufferVirtual
[i
] =
2704 (void *) __get_free_pages(GFP_KERNEL
, pages
);
2706 if (devpriv
->ul_DmaBufferVirtual
[i
])
2709 if (devpriv
->ul_DmaBufferVirtual
[i
]) {
2710 devpriv
->ui_DmaBufferPages
[i
] = pages
;
2711 devpriv
->ui_DmaBufferSize
[i
] =
2713 devpriv
->ui_DmaBufferSamples
[i
] =
2715 ui_DmaBufferSize
[i
] >> 1;
2716 devpriv
->ul_DmaBufferHw
[i
] =
2717 virt_to_bus((void *)devpriv
->
2718 ul_DmaBufferVirtual
[i
]);
2721 if (!devpriv
->ul_DmaBufferVirtual
[0]) {
2723 (", Can't allocate DMA buffer, DMA disabled!");
2724 devpriv
->us_UseDma
= ADDI_DISABLE
;
2727 if (devpriv
->ul_DmaBufferVirtual
[1]) {
2728 devpriv
->b_DmaDoubleBuffer
= 1;
2732 if ((devpriv
->us_UseDma
== ADDI_ENABLE
)) {
2733 printk("\nDMA ENABLED\n");
2735 printk("\nDMA DISABLED\n");
2739 if (!strcmp(this_board
->pc_DriverName
, "apci1710")) {
2740 #ifdef CONFIG_APCI_1710
2741 i_ADDI_AttachPCI1710(dev
);
2743 /* save base address */
2744 devpriv
->s_BoardInfos
.ui_Address
= io_addr
[2];
2747 /* Update-0.7.57->0.7.68dev->n_subdevices = 7; */
2749 ret
= alloc_subdevices(dev
, n_subdevices
);
2753 /* Allocate and Initialise AI Subdevice Structures */
2754 s
= dev
->subdevices
+ 0;
2755 if ((this_board
->i_NbrAiChannel
)
2756 || (this_board
->i_NbrAiChannelDiff
)) {
2757 dev
->read_subdev
= s
;
2758 s
->type
= COMEDI_SUBD_AI
;
2760 SDF_READABLE
| SDF_COMMON
| SDF_GROUND
2762 if (this_board
->i_NbrAiChannel
) {
2763 s
->n_chan
= this_board
->i_NbrAiChannel
;
2764 devpriv
->b_SingelDiff
= 0;
2766 s
->n_chan
= this_board
->i_NbrAiChannelDiff
;
2767 devpriv
->b_SingelDiff
= 1;
2769 s
->maxdata
= this_board
->i_AiMaxdata
;
2770 s
->len_chanlist
= this_board
->i_AiChannelList
;
2771 s
->range_table
= this_board
->pr_AiRangelist
;
2773 /* Set the initialisation flag */
2774 devpriv
->b_AiInitialisation
= 1;
2777 this_board
->i_hwdrv_InsnConfigAnalogInput
;
2778 s
->insn_read
= this_board
->i_hwdrv_InsnReadAnalogInput
;
2780 this_board
->i_hwdrv_InsnWriteAnalogInput
;
2781 s
->insn_bits
= this_board
->i_hwdrv_InsnBitsAnalogInput
;
2783 this_board
->i_hwdrv_CommandTestAnalogInput
;
2784 s
->do_cmd
= this_board
->i_hwdrv_CommandAnalogInput
;
2785 s
->cancel
= this_board
->i_hwdrv_CancelAnalogInput
;
2788 s
->type
= COMEDI_SUBD_UNUSED
;
2791 /* Allocate and Initialise AO Subdevice Structures */
2792 s
= dev
->subdevices
+ 1;
2793 if (this_board
->i_NbrAoChannel
) {
2794 s
->type
= COMEDI_SUBD_AO
;
2795 s
->subdev_flags
= SDF_WRITEABLE
| SDF_GROUND
| SDF_COMMON
;
2796 s
->n_chan
= this_board
->i_NbrAoChannel
;
2797 s
->maxdata
= this_board
->i_AoMaxdata
;
2798 s
->len_chanlist
= this_board
->i_NbrAoChannel
;
2799 s
->range_table
= this_board
->pr_AoRangelist
;
2801 this_board
->i_hwdrv_InsnConfigAnalogOutput
;
2803 this_board
->i_hwdrv_InsnWriteAnalogOutput
;
2805 s
->type
= COMEDI_SUBD_UNUSED
;
2807 /* Allocate and Initialise DI Subdevice Structures */
2808 s
= dev
->subdevices
+ 2;
2809 if (this_board
->i_NbrDiChannel
) {
2810 s
->type
= COMEDI_SUBD_DI
;
2811 s
->subdev_flags
= SDF_READABLE
| SDF_GROUND
| SDF_COMMON
;
2812 s
->n_chan
= this_board
->i_NbrDiChannel
;
2814 s
->len_chanlist
= this_board
->i_NbrDiChannel
;
2815 s
->range_table
= &range_digital
;
2816 s
->io_bits
= 0; /* all bits input */
2818 this_board
->i_hwdrv_InsnConfigDigitalInput
;
2819 s
->insn_read
= this_board
->i_hwdrv_InsnReadDigitalInput
;
2821 this_board
->i_hwdrv_InsnWriteDigitalInput
;
2822 s
->insn_bits
= this_board
->i_hwdrv_InsnBitsDigitalInput
;
2824 s
->type
= COMEDI_SUBD_UNUSED
;
2826 /* Allocate and Initialise DO Subdevice Structures */
2827 s
= dev
->subdevices
+ 3;
2828 if (this_board
->i_NbrDoChannel
) {
2829 s
->type
= COMEDI_SUBD_DO
;
2831 SDF_READABLE
| SDF_WRITEABLE
| SDF_GROUND
| SDF_COMMON
;
2832 s
->n_chan
= this_board
->i_NbrDoChannel
;
2833 s
->maxdata
= this_board
->i_DoMaxdata
;
2834 s
->len_chanlist
= this_board
->i_NbrDoChannel
;
2835 s
->range_table
= &range_digital
;
2836 s
->io_bits
= 0xf; /* all bits output */
2838 s
->insn_config
= this_board
->i_hwdrv_InsnConfigDigitalOutput
; /* for digital output memory.. */
2840 this_board
->i_hwdrv_InsnWriteDigitalOutput
;
2842 this_board
->i_hwdrv_InsnBitsDigitalOutput
;
2844 this_board
->i_hwdrv_InsnReadDigitalOutput
;
2846 s
->type
= COMEDI_SUBD_UNUSED
;
2849 /* Allocate and Initialise Timer Subdevice Structures */
2850 s
= dev
->subdevices
+ 4;
2851 if (this_board
->i_Timer
) {
2852 s
->type
= COMEDI_SUBD_TIMER
;
2853 s
->subdev_flags
= SDF_WRITEABLE
| SDF_GROUND
| SDF_COMMON
;
2856 s
->len_chanlist
= 1;
2857 s
->range_table
= &range_digital
;
2859 s
->insn_write
= this_board
->i_hwdrv_InsnWriteTimer
;
2860 s
->insn_read
= this_board
->i_hwdrv_InsnReadTimer
;
2861 s
->insn_config
= this_board
->i_hwdrv_InsnConfigTimer
;
2862 s
->insn_bits
= this_board
->i_hwdrv_InsnBitsTimer
;
2864 s
->type
= COMEDI_SUBD_UNUSED
;
2867 /* Allocate and Initialise TTL */
2868 s
= dev
->subdevices
+ 5;
2869 if (this_board
->i_NbrTTLChannel
) {
2870 s
->type
= COMEDI_SUBD_TTLIO
;
2872 SDF_WRITEABLE
| SDF_READABLE
| SDF_GROUND
| SDF_COMMON
;
2873 s
->n_chan
= this_board
->i_NbrTTLChannel
;
2875 s
->io_bits
= 0; /* all bits input */
2876 s
->len_chanlist
= this_board
->i_NbrTTLChannel
;
2877 s
->range_table
= &range_digital
;
2878 s
->insn_config
= this_board
->i_hwdr_ConfigInitTTLIO
;
2879 s
->insn_bits
= this_board
->i_hwdr_ReadTTLIOBits
;
2880 s
->insn_read
= this_board
->i_hwdr_ReadTTLIOAllPortValue
;
2881 s
->insn_write
= this_board
->i_hwdr_WriteTTLIOChlOnOff
;
2883 s
->type
= COMEDI_SUBD_UNUSED
;
2887 s
= dev
->subdevices
+ 6;
2888 if (this_board
->i_PCIEeprom
) {
2889 s
->type
= COMEDI_SUBD_MEMORY
;
2890 s
->subdev_flags
= SDF_READABLE
| SDF_INTERNAL
;
2892 s
->maxdata
= 0xffff;
2893 s
->insn_read
= i_ADDIDATA_InsnReadEeprom
;
2895 s
->type
= COMEDI_SUBD_UNUSED
;
2899 printk("\ni_ADDI_Attach end\n");
2901 devpriv
->b_ValidDriver
= 1;
2906 +----------------------------------------------------------------------------+
2907 | Function name : static int i_ADDI_Detach(struct comedi_device *dev) |
2910 +----------------------------------------------------------------------------+
2911 | Task : Deallocates resources of the addi_common driver |
2912 | Free the DMA buffers, unregister irq. |
2914 +----------------------------------------------------------------------------+
2915 | Input Parameters : struct comedi_device *dev |
2918 +----------------------------------------------------------------------------+
2919 | Return Value : 0 |
2921 +----------------------------------------------------------------------------+
2924 static int i_ADDI_Detach(struct comedi_device
*dev
)
2928 if (devpriv
->b_ValidDriver
) {
2933 free_irq(dev
->irq
, dev
);
2936 if ((devpriv
->ps_BoardInfo
->pc_EepromChip
== NULL
)
2937 || (strcmp(devpriv
->ps_BoardInfo
->pc_EepromChip
,
2938 ADDIDATA_9054
) != 0)) {
2939 if (devpriv
->allocated
) {
2940 i_pci_card_free(devpriv
->amcc
);
2943 if (devpriv
->ul_DmaBufferVirtual
[0]) {
2944 free_pages((unsigned long)devpriv
->
2945 ul_DmaBufferVirtual
[0],
2946 devpriv
->ui_DmaBufferPages
[0]);
2949 if (devpriv
->ul_DmaBufferVirtual
[1]) {
2950 free_pages((unsigned long)devpriv
->
2951 ul_DmaBufferVirtual
[1],
2952 devpriv
->ui_DmaBufferPages
[1]);
2955 iounmap((void *)devpriv
->dw_AiBase
);
2957 if (devpriv
->allocated
) {
2958 i_pci_card_free(devpriv
->amcc
);
2962 if (pci_list_builded
) {
2963 /* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */
2964 v_pci_card_list_cleanup(this_board
->i_VendorId
);
2965 pci_list_builded
= 0;
2973 +----------------------------------------------------------------------------+
2974 | Function name : static int i_ADDI_Reset(struct comedi_device *dev) |
2976 +----------------------------------------------------------------------------+
2977 | Task : Disables all interrupts, Resets digital output to low, |
2978 | Set all analog output to low |
2980 +----------------------------------------------------------------------------+
2981 | Input Parameters : struct comedi_device *dev |
2984 +----------------------------------------------------------------------------+
2985 | Return Value : 0 |
2987 +----------------------------------------------------------------------------+
2990 static int i_ADDI_Reset(struct comedi_device
*dev
)
2993 this_board
->i_hwdrv_Reset(dev
);
2997 /* Interrupt function */
2999 +----------------------------------------------------------------------------+
3001 |static void v_ADDI_Interrupt(int irq, void *d) |
3003 +----------------------------------------------------------------------------+
3004 | Task : Registerd interrupt routine |
3006 +----------------------------------------------------------------------------+
3007 | Input Parameters : int irq |
3010 +----------------------------------------------------------------------------+
3013 +----------------------------------------------------------------------------+
3016 static irqreturn_t
v_ADDI_Interrupt(int irq
, void *d
)
3018 struct comedi_device
*dev
= d
;
3019 this_board
->v_hwdrv_Interrupt(irq
, d
);
3020 return IRQ_RETVAL(1);
3023 /* EEPROM Read Function */
3025 +----------------------------------------------------------------------------+
3027 |INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s,
3028 struct comedi_insn *insn,unsigned int *data)
3030 +----------------------------------------------------------------------------+
3031 | Task : Read 256 words from EEPROM |
3033 +----------------------------------------------------------------------------+
3034 | Input Parameters :(struct comedi_device *dev,struct comedi_subdevice *s,
3035 struct comedi_insn *insn,unsigned int *data) |
3038 +----------------------------------------------------------------------------+
3041 +----------------------------------------------------------------------------+
3044 static int i_ADDIDATA_InsnReadEeprom(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
3045 struct comedi_insn
*insn
, unsigned int *data
)
3047 unsigned short w_Data
;
3048 unsigned short w_Address
;
3049 w_Address
= CR_CHAN(insn
->chanspec
); /* address to be read as 0,1,2,3...255 */
3051 w_Data
= w_EepromReadWord(devpriv
->i_IobaseAmcc
,
3052 this_board
->pc_EepromChip
, 0x100 + (2 * w_Address
));
3054 /* multiplied by 2 bcozinput will be like 0,1,2...255 */