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.
35 * Description: MeasurementComputing PCI-DAS64xx, 60XX, and 4020 series
36 * with the PLX 9080 PCI controller
37 * Author: Frank Mori Hess <fmhess@users.sourceforge.net>
39 * Updated: Fri, 02 Nov 2012 18:58:55 +0000
40 * Devices: [Measurement Computing] PCI-DAS6402/16 (cb_pcidas64),
41 * PCI-DAS6402/12, PCI-DAS64/M1/16, PCI-DAS64/M2/16,
42 * PCI-DAS64/M3/16, PCI-DAS6402/16/JR, PCI-DAS64/M1/16/JR,
43 * PCI-DAS64/M2/16/JR, PCI-DAS64/M3/16/JR, PCI-DAS64/M1/14,
44 * PCI-DAS64/M2/14, PCI-DAS64/M3/14, PCI-DAS6013, PCI-DAS6014,
45 * PCI-DAS6023, PCI-DAS6025, PCI-DAS6030,
46 * PCI-DAS6031, PCI-DAS6032, PCI-DAS6033, PCI-DAS6034,
47 * PCI-DAS6035, PCI-DAS6036, PCI-DAS6040, PCI-DAS6052,
48 * PCI-DAS6070, PCI-DAS6071, PCI-DAS4020/12
50 * Configuration options:
53 * Manual attachment of PCI cards with the comedi_config utility is not
54 * supported by this driver; they are attached automatically.
56 * These boards may be autocalibrated with the comedi_calibrate utility.
58 * To select the bnc trigger input on the 4020 (instead of the dio input),
59 * specify a nonzero channel in the chanspec. If you wish to use an external
60 * master clock on the 4020, you may do so by setting the scan_begin_src
61 * to TRIG_OTHER, and using an INSN_CONFIG_TIMER_1 configuration insn
62 * to configure the divisor to use for the external clock.
64 * Some devices are not identified because the PCI device IDs are not yet
65 * known. If you have such a board, please let the maintainers know.
71 make it return error if user attempts an ai command that uses the
72 external queue, and an ao command simultaneously user counter subdevice
73 there are a number of boards this driver will support when they are
74 fully released, but does not yet since the pci device id numbers
75 are not yet available.
77 support prescaled 100khz clock for slow pacing (not available on 6000
80 make ao fifo size adjustable like ai fifo
83 #include <linux/module.h>
84 #include <linux/pci.h>
85 #include <linux/delay.h>
86 #include <linux/interrupt.h>
88 #include "../comedidev.h"
93 #include "comedi_fc.h"
95 #define TIMER_BASE 25 /* 40MHz master clock */
96 /* 100kHz 'prescaled' clock for slow acquisition,
97 * maybe I'll support this someday */
98 #define PRESCALED_TIMER_BASE 10000
99 #define DMA_BUFFER_SIZE 0x1000
101 /* maximum value that can be loaded into board's 24-bit counters*/
102 static const int max_counter_value = 0xffffff;
104 /* PCI-DAS64xxx base addresses */
106 /* devpriv->main_iobase registers */
107 enum write_only_registers {
108 INTR_ENABLE_REG = 0x0, /* interrupt enable register */
109 HW_CONFIG_REG = 0x2, /* hardware config register */
111 DAQ_ATRIG_LOW_4020_REG = 0xc,
112 ADC_CONTROL0_REG = 0x10, /* adc control register 0 */
113 ADC_CONTROL1_REG = 0x12, /* adc control register 1 */
114 CALIBRATION_REG = 0x14,
115 /* lower 16 bits of adc sample interval counter */
116 ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16,
117 /* upper 8 bits of adc sample interval counter */
118 ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18,
119 /* lower 16 bits of delay interval counter */
120 ADC_DELAY_INTERVAL_LOWER_REG = 0x1a,
121 /* upper 8 bits of delay interval counter */
122 ADC_DELAY_INTERVAL_UPPER_REG = 0x1c,
123 /* lower 16 bits of hardware conversion/scan counter */
124 ADC_COUNT_LOWER_REG = 0x1e,
125 /* upper 8 bits of hardware conversion/scan counter */
126 ADC_COUNT_UPPER_REG = 0x20,
127 ADC_START_REG = 0x22, /* software trigger to start acquisition */
128 ADC_CONVERT_REG = 0x24, /* initiates single conversion */
129 ADC_QUEUE_CLEAR_REG = 0x26, /* clears adc queue */
130 ADC_QUEUE_LOAD_REG = 0x28, /* loads adc queue */
131 ADC_BUFFER_CLEAR_REG = 0x2a,
132 /* high channel for internal queue, use adc_chan_bits() inline above */
133 ADC_QUEUE_HIGH_REG = 0x2c,
134 DAC_CONTROL0_REG = 0x50, /* dac control register 0 */
135 DAC_CONTROL1_REG = 0x52, /* dac control register 0 */
136 /* lower 16 bits of dac sample interval counter */
137 DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54,
138 /* upper 8 bits of dac sample interval counter */
139 DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56,
140 DAC_SELECT_REG = 0x60,
141 DAC_START_REG = 0x64,
142 DAC_BUFFER_CLEAR_REG = 0x66, /* clear dac buffer */
145 static inline unsigned int dac_convert_reg(unsigned int channel)
147 return 0x70 + (2 * (channel & 0x1));
150 static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
152 return 0x70 + (4 * (channel & 0x1));
155 static inline unsigned int dac_msb_4020_reg(unsigned int channel)
157 return 0x72 + (4 * (channel & 0x1));
160 enum read_only_registers {
161 /* hardware status register,
162 * reading this apparently clears pending interrupts as well */
164 PIPE1_READ_REG = 0x4,
165 ADC_READ_PNTR_REG = 0x8,
166 LOWER_XFER_REG = 0x10,
167 ADC_WRITE_PNTR_REG = 0xc,
171 enum read_write_registers {
172 I8255_4020_REG = 0x48, /* 8255 offset, for 4020 only */
173 /* external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
174 ADC_QUEUE_FIFO_REG = 0x100,
175 ADC_FIFO_REG = 0x200, /* adc data fifo */
176 /* dac data fifo, has weird interactions with external channel queue */
177 DAC_FIFO_REG = 0x300,
180 /* dev->mmio registers */
181 enum dio_counter_registers {
182 DIO_8255_OFFSET = 0x0,
185 DIO_DIRECTION_60XX_REG = 0x40,
186 DIO_DATA_60XX_REG = 0x48,
189 /* bit definitions for write-only registers */
191 enum intr_enable_contents {
192 ADC_INTR_SRC_MASK = 0x3, /* adc interrupt source mask */
193 ADC_INTR_QFULL_BITS = 0x0, /* interrupt fifo quarter full */
194 ADC_INTR_EOC_BITS = 0x1, /* interrupt end of conversion */
195 ADC_INTR_EOSCAN_BITS = 0x2, /* interrupt end of scan */
196 ADC_INTR_EOSEQ_BITS = 0x3, /* interrupt end of sequence mask */
197 EN_ADC_INTR_SRC_BIT = 0x4, /* enable adc interrupt source */
198 EN_ADC_DONE_INTR_BIT = 0x8, /* enable adc acquisition done intr */
199 DAC_INTR_SRC_MASK = 0x30,
200 DAC_INTR_QEMPTY_BITS = 0x0,
201 DAC_INTR_HIGH_CHAN_BITS = 0x10,
202 EN_DAC_INTR_SRC_BIT = 0x40, /* enable dac interrupt source */
203 EN_DAC_DONE_INTR_BIT = 0x80,
204 EN_ADC_ACTIVE_INTR_BIT = 0x200, /* enable adc active interrupt */
205 EN_ADC_STOP_INTR_BIT = 0x400, /* enable adc stop trigger interrupt */
206 EN_DAC_ACTIVE_INTR_BIT = 0x800, /* enable dac active interrupt */
207 EN_DAC_UNDERRUN_BIT = 0x4000, /* enable dac underrun status bit */
208 EN_ADC_OVERRUN_BIT = 0x8000, /* enable adc overrun status bit */
211 enum hw_config_contents {
212 MASTER_CLOCK_4020_MASK = 0x3, /* master clock source mask for 4020 */
213 INTERNAL_CLOCK_4020_BITS = 0x1, /* use 40 MHz internal master clock */
214 BNC_CLOCK_4020_BITS = 0x2, /* use BNC input for master clock */
215 EXT_CLOCK_4020_BITS = 0x3, /* use dio input for master clock */
216 EXT_QUEUE_BIT = 0x200, /* use external channel/gain queue */
217 /* use 225 nanosec strobe when loading dac instead of 50 nanosec */
218 SLOW_DAC_BIT = 0x400,
219 /* bit with unknown function yet given as default value in pci-das64
221 HW_CONFIG_DUMMY_BITS = 0x2000,
222 /* bit selects channels 1/0 for analog input/output, otherwise 0/1 */
223 DMA_CH_SELECT_BIT = 0x8000,
224 FIFO_SIZE_REG = 0x4, /* allows adjustment of fifo sizes */
225 DAC_FIFO_SIZE_MASK = 0xff00, /* bits that set dac fifo size */
226 DAC_FIFO_BITS = 0xf800, /* 8k sample ao fifo */
228 #define DAC_FIFO_SIZE 0x2000
230 enum daq_atrig_low_4020_contents {
231 /* use trig/ext clk bnc input for analog gate signal */
232 EXT_AGATE_BNC_BIT = 0x8000,
233 /* use trig/ext clk bnc input for external stop trigger signal */
234 EXT_STOP_TRIG_BNC_BIT = 0x4000,
235 /* use trig/ext clk bnc input for external start trigger signal */
236 EXT_START_TRIG_BNC_BIT = 0x2000,
239 static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
241 return threshold & 0xfff;
244 enum adc_control0_contents {
245 ADC_GATE_SRC_MASK = 0x3, /* bits that select gate */
246 ADC_SOFT_GATE_BITS = 0x1, /* software gate */
247 ADC_EXT_GATE_BITS = 0x2, /* external digital gate */
248 ADC_ANALOG_GATE_BITS = 0x3, /* analog level gate */
249 ADC_GATE_LEVEL_BIT = 0x4, /* level-sensitive gate (for digital) */
250 ADC_GATE_POLARITY_BIT = 0x8, /* gate active low */
251 ADC_START_TRIG_SOFT_BITS = 0x10,
252 ADC_START_TRIG_EXT_BITS = 0x20,
253 ADC_START_TRIG_ANALOG_BITS = 0x30,
254 ADC_START_TRIG_MASK = 0x30,
255 ADC_START_TRIG_FALLING_BIT = 0x40, /* trig 1 uses falling edge */
256 /* external pacing uses falling edge */
257 ADC_EXT_CONV_FALLING_BIT = 0x800,
258 /* enable hardware scan counter */
259 ADC_SAMPLE_COUNTER_EN_BIT = 0x1000,
260 ADC_DMA_DISABLE_BIT = 0x4000, /* disables dma */
261 ADC_ENABLE_BIT = 0x8000, /* master adc enable */
264 enum adc_control1_contents {
265 /* should be set for boards with > 16 channels */
266 ADC_QUEUE_CONFIG_BIT = 0x1,
267 CONVERT_POLARITY_BIT = 0x10,
268 EOC_POLARITY_BIT = 0x20,
269 ADC_SW_GATE_BIT = 0x40, /* software gate of adc */
270 ADC_DITHER_BIT = 0x200, /* turn on extra noise for dithering */
271 RETRIGGER_BIT = 0x800,
272 ADC_LO_CHANNEL_4020_MASK = 0x300,
273 ADC_HI_CHANNEL_4020_MASK = 0xc00,
274 TWO_CHANNEL_4020_BITS = 0x1000, /* two channel mode for 4020 */
275 FOUR_CHANNEL_4020_BITS = 0x2000, /* four channel mode for 4020 */
276 CHANNEL_MODE_4020_MASK = 0x3000,
277 ADC_MODE_MASK = 0xf000,
280 static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel)
282 return (channel & 0x3) << 8;
285 static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel)
287 return (channel & 0x3) << 10;
290 static inline uint16_t adc_mode_bits(unsigned int mode)
292 return (mode & 0xf) << 12;
295 enum calibration_contents {
296 SELECT_8800_BIT = 0x1,
297 SELECT_8402_64XX_BIT = 0x2,
298 SELECT_1590_60XX_BIT = 0x2,
299 CAL_EN_64XX_BIT = 0x40, /* calibration enable for 64xx series */
300 SERIAL_DATA_IN_BIT = 0x80,
301 SERIAL_CLOCK_BIT = 0x100,
302 CAL_EN_60XX_BIT = 0x200, /* calibration enable for 60xx series */
303 CAL_GAIN_BIT = 0x800,
306 /* calibration sources for 6025 are:
317 static inline uint16_t adc_src_bits(unsigned int source)
319 return (source & 0xf) << 3;
322 static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
324 return (channel & 0x3) << 8;
327 enum adc_queue_load_contents {
328 UNIP_BIT = 0x800, /* unipolar/bipolar bit */
329 ADC_SE_DIFF_BIT = 0x1000, /* single-ended/ differential bit */
330 /* non-referenced single-ended (common-mode input) */
331 ADC_COMMON_BIT = 0x2000,
332 QUEUE_EOSEQ_BIT = 0x4000, /* queue end of sequence */
333 QUEUE_EOSCAN_BIT = 0x8000, /* queue end of scan */
336 static inline uint16_t adc_chan_bits(unsigned int channel)
338 return channel & 0x3f;
341 enum dac_control0_contents {
342 DAC_ENABLE_BIT = 0x8000, /* dac controller enable bit */
343 DAC_CYCLIC_STOP_BIT = 0x4000,
344 DAC_WAVEFORM_MODE_BIT = 0x100,
345 DAC_EXT_UPDATE_FALLING_BIT = 0x80,
346 DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
347 WAVEFORM_TRIG_MASK = 0x30,
348 WAVEFORM_TRIG_DISABLED_BITS = 0x0,
349 WAVEFORM_TRIG_SOFT_BITS = 0x10,
350 WAVEFORM_TRIG_EXT_BITS = 0x20,
351 WAVEFORM_TRIG_ADC1_BITS = 0x30,
352 WAVEFORM_TRIG_FALLING_BIT = 0x8,
353 WAVEFORM_GATE_LEVEL_BIT = 0x4,
354 WAVEFORM_GATE_ENABLE_BIT = 0x2,
355 WAVEFORM_GATE_SELECT_BIT = 0x1,
358 enum dac_control1_contents {
359 DAC_WRITE_POLARITY_BIT = 0x800, /* board-dependent setting */
360 DAC1_EXT_REF_BIT = 0x200,
361 DAC0_EXT_REF_BIT = 0x100,
362 DAC_OUTPUT_ENABLE_BIT = 0x80, /* dac output enable bit */
363 DAC_UPDATE_POLARITY_BIT = 0x40, /* board-dependent setting */
364 DAC_SW_GATE_BIT = 0x20,
365 DAC1_UNIPOLAR_BIT = 0x8,
366 DAC0_UNIPOLAR_BIT = 0x2,
369 /* bit definitions for read-only registers */
370 enum hw_status_contents {
371 DAC_UNDERRUN_BIT = 0x1,
372 ADC_OVERRUN_BIT = 0x2,
373 DAC_ACTIVE_BIT = 0x4,
374 ADC_ACTIVE_BIT = 0x8,
375 DAC_INTR_PENDING_BIT = 0x10,
376 ADC_INTR_PENDING_BIT = 0x20,
379 EXT_INTR_PENDING_BIT = 0x100,
380 ADC_STOP_BIT = 0x200,
383 static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
385 return (hw_status_bits >> 10) & 0x3;
388 static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
390 return (prepost_bits >> 6) & 0x3;
393 static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
395 return (prepost_bits >> 12) & 0x3;
398 static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
400 return (prepost_bits >> 14) & 0x3;
403 /* I2C addresses for 4020 */
405 RANGE_CAL_I2C_ADDR = 0x20,
406 CALDAC0_I2C_ADDR = 0xc,
407 CALDAC1_I2C_ADDR = 0xd,
410 enum range_cal_i2c_contents {
411 /* bits that set what source the adc converter measures */
412 ADC_SRC_4020_MASK = 0x70,
413 /* make bnc trig/ext clock threshold 0V instead of 2.5V */
414 BNC_TRIG_THRESHOLD_0V_BIT = 0x80,
417 static inline uint8_t adc_src_4020_bits(unsigned int source)
419 return (source << 4) & ADC_SRC_4020_MASK;
422 static inline uint8_t attenuate_bit(unsigned int channel)
424 /* attenuate channel (+-5V input range) */
425 return 1 << (channel & 0x3);
428 /* analog input ranges for 64xx boards */
429 static const struct comedi_lrange ai_ranges_64xx = {
442 /* analog input ranges for 60xx boards */
443 static const struct comedi_lrange ai_ranges_60xx = {
452 /* analog input ranges for 6030, etc boards */
453 static const struct comedi_lrange ai_ranges_6030 = {
472 /* analog input ranges for 6052, etc boards */
473 static const struct comedi_lrange ai_ranges_6052 = {
493 /* analog input ranges for 4020 board */
494 static const struct comedi_lrange ai_ranges_4020 = {
501 /* analog output ranges */
502 static const struct comedi_lrange ao_ranges_64xx = {
511 static const int ao_range_code_64xx[] = {
518 static const int ao_range_code_60xx[] = {
522 static const struct comedi_lrange ao_ranges_6030 = {
529 static const int ao_range_code_6030[] = {
534 static const struct comedi_lrange ao_ranges_4020 = {
541 static const int ao_range_code_4020[] = {
546 enum register_layout {
552 struct hw_fifo_info {
553 unsigned int num_segments;
554 unsigned int max_segment_length;
555 unsigned int sample_packing_ratio;
556 uint16_t fifo_size_reg_mask;
559 enum pcidas64_boardid {
562 BOARD_PCIDAS64_M1_16,
563 BOARD_PCIDAS64_M2_16,
564 BOARD_PCIDAS64_M3_16,
581 BOARD_PCIDAS6402_16_JR,
582 BOARD_PCIDAS64_M1_16_JR,
583 BOARD_PCIDAS64_M2_16_JR,
584 BOARD_PCIDAS64_M3_16_JR,
585 BOARD_PCIDAS64_M1_14,
586 BOARD_PCIDAS64_M2_14,
587 BOARD_PCIDAS64_M3_14,
590 struct pcidas64_board {
592 int ai_se_chans; /* number of ai inputs in single-ended mode */
593 int ai_bits; /* analog input resolution */
594 int ai_speed; /* fastest conversion period in ns */
595 const struct comedi_lrange *ai_range_table;
596 int ao_nchan; /* number of analog out channels */
597 int ao_bits; /* analog output resolution */
598 int ao_scan_speed; /* analog output scan speed */
599 const struct comedi_lrange *ao_range_table;
600 const int *ao_range_code;
601 const struct hw_fifo_info *const ai_fifo;
602 /* different board families have slightly different registers */
603 enum register_layout layout;
607 static const struct hw_fifo_info ai_fifo_4020 = {
609 .max_segment_length = 0x8000,
610 .sample_packing_ratio = 2,
611 .fifo_size_reg_mask = 0x7f,
614 static const struct hw_fifo_info ai_fifo_64xx = {
616 .max_segment_length = 0x800,
617 .sample_packing_ratio = 1,
618 .fifo_size_reg_mask = 0x3f,
621 static const struct hw_fifo_info ai_fifo_60xx = {
623 .max_segment_length = 0x800,
624 .sample_packing_ratio = 1,
625 .fifo_size_reg_mask = 0x7f,
628 /* maximum number of dma transfers we will chain together into a ring
629 * (and the maximum number of dma buffers we maintain) */
630 #define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
631 #define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
632 #define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
633 static inline unsigned int ai_dma_ring_count(const struct pcidas64_board *board)
635 if (board->layout == LAYOUT_4020)
636 return MAX_AI_DMA_RING_COUNT;
638 return MIN_AI_DMA_RING_COUNT;
641 static const int bytes_in_sample = 2;
643 static const struct pcidas64_board pcidas64_boards[] = {
644 [BOARD_PCIDAS6402_16] = {
645 .name = "pci-das6402/16",
651 .ao_scan_speed = 10000,
652 .layout = LAYOUT_64XX,
653 .ai_range_table = &ai_ranges_64xx,
654 .ao_range_table = &ao_ranges_64xx,
655 .ao_range_code = ao_range_code_64xx,
656 .ai_fifo = &ai_fifo_64xx,
659 [BOARD_PCIDAS6402_12] = {
660 .name = "pci-das6402/12", /* XXX check */
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,
674 [BOARD_PCIDAS64_M1_16] = {
675 .name = "pci-das64/m1/16",
681 .ao_scan_speed = 10000,
682 .layout = LAYOUT_64XX,
683 .ai_range_table = &ai_ranges_64xx,
684 .ao_range_table = &ao_ranges_64xx,
685 .ao_range_code = ao_range_code_64xx,
686 .ai_fifo = &ai_fifo_64xx,
689 [BOARD_PCIDAS64_M2_16] = {
690 .name = "pci-das64/m2/16",
696 .ao_scan_speed = 10000,
697 .layout = LAYOUT_64XX,
698 .ai_range_table = &ai_ranges_64xx,
699 .ao_range_table = &ao_ranges_64xx,
700 .ao_range_code = ao_range_code_64xx,
701 .ai_fifo = &ai_fifo_64xx,
704 [BOARD_PCIDAS64_M3_16] = {
705 .name = "pci-das64/m3/16",
711 .ao_scan_speed = 10000,
712 .layout = LAYOUT_64XX,
713 .ai_range_table = &ai_ranges_64xx,
714 .ao_range_table = &ao_ranges_64xx,
715 .ao_range_code = ao_range_code_64xx,
716 .ai_fifo = &ai_fifo_64xx,
719 [BOARD_PCIDAS6013] = {
720 .name = "pci-das6013",
726 .layout = LAYOUT_60XX,
727 .ai_range_table = &ai_ranges_60xx,
728 .ao_range_table = &range_bipolar10,
729 .ao_range_code = ao_range_code_60xx,
730 .ai_fifo = &ai_fifo_60xx,
733 [BOARD_PCIDAS6014] = {
734 .name = "pci-das6014",
740 .ao_scan_speed = 100000,
741 .layout = LAYOUT_60XX,
742 .ai_range_table = &ai_ranges_60xx,
743 .ao_range_table = &range_bipolar10,
744 .ao_range_code = ao_range_code_60xx,
745 .ai_fifo = &ai_fifo_60xx,
748 [BOARD_PCIDAS6023] = {
749 .name = "pci-das6023",
754 .ao_scan_speed = 100000,
755 .layout = LAYOUT_60XX,
756 .ai_range_table = &ai_ranges_60xx,
757 .ao_range_table = &range_bipolar10,
758 .ao_range_code = ao_range_code_60xx,
759 .ai_fifo = &ai_fifo_60xx,
762 [BOARD_PCIDAS6025] = {
763 .name = "pci-das6025",
769 .ao_scan_speed = 100000,
770 .layout = LAYOUT_60XX,
771 .ai_range_table = &ai_ranges_60xx,
772 .ao_range_table = &range_bipolar10,
773 .ao_range_code = ao_range_code_60xx,
774 .ai_fifo = &ai_fifo_60xx,
777 [BOARD_PCIDAS6030] = {
778 .name = "pci-das6030",
784 .ao_scan_speed = 10000,
785 .layout = LAYOUT_60XX,
786 .ai_range_table = &ai_ranges_6030,
787 .ao_range_table = &ao_ranges_6030,
788 .ao_range_code = ao_range_code_6030,
789 .ai_fifo = &ai_fifo_60xx,
792 [BOARD_PCIDAS6031] = {
793 .name = "pci-das6031",
799 .ao_scan_speed = 10000,
800 .layout = LAYOUT_60XX,
801 .ai_range_table = &ai_ranges_6030,
802 .ao_range_table = &ao_ranges_6030,
803 .ao_range_code = ao_range_code_6030,
804 .ai_fifo = &ai_fifo_60xx,
807 [BOARD_PCIDAS6032] = {
808 .name = "pci-das6032",
813 .layout = LAYOUT_60XX,
814 .ai_range_table = &ai_ranges_6030,
815 .ai_fifo = &ai_fifo_60xx,
818 [BOARD_PCIDAS6033] = {
819 .name = "pci-das6033",
824 .layout = LAYOUT_60XX,
825 .ai_range_table = &ai_ranges_6030,
826 .ai_fifo = &ai_fifo_60xx,
829 [BOARD_PCIDAS6034] = {
830 .name = "pci-das6034",
836 .layout = LAYOUT_60XX,
837 .ai_range_table = &ai_ranges_60xx,
838 .ai_fifo = &ai_fifo_60xx,
841 [BOARD_PCIDAS6035] = {
842 .name = "pci-das6035",
848 .ao_scan_speed = 100000,
849 .layout = LAYOUT_60XX,
850 .ai_range_table = &ai_ranges_60xx,
851 .ao_range_table = &range_bipolar10,
852 .ao_range_code = ao_range_code_60xx,
853 .ai_fifo = &ai_fifo_60xx,
856 [BOARD_PCIDAS6036] = {
857 .name = "pci-das6036",
863 .ao_scan_speed = 100000,
864 .layout = LAYOUT_60XX,
865 .ai_range_table = &ai_ranges_60xx,
866 .ao_range_table = &range_bipolar10,
867 .ao_range_code = ao_range_code_60xx,
868 .ai_fifo = &ai_fifo_60xx,
871 [BOARD_PCIDAS6040] = {
872 .name = "pci-das6040",
878 .ao_scan_speed = 1000,
879 .layout = LAYOUT_60XX,
880 .ai_range_table = &ai_ranges_6052,
881 .ao_range_table = &ao_ranges_6030,
882 .ao_range_code = ao_range_code_6030,
883 .ai_fifo = &ai_fifo_60xx,
886 [BOARD_PCIDAS6052] = {
887 .name = "pci-das6052",
893 .ao_scan_speed = 3333,
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,
901 [BOARD_PCIDAS6070] = {
902 .name = "pci-das6070",
908 .ao_scan_speed = 1000,
909 .layout = LAYOUT_60XX,
910 .ai_range_table = &ai_ranges_6052,
911 .ao_range_table = &ao_ranges_6030,
912 .ao_range_code = ao_range_code_6030,
913 .ai_fifo = &ai_fifo_60xx,
916 [BOARD_PCIDAS6071] = {
917 .name = "pci-das6071",
923 .ao_scan_speed = 1000,
924 .layout = LAYOUT_60XX,
925 .ai_range_table = &ai_ranges_6052,
926 .ao_range_table = &ao_ranges_6030,
927 .ao_range_code = ao_range_code_6030,
928 .ai_fifo = &ai_fifo_60xx,
931 [BOARD_PCIDAS4020_12] = {
932 .name = "pci-das4020/12",
938 .ao_scan_speed = 0, /* no hardware pacing on ao */
939 .layout = LAYOUT_4020,
940 .ai_range_table = &ai_ranges_4020,
941 .ao_range_table = &ao_ranges_4020,
942 .ao_range_code = ao_range_code_4020,
943 .ai_fifo = &ai_fifo_4020,
948 * The device id for these boards is unknown
951 [BOARD_PCIDAS6402_16_JR] = {
952 .name = "pci-das6402/16/jr",
957 .ao_scan_speed = 10000,
958 .layout = LAYOUT_64XX,
959 .ai_range_table = &ai_ranges_64xx,
960 .ai_fifo = ai_fifo_64xx,
963 [BOARD_PCIDAS64_M1_16_JR] = {
964 .name = "pci-das64/m1/16/jr",
969 .ao_scan_speed = 10000,
970 .layout = LAYOUT_64XX,
971 .ai_range_table = &ai_ranges_64xx,
972 .ai_fifo = ai_fifo_64xx,
975 [BOARD_PCIDAS64_M2_16_JR] = {
976 .name = "pci-das64/m2/16/jr",
981 .ao_scan_speed = 10000,
982 .layout = LAYOUT_64XX,
983 .ai_range_table = &ai_ranges_64xx,
984 .ai_fifo = ai_fifo_64xx,
987 [BOARD_PCIDAS64_M3_16_JR] = {
988 .name = "pci-das64/m3/16/jr",
993 .ao_scan_speed = 10000,
994 .layout = LAYOUT_64XX,
995 .ai_range_table = &ai_ranges_64xx,
996 .ai_fifo = ai_fifo_64xx,
999 [BOARD_PCIDAS64_M1_14] = {
1000 .name = "pci-das64/m1/14",
1005 .ao_scan_speed = 10000,
1006 .layout = LAYOUT_64XX,
1007 .ai_range_table = &ai_ranges_64xx,
1008 .ai_fifo = ai_fifo_64xx,
1011 [BOARD_PCIDAS64_M2_14] = {
1012 .name = "pci-das64/m2/14",
1017 .ao_scan_speed = 10000,
1018 .layout = LAYOUT_64XX,
1019 .ai_range_table = &ai_ranges_64xx,
1020 .ai_fifo = ai_fifo_64xx,
1023 [BOARD_PCIDAS64_M3_14] = {
1024 .name = "pci-das64/m3/14",
1029 .ao_scan_speed = 10000,
1030 .layout = LAYOUT_64XX,
1031 .ai_range_table = &ai_ranges_64xx,
1032 .ai_fifo = ai_fifo_64xx,
1038 static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev,
1039 int use_differential)
1041 const struct pcidas64_board *thisboard = dev->board_ptr;
1043 if ((thisboard->layout == LAYOUT_64XX && !use_differential) ||
1044 (thisboard->layout == LAYOUT_60XX && use_differential))
1045 return ADC_SE_DIFF_BIT;
1050 struct ext_clock_info {
1051 /* master clock divisor to use for scans with external master clock */
1052 unsigned int divisor;
1053 /* chanspec for master clock input when used as scan begin src */
1054 unsigned int chanspec;
1057 /* this structure is for data unique to this hardware driver. */
1058 struct pcidas64_private {
1059 /* base addresses (physical) */
1060 resource_size_t main_phys_iobase;
1061 resource_size_t dio_counter_phys_iobase;
1062 /* base addresses (ioremapped) */
1063 void __iomem *plx9080_iobase;
1064 void __iomem *main_iobase;
1065 /* local address (used by dma controller) */
1066 uint32_t local0_iobase;
1067 uint32_t local1_iobase;
1068 /* dma buffers for analog input */
1069 uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT];
1070 /* physical addresses of ai dma buffers */
1071 dma_addr_t ai_buffer_bus_addr[MAX_AI_DMA_RING_COUNT];
1072 /* array of ai dma descriptors read by plx9080,
1073 * allocated to get proper alignment */
1074 struct plx_dma_desc *ai_dma_desc;
1075 /* physical address of ai dma descriptor array */
1076 dma_addr_t ai_dma_desc_bus_addr;
1077 /* index of the ai dma descriptor/buffer
1078 * that is currently being used */
1079 unsigned int ai_dma_index;
1080 /* dma buffers for analog output */
1081 uint16_t *ao_buffer[AO_DMA_RING_COUNT];
1082 /* physical addresses of ao dma buffers */
1083 dma_addr_t ao_buffer_bus_addr[AO_DMA_RING_COUNT];
1084 struct plx_dma_desc *ao_dma_desc;
1085 dma_addr_t ao_dma_desc_bus_addr;
1086 /* keeps track of buffer where the next ao sample should go */
1087 unsigned int ao_dma_index;
1088 unsigned int hw_revision; /* stc chip hardware revision number */
1089 /* last bits sent to INTR_ENABLE_REG register */
1090 unsigned int intr_enable_bits;
1091 /* last bits sent to ADC_CONTROL1_REG register */
1092 uint16_t adc_control1_bits;
1093 /* last bits sent to FIFO_SIZE_REG register */
1094 uint16_t fifo_size_bits;
1095 /* last bits sent to HW_CONFIG_REG register */
1096 uint16_t hw_config_bits;
1097 uint16_t dac_control1_bits;
1098 /* last bits written to plx9080 control register */
1099 uint32_t plx_control_bits;
1100 /* last bits written to plx interrupt control and status register */
1101 uint32_t plx_intcsr_bits;
1102 /* index of calibration source readable through ai ch0 */
1103 int calibration_source;
1104 /* bits written to i2c calibration/range register */
1105 uint8_t i2c_cal_range_bits;
1106 /* configure digital triggers to trigger on falling edge */
1107 unsigned int ext_trig_falling;
1108 /* states of various devices stored to enable read-back */
1109 unsigned int ad8402_state[2];
1110 short ai_cmd_running;
1111 unsigned int ai_fifo_segment_length;
1112 struct ext_clock_info ext_clock;
1113 unsigned short ao_bounce_buffer[DAC_FIFO_SIZE];
1116 static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
1117 unsigned int range_index)
1119 const struct pcidas64_board *thisboard = dev->board_ptr;
1120 const struct comedi_krange *range =
1121 &thisboard->ai_range_table->range[range_index];
1122 unsigned int bits = 0;
1124 switch (range->max) {
1153 dev_err(dev->class_dev, "bug! in %s\n", __func__);
1156 if (range->min == 0)
1161 static unsigned int hw_revision(const struct comedi_device *dev,
1162 uint16_t hw_status_bits)
1164 const struct pcidas64_board *thisboard = dev->board_ptr;
1166 if (thisboard->layout == LAYOUT_4020)
1167 return (hw_status_bits >> 13) & 0x7;
1169 return (hw_status_bits >> 12) & 0xf;
1172 static void set_dac_range_bits(struct comedi_device *dev,
1173 uint16_t *bits, unsigned int channel,
1176 const struct pcidas64_board *thisboard = dev->board_ptr;
1177 unsigned int code = thisboard->ao_range_code[range];
1180 dev_err(dev->class_dev, "bug! bad channel?\n");
1182 dev_err(dev->class_dev, "bug! bad range code?\n");
1184 *bits &= ~(0x3 << (2 * channel));
1185 *bits |= code << (2 * channel);
1188 static inline int ao_cmd_is_supported(const struct pcidas64_board *board)
1190 return board->ao_nchan && board->layout != LAYOUT_4020;
1193 static void abort_dma(struct comedi_device *dev, unsigned int channel)
1195 struct pcidas64_private *devpriv = dev->private;
1196 unsigned long flags;
1198 /* spinlock for plx dma control/status reg */
1199 spin_lock_irqsave(&dev->spinlock, flags);
1201 plx9080_abort_dma(devpriv->plx9080_iobase, channel);
1203 spin_unlock_irqrestore(&dev->spinlock, flags);
1206 static void disable_plx_interrupts(struct comedi_device *dev)
1208 struct pcidas64_private *devpriv = dev->private;
1210 devpriv->plx_intcsr_bits = 0;
1211 writel(devpriv->plx_intcsr_bits,
1212 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1215 static void disable_ai_interrupts(struct comedi_device *dev)
1217 struct pcidas64_private *devpriv = dev->private;
1218 unsigned long flags;
1220 spin_lock_irqsave(&dev->spinlock, flags);
1221 devpriv->intr_enable_bits &=
1222 ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
1223 ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
1224 ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
1225 writew(devpriv->intr_enable_bits,
1226 devpriv->main_iobase + INTR_ENABLE_REG);
1227 spin_unlock_irqrestore(&dev->spinlock, flags);
1230 static void enable_ai_interrupts(struct comedi_device *dev,
1231 const struct comedi_cmd *cmd)
1233 const struct pcidas64_board *thisboard = dev->board_ptr;
1234 struct pcidas64_private *devpriv = dev->private;
1236 unsigned long flags;
1238 bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
1239 EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
1240 /* Use pio transfer and interrupt on end of conversion
1241 * if CMDF_WAKE_EOS flag is set. */
1242 if (cmd->flags & CMDF_WAKE_EOS) {
1243 /* 4020 doesn't support pio transfers except for fifo dregs */
1244 if (thisboard->layout != LAYOUT_4020)
1245 bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
1247 spin_lock_irqsave(&dev->spinlock, flags);
1248 devpriv->intr_enable_bits |= bits;
1249 writew(devpriv->intr_enable_bits,
1250 devpriv->main_iobase + INTR_ENABLE_REG);
1251 spin_unlock_irqrestore(&dev->spinlock, flags);
1254 /* initialize plx9080 chip */
1255 static void init_plx9080(struct comedi_device *dev)
1257 const struct pcidas64_board *thisboard = dev->board_ptr;
1258 struct pcidas64_private *devpriv = dev->private;
1260 void __iomem *plx_iobase = devpriv->plx9080_iobase;
1262 devpriv->plx_control_bits =
1263 readl(devpriv->plx9080_iobase + PLX_CONTROL_REG);
1266 bits = BIGEND_DMA0 | BIGEND_DMA1;
1270 writel(bits, devpriv->plx9080_iobase + PLX_BIGEND_REG);
1272 disable_plx_interrupts(dev);
1277 /* configure dma0 mode */
1279 /* enable ready input, not sure if this is necessary */
1280 bits |= PLX_DMA_EN_READYIN_BIT;
1281 /* enable bterm, not sure if this is necessary */
1282 bits |= PLX_EN_BTERM_BIT;
1283 /* enable dma chaining */
1284 bits |= PLX_EN_CHAIN_BIT;
1285 /* enable interrupt on dma done
1286 * (probably don't need this, since chain never finishes) */
1287 bits |= PLX_EN_DMA_DONE_INTR_BIT;
1288 /* don't increment local address during transfers
1289 * (we are transferring from a fixed fifo register) */
1290 bits |= PLX_LOCAL_ADDR_CONST_BIT;
1291 /* route dma interrupt to pci bus */
1292 bits |= PLX_DMA_INTR_PCI_BIT;
1293 /* enable demand mode */
1294 bits |= PLX_DEMAND_MODE_BIT;
1295 /* enable local burst mode */
1296 bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1297 /* 4020 uses 32 bit dma */
1298 if (thisboard->layout == LAYOUT_4020)
1299 bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1300 else /* localspace0 bus is 16 bits wide */
1301 bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
1302 writel(bits, plx_iobase + PLX_DMA1_MODE_REG);
1303 if (ao_cmd_is_supported(thisboard))
1304 writel(bits, plx_iobase + PLX_DMA0_MODE_REG);
1306 /* enable interrupts on plx 9080 */
1307 devpriv->plx_intcsr_bits |=
1308 ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1309 ICS_DMA0_E | ICS_DMA1_E;
1310 writel(devpriv->plx_intcsr_bits,
1311 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1314 static void disable_ai_pacing(struct comedi_device *dev)
1316 struct pcidas64_private *devpriv = dev->private;
1317 unsigned long flags;
1319 disable_ai_interrupts(dev);
1321 spin_lock_irqsave(&dev->spinlock, flags);
1322 devpriv->adc_control1_bits &= ~ADC_SW_GATE_BIT;
1323 writew(devpriv->adc_control1_bits,
1324 devpriv->main_iobase + ADC_CONTROL1_REG);
1325 spin_unlock_irqrestore(&dev->spinlock, flags);
1327 /* disable pacing, triggering, etc */
1328 writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
1329 devpriv->main_iobase + ADC_CONTROL0_REG);
1332 static int set_ai_fifo_segment_length(struct comedi_device *dev,
1333 unsigned int num_entries)
1335 const struct pcidas64_board *thisboard = dev->board_ptr;
1336 struct pcidas64_private *devpriv = dev->private;
1337 static const int increment_size = 0x100;
1338 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1339 unsigned int num_increments;
1342 if (num_entries < increment_size)
1343 num_entries = increment_size;
1344 if (num_entries > fifo->max_segment_length)
1345 num_entries = fifo->max_segment_length;
1347 /* 1 == 256 entries, 2 == 512 entries, etc */
1348 num_increments = (num_entries + increment_size / 2) / increment_size;
1350 bits = (~(num_increments - 1)) & fifo->fifo_size_reg_mask;
1351 devpriv->fifo_size_bits &= ~fifo->fifo_size_reg_mask;
1352 devpriv->fifo_size_bits |= bits;
1353 writew(devpriv->fifo_size_bits,
1354 devpriv->main_iobase + FIFO_SIZE_REG);
1356 devpriv->ai_fifo_segment_length = num_increments * increment_size;
1358 return devpriv->ai_fifo_segment_length;
1361 /* adjusts the size of hardware fifo (which determines block size for dma xfers) */
1362 static int set_ai_fifo_size(struct comedi_device *dev, unsigned int num_samples)
1364 const struct pcidas64_board *thisboard = dev->board_ptr;
1365 unsigned int num_fifo_entries;
1367 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1369 num_fifo_entries = num_samples / fifo->sample_packing_ratio;
1371 retval = set_ai_fifo_segment_length(dev,
1373 fifo->num_segments);
1377 num_samples = retval * fifo->num_segments * fifo->sample_packing_ratio;
1382 /* query length of fifo */
1383 static unsigned int ai_fifo_size(struct comedi_device *dev)
1385 const struct pcidas64_board *thisboard = dev->board_ptr;
1386 struct pcidas64_private *devpriv = dev->private;
1388 return devpriv->ai_fifo_segment_length *
1389 thisboard->ai_fifo->num_segments *
1390 thisboard->ai_fifo->sample_packing_ratio;
1393 static void init_stc_registers(struct comedi_device *dev)
1395 const struct pcidas64_board *thisboard = dev->board_ptr;
1396 struct pcidas64_private *devpriv = dev->private;
1398 unsigned long flags;
1400 spin_lock_irqsave(&dev->spinlock, flags);
1402 /* bit should be set for 6025,
1403 * although docs say boards with <= 16 chans should be cleared XXX */
1405 devpriv->adc_control1_bits |= ADC_QUEUE_CONFIG_BIT;
1406 writew(devpriv->adc_control1_bits,
1407 devpriv->main_iobase + ADC_CONTROL1_REG);
1409 /* 6402/16 manual says this register must be initialized to 0xff? */
1410 writew(0xff, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1412 bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
1413 if (thisboard->layout == LAYOUT_4020)
1414 bits |= INTERNAL_CLOCK_4020_BITS;
1415 devpriv->hw_config_bits |= bits;
1416 writew(devpriv->hw_config_bits,
1417 devpriv->main_iobase + HW_CONFIG_REG);
1419 writew(0, devpriv->main_iobase + DAQ_SYNC_REG);
1420 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1422 spin_unlock_irqrestore(&dev->spinlock, flags);
1424 /* set fifos to maximum size */
1425 devpriv->fifo_size_bits |= DAC_FIFO_BITS;
1426 set_ai_fifo_segment_length(dev,
1427 thisboard->ai_fifo->max_segment_length);
1429 devpriv->dac_control1_bits = DAC_OUTPUT_ENABLE_BIT;
1430 devpriv->intr_enable_bits =
1431 /* EN_DAC_INTR_SRC_BIT | DAC_INTR_QEMPTY_BITS | */
1432 EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1433 writew(devpriv->intr_enable_bits,
1434 devpriv->main_iobase + INTR_ENABLE_REG);
1436 disable_ai_pacing(dev);
1439 static int alloc_and_init_dma_members(struct comedi_device *dev)
1441 const struct pcidas64_board *thisboard = dev->board_ptr;
1442 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1443 struct pcidas64_private *devpriv = dev->private;
1446 /* allocate pci dma buffers */
1447 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1448 devpriv->ai_buffer[i] =
1449 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1450 &devpriv->ai_buffer_bus_addr[i]);
1451 if (devpriv->ai_buffer[i] == NULL)
1455 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1456 if (ao_cmd_is_supported(thisboard)) {
1457 devpriv->ao_buffer[i] =
1458 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1460 ao_buffer_bus_addr[i]);
1461 if (devpriv->ao_buffer[i] == NULL)
1466 /* allocate dma descriptors */
1467 devpriv->ai_dma_desc =
1468 pci_alloc_consistent(pcidev, sizeof(struct plx_dma_desc) *
1469 ai_dma_ring_count(thisboard),
1470 &devpriv->ai_dma_desc_bus_addr);
1471 if (devpriv->ai_dma_desc == NULL)
1474 if (ao_cmd_is_supported(thisboard)) {
1475 devpriv->ao_dma_desc =
1476 pci_alloc_consistent(pcidev,
1477 sizeof(struct plx_dma_desc) *
1479 &devpriv->ao_dma_desc_bus_addr);
1480 if (devpriv->ao_dma_desc == NULL)
1483 /* initialize dma descriptors */
1484 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1485 devpriv->ai_dma_desc[i].pci_start_addr =
1486 cpu_to_le32(devpriv->ai_buffer_bus_addr[i]);
1487 if (thisboard->layout == LAYOUT_4020)
1488 devpriv->ai_dma_desc[i].local_start_addr =
1489 cpu_to_le32(devpriv->local1_iobase +
1492 devpriv->ai_dma_desc[i].local_start_addr =
1493 cpu_to_le32(devpriv->local0_iobase +
1495 devpriv->ai_dma_desc[i].transfer_size = cpu_to_le32(0);
1496 devpriv->ai_dma_desc[i].next =
1497 cpu_to_le32((devpriv->ai_dma_desc_bus_addr +
1498 ((i + 1) % ai_dma_ring_count(thisboard)) *
1499 sizeof(devpriv->ai_dma_desc[0])) |
1500 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1501 PLX_XFER_LOCAL_TO_PCI);
1503 if (ao_cmd_is_supported(thisboard)) {
1504 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1505 devpriv->ao_dma_desc[i].pci_start_addr =
1506 cpu_to_le32(devpriv->ao_buffer_bus_addr[i]);
1507 devpriv->ao_dma_desc[i].local_start_addr =
1508 cpu_to_le32(devpriv->local0_iobase +
1510 devpriv->ao_dma_desc[i].transfer_size = cpu_to_le32(0);
1511 devpriv->ao_dma_desc[i].next =
1512 cpu_to_le32((devpriv->ao_dma_desc_bus_addr +
1513 ((i + 1) % (AO_DMA_RING_COUNT)) *
1514 sizeof(devpriv->ao_dma_desc[0])) |
1515 PLX_DESC_IN_PCI_BIT |
1516 PLX_INTR_TERM_COUNT);
1522 static void cb_pcidas64_free_dma(struct comedi_device *dev)
1524 const struct pcidas64_board *thisboard = dev->board_ptr;
1525 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1526 struct pcidas64_private *devpriv = dev->private;
1532 /* free pci dma buffers */
1533 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1534 if (devpriv->ai_buffer[i])
1535 pci_free_consistent(pcidev,
1537 devpriv->ai_buffer[i],
1538 devpriv->ai_buffer_bus_addr[i]);
1540 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1541 if (devpriv->ao_buffer[i])
1542 pci_free_consistent(pcidev,
1544 devpriv->ao_buffer[i],
1545 devpriv->ao_buffer_bus_addr[i]);
1547 /* free dma descriptors */
1548 if (devpriv->ai_dma_desc)
1549 pci_free_consistent(pcidev,
1550 sizeof(struct plx_dma_desc) *
1551 ai_dma_ring_count(thisboard),
1552 devpriv->ai_dma_desc,
1553 devpriv->ai_dma_desc_bus_addr);
1554 if (devpriv->ao_dma_desc)
1555 pci_free_consistent(pcidev,
1556 sizeof(struct plx_dma_desc) *
1558 devpriv->ao_dma_desc,
1559 devpriv->ao_dma_desc_bus_addr);
1562 static inline void warn_external_queue(struct comedi_device *dev)
1564 dev_err(dev->class_dev,
1565 "AO command and AI external channel queue cannot be used simultaneously\n");
1566 dev_err(dev->class_dev,
1567 "Use internal AI channel queue (channels must be consecutive and use same range/aref)\n");
1570 /* Their i2c requires a huge delay on setting clock or data high for some reason */
1571 static const int i2c_high_udelay = 1000;
1572 static const int i2c_low_udelay = 10;
1574 /* set i2c data line high or low */
1575 static void i2c_set_sda(struct comedi_device *dev, int state)
1577 struct pcidas64_private *devpriv = dev->private;
1578 static const int data_bit = CTL_EE_W;
1579 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
1583 /* set data line high */
1584 devpriv->plx_control_bits &= ~data_bit;
1585 writel(devpriv->plx_control_bits, plx_control_addr);
1586 udelay(i2c_high_udelay);
1587 } else { /* set data line low */
1589 devpriv->plx_control_bits |= data_bit;
1590 writel(devpriv->plx_control_bits, plx_control_addr);
1591 udelay(i2c_low_udelay);
1595 /* set i2c clock line high or low */
1596 static void i2c_set_scl(struct comedi_device *dev, int state)
1598 struct pcidas64_private *devpriv = dev->private;
1599 static const int clock_bit = CTL_USERO;
1600 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
1604 /* set clock line high */
1605 devpriv->plx_control_bits &= ~clock_bit;
1606 writel(devpriv->plx_control_bits, plx_control_addr);
1607 udelay(i2c_high_udelay);
1608 } else { /* set clock line low */
1610 devpriv->plx_control_bits |= clock_bit;
1611 writel(devpriv->plx_control_bits, plx_control_addr);
1612 udelay(i2c_low_udelay);
1616 static void i2c_write_byte(struct comedi_device *dev, uint8_t byte)
1619 unsigned int num_bits = 8;
1621 for (bit = 1 << (num_bits - 1); bit; bit >>= 1) {
1622 i2c_set_scl(dev, 0);
1624 i2c_set_sda(dev, 1);
1626 i2c_set_sda(dev, 0);
1627 i2c_set_scl(dev, 1);
1631 /* we can't really read the lines, so fake it */
1632 static int i2c_read_ack(struct comedi_device *dev)
1634 i2c_set_scl(dev, 0);
1635 i2c_set_sda(dev, 1);
1636 i2c_set_scl(dev, 1);
1638 return 0; /* return fake acknowledge bit */
1641 /* send start bit */
1642 static void i2c_start(struct comedi_device *dev)
1644 i2c_set_scl(dev, 1);
1645 i2c_set_sda(dev, 1);
1646 i2c_set_sda(dev, 0);
1650 static void i2c_stop(struct comedi_device *dev)
1652 i2c_set_scl(dev, 0);
1653 i2c_set_sda(dev, 0);
1654 i2c_set_scl(dev, 1);
1655 i2c_set_sda(dev, 1);
1658 static void i2c_write(struct comedi_device *dev, unsigned int address,
1659 const uint8_t *data, unsigned int length)
1661 struct pcidas64_private *devpriv = dev->private;
1664 static const int read_bit = 0x1;
1666 /* XXX need mutex to prevent simultaneous attempts to access
1667 * eeprom and i2c bus */
1669 /* make sure we dont send anything to eeprom */
1670 devpriv->plx_control_bits &= ~CTL_EE_CS;
1675 /* send address and write bit */
1676 bitstream = (address << 1) & ~read_bit;
1677 i2c_write_byte(dev, bitstream);
1679 /* get acknowledge */
1680 if (i2c_read_ack(dev) != 0) {
1681 dev_err(dev->class_dev, "%s failed: no acknowledge\n",
1686 /* write data bytes */
1687 for (i = 0; i < length; i++) {
1688 i2c_write_byte(dev, data[i]);
1689 if (i2c_read_ack(dev) != 0) {
1690 dev_err(dev->class_dev, "%s failed: no acknowledge\n",
1699 static int cb_pcidas64_ai_eoc(struct comedi_device *dev,
1700 struct comedi_subdevice *s,
1701 struct comedi_insn *insn,
1702 unsigned long context)
1704 const struct pcidas64_board *thisboard = dev->board_ptr;
1705 struct pcidas64_private *devpriv = dev->private;
1706 unsigned int status;
1708 status = readw(devpriv->main_iobase + HW_STATUS_REG);
1709 if (thisboard->layout == LAYOUT_4020) {
1710 status = readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG);
1714 if (pipe_full_bits(status))
1720 static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1721 struct comedi_insn *insn, unsigned int *data)
1723 const struct pcidas64_board *thisboard = dev->board_ptr;
1724 struct pcidas64_private *devpriv = dev->private;
1725 unsigned int bits = 0, n;
1726 unsigned int channel, range, aref;
1727 unsigned long flags;
1730 channel = CR_CHAN(insn->chanspec);
1731 range = CR_RANGE(insn->chanspec);
1732 aref = CR_AREF(insn->chanspec);
1734 /* disable card's analog input interrupt sources and pacing */
1735 /* 4020 generates dac done interrupts even though they are disabled */
1736 disable_ai_pacing(dev);
1738 spin_lock_irqsave(&dev->spinlock, flags);
1739 if (insn->chanspec & CR_ALT_FILTER)
1740 devpriv->adc_control1_bits |= ADC_DITHER_BIT;
1742 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
1743 writew(devpriv->adc_control1_bits,
1744 devpriv->main_iobase + ADC_CONTROL1_REG);
1745 spin_unlock_irqrestore(&dev->spinlock, flags);
1747 if (thisboard->layout != LAYOUT_4020) {
1748 /* use internal queue */
1749 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
1750 writew(devpriv->hw_config_bits,
1751 devpriv->main_iobase + HW_CONFIG_REG);
1753 /* ALT_SOURCE is internal calibration reference */
1754 if (insn->chanspec & CR_ALT_SOURCE) {
1755 unsigned int cal_en_bit;
1757 if (thisboard->layout == LAYOUT_60XX)
1758 cal_en_bit = CAL_EN_60XX_BIT;
1760 cal_en_bit = CAL_EN_64XX_BIT;
1761 /* select internal reference source to connect
1764 adc_src_bits(devpriv->calibration_source),
1765 devpriv->main_iobase + CALIBRATION_REG);
1767 /* make sure internal calibration source
1769 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1771 /* load internal queue */
1774 bits |= ai_range_bits_6xxx(dev, CR_RANGE(insn->chanspec));
1775 /* set single-ended / differential */
1776 bits |= se_diff_bit_6xxx(dev, aref == AREF_DIFF);
1777 if (aref == AREF_COMMON)
1778 bits |= ADC_COMMON_BIT;
1779 bits |= adc_chan_bits(channel);
1780 /* set stop channel */
1781 writew(adc_chan_bits(channel),
1782 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
1783 /* set start channel, and rest of settings */
1784 writew(bits, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
1786 uint8_t old_cal_range_bits = devpriv->i2c_cal_range_bits;
1788 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
1789 if (insn->chanspec & CR_ALT_SOURCE) {
1790 devpriv->i2c_cal_range_bits |=
1791 adc_src_4020_bits(devpriv->calibration_source);
1792 } else { /* select BNC inputs */
1793 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
1797 devpriv->i2c_cal_range_bits |= attenuate_bit(channel);
1799 devpriv->i2c_cal_range_bits &= ~attenuate_bit(channel);
1800 /* update calibration/range i2c register only if necessary,
1801 * as it is very slow */
1802 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
1803 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
1805 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
1809 /* 4020 manual asks that sample interval register to be set
1810 * before writing to convert register.
1811 * Using somewhat arbitrary setting of 4 master clock ticks
1813 writew(0, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1814 writew(2, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
1817 for (n = 0; n < insn->n; n++) {
1819 /* clear adc buffer (inside loop for 4020 sake) */
1820 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
1822 /* trigger conversion, bits sent only matter for 4020 */
1823 writew(adc_convert_chan_4020_bits(CR_CHAN(insn->chanspec)),
1824 devpriv->main_iobase + ADC_CONVERT_REG);
1827 ret = comedi_timeout(dev, s, insn, cb_pcidas64_ai_eoc, 0);
1831 if (thisboard->layout == LAYOUT_4020)
1832 data[n] = readl(dev->mmio + ADC_FIFO_REG) & 0xffff;
1834 data[n] = readw(devpriv->main_iobase + PIPE1_READ_REG);
1840 static int ai_config_calibration_source(struct comedi_device *dev,
1843 const struct pcidas64_board *thisboard = dev->board_ptr;
1844 struct pcidas64_private *devpriv = dev->private;
1845 unsigned int source = data[1];
1846 int num_calibration_sources;
1848 if (thisboard->layout == LAYOUT_60XX)
1849 num_calibration_sources = 16;
1851 num_calibration_sources = 8;
1852 if (source >= num_calibration_sources) {
1853 dev_dbg(dev->class_dev, "invalid calibration source: %i\n",
1858 devpriv->calibration_source = source;
1863 static int ai_config_block_size(struct comedi_device *dev, unsigned int *data)
1865 const struct pcidas64_board *thisboard = dev->board_ptr;
1867 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1868 unsigned int block_size, requested_block_size;
1871 requested_block_size = data[1];
1873 if (requested_block_size) {
1874 fifo_size = requested_block_size * fifo->num_segments /
1877 retval = set_ai_fifo_size(dev, fifo_size);
1883 block_size = ai_fifo_size(dev) / fifo->num_segments * bytes_in_sample;
1885 data[1] = block_size;
1890 static int ai_config_master_clock_4020(struct comedi_device *dev,
1893 struct pcidas64_private *devpriv = dev->private;
1894 unsigned int divisor = data[4];
1903 case COMEDI_EV_SCAN_BEGIN:
1904 devpriv->ext_clock.divisor = divisor;
1905 devpriv->ext_clock.chanspec = data[2];
1913 return retval ? retval : 5;
1916 /* XXX could add support for 60xx series */
1917 static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data)
1919 const struct pcidas64_board *thisboard = dev->board_ptr;
1921 switch (thisboard->layout) {
1923 return ai_config_master_clock_4020(dev, data);
1931 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1932 struct comedi_insn *insn, unsigned int *data)
1937 case INSN_CONFIG_ALT_SOURCE:
1938 return ai_config_calibration_source(dev, data);
1939 case INSN_CONFIG_BLOCK_SIZE:
1940 return ai_config_block_size(dev, data);
1941 case INSN_CONFIG_TIMER_1:
1942 return ai_config_master_clock(dev, data);
1949 /* Gets nearest achievable timing given master clock speed, does not
1950 * take into account possible minimum/maximum divisor values. Used
1951 * by other timing checking functions. */
1952 static unsigned int get_divisor(unsigned int ns, unsigned int flags)
1954 unsigned int divisor;
1956 switch (flags & CMDF_ROUND_MASK) {
1958 divisor = (ns + TIMER_BASE - 1) / TIMER_BASE;
1960 case CMDF_ROUND_DOWN:
1961 divisor = ns / TIMER_BASE;
1963 case CMDF_ROUND_NEAREST:
1965 divisor = (ns + TIMER_BASE / 2) / TIMER_BASE;
1971 /* utility function that rounds desired timing to an achievable time, and
1972 * sets cmd members appropriately.
1973 * adc paces conversions from master clock by dividing by (x + 3) where x is 24 bit number
1975 static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
1977 const struct pcidas64_board *thisboard = dev->board_ptr;
1978 unsigned int convert_divisor = 0, scan_divisor;
1979 static const int min_convert_divisor = 3;
1980 static const int max_convert_divisor =
1981 max_counter_value + min_convert_divisor;
1982 static const int min_scan_divisor_4020 = 2;
1983 unsigned long long max_scan_divisor, min_scan_divisor;
1985 if (cmd->convert_src == TRIG_TIMER) {
1986 if (thisboard->layout == LAYOUT_4020) {
1987 cmd->convert_arg = 0;
1989 convert_divisor = get_divisor(cmd->convert_arg,
1991 if (convert_divisor > max_convert_divisor)
1992 convert_divisor = max_convert_divisor;
1993 if (convert_divisor < min_convert_divisor)
1994 convert_divisor = min_convert_divisor;
1995 cmd->convert_arg = convert_divisor * TIMER_BASE;
1997 } else if (cmd->convert_src == TRIG_NOW) {
1998 cmd->convert_arg = 0;
2001 if (cmd->scan_begin_src == TRIG_TIMER) {
2002 scan_divisor = get_divisor(cmd->scan_begin_arg, cmd->flags);
2003 if (cmd->convert_src == TRIG_TIMER) {
2004 /* XXX check for integer overflows */
2005 min_scan_divisor = convert_divisor * cmd->chanlist_len;
2007 (convert_divisor * cmd->chanlist_len - 1) +
2010 min_scan_divisor = min_scan_divisor_4020;
2011 max_scan_divisor = max_counter_value + min_scan_divisor;
2013 if (scan_divisor > max_scan_divisor)
2014 scan_divisor = max_scan_divisor;
2015 if (scan_divisor < min_scan_divisor)
2016 scan_divisor = min_scan_divisor;
2017 cmd->scan_begin_arg = scan_divisor * TIMER_BASE;
2021 static int cb_pcidas64_ai_check_chanlist(struct comedi_device *dev,
2022 struct comedi_subdevice *s,
2023 struct comedi_cmd *cmd)
2025 const struct pcidas64_board *board = dev->board_ptr;
2026 unsigned int aref0 = CR_AREF(cmd->chanlist[0]);
2029 for (i = 1; i < cmd->chanlist_len; i++) {
2030 unsigned int aref = CR_AREF(cmd->chanlist[i]);
2032 if (aref != aref0) {
2033 dev_dbg(dev->class_dev,
2034 "all elements in chanlist must use the same analog reference\n");
2039 if (board->layout == LAYOUT_4020) {
2040 unsigned int chan0 = CR_CHAN(cmd->chanlist[0]);
2042 for (i = 1; i < cmd->chanlist_len; i++) {
2043 unsigned int chan = CR_CHAN(cmd->chanlist[i]);
2045 if (chan != (chan0 + i)) {
2046 dev_dbg(dev->class_dev,
2047 "chanlist must use consecutive channels\n");
2051 if (cmd->chanlist_len == 3) {
2052 dev_dbg(dev->class_dev,
2053 "chanlist cannot be 3 channels long, use 1, 2, or 4 channels\n");
2061 static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2062 struct comedi_cmd *cmd)
2064 const struct pcidas64_board *thisboard = dev->board_ptr;
2066 unsigned int tmp_arg, tmp_arg2;
2067 unsigned int triggers;
2069 /* Step 1 : check if triggers are trivially valid */
2071 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
2073 triggers = TRIG_TIMER;
2074 if (thisboard->layout == LAYOUT_4020)
2075 triggers |= TRIG_OTHER;
2077 triggers |= TRIG_FOLLOW;
2078 err |= cfc_check_trigger_src(&cmd->scan_begin_src, triggers);
2080 triggers = TRIG_TIMER;
2081 if (thisboard->layout == LAYOUT_4020)
2082 triggers |= TRIG_NOW;
2084 triggers |= TRIG_EXT;
2085 err |= cfc_check_trigger_src(&cmd->convert_src, triggers);
2086 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
2087 err |= cfc_check_trigger_src(&cmd->stop_src,
2088 TRIG_COUNT | TRIG_EXT | TRIG_NONE);
2093 /* Step 2a : make sure trigger sources are unique */
2095 err |= cfc_check_trigger_is_unique(cmd->start_src);
2096 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
2097 err |= cfc_check_trigger_is_unique(cmd->convert_src);
2098 err |= cfc_check_trigger_is_unique(cmd->stop_src);
2100 /* Step 2b : and mutually compatible */
2102 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
2108 /* Step 3: check if arguments are trivially valid */
2110 switch (cmd->start_src) {
2112 err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
2116 * start_arg is the CR_CHAN | CR_INVERT of the
2122 if (cmd->convert_src == TRIG_TIMER) {
2123 if (thisboard->layout == LAYOUT_4020) {
2124 err |= cfc_check_trigger_arg_is(&cmd->convert_arg, 0);
2126 err |= cfc_check_trigger_arg_min(&cmd->convert_arg,
2127 thisboard->ai_speed);
2128 /* if scans are timed faster than conversion rate allows */
2129 if (cmd->scan_begin_src == TRIG_TIMER)
2130 err |= cfc_check_trigger_arg_min(
2131 &cmd->scan_begin_arg,
2137 err |= cfc_check_trigger_arg_min(&cmd->chanlist_len, 1);
2138 err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
2140 switch (cmd->stop_src) {
2144 err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1);
2147 err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
2156 /* step 4: fix up any arguments */
2158 if (cmd->convert_src == TRIG_TIMER) {
2159 tmp_arg = cmd->convert_arg;
2160 tmp_arg2 = cmd->scan_begin_arg;
2161 check_adc_timing(dev, cmd);
2162 if (tmp_arg != cmd->convert_arg)
2164 if (tmp_arg2 != cmd->scan_begin_arg)
2171 /* Step 5: check channel list if it exists */
2172 if (cmd->chanlist && cmd->chanlist_len > 0)
2173 err |= cb_pcidas64_ai_check_chanlist(dev, s, cmd);
2181 static int use_hw_sample_counter(struct comedi_cmd *cmd)
2183 /* disable for now until I work out a race */
2186 if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value)
2192 static void setup_sample_counters(struct comedi_device *dev,
2193 struct comedi_cmd *cmd)
2195 struct pcidas64_private *devpriv = dev->private;
2197 /* load hardware conversion counter */
2198 if (use_hw_sample_counter(cmd)) {
2199 writew(cmd->stop_arg & 0xffff,
2200 devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2201 writew((cmd->stop_arg >> 16) & 0xff,
2202 devpriv->main_iobase + ADC_COUNT_UPPER_REG);
2204 writew(1, devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2208 static inline unsigned int dma_transfer_size(struct comedi_device *dev)
2210 const struct pcidas64_board *thisboard = dev->board_ptr;
2211 struct pcidas64_private *devpriv = dev->private;
2212 unsigned int num_samples;
2214 num_samples = devpriv->ai_fifo_segment_length *
2215 thisboard->ai_fifo->sample_packing_ratio;
2216 if (num_samples > DMA_BUFFER_SIZE / sizeof(uint16_t))
2217 num_samples = DMA_BUFFER_SIZE / sizeof(uint16_t);
2222 static uint32_t ai_convert_counter_6xxx(const struct comedi_device *dev,
2223 const struct comedi_cmd *cmd)
2225 /* supposed to load counter with desired divisor minus 3 */
2226 return cmd->convert_arg / TIMER_BASE - 3;
2229 static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev,
2230 struct comedi_cmd *cmd)
2234 /* figure out how long we need to delay at end of scan */
2235 switch (cmd->scan_begin_src) {
2237 count = (cmd->scan_begin_arg -
2238 (cmd->convert_arg * (cmd->chanlist_len - 1))) /
2242 count = cmd->convert_arg / TIMER_BASE;
2250 static uint32_t ai_convert_counter_4020(struct comedi_device *dev,
2251 struct comedi_cmd *cmd)
2253 struct pcidas64_private *devpriv = dev->private;
2254 unsigned int divisor;
2256 switch (cmd->scan_begin_src) {
2258 divisor = cmd->scan_begin_arg / TIMER_BASE;
2261 divisor = devpriv->ext_clock.divisor;
2263 default: /* should never happen */
2264 dev_err(dev->class_dev, "bug! failed to set ai pacing!\n");
2269 /* supposed to load counter with desired divisor minus 2 for 4020 */
2273 static void select_master_clock_4020(struct comedi_device *dev,
2274 const struct comedi_cmd *cmd)
2276 struct pcidas64_private *devpriv = dev->private;
2278 /* select internal/external master clock */
2279 devpriv->hw_config_bits &= ~MASTER_CLOCK_4020_MASK;
2280 if (cmd->scan_begin_src == TRIG_OTHER) {
2281 int chanspec = devpriv->ext_clock.chanspec;
2283 if (CR_CHAN(chanspec))
2284 devpriv->hw_config_bits |= BNC_CLOCK_4020_BITS;
2286 devpriv->hw_config_bits |= EXT_CLOCK_4020_BITS;
2288 devpriv->hw_config_bits |= INTERNAL_CLOCK_4020_BITS;
2290 writew(devpriv->hw_config_bits,
2291 devpriv->main_iobase + HW_CONFIG_REG);
2294 static void select_master_clock(struct comedi_device *dev,
2295 const struct comedi_cmd *cmd)
2297 const struct pcidas64_board *thisboard = dev->board_ptr;
2299 switch (thisboard->layout) {
2301 select_master_clock_4020(dev, cmd);
2308 static inline void dma_start_sync(struct comedi_device *dev,
2309 unsigned int channel)
2311 struct pcidas64_private *devpriv = dev->private;
2312 unsigned long flags;
2314 /* spinlock for plx dma control/status reg */
2315 spin_lock_irqsave(&dev->spinlock, flags);
2317 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2318 PLX_CLEAR_DMA_INTR_BIT,
2319 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2321 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2322 PLX_CLEAR_DMA_INTR_BIT,
2323 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2324 spin_unlock_irqrestore(&dev->spinlock, flags);
2327 static void set_ai_pacing(struct comedi_device *dev, struct comedi_cmd *cmd)
2329 const struct pcidas64_board *thisboard = dev->board_ptr;
2330 struct pcidas64_private *devpriv = dev->private;
2331 uint32_t convert_counter = 0, scan_counter = 0;
2333 check_adc_timing(dev, cmd);
2335 select_master_clock(dev, cmd);
2337 if (thisboard->layout == LAYOUT_4020) {
2338 convert_counter = ai_convert_counter_4020(dev, cmd);
2340 convert_counter = ai_convert_counter_6xxx(dev, cmd);
2341 scan_counter = ai_scan_counter_6xxx(dev, cmd);
2344 /* load lower 16 bits of convert interval */
2345 writew(convert_counter & 0xffff,
2346 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2347 /* load upper 8 bits of convert interval */
2348 writew((convert_counter >> 16) & 0xff,
2349 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2350 /* load lower 16 bits of scan delay */
2351 writew(scan_counter & 0xffff,
2352 devpriv->main_iobase + ADC_DELAY_INTERVAL_LOWER_REG);
2353 /* load upper 8 bits of scan delay */
2354 writew((scan_counter >> 16) & 0xff,
2355 devpriv->main_iobase + ADC_DELAY_INTERVAL_UPPER_REG);
2358 static int use_internal_queue_6xxx(const struct comedi_cmd *cmd)
2362 for (i = 0; i + 1 < cmd->chanlist_len; i++) {
2363 if (CR_CHAN(cmd->chanlist[i + 1]) !=
2364 CR_CHAN(cmd->chanlist[i]) + 1)
2366 if (CR_RANGE(cmd->chanlist[i + 1]) !=
2367 CR_RANGE(cmd->chanlist[i]))
2369 if (CR_AREF(cmd->chanlist[i + 1]) != CR_AREF(cmd->chanlist[i]))
2375 static int setup_channel_queue(struct comedi_device *dev,
2376 const struct comedi_cmd *cmd)
2378 const struct pcidas64_board *thisboard = dev->board_ptr;
2379 struct pcidas64_private *devpriv = dev->private;
2380 unsigned short bits;
2383 if (thisboard->layout != LAYOUT_4020) {
2384 if (use_internal_queue_6xxx(cmd)) {
2385 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
2386 writew(devpriv->hw_config_bits,
2387 devpriv->main_iobase + HW_CONFIG_REG);
2390 bits |= adc_chan_bits(CR_CHAN(cmd->chanlist[0]));
2392 bits |= ai_range_bits_6xxx(dev,
2393 CR_RANGE(cmd->chanlist[0]));
2394 /* set single-ended / differential */
2395 bits |= se_diff_bit_6xxx(dev,
2396 CR_AREF(cmd->chanlist[0]) ==
2398 if (CR_AREF(cmd->chanlist[0]) == AREF_COMMON)
2399 bits |= ADC_COMMON_BIT;
2400 /* set stop channel */
2401 writew(adc_chan_bits
2402 (CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])),
2403 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
2404 /* set start channel, and rest of settings */
2406 devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2408 /* use external queue */
2409 if (dev->write_subdev && dev->write_subdev->busy) {
2410 warn_external_queue(dev);
2413 devpriv->hw_config_bits |= EXT_QUEUE_BIT;
2414 writew(devpriv->hw_config_bits,
2415 devpriv->main_iobase + HW_CONFIG_REG);
2416 /* clear DAC buffer to prevent weird interactions */
2418 devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
2419 /* clear queue pointer */
2420 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2421 /* load external queue */
2422 for (i = 0; i < cmd->chanlist_len; i++) {
2425 bits |= adc_chan_bits(CR_CHAN(cmd->
2428 bits |= ai_range_bits_6xxx(dev,
2432 /* set single-ended / differential */
2433 bits |= se_diff_bit_6xxx(dev,
2437 if (CR_AREF(cmd->chanlist[i]) == AREF_COMMON)
2438 bits |= ADC_COMMON_BIT;
2439 /* mark end of queue */
2440 if (i == cmd->chanlist_len - 1)
2441 bits |= QUEUE_EOSCAN_BIT |
2444 devpriv->main_iobase +
2445 ADC_QUEUE_FIFO_REG);
2447 /* doing a queue clear is not specified in board docs,
2448 * but required for reliable operation */
2449 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2450 /* prime queue holding register */
2451 writew(0, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2454 unsigned short old_cal_range_bits = devpriv->i2c_cal_range_bits;
2456 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2457 /* select BNC inputs */
2458 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
2460 for (i = 0; i < cmd->chanlist_len; i++) {
2461 unsigned int channel = CR_CHAN(cmd->chanlist[i]);
2462 unsigned int range = CR_RANGE(cmd->chanlist[i]);
2465 devpriv->i2c_cal_range_bits |=
2466 attenuate_bit(channel);
2468 devpriv->i2c_cal_range_bits &=
2469 ~attenuate_bit(channel);
2471 /* update calibration/range i2c register only if necessary,
2472 * as it is very slow */
2473 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
2474 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
2476 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2483 static inline void load_first_dma_descriptor(struct comedi_device *dev,
2484 unsigned int dma_channel,
2485 unsigned int descriptor_bits)
2487 struct pcidas64_private *devpriv = dev->private;
2489 /* The transfer size, pci address, and local address registers
2490 * are supposedly unused during chained dma,
2491 * but I have found that left over values from last operation
2492 * occasionally cause problems with transfer of first dma
2493 * block. Initializing them to zero seems to fix the problem. */
2496 devpriv->plx9080_iobase + PLX_DMA1_TRANSFER_SIZE_REG);
2497 writel(0, devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG);
2499 devpriv->plx9080_iobase + PLX_DMA1_LOCAL_ADDRESS_REG);
2500 writel(descriptor_bits,
2501 devpriv->plx9080_iobase + PLX_DMA1_DESCRIPTOR_REG);
2504 devpriv->plx9080_iobase + PLX_DMA0_TRANSFER_SIZE_REG);
2505 writel(0, devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2507 devpriv->plx9080_iobase + PLX_DMA0_LOCAL_ADDRESS_REG);
2508 writel(descriptor_bits,
2509 devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2513 static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2515 const struct pcidas64_board *thisboard = dev->board_ptr;
2516 struct pcidas64_private *devpriv = dev->private;
2517 struct comedi_async *async = s->async;
2518 struct comedi_cmd *cmd = &async->cmd;
2521 unsigned long flags;
2524 disable_ai_pacing(dev);
2527 retval = setup_channel_queue(dev, cmd);
2531 /* make sure internal calibration source is turned off */
2532 writew(0, devpriv->main_iobase + CALIBRATION_REG);
2534 set_ai_pacing(dev, cmd);
2536 setup_sample_counters(dev, cmd);
2538 enable_ai_interrupts(dev, cmd);
2540 spin_lock_irqsave(&dev->spinlock, flags);
2541 /* set mode, allow conversions through software gate */
2542 devpriv->adc_control1_bits |= ADC_SW_GATE_BIT;
2543 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
2544 if (thisboard->layout != LAYOUT_4020) {
2545 devpriv->adc_control1_bits &= ~ADC_MODE_MASK;
2546 if (cmd->convert_src == TRIG_EXT)
2547 /* good old mode 13 */
2548 devpriv->adc_control1_bits |= adc_mode_bits(13);
2550 /* mode 8. What else could you need? */
2551 devpriv->adc_control1_bits |= adc_mode_bits(8);
2553 devpriv->adc_control1_bits &= ~CHANNEL_MODE_4020_MASK;
2554 if (cmd->chanlist_len == 4)
2555 devpriv->adc_control1_bits |= FOUR_CHANNEL_4020_BITS;
2556 else if (cmd->chanlist_len == 2)
2557 devpriv->adc_control1_bits |= TWO_CHANNEL_4020_BITS;
2558 devpriv->adc_control1_bits &= ~ADC_LO_CHANNEL_4020_MASK;
2559 devpriv->adc_control1_bits |=
2560 adc_lo_chan_4020_bits(CR_CHAN(cmd->chanlist[0]));
2561 devpriv->adc_control1_bits &= ~ADC_HI_CHANNEL_4020_MASK;
2562 devpriv->adc_control1_bits |=
2563 adc_hi_chan_4020_bits(CR_CHAN(cmd->chanlist
2564 [cmd->chanlist_len - 1]));
2566 writew(devpriv->adc_control1_bits,
2567 devpriv->main_iobase + ADC_CONTROL1_REG);
2568 spin_unlock_irqrestore(&dev->spinlock, flags);
2570 /* clear adc buffer */
2571 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
2573 if ((cmd->flags & CMDF_WAKE_EOS) == 0 ||
2574 thisboard->layout == LAYOUT_4020) {
2575 devpriv->ai_dma_index = 0;
2577 /* set dma transfer size */
2578 for (i = 0; i < ai_dma_ring_count(thisboard); i++)
2579 devpriv->ai_dma_desc[i].transfer_size =
2580 cpu_to_le32(dma_transfer_size(dev) *
2583 /* give location of first dma descriptor */
2584 load_first_dma_descriptor(dev, 1,
2585 devpriv->ai_dma_desc_bus_addr |
2586 PLX_DESC_IN_PCI_BIT |
2587 PLX_INTR_TERM_COUNT |
2588 PLX_XFER_LOCAL_TO_PCI);
2590 dma_start_sync(dev, 1);
2593 if (thisboard->layout == LAYOUT_4020) {
2594 /* set source for external triggers */
2596 if (cmd->start_src == TRIG_EXT && CR_CHAN(cmd->start_arg))
2597 bits |= EXT_START_TRIG_BNC_BIT;
2598 if (cmd->stop_src == TRIG_EXT && CR_CHAN(cmd->stop_arg))
2599 bits |= EXT_STOP_TRIG_BNC_BIT;
2600 writew(bits, devpriv->main_iobase + DAQ_ATRIG_LOW_4020_REG);
2603 spin_lock_irqsave(&dev->spinlock, flags);
2605 /* enable pacing, triggering, etc */
2606 bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
2607 if (cmd->flags & CMDF_WAKE_EOS)
2608 bits |= ADC_DMA_DISABLE_BIT;
2609 /* set start trigger */
2610 if (cmd->start_src == TRIG_EXT) {
2611 bits |= ADC_START_TRIG_EXT_BITS;
2612 if (cmd->start_arg & CR_INVERT)
2613 bits |= ADC_START_TRIG_FALLING_BIT;
2614 } else if (cmd->start_src == TRIG_NOW)
2615 bits |= ADC_START_TRIG_SOFT_BITS;
2616 if (use_hw_sample_counter(cmd))
2617 bits |= ADC_SAMPLE_COUNTER_EN_BIT;
2618 writew(bits, devpriv->main_iobase + ADC_CONTROL0_REG);
2620 devpriv->ai_cmd_running = 1;
2622 spin_unlock_irqrestore(&dev->spinlock, flags);
2624 /* start acquisition */
2625 if (cmd->start_src == TRIG_NOW)
2626 writew(0, devpriv->main_iobase + ADC_START_REG);
2631 /* read num_samples from 16 bit wide ai fifo */
2632 static void pio_drain_ai_fifo_16(struct comedi_device *dev)
2634 struct pcidas64_private *devpriv = dev->private;
2635 struct comedi_subdevice *s = dev->read_subdev;
2637 uint16_t prepost_bits;
2638 int read_segment, read_index, write_segment, write_index;
2642 /* get least significant 15 bits */
2643 read_index = readw(devpriv->main_iobase + ADC_READ_PNTR_REG) &
2645 write_index = readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) &
2647 /* Get most significant bits (grey code).
2648 * Different boards use different code so use a scheme
2649 * that doesn't depend on encoding. This read must
2650 * occur after reading least significant 15 bits to avoid race
2651 * with fifo switching to next segment. */
2652 prepost_bits = readw(devpriv->main_iobase + PREPOST_REG);
2654 /* if read and write pointers are not on the same fifo segment,
2655 * read to the end of the read segment */
2656 read_segment = adc_upper_read_ptr_code(prepost_bits);
2657 write_segment = adc_upper_write_ptr_code(prepost_bits);
2659 if (read_segment != write_segment)
2661 devpriv->ai_fifo_segment_length - read_index;
2663 num_samples = write_index - read_index;
2664 if (num_samples < 0) {
2665 dev_err(dev->class_dev,
2666 "cb_pcidas64: bug! num_samples < 0\n");
2670 num_samples = comedi_nsamples_left(s, num_samples);
2671 if (num_samples == 0)
2674 for (i = 0; i < num_samples; i++) {
2677 val = readw(devpriv->main_iobase + ADC_FIFO_REG);
2678 comedi_buf_write_samples(s, &val, 1);
2681 } while (read_segment != write_segment);
2684 /* Read from 32 bit wide ai fifo of 4020 - deal with insane grey coding of
2685 * pointers. The pci-4020 hardware only supports dma transfers (it only
2686 * supports the use of pio for draining the last remaining points from the
2687 * fifo when a data acquisition operation has completed).
2689 static void pio_drain_ai_fifo_32(struct comedi_device *dev)
2691 struct pcidas64_private *devpriv = dev->private;
2692 struct comedi_subdevice *s = dev->read_subdev;
2693 unsigned int nsamples;
2697 readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2699 readw(devpriv->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2701 nsamples = comedi_nsamples_left(s, 100000);
2702 for (i = 0; read_code != write_code && i < nsamples;) {
2705 fifo_data = readl(dev->mmio + ADC_FIFO_REG);
2706 val = fifo_data & 0xffff;
2707 comedi_buf_write_samples(s, &val, 1);
2710 val = (fifo_data >> 16) & 0xffff;
2711 comedi_buf_write_samples(s, &val, 1);
2714 read_code = readw(devpriv->main_iobase + ADC_READ_PNTR_REG) &
2720 static void pio_drain_ai_fifo(struct comedi_device *dev)
2722 const struct pcidas64_board *thisboard = dev->board_ptr;
2724 if (thisboard->layout == LAYOUT_4020)
2725 pio_drain_ai_fifo_32(dev);
2727 pio_drain_ai_fifo_16(dev);
2730 static void drain_dma_buffers(struct comedi_device *dev, unsigned int channel)
2732 const struct pcidas64_board *thisboard = dev->board_ptr;
2733 struct pcidas64_private *devpriv = dev->private;
2734 struct comedi_subdevice *s = dev->read_subdev;
2735 uint32_t next_transfer_addr;
2737 int num_samples = 0;
2738 void __iomem *pci_addr_reg;
2742 devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG;
2745 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2747 /* loop until we have read all the full buffers */
2748 for (j = 0, next_transfer_addr = readl(pci_addr_reg);
2749 (next_transfer_addr <
2750 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index] ||
2751 next_transfer_addr >=
2752 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index] +
2753 DMA_BUFFER_SIZE) && j < ai_dma_ring_count(thisboard); j++) {
2754 /* transfer data from dma buffer to comedi buffer */
2755 num_samples = comedi_nsamples_left(s, dma_transfer_size(dev));
2756 comedi_buf_write_samples(s,
2757 devpriv->ai_buffer[devpriv->ai_dma_index],
2759 devpriv->ai_dma_index = (devpriv->ai_dma_index + 1) %
2760 ai_dma_ring_count(thisboard);
2762 /* XXX check for dma ring buffer overrun
2763 * (use end-of-chain bit to mark last unused buffer) */
2766 static void handle_ai_interrupt(struct comedi_device *dev,
2767 unsigned short status,
2768 unsigned int plx_status)
2770 const struct pcidas64_board *thisboard = dev->board_ptr;
2771 struct pcidas64_private *devpriv = dev->private;
2772 struct comedi_subdevice *s = dev->read_subdev;
2773 struct comedi_async *async = s->async;
2774 struct comedi_cmd *cmd = &async->cmd;
2775 uint8_t dma1_status;
2776 unsigned long flags;
2778 /* check for fifo overrun */
2779 if (status & ADC_OVERRUN_BIT) {
2780 dev_err(dev->class_dev, "fifo overrun\n");
2781 async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
2783 /* spin lock makes sure no one else changes plx dma control reg */
2784 spin_lock_irqsave(&dev->spinlock, flags);
2785 dma1_status = readb(devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2786 if (plx_status & ICS_DMA1_A) { /* dma chan 1 interrupt */
2787 writeb((dma1_status & PLX_DMA_EN_BIT) | PLX_CLEAR_DMA_INTR_BIT,
2788 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2790 if (dma1_status & PLX_DMA_EN_BIT)
2791 drain_dma_buffers(dev, 1);
2793 spin_unlock_irqrestore(&dev->spinlock, flags);
2795 /* drain fifo with pio */
2796 if ((status & ADC_DONE_BIT) ||
2797 ((cmd->flags & CMDF_WAKE_EOS) &&
2798 (status & ADC_INTR_PENDING_BIT) &&
2799 (thisboard->layout != LAYOUT_4020))) {
2800 spin_lock_irqsave(&dev->spinlock, flags);
2801 if (devpriv->ai_cmd_running) {
2802 spin_unlock_irqrestore(&dev->spinlock, flags);
2803 pio_drain_ai_fifo(dev);
2805 spin_unlock_irqrestore(&dev->spinlock, flags);
2807 /* if we are have all the data, then quit */
2808 if ((cmd->stop_src == TRIG_COUNT &&
2809 async->scans_done >= cmd->stop_arg) ||
2810 (cmd->stop_src == TRIG_EXT && (status & ADC_STOP_BIT)))
2811 async->events |= COMEDI_CB_EOA;
2813 comedi_handle_events(dev, s);
2816 static inline unsigned int prev_ao_dma_index(struct comedi_device *dev)
2818 struct pcidas64_private *devpriv = dev->private;
2819 unsigned int buffer_index;
2821 if (devpriv->ao_dma_index == 0)
2822 buffer_index = AO_DMA_RING_COUNT - 1;
2824 buffer_index = devpriv->ao_dma_index - 1;
2825 return buffer_index;
2828 static int last_ao_dma_load_completed(struct comedi_device *dev)
2830 struct pcidas64_private *devpriv = dev->private;
2831 unsigned int buffer_index;
2832 unsigned int transfer_address;
2833 unsigned short dma_status;
2835 buffer_index = prev_ao_dma_index(dev);
2836 dma_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2837 if ((dma_status & PLX_DMA_DONE_BIT) == 0)
2841 readl(devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2842 if (transfer_address != devpriv->ao_buffer_bus_addr[buffer_index])
2848 static inline int ao_dma_needs_restart(struct comedi_device *dev,
2849 unsigned short dma_status)
2851 if ((dma_status & PLX_DMA_DONE_BIT) == 0 ||
2852 (dma_status & PLX_DMA_EN_BIT) == 0)
2854 if (last_ao_dma_load_completed(dev))
2860 static void restart_ao_dma(struct comedi_device *dev)
2862 struct pcidas64_private *devpriv = dev->private;
2863 unsigned int dma_desc_bits;
2866 readl(devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2867 dma_desc_bits &= ~PLX_END_OF_CHAIN_BIT;
2868 load_first_dma_descriptor(dev, 0, dma_desc_bits);
2870 dma_start_sync(dev, 0);
2873 static unsigned int cb_pcidas64_ao_fill_buffer(struct comedi_device *dev,
2874 struct comedi_subdevice *s,
2875 unsigned short *dest,
2876 unsigned int max_bytes)
2878 unsigned int nsamples = comedi_bytes_to_samples(s, max_bytes);
2879 unsigned int actual_bytes;
2881 nsamples = comedi_nsamples_left(s, nsamples);
2882 actual_bytes = comedi_buf_read_samples(s, dest, nsamples);
2884 return comedi_bytes_to_samples(s, actual_bytes);
2887 static unsigned int load_ao_dma_buffer(struct comedi_device *dev,
2888 const struct comedi_cmd *cmd)
2890 struct pcidas64_private *devpriv = dev->private;
2891 struct comedi_subdevice *s = dev->write_subdev;
2892 unsigned int buffer_index = devpriv->ao_dma_index;
2893 unsigned int prev_buffer_index = prev_ao_dma_index(dev);
2894 unsigned int nsamples;
2895 unsigned int nbytes;
2896 unsigned int next_bits;
2898 nsamples = cb_pcidas64_ao_fill_buffer(dev, s,
2899 devpriv->ao_buffer[buffer_index],
2904 nbytes = comedi_samples_to_bytes(s, nsamples);
2905 devpriv->ao_dma_desc[buffer_index].transfer_size = cpu_to_le32(nbytes);
2906 /* set end of chain bit so we catch underruns */
2907 next_bits = le32_to_cpu(devpriv->ao_dma_desc[buffer_index].next);
2908 next_bits |= PLX_END_OF_CHAIN_BIT;
2909 devpriv->ao_dma_desc[buffer_index].next = cpu_to_le32(next_bits);
2910 /* clear end of chain bit on previous buffer now that we have set it
2911 * for the last buffer */
2912 next_bits = le32_to_cpu(devpriv->ao_dma_desc[prev_buffer_index].next);
2913 next_bits &= ~PLX_END_OF_CHAIN_BIT;
2914 devpriv->ao_dma_desc[prev_buffer_index].next = cpu_to_le32(next_bits);
2916 devpriv->ao_dma_index = (buffer_index + 1) % AO_DMA_RING_COUNT;
2921 static void load_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
2923 struct pcidas64_private *devpriv = dev->private;
2924 unsigned int num_bytes;
2925 unsigned int next_transfer_addr;
2926 void __iomem *pci_addr_reg =
2927 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2928 unsigned int buffer_index;
2931 buffer_index = devpriv->ao_dma_index;
2932 /* don't overwrite data that hasn't been transferred yet */
2933 next_transfer_addr = readl(pci_addr_reg);
2934 if (next_transfer_addr >=
2935 devpriv->ao_buffer_bus_addr[buffer_index] &&
2936 next_transfer_addr <
2937 devpriv->ao_buffer_bus_addr[buffer_index] +
2940 num_bytes = load_ao_dma_buffer(dev, cmd);
2941 } while (num_bytes >= DMA_BUFFER_SIZE);
2944 static void handle_ao_interrupt(struct comedi_device *dev,
2945 unsigned short status, unsigned int plx_status)
2947 struct pcidas64_private *devpriv = dev->private;
2948 struct comedi_subdevice *s = dev->write_subdev;
2949 struct comedi_async *async;
2950 struct comedi_cmd *cmd;
2951 uint8_t dma0_status;
2952 unsigned long flags;
2954 /* board might not support ao, in which case write_subdev is NULL */
2960 /* spin lock makes sure no one else changes plx dma control reg */
2961 spin_lock_irqsave(&dev->spinlock, flags);
2962 dma0_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2963 if (plx_status & ICS_DMA0_A) { /* dma chan 0 interrupt */
2964 if ((dma0_status & PLX_DMA_EN_BIT) &&
2965 !(dma0_status & PLX_DMA_DONE_BIT))
2966 writeb(PLX_DMA_EN_BIT | PLX_CLEAR_DMA_INTR_BIT,
2967 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2969 writeb(PLX_CLEAR_DMA_INTR_BIT,
2970 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2971 spin_unlock_irqrestore(&dev->spinlock, flags);
2972 if (dma0_status & PLX_DMA_EN_BIT) {
2973 load_ao_dma(dev, cmd);
2974 /* try to recover from dma end-of-chain event */
2975 if (ao_dma_needs_restart(dev, dma0_status))
2976 restart_ao_dma(dev);
2979 spin_unlock_irqrestore(&dev->spinlock, flags);
2982 if ((status & DAC_DONE_BIT)) {
2983 if ((cmd->stop_src == TRIG_COUNT &&
2984 async->scans_done >= cmd->stop_arg) ||
2985 last_ao_dma_load_completed(dev))
2986 async->events |= COMEDI_CB_EOA;
2988 async->events |= COMEDI_CB_ERROR;
2990 comedi_handle_events(dev, s);
2993 static irqreturn_t handle_interrupt(int irq, void *d)
2995 struct comedi_device *dev = d;
2996 struct pcidas64_private *devpriv = dev->private;
2997 unsigned short status;
2998 uint32_t plx_status;
3001 plx_status = readl(devpriv->plx9080_iobase + PLX_INTRCS_REG);
3002 status = readw(devpriv->main_iobase + HW_STATUS_REG);
3004 /* an interrupt before all the postconfig stuff gets done could
3005 * cause a NULL dereference if we continue through the
3006 * interrupt handler */
3010 handle_ai_interrupt(dev, status, plx_status);
3011 handle_ao_interrupt(dev, status, plx_status);
3013 /* clear possible plx9080 interrupt sources */
3014 if (plx_status & ICS_LDIA) { /* clear local doorbell interrupt */
3015 plx_bits = readl(devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3016 writel(plx_bits, devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3022 static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3024 struct pcidas64_private *devpriv = dev->private;
3025 unsigned long flags;
3027 spin_lock_irqsave(&dev->spinlock, flags);
3028 if (devpriv->ai_cmd_running == 0) {
3029 spin_unlock_irqrestore(&dev->spinlock, flags);
3032 devpriv->ai_cmd_running = 0;
3033 spin_unlock_irqrestore(&dev->spinlock, flags);
3035 disable_ai_pacing(dev);
3042 static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3043 struct comedi_insn *insn, unsigned int *data)
3045 const struct pcidas64_board *thisboard = dev->board_ptr;
3046 struct pcidas64_private *devpriv = dev->private;
3047 int chan = CR_CHAN(insn->chanspec);
3048 int range = CR_RANGE(insn->chanspec);
3050 /* do some initializing */
3051 writew(0, devpriv->main_iobase + DAC_CONTROL0_REG);
3054 set_dac_range_bits(dev, &devpriv->dac_control1_bits, chan, range);
3055 writew(devpriv->dac_control1_bits,
3056 devpriv->main_iobase + DAC_CONTROL1_REG);
3058 /* write to channel */
3059 if (thisboard->layout == LAYOUT_4020) {
3060 writew(data[0] & 0xff,
3061 devpriv->main_iobase + dac_lsb_4020_reg(chan));
3062 writew((data[0] >> 8) & 0xf,
3063 devpriv->main_iobase + dac_msb_4020_reg(chan));
3065 writew(data[0], devpriv->main_iobase + dac_convert_reg(chan));
3068 /* remember output value */
3069 s->readback[chan] = data[0];
3074 static void set_dac_control0_reg(struct comedi_device *dev,
3075 const struct comedi_cmd *cmd)
3077 struct pcidas64_private *devpriv = dev->private;
3078 unsigned int bits = DAC_ENABLE_BIT | WAVEFORM_GATE_LEVEL_BIT |
3079 WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_BIT;
3081 if (cmd->start_src == TRIG_EXT) {
3082 bits |= WAVEFORM_TRIG_EXT_BITS;
3083 if (cmd->start_arg & CR_INVERT)
3084 bits |= WAVEFORM_TRIG_FALLING_BIT;
3086 bits |= WAVEFORM_TRIG_SOFT_BITS;
3088 if (cmd->scan_begin_src == TRIG_EXT) {
3089 bits |= DAC_EXT_UPDATE_ENABLE_BIT;
3090 if (cmd->scan_begin_arg & CR_INVERT)
3091 bits |= DAC_EXT_UPDATE_FALLING_BIT;
3093 writew(bits, devpriv->main_iobase + DAC_CONTROL0_REG);
3096 static void set_dac_control1_reg(struct comedi_device *dev,
3097 const struct comedi_cmd *cmd)
3099 struct pcidas64_private *devpriv = dev->private;
3102 for (i = 0; i < cmd->chanlist_len; i++) {
3105 channel = CR_CHAN(cmd->chanlist[i]);
3106 range = CR_RANGE(cmd->chanlist[i]);
3107 set_dac_range_bits(dev, &devpriv->dac_control1_bits, channel,
3110 devpriv->dac_control1_bits |= DAC_SW_GATE_BIT;
3111 writew(devpriv->dac_control1_bits,
3112 devpriv->main_iobase + DAC_CONTROL1_REG);
3115 static void set_dac_select_reg(struct comedi_device *dev,
3116 const struct comedi_cmd *cmd)
3118 struct pcidas64_private *devpriv = dev->private;
3120 unsigned int first_channel, last_channel;
3122 first_channel = CR_CHAN(cmd->chanlist[0]);
3123 last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
3124 if (last_channel < first_channel)
3125 dev_err(dev->class_dev,
3126 "bug! last ao channel < first ao channel\n");
3128 bits = (first_channel & 0x7) | (last_channel & 0x7) << 3;
3130 writew(bits, devpriv->main_iobase + DAC_SELECT_REG);
3133 static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags)
3135 return get_divisor(ns, flags) - 2;
3138 static void set_dac_interval_regs(struct comedi_device *dev,
3139 const struct comedi_cmd *cmd)
3141 struct pcidas64_private *devpriv = dev->private;
3142 unsigned int divisor;
3144 if (cmd->scan_begin_src != TRIG_TIMER)
3147 divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags);
3148 if (divisor > max_counter_value) {
3149 dev_err(dev->class_dev, "bug! ao divisor too big\n");
3150 divisor = max_counter_value;
3152 writew(divisor & 0xffff,
3153 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_LOWER_REG);
3154 writew((divisor >> 16) & 0xff,
3155 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_UPPER_REG);
3158 static int prep_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3160 struct pcidas64_private *devpriv = dev->private;
3161 struct comedi_subdevice *s = dev->write_subdev;
3162 unsigned int nsamples;
3163 unsigned int nbytes;
3166 /* clear queue pointer too, since external queue has
3167 * weird interactions with ao fifo */
3168 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
3169 writew(0, devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
3171 nsamples = cb_pcidas64_ao_fill_buffer(dev, s,
3172 devpriv->ao_bounce_buffer,
3177 for (i = 0; i < nsamples; i++) {
3178 writew(devpriv->ao_bounce_buffer[i],
3179 devpriv->main_iobase + DAC_FIFO_REG);
3182 if (cmd->stop_src == TRIG_COUNT &&
3183 s->async->scans_done >= cmd->stop_arg)
3186 nbytes = load_ao_dma_buffer(dev, cmd);
3189 load_ao_dma(dev, cmd);
3191 dma_start_sync(dev, 0);
3196 static inline int external_ai_queue_in_use(struct comedi_device *dev,
3197 struct comedi_subdevice *s,
3198 struct comedi_cmd *cmd)
3200 const struct pcidas64_board *thisboard = dev->board_ptr;
3204 if (thisboard->layout == LAYOUT_4020)
3206 else if (use_internal_queue_6xxx(cmd))
3211 static int ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3212 unsigned int trig_num)
3214 struct pcidas64_private *devpriv = dev->private;
3215 struct comedi_cmd *cmd = &s->async->cmd;
3218 if (trig_num != cmd->start_arg)
3221 retval = prep_ao_dma(dev, cmd);
3225 set_dac_control0_reg(dev, cmd);
3227 if (cmd->start_src == TRIG_INT)
3228 writew(0, devpriv->main_iobase + DAC_START_REG);
3230 s->async->inttrig = NULL;
3235 static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3237 struct pcidas64_private *devpriv = dev->private;
3238 struct comedi_cmd *cmd = &s->async->cmd;
3240 if (external_ai_queue_in_use(dev, s, cmd)) {
3241 warn_external_queue(dev);
3244 /* disable analog output system during setup */
3245 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3247 devpriv->ao_dma_index = 0;
3249 set_dac_select_reg(dev, cmd);
3250 set_dac_interval_regs(dev, cmd);
3251 load_first_dma_descriptor(dev, 0, devpriv->ao_dma_desc_bus_addr |
3252 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3254 set_dac_control1_reg(dev, cmd);
3255 s->async->inttrig = ao_inttrig;
3260 static int cb_pcidas64_ao_check_chanlist(struct comedi_device *dev,
3261 struct comedi_subdevice *s,
3262 struct comedi_cmd *cmd)
3264 unsigned int chan0 = CR_CHAN(cmd->chanlist[0]);
3267 for (i = 1; i < cmd->chanlist_len; i++) {
3268 unsigned int chan = CR_CHAN(cmd->chanlist[i]);
3270 if (chan != (chan0 + i)) {
3271 dev_dbg(dev->class_dev,
3272 "chanlist must use consecutive channels\n");
3280 static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3281 struct comedi_cmd *cmd)
3283 const struct pcidas64_board *thisboard = dev->board_ptr;
3285 unsigned int tmp_arg;
3287 /* Step 1 : check if triggers are trivially valid */
3289 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_INT | TRIG_EXT);
3290 err |= cfc_check_trigger_src(&cmd->scan_begin_src,
3291 TRIG_TIMER | TRIG_EXT);
3292 err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_NOW);
3293 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
3294 err |= cfc_check_trigger_src(&cmd->stop_src, TRIG_NONE);
3299 /* Step 2a : make sure trigger sources are unique */
3301 err |= cfc_check_trigger_is_unique(cmd->start_src);
3302 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
3304 /* Step 2b : and mutually compatible */
3306 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
3308 if (cmd->stop_src != TRIG_COUNT &&
3309 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
3315 /* Step 3: check if arguments are trivially valid */
3317 err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
3319 if (cmd->scan_begin_src == TRIG_TIMER) {
3320 err |= cfc_check_trigger_arg_min(&cmd->scan_begin_arg,
3321 thisboard->ao_scan_speed);
3322 if (get_ao_divisor(cmd->scan_begin_arg, cmd->flags) >
3323 max_counter_value) {
3324 cmd->scan_begin_arg = (max_counter_value + 2) *
3330 err |= cfc_check_trigger_arg_min(&cmd->chanlist_len, 1);
3331 err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
3336 /* step 4: fix up any arguments */
3338 if (cmd->scan_begin_src == TRIG_TIMER) {
3339 tmp_arg = cmd->scan_begin_arg;
3340 cmd->scan_begin_arg = get_divisor(cmd->scan_begin_arg,
3341 cmd->flags) * TIMER_BASE;
3342 if (tmp_arg != cmd->scan_begin_arg)
3349 /* Step 5: check channel list if it exists */
3350 if (cmd->chanlist && cmd->chanlist_len > 0)
3351 err |= cb_pcidas64_ao_check_chanlist(dev, s, cmd);
3359 static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3361 struct pcidas64_private *devpriv = dev->private;
3363 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3368 static int dio_callback_4020(struct comedi_device *dev,
3369 int dir, int port, int data, unsigned long iobase)
3371 struct pcidas64_private *devpriv = dev->private;
3374 writew(data, devpriv->main_iobase + iobase + 2 * port);
3377 return readw(devpriv->main_iobase + iobase + 2 * port);
3380 static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3381 struct comedi_insn *insn, unsigned int *data)
3385 bits = readb(dev->mmio + DI_REG);
3393 static int do_wbits(struct comedi_device *dev,
3394 struct comedi_subdevice *s,
3395 struct comedi_insn *insn,
3398 if (comedi_dio_update_state(s, data))
3399 writeb(s->state, dev->mmio + DO_REG);
3406 static int dio_60xx_config_insn(struct comedi_device *dev,
3407 struct comedi_subdevice *s,
3408 struct comedi_insn *insn,
3413 ret = comedi_dio_insn_config(dev, s, insn, data, 0);
3417 writeb(s->io_bits, dev->mmio + DIO_DIRECTION_60XX_REG);
3422 static int dio_60xx_wbits(struct comedi_device *dev,
3423 struct comedi_subdevice *s,
3424 struct comedi_insn *insn,
3427 if (comedi_dio_update_state(s, data))
3428 writeb(s->state, dev->mmio + DIO_DATA_60XX_REG);
3430 data[1] = readb(dev->mmio + DIO_DATA_60XX_REG);
3435 /* pci-6025 8800 caldac:
3436 * address 0 == dac channel 0 offset
3437 * address 1 == dac channel 0 gain
3438 * address 2 == dac channel 1 offset
3439 * address 3 == dac channel 1 gain
3440 * address 4 == fine adc offset
3441 * address 5 == coarse adc offset
3442 * address 6 == coarse adc gain
3443 * address 7 == fine adc gain
3445 /* pci-6402/16 uses all 8 channels for dac:
3446 * address 0 == dac channel 0 fine gain
3447 * address 1 == dac channel 0 coarse gain
3448 * address 2 == dac channel 0 coarse offset
3449 * address 3 == dac channel 1 coarse offset
3450 * address 4 == dac channel 1 fine gain
3451 * address 5 == dac channel 1 coarse gain
3452 * address 6 == dac channel 0 fine offset
3453 * address 7 == dac channel 1 fine offset
3456 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
3459 struct pcidas64_private *devpriv = dev->private;
3460 static const int num_caldac_channels = 8;
3461 static const int bitstream_length = 11;
3462 unsigned int bitstream = ((address & 0x7) << 8) | value;
3463 unsigned int bit, register_bits;
3464 static const int caldac_8800_udelay = 1;
3466 if (address >= num_caldac_channels) {
3467 dev_err(dev->class_dev, "illegal caldac channel\n");
3470 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3472 if (bitstream & bit)
3473 register_bits |= SERIAL_DATA_IN_BIT;
3474 udelay(caldac_8800_udelay);
3475 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3476 register_bits |= SERIAL_CLOCK_BIT;
3477 udelay(caldac_8800_udelay);
3478 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3480 udelay(caldac_8800_udelay);
3481 writew(SELECT_8800_BIT, devpriv->main_iobase + CALIBRATION_REG);
3482 udelay(caldac_8800_udelay);
3483 writew(0, devpriv->main_iobase + CALIBRATION_REG);
3484 udelay(caldac_8800_udelay);
3489 static int caldac_i2c_write(struct comedi_device *dev,
3490 unsigned int caldac_channel, unsigned int value)
3492 uint8_t serial_bytes[3];
3495 /* manual has gain and offset bits switched */
3502 NOT_CLEAR_REGISTERS = 0x20,
3505 switch (caldac_channel) {
3506 case 0: /* chan 0 offset */
3507 i2c_addr = CALDAC0_I2C_ADDR;
3508 serial_bytes[0] = OFFSET_0_2;
3510 case 1: /* chan 1 offset */
3511 i2c_addr = CALDAC0_I2C_ADDR;
3512 serial_bytes[0] = OFFSET_1_3;
3514 case 2: /* chan 2 offset */
3515 i2c_addr = CALDAC1_I2C_ADDR;
3516 serial_bytes[0] = OFFSET_0_2;
3518 case 3: /* chan 3 offset */
3519 i2c_addr = CALDAC1_I2C_ADDR;
3520 serial_bytes[0] = OFFSET_1_3;
3522 case 4: /* chan 0 gain */
3523 i2c_addr = CALDAC0_I2C_ADDR;
3524 serial_bytes[0] = GAIN_0_2;
3526 case 5: /* chan 1 gain */
3527 i2c_addr = CALDAC0_I2C_ADDR;
3528 serial_bytes[0] = GAIN_1_3;
3530 case 6: /* chan 2 gain */
3531 i2c_addr = CALDAC1_I2C_ADDR;
3532 serial_bytes[0] = GAIN_0_2;
3534 case 7: /* chan 3 gain */
3535 i2c_addr = CALDAC1_I2C_ADDR;
3536 serial_bytes[0] = GAIN_1_3;
3539 dev_err(dev->class_dev, "invalid caldac channel\n");
3542 serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf);
3543 serial_bytes[2] = value & 0xff;
3544 i2c_write(dev, i2c_addr, serial_bytes, 3);
3548 static void caldac_write(struct comedi_device *dev, unsigned int channel,
3551 const struct pcidas64_board *thisboard = dev->board_ptr;
3553 switch (thisboard->layout) {
3556 caldac_8800_write(dev, channel, value);
3559 caldac_i2c_write(dev, channel, value);
3566 static int calib_write_insn(struct comedi_device *dev,
3567 struct comedi_subdevice *s,
3568 struct comedi_insn *insn, unsigned int *data)
3570 int channel = CR_CHAN(insn->chanspec);
3572 /* return immediately if setting hasn't changed, since
3573 * programming these things is slow */
3574 if (s->readback[channel] == data[0])
3577 caldac_write(dev, channel, data[0]);
3578 s->readback[channel] = data[0];
3583 static void ad8402_write(struct comedi_device *dev, unsigned int channel,
3586 struct pcidas64_private *devpriv = dev->private;
3587 static const int bitstream_length = 10;
3588 unsigned int bit, register_bits;
3589 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
3590 static const int ad8402_udelay = 1;
3592 devpriv->ad8402_state[channel] = value;
3594 register_bits = SELECT_8402_64XX_BIT;
3595 udelay(ad8402_udelay);
3596 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3598 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3599 if (bitstream & bit)
3600 register_bits |= SERIAL_DATA_IN_BIT;
3602 register_bits &= ~SERIAL_DATA_IN_BIT;
3603 udelay(ad8402_udelay);
3604 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3605 udelay(ad8402_udelay);
3606 writew(register_bits | SERIAL_CLOCK_BIT,
3607 devpriv->main_iobase + CALIBRATION_REG);
3610 udelay(ad8402_udelay);
3611 writew(0, devpriv->main_iobase + CALIBRATION_REG);
3614 /* for pci-das6402/16, channel 0 is analog input gain and channel 1 is offset */
3615 static int ad8402_write_insn(struct comedi_device *dev,
3616 struct comedi_subdevice *s,
3617 struct comedi_insn *insn, unsigned int *data)
3619 struct pcidas64_private *devpriv = dev->private;
3620 int channel = CR_CHAN(insn->chanspec);
3622 /* return immediately if setting hasn't changed, since
3623 * programming these things is slow */
3624 if (devpriv->ad8402_state[channel] == data[0])
3627 devpriv->ad8402_state[channel] = data[0];
3629 ad8402_write(dev, channel, data[0]);
3634 static int ad8402_read_insn(struct comedi_device *dev,
3635 struct comedi_subdevice *s,
3636 struct comedi_insn *insn, unsigned int *data)
3638 struct pcidas64_private *devpriv = dev->private;
3639 unsigned int channel = CR_CHAN(insn->chanspec);
3641 data[0] = devpriv->ad8402_state[channel];
3646 static uint16_t read_eeprom(struct comedi_device *dev, uint8_t address)
3648 struct pcidas64_private *devpriv = dev->private;
3649 static const int bitstream_length = 11;
3650 static const int read_command = 0x6;
3651 unsigned int bitstream = (read_command << 8) | address;
3653 void __iomem * const plx_control_addr =
3654 devpriv->plx9080_iobase + PLX_CONTROL_REG;
3656 static const int value_length = 16;
3657 static const int eeprom_udelay = 1;
3659 udelay(eeprom_udelay);
3660 devpriv->plx_control_bits &= ~CTL_EE_CLK & ~CTL_EE_CS;
3661 /* make sure we don't send anything to the i2c bus on 4020 */
3662 devpriv->plx_control_bits |= CTL_USERO;
3663 writel(devpriv->plx_control_bits, plx_control_addr);
3664 /* activate serial eeprom */
3665 udelay(eeprom_udelay);
3666 devpriv->plx_control_bits |= CTL_EE_CS;
3667 writel(devpriv->plx_control_bits, plx_control_addr);
3669 /* write read command and desired memory address */
3670 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3671 /* set bit to be written */
3672 udelay(eeprom_udelay);
3673 if (bitstream & bit)
3674 devpriv->plx_control_bits |= CTL_EE_W;
3676 devpriv->plx_control_bits &= ~CTL_EE_W;
3677 writel(devpriv->plx_control_bits, plx_control_addr);
3679 udelay(eeprom_udelay);
3680 devpriv->plx_control_bits |= CTL_EE_CLK;
3681 writel(devpriv->plx_control_bits, plx_control_addr);
3682 udelay(eeprom_udelay);
3683 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3684 writel(devpriv->plx_control_bits, plx_control_addr);
3686 /* read back value from eeprom memory location */
3688 for (bit = 1 << (value_length - 1); bit; bit >>= 1) {
3690 udelay(eeprom_udelay);
3691 devpriv->plx_control_bits |= CTL_EE_CLK;
3692 writel(devpriv->plx_control_bits, plx_control_addr);
3693 udelay(eeprom_udelay);
3694 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3695 writel(devpriv->plx_control_bits, plx_control_addr);
3696 udelay(eeprom_udelay);
3697 if (readl(plx_control_addr) & CTL_EE_R)
3701 /* deactivate eeprom serial input */
3702 udelay(eeprom_udelay);
3703 devpriv->plx_control_bits &= ~CTL_EE_CS;
3704 writel(devpriv->plx_control_bits, plx_control_addr);
3709 static int eeprom_read_insn(struct comedi_device *dev,
3710 struct comedi_subdevice *s,
3711 struct comedi_insn *insn, unsigned int *data)
3713 data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
3718 /* Allocate and initialize the subdevice structures.
3720 static int setup_subdevices(struct comedi_device *dev)
3722 const struct pcidas64_board *thisboard = dev->board_ptr;
3723 struct pcidas64_private *devpriv = dev->private;
3724 struct comedi_subdevice *s;
3728 ret = comedi_alloc_subdevices(dev, 10);
3732 s = &dev->subdevices[0];
3733 /* analog input subdevice */
3734 dev->read_subdev = s;
3735 s->type = COMEDI_SUBD_AI;
3736 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
3737 if (thisboard->layout == LAYOUT_60XX)
3738 s->subdev_flags |= SDF_COMMON | SDF_DIFF;
3739 else if (thisboard->layout == LAYOUT_64XX)
3740 s->subdev_flags |= SDF_DIFF;
3741 /* XXX Number of inputs in differential mode is ignored */
3742 s->n_chan = thisboard->ai_se_chans;
3743 s->len_chanlist = 0x2000;
3744 s->maxdata = (1 << thisboard->ai_bits) - 1;
3745 s->range_table = thisboard->ai_range_table;
3746 s->insn_read = ai_rinsn;
3747 s->insn_config = ai_config_insn;
3749 s->do_cmdtest = ai_cmdtest;
3750 s->cancel = ai_cancel;
3751 if (thisboard->layout == LAYOUT_4020) {
3753 /* set adc to read from inputs
3754 * (not internal calibration sources) */
3755 devpriv->i2c_cal_range_bits = adc_src_4020_bits(4);
3756 /* set channels to +-5 volt input ranges */
3757 for (i = 0; i < s->n_chan; i++)
3758 devpriv->i2c_cal_range_bits |= attenuate_bit(i);
3759 data = devpriv->i2c_cal_range_bits;
3760 i2c_write(dev, RANGE_CAL_I2C_ADDR, &data, sizeof(data));
3763 /* analog output subdevice */
3764 s = &dev->subdevices[1];
3765 if (thisboard->ao_nchan) {
3766 s->type = COMEDI_SUBD_AO;
3767 s->subdev_flags = SDF_READABLE | SDF_WRITABLE |
3768 SDF_GROUND | SDF_CMD_WRITE;
3769 s->n_chan = thisboard->ao_nchan;
3770 s->maxdata = (1 << thisboard->ao_bits) - 1;
3771 s->range_table = thisboard->ao_range_table;
3772 s->insn_write = ao_winsn;
3774 ret = comedi_alloc_subdev_readback(s);
3778 if (ao_cmd_is_supported(thisboard)) {
3779 dev->write_subdev = s;
3780 s->do_cmdtest = ao_cmdtest;
3782 s->len_chanlist = thisboard->ao_nchan;
3783 s->cancel = ao_cancel;
3786 s->type = COMEDI_SUBD_UNUSED;
3790 s = &dev->subdevices[2];
3791 if (thisboard->layout == LAYOUT_64XX) {
3792 s->type = COMEDI_SUBD_DI;
3793 s->subdev_flags = SDF_READABLE;
3796 s->range_table = &range_digital;
3797 s->insn_bits = di_rbits;
3799 s->type = COMEDI_SUBD_UNUSED;
3801 /* digital output */
3802 if (thisboard->layout == LAYOUT_64XX) {
3803 s = &dev->subdevices[3];
3804 s->type = COMEDI_SUBD_DO;
3805 s->subdev_flags = SDF_WRITABLE;
3808 s->range_table = &range_digital;
3809 s->insn_bits = do_wbits;
3811 s->type = COMEDI_SUBD_UNUSED;
3814 s = &dev->subdevices[4];
3815 if (thisboard->has_8255) {
3816 if (thisboard->layout == LAYOUT_4020) {
3817 ret = subdev_8255_init(dev, s, dio_callback_4020,
3820 ret = subdev_8255_mm_init(dev, s, NULL,
3826 s->type = COMEDI_SUBD_UNUSED;
3829 /* 8 channel dio for 60xx */
3830 s = &dev->subdevices[5];
3831 if (thisboard->layout == LAYOUT_60XX) {
3832 s->type = COMEDI_SUBD_DIO;
3833 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
3836 s->range_table = &range_digital;
3837 s->insn_config = dio_60xx_config_insn;
3838 s->insn_bits = dio_60xx_wbits;
3840 s->type = COMEDI_SUBD_UNUSED;
3843 s = &dev->subdevices[6];
3844 s->type = COMEDI_SUBD_CALIB;
3845 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3847 if (thisboard->layout == LAYOUT_4020)
3851 s->insn_write = calib_write_insn;
3853 ret = comedi_alloc_subdev_readback(s);
3857 for (i = 0; i < s->n_chan; i++) {
3858 caldac_write(dev, i, s->maxdata / 2);
3859 s->readback[i] = s->maxdata / 2;
3862 /* 2 channel ad8402 potentiometer */
3863 s = &dev->subdevices[7];
3864 if (thisboard->layout == LAYOUT_64XX) {
3865 s->type = COMEDI_SUBD_CALIB;
3866 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3868 s->insn_read = ad8402_read_insn;
3869 s->insn_write = ad8402_write_insn;
3871 for (i = 0; i < s->n_chan; i++)
3872 ad8402_write(dev, i, s->maxdata / 2);
3874 s->type = COMEDI_SUBD_UNUSED;
3876 /* serial EEPROM, if present */
3877 s = &dev->subdevices[8];
3878 if (readl(devpriv->plx9080_iobase + PLX_CONTROL_REG) & CTL_EECHK) {
3879 s->type = COMEDI_SUBD_MEMORY;
3880 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
3882 s->maxdata = 0xffff;
3883 s->insn_read = eeprom_read_insn;
3885 s->type = COMEDI_SUBD_UNUSED;
3887 /* user counter subd XXX */
3888 s = &dev->subdevices[9];
3889 s->type = COMEDI_SUBD_UNUSED;
3894 static int auto_attach(struct comedi_device *dev,
3895 unsigned long context)
3897 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
3898 const struct pcidas64_board *thisboard = NULL;
3899 struct pcidas64_private *devpriv;
3900 uint32_t local_range, local_decode;
3903 if (context < ARRAY_SIZE(pcidas64_boards))
3904 thisboard = &pcidas64_boards[context];
3907 dev->board_ptr = thisboard;
3909 devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
3913 retval = comedi_pci_enable(dev);
3916 pci_set_master(pcidev);
3918 /* Initialize dev->board_name */
3919 dev->board_name = thisboard->name;
3921 devpriv->main_phys_iobase = pci_resource_start(pcidev, 2);
3922 devpriv->dio_counter_phys_iobase = pci_resource_start(pcidev, 3);
3924 devpriv->plx9080_iobase = pci_ioremap_bar(pcidev, 0);
3925 devpriv->main_iobase = pci_ioremap_bar(pcidev, 2);
3926 dev->mmio = pci_ioremap_bar(pcidev, 3);
3928 if (!devpriv->plx9080_iobase || !devpriv->main_iobase || !dev->mmio) {
3929 dev_warn(dev->class_dev, "failed to remap io memory\n");
3933 /* figure out what local addresses are */
3934 local_range = readl(devpriv->plx9080_iobase + PLX_LAS0RNG_REG) &
3936 local_decode = readl(devpriv->plx9080_iobase + PLX_LAS0MAP_REG) &
3937 local_range & LMAP_MEM_MASK;
3938 devpriv->local0_iobase = ((uint32_t)devpriv->main_phys_iobase &
3939 ~local_range) | local_decode;
3940 local_range = readl(devpriv->plx9080_iobase + PLX_LAS1RNG_REG) &
3942 local_decode = readl(devpriv->plx9080_iobase + PLX_LAS1MAP_REG) &
3943 local_range & LMAP_MEM_MASK;
3944 devpriv->local1_iobase = ((uint32_t)devpriv->dio_counter_phys_iobase &
3945 ~local_range) | local_decode;
3947 retval = alloc_and_init_dma_members(dev);
3951 devpriv->hw_revision =
3952 hw_revision(dev, readw(devpriv->main_iobase + HW_STATUS_REG));
3953 dev_dbg(dev->class_dev, "stc hardware revision %i\n",
3954 devpriv->hw_revision);
3956 init_stc_registers(dev);
3958 retval = request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
3959 dev->board_name, dev);
3961 dev_dbg(dev->class_dev, "unable to allocate irq %u\n",
3965 dev->irq = pcidev->irq;
3966 dev_dbg(dev->class_dev, "irq %u\n", dev->irq);
3968 retval = setup_subdevices(dev);
3975 static void detach(struct comedi_device *dev)
3977 struct pcidas64_private *devpriv = dev->private;
3980 free_irq(dev->irq, dev);
3982 if (devpriv->plx9080_iobase) {
3983 disable_plx_interrupts(dev);
3984 iounmap(devpriv->plx9080_iobase);
3986 if (devpriv->main_iobase)
3987 iounmap(devpriv->main_iobase);
3991 comedi_pci_disable(dev);
3992 cb_pcidas64_free_dma(dev);
3995 static struct comedi_driver cb_pcidas64_driver = {
3996 .driver_name = "cb_pcidas64",
3997 .module = THIS_MODULE,
3998 .auto_attach = auto_attach,
4002 static int cb_pcidas64_pci_probe(struct pci_dev *dev,
4003 const struct pci_device_id *id)
4005 return comedi_pci_auto_config(dev, &cb_pcidas64_driver,
4009 static const struct pci_device_id cb_pcidas64_pci_table[] = {
4010 { PCI_VDEVICE(CB, 0x001d), BOARD_PCIDAS6402_16 },
4011 { PCI_VDEVICE(CB, 0x001e), BOARD_PCIDAS6402_12 },
4012 { PCI_VDEVICE(CB, 0x0035), BOARD_PCIDAS64_M1_16 },
4013 { PCI_VDEVICE(CB, 0x0036), BOARD_PCIDAS64_M2_16 },
4014 { PCI_VDEVICE(CB, 0x0037), BOARD_PCIDAS64_M3_16 },
4015 { PCI_VDEVICE(CB, 0x0052), BOARD_PCIDAS4020_12 },
4016 { PCI_VDEVICE(CB, 0x005d), BOARD_PCIDAS6023 },
4017 { PCI_VDEVICE(CB, 0x005e), BOARD_PCIDAS6025 },
4018 { PCI_VDEVICE(CB, 0x005f), BOARD_PCIDAS6030 },
4019 { PCI_VDEVICE(CB, 0x0060), BOARD_PCIDAS6031 },
4020 { PCI_VDEVICE(CB, 0x0061), BOARD_PCIDAS6032 },
4021 { PCI_VDEVICE(CB, 0x0062), BOARD_PCIDAS6033 },
4022 { PCI_VDEVICE(CB, 0x0063), BOARD_PCIDAS6034 },
4023 { PCI_VDEVICE(CB, 0x0064), BOARD_PCIDAS6035 },
4024 { PCI_VDEVICE(CB, 0x0065), BOARD_PCIDAS6040 },
4025 { PCI_VDEVICE(CB, 0x0066), BOARD_PCIDAS6052 },
4026 { PCI_VDEVICE(CB, 0x0067), BOARD_PCIDAS6070 },
4027 { PCI_VDEVICE(CB, 0x0068), BOARD_PCIDAS6071 },
4028 { PCI_VDEVICE(CB, 0x006f), BOARD_PCIDAS6036 },
4029 { PCI_VDEVICE(CB, 0x0078), BOARD_PCIDAS6013 },
4030 { PCI_VDEVICE(CB, 0x0079), BOARD_PCIDAS6014 },
4033 MODULE_DEVICE_TABLE(pci, cb_pcidas64_pci_table);
4035 static struct pci_driver cb_pcidas64_pci_driver = {
4036 .name = "cb_pcidas64",
4037 .id_table = cb_pcidas64_pci_table,
4038 .probe = cb_pcidas64_pci_probe,
4039 .remove = comedi_pci_auto_unconfig,
4041 module_comedi_pci_driver(cb_pcidas64_driver, cb_pcidas64_pci_driver);
4043 MODULE_AUTHOR("Comedi http://www.comedi.org");
4044 MODULE_DESCRIPTION("Comedi low-level driver");
4045 MODULE_LICENSE("GPL");