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 static int __devinit driver_addi_pci_probe(struct pci_dev *dev,
2545 const struct pci_device_id *ent)
2547 return comedi_pci_auto_config(dev, driver_addi.driver_name);
2550 static void __devexit driver_addi_pci_remove(struct pci_dev *dev)
2552 comedi_pci_auto_unconfig(dev);
2555 static struct pci_driver driver_addi_pci_driver = {
2556 .id_table = addi_apci_tbl,
2557 .probe = &driver_addi_pci_probe,
2558 .remove = __devexit_p(&driver_addi_pci_remove)
2561 static int __init driver_addi_init_module(void)
2565 retval = comedi_driver_register(&driver_addi);
2569 driver_addi_pci_driver.name = (char *)driver_addi.driver_name;
2570 return pci_register_driver(&driver_addi_pci_driver);
2573 static void __exit driver_addi_cleanup_module(void)
2575 pci_unregister_driver(&driver_addi_pci_driver);
2576 comedi_driver_unregister(&driver_addi);
2579 module_init(driver_addi_init_module);
2580 module_exit(driver_addi_cleanup_module);
2583 +----------------------------------------------------------------------------+
2584 | Function name :static int i_ADDI_Attach(struct comedi_device *dev, |
2585 | struct comedi_devconfig *it) |
2587 +----------------------------------------------------------------------------+
2588 | Task :Detects the card. |
2589 | Configure the driver for a particular board. |
2590 | This function does all the initializations and memory |
2591 | allocation of data structures for the driver. |
2592 +----------------------------------------------------------------------------+
2593 | Input Parameters :struct comedi_device *dev |
2594 | struct comedi_devconfig *it |
2596 +----------------------------------------------------------------------------+
2597 | Return Value : 0 |
2599 +----------------------------------------------------------------------------+
2602 static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it)
2604 struct comedi_subdevice *s;
2605 int ret, pages, i, n_subdevices;
2606 unsigned int dw_Dummy;
2607 resource_size_t io_addr[5];
2609 resource_size_t iobase_a, iobase_main, iobase_addon, iobase_reserved;
2610 struct pcilst_struct *card = NULL;
2611 unsigned char pci_bus, pci_slot, pci_func;
2614 ret = alloc_private(dev, sizeof(struct addi_private));
2618 if (!pci_list_builded) {
2619 v_pci_card_list_init(this_board->i_VendorId, 1); /* 1 for displaying the list.. */
2620 pci_list_builded = 1;
2622 /* printk("comedi%d: "ADDIDATA_DRIVER_NAME": board=%s",dev->minor,this_board->pc_DriverName); */
2624 if ((this_board->i_Dma) && (it->options[2] == 0)) {
2628 card = ptr_select_and_alloc_pci_card(this_board->i_VendorId,
2629 this_board->i_DeviceId,
2631 it->options[1], i_Dma);
2636 devpriv->allocated = 1;
2638 if ((i_pci_card_data(card, &pci_bus, &pci_slot, &pci_func, &io_addr[0],
2640 i_pci_card_free(card);
2641 printk(" - Can't get AMCC data!\n");
2645 iobase_a = io_addr[0];
2646 iobase_main = io_addr[1];
2647 iobase_addon = io_addr[2];
2648 iobase_reserved = io_addr[3];
2649 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]);
2651 if ((this_board->pc_EepromChip == NULL)
2652 || (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) {
2653 /************************************/
2654 /* Test if more that 1 address used */
2655 /************************************/
2657 if (this_board->i_IorangeBase1 != 0) {
2658 dev->iobase = (unsigned long)iobase_main; /* DAQ base address... */
2660 dev->iobase = (unsigned long)iobase_a; /* DAQ base address... */
2663 dev->board_name = this_board->pc_DriverName;
2664 devpriv->amcc = card;
2665 devpriv->iobase = (int) dev->iobase;
2666 devpriv->i_IobaseAmcc = (int) iobase_a; /* AMCC base address... */
2667 devpriv->i_IobaseAddon = (int) iobase_addon; /* ADD ON base address.... */
2668 devpriv->i_IobaseReserved = (int) iobase_reserved;
2669 devpriv->ps_BoardInfo = this_board;
2671 dev->board_name = this_board->pc_DriverName;
2672 dev->iobase = (unsigned long)io_addr[2];
2673 devpriv->amcc = card;
2674 devpriv->iobase = (int) io_addr[2];
2675 devpriv->ps_BoardInfo = this_board;
2676 devpriv->i_IobaseReserved = (int) io_addr[3];
2677 printk("\nioremap begin");
2678 devpriv->dw_AiBase = ioremap(io_addr[3],
2679 this_board->i_IorangeBase3);
2680 printk("\nioremap end");
2686 if (request_irq(irq, v_ADDI_Interrupt, IRQF_SHARED,
2687 this_board->pc_DriverName, dev) < 0) {
2688 printk(", unable to allocate IRQ %u, DISABLING IT",
2690 irq = 0; /* Can't use IRQ */
2692 printk("\nirq=%u", irq);
2695 printk(", IRQ disabled");
2698 printk("\nOption %d %d %d\n", it->options[0], it->options[1],
2702 /* Read eepeom and fill addi_board Structure */
2704 if (this_board->i_PCIEeprom) {
2705 printk("\nPCI Eeprom used");
2706 if (!(strcmp(this_board->pc_EepromChip, "S5920"))) {
2707 /* Set 3 wait stait */
2708 if (!(strcmp(this_board->pc_DriverName, "apci035"))) {
2709 outl(0x80808082, devpriv->i_IobaseAmcc + 0x60);
2711 outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
2713 /* Enable the interrupt for the controler */
2714 dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
2715 outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
2716 printk("\nEnable the interrupt for the controler");
2718 printk("\nRead Eeprom");
2719 i_EepromReadMainHeader(io_addr[0], this_board->pc_EepromChip,
2722 printk("\nPCI Eeprom unused");
2725 if (it->options[2] > 0) {
2726 devpriv->us_UseDma = ADDI_DISABLE;
2728 devpriv->us_UseDma = ADDI_ENABLE;
2731 if (this_board->i_Dma) {
2732 printk("\nDMA used");
2733 if (devpriv->us_UseDma == ADDI_ENABLE) {
2734 /* alloc DMA buffers */
2735 devpriv->b_DmaDoubleBuffer = 0;
2736 for (i = 0; i < 2; i++) {
2737 for (pages = 4; pages >= 0; pages--) {
2738 devpriv->ul_DmaBufferVirtual[i] =
2739 (void *) __get_free_pages(GFP_KERNEL, pages);
2741 if (devpriv->ul_DmaBufferVirtual[i])
2744 if (devpriv->ul_DmaBufferVirtual[i]) {
2745 devpriv->ui_DmaBufferPages[i] = pages;
2746 devpriv->ui_DmaBufferSize[i] =
2748 devpriv->ui_DmaBufferSamples[i] =
2750 ui_DmaBufferSize[i] >> 1;
2751 devpriv->ul_DmaBufferHw[i] =
2752 virt_to_bus((void *)devpriv->
2753 ul_DmaBufferVirtual[i]);
2756 if (!devpriv->ul_DmaBufferVirtual[0]) {
2758 (", Can't allocate DMA buffer, DMA disabled!");
2759 devpriv->us_UseDma = ADDI_DISABLE;
2762 if (devpriv->ul_DmaBufferVirtual[1]) {
2763 devpriv->b_DmaDoubleBuffer = 1;
2767 if ((devpriv->us_UseDma == ADDI_ENABLE)) {
2768 printk("\nDMA ENABLED\n");
2770 printk("\nDMA DISABLED\n");
2774 if (!strcmp(this_board->pc_DriverName, "apci1710")) {
2775 #ifdef CONFIG_APCI_1710
2776 i_ADDI_AttachPCI1710(dev);
2778 /* save base address */
2779 devpriv->s_BoardInfos.ui_Address = io_addr[2];
2782 /* Update-0.7.57->0.7.68dev->n_subdevices = 7; */
2784 ret = alloc_subdevices(dev, n_subdevices);
2788 /* Allocate and Initialise AI Subdevice Structures */
2789 s = dev->subdevices + 0;
2790 if ((this_board->i_NbrAiChannel)
2791 || (this_board->i_NbrAiChannelDiff)) {
2792 dev->read_subdev = s;
2793 s->type = COMEDI_SUBD_AI;
2795 SDF_READABLE | SDF_COMMON | SDF_GROUND
2797 if (this_board->i_NbrAiChannel) {
2798 s->n_chan = this_board->i_NbrAiChannel;
2799 devpriv->b_SingelDiff = 0;
2801 s->n_chan = this_board->i_NbrAiChannelDiff;
2802 devpriv->b_SingelDiff = 1;
2804 s->maxdata = this_board->i_AiMaxdata;
2805 s->len_chanlist = this_board->i_AiChannelList;
2806 s->range_table = this_board->pr_AiRangelist;
2808 /* Set the initialisation flag */
2809 devpriv->b_AiInitialisation = 1;
2812 this_board->i_hwdrv_InsnConfigAnalogInput;
2813 s->insn_read = this_board->i_hwdrv_InsnReadAnalogInput;
2815 this_board->i_hwdrv_InsnWriteAnalogInput;
2816 s->insn_bits = this_board->i_hwdrv_InsnBitsAnalogInput;
2818 this_board->i_hwdrv_CommandTestAnalogInput;
2819 s->do_cmd = this_board->i_hwdrv_CommandAnalogInput;
2820 s->cancel = this_board->i_hwdrv_CancelAnalogInput;
2823 s->type = COMEDI_SUBD_UNUSED;
2826 /* Allocate and Initialise AO Subdevice Structures */
2827 s = dev->subdevices + 1;
2828 if (this_board->i_NbrAoChannel) {
2829 s->type = COMEDI_SUBD_AO;
2830 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2831 s->n_chan = this_board->i_NbrAoChannel;
2832 s->maxdata = this_board->i_AoMaxdata;
2833 s->len_chanlist = this_board->i_NbrAoChannel;
2834 s->range_table = this_board->pr_AoRangelist;
2836 this_board->i_hwdrv_InsnConfigAnalogOutput;
2838 this_board->i_hwdrv_InsnWriteAnalogOutput;
2840 s->type = COMEDI_SUBD_UNUSED;
2842 /* Allocate and Initialise DI Subdevice Structures */
2843 s = dev->subdevices + 2;
2844 if (this_board->i_NbrDiChannel) {
2845 s->type = COMEDI_SUBD_DI;
2846 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON;
2847 s->n_chan = this_board->i_NbrDiChannel;
2849 s->len_chanlist = this_board->i_NbrDiChannel;
2850 s->range_table = &range_digital;
2851 s->io_bits = 0; /* all bits input */
2853 this_board->i_hwdrv_InsnConfigDigitalInput;
2854 s->insn_read = this_board->i_hwdrv_InsnReadDigitalInput;
2856 this_board->i_hwdrv_InsnWriteDigitalInput;
2857 s->insn_bits = this_board->i_hwdrv_InsnBitsDigitalInput;
2859 s->type = COMEDI_SUBD_UNUSED;
2861 /* Allocate and Initialise DO Subdevice Structures */
2862 s = dev->subdevices + 3;
2863 if (this_board->i_NbrDoChannel) {
2864 s->type = COMEDI_SUBD_DO;
2866 SDF_READABLE | SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2867 s->n_chan = this_board->i_NbrDoChannel;
2868 s->maxdata = this_board->i_DoMaxdata;
2869 s->len_chanlist = this_board->i_NbrDoChannel;
2870 s->range_table = &range_digital;
2871 s->io_bits = 0xf; /* all bits output */
2873 s->insn_config = this_board->i_hwdrv_InsnConfigDigitalOutput; /* for digital output memory.. */
2875 this_board->i_hwdrv_InsnWriteDigitalOutput;
2877 this_board->i_hwdrv_InsnBitsDigitalOutput;
2879 this_board->i_hwdrv_InsnReadDigitalOutput;
2881 s->type = COMEDI_SUBD_UNUSED;
2884 /* Allocate and Initialise Timer Subdevice Structures */
2885 s = dev->subdevices + 4;
2886 if (this_board->i_Timer) {
2887 s->type = COMEDI_SUBD_TIMER;
2888 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
2891 s->len_chanlist = 1;
2892 s->range_table = &range_digital;
2894 s->insn_write = this_board->i_hwdrv_InsnWriteTimer;
2895 s->insn_read = this_board->i_hwdrv_InsnReadTimer;
2896 s->insn_config = this_board->i_hwdrv_InsnConfigTimer;
2897 s->insn_bits = this_board->i_hwdrv_InsnBitsTimer;
2899 s->type = COMEDI_SUBD_UNUSED;
2902 /* Allocate and Initialise TTL */
2903 s = dev->subdevices + 5;
2904 if (this_board->i_NbrTTLChannel) {
2905 s->type = COMEDI_SUBD_TTLIO;
2907 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
2908 s->n_chan = this_board->i_NbrTTLChannel;
2910 s->io_bits = 0; /* all bits input */
2911 s->len_chanlist = this_board->i_NbrTTLChannel;
2912 s->range_table = &range_digital;
2913 s->insn_config = this_board->i_hwdr_ConfigInitTTLIO;
2914 s->insn_bits = this_board->i_hwdr_ReadTTLIOBits;
2915 s->insn_read = this_board->i_hwdr_ReadTTLIOAllPortValue;
2916 s->insn_write = this_board->i_hwdr_WriteTTLIOChlOnOff;
2918 s->type = COMEDI_SUBD_UNUSED;
2922 s = dev->subdevices + 6;
2923 if (this_board->i_PCIEeprom) {
2924 s->type = COMEDI_SUBD_MEMORY;
2925 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
2927 s->maxdata = 0xffff;
2928 s->insn_read = i_ADDIDATA_InsnReadEeprom;
2930 s->type = COMEDI_SUBD_UNUSED;
2934 printk("\ni_ADDI_Attach end\n");
2936 devpriv->b_ValidDriver = 1;
2941 +----------------------------------------------------------------------------+
2942 | Function name : static int i_ADDI_Detach(struct comedi_device *dev) |
2945 +----------------------------------------------------------------------------+
2946 | Task : Deallocates resources of the addi_common driver |
2947 | Free the DMA buffers, unregister irq. |
2949 +----------------------------------------------------------------------------+
2950 | Input Parameters : struct comedi_device *dev |
2953 +----------------------------------------------------------------------------+
2954 | Return Value : 0 |
2956 +----------------------------------------------------------------------------+
2959 static int i_ADDI_Detach(struct comedi_device *dev)
2963 if (devpriv->b_ValidDriver) {
2968 free_irq(dev->irq, dev);
2971 if ((devpriv->ps_BoardInfo->pc_EepromChip == NULL)
2972 || (strcmp(devpriv->ps_BoardInfo->pc_EepromChip,
2973 ADDIDATA_9054) != 0)) {
2974 if (devpriv->allocated) {
2975 i_pci_card_free(devpriv->amcc);
2978 if (devpriv->ul_DmaBufferVirtual[0]) {
2979 free_pages((unsigned long)devpriv->
2980 ul_DmaBufferVirtual[0],
2981 devpriv->ui_DmaBufferPages[0]);
2984 if (devpriv->ul_DmaBufferVirtual[1]) {
2985 free_pages((unsigned long)devpriv->
2986 ul_DmaBufferVirtual[1],
2987 devpriv->ui_DmaBufferPages[1]);
2990 iounmap(devpriv->dw_AiBase);
2992 if (devpriv->allocated) {
2993 i_pci_card_free(devpriv->amcc);
2997 if (pci_list_builded) {
2998 /* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */
2999 v_pci_card_list_cleanup(this_board->i_VendorId);
3000 pci_list_builded = 0;
3008 +----------------------------------------------------------------------------+
3009 | Function name : static int i_ADDI_Reset(struct comedi_device *dev) |
3011 +----------------------------------------------------------------------------+
3012 | Task : Disables all interrupts, Resets digital output to low, |
3013 | Set all analog output to low |
3015 +----------------------------------------------------------------------------+
3016 | Input Parameters : struct comedi_device *dev |
3019 +----------------------------------------------------------------------------+
3020 | Return Value : 0 |
3022 +----------------------------------------------------------------------------+
3025 static int i_ADDI_Reset(struct comedi_device *dev)
3028 this_board->i_hwdrv_Reset(dev);
3032 /* Interrupt function */
3034 +----------------------------------------------------------------------------+
3036 |static void v_ADDI_Interrupt(int irq, void *d) |
3038 +----------------------------------------------------------------------------+
3039 | Task : Registerd interrupt routine |
3041 +----------------------------------------------------------------------------+
3042 | Input Parameters : int irq |
3045 +----------------------------------------------------------------------------+
3048 +----------------------------------------------------------------------------+
3051 static irqreturn_t v_ADDI_Interrupt(int irq, void *d)
3053 struct comedi_device *dev = d;
3054 this_board->v_hwdrv_Interrupt(irq, d);
3055 return IRQ_RETVAL(1);
3058 /* EEPROM Read Function */
3060 +----------------------------------------------------------------------------+
3062 |INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,struct comedi_subdevice *s,
3063 struct comedi_insn *insn,unsigned int *data)
3065 +----------------------------------------------------------------------------+
3066 | Task : Read 256 words from EEPROM |
3068 +----------------------------------------------------------------------------+
3069 | Input Parameters :(struct comedi_device *dev,struct comedi_subdevice *s,
3070 struct comedi_insn *insn,unsigned int *data) |
3073 +----------------------------------------------------------------------------+
3076 +----------------------------------------------------------------------------+
3079 static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
3080 struct comedi_insn *insn, unsigned int *data)
3082 unsigned short w_Data;
3083 unsigned short w_Address;
3084 w_Address = CR_CHAN(insn->chanspec); /* address to be read as 0,1,2,3...255 */
3086 w_Data = w_EepromReadWord(devpriv->i_IobaseAmcc,
3087 this_board->pc_EepromChip, 0x100 + (2 * w_Address));
3089 /* multiplied by 2 bcozinput will be like 0,1,2...255 */