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 */