1 /*
2 comedi/drivers/ni_pcimio.c
3 Hardware driver for NI PCI-MIO E series cards
4
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17 */
18 /*
19 Driver: ni_pcimio
20 Description: National Instruments PCI-MIO-E series and M series (all boards)
21 Author: ds, John Hallen, Frank Mori Hess, Rolf Mueller, Herbert Peremans,
22 Herman Bruyninckx, Terry Barnaby
23 Status: works
24 Devices: [National Instruments] PCI-MIO-16XE-50 (ni_pcimio),
25 PCI-MIO-16XE-10, PXI-6030E, PCI-MIO-16E-1, PCI-MIO-16E-4, PCI-6014, PCI-6040E,
26 PXI-6040E, PCI-6030E, PCI-6031E, PCI-6032E, PCI-6033E, PCI-6071E, PCI-6023E,
27 PCI-6024E, PCI-6025E, PXI-6025E, PCI-6034E, PCI-6035E, PCI-6052E,
28 PCI-6110, PCI-6111, PCI-6220, PCI-6221, PCI-6224, PXI-6224,
29 PCI-6225, PXI-6225, PCI-6229, PCI-6250, PCI-6251, PCIe-6251, PXIe-6251,
30 PCI-6254, PCI-6259, PCIe-6259,
31 PCI-6280, PCI-6281, PXI-6281, PCI-6284, PCI-6289,
32 PCI-6711, PXI-6711, PCI-6713, PXI-6713,
33 PXI-6071E, PCI-6070E, PXI-6070E,
34 PXI-6052E, PCI-6036E, PCI-6731, PCI-6733, PXI-6733,
35 PCI-6143, PXI-6143
36 Updated: Mon, 09 Jan 2012 14:52:48 +0000
37
38 These boards are almost identical to the AT-MIO E series, except that
39 they use the PCI bus instead of ISA (i.e., AT). See the notes for
40 the ni_atmio.o driver for additional information about these boards.
41
42 Autocalibration is supported on many of the devices, using the
43 comedi_calibrate (or comedi_soft_calibrate for m-series) utility.
44 M-Series boards do analog input and analog output calibration entirely
45 in software. The software calibration corrects
46 the analog input for offset, gain and
47 nonlinearity. The analog outputs are corrected for offset and gain.
48 See the comedilib documentation on comedi_get_softcal_converter() for
49 more information.
50
51 By default, the driver uses DMA to transfer analog input data to
52 memory. When DMA is enabled, not all triggering features are
53 supported.
54
55 Digital I/O may not work on 673x.
56
57 Note that the PCI-6143 is a simultaineous sampling device with 8 convertors.
58 With this board all of the convertors perform one simultaineous sample during
59 a scan interval. The period for a scan is used for the convert time in a
60 Comedi cmd. The convert trigger source is normally set to TRIG_NOW by default.
61
62 The RTSI trigger bus is supported on these cards on
63 subdevice 10. See the comedilib documentation for details.
64
65 Information (number of channels, bits, etc.) for some devices may be
66 incorrect. Please check this and submit a bug if there are problems
67 for your device.
68
69 SCXI is probably broken for m-series boards.
70
71 Bugs:
72 - When DMA is enabled, COMEDI_EV_CONVERT does
73 not work correctly.
74
75 */
76 /*
77 The PCI-MIO E series driver was originally written by
78 Tomasz Motylewski <...>, and ported to comedi by ds.
79
80 References:
81
82 341079b.pdf PCI E Series Register-Level Programmer Manual
83 340934b.pdf DAQ-STC reference manual
84
85 322080b.pdf 6711/6713/6715 User Manual
86
87 320945c.pdf PCI E Series User Manual
88 322138a.pdf PCI-6052E and DAQPad-6052E User Manual
89
90 ISSUES:
91
92 need to deal with external reference for DAC, and other DAC
93 properties in board properties
94
95 deal with at-mio-16de-10 revision D to N changes, etc.
96
97 need to add other CALDAC type
98
99 need to slow down DAC loading. I don't trust NI's claim that
100 two writes to the PCI bus slows IO enough. I would prefer to
101 use udelay(). Timing specs: (clock)
102 AD8522 30ns
103 DAC8043 120ns
104 DAC8800 60ns
105 MB88341 ?
106
107 */
108
109 #include <linux/module.h>
110 #include <linux/delay.h>
111
112 #include "../comedi_pci.h"
113
114 #include <asm/byteorder.h>
115
116 #include "ni_stc.h"
117 #include "mite.h"
118
119 #define PCIDMA
120
121 /* These are not all the possible ao ranges for 628x boards.
122 They can do OFFSET +- REFERENCE where OFFSET can be
123 0V, 5V, APFI<0,1>, or AO<0...3> and RANGE can
124 be 10V, 5V, 2V, 1V, APFI<0,1>, AO<0...3>. That's
125 63 different possibilities. An AO channel
126 can not act as it's own OFFSET or REFERENCE.
127 */
128 static const struct comedi_lrange range_ni_M_628x_ao = {
129 8, {
130 BIP_RANGE(10),
131 BIP_RANGE(5),
132 BIP_RANGE(2),
133 BIP_RANGE(1),
134 RANGE(-5, 15),
135 UNI_RANGE(10),
136 RANGE(3, 7),
137 RANGE(4, 6),
138 RANGE_ext(-1, 1)
139 }
140 };
141
142 static const struct comedi_lrange range_ni_M_625x_ao = {
143 3, {
144 BIP_RANGE(10),
145 BIP_RANGE(5),
146 RANGE_ext(-1, 1)
147 }
148 };
149
150 enum ni_pcimio_boardid {
151 BOARD_PCIMIO_16XE_50,
152 BOARD_PCIMIO_16XE_10,
153 BOARD_PCI6014,
154 BOARD_PXI6030E,
155 BOARD_PCIMIO_16E_1,
156 BOARD_PCIMIO_16E_4,
157 BOARD_PXI6040E,
158 BOARD_PCI6031E,
159 BOARD_PCI6032E,
160 BOARD_PCI6033E,
161 BOARD_PCI6071E,
162 BOARD_PCI6023E,
163 BOARD_PCI6024E,
164 BOARD_PCI6025E,
165 BOARD_PXI6025E,
166 BOARD_PCI6034E,
167 BOARD_PCI6035E,
168 BOARD_PCI6052E,
169 BOARD_PCI6110,
170 BOARD_PCI6111,
171 /* BOARD_PCI6115, */
172 /* BOARD_PXI6115, */
173 BOARD_PCI6711,
174 BOARD_PXI6711,
175 BOARD_PCI6713,
176 BOARD_PXI6713,
177 BOARD_PCI6731,
178 /* BOARD_PXI6731, */
179 BOARD_PCI6733,
180 BOARD_PXI6733,
181 BOARD_PXI6071E,
182 BOARD_PXI6070E,
183 BOARD_PXI6052E,
184 BOARD_PXI6031E,
185 BOARD_PCI6036E,
186 BOARD_PCI6220,
187 BOARD_PCI6221,
188 BOARD_PCI6221_37PIN,
189 BOARD_PCI6224,
190 BOARD_PXI6224,
191 BOARD_PCI6225,
192 BOARD_PXI6225,
193 BOARD_PCI6229,
194 BOARD_PCI6250,
195 BOARD_PCI6251,
196 BOARD_PCIE6251,
197 BOARD_PXIE6251,
198 BOARD_PCI6254,
199 BOARD_PCI6259,
200 BOARD_PCIE6259,
201 BOARD_PCI6280,
202 BOARD_PCI6281,
203 BOARD_PXI6281,
204 BOARD_PCI6284,
205 BOARD_PCI6289,
206 BOARD_PCI6143,
207 BOARD_PXI6143,
208 };
209
210 static const struct ni_board_struct ni_boards[] = {
211 [BOARD_PCIMIO_16XE_50] = {
212 .name = "pci-mio-16xe-50",
213 .n_adchan = 16,
214 .ai_maxdata = 0xffff,
215 .ai_fifo_depth = 2048,
216 .alwaysdither = 1,
217 .gainlkup = ai_gain_8,
218 .ai_speed = 50000,
219 .n_aochan = 2,
220 .ao_maxdata = 0x0fff,
221 .ao_range_table = &range_bipolar10,
222 .ao_speed = 50000,
223 .caldac = { dac8800, dac8043 },
224 },
225 [BOARD_PCIMIO_16XE_10] = {
226 .name = "pci-mio-16xe-10", /* aka pci-6030E */
227 .n_adchan = 16,
228 .ai_maxdata = 0xffff,
229 .ai_fifo_depth = 512,
230 .alwaysdither = 1,
231 .gainlkup = ai_gain_14,
232 .ai_speed = 10000,
233 .n_aochan = 2,
234 .ao_maxdata = 0xffff,
235 .ao_fifo_depth = 2048,
236 .ao_range_table = &range_ni_E_ao_ext,
237 .ao_speed = 10000,
238 .caldac = { dac8800, dac8043, ad8522 },
239 },
240 [BOARD_PCI6014] = {
241 .name = "pci-6014",
242 .n_adchan = 16,
243 .ai_maxdata = 0xffff,
244 .ai_fifo_depth = 512,
245 .alwaysdither = 1,
246 .gainlkup = ai_gain_4,
247 .ai_speed = 5000,
248 .n_aochan = 2,
249 .ao_maxdata = 0xffff,
250 .ao_range_table = &range_bipolar10,
251 .ao_speed = 100000,
252 .caldac = { ad8804_debug },
253 },
254 [BOARD_PXI6030E] = {
255 .name = "pxi-6030e",
256 .n_adchan = 16,
257 .ai_maxdata = 0xffff,
258 .ai_fifo_depth = 512,
259 .alwaysdither = 1,
260 .gainlkup = ai_gain_14,
261 .ai_speed = 10000,
262 .n_aochan = 2,
263 .ao_maxdata = 0xffff,
264 .ao_fifo_depth = 2048,
265 .ao_range_table = &range_ni_E_ao_ext,
266 .ao_speed = 10000,
267 .caldac = { dac8800, dac8043, ad8522 },
268 },
269 [BOARD_PCIMIO_16E_1] = {
270 .name = "pci-mio-16e-1", /* aka pci-6070e */
271 .n_adchan = 16,
272 .ai_maxdata = 0x0fff,
273 .ai_fifo_depth = 512,
274 .gainlkup = ai_gain_16,
275 .ai_speed = 800,
276 .n_aochan = 2,
277 .ao_maxdata = 0x0fff,
278 .ao_fifo_depth = 2048,
279 .ao_range_table = &range_ni_E_ao_ext,
280 .ao_speed = 1000,
281 .caldac = { mb88341 },
282 },
283 [BOARD_PCIMIO_16E_4] = {
284 .name = "pci-mio-16e-4", /* aka pci-6040e */
285 .n_adchan = 16,
286 .ai_maxdata = 0x0fff,
287 .ai_fifo_depth = 512,
288 .gainlkup = ai_gain_16,
289 /*
290 * there have been reported problems with
291 * full speed on this board
292 */
293 .ai_speed = 2000,
294 .n_aochan = 2,
295 .ao_maxdata = 0x0fff,
296 .ao_fifo_depth = 512,
297 .ao_range_table = &range_ni_E_ao_ext,
298 .ao_speed = 1000,
299 .caldac = { ad8804_debug }, /* doc says mb88341 */
300 },
301 [BOARD_PXI6040E] = {
302 .name = "pxi-6040e",
303 .n_adchan = 16,
304 .ai_maxdata = 0x0fff,
305 .ai_fifo_depth = 512,
306 .gainlkup = ai_gain_16,
307 .ai_speed = 2000,
308 .n_aochan = 2,
309 .ao_maxdata = 0x0fff,
310 .ao_fifo_depth = 512,
311 .ao_range_table = &range_ni_E_ao_ext,
312 .ao_speed = 1000,
313 .caldac = { mb88341 },
314 },
315 [BOARD_PCI6031E] = {
316 .name = "pci-6031e",
317 .n_adchan = 64,
318 .ai_maxdata = 0xffff,
319 .ai_fifo_depth = 512,
320 .alwaysdither = 1,
321 .gainlkup = ai_gain_14,
322 .ai_speed = 10000,
323 .n_aochan = 2,
324 .ao_maxdata = 0xffff,
325 .ao_fifo_depth = 2048,
326 .ao_range_table = &range_ni_E_ao_ext,
327 .ao_speed = 10000,
328 .caldac = { dac8800, dac8043, ad8522 },
329 },
330 [BOARD_PCI6032E] = {
331 .name = "pci-6032e",
332 .n_adchan = 16,
333 .ai_maxdata = 0xffff,
334 .ai_fifo_depth = 512,
335 .alwaysdither = 1,
336 .gainlkup = ai_gain_14,
337 .ai_speed = 10000,
338 .caldac = { dac8800, dac8043, ad8522 },
339 },
340 [BOARD_PCI6033E] = {
341 .name = "pci-6033e",
342 .n_adchan = 64,
343 .ai_maxdata = 0xffff,
344 .ai_fifo_depth = 512,
345 .alwaysdither = 1,
346 .gainlkup = ai_gain_14,
347 .ai_speed = 10000,
348 .caldac = { dac8800, dac8043, ad8522 },
349 },
350 [BOARD_PCI6071E] = {
351 .name = "pci-6071e",
352 .n_adchan = 64,
353 .ai_maxdata = 0x0fff,
354 .ai_fifo_depth = 512,
355 .alwaysdither = 1,
356 .gainlkup = ai_gain_16,
357 .ai_speed = 800,
358 .n_aochan = 2,
359 .ao_maxdata = 0x0fff,
360 .ao_fifo_depth = 2048,
361 .ao_range_table = &range_ni_E_ao_ext,
362 .ao_speed = 1000,
363 .caldac = { ad8804_debug },
364 },
365 [BOARD_PCI6023E] = {
366 .name = "pci-6023e",
367 .n_adchan = 16,
368 .ai_maxdata = 0x0fff,
369 .ai_fifo_depth = 512,
370 .gainlkup = ai_gain_4,
371 .ai_speed = 5000,
372 .caldac = { ad8804_debug }, /* manual is wrong */
373 },
374 [BOARD_PCI6024E] = {
375 .name = "pci-6024e",
376 .n_adchan = 16,
377 .ai_maxdata = 0x0fff,
378 .ai_fifo_depth = 512,
379 .gainlkup = ai_gain_4,
380 .ai_speed = 5000,
381 .n_aochan = 2,
382 .ao_maxdata = 0x0fff,
383 .ao_range_table = &range_bipolar10,
384 .ao_speed = 100000,
385 .caldac = { ad8804_debug }, /* manual is wrong */
386 },
387 [BOARD_PCI6025E] = {
388 .name = "pci-6025e",
389 .n_adchan = 16,
390 .ai_maxdata = 0x0fff,
391 .ai_fifo_depth = 512,
392 .gainlkup = ai_gain_4,
393 .ai_speed = 5000,
394 .n_aochan = 2,
395 .ao_maxdata = 0x0fff,
396 .ao_range_table = &range_bipolar10,
397 .ao_speed = 100000,
398 .caldac = { ad8804_debug }, /* manual is wrong */
399 .has_8255 = 1,
400 },
401 [BOARD_PXI6025E] = {
402 .name = "pxi-6025e",
403 .n_adchan = 16,
404 .ai_maxdata = 0x0fff,
405 .ai_fifo_depth = 512,
406 .gainlkup = ai_gain_4,
407 .ai_speed = 5000,
408 .n_aochan = 2,
409 .ao_maxdata = 0x0fff,
410 .ao_range_table = &range_ni_E_ao_ext,
411 .ao_speed = 100000,
412 .caldac = { ad8804_debug }, /* manual is wrong */
413 .has_8255 = 1,
414 },
415 [BOARD_PCI6034E] = {
416 .name = "pci-6034e",
417 .n_adchan = 16,
418 .ai_maxdata = 0xffff,
419 .ai_fifo_depth = 512,
420 .alwaysdither = 1,
421 .gainlkup = ai_gain_4,
422 .ai_speed = 5000,
423 .caldac = { ad8804_debug },
424 },
425 [BOARD_PCI6035E] = {
426 .name = "pci-6035e",
427 .n_adchan = 16,
428 .ai_maxdata = 0xffff,
429 .ai_fifo_depth = 512,
430 .alwaysdither = 1,
431 .gainlkup = ai_gain_4,
432 .ai_speed = 5000,
433 .n_aochan = 2,
434 .ao_maxdata = 0x0fff,
435 .ao_range_table = &range_bipolar10,
436 .ao_speed = 100000,
437 .caldac = { ad8804_debug },
438 },
439 [BOARD_PCI6052E] = {
440 .name = "pci-6052e",
441 .n_adchan = 16,
442 .ai_maxdata = 0xffff,
443 .ai_fifo_depth = 512,
444 .alwaysdither = 1,
445 .gainlkup = ai_gain_16,
446 .ai_speed = 3000,
447 .n_aochan = 2,
448 .ao_maxdata = 0xffff,
449 .ao_fifo_depth = 2048,
450 .ao_range_table = &range_ni_E_ao_ext,
451 .ao_speed = 3000,
452 /* manual is wrong */
453 .caldac = { ad8804_debug, ad8804_debug, ad8522 },
454 },
455 [BOARD_PCI6110] = {
456 .name = "pci-6110",
457 .n_adchan = 4,
458 .ai_maxdata = 0x0fff,
459 .ai_fifo_depth = 8192,
460 .alwaysdither = 0,
461 .gainlkup = ai_gain_611x,
462 .ai_speed = 200,
463 .n_aochan = 2,
464 .ao_maxdata = 0xffff,
465 .reg_type = ni_reg_611x,
466 .ao_range_table = &range_bipolar10,
467 .ao_fifo_depth = 2048,
468 .ao_speed = 250,
469 .caldac = { ad8804, ad8804 },
470 },
471 [BOARD_PCI6111] = {
472 .name = "pci-6111",
473 .n_adchan = 2,
474 .ai_maxdata = 0x0fff,
475 .ai_fifo_depth = 8192,
476 .gainlkup = ai_gain_611x,
477 .ai_speed = 200,
478 .n_aochan = 2,
479 .ao_maxdata = 0xffff,
480 .reg_type = ni_reg_611x,
481 .ao_range_table = &range_bipolar10,
482 .ao_fifo_depth = 2048,
483 .ao_speed = 250,
484 .caldac = { ad8804, ad8804 },
485 },
486 #if 0
487 /* The 6115 boards probably need their own driver */
488 [BOARD_PCI6115] = { /* .device_id = 0x2ed0, */
489 .name = "pci-6115",
490 .n_adchan = 4,
491 .ai_maxdata = 0x0fff,
492 .ai_fifo_depth = 8192,
493 .gainlkup = ai_gain_611x,
494 .ai_speed = 100,
495 .n_aochan = 2,
496 .ao_maxdata = 0xffff,
497 .ao_671x = 1,
498 .ao_fifo_depth = 2048,
499 .ao_speed = 250,
500 .reg_611x = 1,
501 /* XXX */
502 .caldac = { ad8804_debug, ad8804_debug, ad8804_debug },
503 },
504 #endif
505 #if 0
506 [BOARD_PXI6115] = { /* .device_id = ????, */
507 .name = "pxi-6115",
508 .n_adchan = 4,
509 .ai_maxdata = 0x0fff,
510 .ai_fifo_depth = 8192,
511 .gainlkup = ai_gain_611x,
512 .ai_speed = 100,
513 .n_aochan = 2,
514 .ao_maxdata = 0xffff,
515 .ao_671x = 1,
516 .ao_fifo_depth = 2048,
517 .ao_speed = 250,
518 .reg_611x = 1,
519 /* XXX */
520 .caldac = { ad8804_debug, ad8804_debug, ad8804_debug },
521 },
522 #endif
523 [BOARD_PCI6711] = {
524 .name = "pci-6711",
525 .n_aochan = 4,
526 .ao_maxdata = 0x0fff,
527 /* data sheet says 8192, but fifo really holds 16384 samples */
528 .ao_fifo_depth = 16384,
529 .ao_range_table = &range_bipolar10,
530 .ao_speed = 1000,
531 .reg_type = ni_reg_6711,
532 .caldac = { ad8804_debug },
533 },
534 [BOARD_PXI6711] = {
535 .name = "pxi-6711",
536 .n_aochan = 4,
537 .ao_maxdata = 0x0fff,
538 .ao_fifo_depth = 16384,
539 .ao_range_table = &range_bipolar10,
540 .ao_speed = 1000,
541 .reg_type = ni_reg_6711,
542 .caldac = { ad8804_debug },
543 },
544 [BOARD_PCI6713] = {
545 .name = "pci-6713",
546 .n_aochan = 8,
547 .ao_maxdata = 0x0fff,
548 .ao_fifo_depth = 16384,
549 .ao_range_table = &range_bipolar10,
550 .ao_speed = 1000,
551 .reg_type = ni_reg_6713,
552 .caldac = { ad8804_debug, ad8804_debug },
553 },
554 [BOARD_PXI6713] = {
555 .name = "pxi-6713",
556 .n_aochan = 8,
557 .ao_maxdata = 0x0fff,
558 .ao_fifo_depth = 16384,
559 .ao_range_table = &range_bipolar10,
560 .ao_speed = 1000,
561 .reg_type = ni_reg_6713,
562 .caldac = { ad8804_debug, ad8804_debug },
563 },
564 [BOARD_PCI6731] = {
565 .name = "pci-6731",
566 .n_aochan = 4,
567 .ao_maxdata = 0xffff,
568 .ao_fifo_depth = 8192,
569 .ao_range_table = &range_bipolar10,
570 .ao_speed = 1000,
571 .reg_type = ni_reg_6711,
572 .caldac = { ad8804_debug },
573 },
574 #if 0
575 [BOARD_PXI6731] = { /* .device_id = ????, */
576 .name = "pxi-6731",
577 .n_aochan = 4,
578 .ao_maxdata = 0xffff,
579 .ao_fifo_depth = 8192,
580 .ao_range_table = &range_bipolar10,
581 .reg_type = ni_reg_6711,
582 .caldac = { ad8804_debug },
583 },
584 #endif
585 [BOARD_PCI6733] = {
586 .name = "pci-6733",
587 .n_aochan = 8,
588 .ao_maxdata = 0xffff,
589 .ao_fifo_depth = 16384,
590 .ao_range_table = &range_bipolar10,
591 .ao_speed = 1000,
592 .reg_type = ni_reg_6713,
593 .caldac = { ad8804_debug, ad8804_debug },
594 },
595 [BOARD_PXI6733] = {
596 .name = "pxi-6733",
597 .n_aochan = 8,
598 .ao_maxdata = 0xffff,
599 .ao_fifo_depth = 16384,
600 .ao_range_table = &range_bipolar10,
601 .ao_speed = 1000,
602 .reg_type = ni_reg_6713,
603 .caldac = { ad8804_debug, ad8804_debug },
604 },
605 [BOARD_PXI6071E] = {
606 .name = "pxi-6071e",
607 .n_adchan = 64,
608 .ai_maxdata = 0x0fff,
609 .ai_fifo_depth = 512,
610 .alwaysdither = 1,
611 .gainlkup = ai_gain_16,
612 .ai_speed = 800,
613 .n_aochan = 2,
614 .ao_maxdata = 0x0fff,
615 .ao_fifo_depth = 2048,
616 .ao_range_table = &range_ni_E_ao_ext,
617 .ao_speed = 1000,
618 .caldac = { ad8804_debug },
619 },
620 [BOARD_PXI6070E] = {
621 .name = "pxi-6070e",
622 .n_adchan = 16,
623 .ai_maxdata = 0x0fff,
624 .ai_fifo_depth = 512,
625 .alwaysdither = 1,
626 .gainlkup = ai_gain_16,
627 .ai_speed = 800,
628 .n_aochan = 2,
629 .ao_maxdata = 0x0fff,
630 .ao_fifo_depth = 2048,
631 .ao_range_table = &range_ni_E_ao_ext,
632 .ao_speed = 1000,
633 .caldac = { ad8804_debug },
634 },
635 [BOARD_PXI6052E] = {
636 .name = "pxi-6052e",
637 .n_adchan = 16,
638 .ai_maxdata = 0xffff,
639 .ai_fifo_depth = 512,
640 .alwaysdither = 1,
641 .gainlkup = ai_gain_16,
642 .ai_speed = 3000,
643 .n_aochan = 2,
644 .ao_maxdata = 0xffff,
645 .ao_fifo_depth = 2048,
646 .ao_range_table = &range_ni_E_ao_ext,
647 .ao_speed = 3000,
648 .caldac = { mb88341, mb88341, ad8522 },
649 },
650 [BOARD_PXI6031E] = {
651 .name = "pxi-6031e",
652 .n_adchan = 64,
653 .ai_maxdata = 0xffff,
654 .ai_fifo_depth = 512,
655 .alwaysdither = 1,
656 .gainlkup = ai_gain_14,
657 .ai_speed = 10000,
658 .n_aochan = 2,
659 .ao_maxdata = 0xffff,
660 .ao_fifo_depth = 2048,
661 .ao_range_table = &range_ni_E_ao_ext,
662 .ao_speed = 10000,
663 .caldac = { dac8800, dac8043, ad8522 },
664 },
665 [BOARD_PCI6036E] = {
666 .name = "pci-6036e",
667 .n_adchan = 16,
668 .ai_maxdata = 0xffff,
669 .ai_fifo_depth = 512,
670 .alwaysdither = 1,
671 .gainlkup = ai_gain_4,
672 .ai_speed = 5000,
673 .n_aochan = 2,
674 .ao_maxdata = 0xffff,
675 .ao_range_table = &range_bipolar10,
676 .ao_speed = 100000,
677 .caldac = { ad8804_debug },
678 },
679 [BOARD_PCI6220] = {
680 .name = "pci-6220",
681 .n_adchan = 16,
682 .ai_maxdata = 0xffff,
683 .ai_fifo_depth = 512, /* FIXME: guess */
684 .gainlkup = ai_gain_622x,
685 .ai_speed = 4000,
686 .reg_type = ni_reg_622x,
687 .caldac = { caldac_none },
688 },
689 [BOARD_PCI6221] = {
690 .name = "pci-6221",
691 .n_adchan = 16,
692 .ai_maxdata = 0xffff,
693 .ai_fifo_depth = 4095,
694 .gainlkup = ai_gain_622x,
695 .ai_speed = 4000,
696 .n_aochan = 2,
697 .ao_maxdata = 0xffff,
698 .ao_fifo_depth = 8191,
699 .ao_range_table = &range_bipolar10,
700 .reg_type = ni_reg_622x,
701 .ao_speed = 1200,
702 .caldac = { caldac_none },
703 },
704 [BOARD_PCI6221_37PIN] = {
705 .name = "pci-6221_37pin",
706 .n_adchan = 16,
707 .ai_maxdata = 0xffff,
708 .ai_fifo_depth = 4095,
709 .gainlkup = ai_gain_622x,
710 .ai_speed = 4000,
711 .n_aochan = 2,
712 .ao_maxdata = 0xffff,
713 .ao_fifo_depth = 8191,
714 .ao_range_table = &range_bipolar10,
715 .reg_type = ni_reg_622x,
716 .ao_speed = 1200,
717 .caldac = { caldac_none },
718 },
719 [BOARD_PCI6224] = {
720 .name = "pci-6224",
721 .n_adchan = 32,
722 .ai_maxdata = 0xffff,
723 .ai_fifo_depth = 4095,
724 .gainlkup = ai_gain_622x,
725 .ai_speed = 4000,
726 .reg_type = ni_reg_622x,
727 .has_32dio_chan = 1,
728 .caldac = { caldac_none },
729 },
730 [BOARD_PXI6224] = {
731 .name = "pxi-6224",
732 .n_adchan = 32,
733 .ai_maxdata = 0xffff,
734 .ai_fifo_depth = 4095,
735 .gainlkup = ai_gain_622x,
736 .ai_speed = 4000,
737 .reg_type = ni_reg_622x,
738 .has_32dio_chan = 1,
739 .caldac = { caldac_none },
740 },
741 [BOARD_PCI6225] = {
742 .name = "pci-6225",
743 .n_adchan = 80,
744 .ai_maxdata = 0xffff,
745 .ai_fifo_depth = 4095,
746 .gainlkup = ai_gain_622x,
747 .ai_speed = 4000,
748 .n_aochan = 2,
749 .ao_maxdata = 0xffff,
750 .ao_fifo_depth = 8191,
751 .ao_range_table = &range_bipolar10,
752 .reg_type = ni_reg_622x,
753 .ao_speed = 1200,
754 .has_32dio_chan = 1,
755 .caldac = { caldac_none },
756 },
757 [BOARD_PXI6225] = {
758 .name = "pxi-6225",
759 .n_adchan = 80,
760 .ai_maxdata = 0xffff,
761 .ai_fifo_depth = 4095,
762 .gainlkup = ai_gain_622x,
763 .ai_speed = 4000,
764 .n_aochan = 2,
765 .ao_maxdata = 0xffff,
766 .ao_fifo_depth = 8191,
767 .ao_range_table = &range_bipolar10,
768 .reg_type = ni_reg_622x,
769 .ao_speed = 1200,
770 .has_32dio_chan = 1,
771 .caldac = { caldac_none },
772 },
773 [BOARD_PCI6229] = {
774 .name = "pci-6229",
775 .n_adchan = 32,
776 .ai_maxdata = 0xffff,
777 .ai_fifo_depth = 4095,
778 .gainlkup = ai_gain_622x,
779 .ai_speed = 4000,
780 .n_aochan = 4,
781 .ao_maxdata = 0xffff,
782 .ao_fifo_depth = 8191,
783 .ao_range_table = &range_bipolar10,
784 .reg_type = ni_reg_622x,
785 .ao_speed = 1200,
786 .has_32dio_chan = 1,
787 .caldac = { caldac_none },
788 },
789 [BOARD_PCI6250] = {
790 .name = "pci-6250",
791 .n_adchan = 16,
792 .ai_maxdata = 0xffff,
793 .ai_fifo_depth = 4095,
794 .gainlkup = ai_gain_628x,
795 .ai_speed = 800,
796 .reg_type = ni_reg_625x,
797 .caldac = { caldac_none },
798 },
799 [BOARD_PCI6251] = {
800 .name = "pci-6251",
801 .n_adchan = 16,
802 .ai_maxdata = 0xffff,
803 .ai_fifo_depth = 4095,
804 .gainlkup = ai_gain_628x,
805 .ai_speed = 800,
806 .n_aochan = 2,
807 .ao_maxdata = 0xffff,
808 .ao_fifo_depth = 8191,
809 .ao_range_table = &range_ni_M_625x_ao,
810 .reg_type = ni_reg_625x,
811 .ao_speed = 350,
812 .caldac = { caldac_none },
813 },
814 [BOARD_PCIE6251] = {
815 .name = "pcie-6251",
816 .n_adchan = 16,
817 .ai_maxdata = 0xffff,
818 .ai_fifo_depth = 4095,
819 .gainlkup = ai_gain_628x,
820 .ai_speed = 800,
821 .n_aochan = 2,
822 .ao_maxdata = 0xffff,
823 .ao_fifo_depth = 8191,
824 .ao_range_table = &range_ni_M_625x_ao,
825 .reg_type = ni_reg_625x,
826 .ao_speed = 350,
827 .caldac = { caldac_none },
828 },
829 [BOARD_PXIE6251] = {
830 .name = "pxie-6251",
831 .n_adchan = 16,
832 .ai_maxdata = 0xffff,
833 .ai_fifo_depth = 4095,
834 .gainlkup = ai_gain_628x,
835 .ai_speed = 800,
836 .n_aochan = 2,
837 .ao_maxdata = 0xffff,
838 .ao_fifo_depth = 8191,
839 .ao_range_table = &range_ni_M_625x_ao,
840 .reg_type = ni_reg_625x,
841 .ao_speed = 350,
842 .caldac = { caldac_none },
843 },
844 [BOARD_PCI6254] = {
845 .name = "pci-6254",
846 .n_adchan = 32,
847 .ai_maxdata = 0xffff,
848 .ai_fifo_depth = 4095,
849 .gainlkup = ai_gain_628x,
850 .ai_speed = 800,
851 .reg_type = ni_reg_625x,
852 .has_32dio_chan = 1,
853 .caldac = { caldac_none },
854 },
855 [BOARD_PCI6259] = {
856 .name = "pci-6259",
857 .n_adchan = 32,
858 .ai_maxdata = 0xffff,
859 .ai_fifo_depth = 4095,
860 .gainlkup = ai_gain_628x,
861 .ai_speed = 800,
862 .n_aochan = 4,
863 .ao_maxdata = 0xffff,
864 .ao_fifo_depth = 8191,
865 .ao_range_table = &range_ni_M_625x_ao,
866 .reg_type = ni_reg_625x,
867 .ao_speed = 350,
868 .has_32dio_chan = 1,
869 .caldac = { caldac_none },
870 },
871 [BOARD_PCIE6259] = {
872 .name = "pcie-6259",
873 .n_adchan = 32,
874 .ai_maxdata = 0xffff,
875 .ai_fifo_depth = 4095,
876 .gainlkup = ai_gain_628x,
877 .ai_speed = 800,
878 .n_aochan = 4,
879 .ao_maxdata = 0xffff,
880 .ao_fifo_depth = 8191,
881 .ao_range_table = &range_ni_M_625x_ao,
882 .reg_type = ni_reg_625x,
883 .ao_speed = 350,
884 .has_32dio_chan = 1,
885 .caldac = { caldac_none },
886 },
887 [BOARD_PCI6280] = {
888 .name = "pci-6280",
889 .n_adchan = 16,
890 .ai_maxdata = 0x3ffff,
891 .ai_fifo_depth = 2047,
892 .gainlkup = ai_gain_628x,
893 .ai_speed = 1600,
894 .ao_fifo_depth = 8191,
895 .reg_type = ni_reg_628x,
896 .caldac = { caldac_none },
897 },
898 [BOARD_PCI6281] = {
899 .name = "pci-6281",
900 .n_adchan = 16,
901 .ai_maxdata = 0x3ffff,
902 .ai_fifo_depth = 2047,
903 .gainlkup = ai_gain_628x,
904 .ai_speed = 1600,
905 .n_aochan = 2,
906 .ao_maxdata = 0xffff,
907 .ao_fifo_depth = 8191,
908 .ao_range_table = &range_ni_M_628x_ao,
909 .reg_type = ni_reg_628x,
910 .ao_speed = 350,
911 .caldac = { caldac_none },
912 },
913 [BOARD_PXI6281] = {
914 .name = "pxi-6281",
915 .n_adchan = 16,
916 .ai_maxdata = 0x3ffff,
917 .ai_fifo_depth = 2047,
918 .gainlkup = ai_gain_628x,
919 .ai_speed = 1600,
920 .n_aochan = 2,
921 .ao_maxdata = 0xffff,
922 .ao_fifo_depth = 8191,
923 .ao_range_table = &range_ni_M_628x_ao,
924 .reg_type = ni_reg_628x,
925 .ao_speed = 350,
926 .caldac = { caldac_none },
927 },
928 [BOARD_PCI6284] = {
929 .name = "pci-6284",
930 .n_adchan = 32,
931 .ai_maxdata = 0x3ffff,
932 .ai_fifo_depth = 2047,
933 .gainlkup = ai_gain_628x,
934 .ai_speed = 1600,
935 .reg_type = ni_reg_628x,
936 .has_32dio_chan = 1,
937 .caldac = { caldac_none },
938 },
939 [BOARD_PCI6289] = {
940 .name = "pci-6289",
941 .n_adchan = 32,
942 .ai_maxdata = 0x3ffff,
943 .ai_fifo_depth = 2047,
944 .gainlkup = ai_gain_628x,
945 .ai_speed = 1600,
946 .n_aochan = 4,
947 .ao_maxdata = 0xffff,
948 .ao_fifo_depth = 8191,
949 .ao_range_table = &range_ni_M_628x_ao,
950 .reg_type = ni_reg_628x,
951 .ao_speed = 350,
952 .has_32dio_chan = 1,
953 .caldac = { caldac_none },
954 },
955 [BOARD_PCI6143] = {
956 .name = "pci-6143",
957 .n_adchan = 8,
958 .ai_maxdata = 0xffff,
959 .ai_fifo_depth = 1024,
960 .gainlkup = ai_gain_6143,
961 .ai_speed = 4000,
962 .reg_type = ni_reg_6143,
963 .caldac = { ad8804_debug, ad8804_debug },
964 },
965 [BOARD_PXI6143] = {
966 .name = "pxi-6143",
967 .n_adchan = 8,
968 .ai_maxdata = 0xffff,
969 .ai_fifo_depth = 1024,
970 .gainlkup = ai_gain_6143,
971 .ai_speed = 4000,
972 .reg_type = ni_reg_6143,
973 .caldac = { ad8804_debug, ad8804_debug },
974 },
975 };
976
977 #include "ni_mio_common.c"
978
pcimio_ai_change(struct comedi_device * dev,struct comedi_subdevice * s)979 static int pcimio_ai_change(struct comedi_device *dev,
980 struct comedi_subdevice *s)
981 {
982 struct ni_private *devpriv = dev->private;
983 int ret;
984
985 ret = mite_buf_change(devpriv->ai_mite_ring, s);
986 if (ret < 0)
987 return ret;
988
989 return 0;
990 }
991
pcimio_ao_change(struct comedi_device * dev,struct comedi_subdevice * s)992 static int pcimio_ao_change(struct comedi_device *dev,
993 struct comedi_subdevice *s)
994 {
995 struct ni_private *devpriv = dev->private;
996 int ret;
997
998 ret = mite_buf_change(devpriv->ao_mite_ring, s);
999 if (ret < 0)
1000 return ret;
1001
1002 return 0;
1003 }
1004
pcimio_gpct0_change(struct comedi_device * dev,struct comedi_subdevice * s)1005 static int pcimio_gpct0_change(struct comedi_device *dev,
1006 struct comedi_subdevice *s)
1007 {
1008 struct ni_private *devpriv = dev->private;
1009 int ret;
1010
1011 ret = mite_buf_change(devpriv->gpct_mite_ring[0], s);
1012 if (ret < 0)
1013 return ret;
1014
1015 return 0;
1016 }
1017
pcimio_gpct1_change(struct comedi_device * dev,struct comedi_subdevice * s)1018 static int pcimio_gpct1_change(struct comedi_device *dev,
1019 struct comedi_subdevice *s)
1020 {
1021 struct ni_private *devpriv = dev->private;
1022 int ret;
1023
1024 ret = mite_buf_change(devpriv->gpct_mite_ring[1], s);
1025 if (ret < 0)
1026 return ret;
1027
1028 return 0;
1029 }
1030
pcimio_dio_change(struct comedi_device * dev,struct comedi_subdevice * s)1031 static int pcimio_dio_change(struct comedi_device *dev,
1032 struct comedi_subdevice *s)
1033 {
1034 struct ni_private *devpriv = dev->private;
1035 int ret;
1036
1037 ret = mite_buf_change(devpriv->cdo_mite_ring, s);
1038 if (ret < 0)
1039 return ret;
1040
1041 return 0;
1042 }
1043
m_series_init_eeprom_buffer(struct comedi_device * dev)1044 static void m_series_init_eeprom_buffer(struct comedi_device *dev)
1045 {
1046 struct ni_private *devpriv = dev->private;
1047 static const int Start_Cal_EEPROM = 0x400;
1048 static const unsigned window_size = 10;
1049 static const int serial_number_eeprom_offset = 0x4;
1050 static const int serial_number_eeprom_length = 0x4;
1051 unsigned old_iodwbsr_bits;
1052 unsigned old_iodwbsr1_bits;
1053 unsigned old_iodwcr1_bits;
1054 int i;
1055
1056 old_iodwbsr_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR);
1057 old_iodwbsr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1058 old_iodwcr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1059 writel(0x0, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1060 writel(((0x80 | window_size) | devpriv->mite->daq_phys_addr),
1061 devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1062 writel(0x1 | old_iodwcr1_bits,
1063 devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1064 writel(0xf, devpriv->mite->mite_io_addr + 0x30);
1065
1066 BUG_ON(serial_number_eeprom_length > sizeof(devpriv->serial_number));
1067 for (i = 0; i < serial_number_eeprom_length; ++i) {
1068 char *byte_ptr = (char *)&devpriv->serial_number + i;
1069 *byte_ptr = ni_readb(dev, serial_number_eeprom_offset + i);
1070 }
1071 devpriv->serial_number = be32_to_cpu(devpriv->serial_number);
1072
1073 for (i = 0; i < M_SERIES_EEPROM_SIZE; ++i)
1074 devpriv->eeprom_buffer[i] = ni_readb(dev, Start_Cal_EEPROM + i);
1075
1076 writel(old_iodwbsr1_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1077 writel(old_iodwbsr_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1078 writel(old_iodwcr1_bits, devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1079 writel(0x0, devpriv->mite->mite_io_addr + 0x30);
1080 }
1081
init_6143(struct comedi_device * dev)1082 static void init_6143(struct comedi_device *dev)
1083 {
1084 const struct ni_board_struct *board = dev->board_ptr;
1085 struct ni_private *devpriv = dev->private;
1086
1087 /* Disable interrupts */
1088 ni_stc_writew(dev, 0, NISTC_INT_CTRL_REG);
1089
1090 /* Initialise 6143 AI specific bits */
1091
1092 /* Set G0,G1 DMA mode to E series version */
1093 ni_writeb(dev, 0x00, NI6143_MAGIC_REG);
1094 /* Set EOCMode, ADCMode and pipelinedelay */
1095 ni_writeb(dev, 0x80, NI6143_PIPELINE_DELAY_REG);
1096 /* Set EOC Delay */
1097 ni_writeb(dev, 0x00, NI6143_EOC_SET_REG);
1098
1099 /* Set the FIFO half full level */
1100 ni_writel(dev, board->ai_fifo_depth / 2, NI6143_AI_FIFO_FLAG_REG);
1101
1102 /* Strobe Relay disable bit */
1103 devpriv->ai_calib_source_enabled = 0;
1104 ni_writew(dev, devpriv->ai_calib_source | NI6143_CALIB_CHAN_RELAY_OFF,
1105 NI6143_CALIB_CHAN_REG);
1106 ni_writew(dev, devpriv->ai_calib_source, NI6143_CALIB_CHAN_REG);
1107 }
1108
pcimio_detach(struct comedi_device * dev)1109 static void pcimio_detach(struct comedi_device *dev)
1110 {
1111 struct ni_private *devpriv = dev->private;
1112
1113 mio_common_detach(dev);
1114 if (dev->irq)
1115 free_irq(dev->irq, dev);
1116 if (devpriv) {
1117 mite_free_ring(devpriv->ai_mite_ring);
1118 mite_free_ring(devpriv->ao_mite_ring);
1119 mite_free_ring(devpriv->cdo_mite_ring);
1120 mite_free_ring(devpriv->gpct_mite_ring[0]);
1121 mite_free_ring(devpriv->gpct_mite_ring[1]);
1122 mite_detach(devpriv->mite);
1123 }
1124 if (dev->mmio)
1125 iounmap(dev->mmio);
1126 comedi_pci_disable(dev);
1127 }
1128
pcimio_auto_attach(struct comedi_device * dev,unsigned long context)1129 static int pcimio_auto_attach(struct comedi_device *dev,
1130 unsigned long context)
1131 {
1132 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1133 const struct ni_board_struct *board = NULL;
1134 struct ni_private *devpriv;
1135 unsigned int irq;
1136 int ret;
1137
1138 if (context < ARRAY_SIZE(ni_boards))
1139 board = &ni_boards[context];
1140 if (!board)
1141 return -ENODEV;
1142 dev->board_ptr = board;
1143 dev->board_name = board->name;
1144
1145 ret = comedi_pci_enable(dev);
1146 if (ret)
1147 return ret;
1148
1149 ret = ni_alloc_private(dev);
1150 if (ret)
1151 return ret;
1152 devpriv = dev->private;
1153
1154 devpriv->mite = mite_alloc(pcidev);
1155 if (!devpriv->mite)
1156 return -ENOMEM;
1157
1158 if (board->reg_type & ni_reg_m_series_mask)
1159 devpriv->is_m_series = 1;
1160 if (board->reg_type & ni_reg_6xxx_mask)
1161 devpriv->is_6xxx = 1;
1162 if (board->reg_type == ni_reg_611x)
1163 devpriv->is_611x = 1;
1164 if (board->reg_type == ni_reg_6143)
1165 devpriv->is_6143 = 1;
1166 if (board->reg_type == ni_reg_622x)
1167 devpriv->is_622x = 1;
1168 if (board->reg_type == ni_reg_625x)
1169 devpriv->is_625x = 1;
1170 if (board->reg_type == ni_reg_628x)
1171 devpriv->is_628x = 1;
1172 if (board->reg_type & ni_reg_67xx_mask)
1173 devpriv->is_67xx = 1;
1174 if (board->reg_type == ni_reg_6711)
1175 devpriv->is_6711 = 1;
1176 if (board->reg_type == ni_reg_6713)
1177 devpriv->is_6713 = 1;
1178
1179 ret = mite_setup(dev, devpriv->mite);
1180 if (ret < 0)
1181 return ret;
1182
1183 devpriv->ai_mite_ring = mite_alloc_ring(devpriv->mite);
1184 if (!devpriv->ai_mite_ring)
1185 return -ENOMEM;
1186 devpriv->ao_mite_ring = mite_alloc_ring(devpriv->mite);
1187 if (!devpriv->ao_mite_ring)
1188 return -ENOMEM;
1189 devpriv->cdo_mite_ring = mite_alloc_ring(devpriv->mite);
1190 if (!devpriv->cdo_mite_ring)
1191 return -ENOMEM;
1192 devpriv->gpct_mite_ring[0] = mite_alloc_ring(devpriv->mite);
1193 if (!devpriv->gpct_mite_ring[0])
1194 return -ENOMEM;
1195 devpriv->gpct_mite_ring[1] = mite_alloc_ring(devpriv->mite);
1196 if (!devpriv->gpct_mite_ring[1])
1197 return -ENOMEM;
1198
1199 if (devpriv->is_m_series)
1200 m_series_init_eeprom_buffer(dev);
1201 if (devpriv->is_6143)
1202 init_6143(dev);
1203
1204 irq = pcidev->irq;
1205 if (irq) {
1206 ret = request_irq(irq, ni_E_interrupt, IRQF_SHARED,
1207 dev->board_name, dev);
1208 if (ret == 0)
1209 dev->irq = irq;
1210 }
1211
1212 ret = ni_E_init(dev, 0, 1);
1213 if (ret < 0)
1214 return ret;
1215
1216 dev->subdevices[NI_AI_SUBDEV].buf_change = &pcimio_ai_change;
1217 dev->subdevices[NI_AO_SUBDEV].buf_change = &pcimio_ao_change;
1218 dev->subdevices[NI_GPCT_SUBDEV(0)].buf_change = &pcimio_gpct0_change;
1219 dev->subdevices[NI_GPCT_SUBDEV(1)].buf_change = &pcimio_gpct1_change;
1220 dev->subdevices[NI_DIO_SUBDEV].buf_change = &pcimio_dio_change;
1221
1222 return 0;
1223 }
1224
1225 static struct comedi_driver ni_pcimio_driver = {
1226 .driver_name = "ni_pcimio",
1227 .module = THIS_MODULE,
1228 .auto_attach = pcimio_auto_attach,
1229 .detach = pcimio_detach,
1230 };
1231
ni_pcimio_pci_probe(struct pci_dev * dev,const struct pci_device_id * id)1232 static int ni_pcimio_pci_probe(struct pci_dev *dev,
1233 const struct pci_device_id *id)
1234 {
1235 return comedi_pci_auto_config(dev, &ni_pcimio_driver, id->driver_data);
1236 }
1237
1238 static const struct pci_device_id ni_pcimio_pci_table[] = {
1239 { PCI_VDEVICE(NI, 0x0162), BOARD_PCIMIO_16XE_50 }, /* 0x1620? */
1240 { PCI_VDEVICE(NI, 0x1170), BOARD_PCIMIO_16XE_10 },
1241 { PCI_VDEVICE(NI, 0x1180), BOARD_PCIMIO_16E_1 },
1242 { PCI_VDEVICE(NI, 0x1190), BOARD_PCIMIO_16E_4 },
1243 { PCI_VDEVICE(NI, 0x11b0), BOARD_PXI6070E },
1244 { PCI_VDEVICE(NI, 0x11c0), BOARD_PXI6040E },
1245 { PCI_VDEVICE(NI, 0x11d0), BOARD_PXI6030E },
1246 { PCI_VDEVICE(NI, 0x1270), BOARD_PCI6032E },
1247 { PCI_VDEVICE(NI, 0x1330), BOARD_PCI6031E },
1248 { PCI_VDEVICE(NI, 0x1340), BOARD_PCI6033E },
1249 { PCI_VDEVICE(NI, 0x1350), BOARD_PCI6071E },
1250 { PCI_VDEVICE(NI, 0x14e0), BOARD_PCI6110 },
1251 { PCI_VDEVICE(NI, 0x14f0), BOARD_PCI6111 },
1252 { PCI_VDEVICE(NI, 0x1580), BOARD_PXI6031E },
1253 { PCI_VDEVICE(NI, 0x15b0), BOARD_PXI6071E },
1254 { PCI_VDEVICE(NI, 0x1880), BOARD_PCI6711 },
1255 { PCI_VDEVICE(NI, 0x1870), BOARD_PCI6713 },
1256 { PCI_VDEVICE(NI, 0x18b0), BOARD_PCI6052E },
1257 { PCI_VDEVICE(NI, 0x18c0), BOARD_PXI6052E },
1258 { PCI_VDEVICE(NI, 0x2410), BOARD_PCI6733 },
1259 { PCI_VDEVICE(NI, 0x2420), BOARD_PXI6733 },
1260 { PCI_VDEVICE(NI, 0x2430), BOARD_PCI6731 },
1261 { PCI_VDEVICE(NI, 0x2890), BOARD_PCI6036E },
1262 { PCI_VDEVICE(NI, 0x28c0), BOARD_PCI6014 },
1263 { PCI_VDEVICE(NI, 0x2a60), BOARD_PCI6023E },
1264 { PCI_VDEVICE(NI, 0x2a70), BOARD_PCI6024E },
1265 { PCI_VDEVICE(NI, 0x2a80), BOARD_PCI6025E },
1266 { PCI_VDEVICE(NI, 0x2ab0), BOARD_PXI6025E },
1267 { PCI_VDEVICE(NI, 0x2b80), BOARD_PXI6713 },
1268 { PCI_VDEVICE(NI, 0x2b90), BOARD_PXI6711 },
1269 { PCI_VDEVICE(NI, 0x2c80), BOARD_PCI6035E },
1270 { PCI_VDEVICE(NI, 0x2ca0), BOARD_PCI6034E },
1271 { PCI_VDEVICE(NI, 0x70aa), BOARD_PCI6229 },
1272 { PCI_VDEVICE(NI, 0x70ab), BOARD_PCI6259 },
1273 { PCI_VDEVICE(NI, 0x70ac), BOARD_PCI6289 },
1274 { PCI_VDEVICE(NI, 0x70af), BOARD_PCI6221 },
1275 { PCI_VDEVICE(NI, 0x70b0), BOARD_PCI6220 },
1276 { PCI_VDEVICE(NI, 0x70b4), BOARD_PCI6250 },
1277 { PCI_VDEVICE(NI, 0x70b6), BOARD_PCI6280 },
1278 { PCI_VDEVICE(NI, 0x70b7), BOARD_PCI6254 },
1279 { PCI_VDEVICE(NI, 0x70b8), BOARD_PCI6251 },
1280 { PCI_VDEVICE(NI, 0x70bc), BOARD_PCI6284 },
1281 { PCI_VDEVICE(NI, 0x70bd), BOARD_PCI6281 },
1282 { PCI_VDEVICE(NI, 0x70bf), BOARD_PXI6281 },
1283 { PCI_VDEVICE(NI, 0x70c0), BOARD_PCI6143 },
1284 { PCI_VDEVICE(NI, 0x70f2), BOARD_PCI6224 },
1285 { PCI_VDEVICE(NI, 0x70f3), BOARD_PXI6224 },
1286 { PCI_VDEVICE(NI, 0x710d), BOARD_PXI6143 },
1287 { PCI_VDEVICE(NI, 0x716c), BOARD_PCI6225 },
1288 { PCI_VDEVICE(NI, 0x716d), BOARD_PXI6225 },
1289 { PCI_VDEVICE(NI, 0x717f), BOARD_PCIE6259 },
1290 { PCI_VDEVICE(NI, 0x71bc), BOARD_PCI6221_37PIN },
1291 { PCI_VDEVICE(NI, 0x717d), BOARD_PCIE6251 },
1292 { PCI_VDEVICE(NI, 0x72e8), BOARD_PXIE6251 },
1293 { 0 }
1294 };
1295 MODULE_DEVICE_TABLE(pci, ni_pcimio_pci_table);
1296
1297 static struct pci_driver ni_pcimio_pci_driver = {
1298 .name = "ni_pcimio",
1299 .id_table = ni_pcimio_pci_table,
1300 .probe = ni_pcimio_pci_probe,
1301 .remove = comedi_pci_auto_unconfig,
1302 };
1303 module_comedi_pci_driver(ni_pcimio_driver, ni_pcimio_pci_driver);
1304
1305 MODULE_AUTHOR("Comedi http://www.comedi.org");
1306 MODULE_DESCRIPTION("Comedi low-level driver");
1307 MODULE_LICENSE("GPL");
1308