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