ni_pcimio.c revision f8db88ef1f173bfc81afe244f4e6ff00d3e025e4
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    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21*/
22/*
23Driver: ni_pcimio
24Description: National Instruments PCI-MIO-E series and M series (all boards)
25Author: ds, John Hallen, Frank Mori Hess, Rolf Mueller, Herbert Peremans,
26  Herman Bruyninckx, Terry Barnaby
27Status: works
28Devices: [National Instruments] PCI-MIO-16XE-50 (ni_pcimio),
29  PCI-MIO-16XE-10, PXI-6030E, PCI-MIO-16E-1, PCI-MIO-16E-4, PCI-6014, PCI-6040E,
30  PXI-6040E, PCI-6030E, PCI-6031E, PCI-6032E, PCI-6033E, PCI-6071E, PCI-6023E,
31  PCI-6024E, PCI-6025E, PXI-6025E, PCI-6034E, PCI-6035E, PCI-6052E,
32  PCI-6110, PCI-6111, PCI-6220, PCI-6221, PCI-6224, PCI-6225, PCI-6229,
33  PCI-6250, PCI-6251, PCIe-6251, PCI-6254, PCI-6259, PCIe-6259,
34  PCI-6280, PCI-6281, PXI-6281, PCI-6284, PCI-6289,
35  PCI-6711, PXI-6711, PCI-6713, PXI-6713,
36  PXI-6071E, PCI-6070E, PXI-6070E,
37  PXI-6052E, PCI-6036E, PCI-6731, PCI-6733, PXI-6733,
38  PCI-6143, PXI-6143
39Updated: Wed Nov 29 10:30:36 EST 2006
40
41These boards are almost identical to the AT-MIO E series, except that
42they use the PCI bus instead of ISA (i.e., AT).  See the notes for
43the ni_atmio.o driver for additional information about these boards.
44
45Autocalibration is supported on many of the devices, using the
46comedi_calibrate (or comedi_soft_calibrate for m-series) utility.
47M-Series boards do analog input and analog output calibration entirely
48in software. The software calibration corrects
49the analog input for offset, gain and
50nonlinearity.  The analog outputs are corrected for offset and gain.
51See the comedilib documentation on comedi_get_softcal_converter() for
52more information.
53
54By default, the driver uses DMA to transfer analog input data to
55memory.  When DMA is enabled, not all triggering features are
56supported.
57
58Digital I/O may not work on 673x.
59
60Note that the PCI-6143 is a simultaineous sampling device with 8 convertors.
61With this board all of the convertors perform one simultaineous sample during
62a scan interval. The period for a scan is used for the convert time in a
63Comedi cmd. The convert trigger source is normally set to TRIG_NOW by default.
64
65The RTSI trigger bus is supported on these cards on
66subdevice 10. See the comedilib documentation for details.
67
68Information (number of channels, bits, etc.) for some devices may be
69incorrect.  Please check this and submit a bug if there are problems
70for your device.
71
72SCXI is probably broken for m-series boards.
73
74Bugs:
75 - When DMA is enabled, COMEDI_EV_CONVERT does
76   not work correctly.
77
78*/
79/*
80	The PCI-MIO E series driver was originally written by
81	Tomasz Motylewski <...>, and ported to comedi by ds.
82
83	References:
84
85	   341079b.pdf  PCI E Series Register-Level Programmer Manual
86	   340934b.pdf  DAQ-STC reference manual
87
88	   322080b.pdf  6711/6713/6715 User Manual
89
90	   320945c.pdf  PCI E Series User Manual
91	   322138a.pdf  PCI-6052E and DAQPad-6052E User Manual
92
93	ISSUES:
94
95	need to deal with external reference for DAC, and other DAC
96	properties in board properties
97
98	deal with at-mio-16de-10 revision D to N changes, etc.
99
100	need to add other CALDAC type
101
102	need to slow down DAC loading.  I don't trust NI's claim that
103	two writes to the PCI bus slows IO enough.  I would prefer to
104	use comedi_udelay().  Timing specs: (clock)
105		AD8522		30ns
106		DAC8043		120ns
107		DAC8800		60ns
108		MB88341		?
109
110*/
111
112#include "../comedidev.h"
113
114#include <asm/byteorder.h>
115#include <linux/delay.h>
116
117#include "ni_stc.h"
118#include "mite.h"
119
120//#define PCI_DEBUG
121
122#define PCIDMA
123
124#define PCIMIO 1
125#undef ATMIO
126
127#define MAX_N_CALDACS (16+16+2)
128
129#define DRV_NAME "ni_pcimio"
130
131/* The following two tables must be in the same order */
132static DEFINE_PCI_DEVICE_TABLE(ni_pci_table) = {
133	{PCI_VENDOR_ID_NATINST, 0x0162, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
134	{PCI_VENDOR_ID_NATINST, 0x1170, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
135	{PCI_VENDOR_ID_NATINST, 0x1180, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
136	{PCI_VENDOR_ID_NATINST, 0x1190, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
137	{PCI_VENDOR_ID_NATINST, 0x11b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
138	{PCI_VENDOR_ID_NATINST, 0x11c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
139	{PCI_VENDOR_ID_NATINST, 0x11d0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
140	{PCI_VENDOR_ID_NATINST, 0x1270, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
141	{PCI_VENDOR_ID_NATINST, 0x1330, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
142	{PCI_VENDOR_ID_NATINST, 0x1340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
143	{PCI_VENDOR_ID_NATINST, 0x1350, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
144	{PCI_VENDOR_ID_NATINST, 0x14e0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
145	{PCI_VENDOR_ID_NATINST, 0x14f0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
146	{PCI_VENDOR_ID_NATINST, 0x1580, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
147	{PCI_VENDOR_ID_NATINST, 0x15b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
148	{PCI_VENDOR_ID_NATINST, 0x1880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
149	{PCI_VENDOR_ID_NATINST, 0x1870, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
150	{PCI_VENDOR_ID_NATINST, 0x18b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
151	{PCI_VENDOR_ID_NATINST, 0x18c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
152	{PCI_VENDOR_ID_NATINST, 0x2410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
153	{PCI_VENDOR_ID_NATINST, 0x2420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
154	{PCI_VENDOR_ID_NATINST, 0x2430, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
155	{PCI_VENDOR_ID_NATINST, 0x2890, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
156	{PCI_VENDOR_ID_NATINST, 0x28c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
157	{PCI_VENDOR_ID_NATINST, 0x2a60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
158	{PCI_VENDOR_ID_NATINST, 0x2a70, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
159	{PCI_VENDOR_ID_NATINST, 0x2a80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
160	{PCI_VENDOR_ID_NATINST, 0x2ab0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
161	{PCI_VENDOR_ID_NATINST, 0x2b80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
162	{PCI_VENDOR_ID_NATINST, 0x2b90, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
163	{PCI_VENDOR_ID_NATINST, 0x2c80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
164	{PCI_VENDOR_ID_NATINST, 0x2ca0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
165	{PCI_VENDOR_ID_NATINST, 0x70aa, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
166	{PCI_VENDOR_ID_NATINST, 0x70ab, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
167	{PCI_VENDOR_ID_NATINST, 0x70ac, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
168	{PCI_VENDOR_ID_NATINST, 0x70af, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
169	{PCI_VENDOR_ID_NATINST, 0x70b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
170	{PCI_VENDOR_ID_NATINST, 0x70b4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
171	{PCI_VENDOR_ID_NATINST, 0x70b6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
172	{PCI_VENDOR_ID_NATINST, 0x70b7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
173	{PCI_VENDOR_ID_NATINST, 0x70b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
174	{PCI_VENDOR_ID_NATINST, 0x70bc, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
175	{PCI_VENDOR_ID_NATINST, 0x70bd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
176	{PCI_VENDOR_ID_NATINST, 0x70bf, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
177	{PCI_VENDOR_ID_NATINST, 0x70c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
178	{PCI_VENDOR_ID_NATINST, 0x70f2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
179	{PCI_VENDOR_ID_NATINST, 0x710d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
180	{PCI_VENDOR_ID_NATINST, 0x716c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
181	{PCI_VENDOR_ID_NATINST, 0x717f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
182	{PCI_VENDOR_ID_NATINST, 0x71bc, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
183	{PCI_VENDOR_ID_NATINST, 0x717d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
184	{0}
185};
186
187MODULE_DEVICE_TABLE(pci, ni_pci_table);
188
189/* These are not all the possible ao ranges for 628x boards.
190 They can do OFFSET +- REFERENCE where OFFSET can be
191 0V, 5V, APFI<0,1>, or AO<0...3> and RANGE can
192 be 10V, 5V, 2V, 1V, APFI<0,1>, AO<0...3>.  That's
193 63 different possibilities.  An AO channel
194 can not act as it's own OFFSET or REFERENCE.
195*/
196static const comedi_lrange range_ni_M_628x_ao = { 8, {
197			RANGE(-10, 10),
198			RANGE(-5, 5),
199			RANGE(-2, 2),
200			RANGE(-1, 1),
201			RANGE(-5, 15),
202			RANGE(0, 10),
203			RANGE(3, 7),
204			RANGE(4, 6),
205			RANGE_ext(-1, 1)
206	}
207};
208static const comedi_lrange range_ni_M_625x_ao = { 3, {
209			RANGE(-10, 10),
210			RANGE(-5, 5),
211			RANGE_ext(-1, 1)
212	}
213};
214static const comedi_lrange range_ni_M_622x_ao = { 1, {
215			RANGE(-10, 10),
216	}
217};
218
219static const ni_board ni_boards[] = {
220	{
221			.device_id = 0x0162,	// NI also says 0x1620.  typo?
222			.name = "pci-mio-16xe-50",
223			.n_adchan = 16,
224			.adbits = 16,
225			.ai_fifo_depth = 2048,
226			.alwaysdither = 1,
227			.gainlkup = ai_gain_8,
228			.ai_speed = 50000,
229			.n_aochan = 2,
230			.aobits = 12,
231			.ao_fifo_depth = 0,
232			.ao_range_table = &range_bipolar10,
233			.ao_unipolar = 0,
234			.ao_speed = 50000,
235			.num_p0_dio_channels = 8,
236			.caldac = {dac8800, dac8043},
237			.has_8255 = 0,
238		},
239	{
240			.device_id = 0x1170,
241			.name = "pci-mio-16xe-10",	// aka pci-6030E
242			.n_adchan = 16,
243			.adbits = 16,
244			.ai_fifo_depth = 512,
245			.alwaysdither = 1,
246			.gainlkup = ai_gain_14,
247			.ai_speed = 10000,
248			.n_aochan = 2,
249			.aobits = 16,
250			.ao_fifo_depth = 2048,
251			.ao_range_table = &range_ni_E_ao_ext,
252			.ao_unipolar = 1,
253			.ao_speed = 10000,
254			.num_p0_dio_channels = 8,
255			.caldac = {dac8800, dac8043, ad8522},
256			.has_8255 = 0,
257		},
258	{
259			.device_id = 0x28c0,
260			.name = "pci-6014",
261			.n_adchan = 16,
262			.adbits = 16,
263			.ai_fifo_depth = 512,
264			.alwaysdither = 1,
265			.gainlkup = ai_gain_4,
266			.ai_speed = 5000,
267			.n_aochan = 2,
268			.aobits = 16,
269			.ao_fifo_depth = 0,
270			.ao_range_table = &range_bipolar10,
271			.ao_unipolar = 0,
272			.ao_speed = 100000,
273			.num_p0_dio_channels = 8,
274			.caldac = {ad8804_debug},
275			.has_8255 = 0,
276		},
277	{
278			.device_id = 0x11d0,
279			.name = "pxi-6030e",
280			.n_adchan = 16,
281			.adbits = 16,
282			.ai_fifo_depth = 512,
283			.alwaysdither = 1,
284			.gainlkup = ai_gain_14,
285			.ai_speed = 10000,
286			.n_aochan = 2,
287			.aobits = 16,
288			.ao_fifo_depth = 2048,
289			.ao_range_table = &range_ni_E_ao_ext,
290			.ao_unipolar = 1,
291			.ao_speed = 10000,
292			.num_p0_dio_channels = 8,
293			.caldac = {dac8800, dac8043, ad8522},
294			.has_8255 = 0,
295		},
296	{
297			.device_id = 0x1180,
298			.name = "pci-mio-16e-1",	/* aka pci-6070e */
299			.n_adchan = 16,
300			.adbits = 12,
301			.ai_fifo_depth = 512,
302			.alwaysdither = 0,
303			.gainlkup = ai_gain_16,
304			.ai_speed = 800,
305			.n_aochan = 2,
306			.aobits = 12,
307			.ao_fifo_depth = 2048,
308			.ao_range_table = &range_ni_E_ao_ext,
309			.ao_unipolar = 1,
310			.ao_speed = 1000,
311			.num_p0_dio_channels = 8,
312			.caldac = {mb88341},
313			.has_8255 = 0,
314		},
315	{
316			.device_id = 0x1190,
317			.name = "pci-mio-16e-4",	/* aka pci-6040e */
318			.n_adchan = 16,
319			.adbits = 12,
320			.ai_fifo_depth = 512,
321			.alwaysdither = 0,
322			.gainlkup = ai_gain_16,
323			/* Note: there have been reported problems with full speed
324			 * on this board */
325			.ai_speed = 2000,
326			.n_aochan = 2,
327			.aobits = 12,
328			.ao_fifo_depth = 512,
329			.ao_range_table = &range_ni_E_ao_ext,
330			.ao_unipolar = 1,
331			.ao_speed = 1000,
332			.num_p0_dio_channels = 8,
333			.caldac = {ad8804_debug},	// doc says mb88341
334			.has_8255 = 0,
335		},
336	{
337			.device_id = 0x11c0,
338			.name = "pxi-6040e",
339			.n_adchan = 16,
340			.adbits = 12,
341			.ai_fifo_depth = 512,
342			.alwaysdither = 0,
343			.gainlkup = ai_gain_16,
344			.ai_speed = 2000,
345			.n_aochan = 2,
346			.aobits = 12,
347			.ao_fifo_depth = 512,
348			.ao_range_table = &range_ni_E_ao_ext,
349			.ao_unipolar = 1,
350			.ao_speed = 1000,
351			.num_p0_dio_channels = 8,
352			.caldac = {mb88341},
353			.has_8255 = 0,
354		},
355
356	{
357			.device_id = 0x1330,
358			.name = "pci-6031e",
359			.n_adchan = 64,
360			.adbits = 16,
361			.ai_fifo_depth = 512,
362			.alwaysdither = 1,
363			.gainlkup = ai_gain_14,
364			.ai_speed = 10000,
365			.n_aochan = 2,
366			.aobits = 16,
367			.ao_fifo_depth = 2048,
368			.ao_range_table = &range_ni_E_ao_ext,
369			.ao_unipolar = 1,
370			.ao_speed = 10000,
371			.num_p0_dio_channels = 8,
372			.caldac = {dac8800, dac8043, ad8522},
373			.has_8255 = 0,
374		},
375	{
376			.device_id = 0x1270,
377			.name = "pci-6032e",
378			.n_adchan = 16,
379			.adbits = 16,
380			.ai_fifo_depth = 512,
381			.alwaysdither = 1,
382			.gainlkup = ai_gain_14,
383			.ai_speed = 10000,
384			.n_aochan = 0,
385			.aobits = 0,
386			.ao_fifo_depth = 0,
387			.ao_unipolar = 0,
388			.num_p0_dio_channels = 8,
389			.caldac = {dac8800, dac8043, ad8522},
390			.has_8255 = 0,
391		},
392	{
393			.device_id = 0x1340,
394			.name = "pci-6033e",
395			.n_adchan = 64,
396			.adbits = 16,
397			.ai_fifo_depth = 512,
398			.alwaysdither = 1,
399			.gainlkup = ai_gain_14,
400			.ai_speed = 10000,
401			.n_aochan = 0,
402			.aobits = 0,
403			.ao_fifo_depth = 0,
404			.ao_unipolar = 0,
405			.num_p0_dio_channels = 8,
406			.caldac = {dac8800, dac8043, ad8522},
407			.has_8255 = 0,
408		},
409	{
410			.device_id = 0x1350,
411			.name = "pci-6071e",
412			.n_adchan = 64,
413			.adbits = 12,
414			.ai_fifo_depth = 512,
415			.alwaysdither = 1,
416			.gainlkup = ai_gain_16,
417			.ai_speed = 800,
418			.n_aochan = 2,
419			.aobits = 12,
420			.ao_fifo_depth = 2048,
421			.ao_range_table = &range_ni_E_ao_ext,
422			.ao_unipolar = 1,
423			.ao_speed = 1000,
424			.num_p0_dio_channels = 8,
425			.caldac = {ad8804_debug},
426			.has_8255 = 0,
427		},
428	{
429			.device_id = 0x2a60,
430			.name = "pci-6023e",
431			.n_adchan = 16,
432			.adbits = 12,
433			.ai_fifo_depth = 512,
434			.alwaysdither = 0,
435			.gainlkup = ai_gain_4,
436			.ai_speed = 5000,
437			.n_aochan = 0,
438			.aobits = 0,
439			.ao_unipolar = 0,
440			.num_p0_dio_channels = 8,
441			.caldac = {ad8804_debug},	/* manual is wrong */
442			.has_8255 = 0,
443		},
444	{
445			.device_id = 0x2a70,
446			.name = "pci-6024e",
447			.n_adchan = 16,
448			.adbits = 12,
449			.ai_fifo_depth = 512,
450			.alwaysdither = 0,
451			.gainlkup = ai_gain_4,
452			.ai_speed = 5000,
453			.n_aochan = 2,
454			.aobits = 12,
455			.ao_fifo_depth = 0,
456			.ao_range_table = &range_bipolar10,
457			.ao_unipolar = 0,
458			.ao_speed = 100000,
459			.num_p0_dio_channels = 8,
460			.caldac = {ad8804_debug},	/* manual is wrong */
461			.has_8255 = 0,
462		},
463	{
464			.device_id = 0x2a80,
465			.name = "pci-6025e",
466			.n_adchan = 16,
467			.adbits = 12,
468			.ai_fifo_depth = 512,
469			.alwaysdither = 0,
470			.gainlkup = ai_gain_4,
471			.ai_speed = 5000,
472			.n_aochan = 2,
473			.aobits = 12,
474			.ao_fifo_depth = 0,
475			.ao_range_table = &range_bipolar10,
476			.ao_unipolar = 0,
477			.ao_speed = 100000,
478			.num_p0_dio_channels = 8,
479			.caldac = {ad8804_debug},	/* manual is wrong */
480			.has_8255 = 1,
481		},
482	{
483			.device_id = 0x2ab0,
484			.name = "pxi-6025e",
485			.n_adchan = 16,
486			.adbits = 12,
487			.ai_fifo_depth = 512,
488			.alwaysdither = 0,
489			.gainlkup = ai_gain_4,
490			.ai_speed = 5000,
491			.n_aochan = 2,
492			.aobits = 12,
493			.ao_fifo_depth = 0,
494			.ao_range_table = &range_ni_E_ao_ext,
495			.ao_unipolar = 1,
496			.ao_speed = 100000,
497			.num_p0_dio_channels = 8,
498			.caldac = {ad8804_debug},	/* manual is wrong */
499			.has_8255 = 1,
500		},
501
502	{
503			.device_id = 0x2ca0,
504			.name = "pci-6034e",
505			.n_adchan = 16,
506			.adbits = 16,
507			.ai_fifo_depth = 512,
508			.alwaysdither = 1,
509			.gainlkup = ai_gain_4,
510			.ai_speed = 5000,
511			.n_aochan = 0,
512			.aobits = 0,
513			.ao_fifo_depth = 0,
514			.ao_unipolar = 0,
515			.num_p0_dio_channels = 8,
516			.caldac = {ad8804_debug},
517			.has_8255 = 0,
518		},
519	{
520			.device_id = 0x2c80,
521			.name = "pci-6035e",
522			.n_adchan = 16,
523			.adbits = 16,
524			.ai_fifo_depth = 512,
525			.alwaysdither = 1,
526			.gainlkup = ai_gain_4,
527			.ai_speed = 5000,
528			.n_aochan = 2,
529			.aobits = 12,
530			.ao_fifo_depth = 0,
531			.ao_range_table = &range_bipolar10,
532			.ao_unipolar = 0,
533			.ao_speed = 100000,
534			.num_p0_dio_channels = 8,
535			.caldac = {ad8804_debug},
536			.has_8255 = 0,
537		},
538	{
539			.device_id = 0x18b0,
540			.name = "pci-6052e",
541			.n_adchan = 16,
542			.adbits = 16,
543			.ai_fifo_depth = 512,
544			.alwaysdither = 1,
545			.gainlkup = ai_gain_16,
546			.ai_speed = 3000,
547			.n_aochan = 2,
548			.aobits = 16,
549			.ao_unipolar = 1,
550			.ao_fifo_depth = 2048,
551			.ao_range_table = &range_ni_E_ao_ext,
552			.ao_speed = 3000,
553			.num_p0_dio_channels = 8,
554			.caldac = {ad8804_debug, ad8804_debug, ad8522},	/* manual is wrong */
555		},
556	{.device_id = 0x14e0,
557			.name = "pci-6110",
558			.n_adchan = 4,
559			.adbits = 12,
560			.ai_fifo_depth = 8192,
561			.alwaysdither = 0,
562			.gainlkup = ai_gain_611x,
563			.ai_speed = 200,
564			.n_aochan = 2,
565			.aobits = 16,
566			.reg_type = ni_reg_611x,
567			.ao_range_table = &range_bipolar10,
568			.ao_unipolar = 0,
569			.ao_fifo_depth = 2048,
570			.ao_speed = 250,
571			.num_p0_dio_channels = 8,
572			.caldac = {ad8804, ad8804},
573		},
574	{
575			.device_id = 0x14f0,
576			.name = "pci-6111",
577			.n_adchan = 2,
578			.adbits = 12,
579			.ai_fifo_depth = 8192,
580			.alwaysdither = 0,
581			.gainlkup = ai_gain_611x,
582			.ai_speed = 200,
583			.n_aochan = 2,
584			.aobits = 16,
585			.reg_type = ni_reg_611x,
586			.ao_range_table = &range_bipolar10,
587			.ao_unipolar = 0,
588			.ao_fifo_depth = 2048,
589			.ao_speed = 250,
590			.num_p0_dio_channels = 8,
591			.caldac = {ad8804, ad8804},
592		},
593#if 0
594	/* The 6115 boards probably need their own driver */
595	{
596			.device_id = 0x2ed0,
597			.name = "pci-6115",
598			.n_adchan = 4,
599			.adbits = 12,
600			.ai_fifo_depth = 8192,
601			.alwaysdither = 0,
602			.gainlkup = ai_gain_611x,
603			.ai_speed = 100,
604			.n_aochan = 2,
605			.aobits = 16,
606			.ao_671x = 1,
607			.ao_unipolar = 0,
608			.ao_fifo_depth = 2048,
609			.ao_speed = 250,
610			.num_p0_dio_channels = 8,
611			.reg_611x = 1,
612			.caldac = {ad8804_debug, ad8804_debug, ad8804_debug},	/* XXX */
613		},
614#endif
615#if 0
616	{
617			.device_id = 0x0000,
618			.name = "pxi-6115",
619			.n_adchan = 4,
620			.adbits = 12,
621			.ai_fifo_depth = 8192,
622			.alwaysdither = 0,
623			.gainlkup = ai_gain_611x,
624			.ai_speed = 100,
625			.n_aochan = 2,
626			.aobits = 16,
627			.ao_671x = 1,
628			.ao_unipolar = 0,
629			.ao_fifo_depth = 2048,
630			.ao_speed = 250,
631			.reg_611x = 1,
632			.num_p0_dio_channels = 8,
633			caldac = {ad8804_debug, ad8804_debug, ad8804_debug},	/* XXX */
634		},
635#endif
636	{
637			.device_id = 0x1880,
638			.name = "pci-6711",
639			.n_adchan = 0,	/* no analog input */
640			.n_aochan = 4,
641			.aobits = 12,
642			.ao_unipolar = 0,
643			.ao_fifo_depth = 16384,
644			/* data sheet says 8192, but fifo really holds 16384 samples */
645			.ao_range_table = &range_bipolar10,
646			.ao_speed = 1000,
647			.num_p0_dio_channels = 8,
648			.reg_type = ni_reg_6711,
649			.caldac = {ad8804_debug},
650		},
651	{
652			.device_id = 0x2b90,
653			.name = "pxi-6711",
654			.n_adchan = 0,	/* no analog input */
655			.n_aochan = 4,
656			.aobits = 12,
657			.ao_unipolar = 0,
658			.ao_fifo_depth = 16384,
659			.ao_range_table = &range_bipolar10,
660			.ao_speed = 1000,
661			.num_p0_dio_channels = 8,
662			.reg_type = ni_reg_6711,
663			.caldac = {ad8804_debug},
664		},
665	{
666			.device_id = 0x1870,
667			.name = "pci-6713",
668			.n_adchan = 0,	/* no analog input */
669			.n_aochan = 8,
670			.aobits = 12,
671			.ao_unipolar = 0,
672			.ao_fifo_depth = 16384,
673			.ao_range_table = &range_bipolar10,
674			.ao_speed = 1000,
675			.num_p0_dio_channels = 8,
676			.reg_type = ni_reg_6713,
677			.caldac = {ad8804_debug, ad8804_debug},
678		},
679	{
680			.device_id = 0x2b80,
681			.name = "pxi-6713",
682			.n_adchan = 0,	/* no analog input */
683			.n_aochan = 8,
684			.aobits = 12,
685			.ao_unipolar = 0,
686			.ao_fifo_depth = 16384,
687			.ao_range_table = &range_bipolar10,
688			.ao_speed = 1000,
689			.num_p0_dio_channels = 8,
690			.reg_type = ni_reg_6713,
691			.caldac = {ad8804_debug, ad8804_debug},
692		},
693	{
694			.device_id = 0x2430,
695			.name = "pci-6731",
696			.n_adchan = 0,	/* no analog input */
697			.n_aochan = 4,
698			.aobits = 16,
699			.ao_unipolar = 0,
700			.ao_fifo_depth = 8192,
701			.ao_range_table = &range_bipolar10,
702			.ao_speed = 1000,
703			.num_p0_dio_channels = 8,
704			.reg_type = ni_reg_6711,
705			.caldac = {ad8804_debug},
706		},
707#if 0				/* need device ids */
708	{
709			.device_id = 0x0,
710			.name = "pxi-6731",
711			.n_adchan = 0,	/* no analog input */
712			.n_aochan = 4,
713			.aobits = 16,
714			.ao_unipolar = 0,
715			.ao_fifo_depth = 8192,
716			.ao_range_table = &range_bipolar10,
717			.num_p0_dio_channels = 8,
718			.reg_type = ni_reg_6711,
719			.caldac = {ad8804_debug},
720		},
721#endif
722	{
723			.device_id = 0x2410,
724			.name = "pci-6733",
725			.n_adchan = 0,	/* no analog input */
726			.n_aochan = 8,
727			.aobits = 16,
728			.ao_unipolar = 0,
729			.ao_fifo_depth = 16384,
730			.ao_range_table = &range_bipolar10,
731			.ao_speed = 1000,
732			.num_p0_dio_channels = 8,
733			.reg_type = ni_reg_6713,
734			.caldac = {ad8804_debug, ad8804_debug},
735		},
736	{
737			.device_id = 0x2420,
738			.name = "pxi-6733",
739			.n_adchan = 0,	/* no analog input */
740			.n_aochan = 8,
741			.aobits = 16,
742			.ao_unipolar = 0,
743			.ao_fifo_depth = 16384,
744			.ao_range_table = &range_bipolar10,
745			.ao_speed = 1000,
746			.num_p0_dio_channels = 8,
747			.reg_type = ni_reg_6713,
748			.caldac = {ad8804_debug, ad8804_debug},
749		},
750	{
751			.device_id = 0x15b0,
752			.name = "pxi-6071e",
753			.n_adchan = 64,
754			.adbits = 12,
755			.ai_fifo_depth = 512,
756			.alwaysdither = 1,
757			.gainlkup = ai_gain_16,
758			.ai_speed = 800,
759			.n_aochan = 2,
760			.aobits = 12,
761			.ao_fifo_depth = 2048,
762			.ao_range_table = &range_ni_E_ao_ext,
763			.ao_unipolar = 1,
764			.ao_speed = 1000,
765			.num_p0_dio_channels = 8,
766			.caldac = {ad8804_debug},
767			.has_8255 = 0,
768		},
769	{
770			.device_id = 0x11b0,
771			.name = "pxi-6070e",
772			.n_adchan = 16,
773			.adbits = 12,
774			.ai_fifo_depth = 512,
775			.alwaysdither = 1,
776			.gainlkup = ai_gain_16,
777			.ai_speed = 800,
778			.n_aochan = 2,
779			.aobits = 12,
780			.ao_fifo_depth = 2048,
781			.ao_range_table = &range_ni_E_ao_ext,
782			.ao_unipolar = 1,
783			.ao_speed = 1000,
784			.num_p0_dio_channels = 8,
785			.caldac = {ad8804_debug},
786			.has_8255 = 0,
787		},
788	{
789			.device_id = 0x18c0,
790			.name = "pxi-6052e",
791			.n_adchan = 16,
792			.adbits = 16,
793			.ai_fifo_depth = 512,
794			.alwaysdither = 1,
795			.gainlkup = ai_gain_16,
796			.ai_speed = 3000,
797			.n_aochan = 2,
798			.aobits = 16,
799			.ao_unipolar = 1,
800			.ao_fifo_depth = 2048,
801			.ao_range_table = &range_ni_E_ao_ext,
802			.ao_speed = 3000,
803			.num_p0_dio_channels = 8,
804			.caldac = {mb88341, mb88341, ad8522},
805		},
806	{
807			.device_id = 0x1580,
808			.name = "pxi-6031e",
809			.n_adchan = 64,
810			.adbits = 16,
811			.ai_fifo_depth = 512,
812			.alwaysdither = 1,
813			.gainlkup = ai_gain_14,
814			.ai_speed = 10000,
815			.n_aochan = 2,
816			.aobits = 16,
817			.ao_fifo_depth = 2048,
818			.ao_range_table = &range_ni_E_ao_ext,
819			.ao_unipolar = 1,
820			.ao_speed = 10000,
821			.num_p0_dio_channels = 8,
822			.caldac = {dac8800, dac8043, ad8522},
823		},
824	{
825			.device_id = 0x2890,
826			.name = "pci-6036e",
827			.n_adchan = 16,
828			.adbits = 16,
829			.ai_fifo_depth = 512,
830			.alwaysdither = 1,
831			.gainlkup = ai_gain_4,
832			.ai_speed = 5000,
833			.n_aochan = 2,
834			.aobits = 16,
835			.ao_fifo_depth = 0,
836			.ao_range_table = &range_bipolar10,
837			.ao_unipolar = 0,
838			.ao_speed = 100000,
839			.num_p0_dio_channels = 8,
840			.caldac = {ad8804_debug},
841			.has_8255 = 0,
842		},
843	{
844			.device_id = 0x70b0,
845			.name = "pci-6220",
846			.n_adchan = 16,
847			.adbits = 16,
848			.ai_fifo_depth = 512,
849			//FIXME:  guess
850			.gainlkup = ai_gain_622x,
851			.ai_speed = 4000,
852			.n_aochan = 0,
853			.aobits = 0,
854			.ao_fifo_depth = 0,
855			.num_p0_dio_channels = 8,
856			.reg_type = ni_reg_622x,
857			.ao_unipolar = 0,
858			.caldac = {caldac_none},
859			.has_8255 = 0,
860		},
861	{
862			.device_id = 0x70af,
863			.name = "pci-6221",
864			.n_adchan = 16,
865			.adbits = 16,
866			.ai_fifo_depth = 4095,
867			.gainlkup = ai_gain_622x,
868			.ai_speed = 4000,
869			.n_aochan = 2,
870			.aobits = 16,
871			.ao_fifo_depth = 8191,
872			.ao_range_table = &range_ni_M_622x_ao,
873			.reg_type = ni_reg_622x,
874			.ao_unipolar = 0,
875			.ao_speed = 1200,
876			.num_p0_dio_channels = 8,
877			.caldac = {caldac_none},
878			.has_8255 = 0,
879		},
880	{
881			.device_id = 0x71bc,
882			.name = "pci-6221_37pin",
883			.n_adchan = 16,
884			.adbits = 16,
885			.ai_fifo_depth = 4095,
886			.gainlkup = ai_gain_622x,
887			.ai_speed = 4000,
888			.n_aochan = 2,
889			.aobits = 16,
890			.ao_fifo_depth = 8191,
891			.ao_range_table = &range_ni_M_622x_ao,
892			.reg_type = ni_reg_622x,
893			.ao_unipolar = 0,
894			.ao_speed = 1200,
895			.num_p0_dio_channels = 8,
896			.caldac = {caldac_none},
897			.has_8255 = 0,
898		},
899	{
900			.device_id = 0x70f2,
901			.name = "pci-6224",
902			.n_adchan = 32,
903			.adbits = 16,
904			.ai_fifo_depth = 4095,
905			.gainlkup = ai_gain_622x,
906			.ai_speed = 4000,
907			.n_aochan = 0,
908			.aobits = 0,
909			.ao_fifo_depth = 0,
910			.reg_type = ni_reg_622x,
911			.ao_unipolar = 0,
912			.num_p0_dio_channels = 32,
913			.caldac = {caldac_none},
914			.has_8255 = 0,
915		},
916	{
917			.device_id = 0x716c,
918			.name = "pci-6225",
919			.n_adchan = 80,
920			.adbits = 16,
921			.ai_fifo_depth = 4095,
922			.gainlkup = ai_gain_622x,
923			.ai_speed = 4000,
924			.n_aochan = 2,
925			.aobits = 16,
926			.ao_fifo_depth = 8191,
927			.ao_range_table = &range_ni_M_622x_ao,
928			.reg_type = ni_reg_622x,
929			.ao_unipolar = 0,
930			.ao_speed = 1200,
931			.num_p0_dio_channels = 32,
932			.caldac = {caldac_none},
933			.has_8255 = 0,
934		},
935	{
936			.device_id = 0x70aa,
937			.name = "pci-6229",
938			.n_adchan = 32,
939			.adbits = 16,
940			.ai_fifo_depth = 4095,
941			.gainlkup = ai_gain_622x,
942			.ai_speed = 4000,
943			.n_aochan = 4,
944			.aobits = 16,
945			.ao_fifo_depth = 8191,
946			.ao_range_table = &range_ni_M_622x_ao,
947			.reg_type = ni_reg_622x,
948			.ao_unipolar = 0,
949			.ao_speed = 1200,
950			.num_p0_dio_channels = 32,
951			.caldac = {caldac_none},
952			.has_8255 = 0,
953		},
954	{
955			.device_id = 0x70b4,
956			.name = "pci-6250",
957			.n_adchan = 16,
958			.adbits = 16,
959			.ai_fifo_depth = 4095,
960			.gainlkup = ai_gain_628x,
961			.ai_speed = 800,
962			.n_aochan = 0,
963			.aobits = 0,
964			.ao_fifo_depth = 0,
965			.reg_type = ni_reg_625x,
966			.ao_unipolar = 0,
967			.num_p0_dio_channels = 8,
968			.caldac = {caldac_none},
969			.has_8255 = 0,
970		},
971	{
972			.device_id = 0x70b8,
973			.name = "pci-6251",
974			.n_adchan = 16,
975			.adbits = 16,
976			.ai_fifo_depth = 4095,
977			.gainlkup = ai_gain_628x,
978			.ai_speed = 800,
979			.n_aochan = 2,
980			.aobits = 16,
981			.ao_fifo_depth = 8191,
982			.ao_range_table = &range_ni_M_625x_ao,
983			.reg_type = ni_reg_625x,
984			.ao_unipolar = 0,
985			.ao_speed = 357,
986			.num_p0_dio_channels = 8,
987			.caldac = {caldac_none},
988			.has_8255 = 0,
989		},
990	{
991			.device_id = 0x717d,
992			.name = "pcie-6251",
993			.n_adchan = 16,
994			.adbits = 16,
995			.ai_fifo_depth = 4095,
996			.gainlkup = ai_gain_628x,
997			.ai_speed = 800,
998			.n_aochan = 2,
999			.aobits = 16,
1000			.ao_fifo_depth = 8191,
1001			.ao_range_table = &range_ni_M_625x_ao,
1002			.reg_type = ni_reg_625x,
1003			.ao_unipolar = 0,
1004			.ao_speed = 357,
1005			.num_p0_dio_channels = 8,
1006			.caldac = {caldac_none},
1007			.has_8255 = 0,
1008		},
1009	{
1010			.device_id = 0x70b7,
1011			.name = "pci-6254",
1012			.n_adchan = 32,
1013			.adbits = 16,
1014			.ai_fifo_depth = 4095,
1015			.gainlkup = ai_gain_628x,
1016			.ai_speed = 800,
1017			.n_aochan = 0,
1018			.aobits = 0,
1019			.ao_fifo_depth = 0,
1020			.reg_type = ni_reg_625x,
1021			.ao_unipolar = 0,
1022			.num_p0_dio_channels = 32,
1023			.caldac = {caldac_none},
1024			.has_8255 = 0,
1025		},
1026	{
1027			.device_id = 0x70ab,
1028			.name = "pci-6259",
1029			.n_adchan = 32,
1030			.adbits = 16,
1031			.ai_fifo_depth = 4095,
1032			.gainlkup = ai_gain_628x,
1033			.ai_speed = 800,
1034			.n_aochan = 4,
1035			.aobits = 16,
1036			.ao_fifo_depth = 8191,
1037			.ao_range_table = &range_ni_M_625x_ao,
1038			.reg_type = ni_reg_625x,
1039			.ao_unipolar = 0,
1040			.ao_speed = 357,
1041			.num_p0_dio_channels = 32,
1042			.caldac = {caldac_none},
1043			.has_8255 = 0,
1044		},
1045	{
1046			.device_id = 0x717f,
1047			.name = "pcie-6259",
1048			.n_adchan = 32,
1049			.adbits = 16,
1050			.ai_fifo_depth = 4095,
1051			.gainlkup = ai_gain_628x,
1052			.ai_speed = 800,
1053			.n_aochan = 4,
1054			.aobits = 16,
1055			.ao_fifo_depth = 8191,
1056			.ao_range_table = &range_ni_M_625x_ao,
1057			.reg_type = ni_reg_625x,
1058			.ao_unipolar = 0,
1059			.ao_speed = 357,
1060			.num_p0_dio_channels = 32,
1061			.caldac = {caldac_none},
1062			.has_8255 = 0,
1063		},
1064	{
1065			.device_id = 0x70b6,
1066			.name = "pci-6280",
1067			.n_adchan = 16,
1068			.adbits = 18,
1069			.ai_fifo_depth = 2047,
1070			.gainlkup = ai_gain_628x,
1071			.ai_speed = 1600,
1072			.n_aochan = 0,
1073			.aobits = 0,
1074			.ao_fifo_depth = 8191,
1075			.reg_type = ni_reg_628x,
1076			.ao_unipolar = 0,
1077			.num_p0_dio_channels = 8,
1078			.caldac = {caldac_none},
1079			.has_8255 = 0,
1080		},
1081	{
1082			.device_id = 0x70bd,
1083			.name = "pci-6281",
1084			.n_adchan = 16,
1085			.adbits = 18,
1086			.ai_fifo_depth = 2047,
1087			.gainlkup = ai_gain_628x,
1088			.ai_speed = 1600,
1089			.n_aochan = 2,
1090			.aobits = 16,
1091			.ao_fifo_depth = 8191,
1092			.ao_range_table = &range_ni_M_628x_ao,
1093			.reg_type = ni_reg_628x,
1094			.ao_unipolar = 1,
1095			.ao_speed = 357,
1096			.num_p0_dio_channels = 8,
1097			.caldac = {caldac_none},
1098			.has_8255 = 0,
1099		},
1100	{
1101			.device_id = 0x70bf,
1102			.name = "pxi-6281",
1103			.n_adchan = 16,
1104			.adbits = 18,
1105			.ai_fifo_depth = 2047,
1106			.gainlkup = ai_gain_628x,
1107			.ai_speed = 1600,
1108			.n_aochan = 2,
1109			.aobits = 16,
1110			.ao_fifo_depth = 8191,
1111			.ao_range_table = &range_ni_M_628x_ao,
1112			.reg_type = ni_reg_628x,
1113			.ao_unipolar = 1,
1114			.ao_speed = 357,
1115			.num_p0_dio_channels = 8,
1116			.caldac = {caldac_none},
1117			.has_8255 = 0,
1118		},
1119	{
1120			.device_id = 0x70bc,
1121			.name = "pci-6284",
1122			.n_adchan = 32,
1123			.adbits = 18,
1124			.ai_fifo_depth = 2047,
1125			.gainlkup = ai_gain_628x,
1126			.ai_speed = 1600,
1127			.n_aochan = 0,
1128			.aobits = 0,
1129			.ao_fifo_depth = 0,
1130			.reg_type = ni_reg_628x,
1131			.ao_unipolar = 0,
1132			.num_p0_dio_channels = 32,
1133			.caldac = {caldac_none},
1134			.has_8255 = 0,
1135		},
1136	{
1137			.device_id = 0x70ac,
1138			.name = "pci-6289",
1139			.n_adchan = 32,
1140			.adbits = 18,
1141			.ai_fifo_depth = 2047,
1142			.gainlkup = ai_gain_628x,
1143			.ai_speed = 1600,
1144			.n_aochan = 4,
1145			.aobits = 16,
1146			.ao_fifo_depth = 8191,
1147			.ao_range_table = &range_ni_M_628x_ao,
1148			.reg_type = ni_reg_628x,
1149			.ao_unipolar = 1,
1150			.ao_speed = 357,
1151			.num_p0_dio_channels = 32,
1152			.caldac = {caldac_none},
1153			.has_8255 = 0,
1154		},
1155	{
1156			.device_id = 0x70C0,
1157			.name = "pci-6143",
1158			.n_adchan = 8,
1159			.adbits = 16,
1160			.ai_fifo_depth = 1024,
1161			.alwaysdither = 0,
1162			.gainlkup = ai_gain_6143,
1163			.ai_speed = 4000,
1164			.n_aochan = 0,
1165			.aobits = 0,
1166			.reg_type = ni_reg_6143,
1167			.ao_unipolar = 0,
1168			.ao_fifo_depth = 0,
1169			.num_p0_dio_channels = 8,
1170			.caldac = {ad8804_debug, ad8804_debug},
1171		},
1172	{
1173			.device_id = 0x710D,
1174			.name = "pxi-6143",
1175			.n_adchan = 8,
1176			.adbits = 16,
1177			.ai_fifo_depth = 1024,
1178			.alwaysdither = 0,
1179			.gainlkup = ai_gain_6143,
1180			.ai_speed = 4000,
1181			.n_aochan = 0,
1182			.aobits = 0,
1183			.reg_type = ni_reg_6143,
1184			.ao_unipolar = 0,
1185			.ao_fifo_depth = 0,
1186			.num_p0_dio_channels = 8,
1187			.caldac = {ad8804_debug, ad8804_debug},
1188		},
1189};
1190
1191#define n_pcimio_boards ((sizeof(ni_boards)/sizeof(ni_boards[0])))
1192
1193static int pcimio_attach(comedi_device * dev, comedi_devconfig * it);
1194static int pcimio_detach(comedi_device * dev);
1195static comedi_driver driver_pcimio = {
1196	driver_name: DRV_NAME,
1197	module:THIS_MODULE,
1198	attach:pcimio_attach,
1199	detach:pcimio_detach,
1200};
1201
1202COMEDI_PCI_INITCLEANUP(driver_pcimio, ni_pci_table)
1203
1204typedef struct {
1205NI_PRIVATE_COMMON} ni_private;
1206#define devpriv ((ni_private *)dev->private)
1207
1208/* How we access registers */
1209
1210#define ni_writel(a,b)	(writel((a), devpriv->mite->daq_io_addr + (b)))
1211#define ni_readl(a)	(readl(devpriv->mite->daq_io_addr + (a)))
1212#define ni_writew(a,b)	(writew((a), devpriv->mite->daq_io_addr + (b)))
1213#define ni_readw(a)	(readw(devpriv->mite->daq_io_addr + (a)))
1214#define ni_writeb(a,b)	(writeb((a), devpriv->mite->daq_io_addr + (b)))
1215#define ni_readb(a)	(readb(devpriv->mite->daq_io_addr + (a)))
1216
1217/* How we access STC registers */
1218
1219/* We automatically take advantage of STC registers that can be
1220 * read/written directly in the I/O space of the board.  Most
1221 * PCIMIO devices map the low 8 STC registers to iobase+addr*2.
1222 * The 611x devices map the write registers to iobase+addr*2, and
1223 * the read registers to iobase+(addr-1)*2. */
1224/* However, the 611x boards still aren't working, so I'm disabling
1225 * non-windowed STC access temporarily */
1226
1227static void e_series_win_out(comedi_device * dev, uint16_t data, int reg)
1228{
1229	unsigned long flags;
1230
1231	comedi_spin_lock_irqsave(&devpriv->window_lock, flags);
1232	ni_writew(reg, Window_Address);
1233	ni_writew(data, Window_Data);
1234	comedi_spin_unlock_irqrestore(&devpriv->window_lock, flags);
1235}
1236
1237static uint16_t e_series_win_in(comedi_device * dev, int reg)
1238{
1239	unsigned long flags;
1240	uint16_t ret;
1241
1242	comedi_spin_lock_irqsave(&devpriv->window_lock, flags);
1243	ni_writew(reg, Window_Address);
1244	ret = ni_readw(Window_Data);
1245	comedi_spin_unlock_irqrestore(&devpriv->window_lock, flags);
1246
1247	return ret;
1248}
1249
1250static void m_series_stc_writew(comedi_device * dev, uint16_t data, int reg)
1251{
1252	unsigned offset;
1253	switch (reg) {
1254	case ADC_FIFO_Clear:
1255		offset = M_Offset_AI_FIFO_Clear;
1256		break;
1257	case AI_Command_1_Register:
1258		offset = M_Offset_AI_Command_1;
1259		break;
1260	case AI_Command_2_Register:
1261		offset = M_Offset_AI_Command_2;
1262		break;
1263	case AI_Mode_1_Register:
1264		offset = M_Offset_AI_Mode_1;
1265		break;
1266	case AI_Mode_2_Register:
1267		offset = M_Offset_AI_Mode_2;
1268		break;
1269	case AI_Mode_3_Register:
1270		offset = M_Offset_AI_Mode_3;
1271		break;
1272	case AI_Output_Control_Register:
1273		offset = M_Offset_AI_Output_Control;
1274		break;
1275	case AI_Personal_Register:
1276		offset = M_Offset_AI_Personal;
1277		break;
1278	case AI_SI2_Load_A_Register:
1279		// this is actually a 32 bit register on m series boards
1280		ni_writel(data, M_Offset_AI_SI2_Load_A);
1281		return;
1282		break;
1283	case AI_SI2_Load_B_Register:
1284		// this is actually a 32 bit register on m series boards
1285		ni_writel(data, M_Offset_AI_SI2_Load_B);
1286		return;
1287		break;
1288	case AI_START_STOP_Select_Register:
1289		offset = M_Offset_AI_START_STOP_Select;
1290		break;
1291	case AI_Trigger_Select_Register:
1292		offset = M_Offset_AI_Trigger_Select;
1293		break;
1294	case Analog_Trigger_Etc_Register:
1295		offset = M_Offset_Analog_Trigger_Etc;
1296		break;
1297	case AO_Command_1_Register:
1298		offset = M_Offset_AO_Command_1;
1299		break;
1300	case AO_Command_2_Register:
1301		offset = M_Offset_AO_Command_2;
1302		break;
1303	case AO_Mode_1_Register:
1304		offset = M_Offset_AO_Mode_1;
1305		break;
1306	case AO_Mode_2_Register:
1307		offset = M_Offset_AO_Mode_2;
1308		break;
1309	case AO_Mode_3_Register:
1310		offset = M_Offset_AO_Mode_3;
1311		break;
1312	case AO_Output_Control_Register:
1313		offset = M_Offset_AO_Output_Control;
1314		break;
1315	case AO_Personal_Register:
1316		offset = M_Offset_AO_Personal;
1317		break;
1318	case AO_Start_Select_Register:
1319		offset = M_Offset_AO_Start_Select;
1320		break;
1321	case AO_Trigger_Select_Register:
1322		offset = M_Offset_AO_Trigger_Select;
1323		break;
1324	case Clock_and_FOUT_Register:
1325		offset = M_Offset_Clock_and_FOUT;
1326		break;
1327	case Configuration_Memory_Clear:
1328		offset = M_Offset_Configuration_Memory_Clear;
1329		break;
1330	case DAC_FIFO_Clear:
1331		offset = M_Offset_AO_FIFO_Clear;
1332		break;
1333	case DIO_Control_Register:
1334		rt_printk
1335			("%s: FIXME: register 0x%x does not map cleanly on to m-series boards.\n",
1336			__FUNCTION__, reg);
1337		return;
1338		break;
1339	case G_Autoincrement_Register(0):
1340		offset = M_Offset_G0_Autoincrement;
1341		break;
1342	case G_Autoincrement_Register(1):
1343		offset = M_Offset_G1_Autoincrement;
1344		break;
1345	case G_Command_Register(0):
1346		offset = M_Offset_G0_Command;
1347		break;
1348	case G_Command_Register(1):
1349		offset = M_Offset_G1_Command;
1350		break;
1351	case G_Input_Select_Register(0):
1352		offset = M_Offset_G0_Input_Select;
1353		break;
1354	case G_Input_Select_Register(1):
1355		offset = M_Offset_G1_Input_Select;
1356		break;
1357	case G_Mode_Register(0):
1358		offset = M_Offset_G0_Mode;
1359		break;
1360	case G_Mode_Register(1):
1361		offset = M_Offset_G1_Mode;
1362		break;
1363	case Interrupt_A_Ack_Register:
1364		offset = M_Offset_Interrupt_A_Ack;
1365		break;
1366	case Interrupt_A_Enable_Register:
1367		offset = M_Offset_Interrupt_A_Enable;
1368		break;
1369	case Interrupt_B_Ack_Register:
1370		offset = M_Offset_Interrupt_B_Ack;
1371		break;
1372	case Interrupt_B_Enable_Register:
1373		offset = M_Offset_Interrupt_B_Enable;
1374		break;
1375	case Interrupt_Control_Register:
1376		offset = M_Offset_Interrupt_Control;
1377		break;
1378	case IO_Bidirection_Pin_Register:
1379		offset = M_Offset_IO_Bidirection_Pin;
1380		break;
1381	case Joint_Reset_Register:
1382		offset = M_Offset_Joint_Reset;
1383		break;
1384	case RTSI_Trig_A_Output_Register:
1385		offset = M_Offset_RTSI_Trig_A_Output;
1386		break;
1387	case RTSI_Trig_B_Output_Register:
1388		offset = M_Offset_RTSI_Trig_B_Output;
1389		break;
1390	case RTSI_Trig_Direction_Register:
1391		offset = M_Offset_RTSI_Trig_Direction;
1392		break;
1393		/* FIXME: DIO_Output_Register (16 bit reg) is replaced by M_Offset_Static_Digital_Output (32 bit)
1394		   and M_Offset_SCXI_Serial_Data_Out (8 bit) */
1395	default:
1396		rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1397			__FUNCTION__, reg);
1398		BUG();
1399		return;
1400		break;
1401	}
1402	ni_writew(data, offset);
1403}
1404
1405static uint16_t m_series_stc_readw(comedi_device * dev, int reg)
1406{
1407	unsigned offset;
1408	switch (reg) {
1409	case AI_Status_1_Register:
1410		offset = M_Offset_AI_Status_1;
1411		break;
1412	case AO_Status_1_Register:
1413		offset = M_Offset_AO_Status_1;
1414		break;
1415	case AO_Status_2_Register:
1416		offset = M_Offset_AO_Status_2;
1417		break;
1418	case DIO_Serial_Input_Register:
1419		return ni_readb(M_Offset_SCXI_Serial_Data_In);
1420		break;
1421	case Joint_Status_1_Register:
1422		offset = M_Offset_Joint_Status_1;
1423		break;
1424	case Joint_Status_2_Register:
1425		offset = M_Offset_Joint_Status_2;
1426		break;
1427	case G_Status_Register:
1428		offset = M_Offset_G01_Status;
1429		break;
1430	default:
1431		rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1432			__FUNCTION__, reg);
1433		BUG();
1434		return 0;
1435		break;
1436	}
1437	return ni_readw(offset);
1438}
1439
1440static void m_series_stc_writel(comedi_device * dev, uint32_t data, int reg)
1441{
1442	unsigned offset;
1443	switch (reg) {
1444	case AI_SC_Load_A_Registers:
1445		offset = M_Offset_AI_SC_Load_A;
1446		break;
1447	case AI_SI_Load_A_Registers:
1448		offset = M_Offset_AI_SI_Load_A;
1449		break;
1450	case AO_BC_Load_A_Register:
1451		offset = M_Offset_AO_BC_Load_A;
1452		break;
1453	case AO_UC_Load_A_Register:
1454		offset = M_Offset_AO_UC_Load_A;
1455		break;
1456	case AO_UI_Load_A_Register:
1457		offset = M_Offset_AO_UI_Load_A;
1458		break;
1459	case G_Load_A_Register(0):
1460		offset = M_Offset_G0_Load_A;
1461		break;
1462	case G_Load_A_Register(1):
1463		offset = M_Offset_G1_Load_A;
1464		break;
1465	case G_Load_B_Register(0):
1466		offset = M_Offset_G0_Load_B;
1467		break;
1468	case G_Load_B_Register(1):
1469		offset = M_Offset_G1_Load_B;
1470		break;
1471	default:
1472		rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1473			__FUNCTION__, reg);
1474		BUG();
1475		return;
1476		break;
1477	}
1478	ni_writel(data, offset);
1479}
1480
1481static uint32_t m_series_stc_readl(comedi_device * dev, int reg)
1482{
1483	unsigned offset;
1484	switch (reg) {
1485	case G_HW_Save_Register(0):
1486		offset = M_Offset_G0_HW_Save;
1487		break;
1488	case G_HW_Save_Register(1):
1489		offset = M_Offset_G1_HW_Save;
1490		break;
1491	case G_Save_Register(0):
1492		offset = M_Offset_G0_Save;
1493		break;
1494	case G_Save_Register(1):
1495		offset = M_Offset_G1_Save;
1496		break;
1497	default:
1498		rt_printk("%s: bug! unhandled register=0x%x in switch.\n",
1499			__FUNCTION__, reg);
1500		BUG();
1501		return 0;
1502		break;
1503	}
1504	return ni_readl(offset);
1505}
1506
1507#define interrupt_pin(a)	0
1508#define IRQ_POLARITY 1
1509
1510#define NI_E_IRQ_FLAGS		IRQF_SHARED
1511
1512#include "ni_mio_common.c"
1513
1514static int pcimio_find_device(comedi_device * dev, int bus, int slot);
1515static int pcimio_ai_change(comedi_device * dev, comedi_subdevice * s,
1516	unsigned long new_size);
1517static int pcimio_ao_change(comedi_device * dev, comedi_subdevice * s,
1518	unsigned long new_size);
1519static int pcimio_gpct0_change(comedi_device * dev, comedi_subdevice * s,
1520	unsigned long new_size);
1521static int pcimio_gpct1_change(comedi_device * dev, comedi_subdevice * s,
1522	unsigned long new_size);
1523static int pcimio_dio_change(comedi_device * dev, comedi_subdevice * s,
1524	unsigned long new_size);
1525
1526static void m_series_init_eeprom_buffer(comedi_device * dev)
1527{
1528	static const int Start_Cal_EEPROM = 0x400;
1529	static const unsigned window_size = 10;
1530	static const int serial_number_eeprom_offset = 0x4;
1531	static const int serial_number_eeprom_length = 0x4;
1532	unsigned old_iodwbsr_bits;
1533	unsigned old_iodwbsr1_bits;
1534	unsigned old_iodwcr1_bits;
1535	int i;
1536
1537	old_iodwbsr_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR);
1538	old_iodwbsr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1539	old_iodwcr1_bits = readl(devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1540	writel(0x0, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1541	writel(((0x80 | window_size) | devpriv->mite->daq_phys_addr),
1542		devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1543	writel(0x1 | old_iodwcr1_bits, devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1544	writel(0xf, devpriv->mite->mite_io_addr + 0x30);
1545
1546	BUG_ON(serial_number_eeprom_length > sizeof(devpriv->serial_number));
1547	for (i = 0; i < serial_number_eeprom_length; ++i) {
1548		char *byte_ptr = (char*)&devpriv->serial_number + i;
1549		*byte_ptr = ni_readb(serial_number_eeprom_offset + i);
1550	}
1551	devpriv->serial_number = be32_to_cpu(devpriv->serial_number);
1552
1553	for (i = 0; i < M_SERIES_EEPROM_SIZE; ++i) {
1554		devpriv->eeprom_buffer[i] = ni_readb(Start_Cal_EEPROM + i);
1555	}
1556
1557	writel(old_iodwbsr1_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR_1);
1558	writel(old_iodwbsr_bits, devpriv->mite->mite_io_addr + MITE_IODWBSR);
1559	writel(old_iodwcr1_bits, devpriv->mite->mite_io_addr + MITE_IODWCR_1);
1560	writel(0x0, devpriv->mite->mite_io_addr + 0x30);
1561}
1562
1563static void init_6143(comedi_device * dev)
1564{
1565	// Disable interrupts
1566	devpriv->stc_writew(dev, 0, Interrupt_Control_Register);
1567
1568	// Initialise 6143 AI specific bits
1569	ni_writeb(0x00, Magic_6143);	// Set G0,G1 DMA mode to E series version
1570	ni_writeb(0x80, PipelineDelay_6143);	// Set EOCMode, ADCMode and pipelinedelay
1571	ni_writeb(0x00, EOC_Set_6143);	// Set EOC Delay
1572
1573	ni_writel(boardtype.ai_fifo_depth / 2, AIFIFO_Flag_6143);	// Set the FIFO half full level
1574
1575	// Strobe Relay disable bit
1576	devpriv->ai_calib_source_enabled = 0;
1577	ni_writew(devpriv->ai_calib_source | Calibration_Channel_6143_RelayOff,
1578		Calibration_Channel_6143);
1579	ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1580}
1581
1582/* cleans up allocated resources */
1583static int pcimio_detach(comedi_device * dev)
1584{
1585	mio_common_detach(dev);
1586	if (dev->irq) {
1587		comedi_free_irq(dev->irq, dev);
1588	}
1589	if (dev->private) {
1590		mite_free_ring(devpriv->ai_mite_ring);
1591		mite_free_ring(devpriv->ao_mite_ring);
1592		mite_free_ring(devpriv->cdo_mite_ring);
1593		mite_free_ring(devpriv->gpct_mite_ring[0]);
1594		mite_free_ring(devpriv->gpct_mite_ring[1]);
1595		if (devpriv->mite)
1596			mite_unsetup(devpriv->mite);
1597	}
1598
1599	return 0;
1600}
1601
1602static int pcimio_attach(comedi_device * dev, comedi_devconfig * it)
1603{
1604	int ret;
1605
1606	printk("comedi%d: ni_pcimio:", dev->minor);
1607
1608	ret = ni_alloc_private(dev);
1609	if (ret < 0)
1610		return ret;
1611
1612	ret = pcimio_find_device(dev, it->options[0], it->options[1]);
1613	if (ret < 0)
1614		return ret;
1615
1616	printk(" %s", boardtype.name);
1617	dev->board_name = boardtype.name;
1618
1619	if (boardtype.reg_type & ni_reg_m_series_mask) {
1620		devpriv->stc_writew = &m_series_stc_writew;
1621		devpriv->stc_readw = &m_series_stc_readw;
1622		devpriv->stc_writel = &m_series_stc_writel;
1623		devpriv->stc_readl = &m_series_stc_readl;
1624	} else {
1625		devpriv->stc_writew = &e_series_win_out;
1626		devpriv->stc_readw = &e_series_win_in;
1627		devpriv->stc_writel = &win_out2;
1628		devpriv->stc_readl = &win_in2;
1629	}
1630
1631	ret = mite_setup(devpriv->mite);
1632	if (ret < 0) {
1633		printk(" error setting up mite\n");
1634		return ret;
1635	}
1636	comedi_set_hw_dev(dev, &devpriv->mite->pcidev->dev);
1637	devpriv->ai_mite_ring = mite_alloc_ring(devpriv->mite);
1638	if (devpriv->ai_mite_ring == NULL)
1639		return -ENOMEM;
1640	devpriv->ao_mite_ring = mite_alloc_ring(devpriv->mite);
1641	if (devpriv->ao_mite_ring == NULL)
1642		return -ENOMEM;
1643	devpriv->cdo_mite_ring = mite_alloc_ring(devpriv->mite);
1644	if (devpriv->cdo_mite_ring == NULL)
1645		return -ENOMEM;
1646	devpriv->gpct_mite_ring[0] = mite_alloc_ring(devpriv->mite);
1647	if (devpriv->gpct_mite_ring[0] == NULL)
1648		return -ENOMEM;
1649	devpriv->gpct_mite_ring[1] = mite_alloc_ring(devpriv->mite);
1650	if (devpriv->gpct_mite_ring[1] == NULL)
1651		return -ENOMEM;
1652
1653	if (boardtype.reg_type & ni_reg_m_series_mask)
1654		m_series_init_eeprom_buffer(dev);
1655	if (boardtype.reg_type == ni_reg_6143)
1656		init_6143(dev);
1657
1658	dev->irq = mite_irq(devpriv->mite);
1659
1660	if (dev->irq == 0) {
1661		printk(" unknown irq (bad)\n");
1662	} else {
1663		printk(" ( irq = %u )", dev->irq);
1664		if ((ret = comedi_request_irq(dev->irq, ni_E_interrupt,
1665					NI_E_IRQ_FLAGS, DRV_NAME,
1666					dev)) < 0) {
1667			printk(" irq not available\n");
1668			dev->irq = 0;
1669		}
1670	}
1671
1672	ret = ni_E_init(dev, it);
1673	if (ret < 0)
1674		return ret;
1675
1676	dev->subdevices[NI_AI_SUBDEV].buf_change = &pcimio_ai_change;
1677	dev->subdevices[NI_AO_SUBDEV].buf_change = &pcimio_ao_change;
1678	dev->subdevices[NI_GPCT_SUBDEV(0)].buf_change = &pcimio_gpct0_change;
1679	dev->subdevices[NI_GPCT_SUBDEV(1)].buf_change = &pcimio_gpct1_change;
1680	dev->subdevices[NI_DIO_SUBDEV].buf_change = &pcimio_dio_change;
1681
1682	return ret;
1683}
1684
1685static int pcimio_find_device(comedi_device * dev, int bus, int slot)
1686{
1687	struct mite_struct *mite;
1688	int i;
1689
1690	for (mite = mite_devices; mite; mite = mite->next) {
1691		if (mite->used)
1692			continue;
1693		if (bus || slot) {
1694			if (bus != mite->pcidev->bus->number ||
1695				slot != PCI_SLOT(mite->pcidev->devfn))
1696				continue;
1697		}
1698
1699		for (i = 0; i < n_pcimio_boards; i++) {
1700			if (mite_device_id(mite) == ni_boards[i].device_id) {
1701				dev->board_ptr = ni_boards + i;
1702				devpriv->mite = mite;
1703
1704				return 0;
1705			}
1706		}
1707	}
1708	printk("no device found\n");
1709	mite_list_devices();
1710	return -EIO;
1711}
1712
1713static int pcimio_ai_change(comedi_device * dev, comedi_subdevice * s,
1714	unsigned long new_size)
1715{
1716	int ret;
1717
1718	ret = mite_buf_change(devpriv->ai_mite_ring, s->async);
1719	if (ret < 0)
1720		return ret;
1721
1722	return 0;
1723}
1724
1725static int pcimio_ao_change(comedi_device * dev, comedi_subdevice * s,
1726	unsigned long new_size)
1727{
1728	int ret;
1729
1730	ret = mite_buf_change(devpriv->ao_mite_ring, s->async);
1731	if (ret < 0)
1732		return ret;
1733
1734	return 0;
1735}
1736
1737static int pcimio_gpct0_change(comedi_device * dev, comedi_subdevice * s,
1738	unsigned long new_size)
1739{
1740	int ret;
1741
1742	ret = mite_buf_change(devpriv->gpct_mite_ring[0], s->async);
1743	if (ret < 0)
1744		return ret;
1745
1746	return 0;
1747}
1748
1749static int pcimio_gpct1_change(comedi_device * dev, comedi_subdevice * s,
1750	unsigned long new_size)
1751{
1752	int ret;
1753
1754	ret = mite_buf_change(devpriv->gpct_mite_ring[1], s->async);
1755	if (ret < 0)
1756		return ret;
1757
1758	return 0;
1759}
1760
1761static int pcimio_dio_change(comedi_device * dev, comedi_subdevice * s,
1762	unsigned long new_size)
1763{
1764	int ret;
1765
1766	ret = mite_buf_change(devpriv->cdo_mite_ring, s->async);
1767	if (ret < 0)
1768		return ret;
1769
1770	return 0;
1771}
1772