2 comedi/drivers/cb_pcidas64.c
3 This is a driver for the ComputerBoards/MeasurementComputing PCI-DAS
4 64xx, 60xx, and 4020 cards.
6 Author: Frank Mori Hess <fmhess@users.sourceforge.net>
7 Copyright (C) 2001, 2002 Frank Mori Hess
9 Thanks also go to the following people:
11 Steve Rosenbluth, for providing the source code for
12 his pci-das6402 driver, and source code for working QNX pci-6402
13 drivers by Greg Laird and Mariusz Bogacz. None of the code was
14 used directly here, but it was useful as an additional source of
15 documentation on how to program the boards.
17 John Sims, for much testing and feedback on pcidas-4020 support.
19 COMEDI - Linux Control and Measurement Device Interface
20 Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
22 This program is free software; you can redistribute it and/or modify
23 it under the terms of the GNU General Public License as published by
24 the Free Software Foundation; either version 2 of the License, or
25 (at your option) any later version.
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
32 You should have received a copy of the GNU General Public License
33 along with this program; if not, write to the Free Software
34 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
36 ************************************************************************/
41 Description: MeasurementComputing PCI-DAS64xx, 60XX, and 4020 series with the PLX 9080 PCI controller
42 Author: Frank Mori Hess <fmhess@users.sourceforge.net>
45 Devices: [Measurement Computing] PCI-DAS6402/16 (cb_pcidas64),
46 PCI-DAS6402/12, PCI-DAS64/M1/16, PCI-DAS64/M2/16,
47 PCI-DAS64/M3/16, PCI-DAS6402/16/JR, PCI-DAS64/M1/16/JR,
48 PCI-DAS64/M2/16/JR, PCI-DAS64/M3/16/JR, PCI-DAS64/M1/14,
49 PCI-DAS64/M2/14, PCI-DAS64/M3/14, PCI-DAS6013, PCI-DAS6014,
50 PCI-DAS6023, PCI-DAS6025, PCI-DAS6030,
51 PCI-DAS6031, PCI-DAS6032, PCI-DAS6033, PCI-DAS6034,
52 PCI-DAS6035, PCI-DAS6036, PCI-DAS6040, PCI-DAS6052,
53 PCI-DAS6070, PCI-DAS6071, PCI-DAS4020/12
55 Configuration options:
56 [0] - PCI bus of device (optional)
57 [1] - PCI slot of device (optional)
59 These boards may be autocalibrated with the comedi_calibrate utility.
61 To select the bnc trigger input on the 4020 (instead of the dio input),
62 specify a nonzero channel in the chanspec. If you wish to use an external
63 master clock on the 4020, you may do so by setting the scan_begin_src
64 to TRIG_OTHER, and using an INSN_CONFIG_TIMER_1 configuration insn
65 to configure the divisor to use for the external clock.
67 Some devices are not identified because the PCI device IDs are not yet
68 known. If you have such a board, please file a bug report at
69 https://bugs.comedi.org.
76 make it return error if user attempts an ai command that uses the
77 external queue, and an ao command simultaneously
78 user counter subdevice
79 there are a number of boards this driver will support when they are
80 fully released, but does not yet since the pci device id numbers
81 are not yet available.
82 support prescaled 100khz clock for slow pacing (not available on 6000 series?)
83 make ao fifo size adjustable like ai fifo
86 #include "../comedidev.h"
87 #include <linux/delay.h>
88 #include <linux/interrupt.h>
89 #include <asm/system.h>
91 #include "comedi_pci.h"
95 #include "comedi_fc.h"
97 #undef PCIDAS64_DEBUG /* disable debugging code */
98 /* #define PCIDAS64_DEBUG enable debugging code */
100 #ifdef PCIDAS64_DEBUG
101 #define DEBUG_PRINT(format, args...) printk(format , ## args)
103 #define DEBUG_PRINT(format, args...)
106 #define TIMER_BASE 25 /* 40MHz master clock */
107 #define PRESCALED_TIMER_BASE 10000 /* 100kHz 'prescaled' clock for slow aquisition, maybe I'll support this someday */
108 #define DMA_BUFFER_SIZE 0x1000
110 /* maximum value that can be loaded into board's 24-bit counters*/
111 static const int max_counter_value = 0xffffff;
113 /* PCI-DAS64xxx base addresses */
115 /* indices of base address regions */
116 enum base_address_regions {
117 PLX9080_BADDRINDEX = 0,
119 DIO_COUNTER_BADDRINDEX = 3,
122 /* priv(dev)->main_iobase registers */
123 enum write_only_registers {
124 INTR_ENABLE_REG = 0x0, /* interrupt enable register */
125 HW_CONFIG_REG = 0x2, /* hardware config register */
127 DAQ_ATRIG_LOW_4020_REG = 0xc,
128 ADC_CONTROL0_REG = 0x10, /* adc control register 0 */
129 ADC_CONTROL1_REG = 0x12, /* adc control register 1 */
130 CALIBRATION_REG = 0x14,
131 ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16, /* lower 16 bits of adc sample interval counter */
132 ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18, /* upper 8 bits of adc sample interval counter */
133 ADC_DELAY_INTERVAL_LOWER_REG = 0x1a, /* lower 16 bits of delay interval counter */
134 ADC_DELAY_INTERVAL_UPPER_REG = 0x1c, /* upper 8 bits of delay interval counter */
135 ADC_COUNT_LOWER_REG = 0x1e, /* lower 16 bits of hardware conversion/scan counter */
136 ADC_COUNT_UPPER_REG = 0x20, /* upper 8 bits of hardware conversion/scan counter */
137 ADC_START_REG = 0x22, /* software trigger to start aquisition */
138 ADC_CONVERT_REG = 0x24, /* initiates single conversion */
139 ADC_QUEUE_CLEAR_REG = 0x26, /* clears adc queue */
140 ADC_QUEUE_LOAD_REG = 0x28, /* loads adc queue */
141 ADC_BUFFER_CLEAR_REG = 0x2a,
142 ADC_QUEUE_HIGH_REG = 0x2c, /* high channel for internal queue, use adc_chan_bits() inline above */
143 DAC_CONTROL0_REG = 0x50, /* dac control register 0 */
144 DAC_CONTROL1_REG = 0x52, /* dac control register 0 */
145 DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54, /* lower 16 bits of dac sample interval counter */
146 DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56, /* upper 8 bits of dac sample interval counter */
147 DAC_SELECT_REG = 0x60,
148 DAC_START_REG = 0x64,
149 DAC_BUFFER_CLEAR_REG = 0x66, /* clear dac buffer */
151 static inline unsigned int dac_convert_reg(unsigned int channel)
153 return 0x70 + (2 * (channel & 0x1));
156 static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
158 return 0x70 + (4 * (channel & 0x1));
161 static inline unsigned int dac_msb_4020_reg(unsigned int channel)
163 return 0x72 + (4 * (channel & 0x1));
166 enum read_only_registers {
167 HW_STATUS_REG = 0x0, /* hardware status register, reading this apparently clears pending interrupts as well */
168 PIPE1_READ_REG = 0x4,
169 ADC_READ_PNTR_REG = 0x8,
170 LOWER_XFER_REG = 0x10,
171 ADC_WRITE_PNTR_REG = 0xc,
175 enum read_write_registers {
176 I8255_4020_REG = 0x48, /* 8255 offset, for 4020 only */
177 ADC_QUEUE_FIFO_REG = 0x100, /* external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
178 ADC_FIFO_REG = 0x200, /* adc data fifo */
179 DAC_FIFO_REG = 0x300, /* dac data fifo, has weird interactions with external channel queue */
182 /* priv(dev)->dio_counter_iobase registers */
183 enum dio_counter_registers {
184 DIO_8255_OFFSET = 0x0,
187 DIO_DIRECTION_60XX_REG = 0x40,
188 DIO_DATA_60XX_REG = 0x48,
191 /* bit definitions for write-only registers */
193 enum intr_enable_contents {
194 ADC_INTR_SRC_MASK = 0x3, /* bits that set adc interrupt source */
195 ADC_INTR_QFULL_BITS = 0x0, /* interrupt fifo quater full */
196 ADC_INTR_EOC_BITS = 0x1, /* interrupt end of conversion */
197 ADC_INTR_EOSCAN_BITS = 0x2, /* interrupt end of scan */
198 ADC_INTR_EOSEQ_BITS = 0x3, /* interrupt end of sequence (probably wont use this it's pretty fancy) */
199 EN_ADC_INTR_SRC_BIT = 0x4, /* enable adc interrupt source */
200 EN_ADC_DONE_INTR_BIT = 0x8, /* enable adc aquisition done interrupt */
201 DAC_INTR_SRC_MASK = 0x30,
202 DAC_INTR_QEMPTY_BITS = 0x0,
203 DAC_INTR_HIGH_CHAN_BITS = 0x10,
204 EN_DAC_INTR_SRC_BIT = 0x40, /* enable dac interrupt source */
205 EN_DAC_DONE_INTR_BIT = 0x80,
206 EN_ADC_ACTIVE_INTR_BIT = 0x200, /* enable adc active interrupt */
207 EN_ADC_STOP_INTR_BIT = 0x400, /* enable adc stop trigger interrupt */
208 EN_DAC_ACTIVE_INTR_BIT = 0x800, /* enable dac active interrupt */
209 EN_DAC_UNDERRUN_BIT = 0x4000, /* enable dac underrun status bit */
210 EN_ADC_OVERRUN_BIT = 0x8000, /* enable adc overrun status bit */
213 enum hw_config_contents {
214 MASTER_CLOCK_4020_MASK = 0x3, /* bits that specify master clock source for 4020 */
215 INTERNAL_CLOCK_4020_BITS = 0x1, /* use 40 MHz internal master clock for 4020 */
216 BNC_CLOCK_4020_BITS = 0x2, /* use BNC input for master clock */
217 EXT_CLOCK_4020_BITS = 0x3, /* use dio input for master clock */
218 EXT_QUEUE_BIT = 0x200, /* use external channel/gain queue (more versatile than internal queue) */
219 SLOW_DAC_BIT = 0x400, /* use 225 nanosec strobe when loading dac instead of 50 nanosec */
220 HW_CONFIG_DUMMY_BITS = 0x2000, /* bit with unknown function yet given as default value in pci-das64 manual */
221 DMA_CH_SELECT_BIT = 0x8000, /* bit selects channels 1/0 for analog input/output, otherwise 0/1 */
222 FIFO_SIZE_REG = 0x4, /* allows adjustment of fifo sizes */
223 DAC_FIFO_SIZE_MASK = 0xff00, /* bits that set dac fifo size */
224 DAC_FIFO_BITS = 0xf800, /* 8k sample ao fifo */
226 #define DAC_FIFO_SIZE 0x2000
228 enum daq_atrig_low_4020_contents {
229 EXT_AGATE_BNC_BIT = 0x8000, /* use trig/ext clk bnc input for analog gate signal */
230 EXT_STOP_TRIG_BNC_BIT = 0x4000, /* use trig/ext clk bnc input for external stop trigger signal */
231 EXT_START_TRIG_BNC_BIT = 0x2000, /* use trig/ext clk bnc input for external start trigger signal */
233 static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
235 return threshold & 0xfff;
238 enum adc_control0_contents {
239 ADC_GATE_SRC_MASK = 0x3, /* bits that select gate */
240 ADC_SOFT_GATE_BITS = 0x1, /* software gate */
241 ADC_EXT_GATE_BITS = 0x2, /* external digital gate */
242 ADC_ANALOG_GATE_BITS = 0x3, /* analog level gate */
243 ADC_GATE_LEVEL_BIT = 0x4, /* level-sensitive gate (for digital) */
244 ADC_GATE_POLARITY_BIT = 0x8, /* gate active low */
245 ADC_START_TRIG_SOFT_BITS = 0x10,
246 ADC_START_TRIG_EXT_BITS = 0x20,
247 ADC_START_TRIG_ANALOG_BITS = 0x30,
248 ADC_START_TRIG_MASK = 0x30,
249 ADC_START_TRIG_FALLING_BIT = 0x40, /* trig 1 uses falling edge */
250 ADC_EXT_CONV_FALLING_BIT = 0x800, /* external pacing uses falling edge */
251 ADC_SAMPLE_COUNTER_EN_BIT = 0x1000, /* enable hardware scan counter */
252 ADC_DMA_DISABLE_BIT = 0x4000, /* disables dma */
253 ADC_ENABLE_BIT = 0x8000, /* master adc enable */
256 enum adc_control1_contents {
257 ADC_QUEUE_CONFIG_BIT = 0x1, /* should be set for boards with > 16 channels */
258 CONVERT_POLARITY_BIT = 0x10,
259 EOC_POLARITY_BIT = 0x20,
260 ADC_SW_GATE_BIT = 0x40, /* software gate of adc */
261 ADC_DITHER_BIT = 0x200, /* turn on extra noise for dithering */
262 RETRIGGER_BIT = 0x800,
263 ADC_LO_CHANNEL_4020_MASK = 0x300,
264 ADC_HI_CHANNEL_4020_MASK = 0xc00,
265 TWO_CHANNEL_4020_BITS = 0x1000, /* two channel mode for 4020 */
266 FOUR_CHANNEL_4020_BITS = 0x2000, /* four channel mode for 4020 */
267 CHANNEL_MODE_4020_MASK = 0x3000,
268 ADC_MODE_MASK = 0xf000,
270 static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel)
272 return (channel & 0x3) << 8;
275 static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel)
277 return (channel & 0x3) << 10;
280 static inline uint16_t adc_mode_bits(unsigned int mode)
282 return (mode & 0xf) << 12;
285 enum calibration_contents {
286 SELECT_8800_BIT = 0x1,
287 SELECT_8402_64XX_BIT = 0x2,
288 SELECT_1590_60XX_BIT = 0x2,
289 CAL_EN_64XX_BIT = 0x40, /* calibration enable for 64xx series */
290 SERIAL_DATA_IN_BIT = 0x80,
291 SERIAL_CLOCK_BIT = 0x100,
292 CAL_EN_60XX_BIT = 0x200, /* calibration enable for 60xx series */
293 CAL_GAIN_BIT = 0x800,
295 /* calibration sources for 6025 are:
305 static inline uint16_t adc_src_bits(unsigned int source)
307 return (source & 0xf) << 3;
310 static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
312 return (channel & 0x3) << 8;
315 enum adc_queue_load_contents {
316 UNIP_BIT = 0x800, /* unipolar/bipolar bit */
317 ADC_SE_DIFF_BIT = 0x1000, /* single-ended/ differential bit */
318 ADC_COMMON_BIT = 0x2000, /* non-referenced single-ended (common-mode input) */
319 QUEUE_EOSEQ_BIT = 0x4000, /* queue end of sequence */
320 QUEUE_EOSCAN_BIT = 0x8000, /* queue end of scan */
322 static inline uint16_t adc_chan_bits(unsigned int channel)
324 return channel & 0x3f;
327 enum dac_control0_contents {
328 DAC_ENABLE_BIT = 0x8000, /* dac controller enable bit */
329 DAC_CYCLIC_STOP_BIT = 0x4000,
330 DAC_WAVEFORM_MODE_BIT = 0x100,
331 DAC_EXT_UPDATE_FALLING_BIT = 0x80,
332 DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
333 WAVEFORM_TRIG_MASK = 0x30,
334 WAVEFORM_TRIG_DISABLED_BITS = 0x0,
335 WAVEFORM_TRIG_SOFT_BITS = 0x10,
336 WAVEFORM_TRIG_EXT_BITS = 0x20,
337 WAVEFORM_TRIG_ADC1_BITS = 0x30,
338 WAVEFORM_TRIG_FALLING_BIT = 0x8,
339 WAVEFORM_GATE_LEVEL_BIT = 0x4,
340 WAVEFORM_GATE_ENABLE_BIT = 0x2,
341 WAVEFORM_GATE_SELECT_BIT = 0x1,
344 enum dac_control1_contents {
345 DAC_WRITE_POLARITY_BIT = 0x800, /* board-dependent setting */
346 DAC1_EXT_REF_BIT = 0x200,
347 DAC0_EXT_REF_BIT = 0x100,
348 DAC_OUTPUT_ENABLE_BIT = 0x80, /* dac output enable bit */
349 DAC_UPDATE_POLARITY_BIT = 0x40, /* board-dependent setting */
350 DAC_SW_GATE_BIT = 0x20,
351 DAC1_UNIPOLAR_BIT = 0x8,
352 DAC0_UNIPOLAR_BIT = 0x2,
355 /* bit definitions for read-only registers */
356 enum hw_status_contents {
357 DAC_UNDERRUN_BIT = 0x1,
358 ADC_OVERRUN_BIT = 0x2,
359 DAC_ACTIVE_BIT = 0x4,
360 ADC_ACTIVE_BIT = 0x8,
361 DAC_INTR_PENDING_BIT = 0x10,
362 ADC_INTR_PENDING_BIT = 0x20,
365 EXT_INTR_PENDING_BIT = 0x100,
366 ADC_STOP_BIT = 0x200,
368 static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
370 return (hw_status_bits >> 10) & 0x3;
373 static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
375 return (prepost_bits >> 6) & 0x3;
378 static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
380 return (prepost_bits >> 12) & 0x3;
383 static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
385 return (prepost_bits >> 14) & 0x3;
388 /* I2C addresses for 4020 */
390 RANGE_CAL_I2C_ADDR = 0x20,
391 CALDAC0_I2C_ADDR = 0xc,
392 CALDAC1_I2C_ADDR = 0xd,
395 enum range_cal_i2c_contents {
396 ADC_SRC_4020_MASK = 0x70, /* bits that set what source the adc converter measures */
397 BNC_TRIG_THRESHOLD_0V_BIT = 0x80, /* make bnc trig/ext clock threshold 0V instead of 2.5V */
399 static inline uint8_t adc_src_4020_bits(unsigned int source)
401 return (source << 4) & ADC_SRC_4020_MASK;
404 static inline uint8_t attenuate_bit(unsigned int channel)
406 /* attenuate channel (+-5V input range) */
407 return 1 << (channel & 0x3);
410 /* analog input ranges for 64xx boards */
411 static const struct comedi_lrange ai_ranges_64xx = {
425 /* analog input ranges for 60xx boards */
426 static const struct comedi_lrange ai_ranges_60xx = {
436 /* analog input ranges for 6030, etc boards */
437 static const struct comedi_lrange ai_ranges_6030 = {
457 /* analog input ranges for 6052, etc boards */
458 static const struct comedi_lrange ai_ranges_6052 = {
479 /* analog input ranges for 4020 board */
480 static const struct comedi_lrange ai_ranges_4020 = {
488 /* analog output ranges */
489 static const struct comedi_lrange ao_ranges_64xx = {
499 static const int ao_range_code_64xx[] = {
506 static const struct comedi_lrange ao_ranges_60xx = {
513 static const int ao_range_code_60xx[] = {
517 static const struct comedi_lrange ao_ranges_6030 = {
525 static const int ao_range_code_6030[] = {
530 static const struct comedi_lrange ao_ranges_4020 = {
538 static const int ao_range_code_4020[] = {
543 enum register_layout {
549 struct hw_fifo_info {
550 unsigned int num_segments;
551 unsigned int max_segment_length;
552 unsigned int sample_packing_ratio;
553 uint16_t fifo_size_reg_mask;
556 struct pcidas64_board {
558 int device_id; /* pci device id */
559 int ai_se_chans; /* number of ai inputs in single-ended mode */
560 int ai_bits; /* analog input resolution */
561 int ai_speed; /* fastest conversion period in ns */
562 const struct comedi_lrange *ai_range_table;
563 int ao_nchan; /* number of analog out channels */
564 int ao_bits; /* analog output resolution */
565 int ao_scan_speed; /* analog output speed (for a scan, not conversion) */
566 const struct comedi_lrange *ao_range_table;
567 const int *ao_range_code;
568 const struct hw_fifo_info *const ai_fifo;
569 enum register_layout layout; /* different board families have slightly different registers */
573 static const struct hw_fifo_info ai_fifo_4020 = {
575 .max_segment_length = 0x8000,
576 .sample_packing_ratio = 2,
577 .fifo_size_reg_mask = 0x7f,
580 static const struct hw_fifo_info ai_fifo_64xx = {
582 .max_segment_length = 0x800,
583 .sample_packing_ratio = 1,
584 .fifo_size_reg_mask = 0x3f,
587 static const struct hw_fifo_info ai_fifo_60xx = {
589 .max_segment_length = 0x800,
590 .sample_packing_ratio = 1,
591 .fifo_size_reg_mask = 0x7f,
594 /* maximum number of dma transfers we will chain together into a ring
595 * (and the maximum number of dma buffers we maintain) */
596 #define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
597 #define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
598 #define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
599 static inline unsigned int ai_dma_ring_count(struct pcidas64_board *board)
601 if (board->layout == LAYOUT_4020)
602 return MAX_AI_DMA_RING_COUNT;
604 return MIN_AI_DMA_RING_COUNT;
607 static const int bytes_in_sample = 2;
609 static const struct pcidas64_board pcidas64_boards[] = {
611 .name = "pci-das6402/16",
618 .ao_scan_speed = 10000,
619 .layout = LAYOUT_64XX,
620 .ai_range_table = &ai_ranges_64xx,
621 .ao_range_table = &ao_ranges_64xx,
622 .ao_range_code = ao_range_code_64xx,
623 .ai_fifo = &ai_fifo_64xx,
627 .name = "pci-das6402/12", /* XXX check */
634 .ao_scan_speed = 10000,
635 .layout = LAYOUT_64XX,
636 .ai_range_table = &ai_ranges_64xx,
637 .ao_range_table = &ao_ranges_64xx,
638 .ao_range_code = ao_range_code_64xx,
639 .ai_fifo = &ai_fifo_64xx,
643 .name = "pci-das64/m1/16",
650 .ao_scan_speed = 10000,
651 .layout = LAYOUT_64XX,
652 .ai_range_table = &ai_ranges_64xx,
653 .ao_range_table = &ao_ranges_64xx,
654 .ao_range_code = ao_range_code_64xx,
655 .ai_fifo = &ai_fifo_64xx,
659 .name = "pci-das64/m2/16",
666 .ao_scan_speed = 10000,
667 .layout = LAYOUT_64XX,
668 .ai_range_table = &ai_ranges_64xx,
669 .ao_range_table = &ao_ranges_64xx,
670 .ao_range_code = ao_range_code_64xx,
671 .ai_fifo = &ai_fifo_64xx,
675 .name = "pci-das64/m3/16",
682 .ao_scan_speed = 10000,
683 .layout = LAYOUT_64XX,
684 .ai_range_table = &ai_ranges_64xx,
685 .ao_range_table = &ao_ranges_64xx,
686 .ao_range_code = ao_range_code_64xx,
687 .ai_fifo = &ai_fifo_64xx,
691 .name = "pci-das6013",
698 .layout = LAYOUT_60XX,
699 .ai_range_table = &ai_ranges_60xx,
700 .ao_range_table = &ao_ranges_60xx,
701 .ao_range_code = ao_range_code_60xx,
702 .ai_fifo = &ai_fifo_60xx,
706 .name = "pci-das6014",
713 .ao_scan_speed = 100000,
714 .layout = LAYOUT_60XX,
715 .ai_range_table = &ai_ranges_60xx,
716 .ao_range_table = &ao_ranges_60xx,
717 .ao_range_code = ao_range_code_60xx,
718 .ai_fifo = &ai_fifo_60xx,
722 .name = "pci-das6023",
728 .ao_scan_speed = 100000,
729 .layout = LAYOUT_60XX,
730 .ai_range_table = &ai_ranges_60xx,
731 .ao_range_table = &ao_ranges_60xx,
732 .ao_range_code = ao_range_code_60xx,
733 .ai_fifo = &ai_fifo_60xx,
737 .name = "pci-das6025",
744 .ao_scan_speed = 100000,
745 .layout = LAYOUT_60XX,
746 .ai_range_table = &ai_ranges_60xx,
747 .ao_range_table = &ao_ranges_60xx,
748 .ao_range_code = ao_range_code_60xx,
749 .ai_fifo = &ai_fifo_60xx,
753 .name = "pci-das6030",
760 .ao_scan_speed = 10000,
761 .layout = LAYOUT_60XX,
762 .ai_range_table = &ai_ranges_6030,
763 .ao_range_table = &ao_ranges_6030,
764 .ao_range_code = ao_range_code_6030,
765 .ai_fifo = &ai_fifo_60xx,
769 .name = "pci-das6031",
776 .ao_scan_speed = 10000,
777 .layout = LAYOUT_60XX,
778 .ai_range_table = &ai_ranges_6030,
779 .ao_range_table = &ao_ranges_6030,
780 .ao_range_code = ao_range_code_6030,
781 .ai_fifo = &ai_fifo_60xx,
785 .name = "pci-das6032",
791 .layout = LAYOUT_60XX,
792 .ai_range_table = &ai_ranges_6030,
793 .ai_fifo = &ai_fifo_60xx,
797 .name = "pci-das6033",
803 .layout = LAYOUT_60XX,
804 .ai_range_table = &ai_ranges_6030,
805 .ai_fifo = &ai_fifo_60xx,
809 .name = "pci-das6034",
816 .layout = LAYOUT_60XX,
817 .ai_range_table = &ai_ranges_60xx,
818 .ai_fifo = &ai_fifo_60xx,
822 .name = "pci-das6035",
829 .ao_scan_speed = 100000,
830 .layout = LAYOUT_60XX,
831 .ai_range_table = &ai_ranges_60xx,
832 .ao_range_table = &ao_ranges_60xx,
833 .ao_range_code = ao_range_code_60xx,
834 .ai_fifo = &ai_fifo_60xx,
838 .name = "pci-das6036",
845 .ao_scan_speed = 100000,
846 .layout = LAYOUT_60XX,
847 .ai_range_table = &ai_ranges_60xx,
848 .ao_range_table = &ao_ranges_60xx,
849 .ao_range_code = ao_range_code_60xx,
850 .ai_fifo = &ai_fifo_60xx,
854 .name = "pci-das6040",
861 .ao_scan_speed = 1000,
862 .layout = LAYOUT_60XX,
863 .ai_range_table = &ai_ranges_6052,
864 .ao_range_table = &ao_ranges_6030,
865 .ao_range_code = ao_range_code_6030,
866 .ai_fifo = &ai_fifo_60xx,
870 .name = "pci-das6052",
877 .ao_scan_speed = 3333,
878 .layout = LAYOUT_60XX,
879 .ai_range_table = &ai_ranges_6052,
880 .ao_range_table = &ao_ranges_6030,
881 .ao_range_code = ao_range_code_6030,
882 .ai_fifo = &ai_fifo_60xx,
886 .name = "pci-das6070",
893 .ao_scan_speed = 1000,
894 .layout = LAYOUT_60XX,
895 .ai_range_table = &ai_ranges_6052,
896 .ao_range_table = &ao_ranges_6030,
897 .ao_range_code = ao_range_code_6030,
898 .ai_fifo = &ai_fifo_60xx,
902 .name = "pci-das6071",
909 .ao_scan_speed = 1000,
910 .layout = LAYOUT_60XX,
911 .ai_range_table = &ai_ranges_6052,
912 .ao_range_table = &ao_ranges_6030,
913 .ao_range_code = ao_range_code_6030,
914 .ai_fifo = &ai_fifo_60xx,
918 .name = "pci-das4020/12",
925 .ao_scan_speed = 0, /* no hardware pacing on ao */
926 .layout = LAYOUT_4020,
927 .ai_range_table = &ai_ranges_4020,
928 .ao_range_table = &ao_ranges_4020,
929 .ao_range_code = ao_range_code_4020,
930 .ai_fifo = &ai_fifo_4020,
935 .name = "pci-das6402/16/jr",
936 .device_id = 0 /* XXX, */
941 .ao_scan_speed = 10000,
942 .layout = LAYOUT_64XX,
943 .ai_range_table = &ai_ranges_64xx,
944 .ai_fifo = ai_fifo_64xx,
948 .name = "pci-das64/m1/16/jr",
949 .device_id = 0 /* XXX, */
954 .ao_scan_speed = 10000,
955 .layout = LAYOUT_64XX,
956 .ai_range_table = &ai_ranges_64xx,
957 .ai_fifo = ai_fifo_64xx,
961 .name = "pci-das64/m2/16/jr",
962 .device_id = 0 /* XXX, */
967 .ao_scan_speed = 10000,
968 .layout = LAYOUT_64XX,
969 .ai_range_table = &ai_ranges_64xx,
970 .ai_fifo = ai_fifo_64xx,
974 .name = "pci-das64/m3/16/jr",
975 .device_id = 0 /* XXX, */
980 .ao_scan_speed = 10000,
981 .layout = LAYOUT_64XX,
982 .ai_range_table = &ai_ranges_64xx,
983 .ai_fifo = ai_fifo_64xx,
987 .name = "pci-das64/m1/14",
988 .device_id = 0, /* XXX */
993 .ao_scan_speed = 10000,
994 .layout = LAYOUT_64XX,
995 .ai_range_table = &ai_ranges_64xx,
996 .ai_fifo = ai_fifo_64xx,
1000 .name = "pci-das64/m2/14",
1001 .device_id = 0, /* XXX */
1006 .ao_scan_speed = 10000,
1007 .layout = LAYOUT_64XX,
1008 .ai_range_table = &ai_ranges_64xx,
1009 .ai_fifo = ai_fifo_64xx,
1013 .name = "pci-das64/m3/14",
1014 .device_id = 0, /* XXX */
1019 .ao_scan_speed = 10000,
1020 .layout = LAYOUT_64XX,
1021 .ai_range_table = &ai_ranges_64xx,
1022 .ai_fifo = ai_fifo_64xx,
1028 static DEFINE_PCI_DEVICE_TABLE(pcidas64_pci_table) = {
1030 PCI_VENDOR_ID_COMPUTERBOARDS, 0x001d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1032 PCI_VENDOR_ID_COMPUTERBOARDS, 0x001e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1034 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0035, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1036 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0036, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1038 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0037, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1040 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0052, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1042 PCI_VENDOR_ID_COMPUTERBOARDS, 0x005d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1044 PCI_VENDOR_ID_COMPUTERBOARDS, 0x005e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1046 PCI_VENDOR_ID_COMPUTERBOARDS, 0x005f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1048 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0061, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1050 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0062, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1052 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0063, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1054 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1056 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0066, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1058 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0067, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1060 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0068, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1062 PCI_VENDOR_ID_COMPUTERBOARDS, 0x006f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1064 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0078, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1066 PCI_VENDOR_ID_COMPUTERBOARDS, 0x0079, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1071 MODULE_DEVICE_TABLE(pci, pcidas64_pci_table);
1073 static inline struct pcidas64_board *board(const struct comedi_device *dev)
1075 return (struct pcidas64_board *)dev->board_ptr;
1078 static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev,
1079 int use_differential)
1081 if ((board(dev)->layout == LAYOUT_64XX && !use_differential) ||
1082 (board(dev)->layout == LAYOUT_60XX && use_differential))
1083 return ADC_SE_DIFF_BIT;
1088 struct ext_clock_info {
1089 unsigned int divisor; /* master clock divisor to use for scans with external master clock */
1090 unsigned int chanspec; /* chanspec for master clock input when used as scan begin src */
1093 /* this structure is for data unique to this hardware driver. */
1094 struct pcidas64_private {
1096 struct pci_dev *hw_dev; /* pointer to board's pci_dev struct */
1097 /* base addresses (physical) */
1098 resource_size_t plx9080_phys_iobase;
1099 resource_size_t main_phys_iobase;
1100 resource_size_t dio_counter_phys_iobase;
1101 /* base addresses (ioremapped) */
1102 void *plx9080_iobase;
1104 void *dio_counter_iobase;
1105 /* local address (used by dma controller) */
1106 uint32_t local0_iobase;
1107 uint32_t local1_iobase;
1108 volatile unsigned int ai_count; /* number of analog input samples remaining */
1109 uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT]; /* dma buffers for analog input */
1110 dma_addr_t ai_buffer_bus_addr[MAX_AI_DMA_RING_COUNT]; /* physical addresses of ai dma buffers */
1111 struct plx_dma_desc *ai_dma_desc; /* array of ai dma descriptors read by plx9080, allocated to get proper alignment */
1112 dma_addr_t ai_dma_desc_bus_addr; /* physical address of ai dma descriptor array */
1113 volatile unsigned int ai_dma_index; /* index of the ai dma descriptor/buffer that is currently being used */
1114 uint16_t *ao_buffer[AO_DMA_RING_COUNT]; /* dma buffers for analog output */
1115 dma_addr_t ao_buffer_bus_addr[AO_DMA_RING_COUNT]; /* physical addresses of ao dma buffers */
1116 struct plx_dma_desc *ao_dma_desc;
1117 dma_addr_t ao_dma_desc_bus_addr;
1118 volatile unsigned int ao_dma_index; /* keeps track of buffer where the next ao sample should go */
1119 volatile unsigned long ao_count; /* number of analog output samples remaining */
1120 volatile unsigned int ao_value[2]; /* remember what the analog outputs are set to, to allow readback */
1121 unsigned int hw_revision; /* stc chip hardware revision number */
1122 volatile unsigned int intr_enable_bits; /* last bits sent to INTR_ENABLE_REG register */
1123 volatile uint16_t adc_control1_bits; /* last bits sent to ADC_CONTROL1_REG register */
1124 volatile uint16_t fifo_size_bits; /* last bits sent to FIFO_SIZE_REG register */
1125 volatile uint16_t hw_config_bits; /* last bits sent to HW_CONFIG_REG register */
1126 volatile uint16_t dac_control1_bits;
1127 volatile uint32_t plx_control_bits; /* last bits written to plx9080 control register */
1128 volatile uint32_t plx_intcsr_bits; /* last bits written to plx interrupt control and status register */
1129 volatile int calibration_source; /* index of calibration source readable through ai ch0 */
1130 volatile uint8_t i2c_cal_range_bits; /* bits written to i2c calibration/range register */
1131 volatile unsigned int ext_trig_falling; /* configure digital triggers to trigger on falling edge */
1132 /* states of various devices stored to enable read-back */
1133 unsigned int ad8402_state[2];
1134 unsigned int caldac_state[8];
1135 volatile short ai_cmd_running;
1136 unsigned int ai_fifo_segment_length;
1137 struct ext_clock_info ext_clock;
1138 short ao_bounce_buffer[DAC_FIFO_SIZE];
1141 /* inline function that makes it easier to
1142 * access the private structure.
1144 static inline struct pcidas64_private *priv(struct comedi_device *dev)
1146 return dev->private;
1150 * The comedi_driver structure tells the Comedi core module
1151 * which functions to call to configure/deconfigure (attach/detach)
1152 * the board, and also about the kernel module that contains
1155 static int attach(struct comedi_device *dev, struct comedi_devconfig *it);
1156 static int detach(struct comedi_device *dev);
1157 static struct comedi_driver driver_cb_pcidas = {
1158 .driver_name = "cb_pcidas64",
1159 .module = THIS_MODULE,
1164 static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1165 struct comedi_insn *insn, unsigned int *data);
1166 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1167 struct comedi_insn *insn, unsigned int *data);
1168 static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1169 struct comedi_insn *insn, unsigned int *data);
1170 static int ao_readback_insn(struct comedi_device *dev,
1171 struct comedi_subdevice *s,
1172 struct comedi_insn *insn, unsigned int *data);
1173 static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1174 static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1175 struct comedi_cmd *cmd);
1176 static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1177 static int ao_inttrig(struct comedi_device *dev,
1178 struct comedi_subdevice *subdev, unsigned int trig_num);
1179 static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1180 struct comedi_cmd *cmd);
1181 static irqreturn_t handle_interrupt(int irq, void *d);
1182 static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1183 static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1184 static int dio_callback(int dir, int port, int data, unsigned long arg);
1185 static int dio_callback_4020(int dir, int port, int data, unsigned long arg);
1186 static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
1187 struct comedi_insn *insn, unsigned int *data);
1188 static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1189 struct comedi_insn *insn, unsigned int *data);
1190 static int dio_60xx_config_insn(struct comedi_device *dev,
1191 struct comedi_subdevice *s,
1192 struct comedi_insn *insn, unsigned int *data);
1193 static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1194 struct comedi_insn *insn, unsigned int *data);
1195 static int calib_read_insn(struct comedi_device *dev,
1196 struct comedi_subdevice *s, struct comedi_insn *insn,
1197 unsigned int *data);
1198 static int calib_write_insn(struct comedi_device *dev,
1199 struct comedi_subdevice *s,
1200 struct comedi_insn *insn, unsigned int *data);
1201 static int ad8402_read_insn(struct comedi_device *dev,
1202 struct comedi_subdevice *s,
1203 struct comedi_insn *insn, unsigned int *data);
1204 static void ad8402_write(struct comedi_device *dev, unsigned int channel,
1205 unsigned int value);
1206 static int ad8402_write_insn(struct comedi_device *dev,
1207 struct comedi_subdevice *s,
1208 struct comedi_insn *insn, unsigned int *data);
1209 static int eeprom_read_insn(struct comedi_device *dev,
1210 struct comedi_subdevice *s,
1211 struct comedi_insn *insn, unsigned int *data);
1212 static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
1213 static unsigned int get_divisor(unsigned int ns, unsigned int flags);
1214 static void i2c_write(struct comedi_device *dev, unsigned int address,
1215 const uint8_t * data, unsigned int length);
1216 static void caldac_write(struct comedi_device *dev, unsigned int channel,
1217 unsigned int value);
1218 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
1220 /* static int dac_1590_write(struct comedi_device *dev, unsigned int dac_a, unsigned int dac_b); */
1221 static int caldac_i2c_write(struct comedi_device *dev,
1222 unsigned int caldac_channel, unsigned int value);
1223 static void abort_dma(struct comedi_device *dev, unsigned int channel);
1224 static void disable_plx_interrupts(struct comedi_device *dev);
1225 static int set_ai_fifo_size(struct comedi_device *dev,
1226 unsigned int num_samples);
1227 static unsigned int ai_fifo_size(struct comedi_device *dev);
1228 static int set_ai_fifo_segment_length(struct comedi_device *dev,
1229 unsigned int num_entries);
1230 static void disable_ai_pacing(struct comedi_device *dev);
1231 static void disable_ai_interrupts(struct comedi_device *dev);
1232 static void enable_ai_interrupts(struct comedi_device *dev,
1233 const struct comedi_cmd *cmd);
1234 static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags);
1235 static void load_ao_dma(struct comedi_device *dev,
1236 const struct comedi_cmd *cmd);
1238 COMEDI_PCI_INITCLEANUP(driver_cb_pcidas, pcidas64_pci_table);
1240 static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
1241 unsigned int range_index)
1243 const struct comedi_krange *range =
1244 &board(dev)->ai_range_table->range[range_index];
1245 unsigned int bits = 0;
1247 switch (range->max) {
1276 comedi_error(dev, "bug! in ai_range_bits_6xxx");
1279 if (range->min == 0)
1284 static unsigned int hw_revision(const struct comedi_device *dev,
1285 uint16_t hw_status_bits)
1287 if (board(dev)->layout == LAYOUT_4020)
1288 return (hw_status_bits >> 13) & 0x7;
1290 return (hw_status_bits >> 12) & 0xf;
1293 static void set_dac_range_bits(struct comedi_device *dev,
1294 volatile uint16_t * bits, unsigned int channel,
1297 unsigned int code = board(dev)->ao_range_code[range];
1300 comedi_error(dev, "bug! bad channel?");
1302 comedi_error(dev, "bug! bad range code?");
1304 *bits &= ~(0x3 << (2 * channel));
1305 *bits |= code << (2 * channel);
1308 static inline int ao_cmd_is_supported(const struct pcidas64_board *board)
1310 return board->ao_nchan && board->layout != LAYOUT_4020;
1313 /* initialize plx9080 chip */
1314 static void init_plx9080(struct comedi_device *dev)
1317 void *plx_iobase = priv(dev)->plx9080_iobase;
1319 priv(dev)->plx_control_bits =
1320 readl(priv(dev)->plx9080_iobase + PLX_CONTROL_REG);
1323 DEBUG_PRINT(" plx interrupt status 0x%x\n",
1324 readl(plx_iobase + PLX_INTRCS_REG));
1325 DEBUG_PRINT(" plx id bits 0x%x\n", readl(plx_iobase + PLX_ID_REG));
1326 DEBUG_PRINT(" plx control reg 0x%x\n", priv(dev)->plx_control_bits);
1327 DEBUG_PRINT(" plx mode/arbitration reg 0x%x\n",
1328 readl(plx_iobase + PLX_MARB_REG));
1329 DEBUG_PRINT(" plx region0 reg 0x%x\n",
1330 readl(plx_iobase + PLX_REGION0_REG));
1331 DEBUG_PRINT(" plx region1 reg 0x%x\n",
1332 readl(plx_iobase + PLX_REGION1_REG));
1334 DEBUG_PRINT(" plx revision 0x%x\n",
1335 readl(plx_iobase + PLX_REVISION_REG));
1336 DEBUG_PRINT(" plx dma channel 0 mode 0x%x\n",
1337 readl(plx_iobase + PLX_DMA0_MODE_REG));
1338 DEBUG_PRINT(" plx dma channel 1 mode 0x%x\n",
1339 readl(plx_iobase + PLX_DMA1_MODE_REG));
1340 DEBUG_PRINT(" plx dma channel 0 pci address 0x%x\n",
1341 readl(plx_iobase + PLX_DMA0_PCI_ADDRESS_REG));
1342 DEBUG_PRINT(" plx dma channel 0 local address 0x%x\n",
1343 readl(plx_iobase + PLX_DMA0_LOCAL_ADDRESS_REG));
1344 DEBUG_PRINT(" plx dma channel 0 transfer size 0x%x\n",
1345 readl(plx_iobase + PLX_DMA0_TRANSFER_SIZE_REG));
1346 DEBUG_PRINT(" plx dma channel 0 descriptor 0x%x\n",
1347 readl(plx_iobase + PLX_DMA0_DESCRIPTOR_REG));
1348 DEBUG_PRINT(" plx dma channel 0 command status 0x%x\n",
1349 readb(plx_iobase + PLX_DMA0_CS_REG));
1350 DEBUG_PRINT(" plx dma channel 0 threshold 0x%x\n",
1351 readl(plx_iobase + PLX_DMA0_THRESHOLD_REG));
1352 DEBUG_PRINT(" plx bigend 0x%x\n", readl(plx_iobase + PLX_BIGEND_REG));
1355 bits = BIGEND_DMA0 | BIGEND_DMA1;
1359 writel(bits, priv(dev)->plx9080_iobase + PLX_BIGEND_REG);
1361 disable_plx_interrupts(dev);
1366 /* configure dma0 mode */
1368 /* enable ready input, not sure if this is necessary */
1369 bits |= PLX_DMA_EN_READYIN_BIT;
1370 /* enable bterm, not sure if this is necessary */
1371 bits |= PLX_EN_BTERM_BIT;
1372 /* enable dma chaining */
1373 bits |= PLX_EN_CHAIN_BIT;
1374 /* enable interrupt on dma done (probably don't need this, since chain never finishes) */
1375 bits |= PLX_EN_DMA_DONE_INTR_BIT;
1376 /* don't increment local address during transfers (we are transferring from a fixed fifo register) */
1377 bits |= PLX_LOCAL_ADDR_CONST_BIT;
1378 /* route dma interrupt to pci bus */
1379 bits |= PLX_DMA_INTR_PCI_BIT;
1380 /* enable demand mode */
1381 bits |= PLX_DEMAND_MODE_BIT;
1382 /* enable local burst mode */
1383 bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1384 /* 4020 uses 32 bit dma */
1385 if (board(dev)->layout == LAYOUT_4020) {
1386 bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1387 } else { /* localspace0 bus is 16 bits wide */
1388 bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
1390 writel(bits, plx_iobase + PLX_DMA1_MODE_REG);
1391 if (ao_cmd_is_supported(board(dev)))
1392 writel(bits, plx_iobase + PLX_DMA0_MODE_REG);
1394 /* enable interrupts on plx 9080 */
1395 priv(dev)->plx_intcsr_bits |=
1396 ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1397 ICS_DMA0_E | ICS_DMA1_E;
1398 writel(priv(dev)->plx_intcsr_bits,
1399 priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
1402 /* Allocate and initialize the subdevice structures.
1404 static int setup_subdevices(struct comedi_device *dev)
1406 struct comedi_subdevice *s;
1407 void *dio_8255_iobase;
1410 if (alloc_subdevices(dev, 10) < 0)
1413 s = dev->subdevices + 0;
1414 /* analog input subdevice */
1415 dev->read_subdev = s;
1416 s->type = COMEDI_SUBD_AI;
1417 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
1418 if (board(dev)->layout == LAYOUT_60XX)
1419 s->subdev_flags |= SDF_COMMON | SDF_DIFF;
1420 else if (board(dev)->layout == LAYOUT_64XX)
1421 s->subdev_flags |= SDF_DIFF;
1422 /* XXX Number of inputs in differential mode is ignored */
1423 s->n_chan = board(dev)->ai_se_chans;
1424 s->len_chanlist = 0x2000;
1425 s->maxdata = (1 << board(dev)->ai_bits) - 1;
1426 s->range_table = board(dev)->ai_range_table;
1427 s->insn_read = ai_rinsn;
1428 s->insn_config = ai_config_insn;
1430 s->do_cmdtest = ai_cmdtest;
1431 s->cancel = ai_cancel;
1432 if (board(dev)->layout == LAYOUT_4020) {
1435 /* set adc to read from inputs (not internal calibration sources) */
1436 priv(dev)->i2c_cal_range_bits = adc_src_4020_bits(4);
1437 /* set channels to +-5 volt input ranges */
1438 for (i = 0; i < s->n_chan; i++)
1439 priv(dev)->i2c_cal_range_bits |= attenuate_bit(i);
1440 data = priv(dev)->i2c_cal_range_bits;
1441 i2c_write(dev, RANGE_CAL_I2C_ADDR, &data, sizeof(data));
1444 /* analog output subdevice */
1445 s = dev->subdevices + 1;
1446 if (board(dev)->ao_nchan) {
1447 s->type = COMEDI_SUBD_AO;
1449 SDF_READABLE | SDF_WRITABLE | SDF_GROUND | SDF_CMD_WRITE;
1450 s->n_chan = board(dev)->ao_nchan;
1451 s->maxdata = (1 << board(dev)->ao_bits) - 1;
1452 s->range_table = board(dev)->ao_range_table;
1453 s->insn_read = ao_readback_insn;
1454 s->insn_write = ao_winsn;
1455 if (ao_cmd_is_supported(board(dev))) {
1456 dev->write_subdev = s;
1457 s->do_cmdtest = ao_cmdtest;
1459 s->len_chanlist = board(dev)->ao_nchan;
1460 s->cancel = ao_cancel;
1463 s->type = COMEDI_SUBD_UNUSED;
1467 s = dev->subdevices + 2;
1468 if (board(dev)->layout == LAYOUT_64XX) {
1469 s->type = COMEDI_SUBD_DI;
1470 s->subdev_flags = SDF_READABLE;
1473 s->range_table = &range_digital;
1474 s->insn_bits = di_rbits;
1476 s->type = COMEDI_SUBD_UNUSED;
1478 /* digital output */
1479 if (board(dev)->layout == LAYOUT_64XX) {
1480 s = dev->subdevices + 3;
1481 s->type = COMEDI_SUBD_DO;
1482 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1485 s->range_table = &range_digital;
1486 s->insn_bits = do_wbits;
1488 s->type = COMEDI_SUBD_UNUSED;
1491 s = dev->subdevices + 4;
1492 if (board(dev)->has_8255) {
1493 if (board(dev)->layout == LAYOUT_4020) {
1495 priv(dev)->main_iobase + I8255_4020_REG;
1496 subdev_8255_init(dev, s, dio_callback_4020,
1497 (unsigned long)dio_8255_iobase);
1500 priv(dev)->dio_counter_iobase + DIO_8255_OFFSET;
1501 subdev_8255_init(dev, s, dio_callback,
1502 (unsigned long)dio_8255_iobase);
1505 s->type = COMEDI_SUBD_UNUSED;
1507 /* 8 channel dio for 60xx */
1508 s = dev->subdevices + 5;
1509 if (board(dev)->layout == LAYOUT_60XX) {
1510 s->type = COMEDI_SUBD_DIO;
1511 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1514 s->range_table = &range_digital;
1515 s->insn_config = dio_60xx_config_insn;
1516 s->insn_bits = dio_60xx_wbits;
1518 s->type = COMEDI_SUBD_UNUSED;
1521 s = dev->subdevices + 6;
1522 s->type = COMEDI_SUBD_CALIB;
1523 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1525 if (board(dev)->layout == LAYOUT_4020)
1529 s->insn_read = calib_read_insn;
1530 s->insn_write = calib_write_insn;
1531 for (i = 0; i < s->n_chan; i++)
1532 caldac_write(dev, i, s->maxdata / 2);
1534 /* 2 channel ad8402 potentiometer */
1535 s = dev->subdevices + 7;
1536 if (board(dev)->layout == LAYOUT_64XX) {
1537 s->type = COMEDI_SUBD_CALIB;
1538 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1540 s->insn_read = ad8402_read_insn;
1541 s->insn_write = ad8402_write_insn;
1543 for (i = 0; i < s->n_chan; i++)
1544 ad8402_write(dev, i, s->maxdata / 2);
1546 s->type = COMEDI_SUBD_UNUSED;
1548 /* serial EEPROM, if present */
1549 s = dev->subdevices + 8;
1550 if (readl(priv(dev)->plx9080_iobase + PLX_CONTROL_REG) & CTL_EECHK) {
1551 s->type = COMEDI_SUBD_MEMORY;
1552 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
1554 s->maxdata = 0xffff;
1555 s->insn_read = eeprom_read_insn;
1557 s->type = COMEDI_SUBD_UNUSED;
1559 /* user counter subd XXX */
1560 s = dev->subdevices + 9;
1561 s->type = COMEDI_SUBD_UNUSED;
1566 static void disable_plx_interrupts(struct comedi_device *dev)
1568 priv(dev)->plx_intcsr_bits = 0;
1569 writel(priv(dev)->plx_intcsr_bits,
1570 priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
1573 static void init_stc_registers(struct comedi_device *dev)
1576 unsigned long flags;
1578 spin_lock_irqsave(&dev->spinlock, flags);
1580 /* bit should be set for 6025, although docs say boards with <= 16 chans should be cleared XXX */
1582 priv(dev)->adc_control1_bits |= ADC_QUEUE_CONFIG_BIT;
1583 writew(priv(dev)->adc_control1_bits,
1584 priv(dev)->main_iobase + ADC_CONTROL1_REG);
1586 /* 6402/16 manual says this register must be initialized to 0xff? */
1587 writew(0xff, priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1589 bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
1590 if (board(dev)->layout == LAYOUT_4020)
1591 bits |= INTERNAL_CLOCK_4020_BITS;
1592 priv(dev)->hw_config_bits |= bits;
1593 writew(priv(dev)->hw_config_bits,
1594 priv(dev)->main_iobase + HW_CONFIG_REG);
1596 writew(0, priv(dev)->main_iobase + DAQ_SYNC_REG);
1597 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
1599 spin_unlock_irqrestore(&dev->spinlock, flags);
1601 /* set fifos to maximum size */
1602 priv(dev)->fifo_size_bits |= DAC_FIFO_BITS;
1603 set_ai_fifo_segment_length(dev,
1604 board(dev)->ai_fifo->max_segment_length);
1606 priv(dev)->dac_control1_bits = DAC_OUTPUT_ENABLE_BIT;
1607 priv(dev)->intr_enable_bits = /* EN_DAC_INTR_SRC_BIT | DAC_INTR_QEMPTY_BITS | */
1608 EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1609 writew(priv(dev)->intr_enable_bits,
1610 priv(dev)->main_iobase + INTR_ENABLE_REG);
1612 disable_ai_pacing(dev);
1615 int alloc_and_init_dma_members(struct comedi_device *dev)
1619 /* alocate pci dma buffers */
1620 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1621 priv(dev)->ai_buffer[i] =
1622 pci_alloc_consistent(priv(dev)->hw_dev, DMA_BUFFER_SIZE,
1623 &priv(dev)->ai_buffer_bus_addr[i]);
1624 if (priv(dev)->ai_buffer[i] == NULL) {
1628 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1629 if (ao_cmd_is_supported(board(dev))) {
1630 priv(dev)->ao_buffer[i] =
1631 pci_alloc_consistent(priv(dev)->hw_dev,
1634 ao_buffer_bus_addr[i]);
1635 if (priv(dev)->ao_buffer[i] == NULL) {
1640 /* allocate dma descriptors */
1641 priv(dev)->ai_dma_desc =
1642 pci_alloc_consistent(priv(dev)->hw_dev,
1643 sizeof(struct plx_dma_desc) *
1644 ai_dma_ring_count(board(dev)),
1645 &priv(dev)->ai_dma_desc_bus_addr);
1646 if (priv(dev)->ai_dma_desc == NULL) {
1649 DEBUG_PRINT("ai dma descriptors start at bus addr 0x%x\n",
1650 priv(dev)->ai_dma_desc_bus_addr);
1651 if (ao_cmd_is_supported(board(dev))) {
1652 priv(dev)->ao_dma_desc =
1653 pci_alloc_consistent(priv(dev)->hw_dev,
1654 sizeof(struct plx_dma_desc) *
1656 &priv(dev)->ao_dma_desc_bus_addr);
1657 if (priv(dev)->ao_dma_desc == NULL) {
1660 DEBUG_PRINT("ao dma descriptors start at bus addr 0x%x\n",
1661 priv(dev)->ao_dma_desc_bus_addr);
1663 /* initialize dma descriptors */
1664 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1665 priv(dev)->ai_dma_desc[i].pci_start_addr =
1666 cpu_to_le32(priv(dev)->ai_buffer_bus_addr[i]);
1667 if (board(dev)->layout == LAYOUT_4020)
1668 priv(dev)->ai_dma_desc[i].local_start_addr =
1669 cpu_to_le32(priv(dev)->local1_iobase +
1672 priv(dev)->ai_dma_desc[i].local_start_addr =
1673 cpu_to_le32(priv(dev)->local0_iobase +
1675 priv(dev)->ai_dma_desc[i].transfer_size = cpu_to_le32(0);
1676 priv(dev)->ai_dma_desc[i].next =
1677 cpu_to_le32((priv(dev)->ai_dma_desc_bus_addr + ((i +
1682 sizeof(priv(dev)->ai_dma_desc[0])) |
1683 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1684 PLX_XFER_LOCAL_TO_PCI);
1686 if (ao_cmd_is_supported(board(dev))) {
1687 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1688 priv(dev)->ao_dma_desc[i].pci_start_addr =
1689 cpu_to_le32(priv(dev)->ao_buffer_bus_addr[i]);
1690 priv(dev)->ao_dma_desc[i].local_start_addr =
1691 cpu_to_le32(priv(dev)->local0_iobase +
1693 priv(dev)->ao_dma_desc[i].transfer_size =
1695 priv(dev)->ao_dma_desc[i].next =
1696 cpu_to_le32((priv(dev)->ao_dma_desc_bus_addr +
1697 ((i + 1) % (AO_DMA_RING_COUNT)) *
1698 sizeof(priv(dev)->ao_dma_desc[0])) |
1699 PLX_DESC_IN_PCI_BIT |
1700 PLX_INTR_TERM_COUNT);
1706 static inline void warn_external_queue(struct comedi_device *dev)
1709 "AO command and AI external channel queue cannot be used simultaneously.");
1711 "Use internal AI channel queue (channels must be consecutive and use same range/aref)");
1715 * Attach is called by the Comedi core to configure the driver
1716 * for a particular board.
1718 static int attach(struct comedi_device *dev, struct comedi_devconfig *it)
1720 struct pci_dev *pcidev;
1722 uint32_t local_range, local_decode;
1725 printk("comedi%d: cb_pcidas64\n", dev->minor);
1728 * Allocate the private structure area.
1730 if (alloc_private(dev, sizeof(struct pcidas64_private)) < 0)
1734 * Probe the device to determine what device in the series it is.
1737 for (pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL);
1739 pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
1740 /* is it not a computer boards card? */
1741 if (pcidev->vendor != PCI_VENDOR_ID_COMPUTERBOARDS)
1743 /* loop through cards supported by this driver */
1744 for (index = 0; index < ARRAY_SIZE(pcidas64_boards); index++) {
1745 if (pcidas64_boards[index].device_id != pcidev->device)
1747 /* was a particular bus/slot requested? */
1748 if (it->options[0] || it->options[1]) {
1749 /* are we on the wrong bus/slot? */
1750 if (pcidev->bus->number != it->options[0] ||
1751 PCI_SLOT(pcidev->devfn) != it->options[1]) {
1755 priv(dev)->hw_dev = pcidev;
1756 dev->board_ptr = pcidas64_boards + index;
1763 if (dev->board_ptr == NULL) {
1765 ("No supported ComputerBoards/MeasurementComputing card found\n");
1769 printk("Found %s on bus %i, slot %i\n", board(dev)->name,
1770 pcidev->bus->number, PCI_SLOT(pcidev->devfn));
1772 if (comedi_pci_enable(pcidev, driver_cb_pcidas.driver_name)) {
1774 " failed to enable PCI device and request regions\n");
1777 pci_set_master(pcidev);
1779 /* Initialize dev->board_name */
1780 dev->board_name = board(dev)->name;
1782 priv(dev)->plx9080_phys_iobase =
1783 pci_resource_start(pcidev, PLX9080_BADDRINDEX);
1784 priv(dev)->main_phys_iobase =
1785 pci_resource_start(pcidev, MAIN_BADDRINDEX);
1786 priv(dev)->dio_counter_phys_iobase =
1787 pci_resource_start(pcidev, DIO_COUNTER_BADDRINDEX);
1789 /* remap, won't work with 2.0 kernels but who cares */
1790 priv(dev)->plx9080_iobase = ioremap(priv(dev)->plx9080_phys_iobase,
1791 pci_resource_len(pcidev,
1792 PLX9080_BADDRINDEX));
1793 priv(dev)->main_iobase =
1794 ioremap(priv(dev)->main_phys_iobase,
1795 pci_resource_len(pcidev, MAIN_BADDRINDEX));
1796 priv(dev)->dio_counter_iobase =
1797 ioremap(priv(dev)->dio_counter_phys_iobase,
1798 pci_resource_len(pcidev, DIO_COUNTER_BADDRINDEX));
1800 if (!priv(dev)->plx9080_iobase || !priv(dev)->main_iobase
1801 || !priv(dev)->dio_counter_iobase) {
1802 printk(" failed to remap io memory\n");
1806 DEBUG_PRINT(" plx9080 remapped to 0x%p\n", priv(dev)->plx9080_iobase);
1807 DEBUG_PRINT(" main remapped to 0x%p\n", priv(dev)->main_iobase);
1808 DEBUG_PRINT(" diocounter remapped to 0x%p\n",
1809 priv(dev)->dio_counter_iobase);
1811 /* figure out what local addresses are */
1813 readl(priv(dev)->plx9080_iobase + PLX_LAS0RNG_REG) & LRNG_MEM_MASK;
1815 readl(priv(dev)->plx9080_iobase +
1816 PLX_LAS0MAP_REG) & local_range & LMAP_MEM_MASK;
1817 priv(dev)->local0_iobase =
1818 ((uint32_t) priv(dev)->main_phys_iobase & ~local_range) |
1821 readl(priv(dev)->plx9080_iobase + PLX_LAS1RNG_REG) & LRNG_MEM_MASK;
1823 readl(priv(dev)->plx9080_iobase +
1824 PLX_LAS1MAP_REG) & local_range & LMAP_MEM_MASK;
1825 priv(dev)->local1_iobase =
1826 ((uint32_t) priv(dev)->dio_counter_phys_iobase & ~local_range) |
1829 DEBUG_PRINT(" local 0 io addr 0x%x\n", priv(dev)->local0_iobase);
1830 DEBUG_PRINT(" local 1 io addr 0x%x\n", priv(dev)->local1_iobase);
1832 retval = alloc_and_init_dma_members(dev);
1836 priv(dev)->hw_revision =
1837 hw_revision(dev, readw(priv(dev)->main_iobase + HW_STATUS_REG));
1838 printk(" stc hardware revision %i\n", priv(dev)->hw_revision);
1840 init_stc_registers(dev);
1842 if (request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
1843 "cb_pcidas64", dev)) {
1844 printk(" unable to allocate irq %u\n", pcidev->irq);
1847 dev->irq = pcidev->irq;
1848 printk(" irq %u\n", dev->irq);
1850 retval = setup_subdevices(dev);
1859 * _detach is called to deconfigure a device. It should deallocate
1861 * This function is also called when _attach() fails, so it should be
1862 * careful not to release resources that were not necessarily
1863 * allocated by _attach(). dev->private and dev->subdevices are
1864 * deallocated automatically by the core.
1866 static int detach(struct comedi_device *dev)
1870 printk("comedi%d: cb_pcidas: remove\n", dev->minor);
1873 free_irq(dev->irq, dev);
1875 if (priv(dev)->hw_dev) {
1876 if (priv(dev)->plx9080_iobase) {
1877 disable_plx_interrupts(dev);
1878 iounmap((void *)priv(dev)->plx9080_iobase);
1880 if (priv(dev)->main_iobase)
1881 iounmap((void *)priv(dev)->main_iobase);
1882 if (priv(dev)->dio_counter_iobase)
1883 iounmap((void *)priv(dev)->dio_counter_iobase);
1884 /* free pci dma buffers */
1885 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1886 if (priv(dev)->ai_buffer[i])
1887 pci_free_consistent(priv(dev)->hw_dev,
1892 (dev)->ai_buffer_bus_addr
1895 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1896 if (priv(dev)->ao_buffer[i])
1897 pci_free_consistent(priv(dev)->hw_dev,
1902 (dev)->ao_buffer_bus_addr
1905 /* free dma descriptors */
1906 if (priv(dev)->ai_dma_desc)
1907 pci_free_consistent(priv(dev)->hw_dev,
1908 sizeof(struct plx_dma_desc)
1910 ai_dma_ring_count(board
1912 priv(dev)->ai_dma_desc,
1914 ai_dma_desc_bus_addr);
1915 if (priv(dev)->ao_dma_desc)
1916 pci_free_consistent(priv(dev)->hw_dev,
1917 sizeof(struct plx_dma_desc)
1918 * AO_DMA_RING_COUNT,
1919 priv(dev)->ao_dma_desc,
1921 ao_dma_desc_bus_addr);
1922 if (priv(dev)->main_phys_iobase) {
1923 comedi_pci_disable(priv(dev)->hw_dev);
1925 pci_dev_put(priv(dev)->hw_dev);
1928 if (dev->subdevices)
1929 subdev_8255_cleanup(dev, dev->subdevices + 4);
1934 static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1935 struct comedi_insn *insn, unsigned int *data)
1937 unsigned int bits = 0, n, i;
1938 unsigned int channel, range, aref;
1939 unsigned long flags;
1940 static const int timeout = 100;
1942 DEBUG_PRINT("chanspec 0x%x\n", insn->chanspec);
1943 channel = CR_CHAN(insn->chanspec);
1944 range = CR_RANGE(insn->chanspec);
1945 aref = CR_AREF(insn->chanspec);
1947 /* disable card's analog input interrupt sources and pacing */
1948 /* 4020 generates dac done interrupts even though they are disabled */
1949 disable_ai_pacing(dev);
1951 spin_lock_irqsave(&dev->spinlock, flags);
1952 if (insn->chanspec & CR_ALT_FILTER)
1953 priv(dev)->adc_control1_bits |= ADC_DITHER_BIT;
1955 priv(dev)->adc_control1_bits &= ~ADC_DITHER_BIT;
1956 writew(priv(dev)->adc_control1_bits,
1957 priv(dev)->main_iobase + ADC_CONTROL1_REG);
1958 spin_unlock_irqrestore(&dev->spinlock, flags);
1960 if (board(dev)->layout != LAYOUT_4020) {
1961 /* use internal queue */
1962 priv(dev)->hw_config_bits &= ~EXT_QUEUE_BIT;
1963 writew(priv(dev)->hw_config_bits,
1964 priv(dev)->main_iobase + HW_CONFIG_REG);
1966 /* ALT_SOURCE is internal calibration reference */
1967 if (insn->chanspec & CR_ALT_SOURCE) {
1968 unsigned int cal_en_bit;
1970 DEBUG_PRINT("reading calibration source\n");
1971 if (board(dev)->layout == LAYOUT_60XX)
1972 cal_en_bit = CAL_EN_60XX_BIT;
1974 cal_en_bit = CAL_EN_64XX_BIT;
1975 /* select internal reference source to connect to channel 0 */
1977 adc_src_bits(priv(dev)->calibration_source),
1978 priv(dev)->main_iobase + CALIBRATION_REG);
1980 /* make sure internal calibration source is turned off */
1981 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
1983 /* load internal queue */
1986 bits |= ai_range_bits_6xxx(dev, CR_RANGE(insn->chanspec));
1987 /* set single-ended / differential */
1988 bits |= se_diff_bit_6xxx(dev, aref == AREF_DIFF);
1989 if (aref == AREF_COMMON)
1990 bits |= ADC_COMMON_BIT;
1991 bits |= adc_chan_bits(channel);
1992 /* set stop channel */
1993 writew(adc_chan_bits(channel),
1994 priv(dev)->main_iobase + ADC_QUEUE_HIGH_REG);
1995 /* set start channel, and rest of settings */
1996 writew(bits, priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
1998 uint8_t old_cal_range_bits = priv(dev)->i2c_cal_range_bits;
2000 priv(dev)->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2001 if (insn->chanspec & CR_ALT_SOURCE) {
2002 DEBUG_PRINT("reading calibration source\n");
2003 priv(dev)->i2c_cal_range_bits |=
2004 adc_src_4020_bits(priv(dev)->calibration_source);
2005 } else { /* select BNC inputs */
2006 priv(dev)->i2c_cal_range_bits |= adc_src_4020_bits(4);
2010 priv(dev)->i2c_cal_range_bits |= attenuate_bit(channel);
2012 priv(dev)->i2c_cal_range_bits &=
2013 ~attenuate_bit(channel);
2014 /* update calibration/range i2c register only if necessary, as it is very slow */
2015 if (old_cal_range_bits != priv(dev)->i2c_cal_range_bits) {
2016 uint8_t i2c_data = priv(dev)->i2c_cal_range_bits;
2017 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2021 /* 4020 manual asks that sample interval register to be set before writing to convert register.
2022 * Using somewhat arbitrary setting of 4 master clock ticks = 0.1 usec */
2024 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2026 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2029 for (n = 0; n < insn->n; n++) {
2031 /* clear adc buffer (inside loop for 4020 sake) */
2032 writew(0, priv(dev)->main_iobase + ADC_BUFFER_CLEAR_REG);
2034 /* trigger conversion, bits sent only matter for 4020 */
2035 writew(adc_convert_chan_4020_bits(CR_CHAN(insn->chanspec)),
2036 priv(dev)->main_iobase + ADC_CONVERT_REG);
2039 for (i = 0; i < timeout; i++) {
2040 bits = readw(priv(dev)->main_iobase + HW_STATUS_REG);
2041 DEBUG_PRINT(" pipe bits 0x%x\n", pipe_full_bits(bits));
2042 if (board(dev)->layout == LAYOUT_4020) {
2043 if (readw(priv(dev)->main_iobase +
2044 ADC_WRITE_PNTR_REG))
2047 if (pipe_full_bits(bits))
2052 DEBUG_PRINT(" looped %i times waiting for data\n", i);
2054 comedi_error(dev, " analog input read insn timed out");
2055 printk(" status 0x%x\n", bits);
2058 if (board(dev)->layout == LAYOUT_4020)
2060 readl(priv(dev)->dio_counter_iobase +
2061 ADC_FIFO_REG) & 0xffff;
2064 readw(priv(dev)->main_iobase + PIPE1_READ_REG);
2070 static int ai_config_calibration_source(struct comedi_device *dev,
2073 unsigned int source = data[1];
2074 int num_calibration_sources;
2076 if (board(dev)->layout == LAYOUT_60XX)
2077 num_calibration_sources = 16;
2079 num_calibration_sources = 8;
2080 if (source >= num_calibration_sources) {
2081 printk("invalid calibration source: %i\n", source);
2085 DEBUG_PRINT("setting calibration source to %i\n", source);
2086 priv(dev)->calibration_source = source;
2091 static int ai_config_block_size(struct comedi_device *dev, unsigned int *data)
2094 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
2095 unsigned int block_size, requested_block_size;
2098 requested_block_size = data[1];
2100 if (requested_block_size) {
2102 requested_block_size * fifo->num_segments / bytes_in_sample;
2104 retval = set_ai_fifo_size(dev, fifo_size);
2110 block_size = ai_fifo_size(dev) / fifo->num_segments * bytes_in_sample;
2112 data[1] = block_size;
2117 static int ai_config_master_clock_4020(struct comedi_device *dev,
2120 unsigned int divisor = data[4];
2129 case COMEDI_EV_SCAN_BEGIN:
2130 priv(dev)->ext_clock.divisor = divisor;
2131 priv(dev)->ext_clock.chanspec = data[2];
2140 return retval ? retval : 5;
2143 /* XXX could add support for 60xx series */
2144 static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data)
2147 switch (board(dev)->layout) {
2149 return ai_config_master_clock_4020(dev, data);
2159 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
2160 struct comedi_insn *insn, unsigned int *data)
2165 case INSN_CONFIG_ALT_SOURCE:
2166 return ai_config_calibration_source(dev, data);
2168 case INSN_CONFIG_BLOCK_SIZE:
2169 return ai_config_block_size(dev, data);
2171 case INSN_CONFIG_TIMER_1:
2172 return ai_config_master_clock(dev, data);
2181 static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2182 struct comedi_cmd *cmd)
2186 unsigned int tmp_arg, tmp_arg2;
2189 unsigned int triggers;
2191 /* step 1: make sure trigger sources are trivially valid */
2193 tmp = cmd->start_src;
2194 cmd->start_src &= TRIG_NOW | TRIG_EXT;
2195 if (!cmd->start_src || tmp != cmd->start_src)
2198 tmp = cmd->scan_begin_src;
2199 triggers = TRIG_TIMER;
2200 if (board(dev)->layout == LAYOUT_4020)
2201 triggers |= TRIG_OTHER;
2203 triggers |= TRIG_FOLLOW;
2204 cmd->scan_begin_src &= triggers;
2205 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
2208 tmp = cmd->convert_src;
2209 triggers = TRIG_TIMER;
2210 if (board(dev)->layout == LAYOUT_4020)
2211 triggers |= TRIG_NOW;
2213 triggers |= TRIG_EXT;
2214 cmd->convert_src &= triggers;
2215 if (!cmd->convert_src || tmp != cmd->convert_src)
2218 tmp = cmd->scan_end_src;
2219 cmd->scan_end_src &= TRIG_COUNT;
2220 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
2223 tmp = cmd->stop_src;
2224 cmd->stop_src &= TRIG_COUNT | TRIG_EXT | TRIG_NONE;
2225 if (!cmd->stop_src || tmp != cmd->stop_src)
2231 /* step 2: make sure trigger sources are unique and mutually compatible */
2233 /* uniqueness check */
2234 if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT)
2236 if (cmd->scan_begin_src != TRIG_TIMER &&
2237 cmd->scan_begin_src != TRIG_OTHER &&
2238 cmd->scan_begin_src != TRIG_FOLLOW)
2240 if (cmd->convert_src != TRIG_TIMER &&
2241 cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW)
2243 if (cmd->stop_src != TRIG_COUNT &&
2244 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
2247 /* compatibility check */
2248 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
2250 if (cmd->stop_src != TRIG_COUNT &&
2251 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
2257 /* step 3: make sure arguments are trivially compatible */
2259 if (cmd->convert_src == TRIG_TIMER) {
2260 if (board(dev)->layout == LAYOUT_4020) {
2261 if (cmd->convert_arg) {
2262 cmd->convert_arg = 0;
2266 if (cmd->convert_arg < board(dev)->ai_speed) {
2267 cmd->convert_arg = board(dev)->ai_speed;
2270 if (cmd->scan_begin_src == TRIG_TIMER) {
2271 /* if scans are timed faster than conversion rate allows */
2272 if (cmd->convert_arg * cmd->chanlist_len >
2273 cmd->scan_begin_arg) {
2274 cmd->scan_begin_arg =
2283 if (!cmd->chanlist_len) {
2284 cmd->chanlist_len = 1;
2287 if (cmd->scan_end_arg != cmd->chanlist_len) {
2288 cmd->scan_end_arg = cmd->chanlist_len;
2292 switch (cmd->stop_src) {
2296 if (!cmd->stop_arg) {
2302 if (cmd->stop_arg != 0) {
2314 /* step 4: fix up any arguments */
2316 if (cmd->convert_src == TRIG_TIMER) {
2317 tmp_arg = cmd->convert_arg;
2318 tmp_arg2 = cmd->scan_begin_arg;
2319 check_adc_timing(dev, cmd);
2320 if (tmp_arg != cmd->convert_arg)
2322 if (tmp_arg2 != cmd->scan_begin_arg)
2329 /* make sure user is doesn't change analog reference mid chanlist */
2330 if (cmd->chanlist) {
2331 aref = CR_AREF(cmd->chanlist[0]);
2332 for (i = 1; i < cmd->chanlist_len; i++) {
2333 if (aref != CR_AREF(cmd->chanlist[i])) {
2335 "all elements in chanlist must use the same analog reference");
2340 /* check 4020 chanlist */
2341 if (board(dev)->layout == LAYOUT_4020) {
2342 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
2343 for (i = 1; i < cmd->chanlist_len; i++) {
2344 if (CR_CHAN(cmd->chanlist[i]) !=
2345 first_channel + i) {
2347 "chanlist must use consecutive channels");
2352 if (cmd->chanlist_len == 3) {
2354 "chanlist cannot be 3 channels long, use 1, 2, or 4 channels");
2366 static int use_hw_sample_counter(struct comedi_cmd *cmd)
2368 /* disable for now until I work out a race */
2371 if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value)
2377 static void setup_sample_counters(struct comedi_device *dev,
2378 struct comedi_cmd *cmd)
2380 if (cmd->stop_src == TRIG_COUNT) {
2381 /* set software count */
2382 priv(dev)->ai_count = cmd->stop_arg * cmd->chanlist_len;
2384 /* load hardware conversion counter */
2385 if (use_hw_sample_counter(cmd)) {
2386 writew(cmd->stop_arg & 0xffff,
2387 priv(dev)->main_iobase + ADC_COUNT_LOWER_REG);
2388 writew((cmd->stop_arg >> 16) & 0xff,
2389 priv(dev)->main_iobase + ADC_COUNT_UPPER_REG);
2391 writew(1, priv(dev)->main_iobase + ADC_COUNT_LOWER_REG);
2395 static inline unsigned int dma_transfer_size(struct comedi_device *dev)
2397 unsigned int num_samples;
2400 priv(dev)->ai_fifo_segment_length *
2401 board(dev)->ai_fifo->sample_packing_ratio;
2402 if (num_samples > DMA_BUFFER_SIZE / sizeof(uint16_t))
2403 num_samples = DMA_BUFFER_SIZE / sizeof(uint16_t);
2408 static void disable_ai_pacing(struct comedi_device *dev)
2410 unsigned long flags;
2412 disable_ai_interrupts(dev);
2414 spin_lock_irqsave(&dev->spinlock, flags);
2415 priv(dev)->adc_control1_bits &= ~ADC_SW_GATE_BIT;
2416 writew(priv(dev)->adc_control1_bits,
2417 priv(dev)->main_iobase + ADC_CONTROL1_REG);
2418 spin_unlock_irqrestore(&dev->spinlock, flags);
2420 /* disable pacing, triggering, etc */
2421 writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
2422 priv(dev)->main_iobase + ADC_CONTROL0_REG);
2425 static void disable_ai_interrupts(struct comedi_device *dev)
2427 unsigned long flags;
2429 spin_lock_irqsave(&dev->spinlock, flags);
2430 priv(dev)->intr_enable_bits &=
2431 ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
2432 ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
2433 ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
2434 writew(priv(dev)->intr_enable_bits,
2435 priv(dev)->main_iobase + INTR_ENABLE_REG);
2436 spin_unlock_irqrestore(&dev->spinlock, flags);
2438 DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev)->intr_enable_bits);
2441 static void enable_ai_interrupts(struct comedi_device *dev,
2442 const struct comedi_cmd *cmd)
2445 unsigned long flags;
2447 bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
2448 EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
2449 /* Use pio transfer and interrupt on end of conversion if TRIG_WAKE_EOS flag is set. */
2450 if (cmd->flags & TRIG_WAKE_EOS) {
2451 /* 4020 doesn't support pio transfers except for fifo dregs */
2452 if (board(dev)->layout != LAYOUT_4020)
2453 bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
2455 spin_lock_irqsave(&dev->spinlock, flags);
2456 priv(dev)->intr_enable_bits |= bits;
2457 writew(priv(dev)->intr_enable_bits,
2458 priv(dev)->main_iobase + INTR_ENABLE_REG);
2459 DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev)->intr_enable_bits);
2460 spin_unlock_irqrestore(&dev->spinlock, flags);
2463 static uint32_t ai_convert_counter_6xxx(const struct comedi_device *dev,
2464 const struct comedi_cmd *cmd)
2466 /* supposed to load counter with desired divisor minus 3 */
2467 return cmd->convert_arg / TIMER_BASE - 3;
2470 static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev,
2471 struct comedi_cmd *cmd)
2474 /* figure out how long we need to delay at end of scan */
2475 switch (cmd->scan_begin_src) {
2477 count = (cmd->scan_begin_arg -
2478 (cmd->convert_arg * (cmd->chanlist_len - 1)))
2482 count = cmd->convert_arg / TIMER_BASE;
2491 static uint32_t ai_convert_counter_4020(struct comedi_device *dev,
2492 struct comedi_cmd *cmd)
2494 unsigned int divisor;
2496 switch (cmd->scan_begin_src) {
2498 divisor = cmd->scan_begin_arg / TIMER_BASE;
2501 divisor = priv(dev)->ext_clock.divisor;
2503 default: /* should never happen */
2504 comedi_error(dev, "bug! failed to set ai pacing!");
2509 /* supposed to load counter with desired divisor minus 2 for 4020 */
2513 static void select_master_clock_4020(struct comedi_device *dev,
2514 const struct comedi_cmd *cmd)
2516 /* select internal/external master clock */
2517 priv(dev)->hw_config_bits &= ~MASTER_CLOCK_4020_MASK;
2518 if (cmd->scan_begin_src == TRIG_OTHER) {
2519 int chanspec = priv(dev)->ext_clock.chanspec;
2521 if (CR_CHAN(chanspec))
2522 priv(dev)->hw_config_bits |= BNC_CLOCK_4020_BITS;
2524 priv(dev)->hw_config_bits |= EXT_CLOCK_4020_BITS;
2526 priv(dev)->hw_config_bits |= INTERNAL_CLOCK_4020_BITS;
2528 writew(priv(dev)->hw_config_bits,
2529 priv(dev)->main_iobase + HW_CONFIG_REG);
2532 static void select_master_clock(struct comedi_device *dev,
2533 const struct comedi_cmd *cmd)
2535 switch (board(dev)->layout) {
2537 select_master_clock_4020(dev, cmd);
2544 static inline void dma_start_sync(struct comedi_device *dev,
2545 unsigned int channel)
2547 unsigned long flags;
2549 /* spinlock for plx dma control/status reg */
2550 spin_lock_irqsave(&dev->spinlock, flags);
2552 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2553 PLX_CLEAR_DMA_INTR_BIT,
2554 priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
2556 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2557 PLX_CLEAR_DMA_INTR_BIT,
2558 priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
2559 spin_unlock_irqrestore(&dev->spinlock, flags);
2562 static void set_ai_pacing(struct comedi_device *dev, struct comedi_cmd *cmd)
2564 uint32_t convert_counter = 0, scan_counter = 0;
2566 check_adc_timing(dev, cmd);
2568 select_master_clock(dev, cmd);
2570 if (board(dev)->layout == LAYOUT_4020) {
2571 convert_counter = ai_convert_counter_4020(dev, cmd);
2573 convert_counter = ai_convert_counter_6xxx(dev, cmd);
2574 scan_counter = ai_scan_counter_6xxx(dev, cmd);
2577 /* load lower 16 bits of convert interval */
2578 writew(convert_counter & 0xffff,
2579 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2580 DEBUG_PRINT("convert counter 0x%x\n", convert_counter);
2581 /* load upper 8 bits of convert interval */
2582 writew((convert_counter >> 16) & 0xff,
2583 priv(dev)->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2584 /* load lower 16 bits of scan delay */
2585 writew(scan_counter & 0xffff,
2586 priv(dev)->main_iobase + ADC_DELAY_INTERVAL_LOWER_REG);
2587 /* load upper 8 bits of scan delay */
2588 writew((scan_counter >> 16) & 0xff,
2589 priv(dev)->main_iobase + ADC_DELAY_INTERVAL_UPPER_REG);
2590 DEBUG_PRINT("scan counter 0x%x\n", scan_counter);
2593 static int use_internal_queue_6xxx(const struct comedi_cmd *cmd)
2596 for (i = 0; i + 1 < cmd->chanlist_len; i++) {
2597 if (CR_CHAN(cmd->chanlist[i + 1]) !=
2598 CR_CHAN(cmd->chanlist[i]) + 1)
2600 if (CR_RANGE(cmd->chanlist[i + 1]) !=
2601 CR_RANGE(cmd->chanlist[i]))
2603 if (CR_AREF(cmd->chanlist[i + 1]) != CR_AREF(cmd->chanlist[i]))
2609 static int setup_channel_queue(struct comedi_device *dev,
2610 const struct comedi_cmd *cmd)
2612 unsigned short bits;
2615 if (board(dev)->layout != LAYOUT_4020) {
2616 if (use_internal_queue_6xxx(cmd)) {
2617 priv(dev)->hw_config_bits &= ~EXT_QUEUE_BIT;
2618 writew(priv(dev)->hw_config_bits,
2619 priv(dev)->main_iobase + HW_CONFIG_REG);
2622 bits |= adc_chan_bits(CR_CHAN(cmd->chanlist[0]));
2624 bits |= ai_range_bits_6xxx(dev,
2625 CR_RANGE(cmd->chanlist[0]));
2626 /* set single-ended / differential */
2627 bits |= se_diff_bit_6xxx(dev,
2628 CR_AREF(cmd->chanlist[0]) ==
2630 if (CR_AREF(cmd->chanlist[0]) == AREF_COMMON)
2631 bits |= ADC_COMMON_BIT;
2632 /* set stop channel */
2633 writew(adc_chan_bits
2634 (CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])),
2635 priv(dev)->main_iobase + ADC_QUEUE_HIGH_REG);
2636 /* set start channel, and rest of settings */
2638 priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
2640 /* use external queue */
2641 if (dev->write_subdev && dev->write_subdev->busy) {
2642 warn_external_queue(dev);
2645 priv(dev)->hw_config_bits |= EXT_QUEUE_BIT;
2646 writew(priv(dev)->hw_config_bits,
2647 priv(dev)->main_iobase + HW_CONFIG_REG);
2648 /* clear DAC buffer to prevent weird interactions */
2650 priv(dev)->main_iobase + DAC_BUFFER_CLEAR_REG);
2651 /* clear queue pointer */
2652 writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
2653 /* load external queue */
2654 for (i = 0; i < cmd->chanlist_len; i++) {
2658 adc_chan_bits(CR_CHAN(cmd->chanlist[i]));
2660 bits |= ai_range_bits_6xxx(dev,
2664 /* set single-ended / differential */
2665 bits |= se_diff_bit_6xxx(dev,
2669 if (CR_AREF(cmd->chanlist[i]) == AREF_COMMON)
2670 bits |= ADC_COMMON_BIT;
2671 /* mark end of queue */
2672 if (i == cmd->chanlist_len - 1)
2673 bits |= QUEUE_EOSCAN_BIT |
2676 priv(dev)->main_iobase +
2677 ADC_QUEUE_FIFO_REG);
2679 ("wrote 0x%x to external channel queue\n",
2682 /* doing a queue clear is not specified in board docs,
2683 * but required for reliable operation */
2684 writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
2685 /* prime queue holding register */
2686 writew(0, priv(dev)->main_iobase + ADC_QUEUE_LOAD_REG);
2689 unsigned short old_cal_range_bits =
2690 priv(dev)->i2c_cal_range_bits;
2692 priv(dev)->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2693 /* select BNC inputs */
2694 priv(dev)->i2c_cal_range_bits |= adc_src_4020_bits(4);
2696 for (i = 0; i < cmd->chanlist_len; i++) {
2697 unsigned int channel = CR_CHAN(cmd->chanlist[i]);
2698 unsigned int range = CR_RANGE(cmd->chanlist[i]);
2701 priv(dev)->i2c_cal_range_bits |=
2702 attenuate_bit(channel);
2704 priv(dev)->i2c_cal_range_bits &=
2705 ~attenuate_bit(channel);
2707 /* update calibration/range i2c register only if necessary, as it is very slow */
2708 if (old_cal_range_bits != priv(dev)->i2c_cal_range_bits) {
2709 uint8_t i2c_data = priv(dev)->i2c_cal_range_bits;
2710 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2717 static inline void load_first_dma_descriptor(struct comedi_device *dev,
2718 unsigned int dma_channel,
2719 unsigned int descriptor_bits)
2721 /* The transfer size, pci address, and local address registers
2722 * are supposedly unused during chained dma,
2723 * but I have found that left over values from last operation
2724 * occasionally cause problems with transfer of first dma
2725 * block. Initializing them to zero seems to fix the problem. */
2728 priv(dev)->plx9080_iobase + PLX_DMA1_TRANSFER_SIZE_REG);
2729 writel(0, priv(dev)->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG);
2731 priv(dev)->plx9080_iobase + PLX_DMA1_LOCAL_ADDRESS_REG);
2732 writel(descriptor_bits,
2733 priv(dev)->plx9080_iobase + PLX_DMA1_DESCRIPTOR_REG);
2736 priv(dev)->plx9080_iobase + PLX_DMA0_TRANSFER_SIZE_REG);
2737 writel(0, priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2739 priv(dev)->plx9080_iobase + PLX_DMA0_LOCAL_ADDRESS_REG);
2740 writel(descriptor_bits,
2741 priv(dev)->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2745 static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2747 struct comedi_async *async = s->async;
2748 struct comedi_cmd *cmd = &async->cmd;
2751 unsigned long flags;
2754 disable_ai_pacing(dev);
2757 retval = setup_channel_queue(dev, cmd);
2761 /* make sure internal calibration source is turned off */
2762 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
2764 set_ai_pacing(dev, cmd);
2766 setup_sample_counters(dev, cmd);
2768 enable_ai_interrupts(dev, cmd);
2770 spin_lock_irqsave(&dev->spinlock, flags);
2771 /* set mode, allow conversions through software gate */
2772 priv(dev)->adc_control1_bits |= ADC_SW_GATE_BIT;
2773 priv(dev)->adc_control1_bits &= ~ADC_DITHER_BIT;
2774 if (board(dev)->layout != LAYOUT_4020) {
2775 priv(dev)->adc_control1_bits &= ~ADC_MODE_MASK;
2776 if (cmd->convert_src == TRIG_EXT)
2777 priv(dev)->adc_control1_bits |= adc_mode_bits(13); /* good old mode 13 */
2779 priv(dev)->adc_control1_bits |= adc_mode_bits(8); /* mode 8. What else could you need? */
2781 priv(dev)->adc_control1_bits &= ~CHANNEL_MODE_4020_MASK;
2782 if (cmd->chanlist_len == 4)
2783 priv(dev)->adc_control1_bits |= FOUR_CHANNEL_4020_BITS;
2784 else if (cmd->chanlist_len == 2)
2785 priv(dev)->adc_control1_bits |= TWO_CHANNEL_4020_BITS;
2786 priv(dev)->adc_control1_bits &= ~ADC_LO_CHANNEL_4020_MASK;
2787 priv(dev)->adc_control1_bits |=
2788 adc_lo_chan_4020_bits(CR_CHAN(cmd->chanlist[0]));
2789 priv(dev)->adc_control1_bits &= ~ADC_HI_CHANNEL_4020_MASK;
2790 priv(dev)->adc_control1_bits |=
2791 adc_hi_chan_4020_bits(CR_CHAN
2793 chanlist[cmd->chanlist_len - 1]));
2795 writew(priv(dev)->adc_control1_bits,
2796 priv(dev)->main_iobase + ADC_CONTROL1_REG);
2797 DEBUG_PRINT("control1 bits 0x%x\n", priv(dev)->adc_control1_bits);
2798 spin_unlock_irqrestore(&dev->spinlock, flags);
2800 /* clear adc buffer */
2801 writew(0, priv(dev)->main_iobase + ADC_BUFFER_CLEAR_REG);
2803 if ((cmd->flags & TRIG_WAKE_EOS) == 0 ||
2804 board(dev)->layout == LAYOUT_4020) {
2805 priv(dev)->ai_dma_index = 0;
2807 /* set dma transfer size */
2808 for (i = 0; i < ai_dma_ring_count(board(dev)); i++)
2809 priv(dev)->ai_dma_desc[i].transfer_size =
2810 cpu_to_le32(dma_transfer_size(dev) *
2813 /* give location of first dma descriptor */
2814 load_first_dma_descriptor(dev, 1,
2815 priv(dev)->ai_dma_desc_bus_addr |
2816 PLX_DESC_IN_PCI_BIT |
2817 PLX_INTR_TERM_COUNT |
2818 PLX_XFER_LOCAL_TO_PCI);
2820 dma_start_sync(dev, 1);
2823 if (board(dev)->layout == LAYOUT_4020) {
2824 /* set source for external triggers */
2826 if (cmd->start_src == TRIG_EXT && CR_CHAN(cmd->start_arg))
2827 bits |= EXT_START_TRIG_BNC_BIT;
2828 if (cmd->stop_src == TRIG_EXT && CR_CHAN(cmd->stop_arg))
2829 bits |= EXT_STOP_TRIG_BNC_BIT;
2830 writew(bits, priv(dev)->main_iobase + DAQ_ATRIG_LOW_4020_REG);
2833 spin_lock_irqsave(&dev->spinlock, flags);
2835 /* enable pacing, triggering, etc */
2836 bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
2837 if (cmd->flags & TRIG_WAKE_EOS)
2838 bits |= ADC_DMA_DISABLE_BIT;
2839 /* set start trigger */
2840 if (cmd->start_src == TRIG_EXT) {
2841 bits |= ADC_START_TRIG_EXT_BITS;
2842 if (cmd->start_arg & CR_INVERT)
2843 bits |= ADC_START_TRIG_FALLING_BIT;
2844 } else if (cmd->start_src == TRIG_NOW)
2845 bits |= ADC_START_TRIG_SOFT_BITS;
2846 if (use_hw_sample_counter(cmd))
2847 bits |= ADC_SAMPLE_COUNTER_EN_BIT;
2848 writew(bits, priv(dev)->main_iobase + ADC_CONTROL0_REG);
2849 DEBUG_PRINT("control0 bits 0x%x\n", bits);
2851 priv(dev)->ai_cmd_running = 1;
2853 spin_unlock_irqrestore(&dev->spinlock, flags);
2855 /* start aquisition */
2856 if (cmd->start_src == TRIG_NOW) {
2857 writew(0, priv(dev)->main_iobase + ADC_START_REG);
2858 DEBUG_PRINT("soft trig\n");
2864 /* read num_samples from 16 bit wide ai fifo */
2865 static void pio_drain_ai_fifo_16(struct comedi_device *dev)
2867 struct comedi_subdevice *s = dev->read_subdev;
2868 struct comedi_async *async = s->async;
2869 struct comedi_cmd *cmd = &async->cmd;
2871 uint16_t prepost_bits;
2872 int read_segment, read_index, write_segment, write_index;
2876 /* get least significant 15 bits */
2878 readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2880 readw(priv(dev)->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2881 /* Get most significant bits (grey code). Different boards use different code
2882 * so use a scheme that doesn't depend on encoding. This read must
2883 * occur after reading least significant 15 bits to avoid race
2884 * with fifo switching to next segment. */
2885 prepost_bits = readw(priv(dev)->main_iobase + PREPOST_REG);
2887 /* if read and write pointers are not on the same fifo segment, read to the
2888 * end of the read segment */
2889 read_segment = adc_upper_read_ptr_code(prepost_bits);
2890 write_segment = adc_upper_write_ptr_code(prepost_bits);
2892 DEBUG_PRINT(" rd seg %i, wrt seg %i, rd idx %i, wrt idx %i\n",
2893 read_segment, write_segment, read_index,
2896 if (read_segment != write_segment)
2898 priv(dev)->ai_fifo_segment_length - read_index;
2900 num_samples = write_index - read_index;
2902 if (cmd->stop_src == TRIG_COUNT) {
2903 if (priv(dev)->ai_count == 0)
2905 if (num_samples > priv(dev)->ai_count) {
2906 num_samples = priv(dev)->ai_count;
2908 priv(dev)->ai_count -= num_samples;
2911 if (num_samples < 0) {
2912 printk(" cb_pcidas64: bug! num_samples < 0\n");
2916 DEBUG_PRINT(" read %i samples from fifo\n", num_samples);
2918 for (i = 0; i < num_samples; i++) {
2919 cfc_write_to_buffer(s,
2920 readw(priv(dev)->main_iobase +
2924 } while (read_segment != write_segment);
2927 /* Read from 32 bit wide ai fifo of 4020 - deal with insane grey coding of pointers.
2928 * The pci-4020 hardware only supports
2929 * dma transfers (it only supports the use of pio for draining the last remaining
2930 * points from the fifo when a data aquisition operation has completed).
2932 static void pio_drain_ai_fifo_32(struct comedi_device *dev)
2934 struct comedi_subdevice *s = dev->read_subdev;
2935 struct comedi_async *async = s->async;
2936 struct comedi_cmd *cmd = &async->cmd;
2938 unsigned int max_transfer = 100000;
2941 readw(priv(dev)->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2943 readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2945 if (cmd->stop_src == TRIG_COUNT) {
2946 if (max_transfer > priv(dev)->ai_count) {
2947 max_transfer = priv(dev)->ai_count;
2950 for (i = 0; read_code != write_code && i < max_transfer;) {
2951 fifo_data = readl(priv(dev)->dio_counter_iobase + ADC_FIFO_REG);
2952 cfc_write_to_buffer(s, fifo_data & 0xffff);
2954 if (i < max_transfer) {
2955 cfc_write_to_buffer(s, (fifo_data >> 16) & 0xffff);
2959 readw(priv(dev)->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2961 priv(dev)->ai_count -= i;
2965 static void pio_drain_ai_fifo(struct comedi_device *dev)
2967 if (board(dev)->layout == LAYOUT_4020) {
2968 pio_drain_ai_fifo_32(dev);
2970 pio_drain_ai_fifo_16(dev);
2973 static void drain_dma_buffers(struct comedi_device *dev, unsigned int channel)
2975 struct comedi_async *async = dev->read_subdev->async;
2976 uint32_t next_transfer_addr;
2978 int num_samples = 0;
2983 priv(dev)->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG;
2986 priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2988 /* loop until we have read all the full buffers */
2989 for (j = 0, next_transfer_addr = readl(pci_addr_reg);
2990 (next_transfer_addr <
2991 priv(dev)->ai_buffer_bus_addr[priv(dev)->ai_dma_index]
2992 || next_transfer_addr >=
2993 priv(dev)->ai_buffer_bus_addr[priv(dev)->ai_dma_index] +
2994 DMA_BUFFER_SIZE) && j < ai_dma_ring_count(board(dev)); j++) {
2995 /* transfer data from dma buffer to comedi buffer */
2996 num_samples = dma_transfer_size(dev);
2997 if (async->cmd.stop_src == TRIG_COUNT) {
2998 if (num_samples > priv(dev)->ai_count)
2999 num_samples = priv(dev)->ai_count;
3000 priv(dev)->ai_count -= num_samples;
3002 cfc_write_array_to_buffer(dev->read_subdev,
3003 priv(dev)->ai_buffer[priv(dev)->
3005 num_samples * sizeof(uint16_t));
3006 priv(dev)->ai_dma_index =
3007 (priv(dev)->ai_dma_index +
3008 1) % ai_dma_ring_count(board(dev));
3010 DEBUG_PRINT("next buffer addr 0x%lx\n",
3011 (unsigned long)priv(dev)->
3012 ai_buffer_bus_addr[priv(dev)->ai_dma_index]);
3013 DEBUG_PRINT("pci addr reg 0x%x\n", next_transfer_addr);
3015 /* XXX check for dma ring buffer overrun (use end-of-chain bit to mark last
3019 void handle_ai_interrupt(struct comedi_device *dev, unsigned short status,
3020 unsigned int plx_status)
3022 struct comedi_subdevice *s = dev->read_subdev;
3023 struct comedi_async *async = s->async;
3024 struct comedi_cmd *cmd = &async->cmd;
3025 uint8_t dma1_status;
3026 unsigned long flags;
3028 /* check for fifo overrun */
3029 if (status & ADC_OVERRUN_BIT) {
3030 comedi_error(dev, "fifo overrun");
3031 async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
3033 /* spin lock makes sure noone else changes plx dma control reg */
3034 spin_lock_irqsave(&dev->spinlock, flags);
3035 dma1_status = readb(priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
3036 if (plx_status & ICS_DMA1_A) { /* dma chan 1 interrupt */
3037 writeb((dma1_status & PLX_DMA_EN_BIT) | PLX_CLEAR_DMA_INTR_BIT,
3038 priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG);
3039 DEBUG_PRINT("dma1 status 0x%x\n", dma1_status);
3041 if (dma1_status & PLX_DMA_EN_BIT) {
3042 drain_dma_buffers(dev, 1);
3044 DEBUG_PRINT(" cleared dma ch1 interrupt\n");
3046 spin_unlock_irqrestore(&dev->spinlock, flags);
3048 if (status & ADC_DONE_BIT)
3049 DEBUG_PRINT("adc done interrupt\n");
3051 /* drain fifo with pio */
3052 if ((status & ADC_DONE_BIT) ||
3053 ((cmd->flags & TRIG_WAKE_EOS) &&
3054 (status & ADC_INTR_PENDING_BIT) &&
3055 (board(dev)->layout != LAYOUT_4020))) {
3056 DEBUG_PRINT("pio fifo drain\n");
3057 spin_lock_irqsave(&dev->spinlock, flags);
3058 if (priv(dev)->ai_cmd_running) {
3059 spin_unlock_irqrestore(&dev->spinlock, flags);
3060 pio_drain_ai_fifo(dev);
3062 spin_unlock_irqrestore(&dev->spinlock, flags);
3064 /* if we are have all the data, then quit */
3065 if ((cmd->stop_src == TRIG_COUNT && priv(dev)->ai_count <= 0) ||
3066 (cmd->stop_src == TRIG_EXT && (status & ADC_STOP_BIT))) {
3067 async->events |= COMEDI_CB_EOA;
3070 cfc_handle_events(dev, s);
3073 static inline unsigned int prev_ao_dma_index(struct comedi_device *dev)
3075 unsigned int buffer_index;
3077 if (priv(dev)->ao_dma_index == 0)
3078 buffer_index = AO_DMA_RING_COUNT - 1;
3080 buffer_index = priv(dev)->ao_dma_index - 1;
3081 return buffer_index;
3084 static int last_ao_dma_load_completed(struct comedi_device *dev)
3086 unsigned int buffer_index;
3087 unsigned int transfer_address;
3088 unsigned short dma_status;
3090 buffer_index = prev_ao_dma_index(dev);
3091 dma_status = readb(priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3092 if ((dma_status & PLX_DMA_DONE_BIT) == 0)
3096 readl(priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
3097 if (transfer_address != priv(dev)->ao_buffer_bus_addr[buffer_index])
3103 static int ao_stopped_by_error(struct comedi_device *dev,
3104 const struct comedi_cmd *cmd)
3106 if (cmd->stop_src == TRIG_NONE)
3108 if (cmd->stop_src == TRIG_COUNT) {
3109 if (priv(dev)->ao_count)
3111 if (last_ao_dma_load_completed(dev) == 0)
3117 static inline int ao_dma_needs_restart(struct comedi_device *dev,
3118 unsigned short dma_status)
3120 if ((dma_status & PLX_DMA_DONE_BIT) == 0 ||
3121 (dma_status & PLX_DMA_EN_BIT) == 0)
3123 if (last_ao_dma_load_completed(dev))
3129 static void restart_ao_dma(struct comedi_device *dev)
3131 unsigned int dma_desc_bits;
3134 readl(priv(dev)->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
3135 dma_desc_bits &= ~PLX_END_OF_CHAIN_BIT;
3136 DEBUG_PRINT("restarting ao dma, descriptor reg 0x%x\n", dma_desc_bits);
3137 load_first_dma_descriptor(dev, 0, dma_desc_bits);
3139 dma_start_sync(dev, 0);
3142 static void handle_ao_interrupt(struct comedi_device *dev,
3143 unsigned short status, unsigned int plx_status)
3145 struct comedi_subdevice *s = dev->write_subdev;
3146 struct comedi_async *async;
3147 struct comedi_cmd *cmd;
3148 uint8_t dma0_status;
3149 unsigned long flags;
3151 /* board might not support ao, in which case write_subdev is NULL */
3157 /* spin lock makes sure noone else changes plx dma control reg */
3158 spin_lock_irqsave(&dev->spinlock, flags);
3159 dma0_status = readb(priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3160 if (plx_status & ICS_DMA0_A) { /* dma chan 0 interrupt */
3161 if ((dma0_status & PLX_DMA_EN_BIT)
3162 && !(dma0_status & PLX_DMA_DONE_BIT))
3163 writeb(PLX_DMA_EN_BIT | PLX_CLEAR_DMA_INTR_BIT,
3164 priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3166 writeb(PLX_CLEAR_DMA_INTR_BIT,
3167 priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG);
3168 spin_unlock_irqrestore(&dev->spinlock, flags);
3169 DEBUG_PRINT("dma0 status 0x%x\n", dma0_status);
3170 if (dma0_status & PLX_DMA_EN_BIT) {
3171 load_ao_dma(dev, cmd);
3172 /* try to recover from dma end-of-chain event */
3173 if (ao_dma_needs_restart(dev, dma0_status))
3174 restart_ao_dma(dev);
3176 DEBUG_PRINT(" cleared dma ch0 interrupt\n");
3178 spin_unlock_irqrestore(&dev->spinlock, flags);
3180 if ((status & DAC_DONE_BIT)) {
3181 async->events |= COMEDI_CB_EOA;
3182 if (ao_stopped_by_error(dev, cmd))
3183 async->events |= COMEDI_CB_ERROR;
3184 DEBUG_PRINT("plx dma0 desc reg 0x%x\n",
3185 readl(priv(dev)->plx9080_iobase +
3186 PLX_DMA0_DESCRIPTOR_REG));
3187 DEBUG_PRINT("plx dma0 address reg 0x%x\n",
3188 readl(priv(dev)->plx9080_iobase +
3189 PLX_DMA0_PCI_ADDRESS_REG));
3191 cfc_handle_events(dev, s);
3194 static irqreturn_t handle_interrupt(int irq, void *d)
3196 struct comedi_device *dev = d;
3197 unsigned short status;
3198 uint32_t plx_status;
3201 plx_status = readl(priv(dev)->plx9080_iobase + PLX_INTRCS_REG);
3202 status = readw(priv(dev)->main_iobase + HW_STATUS_REG);
3204 DEBUG_PRINT("cb_pcidas64: hw status 0x%x ", status);
3205 DEBUG_PRINT("plx status 0x%x\n", plx_status);
3207 /* an interrupt before all the postconfig stuff gets done could
3208 * cause a NULL dereference if we continue through the
3209 * interrupt handler */
3210 if (dev->attached == 0) {
3211 DEBUG_PRINT("cb_pcidas64: premature interrupt, ignoring",
3215 handle_ai_interrupt(dev, status, plx_status);
3216 handle_ao_interrupt(dev, status, plx_status);
3218 /* clear possible plx9080 interrupt sources */
3219 if (plx_status & ICS_LDIA) { /* clear local doorbell interrupt */
3220 plx_bits = readl(priv(dev)->plx9080_iobase + PLX_DBR_OUT_REG);
3221 writel(plx_bits, priv(dev)->plx9080_iobase + PLX_DBR_OUT_REG);
3222 DEBUG_PRINT(" cleared local doorbell bits 0x%x\n", plx_bits);
3225 DEBUG_PRINT("exiting handler\n");
3230 void abort_dma(struct comedi_device *dev, unsigned int channel)
3232 unsigned long flags;
3234 /* spinlock for plx dma control/status reg */
3235 spin_lock_irqsave(&dev->spinlock, flags);
3237 plx9080_abort_dma(priv(dev)->plx9080_iobase, channel);
3239 spin_unlock_irqrestore(&dev->spinlock, flags);
3242 static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3244 unsigned long flags;
3246 spin_lock_irqsave(&dev->spinlock, flags);
3247 if (priv(dev)->ai_cmd_running == 0) {
3248 spin_unlock_irqrestore(&dev->spinlock, flags);
3251 priv(dev)->ai_cmd_running = 0;
3252 spin_unlock_irqrestore(&dev->spinlock, flags);
3254 disable_ai_pacing(dev);
3258 DEBUG_PRINT("ai canceled\n");
3262 static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3263 struct comedi_insn *insn, unsigned int *data)
3265 int chan = CR_CHAN(insn->chanspec);
3266 int range = CR_RANGE(insn->chanspec);
3268 /* do some initializing */
3269 writew(0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3272 set_dac_range_bits(dev, &priv(dev)->dac_control1_bits, chan, range);
3273 writew(priv(dev)->dac_control1_bits,
3274 priv(dev)->main_iobase + DAC_CONTROL1_REG);
3276 /* write to channel */
3277 if (board(dev)->layout == LAYOUT_4020) {
3278 writew(data[0] & 0xff,
3279 priv(dev)->main_iobase + dac_lsb_4020_reg(chan));
3280 writew((data[0] >> 8) & 0xf,
3281 priv(dev)->main_iobase + dac_msb_4020_reg(chan));
3283 writew(data[0], priv(dev)->main_iobase + dac_convert_reg(chan));
3286 /* remember output value */
3287 priv(dev)->ao_value[chan] = data[0];
3292 static int ao_readback_insn(struct comedi_device *dev,
3293 struct comedi_subdevice *s,
3294 struct comedi_insn *insn, unsigned int *data)
3296 data[0] = priv(dev)->ao_value[CR_CHAN(insn->chanspec)];
3301 static void set_dac_control0_reg(struct comedi_device *dev,
3302 const struct comedi_cmd *cmd)
3304 unsigned int bits = DAC_ENABLE_BIT | WAVEFORM_GATE_LEVEL_BIT |
3305 WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_BIT;
3307 if (cmd->start_src == TRIG_EXT) {
3308 bits |= WAVEFORM_TRIG_EXT_BITS;
3309 if (cmd->start_arg & CR_INVERT)
3310 bits |= WAVEFORM_TRIG_FALLING_BIT;
3312 bits |= WAVEFORM_TRIG_SOFT_BITS;
3314 if (cmd->scan_begin_src == TRIG_EXT) {
3315 bits |= DAC_EXT_UPDATE_ENABLE_BIT;
3316 if (cmd->scan_begin_arg & CR_INVERT)
3317 bits |= DAC_EXT_UPDATE_FALLING_BIT;
3319 writew(bits, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3322 static void set_dac_control1_reg(struct comedi_device *dev,
3323 const struct comedi_cmd *cmd)
3327 for (i = 0; i < cmd->chanlist_len; i++) {
3330 channel = CR_CHAN(cmd->chanlist[i]);
3331 range = CR_RANGE(cmd->chanlist[i]);
3332 set_dac_range_bits(dev, &priv(dev)->dac_control1_bits, channel,
3335 priv(dev)->dac_control1_bits |= DAC_SW_GATE_BIT;
3336 writew(priv(dev)->dac_control1_bits,
3337 priv(dev)->main_iobase + DAC_CONTROL1_REG);
3340 static void set_dac_select_reg(struct comedi_device *dev,
3341 const struct comedi_cmd *cmd)
3344 unsigned int first_channel, last_channel;
3346 first_channel = CR_CHAN(cmd->chanlist[0]);
3347 last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
3348 if (last_channel < first_channel)
3349 comedi_error(dev, "bug! last ao channel < first ao channel");
3351 bits = (first_channel & 0x7) | (last_channel & 0x7) << 3;
3353 writew(bits, priv(dev)->main_iobase + DAC_SELECT_REG);
3356 static void set_dac_interval_regs(struct comedi_device *dev,
3357 const struct comedi_cmd *cmd)
3359 unsigned int divisor;
3361 if (cmd->scan_begin_src != TRIG_TIMER)
3364 divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags);
3365 if (divisor > max_counter_value) {
3366 comedi_error(dev, "bug! ao divisor too big");
3367 divisor = max_counter_value;
3369 writew(divisor & 0xffff,
3370 priv(dev)->main_iobase + DAC_SAMPLE_INTERVAL_LOWER_REG);
3371 writew((divisor >> 16) & 0xff,
3372 priv(dev)->main_iobase + DAC_SAMPLE_INTERVAL_UPPER_REG);
3375 static unsigned int load_ao_dma_buffer(struct comedi_device *dev,
3376 const struct comedi_cmd *cmd)
3378 unsigned int num_bytes, buffer_index, prev_buffer_index;
3379 unsigned int next_bits;
3381 buffer_index = priv(dev)->ao_dma_index;
3382 prev_buffer_index = prev_ao_dma_index(dev);
3384 DEBUG_PRINT("attempting to load ao buffer %i (0x%x)\n", buffer_index,
3385 priv(dev)->ao_buffer_bus_addr[buffer_index]);
3387 num_bytes = comedi_buf_read_n_available(dev->write_subdev->async);
3388 if (num_bytes > DMA_BUFFER_SIZE)
3389 num_bytes = DMA_BUFFER_SIZE;
3390 if (cmd->stop_src == TRIG_COUNT && num_bytes > priv(dev)->ao_count)
3391 num_bytes = priv(dev)->ao_count;
3392 num_bytes -= num_bytes % bytes_in_sample;
3397 DEBUG_PRINT("loading %i bytes\n", num_bytes);
3399 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3401 ao_buffer[buffer_index],
3403 priv(dev)->ao_dma_desc[buffer_index].transfer_size =
3404 cpu_to_le32(num_bytes);
3405 /* set end of chain bit so we catch underruns */
3406 next_bits = le32_to_cpu(priv(dev)->ao_dma_desc[buffer_index].next);
3407 next_bits |= PLX_END_OF_CHAIN_BIT;
3408 priv(dev)->ao_dma_desc[buffer_index].next = cpu_to_le32(next_bits);
3409 /* clear end of chain bit on previous buffer now that we have set it
3410 * for the last buffer */
3411 next_bits = le32_to_cpu(priv(dev)->ao_dma_desc[prev_buffer_index].next);
3412 next_bits &= ~PLX_END_OF_CHAIN_BIT;
3413 priv(dev)->ao_dma_desc[prev_buffer_index].next = cpu_to_le32(next_bits);
3415 priv(dev)->ao_dma_index = (buffer_index + 1) % AO_DMA_RING_COUNT;
3416 priv(dev)->ao_count -= num_bytes;
3421 static void load_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3423 unsigned int num_bytes;
3424 unsigned int next_transfer_addr;
3425 void *pci_addr_reg =
3426 priv(dev)->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
3427 unsigned int buffer_index;
3430 buffer_index = priv(dev)->ao_dma_index;
3431 /* don't overwrite data that hasn't been transferred yet */
3432 next_transfer_addr = readl(pci_addr_reg);
3433 if (next_transfer_addr >=
3434 priv(dev)->ao_buffer_bus_addr[buffer_index]
3435 && next_transfer_addr <
3436 priv(dev)->ao_buffer_bus_addr[buffer_index] +
3439 num_bytes = load_ao_dma_buffer(dev, cmd);
3440 } while (num_bytes >= DMA_BUFFER_SIZE);
3443 static int prep_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3445 unsigned int num_bytes;
3448 /* clear queue pointer too, since external queue has
3449 * weird interactions with ao fifo */
3450 writew(0, priv(dev)->main_iobase + ADC_QUEUE_CLEAR_REG);
3451 writew(0, priv(dev)->main_iobase + DAC_BUFFER_CLEAR_REG);
3453 num_bytes = (DAC_FIFO_SIZE / 2) * bytes_in_sample;
3454 if (cmd->stop_src == TRIG_COUNT &&
3455 num_bytes / bytes_in_sample > priv(dev)->ao_count)
3456 num_bytes = priv(dev)->ao_count * bytes_in_sample;
3457 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3458 priv(dev)->ao_bounce_buffer,
3460 for (i = 0; i < num_bytes / bytes_in_sample; i++) {
3461 writew(priv(dev)->ao_bounce_buffer[i],
3462 priv(dev)->main_iobase + DAC_FIFO_REG);
3464 priv(dev)->ao_count -= num_bytes / bytes_in_sample;
3465 if (cmd->stop_src == TRIG_COUNT && priv(dev)->ao_count == 0)
3467 num_bytes = load_ao_dma_buffer(dev, cmd);
3470 if (num_bytes >= DMA_BUFFER_SIZE) ;
3471 load_ao_dma(dev, cmd);
3473 dma_start_sync(dev, 0);
3478 static inline int external_ai_queue_in_use(struct comedi_device *dev)
3480 if (dev->read_subdev->busy)
3482 if (board(dev)->layout == LAYOUT_4020)
3484 else if (use_internal_queue_6xxx(&dev->read_subdev->async->cmd))
3489 static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3491 struct comedi_cmd *cmd = &s->async->cmd;
3493 if (external_ai_queue_in_use(dev)) {
3494 warn_external_queue(dev);
3497 /* disable analog output system during setup */
3498 writew(0x0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3500 priv(dev)->ao_dma_index = 0;
3501 priv(dev)->ao_count = cmd->stop_arg * cmd->chanlist_len;
3503 set_dac_select_reg(dev, cmd);
3504 set_dac_interval_regs(dev, cmd);
3505 load_first_dma_descriptor(dev, 0, priv(dev)->ao_dma_desc_bus_addr |
3506 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3508 set_dac_control1_reg(dev, cmd);
3509 s->async->inttrig = ao_inttrig;
3514 static int ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3515 unsigned int trig_num)
3517 struct comedi_cmd *cmd = &s->async->cmd;
3523 retval = prep_ao_dma(dev, cmd);
3527 set_dac_control0_reg(dev, cmd);
3529 if (cmd->start_src == TRIG_INT)
3530 writew(0, priv(dev)->main_iobase + DAC_START_REG);
3532 s->async->inttrig = NULL;
3537 static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3538 struct comedi_cmd *cmd)
3542 unsigned int tmp_arg;
3545 /* step 1: make sure trigger sources are trivially valid */
3547 tmp = cmd->start_src;
3548 cmd->start_src &= TRIG_INT | TRIG_EXT;
3549 if (!cmd->start_src || tmp != cmd->start_src)
3552 tmp = cmd->scan_begin_src;
3553 cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT;
3554 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
3557 tmp = cmd->convert_src;
3558 cmd->convert_src &= TRIG_NOW;
3559 if (!cmd->convert_src || tmp != cmd->convert_src)
3562 tmp = cmd->scan_end_src;
3563 cmd->scan_end_src &= TRIG_COUNT;
3564 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
3567 tmp = cmd->stop_src;
3568 cmd->stop_src &= TRIG_NONE;
3569 if (!cmd->stop_src || tmp != cmd->stop_src)
3575 /* step 2: make sure trigger sources are unique and mutually compatible */
3577 /* uniqueness check */
3578 if (cmd->start_src != TRIG_INT && cmd->start_src != TRIG_EXT)
3580 if (cmd->scan_begin_src != TRIG_TIMER &&
3581 cmd->scan_begin_src != TRIG_EXT)
3584 /* compatibility check */
3585 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
3587 if (cmd->stop_src != TRIG_COUNT &&
3588 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
3594 /* step 3: make sure arguments are trivially compatible */
3596 if (cmd->scan_begin_src == TRIG_TIMER) {
3597 if (cmd->scan_begin_arg < board(dev)->ao_scan_speed) {
3598 cmd->scan_begin_arg = board(dev)->ao_scan_speed;
3601 if (get_ao_divisor(cmd->scan_begin_arg,
3602 cmd->flags) > max_counter_value) {
3603 cmd->scan_begin_arg =
3604 (max_counter_value + 2) * TIMER_BASE;
3609 if (!cmd->chanlist_len) {
3610 cmd->chanlist_len = 1;
3613 if (cmd->scan_end_arg != cmd->chanlist_len) {
3614 cmd->scan_end_arg = cmd->chanlist_len;
3621 /* step 4: fix up any arguments */
3623 if (cmd->scan_begin_src == TRIG_TIMER) {
3624 tmp_arg = cmd->scan_begin_arg;
3625 cmd->scan_begin_arg =
3626 get_divisor(cmd->scan_begin_arg, cmd->flags) * TIMER_BASE;
3627 if (tmp_arg != cmd->scan_begin_arg)
3634 if (cmd->chanlist) {
3635 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
3636 for (i = 1; i < cmd->chanlist_len; i++) {
3637 if (CR_CHAN(cmd->chanlist[i]) != first_channel + i) {
3639 "chanlist must use consecutive channels");
3652 static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3654 writew(0x0, priv(dev)->main_iobase + DAC_CONTROL0_REG);
3659 static int dio_callback(int dir, int port, int data, unsigned long iobase)
3662 writeb(data, (void *)(iobase + port));
3663 DEBUG_PRINT("wrote 0x%x to port %i\n", data, port);
3666 return readb((void *)(iobase + port));
3670 static int dio_callback_4020(int dir, int port, int data, unsigned long iobase)
3673 writew(data, (void *)(iobase + 2 * port));
3676 return readw((void *)(iobase + 2 * port));
3680 static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3681 struct comedi_insn *insn, unsigned int *data)
3685 bits = readb(priv(dev)->dio_counter_iobase + DI_REG);
3693 static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3694 struct comedi_insn *insn, unsigned int *data)
3697 /* zero bits we are going to change */
3698 s->state &= ~data[0];
3700 s->state |= data[0] & data[1];
3702 writeb(s->state, priv(dev)->dio_counter_iobase + DO_REG);
3709 static int dio_60xx_config_insn(struct comedi_device *dev,
3710 struct comedi_subdevice *s,
3711 struct comedi_insn *insn, unsigned int *data)
3715 mask = 1 << CR_CHAN(insn->chanspec);
3718 case INSN_CONFIG_DIO_INPUT:
3719 s->io_bits &= ~mask;
3721 case INSN_CONFIG_DIO_OUTPUT:
3724 case INSN_CONFIG_DIO_QUERY:
3725 data[1] = (s->io_bits & mask) ? COMEDI_OUTPUT : COMEDI_INPUT;
3732 priv(dev)->dio_counter_iobase + DIO_DIRECTION_60XX_REG);
3737 static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3738 struct comedi_insn *insn, unsigned int *data)
3741 s->state &= ~data[0];
3742 s->state |= (data[0] & data[1]);
3744 priv(dev)->dio_counter_iobase + DIO_DATA_60XX_REG);
3747 data[1] = readb(priv(dev)->dio_counter_iobase + DIO_DATA_60XX_REG);
3752 static void caldac_write(struct comedi_device *dev, unsigned int channel,
3755 priv(dev)->caldac_state[channel] = value;
3757 switch (board(dev)->layout) {
3760 caldac_8800_write(dev, channel, value);
3763 caldac_i2c_write(dev, channel, value);
3770 static int calib_write_insn(struct comedi_device *dev,
3771 struct comedi_subdevice *s,
3772 struct comedi_insn *insn, unsigned int *data)
3774 int channel = CR_CHAN(insn->chanspec);
3776 /* return immediately if setting hasn't changed, since
3777 * programming these things is slow */
3778 if (priv(dev)->caldac_state[channel] == data[0])
3781 caldac_write(dev, channel, data[0]);
3786 static int calib_read_insn(struct comedi_device *dev,
3787 struct comedi_subdevice *s, struct comedi_insn *insn,
3790 unsigned int channel = CR_CHAN(insn->chanspec);
3792 data[0] = priv(dev)->caldac_state[channel];
3797 static void ad8402_write(struct comedi_device *dev, unsigned int channel,
3800 static const int bitstream_length = 10;
3801 unsigned int bit, register_bits;
3802 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
3803 static const int ad8402_udelay = 1;
3805 priv(dev)->ad8402_state[channel] = value;
3807 register_bits = SELECT_8402_64XX_BIT;
3808 udelay(ad8402_udelay);
3809 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3811 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3812 if (bitstream & bit)
3813 register_bits |= SERIAL_DATA_IN_BIT;
3815 register_bits &= ~SERIAL_DATA_IN_BIT;
3816 udelay(ad8402_udelay);
3817 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
3818 udelay(ad8402_udelay);
3819 writew(register_bits | SERIAL_CLOCK_BIT,
3820 priv(dev)->main_iobase + CALIBRATION_REG);
3823 udelay(ad8402_udelay);
3824 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
3827 /* for pci-das6402/16, channel 0 is analog input gain and channel 1 is offset */
3828 static int ad8402_write_insn(struct comedi_device *dev,
3829 struct comedi_subdevice *s,
3830 struct comedi_insn *insn, unsigned int *data)
3832 int channel = CR_CHAN(insn->chanspec);
3834 /* return immediately if setting hasn't changed, since
3835 * programming these things is slow */
3836 if (priv(dev)->ad8402_state[channel] == data[0])
3839 priv(dev)->ad8402_state[channel] = data[0];
3841 ad8402_write(dev, channel, data[0]);
3846 static int ad8402_read_insn(struct comedi_device *dev,
3847 struct comedi_subdevice *s,
3848 struct comedi_insn *insn, unsigned int *data)
3850 unsigned int channel = CR_CHAN(insn->chanspec);
3852 data[0] = priv(dev)->ad8402_state[channel];
3857 static uint16_t read_eeprom(struct comedi_device *dev, uint8_t address)
3859 static const int bitstream_length = 11;
3860 static const int read_command = 0x6;
3861 unsigned int bitstream = (read_command << 8) | address;
3863 void *const plx_control_addr =
3864 priv(dev)->plx9080_iobase + PLX_CONTROL_REG;
3866 static const int value_length = 16;
3867 static const int eeprom_udelay = 1;
3869 udelay(eeprom_udelay);
3870 priv(dev)->plx_control_bits &= ~CTL_EE_CLK & ~CTL_EE_CS;
3871 /* make sure we don't send anything to the i2c bus on 4020 */
3872 priv(dev)->plx_control_bits |= CTL_USERO;
3873 writel(priv(dev)->plx_control_bits, plx_control_addr);
3874 /* activate serial eeprom */
3875 udelay(eeprom_udelay);
3876 priv(dev)->plx_control_bits |= CTL_EE_CS;
3877 writel(priv(dev)->plx_control_bits, plx_control_addr);
3879 /* write read command and desired memory address */
3880 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3881 /* set bit to be written */
3882 udelay(eeprom_udelay);
3883 if (bitstream & bit)
3884 priv(dev)->plx_control_bits |= CTL_EE_W;
3886 priv(dev)->plx_control_bits &= ~CTL_EE_W;
3887 writel(priv(dev)->plx_control_bits, plx_control_addr);
3889 udelay(eeprom_udelay);
3890 priv(dev)->plx_control_bits |= CTL_EE_CLK;
3891 writel(priv(dev)->plx_control_bits, plx_control_addr);
3892 udelay(eeprom_udelay);
3893 priv(dev)->plx_control_bits &= ~CTL_EE_CLK;
3894 writel(priv(dev)->plx_control_bits, plx_control_addr);
3896 /* read back value from eeprom memory location */
3898 for (bit = 1 << (value_length - 1); bit; bit >>= 1) {
3900 udelay(eeprom_udelay);
3901 priv(dev)->plx_control_bits |= CTL_EE_CLK;
3902 writel(priv(dev)->plx_control_bits, plx_control_addr);
3903 udelay(eeprom_udelay);
3904 priv(dev)->plx_control_bits &= ~CTL_EE_CLK;
3905 writel(priv(dev)->plx_control_bits, plx_control_addr);
3906 udelay(eeprom_udelay);
3907 if (readl(plx_control_addr) & CTL_EE_R)
3911 /* deactivate eeprom serial input */
3912 udelay(eeprom_udelay);
3913 priv(dev)->plx_control_bits &= ~CTL_EE_CS;
3914 writel(priv(dev)->plx_control_bits, plx_control_addr);
3919 static int eeprom_read_insn(struct comedi_device *dev,
3920 struct comedi_subdevice *s,
3921 struct comedi_insn *insn, unsigned int *data)
3923 data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
3928 /* utility function that rounds desired timing to an achievable time, and
3929 * sets cmd members appropriately.
3930 * adc paces conversions from master clock by dividing by (x + 3) where x is 24 bit number
3932 static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
3934 unsigned int convert_divisor = 0, scan_divisor;
3935 static const int min_convert_divisor = 3;
3936 static const int max_convert_divisor =
3937 max_counter_value + min_convert_divisor;
3938 static const int min_scan_divisor_4020 = 2;
3939 unsigned long long max_scan_divisor, min_scan_divisor;
3941 if (cmd->convert_src == TRIG_TIMER) {
3942 if (board(dev)->layout == LAYOUT_4020) {
3943 cmd->convert_arg = 0;
3946 get_divisor(cmd->convert_arg, cmd->flags);
3947 if (convert_divisor > max_convert_divisor)
3948 convert_divisor = max_convert_divisor;
3949 if (convert_divisor < min_convert_divisor)
3950 convert_divisor = min_convert_divisor;
3951 cmd->convert_arg = convert_divisor * TIMER_BASE;
3953 } else if (cmd->convert_src == TRIG_NOW)
3954 cmd->convert_arg = 0;
3956 if (cmd->scan_begin_src == TRIG_TIMER) {
3957 scan_divisor = get_divisor(cmd->scan_begin_arg, cmd->flags);
3958 if (cmd->convert_src == TRIG_TIMER) {
3959 /* XXX check for integer overflows */
3960 min_scan_divisor = convert_divisor * cmd->chanlist_len;
3962 (convert_divisor * cmd->chanlist_len - 1) +
3965 min_scan_divisor = min_scan_divisor_4020;
3966 max_scan_divisor = max_counter_value + min_scan_divisor;
3968 if (scan_divisor > max_scan_divisor)
3969 scan_divisor = max_scan_divisor;
3970 if (scan_divisor < min_scan_divisor)
3971 scan_divisor = min_scan_divisor;
3972 cmd->scan_begin_arg = scan_divisor * TIMER_BASE;
3978 /* Gets nearest achievable timing given master clock speed, does not
3979 * take into account possible minimum/maximum divisor values. Used
3980 * by other timing checking functions. */
3981 static unsigned int get_divisor(unsigned int ns, unsigned int flags)
3983 unsigned int divisor;
3985 switch (flags & TRIG_ROUND_MASK) {
3987 divisor = (ns + TIMER_BASE - 1) / TIMER_BASE;
3989 case TRIG_ROUND_DOWN:
3990 divisor = ns / TIMER_BASE;
3992 case TRIG_ROUND_NEAREST:
3994 divisor = (ns + TIMER_BASE / 2) / TIMER_BASE;
4000 static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags)
4002 return get_divisor(ns, flags) - 2;
4005 /* adjusts the size of hardware fifo (which determines block size for dma xfers) */
4006 static int set_ai_fifo_size(struct comedi_device *dev, unsigned int num_samples)
4008 unsigned int num_fifo_entries;
4010 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
4012 num_fifo_entries = num_samples / fifo->sample_packing_ratio;
4014 retval = set_ai_fifo_segment_length(dev,
4016 fifo->num_segments);
4020 num_samples = retval * fifo->num_segments * fifo->sample_packing_ratio;
4022 DEBUG_PRINT("set hardware fifo size to %i\n", num_samples);
4027 /* query length of fifo */
4028 static unsigned int ai_fifo_size(struct comedi_device *dev)
4030 return priv(dev)->ai_fifo_segment_length *
4031 board(dev)->ai_fifo->num_segments *
4032 board(dev)->ai_fifo->sample_packing_ratio;
4035 static int set_ai_fifo_segment_length(struct comedi_device *dev,
4036 unsigned int num_entries)
4038 static const int increment_size = 0x100;
4039 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
4040 unsigned int num_increments;
4043 if (num_entries < increment_size)
4044 num_entries = increment_size;
4045 if (num_entries > fifo->max_segment_length)
4046 num_entries = fifo->max_segment_length;
4048 /* 1 == 256 entries, 2 == 512 entries, etc */
4049 num_increments = (num_entries + increment_size / 2) / increment_size;
4051 bits = (~(num_increments - 1)) & fifo->fifo_size_reg_mask;
4052 priv(dev)->fifo_size_bits &= ~fifo->fifo_size_reg_mask;
4053 priv(dev)->fifo_size_bits |= bits;
4054 writew(priv(dev)->fifo_size_bits,
4055 priv(dev)->main_iobase + FIFO_SIZE_REG);
4057 priv(dev)->ai_fifo_segment_length = num_increments * increment_size;
4059 DEBUG_PRINT("set hardware fifo segment length to %i\n",
4060 priv(dev)->ai_fifo_segment_length);
4062 return priv(dev)->ai_fifo_segment_length;
4065 /* pci-6025 8800 caldac:
4066 * address 0 == dac channel 0 offset
4067 * address 1 == dac channel 0 gain
4068 * address 2 == dac channel 1 offset
4069 * address 3 == dac channel 1 gain
4070 * address 4 == fine adc offset
4071 * address 5 == coarse adc offset
4072 * address 6 == coarse adc gain
4073 * address 7 == fine adc gain
4075 /* pci-6402/16 uses all 8 channels for dac:
4076 * address 0 == dac channel 0 fine gain
4077 * address 1 == dac channel 0 coarse gain
4078 * address 2 == dac channel 0 coarse offset
4079 * address 3 == dac channel 1 coarse offset
4080 * address 4 == dac channel 1 fine gain
4081 * address 5 == dac channel 1 coarse gain
4082 * address 6 == dac channel 0 fine offset
4083 * address 7 == dac channel 1 fine offset
4086 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
4089 static const int num_caldac_channels = 8;
4090 static const int bitstream_length = 11;
4091 unsigned int bitstream = ((address & 0x7) << 8) | value;
4092 unsigned int bit, register_bits;
4093 static const int caldac_8800_udelay = 1;
4095 if (address >= num_caldac_channels) {
4096 comedi_error(dev, "illegal caldac channel");
4099 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
4101 if (bitstream & bit)
4102 register_bits |= SERIAL_DATA_IN_BIT;
4103 udelay(caldac_8800_udelay);
4104 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
4105 register_bits |= SERIAL_CLOCK_BIT;
4106 udelay(caldac_8800_udelay);
4107 writew(register_bits, priv(dev)->main_iobase + CALIBRATION_REG);
4109 udelay(caldac_8800_udelay);
4110 writew(SELECT_8800_BIT, priv(dev)->main_iobase + CALIBRATION_REG);
4111 udelay(caldac_8800_udelay);
4112 writew(0, priv(dev)->main_iobase + CALIBRATION_REG);
4113 udelay(caldac_8800_udelay);
4118 static int caldac_i2c_write(struct comedi_device *dev,
4119 unsigned int caldac_channel, unsigned int value)
4121 uint8_t serial_bytes[3];
4124 /* manual has gain and offset bits switched */
4131 NOT_CLEAR_REGISTERS = 0x20,
4134 switch (caldac_channel) {
4135 case 0: /* chan 0 offset */
4136 i2c_addr = CALDAC0_I2C_ADDR;
4137 serial_bytes[0] = OFFSET_0_2;
4139 case 1: /* chan 1 offset */
4140 i2c_addr = CALDAC0_I2C_ADDR;
4141 serial_bytes[0] = OFFSET_1_3;
4143 case 2: /* chan 2 offset */
4144 i2c_addr = CALDAC1_I2C_ADDR;
4145 serial_bytes[0] = OFFSET_0_2;
4147 case 3: /* chan 3 offset */
4148 i2c_addr = CALDAC1_I2C_ADDR;
4149 serial_bytes[0] = OFFSET_1_3;
4151 case 4: /* chan 0 gain */
4152 i2c_addr = CALDAC0_I2C_ADDR;
4153 serial_bytes[0] = GAIN_0_2;
4155 case 5: /* chan 1 gain */
4156 i2c_addr = CALDAC0_I2C_ADDR;
4157 serial_bytes[0] = GAIN_1_3;
4159 case 6: /* chan 2 gain */
4160 i2c_addr = CALDAC1_I2C_ADDR;
4161 serial_bytes[0] = GAIN_0_2;
4163 case 7: /* chan 3 gain */
4164 i2c_addr = CALDAC1_I2C_ADDR;
4165 serial_bytes[0] = GAIN_1_3;
4168 comedi_error(dev, "invalid caldac channel\n");
4172 serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf);
4173 serial_bytes[2] = value & 0xff;
4174 i2c_write(dev, i2c_addr, serial_bytes, 3);
4178 /* Their i2c requires a huge delay on setting clock or data high for some reason */
4179 static const int i2c_high_udelay = 1000;
4180 static const int i2c_low_udelay = 10;
4182 /* set i2c data line high or low */
4183 static void i2c_set_sda(struct comedi_device *dev, int state)
4185 static const int data_bit = CTL_EE_W;
4186 void *plx_control_addr = priv(dev)->plx9080_iobase + PLX_CONTROL_REG;
4189 /* set data line high */
4190 priv(dev)->plx_control_bits &= ~data_bit;
4191 writel(priv(dev)->plx_control_bits, plx_control_addr);
4192 udelay(i2c_high_udelay);
4193 } else { /* set data line low */
4195 priv(dev)->plx_control_bits |= data_bit;
4196 writel(priv(dev)->plx_control_bits, plx_control_addr);
4197 udelay(i2c_low_udelay);
4201 /* set i2c clock line high or low */
4202 static void i2c_set_scl(struct comedi_device *dev, int state)
4204 static const int clock_bit = CTL_USERO;
4205 void *plx_control_addr = priv(dev)->plx9080_iobase + PLX_CONTROL_REG;
4208 /* set clock line high */
4209 priv(dev)->plx_control_bits &= ~clock_bit;
4210 writel(priv(dev)->plx_control_bits, plx_control_addr);
4211 udelay(i2c_high_udelay);
4212 } else { /* set clock line low */
4214 priv(dev)->plx_control_bits |= clock_bit;
4215 writel(priv(dev)->plx_control_bits, plx_control_addr);
4216 udelay(i2c_low_udelay);
4220 static void i2c_write_byte(struct comedi_device *dev, uint8_t byte)
4223 unsigned int num_bits = 8;
4225 DEBUG_PRINT("writing to i2c byte 0x%x\n", byte);
4227 for (bit = 1 << (num_bits - 1); bit; bit >>= 1) {
4228 i2c_set_scl(dev, 0);
4230 i2c_set_sda(dev, 1);
4232 i2c_set_sda(dev, 0);
4233 i2c_set_scl(dev, 1);
4237 /* we can't really read the lines, so fake it */
4238 static int i2c_read_ack(struct comedi_device *dev)
4240 i2c_set_scl(dev, 0);
4241 i2c_set_sda(dev, 1);
4242 i2c_set_scl(dev, 1);
4244 return 0; /* return fake acknowledge bit */
4247 /* send start bit */
4248 static void i2c_start(struct comedi_device *dev)
4250 i2c_set_scl(dev, 1);
4251 i2c_set_sda(dev, 1);
4252 i2c_set_sda(dev, 0);
4256 static void i2c_stop(struct comedi_device *dev)
4258 i2c_set_scl(dev, 0);
4259 i2c_set_sda(dev, 0);
4260 i2c_set_scl(dev, 1);
4261 i2c_set_sda(dev, 1);
4264 static void i2c_write(struct comedi_device *dev, unsigned int address,
4265 const uint8_t * data, unsigned int length)
4269 static const int read_bit = 0x1;
4271 /* XXX need mutex to prevent simultaneous attempts to access eeprom and i2c bus */
4273 /* make sure we dont send anything to eeprom */
4274 priv(dev)->plx_control_bits &= ~CTL_EE_CS;
4279 /* send address and write bit */
4280 bitstream = (address << 1) & ~read_bit;
4281 i2c_write_byte(dev, bitstream);
4283 /* get acknowledge */
4284 if (i2c_read_ack(dev) != 0) {
4285 comedi_error(dev, "i2c write failed: no acknowledge");
4289 /* write data bytes */
4290 for (i = 0; i < length; i++) {
4291 i2c_write_byte(dev, data[i]);
4292 if (i2c_read_ack(dev) != 0) {
4293 comedi_error(dev, "i2c write failed: no acknowledge");