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>
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 #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 ((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 {APCI3120_BOARD_VENDOR_ID, 0x818D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
150 #ifdef CONFIG_APCI_1032
151 {APCI1032_BOARD_VENDOR_ID, 0x1003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
153 #ifdef CONFIG_APCI_1516
154 {APCI1516_BOARD_VENDOR_ID, 0x1001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
156 #ifdef CONFIG_APCI_2016
157 {APCI2016_BOARD_VENDOR_ID, 0x1002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
159 #ifdef CONFIG_APCI_2032
160 {APCI2032_BOARD_VENDOR_ID, 0x1004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
162 #ifdef CONFIG_APCI_2200
163 {APCI2200_BOARD_VENDOR_ID, 0x1005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
165 #ifdef CONFIG_APCI_1564
166 {APCI1564_BOARD_VENDOR_ID, 0x1006, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
168 #ifdef CONFIG_APCI_1500
169 {APCI1500_BOARD_VENDOR_ID, 0x80fc, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
171 #ifdef CONFIG_APCI_3001
172 {APCI3120_BOARD_VENDOR_ID, 0x828D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
174 #ifdef CONFIG_APCI_3501
175 {APCI3501_BOARD_VENDOR_ID, 0x3001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
177 #ifdef CONFIG_APCI_035
178 {APCI035_BOARD_VENDOR_ID, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
180 #ifdef CONFIG_APCI_3200
181 {APCI3200_BOARD_VENDOR_ID, 0x3000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
183 #ifdef CONFIG_APCI_3300
184 {APCI3200_BOARD_VENDOR_ID, 0x3007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
186 #ifdef CONFIG_APCI_1710
187 {APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID,
188 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
190 #ifdef CONFIG_APCI_16XX
191 {0x15B8, 0x1009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
192 {0x15B8, 0x100A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
194 #ifdef CONFIG_APCI_3XXX
195 {0x15B8, 0x3010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
196 {0x15B8, 0x300F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
197 {0x15B8, 0x300E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
198 {0x15B8, 0x3013, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
199 {0x15B8, 0x3014, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
200 {0x15B8, 0x3015, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
201 {0x15B8, 0x3016, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
202 {0x15B8, 0x3017, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
203 {0x15B8, 0x3018, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
204 {0x15B8, 0x3019, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
205 {0x15B8, 0x301A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
206 {0x15B8, 0x301B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
207 {0x15B8, 0x301C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
208 {0x15B8, 0x301D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
209 {0x15B8, 0x301E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
210 {0x15B8, 0x301F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
211 {0x15B8, 0x3020, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
212 {0x15B8, 0x3021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
213 {0x15B8, 0x3022, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
214 {0x15B8, 0x3023, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
215 {0x15B8, 0x300B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
216 {0x15B8, 0x3002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
217 {0x15B8, 0x3003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
218 {0x15B8, 0x3004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
219 {0x15B8, 0x3024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
224 MODULE_DEVICE_TABLE(pci, addi_apci_tbl);
226 static const struct addi_board boardtypes[] = {
227 #ifdef CONFIG_APCI_3120
229 APCI3120_BOARD_VENDOR_ID,
232 APCI3120_ADDRESS_RANGE,
255 v_APCI3120_Interrupt,
257 i_APCI3120_InsnConfigAnalogInput,
258 i_APCI3120_InsnReadAnalogInput,
261 i_APCI3120_CommandTestAnalogInput,
262 i_APCI3120_CommandAnalogInput,
263 i_APCI3120_StopCyclicAcquisition,
265 i_APCI3120_InsnWriteAnalogOutput,
268 i_APCI3120_InsnReadDigitalInput,
270 i_APCI3120_InsnBitsDigitalInput,
271 i_APCI3120_InsnConfigDigitalOutput,
272 i_APCI3120_InsnWriteDigitalOutput,
273 i_APCI3120_InsnBitsDigitalOutput,
275 i_APCI3120_InsnConfigTimer,
276 i_APCI3120_InsnWriteTimer,
277 i_APCI3120_InsnReadTimer,
284 #ifdef CONFIG_APCI_1032
286 APCI1032_BOARD_VENDOR_ID,
289 APCI1032_ADDRESS_RANGE,
312 v_APCI1032_Interrupt,
324 i_APCI1032_ConfigDigitalInput,
325 i_APCI1032_Read1DigitalInput,
327 i_APCI1032_ReadMoreDigitalInput,
341 #ifdef CONFIG_APCI_1516
343 APCI1516_BOARD_VENDOR_ID,
346 APCI1516_ADDRESS_RANGE,
381 i_APCI1516_Read1DigitalInput,
383 i_APCI1516_ReadMoreDigitalInput,
384 i_APCI1516_ConfigDigitalOutput,
385 i_APCI1516_WriteDigitalOutput,
386 i_APCI1516_ReadDigitalOutput,
388 i_APCI1516_ConfigWatchdog,
389 i_APCI1516_StartStopWriteWatchdog,
390 i_APCI1516_ReadWatchdog,
397 #ifdef CONFIG_APCI_2016
399 APCI2016_BOARD_VENDOR_ID,
402 APCI2016_ADDRESS_RANGE,
441 i_APCI2016_ConfigDigitalOutput,
442 i_APCI2016_WriteDigitalOutput,
443 i_APCI2016_BitsDigitalOutput,
445 i_APCI2016_ConfigWatchdog,
446 i_APCI2016_StartStopWriteWatchdog,
447 i_APCI2016_ReadWatchdog,
454 #ifdef CONFIG_APCI_2032
456 APCI2032_BOARD_VENDOR_ID,
459 APCI2032_ADDRESS_RANGE,
482 v_APCI2032_Interrupt,
497 i_APCI2032_ConfigDigitalOutput,
498 i_APCI2032_WriteDigitalOutput,
499 i_APCI2032_ReadDigitalOutput,
500 i_APCI2032_ReadInterruptStatus,
501 i_APCI2032_ConfigWatchdog,
502 i_APCI2032_StartStopWriteWatchdog,
503 i_APCI2032_ReadWatchdog,
510 #ifdef CONFIG_APCI_2200
512 APCI2200_BOARD_VENDOR_ID,
515 APCI2200_ADDRESS_RANGE,
550 i_APCI2200_Read1DigitalInput,
552 i_APCI2200_ReadMoreDigitalInput,
553 i_APCI2200_ConfigDigitalOutput,
554 i_APCI2200_WriteDigitalOutput,
555 i_APCI2200_ReadDigitalOutput,
557 i_APCI2200_ConfigWatchdog,
558 i_APCI2200_StartStopWriteWatchdog,
559 i_APCI2200_ReadWatchdog,
566 #ifdef CONFIG_APCI_1564
568 APCI1564_BOARD_VENDOR_ID,
571 APCI1564_ADDRESS_RANGE,
594 v_APCI1564_Interrupt,
606 i_APCI1564_ConfigDigitalInput,
607 i_APCI1564_Read1DigitalInput,
609 i_APCI1564_ReadMoreDigitalInput,
610 i_APCI1564_ConfigDigitalOutput,
611 i_APCI1564_WriteDigitalOutput,
612 i_APCI1564_ReadDigitalOutput,
613 i_APCI1564_ReadInterruptStatus,
614 i_APCI1564_ConfigTimerCounterWatchdog,
615 i_APCI1564_StartStopWriteTimerCounterWatchdog,
616 i_APCI1564_ReadTimerCounterWatchdog,
623 #ifdef CONFIG_APCI_1500
625 APCI1500_BOARD_VENDOR_ID,
628 APCI1500_ADDRESS_RANGE,
651 v_APCI1500_Interrupt,
663 i_APCI1500_ConfigDigitalInputEvent,
664 i_APCI1500_Initialisation,
665 i_APCI1500_StartStopInputEvent,
666 i_APCI1500_ReadMoreDigitalInput,
667 i_APCI1500_ConfigDigitalOutputErrorInterrupt,
668 i_APCI1500_WriteDigitalOutput,
669 i_APCI1500_ConfigureInterrupt,
671 i_APCI1500_ConfigCounterTimerWatchdog,
672 i_APCI1500_StartStopTriggerTimerCounterWatchdog,
673 i_APCI1500_ReadInterruptMask,
674 i_APCI1500_ReadCounterTimerWatchdog,
680 #ifdef CONFIG_APCI_3001
682 APCI3120_BOARD_VENDOR_ID,
685 APCI3120_ADDRESS_RANGE,
708 v_APCI3120_Interrupt,
710 i_APCI3120_InsnConfigAnalogInput,
711 i_APCI3120_InsnReadAnalogInput,
714 i_APCI3120_CommandTestAnalogInput,
715 i_APCI3120_CommandAnalogInput,
716 i_APCI3120_StopCyclicAcquisition,
721 i_APCI3120_InsnReadDigitalInput,
723 i_APCI3120_InsnBitsDigitalInput,
724 i_APCI3120_InsnConfigDigitalOutput,
725 i_APCI3120_InsnWriteDigitalOutput,
726 i_APCI3120_InsnBitsDigitalOutput,
728 i_APCI3120_InsnConfigTimer,
729 i_APCI3120_InsnWriteTimer,
730 i_APCI3120_InsnReadTimer,
737 #ifdef CONFIG_APCI_3501
739 APCI3501_BOARD_VENDOR_ID,
742 APCI3501_ADDRESS_RANGE,
765 v_APCI3501_Interrupt,
773 i_APCI3501_ConfigAnalogOutput,
774 i_APCI3501_WriteAnalogOutput,
779 i_APCI3501_ReadDigitalInput,
780 i_APCI3501_ConfigDigitalOutput,
781 i_APCI3501_WriteDigitalOutput,
782 i_APCI3501_ReadDigitalOutput,
784 i_APCI3501_ConfigTimerCounterWatchdog,
785 i_APCI3501_StartStopWriteTimerCounterWatchdog,
786 i_APCI3501_ReadTimerCounterWatchdog,
793 #ifdef CONFIG_APCI_035
795 APCI035_BOARD_VENDOR_ID,
798 APCI035_ADDRESS_RANGE,
823 i_APCI035_ConfigAnalogInput,
824 i_APCI035_ReadAnalogInput,
841 i_APCI035_ConfigTimerWatchdog,
842 i_APCI035_StartStopWriteTimerWatchdog,
843 i_APCI035_ReadTimerWatchdog,
850 #ifdef CONFIG_APCI_3200
852 APCI3200_BOARD_VENDOR_ID,
878 v_APCI3200_Interrupt,
880 i_APCI3200_ConfigAnalogInput,
881 i_APCI3200_ReadAnalogInput,
882 i_APCI3200_InsnWriteReleaseAnalogInput,
883 i_APCI3200_InsnBits_AnalogInput_Test,
884 i_APCI3200_CommandTestAnalogInput,
885 i_APCI3200_CommandAnalogInput,
886 i_APCI3200_StopCyclicAcquisition,
893 i_APCI3200_ReadDigitalInput,
894 i_APCI3200_ConfigDigitalOutput,
895 i_APCI3200_WriteDigitalOutput,
896 i_APCI3200_ReadDigitalOutput,
907 #ifdef CONFIG_APCI_3300
908 /* Begin JK .20.10.2004 = APCI-3300 integration */
910 APCI3200_BOARD_VENDOR_ID,
936 v_APCI3200_Interrupt,
938 i_APCI3200_ConfigAnalogInput,
939 i_APCI3200_ReadAnalogInput,
940 i_APCI3200_InsnWriteReleaseAnalogInput,
941 i_APCI3200_InsnBits_AnalogInput_Test,
942 i_APCI3200_CommandTestAnalogInput,
943 i_APCI3200_CommandAnalogInput,
944 i_APCI3200_StopCyclicAcquisition,
951 i_APCI3200_ReadDigitalInput,
952 i_APCI3200_ConfigDigitalOutput,
953 i_APCI3200_WriteDigitalOutput,
954 i_APCI3200_ReadDigitalOutput,
965 #ifdef CONFIG_APCI_1710
966 {"apci1710", APCI1710_BOARD_VENDOR_ID, APCI1710_BOARD_DEVICE_ID,
991 v_APCI1710_Interrupt,
1020 #ifdef CONFIG_APCI_16XX
1042 &range_apci16xx_ttl,
1072 i_APCI16XX_InsnConfigInitTTLIO,
1073 i_APCI16XX_InsnBitsReadTTLIO,
1074 i_APCI16XX_InsnReadTTLIOAllPortValue,
1075 i_APCI16XX_InsnBitsWriteTTLIO},
1098 &range_apci16xx_ttl,
1128 i_APCI16XX_InsnConfigInitTTLIO,
1129 i_APCI16XX_InsnBitsReadTTLIO,
1130 i_APCI16XX_InsnReadTTLIOAllPortValue,
1131 i_APCI16XX_InsnBitsWriteTTLIO},
1133 #ifdef CONFIG_APCI_3XXX
1155 &range_apci3XXX_ttl,
1161 v_APCI3XXX_Interrupt,
1163 i_APCI3XXX_InsnConfigAnalogInput,
1164 i_APCI3XXX_InsnReadAnalogInput,
1185 i_APCI3XXX_InsnConfigInitTTLIO,
1186 i_APCI3XXX_InsnBitsTTLIO,
1187 i_APCI3XXX_InsnReadTTLIO,
1188 i_APCI3XXX_InsnWriteTTLIO},
1211 &range_apci3XXX_ttl,
1217 v_APCI3XXX_Interrupt,
1219 i_APCI3XXX_InsnConfigAnalogInput,
1220 i_APCI3XXX_InsnReadAnalogInput,
1241 i_APCI3XXX_InsnConfigInitTTLIO,
1242 i_APCI3XXX_InsnBitsTTLIO,
1243 i_APCI3XXX_InsnReadTTLIO,
1244 i_APCI3XXX_InsnWriteTTLIO},
1267 &range_apci3XXX_ttl,
1273 v_APCI3XXX_Interrupt,
1275 i_APCI3XXX_InsnConfigAnalogInput,
1276 i_APCI3XXX_InsnReadAnalogInput,
1297 i_APCI3XXX_InsnConfigInitTTLIO,
1298 i_APCI3XXX_InsnBitsTTLIO,
1299 i_APCI3XXX_InsnReadTTLIO,
1300 i_APCI3XXX_InsnWriteTTLIO},
1323 &range_apci3XXX_ttl,
1329 v_APCI3XXX_Interrupt,
1331 i_APCI3XXX_InsnConfigAnalogInput,
1332 i_APCI3XXX_InsnReadAnalogInput,
1353 i_APCI3XXX_InsnConfigInitTTLIO,
1354 i_APCI3XXX_InsnBitsTTLIO,
1355 i_APCI3XXX_InsnReadTTLIO,
1356 i_APCI3XXX_InsnWriteTTLIO},
1379 &range_apci3XXX_ttl,
1385 v_APCI3XXX_Interrupt,
1387 i_APCI3XXX_InsnConfigAnalogInput,
1388 i_APCI3XXX_InsnReadAnalogInput,
1409 i_APCI3XXX_InsnConfigInitTTLIO,
1410 i_APCI3XXX_InsnBitsTTLIO,
1411 i_APCI3XXX_InsnReadTTLIO,
1412 i_APCI3XXX_InsnWriteTTLIO},
1435 &range_apci3XXX_ttl,
1441 v_APCI3XXX_Interrupt,
1443 i_APCI3XXX_InsnConfigAnalogInput,
1444 i_APCI3XXX_InsnReadAnalogInput,
1465 i_APCI3XXX_InsnConfigInitTTLIO,
1466 i_APCI3XXX_InsnBitsTTLIO,
1467 i_APCI3XXX_InsnReadTTLIO,
1468 i_APCI3XXX_InsnWriteTTLIO},
1491 &range_apci3XXX_ttl,
1497 v_APCI3XXX_Interrupt,
1499 i_APCI3XXX_InsnConfigAnalogInput,
1500 i_APCI3XXX_InsnReadAnalogInput,
1510 i_APCI3XXX_InsnReadDigitalInput,
1512 i_APCI3XXX_InsnBitsDigitalInput,
1514 i_APCI3XXX_InsnWriteDigitalOutput,
1515 i_APCI3XXX_InsnBitsDigitalOutput,
1516 i_APCI3XXX_InsnReadDigitalOutput,
1521 i_APCI3XXX_InsnConfigInitTTLIO,
1522 i_APCI3XXX_InsnBitsTTLIO,
1523 i_APCI3XXX_InsnReadTTLIO,
1524 i_APCI3XXX_InsnWriteTTLIO},
1547 &range_apci3XXX_ttl,
1553 v_APCI3XXX_Interrupt,
1555 i_APCI3XXX_InsnConfigAnalogInput,
1556 i_APCI3XXX_InsnReadAnalogInput,
1566 i_APCI3XXX_InsnReadDigitalInput,
1568 i_APCI3XXX_InsnBitsDigitalInput,
1570 i_APCI3XXX_InsnWriteDigitalOutput,
1571 i_APCI3XXX_InsnBitsDigitalOutput,
1572 i_APCI3XXX_InsnReadDigitalOutput,
1577 i_APCI3XXX_InsnConfigInitTTLIO,
1578 i_APCI3XXX_InsnBitsTTLIO,
1579 i_APCI3XXX_InsnReadTTLIO,
1580 i_APCI3XXX_InsnWriteTTLIO},
1603 &range_apci3XXX_ttl,
1609 v_APCI3XXX_Interrupt,
1611 i_APCI3XXX_InsnConfigAnalogInput,
1612 i_APCI3XXX_InsnReadAnalogInput,
1622 i_APCI3XXX_InsnReadDigitalInput,
1624 i_APCI3XXX_InsnBitsDigitalInput,
1626 i_APCI3XXX_InsnWriteDigitalOutput,
1627 i_APCI3XXX_InsnBitsDigitalOutput,
1628 i_APCI3XXX_InsnReadDigitalOutput,
1633 i_APCI3XXX_InsnConfigInitTTLIO,
1634 i_APCI3XXX_InsnBitsTTLIO,
1635 i_APCI3XXX_InsnReadTTLIO,
1636 i_APCI3XXX_InsnWriteTTLIO},
1659 &range_apci3XXX_ttl,
1665 v_APCI3XXX_Interrupt,
1667 i_APCI3XXX_InsnConfigAnalogInput,
1668 i_APCI3XXX_InsnReadAnalogInput,
1678 i_APCI3XXX_InsnReadDigitalInput,
1680 i_APCI3XXX_InsnBitsDigitalInput,
1682 i_APCI3XXX_InsnWriteDigitalOutput,
1683 i_APCI3XXX_InsnBitsDigitalOutput,
1684 i_APCI3XXX_InsnReadDigitalOutput,
1689 i_APCI3XXX_InsnConfigInitTTLIO,
1690 i_APCI3XXX_InsnBitsTTLIO,
1691 i_APCI3XXX_InsnReadTTLIO,
1692 i_APCI3XXX_InsnWriteTTLIO},
1715 &range_apci3XXX_ttl,
1721 v_APCI3XXX_Interrupt,
1723 i_APCI3XXX_InsnConfigAnalogInput,
1724 i_APCI3XXX_InsnReadAnalogInput,
1734 i_APCI3XXX_InsnReadDigitalInput,
1736 i_APCI3XXX_InsnBitsDigitalInput,
1738 i_APCI3XXX_InsnWriteDigitalOutput,
1739 i_APCI3XXX_InsnBitsDigitalOutput,
1740 i_APCI3XXX_InsnReadDigitalOutput,
1745 i_APCI3XXX_InsnConfigInitTTLIO,
1746 i_APCI3XXX_InsnBitsTTLIO,
1747 i_APCI3XXX_InsnReadTTLIO,
1748 i_APCI3XXX_InsnWriteTTLIO},
1771 &range_apci3XXX_ttl,
1777 v_APCI3XXX_Interrupt,
1779 i_APCI3XXX_InsnConfigAnalogInput,
1780 i_APCI3XXX_InsnReadAnalogInput,
1790 i_APCI3XXX_InsnReadDigitalInput,
1792 i_APCI3XXX_InsnBitsDigitalInput,
1794 i_APCI3XXX_InsnWriteDigitalOutput,
1795 i_APCI3XXX_InsnBitsDigitalOutput,
1796 i_APCI3XXX_InsnReadDigitalOutput,
1801 i_APCI3XXX_InsnConfigInitTTLIO,
1802 i_APCI3XXX_InsnBitsTTLIO,
1803 i_APCI3XXX_InsnReadTTLIO,
1804 i_APCI3XXX_InsnWriteTTLIO},
1827 &range_apci3XXX_ttl,
1833 v_APCI3XXX_Interrupt,
1835 i_APCI3XXX_InsnConfigAnalogInput,
1836 i_APCI3XXX_InsnReadAnalogInput,
1843 i_APCI3XXX_InsnWriteAnalogOutput,
1857 i_APCI3XXX_InsnConfigInitTTLIO,
1858 i_APCI3XXX_InsnBitsTTLIO,
1859 i_APCI3XXX_InsnReadTTLIO,
1860 i_APCI3XXX_InsnWriteTTLIO},
1883 &range_apci3XXX_ttl,
1889 v_APCI3XXX_Interrupt,
1891 i_APCI3XXX_InsnConfigAnalogInput,
1892 i_APCI3XXX_InsnReadAnalogInput,
1899 i_APCI3XXX_InsnWriteAnalogOutput,
1913 i_APCI3XXX_InsnConfigInitTTLIO,
1914 i_APCI3XXX_InsnBitsTTLIO,
1915 i_APCI3XXX_InsnReadTTLIO,
1916 i_APCI3XXX_InsnWriteTTLIO},
1939 &range_apci3XXX_ttl,
1945 v_APCI3XXX_Interrupt,
1947 i_APCI3XXX_InsnConfigAnalogInput,
1948 i_APCI3XXX_InsnReadAnalogInput,
1955 i_APCI3XXX_InsnWriteAnalogOutput,
1969 i_APCI3XXX_InsnConfigInitTTLIO,
1970 i_APCI3XXX_InsnBitsTTLIO,
1971 i_APCI3XXX_InsnReadTTLIO,
1972 i_APCI3XXX_InsnWriteTTLIO},
1995 &range_apci3XXX_ttl,
2001 v_APCI3XXX_Interrupt,
2003 i_APCI3XXX_InsnConfigAnalogInput,
2004 i_APCI3XXX_InsnReadAnalogInput,
2011 i_APCI3XXX_InsnWriteAnalogOutput,
2025 i_APCI3XXX_InsnConfigInitTTLIO,
2026 i_APCI3XXX_InsnBitsTTLIO,
2027 i_APCI3XXX_InsnReadTTLIO,
2028 i_APCI3XXX_InsnWriteTTLIO},
2051 &range_apci3XXX_ttl,
2057 v_APCI3XXX_Interrupt,
2059 i_APCI3XXX_InsnConfigAnalogInput,
2060 i_APCI3XXX_InsnReadAnalogInput,
2067 i_APCI3XXX_InsnWriteAnalogOutput,
2070 i_APCI3XXX_InsnReadDigitalInput,
2072 i_APCI3XXX_InsnBitsDigitalInput,
2074 i_APCI3XXX_InsnWriteDigitalOutput,
2075 i_APCI3XXX_InsnBitsDigitalOutput,
2076 i_APCI3XXX_InsnReadDigitalOutput,
2081 i_APCI3XXX_InsnConfigInitTTLIO,
2082 i_APCI3XXX_InsnBitsTTLIO,
2083 i_APCI3XXX_InsnReadTTLIO,
2084 i_APCI3XXX_InsnWriteTTLIO},
2107 &range_apci3XXX_ttl,
2113 v_APCI3XXX_Interrupt,
2115 i_APCI3XXX_InsnConfigAnalogInput,
2116 i_APCI3XXX_InsnReadAnalogInput,
2123 i_APCI3XXX_InsnWriteAnalogOutput,
2126 i_APCI3XXX_InsnReadDigitalInput,
2128 i_APCI3XXX_InsnBitsDigitalInput,
2130 i_APCI3XXX_InsnWriteDigitalOutput,
2131 i_APCI3XXX_InsnBitsDigitalOutput,
2132 i_APCI3XXX_InsnReadDigitalOutput,
2137 i_APCI3XXX_InsnConfigInitTTLIO,
2138 i_APCI3XXX_InsnBitsTTLIO,
2139 i_APCI3XXX_InsnReadTTLIO,
2140 i_APCI3XXX_InsnWriteTTLIO},
2163 &range_apci3XXX_ttl,
2169 v_APCI3XXX_Interrupt,
2171 i_APCI3XXX_InsnConfigAnalogInput,
2172 i_APCI3XXX_InsnReadAnalogInput,
2179 i_APCI3XXX_InsnWriteAnalogOutput,
2182 i_APCI3XXX_InsnReadDigitalInput,
2184 i_APCI3XXX_InsnBitsDigitalInput,
2186 i_APCI3XXX_InsnWriteDigitalOutput,
2187 i_APCI3XXX_InsnBitsDigitalOutput,
2188 i_APCI3XXX_InsnReadDigitalOutput,
2193 i_APCI3XXX_InsnConfigInitTTLIO,
2194 i_APCI3XXX_InsnBitsTTLIO,
2195 i_APCI3XXX_InsnReadTTLIO,
2196 i_APCI3XXX_InsnWriteTTLIO},
2219 &range_apci3XXX_ttl,
2225 v_APCI3XXX_Interrupt,
2227 i_APCI3XXX_InsnConfigAnalogInput,
2228 i_APCI3XXX_InsnReadAnalogInput,
2235 i_APCI3XXX_InsnWriteAnalogOutput,
2238 i_APCI3XXX_InsnReadDigitalInput,
2240 i_APCI3XXX_InsnBitsDigitalInput,
2242 i_APCI3XXX_InsnWriteDigitalOutput,
2243 i_APCI3XXX_InsnBitsDigitalOutput,
2244 i_APCI3XXX_InsnReadDigitalOutput,
2249 i_APCI3XXX_InsnConfigInitTTLIO,
2250 i_APCI3XXX_InsnBitsTTLIO,
2251 i_APCI3XXX_InsnReadTTLIO,
2252 i_APCI3XXX_InsnWriteTTLIO},
2281 v_APCI3XXX_Interrupt,
2283 i_APCI3XXX_InsnConfigAnalogInput,
2284 i_APCI3XXX_InsnReadAnalogInput,
2294 i_APCI3XXX_InsnReadDigitalInput,
2296 i_APCI3XXX_InsnBitsDigitalInput,
2298 i_APCI3XXX_InsnWriteDigitalOutput,
2299 i_APCI3XXX_InsnBitsDigitalOutput,
2300 i_APCI3XXX_InsnReadDigitalOutput,
2336 v_APCI3XXX_Interrupt,
2338 i_APCI3XXX_InsnConfigAnalogInput,
2339 i_APCI3XXX_InsnReadAnalogInput,
2349 i_APCI3XXX_InsnReadDigitalInput,
2351 i_APCI3XXX_InsnBitsDigitalInput,
2353 i_APCI3XXX_InsnWriteDigitalOutput,
2354 i_APCI3XXX_InsnBitsDigitalOutput,
2355 i_APCI3XXX_InsnReadDigitalOutput,
2391 v_APCI3XXX_Interrupt,
2393 i_APCI3XXX_InsnConfigAnalogInput,
2394 i_APCI3XXX_InsnReadAnalogInput,
2404 i_APCI3XXX_InsnReadDigitalInput,
2406 i_APCI3XXX_InsnBitsDigitalInput,
2408 i_APCI3XXX_InsnWriteDigitalOutput,
2409 i_APCI3XXX_InsnBitsDigitalOutput,
2410 i_APCI3XXX_InsnReadDigitalOutput,
2446 v_APCI3XXX_Interrupt,
2448 i_APCI3XXX_InsnConfigAnalogInput,
2449 i_APCI3XXX_InsnReadAnalogInput,
2459 i_APCI3XXX_InsnReadDigitalInput,
2461 i_APCI3XXX_InsnBitsDigitalInput,
2463 i_APCI3XXX_InsnWriteDigitalOutput,
2464 i_APCI3XXX_InsnBitsDigitalOutput,
2465 i_APCI3XXX_InsnReadDigitalOutput,
2495 &range_apci3XXX_ttl,
2501 v_APCI3XXX_Interrupt,
2511 i_APCI3XXX_InsnWriteAnalogOutput,
2525 i_APCI3XXX_InsnConfigInitTTLIO,
2526 i_APCI3XXX_InsnBitsTTLIO,
2527 i_APCI3XXX_InsnReadTTLIO,
2528 i_APCI3XXX_InsnWriteTTLIO},
2532 #define n_boardtypes (sizeof(boardtypes)/sizeof(struct addi_board))
2534 static struct comedi_driver driver_addi = {
2535 .driver_name = ADDIDATA_DRIVER_NAME,
2536 .module = THIS_MODULE,
2537 .attach = i_ADDI_Attach,
2538 .detach = i_ADDI_Detach,
2539 .num_names = n_boardtypes,
2540 .board_name = &boardtypes[0].pc_DriverName,
2541 .offset = sizeof(struct addi_board),
2544 COMEDI_PCI_INITCLEANUP(driver_addi, addi_apci_tbl);
2547 +----------------------------------------------------------------------------+
2548 | Function name :static int i_ADDI_Attach(struct comedi_device *dev, |
2549 | struct comedi_devconfig *it) |
2551 +----------------------------------------------------------------------------+
2552 | Task :Detects the card. |
2553 | Configure the driver for a particular board. |
2554 | This function does all the initializations and memory |
2555 | allocation of data structures for the driver. |
2556 +----------------------------------------------------------------------------+
2557 | Input Parameters :struct comedi_device *dev |
2558 | struct comedi_devconfig *it |
2560 +----------------------------------------------------------------------------+
2561 | Return Value : 0 |
2563 +----------------------------------------------------------------------------+
2566 static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it)
2568 struct comedi_subdevice *s;
2569 int ret, pages, i, n_subdevices;
2570 unsigned int dw_Dummy;
2571 resource_size_t io_addr[5];
2573 resource_size_t iobase_a, iobase_main, iobase_addon, iobase_reserved;
2574 struct pcilst_struct *card = NULL;
2575 unsigned char pci_bus, pci_slot, pci_func;
2577 static char c_Identifier[150];
2579 sprintf(c_Identifier, "Addi-Data GmbH Comedi %s",
2580 this_board->pc_DriverName);
2582 ret = alloc_private(dev, sizeof(struct addi_private));
2586 if (!pci_list_builded) {
2587 v_pci_card_list_init(this_board->i_VendorId, 1); /* 1 for displaying the list.. */
2588 pci_list_builded = 1;
2590 /* printk("comedi%d: "ADDIDATA_DRIVER_NAME": board=%s",dev->minor,this_board->pc_DriverName); */
2592 if ((this_board->i_Dma) && (it->options[2] == 0)) {
2596 card = ptr_select_and_alloc_pci_card(this_board->i_VendorId,
2597 this_board->i_DeviceId,
2599 it->options[1], i_Dma);
2604 devpriv->allocated = 1;
2606 if ((i_pci_card_data(card, &pci_bus, &pci_slot, &pci_func, &io_addr[0],
2608 i_pci_card_free(card);
2609 printk(" - Can't get AMCC data!\n");
2613 iobase_a = io_addr[0];
2614 iobase_main = io_addr[1];
2615 iobase_addon = io_addr[2];
2616 iobase_reserved = io_addr[3];
2617 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]);
2619 if ((this_board->pc_EepromChip == NULL)
2620 || (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) {
2621 /************************************/
2622 /* Test if more that 1 address used */
2623 /************************************/
2625 if (this_board->i_IorangeBase1 != 0) {
2626 dev->iobase = (unsigned long)iobase_main; /* DAQ base address... */
2628 dev->iobase = (unsigned long)iobase_a; /* DAQ base address... */
2631 dev->board_name = this_board->pc_DriverName;
2632 devpriv->amcc = card;
2633 devpriv->iobase = (int) dev->iobase;
2634 devpriv->i_IobaseAmcc = (int) iobase_a; /* AMCC base address... */
2635 devpriv->i_IobaseAddon = (int) iobase_addon; /* ADD ON base address.... */
2636 devpriv->i_IobaseReserved = (int) iobase_reserved;
2637 devpriv->ps_BoardInfo = this_board;
2639 dev->board_name = this_board->pc_DriverName;
2640 dev->iobase = (unsigned long)io_addr[2];
2641 devpriv->amcc = card;
2642 devpriv->iobase = (int) io_addr[2];
2643 devpriv->ps_BoardInfo = this_board;
2644 devpriv->i_IobaseReserved = (int) io_addr[3];
2645 printk("\nioremap begin");
2646 devpriv->dw_AiBase = ioremap(io_addr[3],
2647 this_board->i_IorangeBase3);
2648 printk("\nioremap end");
2654 if (request_irq(irq, v_ADDI_Interrupt, IRQF_SHARED,
2655 c_Identifier, dev) < 0) {
2656 printk(", unable to allocate IRQ %u, DISABLING IT",
2658 irq = 0; /* Can't use IRQ */
2660 printk("\nirq=%u", irq);
2663 printk(", IRQ disabled");
2666 printk("\nOption %d %d %d\n", it->options[0], it->options[1],
2670 /* Read eepeom and fill addi_board Structure */
2672 if (this_board->i_PCIEeprom) {
2673 printk("\nPCI Eeprom used");
2674 if (!(strcmp(this_board->pc_EepromChip, "S5920"))) {
2675 /* Set 3 wait stait */
2676 if (!(strcmp(this_board->pc_DriverName, "apci035"))) {
2677 outl(0x80808082, devpriv->i_IobaseAmcc + 0x60);
2679 outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
2681 /* Enable the interrupt for the controler */
2682 dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
2683 outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
2684 printk("\nEnable the interrupt for the controler");
2686 printk("\nRead Eeprom");
2687 i_EepromReadMainHeader(io_addr[0], this_board->pc_EepromChip,
2690 printk("\nPCI Eeprom unused");
2693 if (it->options[2] > 0) {
2694 devpriv->us_UseDma = ADDI_DISABLE;
2696 devpriv->us_UseDma = ADDI_ENABLE;
2699 if (this_board->i_Dma) {
2700 printk("\nDMA used");
2701 if (devpriv->us_UseDma == ADDI_ENABLE) {
2702 /* alloc DMA buffers */
2703 devpriv->b_DmaDoubleBuffer = 0;
2704 for (i = 0; i < 2; i++) {
2705 for (pages = 4; pages >= 0; pages--) {
2706 devpriv->ul_DmaBufferVirtual[i] =
2707 (void *) __get_free_pages(GFP_KERNEL, pages);
2709 if (devpriv->ul_DmaBufferVirtual[i])
2712 if (devpriv->ul_DmaBufferVirtual[i]) {
2713 devpriv->ui_DmaBufferPages[i] = pages;
2714 devpriv->ui_DmaBufferSize[i] =
2716 devpriv->ui_DmaBufferSamples[i] =
2718 ui_DmaBufferSize[i] >> 1;
2719 devpriv->ul_DmaBufferHw[i] =
2720 virt_to_bus((void *)devpriv->
2721 ul_DmaBufferVirtual[i]);
2724 if (!devpriv->ul_DmaBufferVirtual[0]) {
2726 (", Can't allocate DMA buffer, DMA disabled!");
2727 devpriv->us_UseDma = ADDI_DISABLE;
2730 if (devpriv->ul_DmaBufferVirtual[1]) {
2731 devpriv->b_DmaDoubleBuffer = 1;
2735 if ((devpriv->us_UseDma == ADDI_ENABLE)) {
2736 printk("\nDMA ENABLED\n");
2738 printk("\nDMA DISABLED\n");
2742 if (!strcmp(this_board->pc_DriverName, "apci1710")) {
2743 #ifdef CONFIG_APCI_1710
2744 i_ADDI_AttachPCI1710(dev);
2746 /* save base address */
2747 devpriv->s_BoardInfos.ui_Address = io_addr[2];
2750 /* Update-0.7.57->0.7.68dev->n_subdevices = 7; */
2752 ret = alloc_subdevices(dev, n_subdevices);
2756 /* Allocate and Initialise AI Subdevice Structures */
2757 s = dev->subdevices + 0;
2758 if ((this_board->i_NbrAiChannel)
2759 || (this_board->i_NbrAiChannelDiff)) {
2760 dev->read_subdev = s;
2761 s->type = COMEDI_SUBD_AI;
2763 SDF_READABLE | SDF_COMMON | SDF_GROUND
2765 if (this_board->i_NbrAiChannel) {
2766 s->n_chan = this_board->i_NbrAiChannel;
2767 devpriv->b_SingelDiff = 0;
2769 s->n_chan = this_board->i_NbrAiChannelDiff;
2770 devpriv->b_SingelDiff = 1;
2772 s->maxdata = this_board->i_AiMaxdata;
2773 s->len_chanlist = this_board->i_AiChannelList;
2774 s->range_table = this_board->pr_AiRangelist;
2776 /* Set the initialisation flag */
2777 devpriv->b_AiInitialisation = 1;
2780 this_board->i_hwdrv_InsnConfigAnalogInput;
2781 s->insn_read = this_board->i_hwdrv_InsnReadAnalogInput;
2783 this_board->i_hwdrv_InsnWriteAnalogInput;
2784 s->insn_bits = this_board->i_hwdrv_InsnBitsAnalogInput;
2786 this_board->i_hwdrv_CommandTestAnalogInput;
2787 s->do_cmd = this_board->i_hwdrv_CommandAnalogInput;
2788 s->cancel = this_board->i_hwdrv_CancelAnalogInput;
2791 s->type = COMEDI_SUBD_UNUSED;
2794 /* Allocate and Initialise AO Subdevice Structures */
2795 s = dev->subdevices + 1;
2796 if (this_board->i_NbrAoChannel) {
2797 s->type = COMEDI_SUBD_AO;
2798 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2799 s->n_chan = this_board->i_NbrAoChannel;
2800 s->maxdata = this_board->i_AoMaxdata;
2801 s->len_chanlist = this_board->i_NbrAoChannel;
2802 s->range_table = this_board->pr_AoRangelist;
2804 this_board->i_hwdrv_InsnConfigAnalogOutput;
2806 this_board->i_hwdrv_InsnWriteAnalogOutput;
2808 s->type = COMEDI_SUBD_UNUSED;
2810 /* Allocate and Initialise DI Subdevice Structures */
2811 s = dev->subdevices + 2;
2812 if (this_board->i_NbrDiChannel) {
2813 s->type = COMEDI_SUBD_DI;
2814 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
2815 s->n_chan = this_board->i_NbrDiChannel;
2817 s->len_chanlist = this_board->i_NbrDiChannel;
2818 s->range_table = &range_digital;
2819 s->io_bits = 0; /* all bits input */
2821 this_board->i_hwdrv_InsnConfigDigitalInput;
2822 s->insn_read = this_board->i_hwdrv_InsnReadDigitalInput;
2824 this_board->i_hwdrv_InsnWriteDigitalInput;
2825 s->insn_bits = this_board->i_hwdrv_InsnBitsDigitalInput;
2827 s->type = COMEDI_SUBD_UNUSED;
2829 /* Allocate and Initialise DO Subdevice Structures */
2830 s = dev->subdevices + 3;
2831 if (this_board->i_NbrDoChannel) {
2832 s->type = COMEDI_SUBD_DO;
2834 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2835 s->n_chan = this_board->i_NbrDoChannel;
2836 s->maxdata = this_board->i_DoMaxdata;
2837 s->len_chanlist = this_board->i_NbrDoChannel;
2838 s->range_table = &range_digital;
2839 s->io_bits = 0xf; /* all bits output */
2841 s->insn_config = this_board->i_hwdrv_InsnConfigDigitalOutput; /* for digital output memory.. */
2843 this_board->i_hwdrv_InsnWriteDigitalOutput;
2845 this_board->i_hwdrv_InsnBitsDigitalOutput;
2847 this_board->i_hwdrv_InsnReadDigitalOutput;
2849 s->type = COMEDI_SUBD_UNUSED;
2852 /* Allocate and Initialise Timer Subdevice Structures */
2853 s = dev->subdevices + 4;
2854 if (this_board->i_Timer) {
2855 s->type = COMEDI_SUBD_TIMER;
2856 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2859 s->len_chanlist = 1;
2860 s->range_table = &range_digital;
2862 s->insn_write = this_board->i_hwdrv_InsnWriteTimer;
2863 s->insn_read = this_board->i_hwdrv_InsnReadTimer;
2864 s->insn_config = this_board->i_hwdrv_InsnConfigTimer;
2865 s->insn_bits = this_board->i_hwdrv_InsnBitsTimer;
2867 s->type = COMEDI_SUBD_UNUSED;
2870 /* Allocate and Initialise TTL */
2871 s = dev->subdevices + 5;
2872 if (this_board->i_NbrTTLChannel) {
2873 s->type = COMEDI_SUBD_TTLIO;
2875 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
2876 s->n_chan = this_board->i_NbrTTLChannel;
2878 s->io_bits = 0; /* all bits input */
2879 s->len_chanlist = this_board->i_NbrTTLChannel;
2880 s->range_table = &range_digital;
2881 s->insn_config = this_board->i_hwdr_ConfigInitTTLIO;
2882 s->insn_bits = this_board->i_hwdr_ReadTTLIOBits;
2883 s->insn_read = this_board->i_hwdr_ReadTTLIOAllPortValue;
2884 s->insn_write = this_board->i_hwdr_WriteTTLIOChlOnOff;
2886 s->type = COMEDI_SUBD_UNUSED;
2890 s = dev->subdevices + 6;
2891 if (this_board->i_PCIEeprom) {
2892 s->type = COMEDI_SUBD_MEMORY;
2893 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
2895 s->maxdata = 0xffff;
2896 s->insn_read = i_ADDIDATA_InsnReadEeprom;
2898 s->type = COMEDI_SUBD_UNUSED;
2902 printk("\ni_ADDI_Attach end\n");
2904 devpriv->b_ValidDriver = 1;
2909 +----------------------------------------------------------------------------+
2910 | Function name : static int i_ADDI_Detach(struct comedi_device *dev) |
2913 +----------------------------------------------------------------------------+
2914 | Task : Deallocates resources of the addi_common driver |
2915 | Free the DMA buffers, unregister irq. |
2917 +----------------------------------------------------------------------------+
2918 | Input Parameters : struct comedi_device *dev |
2921 +----------------------------------------------------------------------------+
2922 | Return Value : 0 |
2924 +----------------------------------------------------------------------------+
2927 static int i_ADDI_Detach(struct comedi_device *dev)
2931 if (devpriv->b_ValidDriver) {
2936 free_irq(dev->irq, dev);
2939 if ((devpriv->ps_BoardInfo->pc_EepromChip == NULL)
2940 || (strcmp(devpriv->ps_BoardInfo->pc_EepromChip,
2941 ADDIDATA_9054) != 0)) {
2942 if (devpriv->allocated) {
2943 i_pci_card_free(devpriv->amcc);
2946 if (devpriv->ul_DmaBufferVirtual[0]) {
2947 free_pages((unsigned long)devpriv->
2948 ul_DmaBufferVirtual[0],
2949 devpriv->ui_DmaBufferPages[0]);
2952 if (devpriv->ul_DmaBufferVirtual[1]) {
2953 free_pages((unsigned long)devpriv->
2954 ul_DmaBufferVirtual[1],
2955 devpriv->ui_DmaBufferPages[1]);
2958 iounmap(devpriv->dw_AiBase);
2960 if (devpriv->allocated) {
2961 i_pci_card_free(devpriv->amcc);
2965 if (pci_list_builded) {
2966 /* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */
2967 v_pci_card_list_cleanup(this_board->i_VendorId);
2968 pci_list_builded = 0;
2976 +----------------------------------------------------------------------------+
2977 | Function name : static int i_ADDI_Reset(struct comedi_device *dev) |
2979 +----------------------------------------------------------------------------+
2980 | Task : Disables all interrupts, Resets digital output to low, |
2981 | Set all analog output to low |
2983 +----------------------------------------------------------------------------+
2984 | Input Parameters : struct comedi_device *dev |
2987 +----------------------------------------------------------------------------+
2988 | Return Value : 0 |
2990 +----------------------------------------------------------------------------+
2993 static int i_ADDI_Reset(struct comedi_device *dev)
2996 this_board->i_hwdrv_Reset(dev);
3000 /* Interrupt function */
3002 +----------------------------------------------------------------------------+
3004 |static void v_ADDI_Interrupt(int irq, void *d) |
3006 +----------------------------------------------------------------------------+
3007 | Task : Registerd interrupt routine |
3009 +----------------------------------------------------------------------------+
3010 | Input Parameters : int irq |
3013 +----------------------------------------------------------------------------+
3016 +----------------------------------------------------------------------------+
3019 static irqreturn_t v_ADDI_Interrupt(int irq, void *d)
3021 struct comedi_device *dev = d;
3022 this_board->v_hwdrv_Interrupt(irq, d);
3023 return IRQ_RETVAL(1);
3026 /* EEPROM Read Function */
3028 +----------------------------------------------------------------------------+
3030 |INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s,
3031 struct comedi_insn *insn,unsigned int *data)
3033 +----------------------------------------------------------------------------+
3034 | Task : Read 256 words from EEPROM |
3036 +----------------------------------------------------------------------------+
3037 | Input Parameters :(struct comedi_device *dev,struct comedi_subdevice *s,
3038 struct comedi_insn *insn,unsigned int *data) |
3041 +----------------------------------------------------------------------------+
3044 +----------------------------------------------------------------------------+
3047 static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
3048 struct comedi_insn *insn, unsigned int *data)
3050 unsigned short w_Data;
3051 unsigned short w_Address;
3052 w_Address = CR_CHAN(insn->chanspec); /* address to be read as 0,1,2,3...255 */
3054 w_Data = w_EepromReadWord(devpriv->i_IobaseAmcc,
3055 this_board->pc_EepromChip, 0x100 + (2 * w_Address));
3057 /* multiplied by 2 bcozinput will be like 0,1,2...255 */