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 shoud also find the complete GPL in the COPYING file accompanying this source code.
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstrasse 3 D-77833 Ottersweier |
28 +-----------------------------------------------------------------------+
29 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
30 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
31 +-----------------------------------------------------------------------+
32 | Project : ADDI DATA | Compiler : GCC |
33 | Modulname : addi_common.c | Version : 2.96 |
34 +-------------------------------+---------------------------------------+
36 +-----------------------------------------------------------------------+
37 | Description : ADDI COMMON Main Module |
38 +-----------------------------------------------------------------------+
40 | option[0] - PCI bus number - if bus number and slot number are 0, |
41 | then driver search for first unused card |
42 | option[1] - PCI slot number |
44 | option[2] = 0 - DMA ENABLE |
46 +----------+-----------+------------------------------------------------+
49 #include <linux/kernel.h>
50 #include <linux/module.h>
51 #include <linux/sched.h>
53 #include <linux/slab.h>
54 #include <linux/errno.h>
55 #include <linux/ioport.h>
56 #include <linux/delay.h>
57 #include <linux/interrupt.h>
58 #include <linux/timex.h>
59 #include <linux/timer.h>
60 #include <linux/pci.h>
61 #include "../../comedidev.h"
63 #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
66 #include "../comedi_fc.h"
68 #include "addi_common.h"
69 #include "addi_amcc_s5933.h"
71 //Update-0.7.57->0.7.68MODULE_AUTHOR("ADDI-DATA GmbH <info@addi-data.com>");
72 //Update-0.7.57->0.7.68MODULE_DESCRIPTION("Comedi ADDI-DATA module");
73 //Update-0.7.57->0.7.68MODULE_LICENSE("GPL");
75 #define devpriv ((addi_private *)dev->private)
76 #define this_board ((boardtype *)dev->board_ptr)
78 #if defined(CONFIG_APCI_1710) || defined(CONFIG_APCI_3200) || defined(CONFIG_APCI_3300)
79 //BYTE b_SaveFPUReg [94];
83 //asm ("fstenv b_SaveFPUReg");
89 // asm ("frstor b_SaveFPUReg");
94 #include "addi_eeprom.c"
95 #if (defined (CONFIG_APCI_3120) || defined (CONFIG_APCI_3001))
96 #include "hwdrv_apci3120.c"
98 #ifdef CONFIG_APCI_1032
99 #include "hwdrv_apci1032.c"
101 #ifdef CONFIG_APCI_1516
102 #include "hwdrv_apci1516.c"
104 #ifdef CONFIG_APCI_2016
105 #include "hwdrv_apci2016.c"
107 #ifdef CONFIG_APCI_2032
108 #include "hwdrv_apci2032.c"
110 #ifdef CONFIG_APCI_2200
111 #include "hwdrv_apci2200.c"
113 #ifdef CONFIG_APCI_1564
114 #include "hwdrv_apci1564.c"
116 #ifdef CONFIG_APCI_1500
117 #include "hwdrv_apci1500.c"
119 #ifdef CONFIG_APCI_3501
120 #include "hwdrv_apci3501.c"
122 #ifdef CONFIG_APCI_035
123 #include "hwdrv_apci035.c"
125 #if (defined (CONFIG_APCI_3200) || defined (CONFIG_APCI_3300))
126 #include "hwdrv_apci3200.c"
128 #ifdef CONFIG_APCI_1710
129 #include "hwdrv_APCI1710.c"
131 #ifdef CONFIG_APCI_16XX
132 #include "hwdrv_apci16xx.c"
134 #ifdef CONFIG_APCI_3XXX
135 #include "hwdrv_apci3xxx.c"
138 #ifndef COMEDI_SUBD_TTLIO
139 #define COMEDI_SUBD_TTLIO 11 /* Digital Input Output But TTL */
142 static DEFINE_PCI_DEVICE_TABLE(addi_apci_tbl
) = {
143 #ifdef CONFIG_APCI_3120
144 {APCI3120_BOARD_VENDOR_ID
, 0x818D, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
146 #ifdef CONFIG_APCI_1032
147 {APCI1032_BOARD_VENDOR_ID
, 0x1003, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
149 #ifdef CONFIG_APCI_1516
150 {APCI1516_BOARD_VENDOR_ID
, 0x1001, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
152 #ifdef CONFIG_APCI_2016
153 {APCI2016_BOARD_VENDOR_ID
, 0x1002, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
155 #ifdef CONFIG_APCI_2032
156 {APCI2032_BOARD_VENDOR_ID
, 0x1004, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
158 #ifdef CONFIG_APCI_2200
159 {APCI2200_BOARD_VENDOR_ID
, 0x1005, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
161 #ifdef CONFIG_APCI_1564
162 {APCI1564_BOARD_VENDOR_ID
, 0x1006, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
164 #ifdef CONFIG_APCI_1500
165 {APCI1500_BOARD_VENDOR_ID
, 0x80fc, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
167 #ifdef CONFIG_APCI_3001
168 {APCI3120_BOARD_VENDOR_ID
, 0x828D, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
170 #ifdef CONFIG_APCI_3501
171 {APCI3501_BOARD_VENDOR_ID
, 0x3001, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
173 #ifdef CONFIG_APCI_035
174 {APCI035_BOARD_VENDOR_ID
, 0x0300, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
176 #ifdef CONFIG_APCI_3200
177 {APCI3200_BOARD_VENDOR_ID
, 0x3000, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
179 #ifdef CONFIG_APCI_3300
180 {APCI3200_BOARD_VENDOR_ID
, 0x3007, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
182 #ifdef CONFIG_APCI_1710
183 {APCI1710_BOARD_VENDOR_ID
, APCI1710_BOARD_DEVICE_ID
,
184 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
186 #ifdef CONFIG_APCI_16XX
187 {0x15B8, 0x1009, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
188 {0x15B8, 0x100A, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
190 #ifdef CONFIG_APCI_3XXX
191 {0x15B8, 0x3010, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
192 {0x15B8, 0x300F, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
193 {0x15B8, 0x300E, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
194 {0x15B8, 0x3013, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
195 {0x15B8, 0x3014, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
196 {0x15B8, 0x3015, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
197 {0x15B8, 0x3016, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
198 {0x15B8, 0x3017, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
199 {0x15B8, 0x3018, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
200 {0x15B8, 0x3019, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
201 {0x15B8, 0x301A, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
202 {0x15B8, 0x301B, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
203 {0x15B8, 0x301C, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
204 {0x15B8, 0x301D, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
205 {0x15B8, 0x301E, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
206 {0x15B8, 0x301F, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
207 {0x15B8, 0x3020, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
208 {0x15B8, 0x3021, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
209 {0x15B8, 0x3022, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
210 {0x15B8, 0x3023, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
211 {0x15B8, 0x300B, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
212 {0x15B8, 0x3002, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
213 {0x15B8, 0x3003, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
214 {0x15B8, 0x3004, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
215 {0x15B8, 0x3024, PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
220 MODULE_DEVICE_TABLE(pci
, addi_apci_tbl
);
222 static const boardtype boardtypes
[] = {
223 #ifdef CONFIG_APCI_3120
225 APCI3120_BOARD_VENDOR_ID
,
228 APCI3120_ADDRESS_RANGE
,
251 v_APCI3120_Interrupt
,
253 i_APCI3120_InsnConfigAnalogInput
,
254 i_APCI3120_InsnReadAnalogInput
,
257 i_APCI3120_CommandTestAnalogInput
,
258 i_APCI3120_CommandAnalogInput
,
259 i_APCI3120_StopCyclicAcquisition
,
261 i_APCI3120_InsnWriteAnalogOutput
,
264 i_APCI3120_InsnReadDigitalInput
,
266 i_APCI3120_InsnBitsDigitalInput
,
267 i_APCI3120_InsnConfigDigitalOutput
,
268 i_APCI3120_InsnWriteDigitalOutput
,
269 i_APCI3120_InsnBitsDigitalOutput
,
271 i_APCI3120_InsnConfigTimer
,
272 i_APCI3120_InsnWriteTimer
,
273 i_APCI3120_InsnReadTimer
,
280 #ifdef CONFIG_APCI_1032
282 APCI1032_BOARD_VENDOR_ID
,
285 APCI1032_ADDRESS_RANGE
,
308 v_APCI1032_Interrupt
,
320 i_APCI1032_ConfigDigitalInput
,
321 i_APCI1032_Read1DigitalInput
,
323 i_APCI1032_ReadMoreDigitalInput
,
337 #ifdef CONFIG_APCI_1516
339 APCI1516_BOARD_VENDOR_ID
,
342 APCI1516_ADDRESS_RANGE
,
377 i_APCI1516_Read1DigitalInput
,
379 i_APCI1516_ReadMoreDigitalInput
,
380 i_APCI1516_ConfigDigitalOutput
,
381 i_APCI1516_WriteDigitalOutput
,
382 i_APCI1516_ReadDigitalOutput
,
384 i_APCI1516_ConfigWatchdog
,
385 i_APCI1516_StartStopWriteWatchdog
,
386 i_APCI1516_ReadWatchdog
,
393 #ifdef CONFIG_APCI_2016
395 APCI2016_BOARD_VENDOR_ID
,
398 APCI2016_ADDRESS_RANGE
,
437 i_APCI2016_ConfigDigitalOutput
,
438 i_APCI2016_WriteDigitalOutput
,
439 i_APCI2016_BitsDigitalOutput
,
441 i_APCI2016_ConfigWatchdog
,
442 i_APCI2016_StartStopWriteWatchdog
,
443 i_APCI2016_ReadWatchdog
,
450 #ifdef CONFIG_APCI_2032
452 APCI2032_BOARD_VENDOR_ID
,
455 APCI2032_ADDRESS_RANGE
,
478 v_APCI2032_Interrupt
,
493 i_APCI2032_ConfigDigitalOutput
,
494 i_APCI2032_WriteDigitalOutput
,
495 i_APCI2032_ReadDigitalOutput
,
496 i_APCI2032_ReadInterruptStatus
,
497 i_APCI2032_ConfigWatchdog
,
498 i_APCI2032_StartStopWriteWatchdog
,
499 i_APCI2032_ReadWatchdog
,
506 #ifdef CONFIG_APCI_2200
508 APCI2200_BOARD_VENDOR_ID
,
511 APCI2200_ADDRESS_RANGE
,
546 i_APCI2200_Read1DigitalInput
,
548 i_APCI2200_ReadMoreDigitalInput
,
549 i_APCI2200_ConfigDigitalOutput
,
550 i_APCI2200_WriteDigitalOutput
,
551 i_APCI2200_ReadDigitalOutput
,
553 i_APCI2200_ConfigWatchdog
,
554 i_APCI2200_StartStopWriteWatchdog
,
555 i_APCI2200_ReadWatchdog
,
562 #ifdef CONFIG_APCI_1564
564 APCI1564_BOARD_VENDOR_ID
,
567 APCI1564_ADDRESS_RANGE
,
590 v_APCI1564_Interrupt
,
602 i_APCI1564_ConfigDigitalInput
,
603 i_APCI1564_Read1DigitalInput
,
605 i_APCI1564_ReadMoreDigitalInput
,
606 i_APCI1564_ConfigDigitalOutput
,
607 i_APCI1564_WriteDigitalOutput
,
608 i_APCI1564_ReadDigitalOutput
,
609 i_APCI1564_ReadInterruptStatus
,
610 i_APCI1564_ConfigTimerCounterWatchdog
,
611 i_APCI1564_StartStopWriteTimerCounterWatchdog
,
612 i_APCI1564_ReadTimerCounterWatchdog
,
619 #ifdef CONFIG_APCI_1500
621 APCI1500_BOARD_VENDOR_ID
,
624 APCI1500_ADDRESS_RANGE
,
647 v_APCI1500_Interrupt
,
659 i_APCI1500_ConfigDigitalInputEvent
,
660 i_APCI1500_Initialisation
,
661 i_APCI1500_StartStopInputEvent
,
662 i_APCI1500_ReadMoreDigitalInput
,
663 i_APCI1500_ConfigDigitalOutputErrorInterrupt
,
664 i_APCI1500_WriteDigitalOutput
,
665 i_APCI1500_ConfigureInterrupt
,
667 i_APCI1500_ConfigCounterTimerWatchdog
,
668 i_APCI1500_StartStopTriggerTimerCounterWatchdog
,
669 i_APCI1500_ReadInterruptMask
,
670 i_APCI1500_ReadCounterTimerWatchdog
,
676 #ifdef CONFIG_APCI_3001
678 APCI3120_BOARD_VENDOR_ID
,
681 APCI3120_ADDRESS_RANGE
,
704 v_APCI3120_Interrupt
,
706 i_APCI3120_InsnConfigAnalogInput
,
707 i_APCI3120_InsnReadAnalogInput
,
710 i_APCI3120_CommandTestAnalogInput
,
711 i_APCI3120_CommandAnalogInput
,
712 i_APCI3120_StopCyclicAcquisition
,
717 i_APCI3120_InsnReadDigitalInput
,
719 i_APCI3120_InsnBitsDigitalInput
,
720 i_APCI3120_InsnConfigDigitalOutput
,
721 i_APCI3120_InsnWriteDigitalOutput
,
722 i_APCI3120_InsnBitsDigitalOutput
,
724 i_APCI3120_InsnConfigTimer
,
725 i_APCI3120_InsnWriteTimer
,
726 i_APCI3120_InsnReadTimer
,
733 #ifdef CONFIG_APCI_3501
735 APCI3501_BOARD_VENDOR_ID
,
738 APCI3501_ADDRESS_RANGE
,
761 v_APCI3501_Interrupt
,
769 i_APCI3501_ConfigAnalogOutput
,
770 i_APCI3501_WriteAnalogOutput
,
775 i_APCI3501_ReadDigitalInput
,
776 i_APCI3501_ConfigDigitalOutput
,
777 i_APCI3501_WriteDigitalOutput
,
778 i_APCI3501_ReadDigitalOutput
,
780 i_APCI3501_ConfigTimerCounterWatchdog
,
781 i_APCI3501_StartStopWriteTimerCounterWatchdog
,
782 i_APCI3501_ReadTimerCounterWatchdog
,
789 #ifdef CONFIG_APCI_035
791 APCI035_BOARD_VENDOR_ID
,
794 APCI035_ADDRESS_RANGE
,
819 i_APCI035_ConfigAnalogInput
,
820 i_APCI035_ReadAnalogInput
,
837 i_APCI035_ConfigTimerWatchdog
,
838 i_APCI035_StartStopWriteTimerWatchdog
,
839 i_APCI035_ReadTimerWatchdog
,
846 #ifdef CONFIG_APCI_3200
848 APCI3200_BOARD_VENDOR_ID
,
874 v_APCI3200_Interrupt
,
876 i_APCI3200_ConfigAnalogInput
,
877 i_APCI3200_ReadAnalogInput
,
878 i_APCI3200_InsnWriteReleaseAnalogInput
,
879 i_APCI3200_InsnBits_AnalogInput_Test
,
880 i_APCI3200_CommandTestAnalogInput
,
881 i_APCI3200_CommandAnalogInput
,
882 i_APCI3200_StopCyclicAcquisition
,
889 i_APCI3200_ReadDigitalInput
,
890 i_APCI3200_ConfigDigitalOutput
,
891 i_APCI3200_WriteDigitalOutput
,
892 i_APCI3200_ReadDigitalOutput
,
903 #ifdef CONFIG_APCI_3300
904 //Begin JK 20.10.2004: APCI-3300 integration
906 APCI3200_BOARD_VENDOR_ID
,
932 v_APCI3200_Interrupt
,
934 i_APCI3200_ConfigAnalogInput
,
935 i_APCI3200_ReadAnalogInput
,
936 i_APCI3200_InsnWriteReleaseAnalogInput
,
937 i_APCI3200_InsnBits_AnalogInput_Test
,
938 i_APCI3200_CommandTestAnalogInput
,
939 i_APCI3200_CommandAnalogInput
,
940 i_APCI3200_StopCyclicAcquisition
,
947 i_APCI3200_ReadDigitalInput
,
948 i_APCI3200_ConfigDigitalOutput
,
949 i_APCI3200_WriteDigitalOutput
,
950 i_APCI3200_ReadDigitalOutput
,
961 #ifdef CONFIG_APCI_1710
962 {"apci1710", APCI1710_BOARD_VENDOR_ID
, APCI1710_BOARD_DEVICE_ID
,
987 v_APCI1710_Interrupt
,
1016 #ifdef CONFIG_APCI_16XX
1038 &range_apci16xx_ttl
,
1068 i_APCI16XX_InsnConfigInitTTLIO
,
1069 i_APCI16XX_InsnBitsReadTTLIO
,
1070 i_APCI16XX_InsnReadTTLIOAllPortValue
,
1071 i_APCI16XX_InsnBitsWriteTTLIO
},
1094 &range_apci16xx_ttl
,
1124 i_APCI16XX_InsnConfigInitTTLIO
,
1125 i_APCI16XX_InsnBitsReadTTLIO
,
1126 i_APCI16XX_InsnReadTTLIOAllPortValue
,
1127 i_APCI16XX_InsnBitsWriteTTLIO
},
1129 #ifdef CONFIG_APCI_3XXX
1151 &range_apci3XXX_ttl
,
1157 v_APCI3XXX_Interrupt
,
1159 i_APCI3XXX_InsnConfigAnalogInput
,
1160 i_APCI3XXX_InsnReadAnalogInput
,
1181 i_APCI3XXX_InsnConfigInitTTLIO
,
1182 i_APCI3XXX_InsnBitsTTLIO
,
1183 i_APCI3XXX_InsnReadTTLIO
,
1184 i_APCI3XXX_InsnWriteTTLIO
},
1207 &range_apci3XXX_ttl
,
1213 v_APCI3XXX_Interrupt
,
1215 i_APCI3XXX_InsnConfigAnalogInput
,
1216 i_APCI3XXX_InsnReadAnalogInput
,
1237 i_APCI3XXX_InsnConfigInitTTLIO
,
1238 i_APCI3XXX_InsnBitsTTLIO
,
1239 i_APCI3XXX_InsnReadTTLIO
,
1240 i_APCI3XXX_InsnWriteTTLIO
},
1263 &range_apci3XXX_ttl
,
1269 v_APCI3XXX_Interrupt
,
1271 i_APCI3XXX_InsnConfigAnalogInput
,
1272 i_APCI3XXX_InsnReadAnalogInput
,
1293 i_APCI3XXX_InsnConfigInitTTLIO
,
1294 i_APCI3XXX_InsnBitsTTLIO
,
1295 i_APCI3XXX_InsnReadTTLIO
,
1296 i_APCI3XXX_InsnWriteTTLIO
},
1319 &range_apci3XXX_ttl
,
1325 v_APCI3XXX_Interrupt
,
1327 i_APCI3XXX_InsnConfigAnalogInput
,
1328 i_APCI3XXX_InsnReadAnalogInput
,
1349 i_APCI3XXX_InsnConfigInitTTLIO
,
1350 i_APCI3XXX_InsnBitsTTLIO
,
1351 i_APCI3XXX_InsnReadTTLIO
,
1352 i_APCI3XXX_InsnWriteTTLIO
},
1375 &range_apci3XXX_ttl
,
1381 v_APCI3XXX_Interrupt
,
1383 i_APCI3XXX_InsnConfigAnalogInput
,
1384 i_APCI3XXX_InsnReadAnalogInput
,
1405 i_APCI3XXX_InsnConfigInitTTLIO
,
1406 i_APCI3XXX_InsnBitsTTLIO
,
1407 i_APCI3XXX_InsnReadTTLIO
,
1408 i_APCI3XXX_InsnWriteTTLIO
},
1431 &range_apci3XXX_ttl
,
1437 v_APCI3XXX_Interrupt
,
1439 i_APCI3XXX_InsnConfigAnalogInput
,
1440 i_APCI3XXX_InsnReadAnalogInput
,
1461 i_APCI3XXX_InsnConfigInitTTLIO
,
1462 i_APCI3XXX_InsnBitsTTLIO
,
1463 i_APCI3XXX_InsnReadTTLIO
,
1464 i_APCI3XXX_InsnWriteTTLIO
},
1487 &range_apci3XXX_ttl
,
1493 v_APCI3XXX_Interrupt
,
1495 i_APCI3XXX_InsnConfigAnalogInput
,
1496 i_APCI3XXX_InsnReadAnalogInput
,
1506 i_APCI3XXX_InsnReadDigitalInput
,
1508 i_APCI3XXX_InsnBitsDigitalInput
,
1510 i_APCI3XXX_InsnWriteDigitalOutput
,
1511 i_APCI3XXX_InsnBitsDigitalOutput
,
1512 i_APCI3XXX_InsnReadDigitalOutput
,
1517 i_APCI3XXX_InsnConfigInitTTLIO
,
1518 i_APCI3XXX_InsnBitsTTLIO
,
1519 i_APCI3XXX_InsnReadTTLIO
,
1520 i_APCI3XXX_InsnWriteTTLIO
},
1543 &range_apci3XXX_ttl
,
1549 v_APCI3XXX_Interrupt
,
1551 i_APCI3XXX_InsnConfigAnalogInput
,
1552 i_APCI3XXX_InsnReadAnalogInput
,
1562 i_APCI3XXX_InsnReadDigitalInput
,
1564 i_APCI3XXX_InsnBitsDigitalInput
,
1566 i_APCI3XXX_InsnWriteDigitalOutput
,
1567 i_APCI3XXX_InsnBitsDigitalOutput
,
1568 i_APCI3XXX_InsnReadDigitalOutput
,
1573 i_APCI3XXX_InsnConfigInitTTLIO
,
1574 i_APCI3XXX_InsnBitsTTLIO
,
1575 i_APCI3XXX_InsnReadTTLIO
,
1576 i_APCI3XXX_InsnWriteTTLIO
},
1599 &range_apci3XXX_ttl
,
1605 v_APCI3XXX_Interrupt
,
1607 i_APCI3XXX_InsnConfigAnalogInput
,
1608 i_APCI3XXX_InsnReadAnalogInput
,
1618 i_APCI3XXX_InsnReadDigitalInput
,
1620 i_APCI3XXX_InsnBitsDigitalInput
,
1622 i_APCI3XXX_InsnWriteDigitalOutput
,
1623 i_APCI3XXX_InsnBitsDigitalOutput
,
1624 i_APCI3XXX_InsnReadDigitalOutput
,
1629 i_APCI3XXX_InsnConfigInitTTLIO
,
1630 i_APCI3XXX_InsnBitsTTLIO
,
1631 i_APCI3XXX_InsnReadTTLIO
,
1632 i_APCI3XXX_InsnWriteTTLIO
},
1655 &range_apci3XXX_ttl
,
1661 v_APCI3XXX_Interrupt
,
1663 i_APCI3XXX_InsnConfigAnalogInput
,
1664 i_APCI3XXX_InsnReadAnalogInput
,
1674 i_APCI3XXX_InsnReadDigitalInput
,
1676 i_APCI3XXX_InsnBitsDigitalInput
,
1678 i_APCI3XXX_InsnWriteDigitalOutput
,
1679 i_APCI3XXX_InsnBitsDigitalOutput
,
1680 i_APCI3XXX_InsnReadDigitalOutput
,
1685 i_APCI3XXX_InsnConfigInitTTLIO
,
1686 i_APCI3XXX_InsnBitsTTLIO
,
1687 i_APCI3XXX_InsnReadTTLIO
,
1688 i_APCI3XXX_InsnWriteTTLIO
},
1711 &range_apci3XXX_ttl
,
1717 v_APCI3XXX_Interrupt
,
1719 i_APCI3XXX_InsnConfigAnalogInput
,
1720 i_APCI3XXX_InsnReadAnalogInput
,
1730 i_APCI3XXX_InsnReadDigitalInput
,
1732 i_APCI3XXX_InsnBitsDigitalInput
,
1734 i_APCI3XXX_InsnWriteDigitalOutput
,
1735 i_APCI3XXX_InsnBitsDigitalOutput
,
1736 i_APCI3XXX_InsnReadDigitalOutput
,
1741 i_APCI3XXX_InsnConfigInitTTLIO
,
1742 i_APCI3XXX_InsnBitsTTLIO
,
1743 i_APCI3XXX_InsnReadTTLIO
,
1744 i_APCI3XXX_InsnWriteTTLIO
},
1767 &range_apci3XXX_ttl
,
1773 v_APCI3XXX_Interrupt
,
1775 i_APCI3XXX_InsnConfigAnalogInput
,
1776 i_APCI3XXX_InsnReadAnalogInput
,
1786 i_APCI3XXX_InsnReadDigitalInput
,
1788 i_APCI3XXX_InsnBitsDigitalInput
,
1790 i_APCI3XXX_InsnWriteDigitalOutput
,
1791 i_APCI3XXX_InsnBitsDigitalOutput
,
1792 i_APCI3XXX_InsnReadDigitalOutput
,
1797 i_APCI3XXX_InsnConfigInitTTLIO
,
1798 i_APCI3XXX_InsnBitsTTLIO
,
1799 i_APCI3XXX_InsnReadTTLIO
,
1800 i_APCI3XXX_InsnWriteTTLIO
},
1823 &range_apci3XXX_ttl
,
1829 v_APCI3XXX_Interrupt
,
1831 i_APCI3XXX_InsnConfigAnalogInput
,
1832 i_APCI3XXX_InsnReadAnalogInput
,
1839 i_APCI3XXX_InsnWriteAnalogOutput
,
1853 i_APCI3XXX_InsnConfigInitTTLIO
,
1854 i_APCI3XXX_InsnBitsTTLIO
,
1855 i_APCI3XXX_InsnReadTTLIO
,
1856 i_APCI3XXX_InsnWriteTTLIO
},
1879 &range_apci3XXX_ttl
,
1885 v_APCI3XXX_Interrupt
,
1887 i_APCI3XXX_InsnConfigAnalogInput
,
1888 i_APCI3XXX_InsnReadAnalogInput
,
1895 i_APCI3XXX_InsnWriteAnalogOutput
,
1909 i_APCI3XXX_InsnConfigInitTTLIO
,
1910 i_APCI3XXX_InsnBitsTTLIO
,
1911 i_APCI3XXX_InsnReadTTLIO
,
1912 i_APCI3XXX_InsnWriteTTLIO
},
1935 &range_apci3XXX_ttl
,
1941 v_APCI3XXX_Interrupt
,
1943 i_APCI3XXX_InsnConfigAnalogInput
,
1944 i_APCI3XXX_InsnReadAnalogInput
,
1951 i_APCI3XXX_InsnWriteAnalogOutput
,
1965 i_APCI3XXX_InsnConfigInitTTLIO
,
1966 i_APCI3XXX_InsnBitsTTLIO
,
1967 i_APCI3XXX_InsnReadTTLIO
,
1968 i_APCI3XXX_InsnWriteTTLIO
},
1991 &range_apci3XXX_ttl
,
1997 v_APCI3XXX_Interrupt
,
1999 i_APCI3XXX_InsnConfigAnalogInput
,
2000 i_APCI3XXX_InsnReadAnalogInput
,
2007 i_APCI3XXX_InsnWriteAnalogOutput
,
2021 i_APCI3XXX_InsnConfigInitTTLIO
,
2022 i_APCI3XXX_InsnBitsTTLIO
,
2023 i_APCI3XXX_InsnReadTTLIO
,
2024 i_APCI3XXX_InsnWriteTTLIO
},
2047 &range_apci3XXX_ttl
,
2053 v_APCI3XXX_Interrupt
,
2055 i_APCI3XXX_InsnConfigAnalogInput
,
2056 i_APCI3XXX_InsnReadAnalogInput
,
2063 i_APCI3XXX_InsnWriteAnalogOutput
,
2066 i_APCI3XXX_InsnReadDigitalInput
,
2068 i_APCI3XXX_InsnBitsDigitalInput
,
2070 i_APCI3XXX_InsnWriteDigitalOutput
,
2071 i_APCI3XXX_InsnBitsDigitalOutput
,
2072 i_APCI3XXX_InsnReadDigitalOutput
,
2077 i_APCI3XXX_InsnConfigInitTTLIO
,
2078 i_APCI3XXX_InsnBitsTTLIO
,
2079 i_APCI3XXX_InsnReadTTLIO
,
2080 i_APCI3XXX_InsnWriteTTLIO
},
2103 &range_apci3XXX_ttl
,
2109 v_APCI3XXX_Interrupt
,
2111 i_APCI3XXX_InsnConfigAnalogInput
,
2112 i_APCI3XXX_InsnReadAnalogInput
,
2119 i_APCI3XXX_InsnWriteAnalogOutput
,
2122 i_APCI3XXX_InsnReadDigitalInput
,
2124 i_APCI3XXX_InsnBitsDigitalInput
,
2126 i_APCI3XXX_InsnWriteDigitalOutput
,
2127 i_APCI3XXX_InsnBitsDigitalOutput
,
2128 i_APCI3XXX_InsnReadDigitalOutput
,
2133 i_APCI3XXX_InsnConfigInitTTLIO
,
2134 i_APCI3XXX_InsnBitsTTLIO
,
2135 i_APCI3XXX_InsnReadTTLIO
,
2136 i_APCI3XXX_InsnWriteTTLIO
},
2159 &range_apci3XXX_ttl
,
2165 v_APCI3XXX_Interrupt
,
2167 i_APCI3XXX_InsnConfigAnalogInput
,
2168 i_APCI3XXX_InsnReadAnalogInput
,
2175 i_APCI3XXX_InsnWriteAnalogOutput
,
2178 i_APCI3XXX_InsnReadDigitalInput
,
2180 i_APCI3XXX_InsnBitsDigitalInput
,
2182 i_APCI3XXX_InsnWriteDigitalOutput
,
2183 i_APCI3XXX_InsnBitsDigitalOutput
,
2184 i_APCI3XXX_InsnReadDigitalOutput
,
2189 i_APCI3XXX_InsnConfigInitTTLIO
,
2190 i_APCI3XXX_InsnBitsTTLIO
,
2191 i_APCI3XXX_InsnReadTTLIO
,
2192 i_APCI3XXX_InsnWriteTTLIO
},
2215 &range_apci3XXX_ttl
,
2221 v_APCI3XXX_Interrupt
,
2223 i_APCI3XXX_InsnConfigAnalogInput
,
2224 i_APCI3XXX_InsnReadAnalogInput
,
2231 i_APCI3XXX_InsnWriteAnalogOutput
,
2234 i_APCI3XXX_InsnReadDigitalInput
,
2236 i_APCI3XXX_InsnBitsDigitalInput
,
2238 i_APCI3XXX_InsnWriteDigitalOutput
,
2239 i_APCI3XXX_InsnBitsDigitalOutput
,
2240 i_APCI3XXX_InsnReadDigitalOutput
,
2245 i_APCI3XXX_InsnConfigInitTTLIO
,
2246 i_APCI3XXX_InsnBitsTTLIO
,
2247 i_APCI3XXX_InsnReadTTLIO
,
2248 i_APCI3XXX_InsnWriteTTLIO
},
2277 v_APCI3XXX_Interrupt
,
2279 i_APCI3XXX_InsnConfigAnalogInput
,
2280 i_APCI3XXX_InsnReadAnalogInput
,
2290 i_APCI3XXX_InsnReadDigitalInput
,
2292 i_APCI3XXX_InsnBitsDigitalInput
,
2294 i_APCI3XXX_InsnWriteDigitalOutput
,
2295 i_APCI3XXX_InsnBitsDigitalOutput
,
2296 i_APCI3XXX_InsnReadDigitalOutput
,
2332 v_APCI3XXX_Interrupt
,
2334 i_APCI3XXX_InsnConfigAnalogInput
,
2335 i_APCI3XXX_InsnReadAnalogInput
,
2345 i_APCI3XXX_InsnReadDigitalInput
,
2347 i_APCI3XXX_InsnBitsDigitalInput
,
2349 i_APCI3XXX_InsnWriteDigitalOutput
,
2350 i_APCI3XXX_InsnBitsDigitalOutput
,
2351 i_APCI3XXX_InsnReadDigitalOutput
,
2387 v_APCI3XXX_Interrupt
,
2389 i_APCI3XXX_InsnConfigAnalogInput
,
2390 i_APCI3XXX_InsnReadAnalogInput
,
2400 i_APCI3XXX_InsnReadDigitalInput
,
2402 i_APCI3XXX_InsnBitsDigitalInput
,
2404 i_APCI3XXX_InsnWriteDigitalOutput
,
2405 i_APCI3XXX_InsnBitsDigitalOutput
,
2406 i_APCI3XXX_InsnReadDigitalOutput
,
2442 v_APCI3XXX_Interrupt
,
2444 i_APCI3XXX_InsnConfigAnalogInput
,
2445 i_APCI3XXX_InsnReadAnalogInput
,
2455 i_APCI3XXX_InsnReadDigitalInput
,
2457 i_APCI3XXX_InsnBitsDigitalInput
,
2459 i_APCI3XXX_InsnWriteDigitalOutput
,
2460 i_APCI3XXX_InsnBitsDigitalOutput
,
2461 i_APCI3XXX_InsnReadDigitalOutput
,
2491 &range_apci3XXX_ttl
,
2497 v_APCI3XXX_Interrupt
,
2507 i_APCI3XXX_InsnWriteAnalogOutput
,
2521 i_APCI3XXX_InsnConfigInitTTLIO
,
2522 i_APCI3XXX_InsnBitsTTLIO
,
2523 i_APCI3XXX_InsnReadTTLIO
,
2524 i_APCI3XXX_InsnWriteTTLIO
},
2528 #define n_boardtypes (sizeof(boardtypes)/sizeof(boardtype))
2530 comedi_driver driver_addi
= {
2531 driver_name
:"addi_common",
2533 attach
:i_ADDI_Attach
,
2534 detach
:i_ADDI_Detach
,
2535 num_names
:n_boardtypes
,
2536 board_name
:&boardtypes
[0].pc_DriverName
,
2537 offset
:sizeof(boardtype
),
2540 COMEDI_PCI_INITCLEANUP(driver_addi
, addi_apci_tbl
);
2543 +----------------------------------------------------------------------------+
2544 | Function name :static int i_ADDI_Attach(struct comedi_device *dev, |
2545 | comedi_devconfig *it) |
2547 +----------------------------------------------------------------------------+
2548 | Task :Detects the card. |
2549 | Configure the driver for a particular board. |
2550 | This function does all the initializations and memory |
2551 | allocation of data structures for the driver. |
2552 +----------------------------------------------------------------------------+
2553 | Input Parameters :struct comedi_device *dev |
2554 | comedi_devconfig *it |
2556 +----------------------------------------------------------------------------+
2557 | Return Value : 0 |
2559 +----------------------------------------------------------------------------+
2562 static int i_ADDI_Attach(struct comedi_device
* dev
, comedi_devconfig
* it
)
2564 comedi_subdevice
*s
;
2565 int ret
, pages
, i
, n_subdevices
;
2567 resource_size_t io_addr
[5];
2569 resource_size_t iobase_a
, iobase_main
, iobase_addon
, iobase_reserved
;
2570 struct pcilst_struct
*card
= NULL
;
2571 unsigned char pci_bus
, pci_slot
, pci_func
;
2573 static char c_Identifier
[150];
2575 sprintf(c_Identifier
, "Addi-Data GmbH Comedi %s",
2576 this_board
->pc_DriverName
);
2578 if ((ret
= alloc_private(dev
, sizeof(addi_private
))) < 0) {
2582 if (!pci_list_builded
) {
2583 v_pci_card_list_init(this_board
->i_VendorId
, 1); //1 for displaying the list..
2584 pci_list_builded
= 1;
2586 //rt_printk("comedi%d: addi_common: board=%s",dev->minor,this_board->pc_DriverName);
2588 if ((this_board
->i_Dma
) && (it
->options
[2] == 0)) {
2592 if ((card
= ptr_select_and_alloc_pci_card(this_board
->i_VendorId
,
2593 this_board
->i_DeviceId
,
2595 it
->options
[1], i_Dma
)) == NULL
) {
2598 devpriv
->allocated
= 1;
2600 if ((i_pci_card_data(card
, &pci_bus
, &pci_slot
, &pci_func
, &io_addr
[0],
2602 i_pci_card_free(card
);
2603 printk(" - Can't get AMCC data!\n");
2607 iobase_a
= io_addr
[0];
2608 iobase_main
= io_addr
[1];
2609 iobase_addon
= io_addr
[2];
2610 iobase_reserved
= io_addr
[3];
2611 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]);
2613 if ((this_board
->pc_EepromChip
== NULL
)
2614 || (strcmp(this_board
->pc_EepromChip
, ADDIDATA_9054
) != 0)) {
2615 /************************************/
2616 /* Test if more that 1 address used */
2617 /************************************/
2619 if (this_board
->i_IorangeBase1
!= 0) {
2620 dev
->iobase
= (unsigned long)iobase_main
; // DAQ base address...
2622 dev
->iobase
= (unsigned long)iobase_a
; // DAQ base address...
2625 dev
->board_name
= this_board
->pc_DriverName
;
2626 devpriv
->amcc
= card
;
2627 devpriv
->iobase
= (INT
) dev
->iobase
;
2628 devpriv
->i_IobaseAmcc
= (INT
) iobase_a
; //AMCC base address...
2629 devpriv
->i_IobaseAddon
= (INT
) iobase_addon
; //ADD ON base address....
2630 devpriv
->i_IobaseReserved
= (INT
) iobase_reserved
;
2631 devpriv
->ps_BoardInfo
= this_board
;
2633 dev
->board_name
= this_board
->pc_DriverName
;
2634 dev
->iobase
= (unsigned long)io_addr
[2];
2635 devpriv
->amcc
= card
;
2636 devpriv
->iobase
= (INT
) io_addr
[2];
2637 devpriv
->ps_BoardInfo
= this_board
;
2638 devpriv
->i_IobaseReserved
= (INT
) io_addr
[3];
2639 printk("\nioremap begin");
2640 devpriv
->dw_AiBase
=
2641 (ULONG_PTR
) ioremap(io_addr
[3],
2642 this_board
->i_IorangeBase3
);
2643 printk("\nioremap end");
2649 if (comedi_request_irq(irq
, v_ADDI_Interrupt
, IRQF_SHARED
,
2650 c_Identifier
, dev
) < 0) {
2651 printk(", unable to allocate IRQ %u, DISABLING IT",
2653 irq
= 0; /* Can't use IRQ */
2655 rt_printk("\nirq=%u", irq
);
2658 rt_printk(", IRQ disabled");
2661 printk("\nOption %d %d %d\n", it
->options
[0], it
->options
[1],
2665 // Read eepeom and fill boardtype Structure
2667 if (this_board
->i_PCIEeprom
) {
2668 printk("\nPCI Eeprom used");
2669 if (!(strcmp(this_board
->pc_EepromChip
, "S5920"))) {
2671 if (!(strcmp(this_board
->pc_DriverName
, "apci035"))) {
2672 outl(0x80808082, devpriv
->i_IobaseAmcc
+ 0x60);
2674 outl(0x83838383, devpriv
->i_IobaseAmcc
+ 0x60);
2676 // Enable the interrupt for the controler
2677 dw_Dummy
= inl(devpriv
->i_IobaseAmcc
+ 0x38);
2678 outl(dw_Dummy
| 0x2000, devpriv
->i_IobaseAmcc
+ 0x38);
2679 printk("\nEnable the interrupt for the controler");
2681 printk("\nRead Eeprom");
2682 i_EepromReadMainHeader(io_addr
[0], this_board
->pc_EepromChip
,
2685 printk("\nPCI Eeprom unused");
2688 if (it
->options
[2] > 0) {
2689 devpriv
->us_UseDma
= ADDI_DISABLE
;
2691 devpriv
->us_UseDma
= ADDI_ENABLE
;
2694 if (this_board
->i_Dma
) {
2695 printk("\nDMA used");
2696 if (devpriv
->us_UseDma
== ADDI_ENABLE
) {
2697 // alloc DMA buffers
2698 devpriv
->b_DmaDoubleBuffer
= 0;
2699 for (i
= 0; i
< 2; i
++) {
2700 for (pages
= 4; pages
>= 0; pages
--) {
2701 if ((devpriv
->ul_DmaBufferVirtual
[i
] =
2704 (GFP_KERNEL
, pages
))) {
2708 if (devpriv
->ul_DmaBufferVirtual
[i
]) {
2709 devpriv
->ui_DmaBufferPages
[i
] = pages
;
2710 devpriv
->ui_DmaBufferSize
[i
] =
2712 devpriv
->ui_DmaBufferSamples
[i
] =
2714 ui_DmaBufferSize
[i
] >> 1;
2715 devpriv
->ul_DmaBufferHw
[i
] =
2716 virt_to_bus((void *)devpriv
->
2717 ul_DmaBufferVirtual
[i
]);
2720 if (!devpriv
->ul_DmaBufferVirtual
[0]) {
2722 (", Can't allocate DMA buffer, DMA disabled!");
2723 devpriv
->us_UseDma
= ADDI_DISABLE
;
2726 if (devpriv
->ul_DmaBufferVirtual
[1]) {
2727 devpriv
->b_DmaDoubleBuffer
= 1;
2731 if ((devpriv
->us_UseDma
== ADDI_ENABLE
)) {
2732 rt_printk("\nDMA ENABLED\n");
2734 printk("\nDMA DISABLED\n");
2738 if (!strcmp(this_board
->pc_DriverName
, "apci1710")) {
2739 #ifdef CONFIG_APCI_1710
2740 i_ADDI_AttachPCI1710(dev
);
2742 // save base address
2743 devpriv
->s_BoardInfos
.ui_Address
= io_addr
[2];
2746 //Update-0.7.57->0.7.68dev->n_subdevices = 7;
2748 if ((ret
= alloc_subdevices(dev
, n_subdevices
)) < 0)
2751 // Allocate and Initialise AI Subdevice Structures
2752 s
= dev
->subdevices
+ 0;
2753 if ((this_board
->i_NbrAiChannel
)
2754 || (this_board
->i_NbrAiChannelDiff
)) {
2755 dev
->read_subdev
= s
;
2756 s
->type
= COMEDI_SUBD_AI
;
2758 SDF_READABLE
| SDF_RT
| SDF_COMMON
| SDF_GROUND
2760 if (this_board
->i_NbrAiChannel
) {
2761 s
->n_chan
= this_board
->i_NbrAiChannel
;
2762 devpriv
->b_SingelDiff
= 0;
2764 s
->n_chan
= this_board
->i_NbrAiChannelDiff
;
2765 devpriv
->b_SingelDiff
= 1;
2767 s
->maxdata
= this_board
->i_AiMaxdata
;
2768 s
->len_chanlist
= this_board
->i_AiChannelList
;
2769 s
->range_table
= this_board
->pr_AiRangelist
;
2771 /* Set the initialisation flag */
2772 devpriv
->b_AiInitialisation
= 1;
2775 this_board
->i_hwdrv_InsnConfigAnalogInput
;
2776 s
->insn_read
= this_board
->i_hwdrv_InsnReadAnalogInput
;
2778 this_board
->i_hwdrv_InsnWriteAnalogInput
;
2779 s
->insn_bits
= this_board
->i_hwdrv_InsnBitsAnalogInput
;
2781 this_board
->i_hwdrv_CommandTestAnalogInput
;
2782 s
->do_cmd
= this_board
->i_hwdrv_CommandAnalogInput
;
2783 s
->cancel
= this_board
->i_hwdrv_CancelAnalogInput
;
2786 s
->type
= COMEDI_SUBD_UNUSED
;
2789 // Allocate and Initialise AO Subdevice Structures
2790 s
= dev
->subdevices
+ 1;
2791 if (this_board
->i_NbrAoChannel
) {
2792 s
->type
= COMEDI_SUBD_AO
;
2794 SDF_WRITEABLE
| SDF_GROUND
| SDF_COMMON
|
2796 s
->n_chan
= this_board
->i_NbrAoChannel
;
2797 s
->maxdata
= this_board
->i_AoMaxdata
;
2798 s
->len_chanlist
= this_board
->i_NbrAoChannel
;
2799 s
->range_table
= this_board
->pr_AoRangelist
;
2801 this_board
->i_hwdrv_InsnConfigAnalogOutput
;
2803 this_board
->i_hwdrv_InsnWriteAnalogOutput
;
2805 s
->type
= COMEDI_SUBD_UNUSED
;
2807 // Allocate and Initialise DI Subdevice Structures
2808 s
= dev
->subdevices
+ 2;
2809 if (this_board
->i_NbrDiChannel
) {
2810 s
->type
= COMEDI_SUBD_DI
;
2812 SDF_READABLE
| SDF_RT
| SDF_GROUND
| SDF_COMMON
;
2813 s
->n_chan
= this_board
->i_NbrDiChannel
;
2815 s
->len_chanlist
= this_board
->i_NbrDiChannel
;
2816 s
->range_table
= &range_digital
;
2817 s
->io_bits
= 0; /* all bits input */
2819 this_board
->i_hwdrv_InsnConfigDigitalInput
;
2820 s
->insn_read
= this_board
->i_hwdrv_InsnReadDigitalInput
;
2822 this_board
->i_hwdrv_InsnWriteDigitalInput
;
2823 s
->insn_bits
= this_board
->i_hwdrv_InsnBitsDigitalInput
;
2825 s
->type
= COMEDI_SUBD_UNUSED
;
2827 // Allocate and Initialise DO Subdevice Structures
2828 s
= dev
->subdevices
+ 3;
2829 if (this_board
->i_NbrDoChannel
) {
2830 s
->type
= COMEDI_SUBD_DO
;
2832 SDF_READABLE
| SDF_WRITEABLE
| SDF_RT
|
2833 SDF_GROUND
| SDF_COMMON
;
2834 s
->n_chan
= this_board
->i_NbrDoChannel
;
2835 s
->maxdata
= this_board
->i_DoMaxdata
;
2836 s
->len_chanlist
= this_board
->i_NbrDoChannel
;
2837 s
->range_table
= &range_digital
;
2838 s
->io_bits
= 0xf; /* all bits output */
2840 s
->insn_config
= this_board
->i_hwdrv_InsnConfigDigitalOutput
; //for digital output memory..
2842 this_board
->i_hwdrv_InsnWriteDigitalOutput
;
2844 this_board
->i_hwdrv_InsnBitsDigitalOutput
;
2846 this_board
->i_hwdrv_InsnReadDigitalOutput
;
2848 s
->type
= COMEDI_SUBD_UNUSED
;
2851 // Allocate and Initialise Timer Subdevice Structures
2852 s
= dev
->subdevices
+ 4;
2853 if (this_board
->i_Timer
) {
2854 s
->type
= COMEDI_SUBD_TIMER
;
2856 SDF_WRITEABLE
| SDF_RT
| SDF_GROUND
|
2860 s
->len_chanlist
= 1;
2861 s
->range_table
= &range_digital
;
2863 s
->insn_write
= this_board
->i_hwdrv_InsnWriteTimer
;
2864 s
->insn_read
= this_board
->i_hwdrv_InsnReadTimer
;
2865 s
->insn_config
= this_board
->i_hwdrv_InsnConfigTimer
;
2866 s
->insn_bits
= this_board
->i_hwdrv_InsnBitsTimer
;
2868 s
->type
= COMEDI_SUBD_UNUSED
;
2871 // Allocate and Initialise TTL
2872 s
= dev
->subdevices
+ 5;
2873 if (this_board
->i_NbrTTLChannel
) {
2874 s
->type
= COMEDI_SUBD_TTLIO
;
2876 SDF_WRITEABLE
| SDF_READABLE
| SDF_RT
|
2877 SDF_GROUND
| SDF_COMMON
;
2878 s
->n_chan
= this_board
->i_NbrTTLChannel
;
2880 s
->io_bits
= 0; /* all bits input */
2881 s
->len_chanlist
= this_board
->i_NbrTTLChannel
;
2882 s
->range_table
= &range_digital
;
2883 s
->insn_config
= this_board
->i_hwdr_ConfigInitTTLIO
;
2884 s
->insn_bits
= this_board
->i_hwdr_ReadTTLIOBits
;
2885 s
->insn_read
= this_board
->i_hwdr_ReadTTLIOAllPortValue
;
2886 s
->insn_write
= this_board
->i_hwdr_WriteTTLIOChlOnOff
;
2888 s
->type
= COMEDI_SUBD_UNUSED
;
2892 s
= dev
->subdevices
+ 6;
2893 if (this_board
->i_PCIEeprom
) {
2894 s
->type
= COMEDI_SUBD_MEMORY
;
2895 s
->subdev_flags
= SDF_READABLE
| SDF_INTERNAL
;
2897 s
->maxdata
= 0xffff;
2898 s
->insn_read
= i_ADDIDATA_InsnReadEeprom
;
2900 s
->type
= COMEDI_SUBD_UNUSED
;
2904 printk("\ni_ADDI_Attach end\n");
2906 devpriv
->b_ValidDriver
= 1;
2911 +----------------------------------------------------------------------------+
2912 | Function name : static int i_ADDI_Detach(struct comedi_device *dev) |
2915 +----------------------------------------------------------------------------+
2916 | Task : Deallocates resources of the addi_common driver |
2917 | Free the DMA buffers, unregister irq. |
2919 +----------------------------------------------------------------------------+
2920 | Input Parameters : struct comedi_device *dev |
2923 +----------------------------------------------------------------------------+
2924 | Return Value : 0 |
2926 +----------------------------------------------------------------------------+
2929 static int i_ADDI_Detach(struct comedi_device
* dev
)
2933 if (devpriv
->b_ValidDriver
) {
2938 comedi_free_irq(dev
->irq
, dev
);
2941 if ((devpriv
->ps_BoardInfo
->pc_EepromChip
== NULL
)
2942 || (strcmp(devpriv
->ps_BoardInfo
->pc_EepromChip
,
2943 ADDIDATA_9054
) != 0)) {
2944 if (devpriv
->allocated
) {
2945 i_pci_card_free(devpriv
->amcc
);
2948 if (devpriv
->ul_DmaBufferVirtual
[0]) {
2949 free_pages((unsigned long)devpriv
->
2950 ul_DmaBufferVirtual
[0],
2951 devpriv
->ui_DmaBufferPages
[0]);
2954 if (devpriv
->ul_DmaBufferVirtual
[1]) {
2955 free_pages((unsigned long)devpriv
->
2956 ul_DmaBufferVirtual
[1],
2957 devpriv
->ui_DmaBufferPages
[1]);
2960 iounmap((void *)devpriv
->dw_AiBase
);
2962 if (devpriv
->allocated
) {
2963 i_pci_card_free(devpriv
->amcc
);
2967 if (pci_list_builded
) {
2968 //v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC);
2969 v_pci_card_list_cleanup(this_board
->i_VendorId
);
2970 pci_list_builded
= 0;
2978 +----------------------------------------------------------------------------+
2979 | Function name : static int i_ADDI_Reset(struct comedi_device *dev) |
2981 +----------------------------------------------------------------------------+
2982 | Task : Disables all interrupts, Resets digital output to low, |
2983 | Set all analog output to low |
2985 +----------------------------------------------------------------------------+
2986 | Input Parameters : struct comedi_device *dev |
2989 +----------------------------------------------------------------------------+
2990 | Return Value : 0 |
2992 +----------------------------------------------------------------------------+
2995 static int i_ADDI_Reset(struct comedi_device
* dev
)
2998 this_board
->i_hwdrv_Reset(dev
);
3002 // Interrupt function
3004 +----------------------------------------------------------------------------+
3006 |static void v_ADDI_Interrupt(int irq, void *d PT_REGS_ARG) |
3008 +----------------------------------------------------------------------------+
3009 | Task : Registerd interrupt routine |
3011 +----------------------------------------------------------------------------+
3012 | Input Parameters : int irq |
3015 +----------------------------------------------------------------------------+
3018 +----------------------------------------------------------------------------+
3021 static irqreturn_t
v_ADDI_Interrupt(int irq
, void *d PT_REGS_ARG
)
3023 struct comedi_device
*dev
= d
;
3024 this_board
->v_hwdrv_Interrupt(irq
, d
);
3025 return IRQ_RETVAL(1);
3028 // EEPROM Read Function
3030 +----------------------------------------------------------------------------+
3032 |INT i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev,comedi_subdevice *s,
3033 comedi_insn *insn,unsigned int *data)
3035 +----------------------------------------------------------------------------+
3036 | Task : Read 256 words from EEPROM |
3038 +----------------------------------------------------------------------------+
3039 | Input Parameters :(struct comedi_device *dev,comedi_subdevice *s,
3040 comedi_insn *insn,unsigned int *data) |
3043 +----------------------------------------------------------------------------+
3046 +----------------------------------------------------------------------------+
3049 static int i_ADDIDATA_InsnReadEeprom(struct comedi_device
* dev
, comedi_subdevice
* s
,
3050 comedi_insn
* insn
, unsigned int * data
)
3054 w_Address
= CR_CHAN(insn
->chanspec
); // address to be read as 0,1,2,3...255
3056 w_Data
= w_EepromReadWord(devpriv
->i_IobaseAmcc
,
3057 this_board
->pc_EepromChip
, 0x100 + (2 * w_Address
));
3059 //multiplied by 2 bcozinput will be like 0,1,2...255