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/errno.h>
54 #include <linux/ioport.h>
55 #include <linux/delay.h>
56 #include <linux/interrupt.h>
57 #include <linux/timex.h>
58 #include <linux/timer.h>
59 #include <linux/pci.h>
60 #include <linux/gfp.h>
62 #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 #ifndef ADDIDATA_DRIVER_NAME
72 #define ADDIDATA_DRIVER_NAME "addi_common"
75 /* Update-0.7.57->0.7.68MODULE_AUTHOR("ADDI-DATA GmbH <info@addi-data.com>"); */
76 /* Update-0.7.57->0.7.68MODULE_DESCRIPTION("Comedi ADDI-DATA module"); */
77 /* Update-0.7.57->0.7.68MODULE_LICENSE("GPL"); */
79 #define devpriv ((struct addi_private *)dev->private)
80 #define this_board ((const struct addi_board *)dev->board_ptr)
82 #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
83 /* BYTE b_SaveFPUReg [94]; */
87 /* asm ("fstenv b_SaveFPUReg"); */
93 /* asm ("frstor b_SaveFPUReg"); */
98 #include "addi_eeprom.c"
99 #if (defined (CONFIG_APCI_3120) || defined (CONFIG_APCI_3001))
100 #include "hwdrv_apci3120.c"
102 #ifdef CONFIG_APCI_1032
103 #include "hwdrv_apci1032.c"
105 #ifdef CONFIG_APCI_1516
106 #include "hwdrv_apci1516.c"
108 #ifdef CONFIG_APCI_2016
109 #include "hwdrv_apci2016.c"
111 #ifdef CONFIG_APCI_2032
112 #include "hwdrv_apci2032.c"
114 #ifdef CONFIG_APCI_2200
115 #include "hwdrv_apci2200.c"
117 #ifdef CONFIG_APCI_1564
118 #include "hwdrv_apci1564.c"
120 #ifdef CONFIG_APCI_1500
121 #include "hwdrv_apci1500.c"
123 #ifdef CONFIG_APCI_3501
124 #include "hwdrv_apci3501.c"
126 #ifdef CONFIG_APCI_035
127 #include "hwdrv_apci035.c"
129 #if (defined (CONFIG_APCI_3200) || defined (CONFIG_APCI_3300))
130 #include "hwdrv_apci3200.c"
132 #ifdef CONFIG_APCI_1710
133 #include "hwdrv_APCI1710.c"
135 #ifdef CONFIG_APCI_16XX
136 #include "hwdrv_apci16xx.c"
138 #ifdef CONFIG_APCI_3XXX
139 #include "hwdrv_apci3xxx.c"
142 #ifndef COMEDI_SUBD_TTLIO
143 #define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
146 static DEFINE_PCI_DEVICE_TABLE(addi_apci_tbl) = {
147 #ifdef CONFIG_APCI_3120
148 {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x818D)},
150 #ifdef CONFIG_APCI_1032
151 {PCI_DEVICE(APCI1032_BOARD_VENDOR_ID, 0x1003)},
153 #ifdef CONFIG_APCI_1516
154 {PCI_DEVICE(APCI1516_BOARD_VENDOR_ID, 0x1001)},
156 #ifdef CONFIG_APCI_2016
157 {PCI_DEVICE(APCI2016_BOARD_VENDOR_ID, 0x1002)},
159 #ifdef CONFIG_APCI_2032
160 {PCI_DEVICE(APCI2032_BOARD_VENDOR_ID, 0x1004)},
162 #ifdef CONFIG_APCI_2200
163 {PCI_DEVICE(APCI2200_BOARD_VENDOR_ID, 0x1005)},
165 #ifdef CONFIG_APCI_1564
166 {PCI_DEVICE(APCI1564_BOARD_VENDOR_ID, 0x1006)},
168 #ifdef CONFIG_APCI_1500
169 {PCI_DEVICE(APCI1500_BOARD_VENDOR_ID, 0x80fc)},
171 #ifdef CONFIG_APCI_3001
172 {PCI_DEVICE(APCI3120_BOARD_VENDOR_ID, 0x828D)},
174 #ifdef CONFIG_APCI_3501
175 {PCI_DEVICE(APCI3501_BOARD_VENDOR_ID, 0x3001)},
177 #ifdef CONFIG_APCI_035
178 {PCI_DEVICE(APCI035_BOARD_VENDOR_ID, 0x0300)},
180 #ifdef CONFIG_APCI_3200
181 {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3000)},
183 #ifdef CONFIG_APCI_3300
184 {PCI_DEVICE(APCI3200_BOARD_VENDOR_ID, 0x3007)},
186 #ifdef CONFIG_APCI_1710
187 {PCI_DEVICE(APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID)},
189 #ifdef CONFIG_APCI_16XX
190 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x1009)},
191 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x100A)},
193 #ifdef CONFIG_APCI_3XXX
194 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3010)},
195 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300F)},
196 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300E)},
197 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3013)},
198 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3014)},
199 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3015)},
200 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3016)},
201 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3017)},
202 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3018)},
203 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3019)},
204 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301A)},
205 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301B)},
206 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301C)},
207 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301D)},
208 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301E)},
209 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x301F)},
210 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3020)},
211 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3021)},
212 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3022)},
213 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3023)},
214 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x300B)},
215 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3002)},
216 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3003)},
217 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3004)},
218 {PCI_DEVICE(PCI_VENDOR_ID_ADDIDATA, 0x3024)},
223 MODULE_DEVICE_TABLE(pci, addi_apci_tbl);
225 static const struct addi_board boardtypes[] = {
226 #ifdef CONFIG_APCI_3120
228 APCI3120_BOARD_VENDOR_ID,
231 APCI3120_ADDRESS_RANGE,
254 v_APCI3120_Interrupt,
256 i_APCI3120_InsnConfigAnalogInput,
257 i_APCI3120_InsnReadAnalogInput,
260 i_APCI3120_CommandTestAnalogInput,
261 i_APCI3120_CommandAnalogInput,
262 i_APCI3120_StopCyclicAcquisition,
264 i_APCI3120_InsnWriteAnalogOutput,
267 i_APCI3120_InsnReadDigitalInput,
269 i_APCI3120_InsnBitsDigitalInput,
270 i_APCI3120_InsnConfigDigitalOutput,
271 i_APCI3120_InsnWriteDigitalOutput,
272 i_APCI3120_InsnBitsDigitalOutput,
274 i_APCI3120_InsnConfigTimer,
275 i_APCI3120_InsnWriteTimer,
276 i_APCI3120_InsnReadTimer,
283 #ifdef CONFIG_APCI_1032
285 APCI1032_BOARD_VENDOR_ID,
288 APCI1032_ADDRESS_RANGE,
311 v_APCI1032_Interrupt,
323 i_APCI1032_ConfigDigitalInput,
324 i_APCI1032_Read1DigitalInput,
326 i_APCI1032_ReadMoreDigitalInput,
340 #ifdef CONFIG_APCI_1516
342 APCI1516_BOARD_VENDOR_ID,
345 APCI1516_ADDRESS_RANGE,
380 i_APCI1516_Read1DigitalInput,
382 i_APCI1516_ReadMoreDigitalInput,
383 i_APCI1516_ConfigDigitalOutput,
384 i_APCI1516_WriteDigitalOutput,
385 i_APCI1516_ReadDigitalOutput,
387 i_APCI1516_ConfigWatchdog,
388 i_APCI1516_StartStopWriteWatchdog,
389 i_APCI1516_ReadWatchdog,
396 #ifdef CONFIG_APCI_2016
398 APCI2016_BOARD_VENDOR_ID,
401 APCI2016_ADDRESS_RANGE,
440 i_APCI2016_ConfigDigitalOutput,
441 i_APCI2016_WriteDigitalOutput,
442 i_APCI2016_BitsDigitalOutput,
444 i_APCI2016_ConfigWatchdog,
445 i_APCI2016_StartStopWriteWatchdog,
446 i_APCI2016_ReadWatchdog,
453 #ifdef CONFIG_APCI_2032
455 APCI2032_BOARD_VENDOR_ID,
458 APCI2032_ADDRESS_RANGE,
481 v_APCI2032_Interrupt,
496 i_APCI2032_ConfigDigitalOutput,
497 i_APCI2032_WriteDigitalOutput,
498 i_APCI2032_ReadDigitalOutput,
499 i_APCI2032_ReadInterruptStatus,
500 i_APCI2032_ConfigWatchdog,
501 i_APCI2032_StartStopWriteWatchdog,
502 i_APCI2032_ReadWatchdog,
509 #ifdef CONFIG_APCI_2200
511 APCI2200_BOARD_VENDOR_ID,
514 APCI2200_ADDRESS_RANGE,
549 i_APCI2200_Read1DigitalInput,
551 i_APCI2200_ReadMoreDigitalInput,
552 i_APCI2200_ConfigDigitalOutput,
553 i_APCI2200_WriteDigitalOutput,
554 i_APCI2200_ReadDigitalOutput,
556 i_APCI2200_ConfigWatchdog,
557 i_APCI2200_StartStopWriteWatchdog,
558 i_APCI2200_ReadWatchdog,
565 #ifdef CONFIG_APCI_1564
567 APCI1564_BOARD_VENDOR_ID,
570 APCI1564_ADDRESS_RANGE,
593 v_APCI1564_Interrupt,
605 i_APCI1564_ConfigDigitalInput,
606 i_APCI1564_Read1DigitalInput,
608 i_APCI1564_ReadMoreDigitalInput,
609 i_APCI1564_ConfigDigitalOutput,
610 i_APCI1564_WriteDigitalOutput,
611 i_APCI1564_ReadDigitalOutput,
612 i_APCI1564_ReadInterruptStatus,
613 i_APCI1564_ConfigTimerCounterWatchdog,
614 i_APCI1564_StartStopWriteTimerCounterWatchdog,
615 i_APCI1564_ReadTimerCounterWatchdog,
622 #ifdef CONFIG_APCI_1500
624 APCI1500_BOARD_VENDOR_ID,
627 APCI1500_ADDRESS_RANGE,
650 v_APCI1500_Interrupt,
662 i_APCI1500_ConfigDigitalInputEvent,
663 i_APCI1500_Initialisation,
664 i_APCI1500_StartStopInputEvent,
665 i_APCI1500_ReadMoreDigitalInput,
666 i_APCI1500_ConfigDigitalOutputErrorInterrupt,
667 i_APCI1500_WriteDigitalOutput,
668 i_APCI1500_ConfigureInterrupt,
670 i_APCI1500_ConfigCounterTimerWatchdog,
671 i_APCI1500_StartStopTriggerTimerCounterWatchdog,
672 i_APCI1500_ReadInterruptMask,
673 i_APCI1500_ReadCounterTimerWatchdog,
679 #ifdef CONFIG_APCI_3001
681 APCI3120_BOARD_VENDOR_ID,
684 APCI3120_ADDRESS_RANGE,
707 v_APCI3120_Interrupt,
709 i_APCI3120_InsnConfigAnalogInput,
710 i_APCI3120_InsnReadAnalogInput,
713 i_APCI3120_CommandTestAnalogInput,
714 i_APCI3120_CommandAnalogInput,
715 i_APCI3120_StopCyclicAcquisition,
720 i_APCI3120_InsnReadDigitalInput,
722 i_APCI3120_InsnBitsDigitalInput,
723 i_APCI3120_InsnConfigDigitalOutput,
724 i_APCI3120_InsnWriteDigitalOutput,
725 i_APCI3120_InsnBitsDigitalOutput,
727 i_APCI3120_InsnConfigTimer,
728 i_APCI3120_InsnWriteTimer,
729 i_APCI3120_InsnReadTimer,
736 #ifdef CONFIG_APCI_3501
738 APCI3501_BOARD_VENDOR_ID,
741 APCI3501_ADDRESS_RANGE,
764 v_APCI3501_Interrupt,
772 i_APCI3501_ConfigAnalogOutput,
773 i_APCI3501_WriteAnalogOutput,
778 i_APCI3501_ReadDigitalInput,
779 i_APCI3501_ConfigDigitalOutput,
780 i_APCI3501_WriteDigitalOutput,
781 i_APCI3501_ReadDigitalOutput,
783 i_APCI3501_ConfigTimerCounterWatchdog,
784 i_APCI3501_StartStopWriteTimerCounterWatchdog,
785 i_APCI3501_ReadTimerCounterWatchdog,
792 #ifdef CONFIG_APCI_035
794 APCI035_BOARD_VENDOR_ID,
797 APCI035_ADDRESS_RANGE,
822 i_APCI035_ConfigAnalogInput,
823 i_APCI035_ReadAnalogInput,
840 i_APCI035_ConfigTimerWatchdog,
841 i_APCI035_StartStopWriteTimerWatchdog,
842 i_APCI035_ReadTimerWatchdog,
849 #ifdef CONFIG_APCI_3200
851 APCI3200_BOARD_VENDOR_ID,
877 v_APCI3200_Interrupt,
879 i_APCI3200_ConfigAnalogInput,
880 i_APCI3200_ReadAnalogInput,
881 i_APCI3200_InsnWriteReleaseAnalogInput,
882 i_APCI3200_InsnBits_AnalogInput_Test,
883 i_APCI3200_CommandTestAnalogInput,
884 i_APCI3200_CommandAnalogInput,
885 i_APCI3200_StopCyclicAcquisition,
892 i_APCI3200_ReadDigitalInput,
893 i_APCI3200_ConfigDigitalOutput,
894 i_APCI3200_WriteDigitalOutput,
895 i_APCI3200_ReadDigitalOutput,
906 #ifdef CONFIG_APCI_3300
907 /* Begin JK .20.10.2004 = APCI-3300 integration */
909 APCI3200_BOARD_VENDOR_ID,
935 v_APCI3200_Interrupt,
937 i_APCI3200_ConfigAnalogInput,
938 i_APCI3200_ReadAnalogInput,
939 i_APCI3200_InsnWriteReleaseAnalogInput,
940 i_APCI3200_InsnBits_AnalogInput_Test,
941 i_APCI3200_CommandTestAnalogInput,
942 i_APCI3200_CommandAnalogInput,
943 i_APCI3200_StopCyclicAcquisition,
950 i_APCI3200_ReadDigitalInput,
951 i_APCI3200_ConfigDigitalOutput,
952 i_APCI3200_WriteDigitalOutput,
953 i_APCI3200_ReadDigitalOutput,
964 #ifdef CONFIG_APCI_1710
965 {"apci1710", APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID,
990 v_APCI1710_Interrupt,
1019 #ifdef CONFIG_APCI_16XX
1021 PCI_VENDOR_ID_ADDIDATA,
1041 &range_apci16xx_ttl,
1071 i_APCI16XX_InsnConfigInitTTLIO,
1072 i_APCI16XX_InsnBitsReadTTLIO,
1073 i_APCI16XX_InsnReadTTLIOAllPortValue,
1074 i_APCI16XX_InsnBitsWriteTTLIO},
1077 PCI_VENDOR_ID_ADDIDATA,
1097 &range_apci16xx_ttl,
1127 i_APCI16XX_InsnConfigInitTTLIO,
1128 i_APCI16XX_InsnBitsReadTTLIO,
1129 i_APCI16XX_InsnReadTTLIOAllPortValue,
1130 i_APCI16XX_InsnBitsWriteTTLIO},
1132 #ifdef CONFIG_APCI_3XXX
1134 PCI_VENDOR_ID_ADDIDATA,
1154 &range_apci3XXX_ttl,
1160 v_APCI3XXX_Interrupt,
1162 i_APCI3XXX_InsnConfigAnalogInput,
1163 i_APCI3XXX_InsnReadAnalogInput,
1184 i_APCI3XXX_InsnConfigInitTTLIO,
1185 i_APCI3XXX_InsnBitsTTLIO,
1186 i_APCI3XXX_InsnReadTTLIO,
1187 i_APCI3XXX_InsnWriteTTLIO},
1190 PCI_VENDOR_ID_ADDIDATA,
1210 &range_apci3XXX_ttl,
1216 v_APCI3XXX_Interrupt,
1218 i_APCI3XXX_InsnConfigAnalogInput,
1219 i_APCI3XXX_InsnReadAnalogInput,
1240 i_APCI3XXX_InsnConfigInitTTLIO,
1241 i_APCI3XXX_InsnBitsTTLIO,
1242 i_APCI3XXX_InsnReadTTLIO,
1243 i_APCI3XXX_InsnWriteTTLIO},
1246 PCI_VENDOR_ID_ADDIDATA,
1266 &range_apci3XXX_ttl,
1272 v_APCI3XXX_Interrupt,
1274 i_APCI3XXX_InsnConfigAnalogInput,
1275 i_APCI3XXX_InsnReadAnalogInput,
1296 i_APCI3XXX_InsnConfigInitTTLIO,
1297 i_APCI3XXX_InsnBitsTTLIO,
1298 i_APCI3XXX_InsnReadTTLIO,
1299 i_APCI3XXX_InsnWriteTTLIO},
1302 PCI_VENDOR_ID_ADDIDATA,
1322 &range_apci3XXX_ttl,
1328 v_APCI3XXX_Interrupt,
1330 i_APCI3XXX_InsnConfigAnalogInput,
1331 i_APCI3XXX_InsnReadAnalogInput,
1352 i_APCI3XXX_InsnConfigInitTTLIO,
1353 i_APCI3XXX_InsnBitsTTLIO,
1354 i_APCI3XXX_InsnReadTTLIO,
1355 i_APCI3XXX_InsnWriteTTLIO},
1358 PCI_VENDOR_ID_ADDIDATA,
1378 &range_apci3XXX_ttl,
1384 v_APCI3XXX_Interrupt,
1386 i_APCI3XXX_InsnConfigAnalogInput,
1387 i_APCI3XXX_InsnReadAnalogInput,
1408 i_APCI3XXX_InsnConfigInitTTLIO,
1409 i_APCI3XXX_InsnBitsTTLIO,
1410 i_APCI3XXX_InsnReadTTLIO,
1411 i_APCI3XXX_InsnWriteTTLIO},
1414 PCI_VENDOR_ID_ADDIDATA,
1434 &range_apci3XXX_ttl,
1440 v_APCI3XXX_Interrupt,
1442 i_APCI3XXX_InsnConfigAnalogInput,
1443 i_APCI3XXX_InsnReadAnalogInput,
1464 i_APCI3XXX_InsnConfigInitTTLIO,
1465 i_APCI3XXX_InsnBitsTTLIO,
1466 i_APCI3XXX_InsnReadTTLIO,
1467 i_APCI3XXX_InsnWriteTTLIO},
1470 PCI_VENDOR_ID_ADDIDATA,
1490 &range_apci3XXX_ttl,
1496 v_APCI3XXX_Interrupt,
1498 i_APCI3XXX_InsnConfigAnalogInput,
1499 i_APCI3XXX_InsnReadAnalogInput,
1509 i_APCI3XXX_InsnReadDigitalInput,
1511 i_APCI3XXX_InsnBitsDigitalInput,
1513 i_APCI3XXX_InsnWriteDigitalOutput,
1514 i_APCI3XXX_InsnBitsDigitalOutput,
1515 i_APCI3XXX_InsnReadDigitalOutput,
1520 i_APCI3XXX_InsnConfigInitTTLIO,
1521 i_APCI3XXX_InsnBitsTTLIO,
1522 i_APCI3XXX_InsnReadTTLIO,
1523 i_APCI3XXX_InsnWriteTTLIO},
1526 PCI_VENDOR_ID_ADDIDATA,
1546 &range_apci3XXX_ttl,
1552 v_APCI3XXX_Interrupt,
1554 i_APCI3XXX_InsnConfigAnalogInput,
1555 i_APCI3XXX_InsnReadAnalogInput,
1565 i_APCI3XXX_InsnReadDigitalInput,
1567 i_APCI3XXX_InsnBitsDigitalInput,
1569 i_APCI3XXX_InsnWriteDigitalOutput,
1570 i_APCI3XXX_InsnBitsDigitalOutput,
1571 i_APCI3XXX_InsnReadDigitalOutput,
1576 i_APCI3XXX_InsnConfigInitTTLIO,
1577 i_APCI3XXX_InsnBitsTTLIO,
1578 i_APCI3XXX_InsnReadTTLIO,
1579 i_APCI3XXX_InsnWriteTTLIO},
1582 PCI_VENDOR_ID_ADDIDATA,
1602 &range_apci3XXX_ttl,
1608 v_APCI3XXX_Interrupt,
1610 i_APCI3XXX_InsnConfigAnalogInput,
1611 i_APCI3XXX_InsnReadAnalogInput,
1621 i_APCI3XXX_InsnReadDigitalInput,
1623 i_APCI3XXX_InsnBitsDigitalInput,
1625 i_APCI3XXX_InsnWriteDigitalOutput,
1626 i_APCI3XXX_InsnBitsDigitalOutput,
1627 i_APCI3XXX_InsnReadDigitalOutput,
1632 i_APCI3XXX_InsnConfigInitTTLIO,
1633 i_APCI3XXX_InsnBitsTTLIO,
1634 i_APCI3XXX_InsnReadTTLIO,
1635 i_APCI3XXX_InsnWriteTTLIO},
1638 PCI_VENDOR_ID_ADDIDATA,
1658 &range_apci3XXX_ttl,
1664 v_APCI3XXX_Interrupt,
1666 i_APCI3XXX_InsnConfigAnalogInput,
1667 i_APCI3XXX_InsnReadAnalogInput,
1677 i_APCI3XXX_InsnReadDigitalInput,
1679 i_APCI3XXX_InsnBitsDigitalInput,
1681 i_APCI3XXX_InsnWriteDigitalOutput,
1682 i_APCI3XXX_InsnBitsDigitalOutput,
1683 i_APCI3XXX_InsnReadDigitalOutput,
1688 i_APCI3XXX_InsnConfigInitTTLIO,
1689 i_APCI3XXX_InsnBitsTTLIO,
1690 i_APCI3XXX_InsnReadTTLIO,
1691 i_APCI3XXX_InsnWriteTTLIO},
1694 PCI_VENDOR_ID_ADDIDATA,
1714 &range_apci3XXX_ttl,
1720 v_APCI3XXX_Interrupt,
1722 i_APCI3XXX_InsnConfigAnalogInput,
1723 i_APCI3XXX_InsnReadAnalogInput,
1733 i_APCI3XXX_InsnReadDigitalInput,
1735 i_APCI3XXX_InsnBitsDigitalInput,
1737 i_APCI3XXX_InsnWriteDigitalOutput,
1738 i_APCI3XXX_InsnBitsDigitalOutput,
1739 i_APCI3XXX_InsnReadDigitalOutput,
1744 i_APCI3XXX_InsnConfigInitTTLIO,
1745 i_APCI3XXX_InsnBitsTTLIO,
1746 i_APCI3XXX_InsnReadTTLIO,
1747 i_APCI3XXX_InsnWriteTTLIO},
1750 PCI_VENDOR_ID_ADDIDATA,
1770 &range_apci3XXX_ttl,
1776 v_APCI3XXX_Interrupt,
1778 i_APCI3XXX_InsnConfigAnalogInput,
1779 i_APCI3XXX_InsnReadAnalogInput,
1789 i_APCI3XXX_InsnReadDigitalInput,
1791 i_APCI3XXX_InsnBitsDigitalInput,
1793 i_APCI3XXX_InsnWriteDigitalOutput,
1794 i_APCI3XXX_InsnBitsDigitalOutput,
1795 i_APCI3XXX_InsnReadDigitalOutput,
1800 i_APCI3XXX_InsnConfigInitTTLIO,
1801 i_APCI3XXX_InsnBitsTTLIO,
1802 i_APCI3XXX_InsnReadTTLIO,
1803 i_APCI3XXX_InsnWriteTTLIO},
1806 PCI_VENDOR_ID_ADDIDATA,
1826 &range_apci3XXX_ttl,
1832 v_APCI3XXX_Interrupt,
1834 i_APCI3XXX_InsnConfigAnalogInput,
1835 i_APCI3XXX_InsnReadAnalogInput,
1842 i_APCI3XXX_InsnWriteAnalogOutput,
1856 i_APCI3XXX_InsnConfigInitTTLIO,
1857 i_APCI3XXX_InsnBitsTTLIO,
1858 i_APCI3XXX_InsnReadTTLIO,
1859 i_APCI3XXX_InsnWriteTTLIO},
1862 PCI_VENDOR_ID_ADDIDATA,
1882 &range_apci3XXX_ttl,
1888 v_APCI3XXX_Interrupt,
1890 i_APCI3XXX_InsnConfigAnalogInput,
1891 i_APCI3XXX_InsnReadAnalogInput,
1898 i_APCI3XXX_InsnWriteAnalogOutput,
1912 i_APCI3XXX_InsnConfigInitTTLIO,
1913 i_APCI3XXX_InsnBitsTTLIO,
1914 i_APCI3XXX_InsnReadTTLIO,
1915 i_APCI3XXX_InsnWriteTTLIO},
1918 PCI_VENDOR_ID_ADDIDATA,
1938 &range_apci3XXX_ttl,
1944 v_APCI3XXX_Interrupt,
1946 i_APCI3XXX_InsnConfigAnalogInput,
1947 i_APCI3XXX_InsnReadAnalogInput,
1954 i_APCI3XXX_InsnWriteAnalogOutput,
1968 i_APCI3XXX_InsnConfigInitTTLIO,
1969 i_APCI3XXX_InsnBitsTTLIO,
1970 i_APCI3XXX_InsnReadTTLIO,
1971 i_APCI3XXX_InsnWriteTTLIO},
1974 PCI_VENDOR_ID_ADDIDATA,
1994 &range_apci3XXX_ttl,
2000 v_APCI3XXX_Interrupt,
2002 i_APCI3XXX_InsnConfigAnalogInput,
2003 i_APCI3XXX_InsnReadAnalogInput,
2010 i_APCI3XXX_InsnWriteAnalogOutput,
2024 i_APCI3XXX_InsnConfigInitTTLIO,
2025 i_APCI3XXX_InsnBitsTTLIO,
2026 i_APCI3XXX_InsnReadTTLIO,
2027 i_APCI3XXX_InsnWriteTTLIO},
2030 PCI_VENDOR_ID_ADDIDATA,
2050 &range_apci3XXX_ttl,
2056 v_APCI3XXX_Interrupt,
2058 i_APCI3XXX_InsnConfigAnalogInput,
2059 i_APCI3XXX_InsnReadAnalogInput,
2066 i_APCI3XXX_InsnWriteAnalogOutput,
2069 i_APCI3XXX_InsnReadDigitalInput,
2071 i_APCI3XXX_InsnBitsDigitalInput,
2073 i_APCI3XXX_InsnWriteDigitalOutput,
2074 i_APCI3XXX_InsnBitsDigitalOutput,
2075 i_APCI3XXX_InsnReadDigitalOutput,
2080 i_APCI3XXX_InsnConfigInitTTLIO,
2081 i_APCI3XXX_InsnBitsTTLIO,
2082 i_APCI3XXX_InsnReadTTLIO,
2083 i_APCI3XXX_InsnWriteTTLIO},
2086 PCI_VENDOR_ID_ADDIDATA,
2106 &range_apci3XXX_ttl,
2112 v_APCI3XXX_Interrupt,
2114 i_APCI3XXX_InsnConfigAnalogInput,
2115 i_APCI3XXX_InsnReadAnalogInput,
2122 i_APCI3XXX_InsnWriteAnalogOutput,
2125 i_APCI3XXX_InsnReadDigitalInput,
2127 i_APCI3XXX_InsnBitsDigitalInput,
2129 i_APCI3XXX_InsnWriteDigitalOutput,
2130 i_APCI3XXX_InsnBitsDigitalOutput,
2131 i_APCI3XXX_InsnReadDigitalOutput,
2136 i_APCI3XXX_InsnConfigInitTTLIO,
2137 i_APCI3XXX_InsnBitsTTLIO,
2138 i_APCI3XXX_InsnReadTTLIO,
2139 i_APCI3XXX_InsnWriteTTLIO},
2142 PCI_VENDOR_ID_ADDIDATA,
2162 &range_apci3XXX_ttl,
2168 v_APCI3XXX_Interrupt,
2170 i_APCI3XXX_InsnConfigAnalogInput,
2171 i_APCI3XXX_InsnReadAnalogInput,
2178 i_APCI3XXX_InsnWriteAnalogOutput,
2181 i_APCI3XXX_InsnReadDigitalInput,
2183 i_APCI3XXX_InsnBitsDigitalInput,
2185 i_APCI3XXX_InsnWriteDigitalOutput,
2186 i_APCI3XXX_InsnBitsDigitalOutput,
2187 i_APCI3XXX_InsnReadDigitalOutput,
2192 i_APCI3XXX_InsnConfigInitTTLIO,
2193 i_APCI3XXX_InsnBitsTTLIO,
2194 i_APCI3XXX_InsnReadTTLIO,
2195 i_APCI3XXX_InsnWriteTTLIO},
2198 PCI_VENDOR_ID_ADDIDATA,
2218 &range_apci3XXX_ttl,
2224 v_APCI3XXX_Interrupt,
2226 i_APCI3XXX_InsnConfigAnalogInput,
2227 i_APCI3XXX_InsnReadAnalogInput,
2234 i_APCI3XXX_InsnWriteAnalogOutput,
2237 i_APCI3XXX_InsnReadDigitalInput,
2239 i_APCI3XXX_InsnBitsDigitalInput,
2241 i_APCI3XXX_InsnWriteDigitalOutput,
2242 i_APCI3XXX_InsnBitsDigitalOutput,
2243 i_APCI3XXX_InsnReadDigitalOutput,
2248 i_APCI3XXX_InsnConfigInitTTLIO,
2249 i_APCI3XXX_InsnBitsTTLIO,
2250 i_APCI3XXX_InsnReadTTLIO,
2251 i_APCI3XXX_InsnWriteTTLIO},
2254 PCI_VENDOR_ID_ADDIDATA,
2280 v_APCI3XXX_Interrupt,
2282 i_APCI3XXX_InsnConfigAnalogInput,
2283 i_APCI3XXX_InsnReadAnalogInput,
2293 i_APCI3XXX_InsnReadDigitalInput,
2295 i_APCI3XXX_InsnBitsDigitalInput,
2297 i_APCI3XXX_InsnWriteDigitalOutput,
2298 i_APCI3XXX_InsnBitsDigitalOutput,
2299 i_APCI3XXX_InsnReadDigitalOutput,
2309 PCI_VENDOR_ID_ADDIDATA,
2335 v_APCI3XXX_Interrupt,
2337 i_APCI3XXX_InsnConfigAnalogInput,
2338 i_APCI3XXX_InsnReadAnalogInput,
2348 i_APCI3XXX_InsnReadDigitalInput,
2350 i_APCI3XXX_InsnBitsDigitalInput,
2352 i_APCI3XXX_InsnWriteDigitalOutput,
2353 i_APCI3XXX_InsnBitsDigitalOutput,
2354 i_APCI3XXX_InsnReadDigitalOutput,
2364 PCI_VENDOR_ID_ADDIDATA,
2390 v_APCI3XXX_Interrupt,
2392 i_APCI3XXX_InsnConfigAnalogInput,
2393 i_APCI3XXX_InsnReadAnalogInput,
2403 i_APCI3XXX_InsnReadDigitalInput,
2405 i_APCI3XXX_InsnBitsDigitalInput,
2407 i_APCI3XXX_InsnWriteDigitalOutput,
2408 i_APCI3XXX_InsnBitsDigitalOutput,
2409 i_APCI3XXX_InsnReadDigitalOutput,
2419 PCI_VENDOR_ID_ADDIDATA,
2445 v_APCI3XXX_Interrupt,
2447 i_APCI3XXX_InsnConfigAnalogInput,
2448 i_APCI3XXX_InsnReadAnalogInput,
2458 i_APCI3XXX_InsnReadDigitalInput,
2460 i_APCI3XXX_InsnBitsDigitalInput,
2462 i_APCI3XXX_InsnWriteDigitalOutput,
2463 i_APCI3XXX_InsnBitsDigitalOutput,
2464 i_APCI3XXX_InsnReadDigitalOutput,
2474 PCI_VENDOR_ID_ADDIDATA,
2494 &range_apci3XXX_ttl,
2500 v_APCI3XXX_Interrupt,
2510 i_APCI3XXX_InsnWriteAnalogOutput,
2524 i_APCI3XXX_InsnConfigInitTTLIO,
2525 i_APCI3XXX_InsnBitsTTLIO,
2526 i_APCI3XXX_InsnReadTTLIO,
2527 i_APCI3XXX_InsnWriteTTLIO},
2531 #define n_boardtypes (sizeof(boardtypes)/sizeof(struct addi_board))
2533 static struct comedi_driver driver_addi = {
2534 .driver_name = ADDIDATA_DRIVER_NAME,
2535 .module = THIS_MODULE,
2536 .attach = i_ADDI_Attach,
2537 .detach = i_ADDI_Detach,
2538 .num_names = n_boardtypes,
2539 .board_name = &boardtypes[0].pc_DriverName,
2540 .offset = sizeof(struct addi_board),
2543 static int __devinit driver_addi_pci_probe(struct pci_dev *dev,
2544 const struct pci_device_id *ent)
2546 return comedi_pci_auto_config(dev, driver_addi.driver_name);
2549 static void __devexit driver_addi_pci_remove(struct pci_dev *dev)
2551 comedi_pci_auto_unconfig(dev);
2554 static struct pci_driver driver_addi_pci_driver = {
2555 .id_table = addi_apci_tbl,
2556 .probe = &driver_addi_pci_probe,
2557 .remove = __devexit_p(&driver_addi_pci_remove)
2560 static int __init driver_addi_init_module(void)
2564 retval = comedi_driver_register(&driver_addi);
2568 driver_addi_pci_driver.name = (char *)driver_addi.driver_name;
2569 return pci_register_driver(&driver_addi_pci_driver);
2572 static void __exit driver_addi_cleanup_module(void)
2574 pci_unregister_driver(&driver_addi_pci_driver);
2575 comedi_driver_unregister(&driver_addi);
2578 module_init(driver_addi_init_module);
2579 module_exit(driver_addi_cleanup_module);
2582 +----------------------------------------------------------------------------+
2583 | Function name :static int i_ADDI_Attach(struct comedi_device *dev, |
2584 | struct comedi_devconfig *it) |
2586 +----------------------------------------------------------------------------+
2587 | Task :Detects the card. |
2588 | Configure the driver for a particular board. |
2589 | This function does all the initializations and memory |
2590 | allocation of data structures for the driver. |
2591 +----------------------------------------------------------------------------+
2592 | Input Parameters :struct comedi_device *dev |
2593 | struct comedi_devconfig *it |
2595 +----------------------------------------------------------------------------+
2596 | Return Value : 0 |
2598 +----------------------------------------------------------------------------+
2601 static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it)
2603 struct comedi_subdevice *s;
2604 int ret, pages, i, n_subdevices;
2605 unsigned int dw_Dummy;
2606 resource_size_t io_addr[5];
2608 resource_size_t iobase_a, iobase_main, iobase_addon, iobase_reserved;
2609 struct pcilst_struct *card = NULL;
2610 unsigned char pci_bus, pci_slot, pci_func;
2613 ret = alloc_private(dev, sizeof(struct addi_private));
2617 if (!pci_list_builded) {
2618 v_pci_card_list_init(this_board->i_VendorId, 1); /* 1 for displaying the list.. */
2619 pci_list_builded = 1;
2621 /* printk("comedi%d: "ADDIDATA_DRIVER_NAME": board=%s",dev->minor,this_board->pc_DriverName); */
2623 if ((this_board->i_Dma) && (it->options[2] == 0)) {
2627 card = ptr_select_and_alloc_pci_card(this_board->i_VendorId,
2628 this_board->i_DeviceId,
2630 it->options[1], i_Dma);
2635 devpriv->allocated = 1;
2637 if ((i_pci_card_data(card, &pci_bus, &pci_slot, &pci_func, &io_addr[0],
2639 i_pci_card_free(card);
2640 printk(" - Can't get AMCC data!\n");
2644 iobase_a = io_addr[0];
2645 iobase_main = io_addr[1];
2646 iobase_addon = io_addr[2];
2647 iobase_reserved = io_addr[3];
2648 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]);
2650 if ((this_board->pc_EepromChip == NULL)
2651 || (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) {
2652 /************************************/
2653 /* Test if more that 1 address used */
2654 /************************************/
2656 if (this_board->i_IorangeBase1 != 0) {
2657 dev->iobase = (unsigned long)iobase_main; /* DAQ base address... */
2659 dev->iobase = (unsigned long)iobase_a; /* DAQ base address... */
2662 dev->board_name = this_board->pc_DriverName;
2663 devpriv->amcc = card;
2664 devpriv->iobase = (int) dev->iobase;
2665 devpriv->i_IobaseAmcc = (int) iobase_a; /* AMCC base address... */
2666 devpriv->i_IobaseAddon = (int) iobase_addon; /* ADD ON base address.... */
2667 devpriv->i_IobaseReserved = (int) iobase_reserved;
2669 dev->board_name = this_board->pc_DriverName;
2670 dev->iobase = (unsigned long)io_addr[2];
2671 devpriv->amcc = card;
2672 devpriv->iobase = (int) io_addr[2];
2673 devpriv->i_IobaseReserved = (int) io_addr[3];
2674 printk("\nioremap begin");
2675 devpriv->dw_AiBase = ioremap(io_addr[3],
2676 this_board->i_IorangeBase3);
2677 printk("\nioremap end");
2680 /* Initialize parameters that can be overridden in EEPROM */
2681 devpriv->s_EeParameters.i_NbrAiChannel = this_board->i_NbrAiChannel;
2682 devpriv->s_EeParameters.i_NbrAoChannel = this_board->i_NbrAoChannel;
2683 devpriv->s_EeParameters.i_AiMaxdata = this_board->i_AiMaxdata;
2684 devpriv->s_EeParameters.i_AoMaxdata = this_board->i_AoMaxdata;
2685 devpriv->s_EeParameters.i_NbrDiChannel = this_board->i_NbrDiChannel;
2686 devpriv->s_EeParameters.i_NbrDoChannel = this_board->i_NbrDoChannel;
2687 devpriv->s_EeParameters.i_DoMaxdata = this_board->i_DoMaxdata;
2688 devpriv->s_EeParameters.i_Dma = this_board->i_Dma;
2689 devpriv->s_EeParameters.i_Timer = this_board->i_Timer;
2690 devpriv->s_EeParameters.ui_MinAcquisitiontimeNs =
2691 this_board->ui_MinAcquisitiontimeNs;
2692 devpriv->s_EeParameters.ui_MinDelaytimeNs =
2693 this_board->ui_MinDelaytimeNs;
2698 if (request_irq(irq, v_ADDI_Interrupt, IRQF_SHARED,
2699 this_board->pc_DriverName, dev) < 0) {
2700 printk(", unable to allocate IRQ %u, DISABLING IT",
2702 irq = 0; /* Can't use IRQ */
2704 printk("\nirq=%u", irq);
2707 printk(", IRQ disabled");
2710 printk("\nOption %d %d %d\n", it->options[0], it->options[1],
2714 /* Read eepeom and fill addi_board Structure */
2716 if (this_board->i_PCIEeprom) {
2717 printk("\nPCI Eeprom used");
2718 if (!(strcmp(this_board->pc_EepromChip, "S5920"))) {
2719 /* Set 3 wait stait */
2720 if (!(strcmp(this_board->pc_DriverName, "apci035"))) {
2721 outl(0x80808082, devpriv->i_IobaseAmcc + 0x60);
2723 outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
2725 /* Enable the interrupt for the controller */
2726 dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
2727 outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
2728 printk("\nEnable the interrupt for the controller");
2730 printk("\nRead Eeprom");
2731 i_EepromReadMainHeader(io_addr[0], this_board->pc_EepromChip,
2734 printk("\nPCI Eeprom unused");
2737 if (it->options[2] > 0) {
2738 devpriv->us_UseDma = ADDI_DISABLE;
2740 devpriv->us_UseDma = ADDI_ENABLE;
2743 if (devpriv->s_EeParameters.i_Dma) {
2744 printk("\nDMA used");
2745 if (devpriv->us_UseDma == ADDI_ENABLE) {
2746 /* alloc DMA buffers */
2747 devpriv->b_DmaDoubleBuffer = 0;
2748 for (i = 0; i < 2; i++) {
2749 for (pages = 4; pages >= 0; pages--) {
2750 devpriv->ul_DmaBufferVirtual[i] =
2751 (void *) __get_free_pages(GFP_KERNEL, pages);
2753 if (devpriv->ul_DmaBufferVirtual[i])
2756 if (devpriv->ul_DmaBufferVirtual[i]) {
2757 devpriv->ui_DmaBufferPages[i] = pages;
2758 devpriv->ui_DmaBufferSize[i] =
2760 devpriv->ui_DmaBufferSamples[i] =
2762 ui_DmaBufferSize[i] >> 1;
2763 devpriv->ul_DmaBufferHw[i] =
2764 virt_to_bus((void *)devpriv->
2765 ul_DmaBufferVirtual[i]);
2768 if (!devpriv->ul_DmaBufferVirtual[0]) {
2770 (", Can't allocate DMA buffer, DMA disabled!");
2771 devpriv->us_UseDma = ADDI_DISABLE;
2774 if (devpriv->ul_DmaBufferVirtual[1]) {
2775 devpriv->b_DmaDoubleBuffer = 1;
2779 if ((devpriv->us_UseDma == ADDI_ENABLE)) {
2780 printk("\nDMA ENABLED\n");
2782 printk("\nDMA DISABLED\n");
2786 if (!strcmp(this_board->pc_DriverName, "apci1710")) {
2787 #ifdef CONFIG_APCI_1710
2788 i_ADDI_AttachPCI1710(dev);
2790 /* save base address */
2791 devpriv->s_BoardInfos.ui_Address = io_addr[2];
2794 /* Update-0.7.57->0.7.68dev->n_subdevices = 7; */
2796 ret = alloc_subdevices(dev, n_subdevices);
2800 /* Allocate and Initialise AI Subdevice Structures */
2801 s = dev->subdevices + 0;
2802 if ((devpriv->s_EeParameters.i_NbrAiChannel)
2803 || (this_board->i_NbrAiChannelDiff)) {
2804 dev->read_subdev = s;
2805 s->type = COMEDI_SUBD_AI;
2807 SDF_READABLE | SDF_COMMON | SDF_GROUND
2809 if (devpriv->s_EeParameters.i_NbrAiChannel) {
2811 devpriv->s_EeParameters.i_NbrAiChannel;
2812 devpriv->b_SingelDiff = 0;
2814 s->n_chan = this_board->i_NbrAiChannelDiff;
2815 devpriv->b_SingelDiff = 1;
2817 s->maxdata = devpriv->s_EeParameters.i_AiMaxdata;
2818 s->len_chanlist = this_board->i_AiChannelList;
2819 s->range_table = this_board->pr_AiRangelist;
2821 /* Set the initialisation flag */
2822 devpriv->b_AiInitialisation = 1;
2825 this_board->i_hwdrv_InsnConfigAnalogInput;
2826 s->insn_read = this_board->i_hwdrv_InsnReadAnalogInput;
2828 this_board->i_hwdrv_InsnWriteAnalogInput;
2829 s->insn_bits = this_board->i_hwdrv_InsnBitsAnalogInput;
2831 this_board->i_hwdrv_CommandTestAnalogInput;
2832 s->do_cmd = this_board->i_hwdrv_CommandAnalogInput;
2833 s->cancel = this_board->i_hwdrv_CancelAnalogInput;
2836 s->type = COMEDI_SUBD_UNUSED;
2839 /* Allocate and Initialise AO Subdevice Structures */
2840 s = dev->subdevices + 1;
2841 if (devpriv->s_EeParameters.i_NbrAoChannel) {
2842 s->type = COMEDI_SUBD_AO;
2843 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2844 s->n_chan = devpriv->s_EeParameters.i_NbrAoChannel;
2845 s->maxdata = devpriv->s_EeParameters.i_AoMaxdata;
2847 devpriv->s_EeParameters.i_NbrAoChannel;
2848 s->range_table = this_board->pr_AoRangelist;
2850 this_board->i_hwdrv_InsnConfigAnalogOutput;
2852 this_board->i_hwdrv_InsnWriteAnalogOutput;
2854 s->type = COMEDI_SUBD_UNUSED;
2856 /* Allocate and Initialise DI Subdevice Structures */
2857 s = dev->subdevices + 2;
2858 if (devpriv->s_EeParameters.i_NbrDiChannel) {
2859 s->type = COMEDI_SUBD_DI;
2860 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
2861 s->n_chan = devpriv->s_EeParameters.i_NbrDiChannel;
2864 devpriv->s_EeParameters.i_NbrDiChannel;
2865 s->range_table = &range_digital;
2866 s->io_bits = 0; /* all bits input */
2868 this_board->i_hwdrv_InsnConfigDigitalInput;
2869 s->insn_read = this_board->i_hwdrv_InsnReadDigitalInput;
2871 this_board->i_hwdrv_InsnWriteDigitalInput;
2872 s->insn_bits = this_board->i_hwdrv_InsnBitsDigitalInput;
2874 s->type = COMEDI_SUBD_UNUSED;
2876 /* Allocate and Initialise DO Subdevice Structures */
2877 s = dev->subdevices + 3;
2878 if (devpriv->s_EeParameters.i_NbrDoChannel) {
2879 s->type = COMEDI_SUBD_DO;
2881 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2882 s->n_chan = devpriv->s_EeParameters.i_NbrDoChannel;
2883 s->maxdata = devpriv->s_EeParameters.i_DoMaxdata;
2885 devpriv->s_EeParameters.i_NbrDoChannel;
2886 s->range_table = &range_digital;
2887 s->io_bits = 0xf; /* all bits output */
2889 s->insn_config = this_board->i_hwdrv_InsnConfigDigitalOutput; /* for digital output memory.. */
2891 this_board->i_hwdrv_InsnWriteDigitalOutput;
2893 this_board->i_hwdrv_InsnBitsDigitalOutput;
2895 this_board->i_hwdrv_InsnReadDigitalOutput;
2897 s->type = COMEDI_SUBD_UNUSED;
2900 /* Allocate and Initialise Timer Subdevice Structures */
2901 s = dev->subdevices + 4;
2902 if (devpriv->s_EeParameters.i_Timer) {
2903 s->type = COMEDI_SUBD_TIMER;
2904 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2907 s->len_chanlist = 1;
2908 s->range_table = &range_digital;
2910 s->insn_write = this_board->i_hwdrv_InsnWriteTimer;
2911 s->insn_read = this_board->i_hwdrv_InsnReadTimer;
2912 s->insn_config = this_board->i_hwdrv_InsnConfigTimer;
2913 s->insn_bits = this_board->i_hwdrv_InsnBitsTimer;
2915 s->type = COMEDI_SUBD_UNUSED;
2918 /* Allocate and Initialise TTL */
2919 s = dev->subdevices + 5;
2920 if (this_board->i_NbrTTLChannel) {
2921 s->type = COMEDI_SUBD_TTLIO;
2923 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
2924 s->n_chan = this_board->i_NbrTTLChannel;
2926 s->io_bits = 0; /* all bits input */
2927 s->len_chanlist = this_board->i_NbrTTLChannel;
2928 s->range_table = &range_digital;
2929 s->insn_config = this_board->i_hwdr_ConfigInitTTLIO;
2930 s->insn_bits = this_board->i_hwdr_ReadTTLIOBits;
2931 s->insn_read = this_board->i_hwdr_ReadTTLIOAllPortValue;
2932 s->insn_write = this_board->i_hwdr_WriteTTLIOChlOnOff;
2934 s->type = COMEDI_SUBD_UNUSED;
2938 s = dev->subdevices + 6;
2939 if (this_board->i_PCIEeprom) {
2940 s->type = COMEDI_SUBD_MEMORY;
2941 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
2943 s->maxdata = 0xffff;
2944 s->insn_read = i_ADDIDATA_InsnReadEeprom;
2946 s->type = COMEDI_SUBD_UNUSED;
2950 printk("\ni_ADDI_Attach end\n");
2952 devpriv->b_ValidDriver = 1;
2957 +----------------------------------------------------------------------------+
2958 | Function name : static int i_ADDI_Detach(struct comedi_device *dev) |
2961 +----------------------------------------------------------------------------+
2962 | Task : Deallocates resources of the addi_common driver |
2963 | Free the DMA buffers, unregister irq. |
2965 +----------------------------------------------------------------------------+
2966 | Input Parameters : struct comedi_device *dev |
2969 +----------------------------------------------------------------------------+
2970 | Return Value : 0 |
2972 +----------------------------------------------------------------------------+
2975 static int i_ADDI_Detach(struct comedi_device *dev)
2979 if (devpriv->b_ValidDriver) {
2984 free_irq(dev->irq, dev);
2987 if ((this_board->pc_EepromChip == NULL)
2988 || (strcmp(this_board->pc_EepromChip,
2989 ADDIDATA_9054) != 0)) {
2990 if (devpriv->allocated) {
2991 i_pci_card_free(devpriv->amcc);
2994 if (devpriv->ul_DmaBufferVirtual[0]) {
2995 free_pages((unsigned long)devpriv->
2996 ul_DmaBufferVirtual[0],
2997 devpriv->ui_DmaBufferPages[0]);
3000 if (devpriv->ul_DmaBufferVirtual[1]) {
3001 free_pages((unsigned long)devpriv->
3002 ul_DmaBufferVirtual[1],
3003 devpriv->ui_DmaBufferPages[1]);
3006 iounmap(devpriv->dw_AiBase);
3008 if (devpriv->allocated) {
3009 i_pci_card_free(devpriv->amcc);
3013 if (pci_list_builded) {
3014 /* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */
3015 v_pci_card_list_cleanup(this_board->i_VendorId);
3016 pci_list_builded = 0;
3024 +----------------------------------------------------------------------------+
3025 | Function name : static int i_ADDI_Reset(struct comedi_device *dev) |
3027 +----------------------------------------------------------------------------+
3028 | Task : Disables all interrupts, Resets digital output to low, |
3029 | Set all analog output to low |
3031 +----------------------------------------------------------------------------+
3032 | Input Parameters : struct comedi_device *dev |
3035 +----------------------------------------------------------------------------+
3036 | Return Value : 0 |
3038 +----------------------------------------------------------------------------+
3041 static int i_ADDI_Reset(struct comedi_device *dev)
3044 this_board->i_hwdrv_Reset(dev);
3048 /* Interrupt function */
3050 +----------------------------------------------------------------------------+
3052 |static void v_ADDI_Interrupt(int irq, void *d) |
3054 +----------------------------------------------------------------------------+
3055 | Task : Registerd interrupt routine |
3057 +----------------------------------------------------------------------------+
3058 | Input Parameters : int irq |
3061 +----------------------------------------------------------------------------+
3064 +----------------------------------------------------------------------------+
3067 static irqreturn_t v_ADDI_Interrupt(int irq, void *d)
3069 struct comedi_device *dev = d;
3070 this_board->v_hwdrv_Interrupt(irq, d);
3071 return IRQ_RETVAL(1);
3074 /* EEPROM Read Function */
3076 +----------------------------------------------------------------------------+
3078 |INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s,
3079 struct comedi_insn *insn,unsigned int *data)
3081 +----------------------------------------------------------------------------+
3082 | Task : Read 256 words from EEPROM |
3084 +----------------------------------------------------------------------------+
3085 | Input Parameters :(struct comedi_device *dev,struct comedi_subdevice *s,
3086 struct comedi_insn *insn,unsigned int *data) |
3089 +----------------------------------------------------------------------------+
3092 +----------------------------------------------------------------------------+
3095 static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
3096 struct comedi_insn *insn, unsigned int *data)
3098 unsigned short w_Data;
3099 unsigned short w_Address;
3100 w_Address = CR_CHAN(insn->chanspec); /* address to be read as 0,1,2,3...255 */
3102 w_Data = w_EepromReadWord(devpriv->i_IobaseAmcc,
3103 this_board->pc_EepromChip, 0x100 + (2 * w_Address));
3105 /* multiplied by 2 bcozinput will be like 0,1,2...255 */