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/delay.h>
85 #include <linux/interrupt.h>
87 #include "../comedi_pci.h"
92 #define TIMER_BASE 25 /* 40MHz master clock */
93 /* 100kHz 'prescaled' clock for slow acquisition,
94 * maybe I'll support this someday */
95 #define PRESCALED_TIMER_BASE 10000
96 #define DMA_BUFFER_SIZE 0x1000
98 /* maximum value that can be loaded into board's 24-bit counters*/
99 static const int max_counter_value = 0xffffff;
101 /* PCI-DAS64xxx base addresses */
103 /* devpriv->main_iobase registers */
104 enum write_only_registers {
105 INTR_ENABLE_REG = 0x0, /* interrupt enable register */
106 HW_CONFIG_REG = 0x2, /* hardware config register */
108 DAQ_ATRIG_LOW_4020_REG = 0xc,
109 ADC_CONTROL0_REG = 0x10, /* adc control register 0 */
110 ADC_CONTROL1_REG = 0x12, /* adc control register 1 */
111 CALIBRATION_REG = 0x14,
112 /* lower 16 bits of adc sample interval counter */
113 ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16,
114 /* upper 8 bits of adc sample interval counter */
115 ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18,
116 /* lower 16 bits of delay interval counter */
117 ADC_DELAY_INTERVAL_LOWER_REG = 0x1a,
118 /* upper 8 bits of delay interval counter */
119 ADC_DELAY_INTERVAL_UPPER_REG = 0x1c,
120 /* lower 16 bits of hardware conversion/scan counter */
121 ADC_COUNT_LOWER_REG = 0x1e,
122 /* upper 8 bits of hardware conversion/scan counter */
123 ADC_COUNT_UPPER_REG = 0x20,
124 ADC_START_REG = 0x22, /* software trigger to start acquisition */
125 ADC_CONVERT_REG = 0x24, /* initiates single conversion */
126 ADC_QUEUE_CLEAR_REG = 0x26, /* clears adc queue */
127 ADC_QUEUE_LOAD_REG = 0x28, /* loads adc queue */
128 ADC_BUFFER_CLEAR_REG = 0x2a,
129 /* high channel for internal queue, use adc_chan_bits() inline above */
130 ADC_QUEUE_HIGH_REG = 0x2c,
131 DAC_CONTROL0_REG = 0x50, /* dac control register 0 */
132 DAC_CONTROL1_REG = 0x52, /* dac control register 0 */
133 /* lower 16 bits of dac sample interval counter */
134 DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54,
135 /* upper 8 bits of dac sample interval counter */
136 DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56,
137 DAC_SELECT_REG = 0x60,
138 DAC_START_REG = 0x64,
139 DAC_BUFFER_CLEAR_REG = 0x66, /* clear dac buffer */
142 static inline unsigned int dac_convert_reg(unsigned int channel)
144 return 0x70 + (2 * (channel & 0x1));
147 static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
149 return 0x70 + (4 * (channel & 0x1));
152 static inline unsigned int dac_msb_4020_reg(unsigned int channel)
154 return 0x72 + (4 * (channel & 0x1));
157 enum read_only_registers {
159 * hardware status register,
160 * reading this apparently clears pending interrupts as well
163 PIPE1_READ_REG = 0x4,
164 ADC_READ_PNTR_REG = 0x8,
165 LOWER_XFER_REG = 0x10,
166 ADC_WRITE_PNTR_REG = 0xc,
170 enum read_write_registers {
171 I8255_4020_REG = 0x48, /* 8255 offset, for 4020 only */
172 /* external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
173 ADC_QUEUE_FIFO_REG = 0x100,
174 ADC_FIFO_REG = 0x200, /* adc data fifo */
175 /* dac data fifo, has weird interactions with external channel queue */
176 DAC_FIFO_REG = 0x300,
179 /* dev->mmio registers */
180 enum dio_counter_registers {
181 DIO_8255_OFFSET = 0x0,
184 DIO_DIRECTION_60XX_REG = 0x40,
185 DIO_DATA_60XX_REG = 0x48,
188 /* bit definitions for write-only registers */
190 enum intr_enable_contents {
191 ADC_INTR_SRC_MASK = 0x3, /* adc interrupt source mask */
192 ADC_INTR_QFULL_BITS = 0x0, /* interrupt fifo quarter full */
193 ADC_INTR_EOC_BITS = 0x1, /* interrupt end of conversion */
194 ADC_INTR_EOSCAN_BITS = 0x2, /* interrupt end of scan */
195 ADC_INTR_EOSEQ_BITS = 0x3, /* interrupt end of sequence mask */
196 EN_ADC_INTR_SRC_BIT = 0x4, /* enable adc interrupt source */
197 EN_ADC_DONE_INTR_BIT = 0x8, /* enable adc acquisition done intr */
198 DAC_INTR_SRC_MASK = 0x30,
199 DAC_INTR_QEMPTY_BITS = 0x0,
200 DAC_INTR_HIGH_CHAN_BITS = 0x10,
201 EN_DAC_INTR_SRC_BIT = 0x40, /* enable dac interrupt source */
202 EN_DAC_DONE_INTR_BIT = 0x80,
203 EN_ADC_ACTIVE_INTR_BIT = 0x200, /* enable adc active interrupt */
204 EN_ADC_STOP_INTR_BIT = 0x400, /* enable adc stop trigger interrupt */
205 EN_DAC_ACTIVE_INTR_BIT = 0x800, /* enable dac active interrupt */
206 EN_DAC_UNDERRUN_BIT = 0x4000, /* enable dac underrun status bit */
207 EN_ADC_OVERRUN_BIT = 0x8000, /* enable adc overrun status bit */
210 enum hw_config_contents {
211 MASTER_CLOCK_4020_MASK = 0x3, /* master clock source mask for 4020 */
212 INTERNAL_CLOCK_4020_BITS = 0x1, /* use 40 MHz internal master clock */
213 BNC_CLOCK_4020_BITS = 0x2, /* use BNC input for master clock */
214 EXT_CLOCK_4020_BITS = 0x3, /* use dio input for master clock */
215 EXT_QUEUE_BIT = 0x200, /* use external channel/gain queue */
216 /* use 225 nanosec strobe when loading dac instead of 50 nanosec */
217 SLOW_DAC_BIT = 0x400,
218 /* bit with unknown function yet given as default value in pci-das64
220 HW_CONFIG_DUMMY_BITS = 0x2000,
221 /* bit selects channels 1/0 for analog input/output, otherwise 0/1 */
222 DMA_CH_SELECT_BIT = 0x8000,
223 FIFO_SIZE_REG = 0x4, /* allows adjustment of fifo sizes */
224 DAC_FIFO_SIZE_MASK = 0xff00, /* bits that set dac fifo size */
225 DAC_FIFO_BITS = 0xf800, /* 8k sample ao fifo */
227 #define DAC_FIFO_SIZE 0x2000
229 enum daq_atrig_low_4020_contents {
230 /* use trig/ext clk bnc input for analog gate signal */
231 EXT_AGATE_BNC_BIT = 0x8000,
232 /* use trig/ext clk bnc input for external stop trigger signal */
233 EXT_STOP_TRIG_BNC_BIT = 0x4000,
234 /* use trig/ext clk bnc input for external start trigger signal */
235 EXT_START_TRIG_BNC_BIT = 0x2000,
238 static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
240 return threshold & 0xfff;
243 enum adc_control0_contents {
244 ADC_GATE_SRC_MASK = 0x3, /* bits that select gate */
245 ADC_SOFT_GATE_BITS = 0x1, /* software gate */
246 ADC_EXT_GATE_BITS = 0x2, /* external digital gate */
247 ADC_ANALOG_GATE_BITS = 0x3, /* analog level gate */
248 /* level-sensitive gate (for digital) */
249 ADC_GATE_LEVEL_BIT = 0x4,
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,
307 * calibration sources for 6025 are:
318 static inline uint16_t adc_src_bits(unsigned int source)
320 return (source & 0xf) << 3;
323 static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
325 return (channel & 0x3) << 8;
328 enum adc_queue_load_contents {
329 UNIP_BIT = 0x800, /* unipolar/bipolar bit */
330 ADC_SE_DIFF_BIT = 0x1000, /* single-ended/ differential bit */
331 /* non-referenced single-ended (common-mode input) */
332 ADC_COMMON_BIT = 0x2000,
333 QUEUE_EOSEQ_BIT = 0x4000, /* queue end of sequence */
334 QUEUE_EOSCAN_BIT = 0x8000, /* queue end of scan */
337 static inline uint16_t adc_chan_bits(unsigned int channel)
339 return channel & 0x3f;
342 enum dac_control0_contents {
343 DAC_ENABLE_BIT = 0x8000, /* dac controller enable bit */
344 DAC_CYCLIC_STOP_BIT = 0x4000,
345 DAC_WAVEFORM_MODE_BIT = 0x100,
346 DAC_EXT_UPDATE_FALLING_BIT = 0x80,
347 DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
348 WAVEFORM_TRIG_MASK = 0x30,
349 WAVEFORM_TRIG_DISABLED_BITS = 0x0,
350 WAVEFORM_TRIG_SOFT_BITS = 0x10,
351 WAVEFORM_TRIG_EXT_BITS = 0x20,
352 WAVEFORM_TRIG_ADC1_BITS = 0x30,
353 WAVEFORM_TRIG_FALLING_BIT = 0x8,
354 WAVEFORM_GATE_LEVEL_BIT = 0x4,
355 WAVEFORM_GATE_ENABLE_BIT = 0x2,
356 WAVEFORM_GATE_SELECT_BIT = 0x1,
359 enum dac_control1_contents {
360 DAC_WRITE_POLARITY_BIT = 0x800, /* board-dependent setting */
361 DAC1_EXT_REF_BIT = 0x200,
362 DAC0_EXT_REF_BIT = 0x100,
363 DAC_OUTPUT_ENABLE_BIT = 0x80, /* dac output enable bit */
364 DAC_UPDATE_POLARITY_BIT = 0x40, /* board-dependent setting */
365 DAC_SW_GATE_BIT = 0x20,
366 DAC1_UNIPOLAR_BIT = 0x8,
367 DAC0_UNIPOLAR_BIT = 0x2,
370 /* bit definitions for read-only registers */
371 enum hw_status_contents {
372 DAC_UNDERRUN_BIT = 0x1,
373 ADC_OVERRUN_BIT = 0x2,
374 DAC_ACTIVE_BIT = 0x4,
375 ADC_ACTIVE_BIT = 0x8,
376 DAC_INTR_PENDING_BIT = 0x10,
377 ADC_INTR_PENDING_BIT = 0x20,
380 EXT_INTR_PENDING_BIT = 0x100,
381 ADC_STOP_BIT = 0x200,
384 static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
386 return (hw_status_bits >> 10) & 0x3;
389 static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
391 return (prepost_bits >> 6) & 0x3;
394 static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
396 return (prepost_bits >> 12) & 0x3;
399 static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
401 return (prepost_bits >> 14) & 0x3;
404 /* I2C addresses for 4020 */
406 RANGE_CAL_I2C_ADDR = 0x20,
407 CALDAC0_I2C_ADDR = 0xc,
408 CALDAC1_I2C_ADDR = 0xd,
411 enum range_cal_i2c_contents {
412 /* bits that set what source the adc converter measures */
413 ADC_SRC_4020_MASK = 0x70,
414 /* make bnc trig/ext clock threshold 0V instead of 2.5V */
415 BNC_TRIG_THRESHOLD_0V_BIT = 0x80,
418 static inline uint8_t adc_src_4020_bits(unsigned int source)
420 return (source << 4) & ADC_SRC_4020_MASK;
423 static inline uint8_t attenuate_bit(unsigned int channel)
425 /* attenuate channel (+-5V input range) */
426 return 1 << (channel & 0x3);
429 /* analog input ranges for 64xx boards */
430 static const struct comedi_lrange ai_ranges_64xx = {
443 static const uint8_t ai_range_code_64xx[8] = {
444 0x0, 0x1, 0x2, 0x3, /* bipolar 10, 5, 2,5, 1.25 */
445 0x8, 0x9, 0xa, 0xb /* unipolar 10, 5, 2.5, 1.25 */
448 /* analog input ranges for 64-Mx boards */
449 static const struct comedi_lrange ai_ranges_64_mx = {
461 static const uint8_t ai_range_code_64_mx[7] = {
462 0x0, 0x1, 0x2, 0x3, /* bipolar 5, 2.5, 1.25, 0.625 */
463 0x9, 0xa, 0xb /* unipolar 5, 2.5, 1.25 */
466 /* analog input ranges for 60xx boards */
467 static const struct comedi_lrange ai_ranges_60xx = {
476 static const uint8_t ai_range_code_60xx[4] = {
477 0x0, 0x1, 0x4, 0x7 /* bipolar 10, 5, 0.5, 0.05 */
480 /* analog input ranges for 6030, etc boards */
481 static const struct comedi_lrange ai_ranges_6030 = {
500 static const uint8_t ai_range_code_6030[14] = {
501 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, /* bip 10, 5, 2, 1, 0.5, 0.2, 0.1 */
502 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf /* uni 10, 5, 2, 1, 0.5, 0.2, 0.1 */
505 /* analog input ranges for 6052, etc boards */
506 static const struct comedi_lrange ai_ranges_6052 = {
526 static const uint8_t ai_range_code_6052[15] = {
527 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, /* bipolar 10 ... 0.05 */
528 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf /* unipolar 10 ... 0.1 */
531 /* analog input ranges for 4020 board */
532 static const struct comedi_lrange ai_ranges_4020 = {
539 /* analog output ranges */
540 static const struct comedi_lrange ao_ranges_64xx = {
549 static const int ao_range_code_64xx[] = {
556 static const int ao_range_code_60xx[] = {
560 static const struct comedi_lrange ao_ranges_6030 = {
567 static const int ao_range_code_6030[] = {
572 static const struct comedi_lrange ao_ranges_4020 = {
579 static const int ao_range_code_4020[] = {
584 enum register_layout {
590 struct hw_fifo_info {
591 unsigned int num_segments;
592 unsigned int max_segment_length;
593 unsigned int sample_packing_ratio;
594 uint16_t fifo_size_reg_mask;
597 enum pcidas64_boardid {
600 BOARD_PCIDAS64_M1_16,
601 BOARD_PCIDAS64_M2_16,
602 BOARD_PCIDAS64_M3_16,
619 BOARD_PCIDAS6402_16_JR,
620 BOARD_PCIDAS64_M1_16_JR,
621 BOARD_PCIDAS64_M2_16_JR,
622 BOARD_PCIDAS64_M3_16_JR,
623 BOARD_PCIDAS64_M1_14,
624 BOARD_PCIDAS64_M2_14,
625 BOARD_PCIDAS64_M3_14,
628 struct pcidas64_board {
630 int ai_se_chans; /* number of ai inputs in single-ended mode */
631 int ai_bits; /* analog input resolution */
632 int ai_speed; /* fastest conversion period in ns */
633 const struct comedi_lrange *ai_range_table;
634 const uint8_t *ai_range_code;
635 int ao_nchan; /* number of analog out channels */
636 int ao_bits; /* analog output resolution */
637 int ao_scan_speed; /* analog output scan speed */
638 const struct comedi_lrange *ao_range_table;
639 const int *ao_range_code;
640 const struct hw_fifo_info *const ai_fifo;
641 /* different board families have slightly different registers */
642 enum register_layout layout;
646 static const struct hw_fifo_info ai_fifo_4020 = {
648 .max_segment_length = 0x8000,
649 .sample_packing_ratio = 2,
650 .fifo_size_reg_mask = 0x7f,
653 static const struct hw_fifo_info ai_fifo_64xx = {
655 .max_segment_length = 0x800,
656 .sample_packing_ratio = 1,
657 .fifo_size_reg_mask = 0x3f,
660 static const struct hw_fifo_info ai_fifo_60xx = {
662 .max_segment_length = 0x800,
663 .sample_packing_ratio = 1,
664 .fifo_size_reg_mask = 0x7f,
668 * maximum number of dma transfers we will chain together into a ring
669 * (and the maximum number of dma buffers we maintain)
671 #define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
672 #define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
673 #define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
674 static inline unsigned int ai_dma_ring_count(const struct pcidas64_board *board)
676 if (board->layout == LAYOUT_4020)
677 return MAX_AI_DMA_RING_COUNT;
679 return MIN_AI_DMA_RING_COUNT;
682 static const int bytes_in_sample = 2;
684 static const struct pcidas64_board pcidas64_boards[] = {
685 [BOARD_PCIDAS6402_16] = {
686 .name = "pci-das6402/16",
692 .ao_scan_speed = 10000,
693 .layout = LAYOUT_64XX,
694 .ai_range_table = &ai_ranges_64xx,
695 .ai_range_code = ai_range_code_64xx,
696 .ao_range_table = &ao_ranges_64xx,
697 .ao_range_code = ao_range_code_64xx,
698 .ai_fifo = &ai_fifo_64xx,
701 [BOARD_PCIDAS6402_12] = {
702 .name = "pci-das6402/12", /* XXX check */
708 .ao_scan_speed = 10000,
709 .layout = LAYOUT_64XX,
710 .ai_range_table = &ai_ranges_64xx,
711 .ai_range_code = ai_range_code_64xx,
712 .ao_range_table = &ao_ranges_64xx,
713 .ao_range_code = ao_range_code_64xx,
714 .ai_fifo = &ai_fifo_64xx,
717 [BOARD_PCIDAS64_M1_16] = {
718 .name = "pci-das64/m1/16",
724 .ao_scan_speed = 10000,
725 .layout = LAYOUT_64XX,
726 .ai_range_table = &ai_ranges_64_mx,
727 .ai_range_code = ai_range_code_64_mx,
728 .ao_range_table = &ao_ranges_64xx,
729 .ao_range_code = ao_range_code_64xx,
730 .ai_fifo = &ai_fifo_64xx,
733 [BOARD_PCIDAS64_M2_16] = {
734 .name = "pci-das64/m2/16",
740 .ao_scan_speed = 10000,
741 .layout = LAYOUT_64XX,
742 .ai_range_table = &ai_ranges_64_mx,
743 .ai_range_code = ai_range_code_64_mx,
744 .ao_range_table = &ao_ranges_64xx,
745 .ao_range_code = ao_range_code_64xx,
746 .ai_fifo = &ai_fifo_64xx,
749 [BOARD_PCIDAS64_M3_16] = {
750 .name = "pci-das64/m3/16",
756 .ao_scan_speed = 10000,
757 .layout = LAYOUT_64XX,
758 .ai_range_table = &ai_ranges_64_mx,
759 .ai_range_code = ai_range_code_64_mx,
760 .ao_range_table = &ao_ranges_64xx,
761 .ao_range_code = ao_range_code_64xx,
762 .ai_fifo = &ai_fifo_64xx,
765 [BOARD_PCIDAS6013] = {
766 .name = "pci-das6013",
772 .layout = LAYOUT_60XX,
773 .ai_range_table = &ai_ranges_60xx,
774 .ai_range_code = ai_range_code_60xx,
775 .ao_range_table = &range_bipolar10,
776 .ao_range_code = ao_range_code_60xx,
777 .ai_fifo = &ai_fifo_60xx,
780 [BOARD_PCIDAS6014] = {
781 .name = "pci-das6014",
787 .ao_scan_speed = 100000,
788 .layout = LAYOUT_60XX,
789 .ai_range_table = &ai_ranges_60xx,
790 .ai_range_code = ai_range_code_60xx,
791 .ao_range_table = &range_bipolar10,
792 .ao_range_code = ao_range_code_60xx,
793 .ai_fifo = &ai_fifo_60xx,
796 [BOARD_PCIDAS6023] = {
797 .name = "pci-das6023",
802 .ao_scan_speed = 100000,
803 .layout = LAYOUT_60XX,
804 .ai_range_table = &ai_ranges_60xx,
805 .ai_range_code = ai_range_code_60xx,
806 .ao_range_table = &range_bipolar10,
807 .ao_range_code = ao_range_code_60xx,
808 .ai_fifo = &ai_fifo_60xx,
811 [BOARD_PCIDAS6025] = {
812 .name = "pci-das6025",
818 .ao_scan_speed = 100000,
819 .layout = LAYOUT_60XX,
820 .ai_range_table = &ai_ranges_60xx,
821 .ai_range_code = ai_range_code_60xx,
822 .ao_range_table = &range_bipolar10,
823 .ao_range_code = ao_range_code_60xx,
824 .ai_fifo = &ai_fifo_60xx,
827 [BOARD_PCIDAS6030] = {
828 .name = "pci-das6030",
834 .ao_scan_speed = 10000,
835 .layout = LAYOUT_60XX,
836 .ai_range_table = &ai_ranges_6030,
837 .ai_range_code = ai_range_code_6030,
838 .ao_range_table = &ao_ranges_6030,
839 .ao_range_code = ao_range_code_6030,
840 .ai_fifo = &ai_fifo_60xx,
843 [BOARD_PCIDAS6031] = {
844 .name = "pci-das6031",
850 .ao_scan_speed = 10000,
851 .layout = LAYOUT_60XX,
852 .ai_range_table = &ai_ranges_6030,
853 .ai_range_code = ai_range_code_6030,
854 .ao_range_table = &ao_ranges_6030,
855 .ao_range_code = ao_range_code_6030,
856 .ai_fifo = &ai_fifo_60xx,
859 [BOARD_PCIDAS6032] = {
860 .name = "pci-das6032",
865 .layout = LAYOUT_60XX,
866 .ai_range_table = &ai_ranges_6030,
867 .ai_range_code = ai_range_code_6030,
868 .ai_fifo = &ai_fifo_60xx,
871 [BOARD_PCIDAS6033] = {
872 .name = "pci-das6033",
877 .layout = LAYOUT_60XX,
878 .ai_range_table = &ai_ranges_6030,
879 .ai_range_code = ai_range_code_6030,
880 .ai_fifo = &ai_fifo_60xx,
883 [BOARD_PCIDAS6034] = {
884 .name = "pci-das6034",
890 .layout = LAYOUT_60XX,
891 .ai_range_table = &ai_ranges_60xx,
892 .ai_range_code = ai_range_code_60xx,
893 .ai_fifo = &ai_fifo_60xx,
896 [BOARD_PCIDAS6035] = {
897 .name = "pci-das6035",
903 .ao_scan_speed = 100000,
904 .layout = LAYOUT_60XX,
905 .ai_range_table = &ai_ranges_60xx,
906 .ai_range_code = ai_range_code_60xx,
907 .ao_range_table = &range_bipolar10,
908 .ao_range_code = ao_range_code_60xx,
909 .ai_fifo = &ai_fifo_60xx,
912 [BOARD_PCIDAS6036] = {
913 .name = "pci-das6036",
919 .ao_scan_speed = 100000,
920 .layout = LAYOUT_60XX,
921 .ai_range_table = &ai_ranges_60xx,
922 .ai_range_code = ai_range_code_60xx,
923 .ao_range_table = &range_bipolar10,
924 .ao_range_code = ao_range_code_60xx,
925 .ai_fifo = &ai_fifo_60xx,
928 [BOARD_PCIDAS6040] = {
929 .name = "pci-das6040",
935 .ao_scan_speed = 1000,
936 .layout = LAYOUT_60XX,
937 .ai_range_table = &ai_ranges_6052,
938 .ai_range_code = ai_range_code_6052,
939 .ao_range_table = &ao_ranges_6030,
940 .ao_range_code = ao_range_code_6030,
941 .ai_fifo = &ai_fifo_60xx,
944 [BOARD_PCIDAS6052] = {
945 .name = "pci-das6052",
951 .ao_scan_speed = 3333,
952 .layout = LAYOUT_60XX,
953 .ai_range_table = &ai_ranges_6052,
954 .ai_range_code = ai_range_code_6052,
955 .ao_range_table = &ao_ranges_6030,
956 .ao_range_code = ao_range_code_6030,
957 .ai_fifo = &ai_fifo_60xx,
960 [BOARD_PCIDAS6070] = {
961 .name = "pci-das6070",
967 .ao_scan_speed = 1000,
968 .layout = LAYOUT_60XX,
969 .ai_range_table = &ai_ranges_6052,
970 .ai_range_code = ai_range_code_6052,
971 .ao_range_table = &ao_ranges_6030,
972 .ao_range_code = ao_range_code_6030,
973 .ai_fifo = &ai_fifo_60xx,
976 [BOARD_PCIDAS6071] = {
977 .name = "pci-das6071",
983 .ao_scan_speed = 1000,
984 .layout = LAYOUT_60XX,
985 .ai_range_table = &ai_ranges_6052,
986 .ai_range_code = ai_range_code_6052,
987 .ao_range_table = &ao_ranges_6030,
988 .ao_range_code = ao_range_code_6030,
989 .ai_fifo = &ai_fifo_60xx,
992 [BOARD_PCIDAS4020_12] = {
993 .name = "pci-das4020/12",
999 .ao_scan_speed = 0, /* no hardware pacing on ao */
1000 .layout = LAYOUT_4020,
1001 .ai_range_table = &ai_ranges_4020,
1002 .ao_range_table = &ao_ranges_4020,
1003 .ao_range_code = ao_range_code_4020,
1004 .ai_fifo = &ai_fifo_4020,
1009 * The device id for these boards is unknown
1012 [BOARD_PCIDAS6402_16_JR] = {
1013 .name = "pci-das6402/16/jr",
1018 .ao_scan_speed = 10000,
1019 .layout = LAYOUT_64XX,
1020 .ai_range_table = &ai_ranges_64xx,
1021 .ai_range_code = ai_range_code_64xx,
1022 .ai_fifo = ai_fifo_64xx,
1025 [BOARD_PCIDAS64_M1_16_JR] = {
1026 .name = "pci-das64/m1/16/jr",
1031 .ao_scan_speed = 10000,
1032 .layout = LAYOUT_64XX,
1033 .ai_range_table = &ai_ranges_64_mx,
1034 .ai_range_code = ai_range_code_64_mx,
1035 .ai_fifo = ai_fifo_64xx,
1038 [BOARD_PCIDAS64_M2_16_JR] = {
1039 .name = "pci-das64/m2/16/jr",
1044 .ao_scan_speed = 10000,
1045 .layout = LAYOUT_64XX,
1046 .ai_range_table = &ai_ranges_64_mx,
1047 .ai_range_code = ai_range_code_64_mx,
1048 .ai_fifo = ai_fifo_64xx,
1051 [BOARD_PCIDAS64_M3_16_JR] = {
1052 .name = "pci-das64/m3/16/jr",
1057 .ao_scan_speed = 10000,
1058 .layout = LAYOUT_64XX,
1059 .ai_range_table = &ai_ranges_64_mx,
1060 .ai_range_code = ai_range_code_64_mx,
1061 .ai_fifo = ai_fifo_64xx,
1064 [BOARD_PCIDAS64_M1_14] = {
1065 .name = "pci-das64/m1/14",
1070 .ao_scan_speed = 10000,
1071 .layout = LAYOUT_64XX,
1072 .ai_range_table = &ai_ranges_64_mx,
1073 .ai_range_code = ai_range_code_64_mx,
1074 .ai_fifo = ai_fifo_64xx,
1077 [BOARD_PCIDAS64_M2_14] = {
1078 .name = "pci-das64/m2/14",
1083 .ao_scan_speed = 10000,
1084 .layout = LAYOUT_64XX,
1085 .ai_range_table = &ai_ranges_64_mx,
1086 .ai_range_code = ai_range_code_64_mx,
1087 .ai_fifo = ai_fifo_64xx,
1090 [BOARD_PCIDAS64_M3_14] = {
1091 .name = "pci-das64/m3/14",
1096 .ao_scan_speed = 10000,
1097 .layout = LAYOUT_64XX,
1098 .ai_range_table = &ai_ranges_64_mx,
1099 .ai_range_code = ai_range_code_64_mx,
1100 .ai_fifo = ai_fifo_64xx,
1106 static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev,
1107 int use_differential)
1109 const struct pcidas64_board *thisboard = dev->board_ptr;
1111 if ((thisboard->layout == LAYOUT_64XX && !use_differential) ||
1112 (thisboard->layout == LAYOUT_60XX && use_differential))
1113 return ADC_SE_DIFF_BIT;
1118 struct ext_clock_info {
1119 /* master clock divisor to use for scans with external master clock */
1120 unsigned int divisor;
1121 /* chanspec for master clock input when used as scan begin src */
1122 unsigned int chanspec;
1125 /* this structure is for data unique to this hardware driver. */
1126 struct pcidas64_private {
1127 /* base addresses (physical) */
1128 resource_size_t main_phys_iobase;
1129 resource_size_t dio_counter_phys_iobase;
1130 /* base addresses (ioremapped) */
1131 void __iomem *plx9080_iobase;
1132 void __iomem *main_iobase;
1133 /* local address (used by dma controller) */
1134 uint32_t local0_iobase;
1135 uint32_t local1_iobase;
1136 /* dma buffers for analog input */
1137 uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT];
1138 /* physical addresses of ai dma buffers */
1139 dma_addr_t ai_buffer_bus_addr[MAX_AI_DMA_RING_COUNT];
1140 /* array of ai dma descriptors read by plx9080,
1141 * allocated to get proper alignment */
1142 struct plx_dma_desc *ai_dma_desc;
1143 /* physical address of ai dma descriptor array */
1144 dma_addr_t ai_dma_desc_bus_addr;
1145 /* index of the ai dma descriptor/buffer
1146 * that is currently being used */
1147 unsigned int ai_dma_index;
1148 /* dma buffers for analog output */
1149 uint16_t *ao_buffer[AO_DMA_RING_COUNT];
1150 /* physical addresses of ao dma buffers */
1151 dma_addr_t ao_buffer_bus_addr[AO_DMA_RING_COUNT];
1152 struct plx_dma_desc *ao_dma_desc;
1153 dma_addr_t ao_dma_desc_bus_addr;
1154 /* keeps track of buffer where the next ao sample should go */
1155 unsigned int ao_dma_index;
1156 unsigned int hw_revision; /* stc chip hardware revision number */
1157 /* last bits sent to INTR_ENABLE_REG register */
1158 unsigned int intr_enable_bits;
1159 /* last bits sent to ADC_CONTROL1_REG register */
1160 uint16_t adc_control1_bits;
1161 /* last bits sent to FIFO_SIZE_REG register */
1162 uint16_t fifo_size_bits;
1163 /* last bits sent to HW_CONFIG_REG register */
1164 uint16_t hw_config_bits;
1165 uint16_t dac_control1_bits;
1166 /* last bits written to plx9080 control register */
1167 uint32_t plx_control_bits;
1168 /* last bits written to plx interrupt control and status register */
1169 uint32_t plx_intcsr_bits;
1170 /* index of calibration source readable through ai ch0 */
1171 int calibration_source;
1172 /* bits written to i2c calibration/range register */
1173 uint8_t i2c_cal_range_bits;
1174 /* configure digital triggers to trigger on falling edge */
1175 unsigned int ext_trig_falling;
1176 short ai_cmd_running;
1177 unsigned int ai_fifo_segment_length;
1178 struct ext_clock_info ext_clock;
1179 unsigned short ao_bounce_buffer[DAC_FIFO_SIZE];
1182 static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
1183 unsigned int range_index)
1185 const struct pcidas64_board *thisboard = dev->board_ptr;
1187 return thisboard->ai_range_code[range_index] << 8;
1190 static unsigned int hw_revision(const struct comedi_device *dev,
1191 uint16_t hw_status_bits)
1193 const struct pcidas64_board *thisboard = dev->board_ptr;
1195 if (thisboard->layout == LAYOUT_4020)
1196 return (hw_status_bits >> 13) & 0x7;
1198 return (hw_status_bits >> 12) & 0xf;
1201 static void set_dac_range_bits(struct comedi_device *dev,
1202 uint16_t *bits, unsigned int channel,
1205 const struct pcidas64_board *thisboard = dev->board_ptr;
1206 unsigned int code = thisboard->ao_range_code[range];
1209 dev_err(dev->class_dev, "bug! bad channel?\n");
1211 dev_err(dev->class_dev, "bug! bad range code?\n");
1213 *bits &= ~(0x3 << (2 * channel));
1214 *bits |= code << (2 * channel);
1217 static inline int ao_cmd_is_supported(const struct pcidas64_board *board)
1219 return board->ao_nchan && board->layout != LAYOUT_4020;
1222 static void abort_dma(struct comedi_device *dev, unsigned int channel)
1224 struct pcidas64_private *devpriv = dev->private;
1225 unsigned long flags;
1227 /* spinlock for plx dma control/status reg */
1228 spin_lock_irqsave(&dev->spinlock, flags);
1230 plx9080_abort_dma(devpriv->plx9080_iobase, channel);
1232 spin_unlock_irqrestore(&dev->spinlock, flags);
1235 static void disable_plx_interrupts(struct comedi_device *dev)
1237 struct pcidas64_private *devpriv = dev->private;
1239 devpriv->plx_intcsr_bits = 0;
1240 writel(devpriv->plx_intcsr_bits,
1241 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1244 static void disable_ai_interrupts(struct comedi_device *dev)
1246 struct pcidas64_private *devpriv = dev->private;
1247 unsigned long flags;
1249 spin_lock_irqsave(&dev->spinlock, flags);
1250 devpriv->intr_enable_bits &=
1251 ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
1252 ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
1253 ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
1254 writew(devpriv->intr_enable_bits,
1255 devpriv->main_iobase + INTR_ENABLE_REG);
1256 spin_unlock_irqrestore(&dev->spinlock, flags);
1259 static void enable_ai_interrupts(struct comedi_device *dev,
1260 const struct comedi_cmd *cmd)
1262 const struct pcidas64_board *thisboard = dev->board_ptr;
1263 struct pcidas64_private *devpriv = dev->private;
1265 unsigned long flags;
1267 bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
1268 EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
1270 * Use pio transfer and interrupt on end of conversion
1271 * if CMDF_WAKE_EOS flag is set.
1273 if (cmd->flags & CMDF_WAKE_EOS) {
1274 /* 4020 doesn't support pio transfers except for fifo dregs */
1275 if (thisboard->layout != LAYOUT_4020)
1276 bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
1278 spin_lock_irqsave(&dev->spinlock, flags);
1279 devpriv->intr_enable_bits |= bits;
1280 writew(devpriv->intr_enable_bits,
1281 devpriv->main_iobase + INTR_ENABLE_REG);
1282 spin_unlock_irqrestore(&dev->spinlock, flags);
1285 /* initialize plx9080 chip */
1286 static void init_plx9080(struct comedi_device *dev)
1288 const struct pcidas64_board *thisboard = dev->board_ptr;
1289 struct pcidas64_private *devpriv = dev->private;
1291 void __iomem *plx_iobase = devpriv->plx9080_iobase;
1293 devpriv->plx_control_bits =
1294 readl(devpriv->plx9080_iobase + PLX_CONTROL_REG);
1297 bits = BIGEND_DMA0 | BIGEND_DMA1;
1301 writel(bits, devpriv->plx9080_iobase + PLX_BIGEND_REG);
1303 disable_plx_interrupts(dev);
1308 /* configure dma0 mode */
1310 /* enable ready input, not sure if this is necessary */
1311 bits |= PLX_DMA_EN_READYIN_BIT;
1312 /* enable bterm, not sure if this is necessary */
1313 bits |= PLX_EN_BTERM_BIT;
1314 /* enable dma chaining */
1315 bits |= PLX_EN_CHAIN_BIT;
1316 /* enable interrupt on dma done
1317 * (probably don't need this, since chain never finishes) */
1318 bits |= PLX_EN_DMA_DONE_INTR_BIT;
1319 /* don't increment local address during transfers
1320 * (we are transferring from a fixed fifo register) */
1321 bits |= PLX_LOCAL_ADDR_CONST_BIT;
1322 /* route dma interrupt to pci bus */
1323 bits |= PLX_DMA_INTR_PCI_BIT;
1324 /* enable demand mode */
1325 bits |= PLX_DEMAND_MODE_BIT;
1326 /* enable local burst mode */
1327 bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1328 /* 4020 uses 32 bit dma */
1329 if (thisboard->layout == LAYOUT_4020)
1330 bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1331 else /* localspace0 bus is 16 bits wide */
1332 bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
1333 writel(bits, plx_iobase + PLX_DMA1_MODE_REG);
1334 if (ao_cmd_is_supported(thisboard))
1335 writel(bits, plx_iobase + PLX_DMA0_MODE_REG);
1337 /* enable interrupts on plx 9080 */
1338 devpriv->plx_intcsr_bits |=
1339 ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1340 ICS_DMA0_E | ICS_DMA1_E;
1341 writel(devpriv->plx_intcsr_bits,
1342 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1345 static void disable_ai_pacing(struct comedi_device *dev)
1347 struct pcidas64_private *devpriv = dev->private;
1348 unsigned long flags;
1350 disable_ai_interrupts(dev);
1352 spin_lock_irqsave(&dev->spinlock, flags);
1353 devpriv->adc_control1_bits &= ~ADC_SW_GATE_BIT;
1354 writew(devpriv->adc_control1_bits,
1355 devpriv->main_iobase + ADC_CONTROL1_REG);
1356 spin_unlock_irqrestore(&dev->spinlock, flags);
1358 /* disable pacing, triggering, etc */
1359 writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
1360 devpriv->main_iobase + ADC_CONTROL0_REG);
1363 static int set_ai_fifo_segment_length(struct comedi_device *dev,
1364 unsigned int num_entries)
1366 const struct pcidas64_board *thisboard = dev->board_ptr;
1367 struct pcidas64_private *devpriv = dev->private;
1368 static const int increment_size = 0x100;
1369 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1370 unsigned int num_increments;
1373 if (num_entries < increment_size)
1374 num_entries = increment_size;
1375 if (num_entries > fifo->max_segment_length)
1376 num_entries = fifo->max_segment_length;
1378 /* 1 == 256 entries, 2 == 512 entries, etc */
1379 num_increments = (num_entries + increment_size / 2) / increment_size;
1381 bits = (~(num_increments - 1)) & fifo->fifo_size_reg_mask;
1382 devpriv->fifo_size_bits &= ~fifo->fifo_size_reg_mask;
1383 devpriv->fifo_size_bits |= bits;
1384 writew(devpriv->fifo_size_bits,
1385 devpriv->main_iobase + FIFO_SIZE_REG);
1387 devpriv->ai_fifo_segment_length = num_increments * increment_size;
1389 return devpriv->ai_fifo_segment_length;
1393 * adjusts the size of hardware fifo (which determines block size for dma xfers)
1395 static int set_ai_fifo_size(struct comedi_device *dev, unsigned int num_samples)
1397 const struct pcidas64_board *thisboard = dev->board_ptr;
1398 unsigned int num_fifo_entries;
1400 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1402 num_fifo_entries = num_samples / fifo->sample_packing_ratio;
1404 retval = set_ai_fifo_segment_length(dev,
1406 fifo->num_segments);
1410 num_samples = retval * fifo->num_segments * fifo->sample_packing_ratio;
1415 /* query length of fifo */
1416 static unsigned int ai_fifo_size(struct comedi_device *dev)
1418 const struct pcidas64_board *thisboard = dev->board_ptr;
1419 struct pcidas64_private *devpriv = dev->private;
1421 return devpriv->ai_fifo_segment_length *
1422 thisboard->ai_fifo->num_segments *
1423 thisboard->ai_fifo->sample_packing_ratio;
1426 static void init_stc_registers(struct comedi_device *dev)
1428 const struct pcidas64_board *thisboard = dev->board_ptr;
1429 struct pcidas64_private *devpriv = dev->private;
1431 unsigned long flags;
1433 spin_lock_irqsave(&dev->spinlock, flags);
1436 * bit should be set for 6025,
1437 * although docs say boards with <= 16 chans should be cleared XXX
1440 devpriv->adc_control1_bits |= ADC_QUEUE_CONFIG_BIT;
1441 writew(devpriv->adc_control1_bits,
1442 devpriv->main_iobase + ADC_CONTROL1_REG);
1444 /* 6402/16 manual says this register must be initialized to 0xff? */
1445 writew(0xff, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1447 bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
1448 if (thisboard->layout == LAYOUT_4020)
1449 bits |= INTERNAL_CLOCK_4020_BITS;
1450 devpriv->hw_config_bits |= bits;
1451 writew(devpriv->hw_config_bits,
1452 devpriv->main_iobase + HW_CONFIG_REG);
1454 writew(0, devpriv->main_iobase + DAQ_SYNC_REG);
1455 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1457 spin_unlock_irqrestore(&dev->spinlock, flags);
1459 /* set fifos to maximum size */
1460 devpriv->fifo_size_bits |= DAC_FIFO_BITS;
1461 set_ai_fifo_segment_length(dev,
1462 thisboard->ai_fifo->max_segment_length);
1464 devpriv->dac_control1_bits = DAC_OUTPUT_ENABLE_BIT;
1465 devpriv->intr_enable_bits =
1466 /* EN_DAC_INTR_SRC_BIT | DAC_INTR_QEMPTY_BITS | */
1467 EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1468 writew(devpriv->intr_enable_bits,
1469 devpriv->main_iobase + INTR_ENABLE_REG);
1471 disable_ai_pacing(dev);
1474 static int alloc_and_init_dma_members(struct comedi_device *dev)
1476 const struct pcidas64_board *thisboard = dev->board_ptr;
1477 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1478 struct pcidas64_private *devpriv = dev->private;
1481 /* allocate pci dma buffers */
1482 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1483 devpriv->ai_buffer[i] =
1484 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1485 &devpriv->ai_buffer_bus_addr[i]);
1486 if (!devpriv->ai_buffer[i])
1489 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1490 if (ao_cmd_is_supported(thisboard)) {
1491 devpriv->ao_buffer[i] =
1492 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1494 ao_buffer_bus_addr[i]);
1495 if (!devpriv->ao_buffer[i])
1499 /* allocate dma descriptors */
1500 devpriv->ai_dma_desc =
1501 pci_alloc_consistent(pcidev, sizeof(struct plx_dma_desc) *
1502 ai_dma_ring_count(thisboard),
1503 &devpriv->ai_dma_desc_bus_addr);
1504 if (!devpriv->ai_dma_desc)
1507 if (ao_cmd_is_supported(thisboard)) {
1508 devpriv->ao_dma_desc =
1509 pci_alloc_consistent(pcidev,
1510 sizeof(struct plx_dma_desc) *
1512 &devpriv->ao_dma_desc_bus_addr);
1513 if (!devpriv->ao_dma_desc)
1516 /* initialize dma descriptors */
1517 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1518 devpriv->ai_dma_desc[i].pci_start_addr =
1519 cpu_to_le32(devpriv->ai_buffer_bus_addr[i]);
1520 if (thisboard->layout == LAYOUT_4020)
1521 devpriv->ai_dma_desc[i].local_start_addr =
1522 cpu_to_le32(devpriv->local1_iobase +
1525 devpriv->ai_dma_desc[i].local_start_addr =
1526 cpu_to_le32(devpriv->local0_iobase +
1528 devpriv->ai_dma_desc[i].transfer_size = cpu_to_le32(0);
1529 devpriv->ai_dma_desc[i].next =
1530 cpu_to_le32((devpriv->ai_dma_desc_bus_addr +
1531 ((i + 1) % ai_dma_ring_count(thisboard)) *
1532 sizeof(devpriv->ai_dma_desc[0])) |
1533 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1534 PLX_XFER_LOCAL_TO_PCI);
1536 if (ao_cmd_is_supported(thisboard)) {
1537 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1538 devpriv->ao_dma_desc[i].pci_start_addr =
1539 cpu_to_le32(devpriv->ao_buffer_bus_addr[i]);
1540 devpriv->ao_dma_desc[i].local_start_addr =
1541 cpu_to_le32(devpriv->local0_iobase +
1543 devpriv->ao_dma_desc[i].transfer_size = cpu_to_le32(0);
1544 devpriv->ao_dma_desc[i].next =
1545 cpu_to_le32((devpriv->ao_dma_desc_bus_addr +
1546 ((i + 1) % (AO_DMA_RING_COUNT)) *
1547 sizeof(devpriv->ao_dma_desc[0])) |
1548 PLX_DESC_IN_PCI_BIT |
1549 PLX_INTR_TERM_COUNT);
1555 static void cb_pcidas64_free_dma(struct comedi_device *dev)
1557 const struct pcidas64_board *thisboard = dev->board_ptr;
1558 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1559 struct pcidas64_private *devpriv = dev->private;
1565 /* free pci dma buffers */
1566 for (i = 0; i < ai_dma_ring_count(thisboard); i++) {
1567 if (devpriv->ai_buffer[i])
1568 pci_free_consistent(pcidev,
1570 devpriv->ai_buffer[i],
1571 devpriv->ai_buffer_bus_addr[i]);
1573 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1574 if (devpriv->ao_buffer[i])
1575 pci_free_consistent(pcidev,
1577 devpriv->ao_buffer[i],
1578 devpriv->ao_buffer_bus_addr[i]);
1580 /* free dma descriptors */
1581 if (devpriv->ai_dma_desc)
1582 pci_free_consistent(pcidev,
1583 sizeof(struct plx_dma_desc) *
1584 ai_dma_ring_count(thisboard),
1585 devpriv->ai_dma_desc,
1586 devpriv->ai_dma_desc_bus_addr);
1587 if (devpriv->ao_dma_desc)
1588 pci_free_consistent(pcidev,
1589 sizeof(struct plx_dma_desc) *
1591 devpriv->ao_dma_desc,
1592 devpriv->ao_dma_desc_bus_addr);
1595 static inline void warn_external_queue(struct comedi_device *dev)
1597 dev_err(dev->class_dev,
1598 "AO command and AI external channel queue cannot be used simultaneously\n");
1599 dev_err(dev->class_dev,
1600 "Use internal AI channel queue (channels must be consecutive and use same range/aref)\n");
1604 * their i2c requires a huge delay on setting clock or data high for some reason
1606 static const int i2c_high_udelay = 1000;
1607 static const int i2c_low_udelay = 10;
1609 /* set i2c data line high or low */
1610 static void i2c_set_sda(struct comedi_device *dev, int state)
1612 struct pcidas64_private *devpriv = dev->private;
1613 static const int data_bit = CTL_EE_W;
1614 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
1618 /* set data line high */
1619 devpriv->plx_control_bits &= ~data_bit;
1620 writel(devpriv->plx_control_bits, plx_control_addr);
1621 udelay(i2c_high_udelay);
1622 } else { /* set data line low */
1624 devpriv->plx_control_bits |= data_bit;
1625 writel(devpriv->plx_control_bits, plx_control_addr);
1626 udelay(i2c_low_udelay);
1630 /* set i2c clock line high or low */
1631 static void i2c_set_scl(struct comedi_device *dev, int state)
1633 struct pcidas64_private *devpriv = dev->private;
1634 static const int clock_bit = CTL_USERO;
1635 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
1639 /* set clock line high */
1640 devpriv->plx_control_bits &= ~clock_bit;
1641 writel(devpriv->plx_control_bits, plx_control_addr);
1642 udelay(i2c_high_udelay);
1643 } else { /* set clock line low */
1645 devpriv->plx_control_bits |= clock_bit;
1646 writel(devpriv->plx_control_bits, plx_control_addr);
1647 udelay(i2c_low_udelay);
1651 static void i2c_write_byte(struct comedi_device *dev, uint8_t byte)
1654 unsigned int num_bits = 8;
1656 for (bit = 1 << (num_bits - 1); bit; bit >>= 1) {
1657 i2c_set_scl(dev, 0);
1659 i2c_set_sda(dev, 1);
1661 i2c_set_sda(dev, 0);
1662 i2c_set_scl(dev, 1);
1666 /* we can't really read the lines, so fake it */
1667 static int i2c_read_ack(struct comedi_device *dev)
1669 i2c_set_scl(dev, 0);
1670 i2c_set_sda(dev, 1);
1671 i2c_set_scl(dev, 1);
1673 return 0; /* return fake acknowledge bit */
1676 /* send start bit */
1677 static void i2c_start(struct comedi_device *dev)
1679 i2c_set_scl(dev, 1);
1680 i2c_set_sda(dev, 1);
1681 i2c_set_sda(dev, 0);
1685 static void i2c_stop(struct comedi_device *dev)
1687 i2c_set_scl(dev, 0);
1688 i2c_set_sda(dev, 0);
1689 i2c_set_scl(dev, 1);
1690 i2c_set_sda(dev, 1);
1693 static void i2c_write(struct comedi_device *dev, unsigned int address,
1694 const uint8_t *data, unsigned int length)
1696 struct pcidas64_private *devpriv = dev->private;
1699 static const int read_bit = 0x1;
1702 * XXX need mutex to prevent simultaneous attempts to access
1703 * eeprom and i2c bus
1706 /* make sure we dont send anything to eeprom */
1707 devpriv->plx_control_bits &= ~CTL_EE_CS;
1712 /* send address and write bit */
1713 bitstream = (address << 1) & ~read_bit;
1714 i2c_write_byte(dev, bitstream);
1716 /* get acknowledge */
1717 if (i2c_read_ack(dev) != 0) {
1718 dev_err(dev->class_dev, "failed: no acknowledge\n");
1722 /* write data bytes */
1723 for (i = 0; i < length; i++) {
1724 i2c_write_byte(dev, data[i]);
1725 if (i2c_read_ack(dev) != 0) {
1726 dev_err(dev->class_dev, "failed: no acknowledge\n");
1734 static int cb_pcidas64_ai_eoc(struct comedi_device *dev,
1735 struct comedi_subdevice *s,
1736 struct comedi_insn *insn,
1737 unsigned long context)
1739 const struct pcidas64_board *thisboard = dev->board_ptr;
1740 struct pcidas64_private *devpriv = dev->private;
1741 unsigned int status;
1743 status = readw(devpriv->main_iobase + HW_STATUS_REG);
1744 if (thisboard->layout == LAYOUT_4020) {
1745 status = readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG);
1749 if (pipe_full_bits(status))
1755 static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1756 struct comedi_insn *insn, unsigned int *data)
1758 const struct pcidas64_board *thisboard = dev->board_ptr;
1759 struct pcidas64_private *devpriv = dev->private;
1760 unsigned int bits = 0, n;
1761 unsigned int channel, range, aref;
1762 unsigned long flags;
1765 channel = CR_CHAN(insn->chanspec);
1766 range = CR_RANGE(insn->chanspec);
1767 aref = CR_AREF(insn->chanspec);
1769 /* disable card's analog input interrupt sources and pacing */
1770 /* 4020 generates dac done interrupts even though they are disabled */
1771 disable_ai_pacing(dev);
1773 spin_lock_irqsave(&dev->spinlock, flags);
1774 if (insn->chanspec & CR_ALT_FILTER)
1775 devpriv->adc_control1_bits |= ADC_DITHER_BIT;
1777 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
1778 writew(devpriv->adc_control1_bits,
1779 devpriv->main_iobase + ADC_CONTROL1_REG);
1780 spin_unlock_irqrestore(&dev->spinlock, flags);
1782 if (thisboard->layout != LAYOUT_4020) {
1783 /* use internal queue */
1784 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
1785 writew(devpriv->hw_config_bits,
1786 devpriv->main_iobase + HW_CONFIG_REG);
1788 /* ALT_SOURCE is internal calibration reference */
1789 if (insn->chanspec & CR_ALT_SOURCE) {
1790 unsigned int cal_en_bit;
1792 if (thisboard->layout == LAYOUT_60XX)
1793 cal_en_bit = CAL_EN_60XX_BIT;
1795 cal_en_bit = CAL_EN_64XX_BIT;
1797 * select internal reference source to connect
1801 adc_src_bits(devpriv->calibration_source),
1802 devpriv->main_iobase + CALIBRATION_REG);
1805 * make sure internal calibration source
1808 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1810 /* load internal queue */
1813 bits |= ai_range_bits_6xxx(dev, CR_RANGE(insn->chanspec));
1814 /* set single-ended / differential */
1815 bits |= se_diff_bit_6xxx(dev, aref == AREF_DIFF);
1816 if (aref == AREF_COMMON)
1817 bits |= ADC_COMMON_BIT;
1818 bits |= adc_chan_bits(channel);
1819 /* set stop channel */
1820 writew(adc_chan_bits(channel),
1821 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
1822 /* set start channel, and rest of settings */
1823 writew(bits, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
1825 uint8_t old_cal_range_bits = devpriv->i2c_cal_range_bits;
1827 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
1828 if (insn->chanspec & CR_ALT_SOURCE) {
1829 devpriv->i2c_cal_range_bits |=
1830 adc_src_4020_bits(devpriv->calibration_source);
1831 } else { /* select BNC inputs */
1832 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
1836 devpriv->i2c_cal_range_bits |= attenuate_bit(channel);
1838 devpriv->i2c_cal_range_bits &= ~attenuate_bit(channel);
1840 * update calibration/range i2c register only if necessary,
1841 * as it is very slow
1843 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
1844 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
1846 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
1851 * 4020 manual asks that sample interval register to be set
1852 * before writing to convert register.
1853 * Using somewhat arbitrary setting of 4 master clock ticks
1856 writew(0, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1857 writew(2, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
1860 for (n = 0; n < insn->n; n++) {
1861 /* clear adc buffer (inside loop for 4020 sake) */
1862 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
1864 /* trigger conversion, bits sent only matter for 4020 */
1865 writew(adc_convert_chan_4020_bits(CR_CHAN(insn->chanspec)),
1866 devpriv->main_iobase + ADC_CONVERT_REG);
1869 ret = comedi_timeout(dev, s, insn, cb_pcidas64_ai_eoc, 0);
1873 if (thisboard->layout == LAYOUT_4020)
1874 data[n] = readl(dev->mmio + ADC_FIFO_REG) & 0xffff;
1876 data[n] = readw(devpriv->main_iobase + PIPE1_READ_REG);
1882 static int ai_config_calibration_source(struct comedi_device *dev,
1885 const struct pcidas64_board *thisboard = dev->board_ptr;
1886 struct pcidas64_private *devpriv = dev->private;
1887 unsigned int source = data[1];
1888 int num_calibration_sources;
1890 if (thisboard->layout == LAYOUT_60XX)
1891 num_calibration_sources = 16;
1893 num_calibration_sources = 8;
1894 if (source >= num_calibration_sources) {
1895 dev_dbg(dev->class_dev, "invalid calibration source: %i\n",
1900 devpriv->calibration_source = source;
1905 static int ai_config_block_size(struct comedi_device *dev, unsigned int *data)
1907 const struct pcidas64_board *thisboard = dev->board_ptr;
1909 const struct hw_fifo_info *const fifo = thisboard->ai_fifo;
1910 unsigned int block_size, requested_block_size;
1913 requested_block_size = data[1];
1915 if (requested_block_size) {
1916 fifo_size = requested_block_size * fifo->num_segments /
1919 retval = set_ai_fifo_size(dev, fifo_size);
1924 block_size = ai_fifo_size(dev) / fifo->num_segments * bytes_in_sample;
1926 data[1] = block_size;
1931 static int ai_config_master_clock_4020(struct comedi_device *dev,
1934 struct pcidas64_private *devpriv = dev->private;
1935 unsigned int divisor = data[4];
1944 case COMEDI_EV_SCAN_BEGIN:
1945 devpriv->ext_clock.divisor = divisor;
1946 devpriv->ext_clock.chanspec = data[2];
1954 return retval ? retval : 5;
1957 /* XXX could add support for 60xx series */
1958 static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data)
1960 const struct pcidas64_board *thisboard = dev->board_ptr;
1962 switch (thisboard->layout) {
1964 return ai_config_master_clock_4020(dev, data);
1972 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1973 struct comedi_insn *insn, unsigned int *data)
1978 case INSN_CONFIG_ALT_SOURCE:
1979 return ai_config_calibration_source(dev, data);
1980 case INSN_CONFIG_BLOCK_SIZE:
1981 return ai_config_block_size(dev, data);
1982 case INSN_CONFIG_TIMER_1:
1983 return ai_config_master_clock(dev, data);
1991 * Gets nearest achievable timing given master clock speed, does not
1992 * take into account possible minimum/maximum divisor values. Used
1993 * by other timing checking functions.
1995 static unsigned int get_divisor(unsigned int ns, unsigned int flags)
1997 unsigned int divisor;
1999 switch (flags & CMDF_ROUND_MASK) {
2001 divisor = (ns + TIMER_BASE - 1) / TIMER_BASE;
2003 case CMDF_ROUND_DOWN:
2004 divisor = ns / TIMER_BASE;
2006 case CMDF_ROUND_NEAREST:
2008 divisor = (ns + TIMER_BASE / 2) / TIMER_BASE;
2015 * utility function that rounds desired timing to an achievable time, and
2016 * sets cmd members appropriately.
2017 * adc paces conversions from master clock by dividing by (x + 3) where x is
2020 static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
2022 const struct pcidas64_board *thisboard = dev->board_ptr;
2023 unsigned long long convert_divisor = 0;
2024 unsigned int scan_divisor;
2025 static const int min_convert_divisor = 3;
2026 static const int max_convert_divisor =
2027 max_counter_value + min_convert_divisor;
2028 static const int min_scan_divisor_4020 = 2;
2029 unsigned long long max_scan_divisor, min_scan_divisor;
2031 if (cmd->convert_src == TRIG_TIMER) {
2032 if (thisboard->layout == LAYOUT_4020) {
2033 cmd->convert_arg = 0;
2035 convert_divisor = get_divisor(cmd->convert_arg,
2037 if (convert_divisor > max_convert_divisor)
2038 convert_divisor = max_convert_divisor;
2039 if (convert_divisor < min_convert_divisor)
2040 convert_divisor = min_convert_divisor;
2041 cmd->convert_arg = convert_divisor * TIMER_BASE;
2043 } else if (cmd->convert_src == TRIG_NOW) {
2044 cmd->convert_arg = 0;
2047 if (cmd->scan_begin_src == TRIG_TIMER) {
2048 scan_divisor = get_divisor(cmd->scan_begin_arg, cmd->flags);
2049 if (cmd->convert_src == TRIG_TIMER) {
2050 min_scan_divisor = convert_divisor * cmd->chanlist_len;
2052 (convert_divisor * cmd->chanlist_len - 1) +
2055 min_scan_divisor = min_scan_divisor_4020;
2056 max_scan_divisor = max_counter_value + min_scan_divisor;
2058 if (scan_divisor > max_scan_divisor)
2059 scan_divisor = max_scan_divisor;
2060 if (scan_divisor < min_scan_divisor)
2061 scan_divisor = min_scan_divisor;
2062 cmd->scan_begin_arg = scan_divisor * TIMER_BASE;
2066 static int cb_pcidas64_ai_check_chanlist(struct comedi_device *dev,
2067 struct comedi_subdevice *s,
2068 struct comedi_cmd *cmd)
2070 const struct pcidas64_board *board = dev->board_ptr;
2071 unsigned int aref0 = CR_AREF(cmd->chanlist[0]);
2074 for (i = 1; i < cmd->chanlist_len; i++) {
2075 unsigned int aref = CR_AREF(cmd->chanlist[i]);
2077 if (aref != aref0) {
2078 dev_dbg(dev->class_dev,
2079 "all elements in chanlist must use the same analog reference\n");
2084 if (board->layout == LAYOUT_4020) {
2085 unsigned int chan0 = CR_CHAN(cmd->chanlist[0]);
2087 for (i = 1; i < cmd->chanlist_len; i++) {
2088 unsigned int chan = CR_CHAN(cmd->chanlist[i]);
2090 if (chan != (chan0 + i)) {
2091 dev_dbg(dev->class_dev,
2092 "chanlist must use consecutive channels\n");
2096 if (cmd->chanlist_len == 3) {
2097 dev_dbg(dev->class_dev,
2098 "chanlist cannot be 3 channels long, use 1, 2, or 4 channels\n");
2106 static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2107 struct comedi_cmd *cmd)
2109 const struct pcidas64_board *thisboard = dev->board_ptr;
2111 unsigned int tmp_arg, tmp_arg2;
2112 unsigned int triggers;
2114 /* Step 1 : check if triggers are trivially valid */
2116 err |= comedi_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
2118 triggers = TRIG_TIMER;
2119 if (thisboard->layout == LAYOUT_4020)
2120 triggers |= TRIG_OTHER;
2122 triggers |= TRIG_FOLLOW;
2123 err |= comedi_check_trigger_src(&cmd->scan_begin_src, triggers);
2125 triggers = TRIG_TIMER;
2126 if (thisboard->layout == LAYOUT_4020)
2127 triggers |= TRIG_NOW;
2129 triggers |= TRIG_EXT;
2130 err |= comedi_check_trigger_src(&cmd->convert_src, triggers);
2131 err |= comedi_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
2132 err |= comedi_check_trigger_src(&cmd->stop_src,
2133 TRIG_COUNT | TRIG_EXT | TRIG_NONE);
2138 /* Step 2a : make sure trigger sources are unique */
2140 err |= comedi_check_trigger_is_unique(cmd->start_src);
2141 err |= comedi_check_trigger_is_unique(cmd->scan_begin_src);
2142 err |= comedi_check_trigger_is_unique(cmd->convert_src);
2143 err |= comedi_check_trigger_is_unique(cmd->stop_src);
2145 /* Step 2b : and mutually compatible */
2147 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
2153 /* Step 3: check if arguments are trivially valid */
2155 switch (cmd->start_src) {
2157 err |= comedi_check_trigger_arg_is(&cmd->start_arg, 0);
2161 * start_arg is the CR_CHAN | CR_INVERT of the
2167 if (cmd->convert_src == TRIG_TIMER) {
2168 if (thisboard->layout == LAYOUT_4020) {
2169 err |= comedi_check_trigger_arg_is(&cmd->convert_arg,
2172 err |= comedi_check_trigger_arg_min(&cmd->convert_arg,
2176 * if scans are timed faster than conversion rate
2179 if (cmd->scan_begin_src == TRIG_TIMER) {
2180 err |= comedi_check_trigger_arg_min(
2181 &cmd->scan_begin_arg,
2188 err |= comedi_check_trigger_arg_min(&cmd->chanlist_len, 1);
2189 err |= comedi_check_trigger_arg_is(&cmd->scan_end_arg,
2192 switch (cmd->stop_src) {
2196 err |= comedi_check_trigger_arg_min(&cmd->stop_arg, 1);
2199 err |= comedi_check_trigger_arg_is(&cmd->stop_arg, 0);
2208 /* step 4: fix up any arguments */
2210 if (cmd->convert_src == TRIG_TIMER) {
2211 tmp_arg = cmd->convert_arg;
2212 tmp_arg2 = cmd->scan_begin_arg;
2213 check_adc_timing(dev, cmd);
2214 if (tmp_arg != cmd->convert_arg)
2216 if (tmp_arg2 != cmd->scan_begin_arg)
2223 /* Step 5: check channel list if it exists */
2224 if (cmd->chanlist && cmd->chanlist_len > 0)
2225 err |= cb_pcidas64_ai_check_chanlist(dev, s, cmd);
2233 static int use_hw_sample_counter(struct comedi_cmd *cmd)
2235 /* disable for now until I work out a race */
2238 if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value)
2244 static void setup_sample_counters(struct comedi_device *dev,
2245 struct comedi_cmd *cmd)
2247 struct pcidas64_private *devpriv = dev->private;
2249 /* load hardware conversion counter */
2250 if (use_hw_sample_counter(cmd)) {
2251 writew(cmd->stop_arg & 0xffff,
2252 devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2253 writew((cmd->stop_arg >> 16) & 0xff,
2254 devpriv->main_iobase + ADC_COUNT_UPPER_REG);
2256 writew(1, devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2260 static inline unsigned int dma_transfer_size(struct comedi_device *dev)
2262 const struct pcidas64_board *thisboard = dev->board_ptr;
2263 struct pcidas64_private *devpriv = dev->private;
2264 unsigned int num_samples;
2266 num_samples = devpriv->ai_fifo_segment_length *
2267 thisboard->ai_fifo->sample_packing_ratio;
2268 if (num_samples > DMA_BUFFER_SIZE / sizeof(uint16_t))
2269 num_samples = DMA_BUFFER_SIZE / sizeof(uint16_t);
2274 static uint32_t ai_convert_counter_6xxx(const struct comedi_device *dev,
2275 const struct comedi_cmd *cmd)
2277 /* supposed to load counter with desired divisor minus 3 */
2278 return cmd->convert_arg / TIMER_BASE - 3;
2281 static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev,
2282 struct comedi_cmd *cmd)
2286 /* figure out how long we need to delay at end of scan */
2287 switch (cmd->scan_begin_src) {
2289 count = (cmd->scan_begin_arg -
2290 (cmd->convert_arg * (cmd->chanlist_len - 1))) /
2294 count = cmd->convert_arg / TIMER_BASE;
2302 static uint32_t ai_convert_counter_4020(struct comedi_device *dev,
2303 struct comedi_cmd *cmd)
2305 struct pcidas64_private *devpriv = dev->private;
2306 unsigned int divisor;
2308 switch (cmd->scan_begin_src) {
2310 divisor = cmd->scan_begin_arg / TIMER_BASE;
2313 divisor = devpriv->ext_clock.divisor;
2315 default: /* should never happen */
2316 dev_err(dev->class_dev, "bug! failed to set ai pacing!\n");
2321 /* supposed to load counter with desired divisor minus 2 for 4020 */
2325 static void select_master_clock_4020(struct comedi_device *dev,
2326 const struct comedi_cmd *cmd)
2328 struct pcidas64_private *devpriv = dev->private;
2330 /* select internal/external master clock */
2331 devpriv->hw_config_bits &= ~MASTER_CLOCK_4020_MASK;
2332 if (cmd->scan_begin_src == TRIG_OTHER) {
2333 int chanspec = devpriv->ext_clock.chanspec;
2335 if (CR_CHAN(chanspec))
2336 devpriv->hw_config_bits |= BNC_CLOCK_4020_BITS;
2338 devpriv->hw_config_bits |= EXT_CLOCK_4020_BITS;
2340 devpriv->hw_config_bits |= INTERNAL_CLOCK_4020_BITS;
2342 writew(devpriv->hw_config_bits,
2343 devpriv->main_iobase + HW_CONFIG_REG);
2346 static void select_master_clock(struct comedi_device *dev,
2347 const struct comedi_cmd *cmd)
2349 const struct pcidas64_board *thisboard = dev->board_ptr;
2351 switch (thisboard->layout) {
2353 select_master_clock_4020(dev, cmd);
2360 static inline void dma_start_sync(struct comedi_device *dev,
2361 unsigned int channel)
2363 struct pcidas64_private *devpriv = dev->private;
2364 unsigned long flags;
2366 /* spinlock for plx dma control/status reg */
2367 spin_lock_irqsave(&dev->spinlock, flags);
2369 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2370 PLX_CLEAR_DMA_INTR_BIT,
2371 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2373 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2374 PLX_CLEAR_DMA_INTR_BIT,
2375 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2376 spin_unlock_irqrestore(&dev->spinlock, flags);
2379 static void set_ai_pacing(struct comedi_device *dev, struct comedi_cmd *cmd)
2381 const struct pcidas64_board *thisboard = dev->board_ptr;
2382 struct pcidas64_private *devpriv = dev->private;
2383 uint32_t convert_counter = 0, scan_counter = 0;
2385 check_adc_timing(dev, cmd);
2387 select_master_clock(dev, cmd);
2389 if (thisboard->layout == LAYOUT_4020) {
2390 convert_counter = ai_convert_counter_4020(dev, cmd);
2392 convert_counter = ai_convert_counter_6xxx(dev, cmd);
2393 scan_counter = ai_scan_counter_6xxx(dev, cmd);
2396 /* load lower 16 bits of convert interval */
2397 writew(convert_counter & 0xffff,
2398 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2399 /* load upper 8 bits of convert interval */
2400 writew((convert_counter >> 16) & 0xff,
2401 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2402 /* load lower 16 bits of scan delay */
2403 writew(scan_counter & 0xffff,
2404 devpriv->main_iobase + ADC_DELAY_INTERVAL_LOWER_REG);
2405 /* load upper 8 bits of scan delay */
2406 writew((scan_counter >> 16) & 0xff,
2407 devpriv->main_iobase + ADC_DELAY_INTERVAL_UPPER_REG);
2410 static int use_internal_queue_6xxx(const struct comedi_cmd *cmd)
2414 for (i = 0; i + 1 < cmd->chanlist_len; i++) {
2415 if (CR_CHAN(cmd->chanlist[i + 1]) !=
2416 CR_CHAN(cmd->chanlist[i]) + 1)
2418 if (CR_RANGE(cmd->chanlist[i + 1]) !=
2419 CR_RANGE(cmd->chanlist[i]))
2421 if (CR_AREF(cmd->chanlist[i + 1]) != CR_AREF(cmd->chanlist[i]))
2427 static int setup_channel_queue(struct comedi_device *dev,
2428 const struct comedi_cmd *cmd)
2430 const struct pcidas64_board *thisboard = dev->board_ptr;
2431 struct pcidas64_private *devpriv = dev->private;
2432 unsigned short bits;
2435 if (thisboard->layout != LAYOUT_4020) {
2436 if (use_internal_queue_6xxx(cmd)) {
2437 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
2438 writew(devpriv->hw_config_bits,
2439 devpriv->main_iobase + HW_CONFIG_REG);
2442 bits |= adc_chan_bits(CR_CHAN(cmd->chanlist[0]));
2444 bits |= ai_range_bits_6xxx(dev,
2445 CR_RANGE(cmd->chanlist[0]));
2446 /* set single-ended / differential */
2447 bits |= se_diff_bit_6xxx(dev,
2448 CR_AREF(cmd->chanlist[0]) ==
2450 if (CR_AREF(cmd->chanlist[0]) == AREF_COMMON)
2451 bits |= ADC_COMMON_BIT;
2452 /* set stop channel */
2453 writew(adc_chan_bits
2454 (CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])),
2455 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
2456 /* set start channel, and rest of settings */
2458 devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2460 /* use external queue */
2461 if (dev->write_subdev && dev->write_subdev->busy) {
2462 warn_external_queue(dev);
2465 devpriv->hw_config_bits |= EXT_QUEUE_BIT;
2466 writew(devpriv->hw_config_bits,
2467 devpriv->main_iobase + HW_CONFIG_REG);
2468 /* clear DAC buffer to prevent weird interactions */
2470 devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
2471 /* clear queue pointer */
2472 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2473 /* load external queue */
2474 for (i = 0; i < cmd->chanlist_len; i++) {
2477 bits |= adc_chan_bits(CR_CHAN(cmd->
2480 bits |= ai_range_bits_6xxx(dev,
2484 /* set single-ended / differential */
2485 bits |= se_diff_bit_6xxx(dev,
2489 if (CR_AREF(cmd->chanlist[i]) == AREF_COMMON)
2490 bits |= ADC_COMMON_BIT;
2491 /* mark end of queue */
2492 if (i == cmd->chanlist_len - 1)
2493 bits |= QUEUE_EOSCAN_BIT |
2496 devpriv->main_iobase +
2497 ADC_QUEUE_FIFO_REG);
2500 * doing a queue clear is not specified in board docs,
2501 * but required for reliable operation
2503 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2504 /* prime queue holding register */
2505 writew(0, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2508 unsigned short old_cal_range_bits = devpriv->i2c_cal_range_bits;
2510 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2511 /* select BNC inputs */
2512 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
2514 for (i = 0; i < cmd->chanlist_len; i++) {
2515 unsigned int channel = CR_CHAN(cmd->chanlist[i]);
2516 unsigned int range = CR_RANGE(cmd->chanlist[i]);
2519 devpriv->i2c_cal_range_bits |=
2520 attenuate_bit(channel);
2522 devpriv->i2c_cal_range_bits &=
2523 ~attenuate_bit(channel);
2526 * update calibration/range i2c register only if necessary,
2527 * as it is very slow
2529 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
2530 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
2532 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2539 static inline void load_first_dma_descriptor(struct comedi_device *dev,
2540 unsigned int dma_channel,
2541 unsigned int descriptor_bits)
2543 struct pcidas64_private *devpriv = dev->private;
2546 * The transfer size, pci address, and local address registers
2547 * are supposedly unused during chained dma,
2548 * but I have found that left over values from last operation
2549 * occasionally cause problems with transfer of first dma
2550 * block. Initializing them to zero seems to fix the problem.
2554 devpriv->plx9080_iobase + PLX_DMA1_TRANSFER_SIZE_REG);
2555 writel(0, devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG);
2557 devpriv->plx9080_iobase + PLX_DMA1_LOCAL_ADDRESS_REG);
2558 writel(descriptor_bits,
2559 devpriv->plx9080_iobase + PLX_DMA1_DESCRIPTOR_REG);
2562 devpriv->plx9080_iobase + PLX_DMA0_TRANSFER_SIZE_REG);
2563 writel(0, devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2565 devpriv->plx9080_iobase + PLX_DMA0_LOCAL_ADDRESS_REG);
2566 writel(descriptor_bits,
2567 devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2571 static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2573 const struct pcidas64_board *thisboard = dev->board_ptr;
2574 struct pcidas64_private *devpriv = dev->private;
2575 struct comedi_async *async = s->async;
2576 struct comedi_cmd *cmd = &async->cmd;
2579 unsigned long flags;
2582 disable_ai_pacing(dev);
2585 retval = setup_channel_queue(dev, cmd);
2589 /* make sure internal calibration source is turned off */
2590 writew(0, devpriv->main_iobase + CALIBRATION_REG);
2592 set_ai_pacing(dev, cmd);
2594 setup_sample_counters(dev, cmd);
2596 enable_ai_interrupts(dev, cmd);
2598 spin_lock_irqsave(&dev->spinlock, flags);
2599 /* set mode, allow conversions through software gate */
2600 devpriv->adc_control1_bits |= ADC_SW_GATE_BIT;
2601 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
2602 if (thisboard->layout != LAYOUT_4020) {
2603 devpriv->adc_control1_bits &= ~ADC_MODE_MASK;
2604 if (cmd->convert_src == TRIG_EXT)
2605 /* good old mode 13 */
2606 devpriv->adc_control1_bits |= adc_mode_bits(13);
2608 /* mode 8. What else could you need? */
2609 devpriv->adc_control1_bits |= adc_mode_bits(8);
2611 devpriv->adc_control1_bits &= ~CHANNEL_MODE_4020_MASK;
2612 if (cmd->chanlist_len == 4)
2613 devpriv->adc_control1_bits |= FOUR_CHANNEL_4020_BITS;
2614 else if (cmd->chanlist_len == 2)
2615 devpriv->adc_control1_bits |= TWO_CHANNEL_4020_BITS;
2616 devpriv->adc_control1_bits &= ~ADC_LO_CHANNEL_4020_MASK;
2617 devpriv->adc_control1_bits |=
2618 adc_lo_chan_4020_bits(CR_CHAN(cmd->chanlist[0]));
2619 devpriv->adc_control1_bits &= ~ADC_HI_CHANNEL_4020_MASK;
2620 devpriv->adc_control1_bits |=
2621 adc_hi_chan_4020_bits(CR_CHAN(cmd->chanlist
2622 [cmd->chanlist_len - 1]));
2624 writew(devpriv->adc_control1_bits,
2625 devpriv->main_iobase + ADC_CONTROL1_REG);
2626 spin_unlock_irqrestore(&dev->spinlock, flags);
2628 /* clear adc buffer */
2629 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
2631 if ((cmd->flags & CMDF_WAKE_EOS) == 0 ||
2632 thisboard->layout == LAYOUT_4020) {
2633 devpriv->ai_dma_index = 0;
2635 /* set dma transfer size */
2636 for (i = 0; i < ai_dma_ring_count(thisboard); i++)
2637 devpriv->ai_dma_desc[i].transfer_size =
2638 cpu_to_le32(dma_transfer_size(dev) *
2641 /* give location of first dma descriptor */
2642 load_first_dma_descriptor(dev, 1,
2643 devpriv->ai_dma_desc_bus_addr |
2644 PLX_DESC_IN_PCI_BIT |
2645 PLX_INTR_TERM_COUNT |
2646 PLX_XFER_LOCAL_TO_PCI);
2648 dma_start_sync(dev, 1);
2651 if (thisboard->layout == LAYOUT_4020) {
2652 /* set source for external triggers */
2654 if (cmd->start_src == TRIG_EXT && CR_CHAN(cmd->start_arg))
2655 bits |= EXT_START_TRIG_BNC_BIT;
2656 if (cmd->stop_src == TRIG_EXT && CR_CHAN(cmd->stop_arg))
2657 bits |= EXT_STOP_TRIG_BNC_BIT;
2658 writew(bits, devpriv->main_iobase + DAQ_ATRIG_LOW_4020_REG);
2661 spin_lock_irqsave(&dev->spinlock, flags);
2663 /* enable pacing, triggering, etc */
2664 bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
2665 if (cmd->flags & CMDF_WAKE_EOS)
2666 bits |= ADC_DMA_DISABLE_BIT;
2667 /* set start trigger */
2668 if (cmd->start_src == TRIG_EXT) {
2669 bits |= ADC_START_TRIG_EXT_BITS;
2670 if (cmd->start_arg & CR_INVERT)
2671 bits |= ADC_START_TRIG_FALLING_BIT;
2672 } else if (cmd->start_src == TRIG_NOW) {
2673 bits |= ADC_START_TRIG_SOFT_BITS;
2675 if (use_hw_sample_counter(cmd))
2676 bits |= ADC_SAMPLE_COUNTER_EN_BIT;
2677 writew(bits, devpriv->main_iobase + ADC_CONTROL0_REG);
2679 devpriv->ai_cmd_running = 1;
2681 spin_unlock_irqrestore(&dev->spinlock, flags);
2683 /* start acquisition */
2684 if (cmd->start_src == TRIG_NOW)
2685 writew(0, devpriv->main_iobase + ADC_START_REG);
2690 /* read num_samples from 16 bit wide ai fifo */
2691 static void pio_drain_ai_fifo_16(struct comedi_device *dev)
2693 struct pcidas64_private *devpriv = dev->private;
2694 struct comedi_subdevice *s = dev->read_subdev;
2696 uint16_t prepost_bits;
2697 int read_segment, read_index, write_segment, write_index;
2701 /* get least significant 15 bits */
2702 read_index = readw(devpriv->main_iobase + ADC_READ_PNTR_REG) &
2704 write_index = readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) &
2707 * Get most significant bits (grey code).
2708 * Different boards use different code so use a scheme
2709 * that doesn't depend on encoding. This read must
2710 * occur after reading least significant 15 bits to avoid race
2711 * with fifo switching to next segment.
2713 prepost_bits = readw(devpriv->main_iobase + PREPOST_REG);
2716 * if read and write pointers are not on the same fifo segment,
2717 * read to the end of the read segment
2719 read_segment = adc_upper_read_ptr_code(prepost_bits);
2720 write_segment = adc_upper_write_ptr_code(prepost_bits);
2722 if (read_segment != write_segment)
2724 devpriv->ai_fifo_segment_length - read_index;
2726 num_samples = write_index - read_index;
2727 if (num_samples < 0) {
2728 dev_err(dev->class_dev,
2729 "cb_pcidas64: bug! num_samples < 0\n");
2733 num_samples = comedi_nsamples_left(s, num_samples);
2734 if (num_samples == 0)
2737 for (i = 0; i < num_samples; i++) {
2740 val = readw(devpriv->main_iobase + ADC_FIFO_REG);
2741 comedi_buf_write_samples(s, &val, 1);
2744 } while (read_segment != write_segment);
2748 * Read from 32 bit wide ai fifo of 4020 - deal with insane grey coding of
2749 * pointers. The pci-4020 hardware only supports dma transfers (it only
2750 * supports the use of pio for draining the last remaining points from the
2751 * fifo when a data acquisition operation has completed).
2753 static void pio_drain_ai_fifo_32(struct comedi_device *dev)
2755 struct pcidas64_private *devpriv = dev->private;
2756 struct comedi_subdevice *s = dev->read_subdev;
2757 unsigned int nsamples;
2761 readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2763 readw(devpriv->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2765 nsamples = comedi_nsamples_left(s, 100000);
2766 for (i = 0; read_code != write_code && i < nsamples;) {
2769 fifo_data = readl(dev->mmio + ADC_FIFO_REG);
2770 val = fifo_data & 0xffff;
2771 comedi_buf_write_samples(s, &val, 1);
2774 val = (fifo_data >> 16) & 0xffff;
2775 comedi_buf_write_samples(s, &val, 1);
2778 read_code = readw(devpriv->main_iobase + ADC_READ_PNTR_REG) &
2784 static void pio_drain_ai_fifo(struct comedi_device *dev)
2786 const struct pcidas64_board *thisboard = dev->board_ptr;
2788 if (thisboard->layout == LAYOUT_4020)
2789 pio_drain_ai_fifo_32(dev);
2791 pio_drain_ai_fifo_16(dev);
2794 static void drain_dma_buffers(struct comedi_device *dev, unsigned int channel)
2796 const struct pcidas64_board *thisboard = dev->board_ptr;
2797 struct pcidas64_private *devpriv = dev->private;
2798 struct comedi_subdevice *s = dev->read_subdev;
2799 uint32_t next_transfer_addr;
2801 int num_samples = 0;
2802 void __iomem *pci_addr_reg;
2806 devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG;
2809 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2811 /* loop until we have read all the full buffers */
2812 for (j = 0, next_transfer_addr = readl(pci_addr_reg);
2813 (next_transfer_addr <
2814 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index] ||
2815 next_transfer_addr >=
2816 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index] +
2817 DMA_BUFFER_SIZE) && j < ai_dma_ring_count(thisboard); j++) {
2818 /* transfer data from dma buffer to comedi buffer */
2819 num_samples = comedi_nsamples_left(s, dma_transfer_size(dev));
2820 comedi_buf_write_samples(s,
2821 devpriv->ai_buffer[devpriv->ai_dma_index],
2823 devpriv->ai_dma_index = (devpriv->ai_dma_index + 1) %
2824 ai_dma_ring_count(thisboard);
2827 * XXX check for dma ring buffer overrun
2828 * (use end-of-chain bit to mark last unused buffer)
2832 static void handle_ai_interrupt(struct comedi_device *dev,
2833 unsigned short status,
2834 unsigned int plx_status)
2836 const struct pcidas64_board *thisboard = dev->board_ptr;
2837 struct pcidas64_private *devpriv = dev->private;
2838 struct comedi_subdevice *s = dev->read_subdev;
2839 struct comedi_async *async = s->async;
2840 struct comedi_cmd *cmd = &async->cmd;
2841 uint8_t dma1_status;
2842 unsigned long flags;
2844 /* check for fifo overrun */
2845 if (status & ADC_OVERRUN_BIT) {
2846 dev_err(dev->class_dev, "fifo overrun\n");
2847 async->events |= COMEDI_CB_ERROR;
2849 /* spin lock makes sure no one else changes plx dma control reg */
2850 spin_lock_irqsave(&dev->spinlock, flags);
2851 dma1_status = readb(devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2852 if (plx_status & ICS_DMA1_A) { /* dma chan 1 interrupt */
2853 writeb((dma1_status & PLX_DMA_EN_BIT) | PLX_CLEAR_DMA_INTR_BIT,
2854 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2856 if (dma1_status & PLX_DMA_EN_BIT)
2857 drain_dma_buffers(dev, 1);
2859 spin_unlock_irqrestore(&dev->spinlock, flags);
2861 /* drain fifo with pio */
2862 if ((status & ADC_DONE_BIT) ||
2863 ((cmd->flags & CMDF_WAKE_EOS) &&
2864 (status & ADC_INTR_PENDING_BIT) &&
2865 (thisboard->layout != LAYOUT_4020))) {
2866 spin_lock_irqsave(&dev->spinlock, flags);
2867 if (devpriv->ai_cmd_running) {
2868 spin_unlock_irqrestore(&dev->spinlock, flags);
2869 pio_drain_ai_fifo(dev);
2871 spin_unlock_irqrestore(&dev->spinlock, flags);
2874 /* if we are have all the data, then quit */
2875 if ((cmd->stop_src == TRIG_COUNT &&
2876 async->scans_done >= cmd->stop_arg) ||
2877 (cmd->stop_src == TRIG_EXT && (status & ADC_STOP_BIT)))
2878 async->events |= COMEDI_CB_EOA;
2880 comedi_handle_events(dev, s);
2883 static inline unsigned int prev_ao_dma_index(struct comedi_device *dev)
2885 struct pcidas64_private *devpriv = dev->private;
2886 unsigned int buffer_index;
2888 if (devpriv->ao_dma_index == 0)
2889 buffer_index = AO_DMA_RING_COUNT - 1;
2891 buffer_index = devpriv->ao_dma_index - 1;
2892 return buffer_index;
2895 static int last_ao_dma_load_completed(struct comedi_device *dev)
2897 struct pcidas64_private *devpriv = dev->private;
2898 unsigned int buffer_index;
2899 unsigned int transfer_address;
2900 unsigned short dma_status;
2902 buffer_index = prev_ao_dma_index(dev);
2903 dma_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2904 if ((dma_status & PLX_DMA_DONE_BIT) == 0)
2908 readl(devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2909 if (transfer_address != devpriv->ao_buffer_bus_addr[buffer_index])
2915 static inline int ao_dma_needs_restart(struct comedi_device *dev,
2916 unsigned short dma_status)
2918 if ((dma_status & PLX_DMA_DONE_BIT) == 0 ||
2919 (dma_status & PLX_DMA_EN_BIT) == 0)
2921 if (last_ao_dma_load_completed(dev))
2927 static void restart_ao_dma(struct comedi_device *dev)
2929 struct pcidas64_private *devpriv = dev->private;
2930 unsigned int dma_desc_bits;
2933 readl(devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2934 dma_desc_bits &= ~PLX_END_OF_CHAIN_BIT;
2935 load_first_dma_descriptor(dev, 0, dma_desc_bits);
2937 dma_start_sync(dev, 0);
2940 static unsigned int cb_pcidas64_ao_fill_buffer(struct comedi_device *dev,
2941 struct comedi_subdevice *s,
2942 unsigned short *dest,
2943 unsigned int max_bytes)
2945 unsigned int nsamples = comedi_bytes_to_samples(s, max_bytes);
2946 unsigned int actual_bytes;
2948 nsamples = comedi_nsamples_left(s, nsamples);
2949 actual_bytes = comedi_buf_read_samples(s, dest, nsamples);
2951 return comedi_bytes_to_samples(s, actual_bytes);
2954 static unsigned int load_ao_dma_buffer(struct comedi_device *dev,
2955 const struct comedi_cmd *cmd)
2957 struct pcidas64_private *devpriv = dev->private;
2958 struct comedi_subdevice *s = dev->write_subdev;
2959 unsigned int buffer_index = devpriv->ao_dma_index;
2960 unsigned int prev_buffer_index = prev_ao_dma_index(dev);
2961 unsigned int nsamples;
2962 unsigned int nbytes;
2963 unsigned int next_bits;
2965 nsamples = cb_pcidas64_ao_fill_buffer(dev, s,
2966 devpriv->ao_buffer[buffer_index],
2971 nbytes = comedi_samples_to_bytes(s, nsamples);
2972 devpriv->ao_dma_desc[buffer_index].transfer_size = cpu_to_le32(nbytes);
2973 /* set end of chain bit so we catch underruns */
2974 next_bits = le32_to_cpu(devpriv->ao_dma_desc[buffer_index].next);
2975 next_bits |= PLX_END_OF_CHAIN_BIT;
2976 devpriv->ao_dma_desc[buffer_index].next = cpu_to_le32(next_bits);
2978 * clear end of chain bit on previous buffer now that we have set it
2979 * for the last buffer
2981 next_bits = le32_to_cpu(devpriv->ao_dma_desc[prev_buffer_index].next);
2982 next_bits &= ~PLX_END_OF_CHAIN_BIT;
2983 devpriv->ao_dma_desc[prev_buffer_index].next = cpu_to_le32(next_bits);
2985 devpriv->ao_dma_index = (buffer_index + 1) % AO_DMA_RING_COUNT;
2990 static void load_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
2992 struct pcidas64_private *devpriv = dev->private;
2993 unsigned int num_bytes;
2994 unsigned int next_transfer_addr;
2995 void __iomem *pci_addr_reg =
2996 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2997 unsigned int buffer_index;
3000 buffer_index = devpriv->ao_dma_index;
3001 /* don't overwrite data that hasn't been transferred yet */
3002 next_transfer_addr = readl(pci_addr_reg);
3003 if (next_transfer_addr >=
3004 devpriv->ao_buffer_bus_addr[buffer_index] &&
3005 next_transfer_addr <
3006 devpriv->ao_buffer_bus_addr[buffer_index] +
3009 num_bytes = load_ao_dma_buffer(dev, cmd);
3010 } while (num_bytes >= DMA_BUFFER_SIZE);
3013 static void handle_ao_interrupt(struct comedi_device *dev,
3014 unsigned short status, unsigned int plx_status)
3016 struct pcidas64_private *devpriv = dev->private;
3017 struct comedi_subdevice *s = dev->write_subdev;
3018 struct comedi_async *async;
3019 struct comedi_cmd *cmd;
3020 uint8_t dma0_status;
3021 unsigned long flags;
3023 /* board might not support ao, in which case write_subdev is NULL */
3029 /* spin lock makes sure no one else changes plx dma control reg */
3030 spin_lock_irqsave(&dev->spinlock, flags);
3031 dma0_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3032 if (plx_status & ICS_DMA0_A) { /* dma chan 0 interrupt */
3033 if ((dma0_status & PLX_DMA_EN_BIT) &&
3034 !(dma0_status & PLX_DMA_DONE_BIT))
3035 writeb(PLX_DMA_EN_BIT | PLX_CLEAR_DMA_INTR_BIT,
3036 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3038 writeb(PLX_CLEAR_DMA_INTR_BIT,
3039 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3040 spin_unlock_irqrestore(&dev->spinlock, flags);
3041 if (dma0_status & PLX_DMA_EN_BIT) {
3042 load_ao_dma(dev, cmd);
3043 /* try to recover from dma end-of-chain event */
3044 if (ao_dma_needs_restart(dev, dma0_status))
3045 restart_ao_dma(dev);
3048 spin_unlock_irqrestore(&dev->spinlock, flags);
3051 if ((status & DAC_DONE_BIT)) {
3052 if ((cmd->stop_src == TRIG_COUNT &&
3053 async->scans_done >= cmd->stop_arg) ||
3054 last_ao_dma_load_completed(dev))
3055 async->events |= COMEDI_CB_EOA;
3057 async->events |= COMEDI_CB_ERROR;
3059 comedi_handle_events(dev, s);
3062 static irqreturn_t handle_interrupt(int irq, void *d)
3064 struct comedi_device *dev = d;
3065 struct pcidas64_private *devpriv = dev->private;
3066 unsigned short status;
3067 uint32_t plx_status;
3070 plx_status = readl(devpriv->plx9080_iobase + PLX_INTRCS_REG);
3071 status = readw(devpriv->main_iobase + HW_STATUS_REG);
3074 * an interrupt before all the postconfig stuff gets done could
3075 * cause a NULL dereference if we continue through the
3081 handle_ai_interrupt(dev, status, plx_status);
3082 handle_ao_interrupt(dev, status, plx_status);
3084 /* clear possible plx9080 interrupt sources */
3085 if (plx_status & ICS_LDIA) { /* clear local doorbell interrupt */
3086 plx_bits = readl(devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3087 writel(plx_bits, devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3093 static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3095 struct pcidas64_private *devpriv = dev->private;
3096 unsigned long flags;
3098 spin_lock_irqsave(&dev->spinlock, flags);
3099 if (devpriv->ai_cmd_running == 0) {
3100 spin_unlock_irqrestore(&dev->spinlock, flags);
3103 devpriv->ai_cmd_running = 0;
3104 spin_unlock_irqrestore(&dev->spinlock, flags);
3106 disable_ai_pacing(dev);
3113 static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3114 struct comedi_insn *insn, unsigned int *data)
3116 const struct pcidas64_board *thisboard = dev->board_ptr;
3117 struct pcidas64_private *devpriv = dev->private;
3118 int chan = CR_CHAN(insn->chanspec);
3119 int range = CR_RANGE(insn->chanspec);
3121 /* do some initializing */
3122 writew(0, devpriv->main_iobase + DAC_CONTROL0_REG);
3125 set_dac_range_bits(dev, &devpriv->dac_control1_bits, chan, range);
3126 writew(devpriv->dac_control1_bits,
3127 devpriv->main_iobase + DAC_CONTROL1_REG);
3129 /* write to channel */
3130 if (thisboard->layout == LAYOUT_4020) {
3131 writew(data[0] & 0xff,
3132 devpriv->main_iobase + dac_lsb_4020_reg(chan));
3133 writew((data[0] >> 8) & 0xf,
3134 devpriv->main_iobase + dac_msb_4020_reg(chan));
3136 writew(data[0], devpriv->main_iobase + dac_convert_reg(chan));
3139 /* remember output value */
3140 s->readback[chan] = data[0];
3145 static void set_dac_control0_reg(struct comedi_device *dev,
3146 const struct comedi_cmd *cmd)
3148 struct pcidas64_private *devpriv = dev->private;
3149 unsigned int bits = DAC_ENABLE_BIT | WAVEFORM_GATE_LEVEL_BIT |
3150 WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_BIT;
3152 if (cmd->start_src == TRIG_EXT) {
3153 bits |= WAVEFORM_TRIG_EXT_BITS;
3154 if (cmd->start_arg & CR_INVERT)
3155 bits |= WAVEFORM_TRIG_FALLING_BIT;
3157 bits |= WAVEFORM_TRIG_SOFT_BITS;
3159 if (cmd->scan_begin_src == TRIG_EXT) {
3160 bits |= DAC_EXT_UPDATE_ENABLE_BIT;
3161 if (cmd->scan_begin_arg & CR_INVERT)
3162 bits |= DAC_EXT_UPDATE_FALLING_BIT;
3164 writew(bits, devpriv->main_iobase + DAC_CONTROL0_REG);
3167 static void set_dac_control1_reg(struct comedi_device *dev,
3168 const struct comedi_cmd *cmd)
3170 struct pcidas64_private *devpriv = dev->private;
3173 for (i = 0; i < cmd->chanlist_len; i++) {
3176 channel = CR_CHAN(cmd->chanlist[i]);
3177 range = CR_RANGE(cmd->chanlist[i]);
3178 set_dac_range_bits(dev, &devpriv->dac_control1_bits, channel,
3181 devpriv->dac_control1_bits |= DAC_SW_GATE_BIT;
3182 writew(devpriv->dac_control1_bits,
3183 devpriv->main_iobase + DAC_CONTROL1_REG);
3186 static void set_dac_select_reg(struct comedi_device *dev,
3187 const struct comedi_cmd *cmd)
3189 struct pcidas64_private *devpriv = dev->private;
3191 unsigned int first_channel, last_channel;
3193 first_channel = CR_CHAN(cmd->chanlist[0]);
3194 last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
3195 if (last_channel < first_channel)
3196 dev_err(dev->class_dev,
3197 "bug! last ao channel < first ao channel\n");
3199 bits = (first_channel & 0x7) | (last_channel & 0x7) << 3;
3201 writew(bits, devpriv->main_iobase + DAC_SELECT_REG);
3204 static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags)
3206 return get_divisor(ns, flags) - 2;
3209 static void set_dac_interval_regs(struct comedi_device *dev,
3210 const struct comedi_cmd *cmd)
3212 struct pcidas64_private *devpriv = dev->private;
3213 unsigned int divisor;
3215 if (cmd->scan_begin_src != TRIG_TIMER)
3218 divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags);
3219 if (divisor > max_counter_value) {
3220 dev_err(dev->class_dev, "bug! ao divisor too big\n");
3221 divisor = max_counter_value;
3223 writew(divisor & 0xffff,
3224 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_LOWER_REG);
3225 writew((divisor >> 16) & 0xff,
3226 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_UPPER_REG);
3229 static int prep_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3231 struct pcidas64_private *devpriv = dev->private;
3232 struct comedi_subdevice *s = dev->write_subdev;
3233 unsigned int nsamples;
3234 unsigned int nbytes;
3238 * clear queue pointer too, since external queue has
3239 * weird interactions with ao fifo
3241 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
3242 writew(0, devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
3244 nsamples = cb_pcidas64_ao_fill_buffer(dev, s,
3245 devpriv->ao_bounce_buffer,
3250 for (i = 0; i < nsamples; i++) {
3251 writew(devpriv->ao_bounce_buffer[i],
3252 devpriv->main_iobase + DAC_FIFO_REG);
3255 if (cmd->stop_src == TRIG_COUNT &&
3256 s->async->scans_done >= cmd->stop_arg)
3259 nbytes = load_ao_dma_buffer(dev, cmd);
3262 load_ao_dma(dev, cmd);
3264 dma_start_sync(dev, 0);
3269 static inline int external_ai_queue_in_use(struct comedi_device *dev,
3270 struct comedi_subdevice *s,
3271 struct comedi_cmd *cmd)
3273 const struct pcidas64_board *thisboard = dev->board_ptr;
3277 if (thisboard->layout == LAYOUT_4020)
3279 else if (use_internal_queue_6xxx(cmd))
3284 static int ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3285 unsigned int trig_num)
3287 struct pcidas64_private *devpriv = dev->private;
3288 struct comedi_cmd *cmd = &s->async->cmd;
3291 if (trig_num != cmd->start_arg)
3294 retval = prep_ao_dma(dev, cmd);
3298 set_dac_control0_reg(dev, cmd);
3300 if (cmd->start_src == TRIG_INT)
3301 writew(0, devpriv->main_iobase + DAC_START_REG);
3303 s->async->inttrig = NULL;
3308 static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3310 struct pcidas64_private *devpriv = dev->private;
3311 struct comedi_cmd *cmd = &s->async->cmd;
3313 if (external_ai_queue_in_use(dev, s, cmd)) {
3314 warn_external_queue(dev);
3317 /* disable analog output system during setup */
3318 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3320 devpriv->ao_dma_index = 0;
3322 set_dac_select_reg(dev, cmd);
3323 set_dac_interval_regs(dev, cmd);
3324 load_first_dma_descriptor(dev, 0, devpriv->ao_dma_desc_bus_addr |
3325 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3327 set_dac_control1_reg(dev, cmd);
3328 s->async->inttrig = ao_inttrig;
3333 static int cb_pcidas64_ao_check_chanlist(struct comedi_device *dev,
3334 struct comedi_subdevice *s,
3335 struct comedi_cmd *cmd)
3337 unsigned int chan0 = CR_CHAN(cmd->chanlist[0]);
3340 for (i = 1; i < cmd->chanlist_len; i++) {
3341 unsigned int chan = CR_CHAN(cmd->chanlist[i]);
3343 if (chan != (chan0 + i)) {
3344 dev_dbg(dev->class_dev,
3345 "chanlist must use consecutive channels\n");
3353 static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3354 struct comedi_cmd *cmd)
3356 const struct pcidas64_board *thisboard = dev->board_ptr;
3358 unsigned int tmp_arg;
3360 /* Step 1 : check if triggers are trivially valid */
3362 err |= comedi_check_trigger_src(&cmd->start_src, TRIG_INT | TRIG_EXT);
3363 err |= comedi_check_trigger_src(&cmd->scan_begin_src,
3364 TRIG_TIMER | TRIG_EXT);
3365 err |= comedi_check_trigger_src(&cmd->convert_src, TRIG_NOW);
3366 err |= comedi_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
3367 err |= comedi_check_trigger_src(&cmd->stop_src, TRIG_NONE);
3372 /* Step 2a : make sure trigger sources are unique */
3374 err |= comedi_check_trigger_is_unique(cmd->start_src);
3375 err |= comedi_check_trigger_is_unique(cmd->scan_begin_src);
3377 /* Step 2b : and mutually compatible */
3379 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
3381 if (cmd->stop_src != TRIG_COUNT &&
3382 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
3388 /* Step 3: check if arguments are trivially valid */
3390 err |= comedi_check_trigger_arg_is(&cmd->start_arg, 0);
3392 if (cmd->scan_begin_src == TRIG_TIMER) {
3393 err |= comedi_check_trigger_arg_min(&cmd->scan_begin_arg,
3394 thisboard->ao_scan_speed);
3395 if (get_ao_divisor(cmd->scan_begin_arg, cmd->flags) >
3396 max_counter_value) {
3397 cmd->scan_begin_arg = (max_counter_value + 2) *
3403 err |= comedi_check_trigger_arg_min(&cmd->chanlist_len, 1);
3404 err |= comedi_check_trigger_arg_is(&cmd->scan_end_arg,
3410 /* step 4: fix up any arguments */
3412 if (cmd->scan_begin_src == TRIG_TIMER) {
3413 tmp_arg = cmd->scan_begin_arg;
3414 cmd->scan_begin_arg = get_divisor(cmd->scan_begin_arg,
3415 cmd->flags) * TIMER_BASE;
3416 if (tmp_arg != cmd->scan_begin_arg)
3423 /* Step 5: check channel list if it exists */
3424 if (cmd->chanlist && cmd->chanlist_len > 0)
3425 err |= cb_pcidas64_ao_check_chanlist(dev, s, cmd);
3433 static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3435 struct pcidas64_private *devpriv = dev->private;
3437 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3442 static int dio_callback_4020(struct comedi_device *dev,
3443 int dir, int port, int data, unsigned long iobase)
3445 struct pcidas64_private *devpriv = dev->private;
3448 writew(data, devpriv->main_iobase + iobase + 2 * port);
3451 return readw(devpriv->main_iobase + iobase + 2 * port);
3454 static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3455 struct comedi_insn *insn, unsigned int *data)
3459 bits = readb(dev->mmio + DI_REG);
3467 static int do_wbits(struct comedi_device *dev,
3468 struct comedi_subdevice *s,
3469 struct comedi_insn *insn,
3472 if (comedi_dio_update_state(s, data))
3473 writeb(s->state, dev->mmio + DO_REG);
3480 static int dio_60xx_config_insn(struct comedi_device *dev,
3481 struct comedi_subdevice *s,
3482 struct comedi_insn *insn,
3487 ret = comedi_dio_insn_config(dev, s, insn, data, 0);
3491 writeb(s->io_bits, dev->mmio + DIO_DIRECTION_60XX_REG);
3496 static int dio_60xx_wbits(struct comedi_device *dev,
3497 struct comedi_subdevice *s,
3498 struct comedi_insn *insn,
3501 if (comedi_dio_update_state(s, data))
3502 writeb(s->state, dev->mmio + DIO_DATA_60XX_REG);
3504 data[1] = readb(dev->mmio + DIO_DATA_60XX_REG);
3510 * pci-6025 8800 caldac:
3511 * address 0 == dac channel 0 offset
3512 * address 1 == dac channel 0 gain
3513 * address 2 == dac channel 1 offset
3514 * address 3 == dac channel 1 gain
3515 * address 4 == fine adc offset
3516 * address 5 == coarse adc offset
3517 * address 6 == coarse adc gain
3518 * address 7 == fine adc gain
3521 * pci-6402/16 uses all 8 channels for dac:
3522 * address 0 == dac channel 0 fine gain
3523 * address 1 == dac channel 0 coarse gain
3524 * address 2 == dac channel 0 coarse offset
3525 * address 3 == dac channel 1 coarse offset
3526 * address 4 == dac channel 1 fine gain
3527 * address 5 == dac channel 1 coarse gain
3528 * address 6 == dac channel 0 fine offset
3529 * address 7 == dac channel 1 fine offset
3532 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
3535 struct pcidas64_private *devpriv = dev->private;
3536 static const int num_caldac_channels = 8;
3537 static const int bitstream_length = 11;
3538 unsigned int bitstream = ((address & 0x7) << 8) | value;
3539 unsigned int bit, register_bits;
3540 static const int caldac_8800_udelay = 1;
3542 if (address >= num_caldac_channels) {
3543 dev_err(dev->class_dev, "illegal caldac channel\n");
3546 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3548 if (bitstream & bit)
3549 register_bits |= SERIAL_DATA_IN_BIT;
3550 udelay(caldac_8800_udelay);
3551 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3552 register_bits |= SERIAL_CLOCK_BIT;
3553 udelay(caldac_8800_udelay);
3554 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3556 udelay(caldac_8800_udelay);
3557 writew(SELECT_8800_BIT, devpriv->main_iobase + CALIBRATION_REG);
3558 udelay(caldac_8800_udelay);
3559 writew(0, devpriv->main_iobase + CALIBRATION_REG);
3560 udelay(caldac_8800_udelay);
3565 static int caldac_i2c_write(struct comedi_device *dev,
3566 unsigned int caldac_channel, unsigned int value)
3568 uint8_t serial_bytes[3];
3571 /* manual has gain and offset bits switched */
3578 NOT_CLEAR_REGISTERS = 0x20,
3581 switch (caldac_channel) {
3582 case 0: /* chan 0 offset */
3583 i2c_addr = CALDAC0_I2C_ADDR;
3584 serial_bytes[0] = OFFSET_0_2;
3586 case 1: /* chan 1 offset */
3587 i2c_addr = CALDAC0_I2C_ADDR;
3588 serial_bytes[0] = OFFSET_1_3;
3590 case 2: /* chan 2 offset */
3591 i2c_addr = CALDAC1_I2C_ADDR;
3592 serial_bytes[0] = OFFSET_0_2;
3594 case 3: /* chan 3 offset */
3595 i2c_addr = CALDAC1_I2C_ADDR;
3596 serial_bytes[0] = OFFSET_1_3;
3598 case 4: /* chan 0 gain */
3599 i2c_addr = CALDAC0_I2C_ADDR;
3600 serial_bytes[0] = GAIN_0_2;
3602 case 5: /* chan 1 gain */
3603 i2c_addr = CALDAC0_I2C_ADDR;
3604 serial_bytes[0] = GAIN_1_3;
3606 case 6: /* chan 2 gain */
3607 i2c_addr = CALDAC1_I2C_ADDR;
3608 serial_bytes[0] = GAIN_0_2;
3610 case 7: /* chan 3 gain */
3611 i2c_addr = CALDAC1_I2C_ADDR;
3612 serial_bytes[0] = GAIN_1_3;
3615 dev_err(dev->class_dev, "invalid caldac channel\n");
3618 serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf);
3619 serial_bytes[2] = value & 0xff;
3620 i2c_write(dev, i2c_addr, serial_bytes, 3);
3624 static void caldac_write(struct comedi_device *dev, unsigned int channel,
3627 const struct pcidas64_board *thisboard = dev->board_ptr;
3629 switch (thisboard->layout) {
3632 caldac_8800_write(dev, channel, value);
3635 caldac_i2c_write(dev, channel, value);
3642 static int cb_pcidas64_calib_insn_write(struct comedi_device *dev,
3643 struct comedi_subdevice *s,
3644 struct comedi_insn *insn,
3647 unsigned int chan = CR_CHAN(insn->chanspec);
3650 * Programming the calib device is slow. Only write the
3651 * last data value if the value has changed.
3654 unsigned int val = data[insn->n - 1];
3656 if (s->readback[chan] != val) {
3657 caldac_write(dev, chan, val);
3658 s->readback[chan] = val;
3665 static void ad8402_write(struct comedi_device *dev, unsigned int channel,
3668 struct pcidas64_private *devpriv = dev->private;
3669 static const int bitstream_length = 10;
3670 unsigned int bit, register_bits;
3671 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
3672 static const int ad8402_udelay = 1;
3674 register_bits = SELECT_8402_64XX_BIT;
3675 udelay(ad8402_udelay);
3676 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3678 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3679 if (bitstream & bit)
3680 register_bits |= SERIAL_DATA_IN_BIT;
3682 register_bits &= ~SERIAL_DATA_IN_BIT;
3683 udelay(ad8402_udelay);
3684 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3685 udelay(ad8402_udelay);
3686 writew(register_bits | SERIAL_CLOCK_BIT,
3687 devpriv->main_iobase + CALIBRATION_REG);
3690 udelay(ad8402_udelay);
3691 writew(0, devpriv->main_iobase + CALIBRATION_REG);
3694 /* for pci-das6402/16, channel 0 is analog input gain and channel 1 is offset */
3695 static int cb_pcidas64_ad8402_insn_write(struct comedi_device *dev,
3696 struct comedi_subdevice *s,
3697 struct comedi_insn *insn,
3700 unsigned int chan = CR_CHAN(insn->chanspec);
3703 * Programming the calib device is slow. Only write the
3704 * last data value if the value has changed.
3707 unsigned int val = data[insn->n - 1];
3709 if (s->readback[chan] != val) {
3710 ad8402_write(dev, chan, val);
3711 s->readback[chan] = val;
3718 static uint16_t read_eeprom(struct comedi_device *dev, uint8_t address)
3720 struct pcidas64_private *devpriv = dev->private;
3721 static const int bitstream_length = 11;
3722 static const int read_command = 0x6;
3723 unsigned int bitstream = (read_command << 8) | address;
3725 void __iomem * const plx_control_addr =
3726 devpriv->plx9080_iobase + PLX_CONTROL_REG;
3728 static const int value_length = 16;
3729 static const int eeprom_udelay = 1;
3731 udelay(eeprom_udelay);
3732 devpriv->plx_control_bits &= ~CTL_EE_CLK & ~CTL_EE_CS;
3733 /* make sure we don't send anything to the i2c bus on 4020 */
3734 devpriv->plx_control_bits |= CTL_USERO;
3735 writel(devpriv->plx_control_bits, plx_control_addr);
3736 /* activate serial eeprom */
3737 udelay(eeprom_udelay);
3738 devpriv->plx_control_bits |= CTL_EE_CS;
3739 writel(devpriv->plx_control_bits, plx_control_addr);
3741 /* write read command and desired memory address */
3742 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3743 /* set bit to be written */
3744 udelay(eeprom_udelay);
3745 if (bitstream & bit)
3746 devpriv->plx_control_bits |= CTL_EE_W;
3748 devpriv->plx_control_bits &= ~CTL_EE_W;
3749 writel(devpriv->plx_control_bits, plx_control_addr);
3751 udelay(eeprom_udelay);
3752 devpriv->plx_control_bits |= CTL_EE_CLK;
3753 writel(devpriv->plx_control_bits, plx_control_addr);
3754 udelay(eeprom_udelay);
3755 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3756 writel(devpriv->plx_control_bits, plx_control_addr);
3758 /* read back value from eeprom memory location */
3760 for (bit = 1 << (value_length - 1); bit; bit >>= 1) {
3762 udelay(eeprom_udelay);
3763 devpriv->plx_control_bits |= CTL_EE_CLK;
3764 writel(devpriv->plx_control_bits, plx_control_addr);
3765 udelay(eeprom_udelay);
3766 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3767 writel(devpriv->plx_control_bits, plx_control_addr);
3768 udelay(eeprom_udelay);
3769 if (readl(plx_control_addr) & CTL_EE_R)
3773 /* deactivate eeprom serial input */
3774 udelay(eeprom_udelay);
3775 devpriv->plx_control_bits &= ~CTL_EE_CS;
3776 writel(devpriv->plx_control_bits, plx_control_addr);
3781 static int eeprom_read_insn(struct comedi_device *dev,
3782 struct comedi_subdevice *s,
3783 struct comedi_insn *insn, unsigned int *data)
3785 data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
3791 * Allocate and initialize the subdevice structures.
3793 static int setup_subdevices(struct comedi_device *dev)
3795 const struct pcidas64_board *thisboard = dev->board_ptr;
3796 struct pcidas64_private *devpriv = dev->private;
3797 struct comedi_subdevice *s;
3801 ret = comedi_alloc_subdevices(dev, 10);
3805 s = &dev->subdevices[0];
3806 /* analog input subdevice */
3807 dev->read_subdev = s;
3808 s->type = COMEDI_SUBD_AI;
3809 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
3810 if (thisboard->layout == LAYOUT_60XX)
3811 s->subdev_flags |= SDF_COMMON | SDF_DIFF;
3812 else if (thisboard->layout == LAYOUT_64XX)
3813 s->subdev_flags |= SDF_DIFF;
3814 /* XXX Number of inputs in differential mode is ignored */
3815 s->n_chan = thisboard->ai_se_chans;
3816 s->len_chanlist = 0x2000;
3817 s->maxdata = (1 << thisboard->ai_bits) - 1;
3818 s->range_table = thisboard->ai_range_table;
3819 s->insn_read = ai_rinsn;
3820 s->insn_config = ai_config_insn;
3822 s->do_cmdtest = ai_cmdtest;
3823 s->cancel = ai_cancel;
3824 if (thisboard->layout == LAYOUT_4020) {
3827 * set adc to read from inputs
3828 * (not internal calibration sources)
3830 devpriv->i2c_cal_range_bits = adc_src_4020_bits(4);
3831 /* set channels to +-5 volt input ranges */
3832 for (i = 0; i < s->n_chan; i++)
3833 devpriv->i2c_cal_range_bits |= attenuate_bit(i);
3834 data = devpriv->i2c_cal_range_bits;
3835 i2c_write(dev, RANGE_CAL_I2C_ADDR, &data, sizeof(data));
3838 /* analog output subdevice */
3839 s = &dev->subdevices[1];
3840 if (thisboard->ao_nchan) {
3841 s->type = COMEDI_SUBD_AO;
3842 s->subdev_flags = SDF_READABLE | SDF_WRITABLE |
3843 SDF_GROUND | SDF_CMD_WRITE;
3844 s->n_chan = thisboard->ao_nchan;
3845 s->maxdata = (1 << thisboard->ao_bits) - 1;
3846 s->range_table = thisboard->ao_range_table;
3847 s->insn_write = ao_winsn;
3849 ret = comedi_alloc_subdev_readback(s);
3853 if (ao_cmd_is_supported(thisboard)) {
3854 dev->write_subdev = s;
3855 s->do_cmdtest = ao_cmdtest;
3857 s->len_chanlist = thisboard->ao_nchan;
3858 s->cancel = ao_cancel;
3861 s->type = COMEDI_SUBD_UNUSED;
3865 s = &dev->subdevices[2];
3866 if (thisboard->layout == LAYOUT_64XX) {
3867 s->type = COMEDI_SUBD_DI;
3868 s->subdev_flags = SDF_READABLE;
3871 s->range_table = &range_digital;
3872 s->insn_bits = di_rbits;
3874 s->type = COMEDI_SUBD_UNUSED;
3877 /* digital output */
3878 if (thisboard->layout == LAYOUT_64XX) {
3879 s = &dev->subdevices[3];
3880 s->type = COMEDI_SUBD_DO;
3881 s->subdev_flags = SDF_WRITABLE;
3884 s->range_table = &range_digital;
3885 s->insn_bits = do_wbits;
3887 s->type = COMEDI_SUBD_UNUSED;
3891 s = &dev->subdevices[4];
3892 if (thisboard->has_8255) {
3893 if (thisboard->layout == LAYOUT_4020) {
3894 ret = subdev_8255_init(dev, s, dio_callback_4020,
3897 ret = subdev_8255_mm_init(dev, s, NULL,
3903 s->type = COMEDI_SUBD_UNUSED;
3906 /* 8 channel dio for 60xx */
3907 s = &dev->subdevices[5];
3908 if (thisboard->layout == LAYOUT_60XX) {
3909 s->type = COMEDI_SUBD_DIO;
3910 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
3913 s->range_table = &range_digital;
3914 s->insn_config = dio_60xx_config_insn;
3915 s->insn_bits = dio_60xx_wbits;
3917 s->type = COMEDI_SUBD_UNUSED;
3921 s = &dev->subdevices[6];
3922 s->type = COMEDI_SUBD_CALIB;
3923 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3925 if (thisboard->layout == LAYOUT_4020)
3929 s->insn_write = cb_pcidas64_calib_insn_write;
3931 ret = comedi_alloc_subdev_readback(s);
3935 for (i = 0; i < s->n_chan; i++) {
3936 caldac_write(dev, i, s->maxdata / 2);
3937 s->readback[i] = s->maxdata / 2;
3940 /* 2 channel ad8402 potentiometer */
3941 s = &dev->subdevices[7];
3942 if (thisboard->layout == LAYOUT_64XX) {
3943 s->type = COMEDI_SUBD_CALIB;
3944 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
3947 s->insn_write = cb_pcidas64_ad8402_insn_write;
3949 ret = comedi_alloc_subdev_readback(s);
3953 for (i = 0; i < s->n_chan; i++) {
3954 ad8402_write(dev, i, s->maxdata / 2);
3955 s->readback[i] = s->maxdata / 2;
3958 s->type = COMEDI_SUBD_UNUSED;
3961 /* serial EEPROM, if present */
3962 s = &dev->subdevices[8];
3963 if (readl(devpriv->plx9080_iobase + PLX_CONTROL_REG) & CTL_EECHK) {
3964 s->type = COMEDI_SUBD_MEMORY;
3965 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
3967 s->maxdata = 0xffff;
3968 s->insn_read = eeprom_read_insn;
3970 s->type = COMEDI_SUBD_UNUSED;
3973 /* user counter subd XXX */
3974 s = &dev->subdevices[9];
3975 s->type = COMEDI_SUBD_UNUSED;
3980 static int auto_attach(struct comedi_device *dev,
3981 unsigned long context)
3983 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
3984 const struct pcidas64_board *thisboard = NULL;
3985 struct pcidas64_private *devpriv;
3986 uint32_t local_range, local_decode;
3989 if (context < ARRAY_SIZE(pcidas64_boards))
3990 thisboard = &pcidas64_boards[context];
3993 dev->board_ptr = thisboard;
3995 devpriv = comedi_alloc_devpriv(dev, sizeof(*devpriv));
3999 retval = comedi_pci_enable(dev);
4002 pci_set_master(pcidev);
4004 /* Initialize dev->board_name */
4005 dev->board_name = thisboard->name;
4007 devpriv->main_phys_iobase = pci_resource_start(pcidev, 2);
4008 devpriv->dio_counter_phys_iobase = pci_resource_start(pcidev, 3);
4010 devpriv->plx9080_iobase = pci_ioremap_bar(pcidev, 0);
4011 devpriv->main_iobase = pci_ioremap_bar(pcidev, 2);
4012 dev->mmio = pci_ioremap_bar(pcidev, 3);
4014 if (!devpriv->plx9080_iobase || !devpriv->main_iobase || !dev->mmio) {
4015 dev_warn(dev->class_dev, "failed to remap io memory\n");
4019 /* figure out what local addresses are */
4020 local_range = readl(devpriv->plx9080_iobase + PLX_LAS0RNG_REG) &
4022 local_decode = readl(devpriv->plx9080_iobase + PLX_LAS0MAP_REG) &
4023 local_range & LMAP_MEM_MASK;
4024 devpriv->local0_iobase = ((uint32_t)devpriv->main_phys_iobase &
4025 ~local_range) | local_decode;
4026 local_range = readl(devpriv->plx9080_iobase + PLX_LAS1RNG_REG) &
4028 local_decode = readl(devpriv->plx9080_iobase + PLX_LAS1MAP_REG) &
4029 local_range & LMAP_MEM_MASK;
4030 devpriv->local1_iobase = ((uint32_t)devpriv->dio_counter_phys_iobase &
4031 ~local_range) | local_decode;
4033 retval = alloc_and_init_dma_members(dev);
4037 devpriv->hw_revision =
4038 hw_revision(dev, readw(devpriv->main_iobase + HW_STATUS_REG));
4039 dev_dbg(dev->class_dev, "stc hardware revision %i\n",
4040 devpriv->hw_revision);
4042 init_stc_registers(dev);
4044 retval = request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
4045 dev->board_name, dev);
4047 dev_dbg(dev->class_dev, "unable to allocate irq %u\n",
4051 dev->irq = pcidev->irq;
4052 dev_dbg(dev->class_dev, "irq %u\n", dev->irq);
4054 retval = setup_subdevices(dev);
4061 static void detach(struct comedi_device *dev)
4063 struct pcidas64_private *devpriv = dev->private;
4066 free_irq(dev->irq, dev);
4068 if (devpriv->plx9080_iobase) {
4069 disable_plx_interrupts(dev);
4070 iounmap(devpriv->plx9080_iobase);
4072 if (devpriv->main_iobase)
4073 iounmap(devpriv->main_iobase);
4077 comedi_pci_disable(dev);
4078 cb_pcidas64_free_dma(dev);
4081 static struct comedi_driver cb_pcidas64_driver = {
4082 .driver_name = "cb_pcidas64",
4083 .module = THIS_MODULE,
4084 .auto_attach = auto_attach,
4088 static int cb_pcidas64_pci_probe(struct pci_dev *dev,
4089 const struct pci_device_id *id)
4091 return comedi_pci_auto_config(dev, &cb_pcidas64_driver,
4095 static const struct pci_device_id cb_pcidas64_pci_table[] = {
4096 { PCI_VDEVICE(CB, 0x001d), BOARD_PCIDAS6402_16 },
4097 { PCI_VDEVICE(CB, 0x001e), BOARD_PCIDAS6402_12 },
4098 { PCI_VDEVICE(CB, 0x0035), BOARD_PCIDAS64_M1_16 },
4099 { PCI_VDEVICE(CB, 0x0036), BOARD_PCIDAS64_M2_16 },
4100 { PCI_VDEVICE(CB, 0x0037), BOARD_PCIDAS64_M3_16 },
4101 { PCI_VDEVICE(CB, 0x0052), BOARD_PCIDAS4020_12 },
4102 { PCI_VDEVICE(CB, 0x005d), BOARD_PCIDAS6023 },
4103 { PCI_VDEVICE(CB, 0x005e), BOARD_PCIDAS6025 },
4104 { PCI_VDEVICE(CB, 0x005f), BOARD_PCIDAS6030 },
4105 { PCI_VDEVICE(CB, 0x0060), BOARD_PCIDAS6031 },
4106 { PCI_VDEVICE(CB, 0x0061), BOARD_PCIDAS6032 },
4107 { PCI_VDEVICE(CB, 0x0062), BOARD_PCIDAS6033 },
4108 { PCI_VDEVICE(CB, 0x0063), BOARD_PCIDAS6034 },
4109 { PCI_VDEVICE(CB, 0x0064), BOARD_PCIDAS6035 },
4110 { PCI_VDEVICE(CB, 0x0065), BOARD_PCIDAS6040 },
4111 { PCI_VDEVICE(CB, 0x0066), BOARD_PCIDAS6052 },
4112 { PCI_VDEVICE(CB, 0x0067), BOARD_PCIDAS6070 },
4113 { PCI_VDEVICE(CB, 0x0068), BOARD_PCIDAS6071 },
4114 { PCI_VDEVICE(CB, 0x006f), BOARD_PCIDAS6036 },
4115 { PCI_VDEVICE(CB, 0x0078), BOARD_PCIDAS6013 },
4116 { PCI_VDEVICE(CB, 0x0079), BOARD_PCIDAS6014 },
4119 MODULE_DEVICE_TABLE(pci, cb_pcidas64_pci_table);
4121 static struct pci_driver cb_pcidas64_pci_driver = {
4122 .name = "cb_pcidas64",
4123 .id_table = cb_pcidas64_pci_table,
4124 .probe = cb_pcidas64_pci_probe,
4125 .remove = comedi_pci_auto_unconfig,
4127 module_comedi_pci_driver(cb_pcidas64_driver, cb_pcidas64_pci_driver);
4129 MODULE_AUTHOR("Comedi http://www.comedi.org");
4130 MODULE_DESCRIPTION("Comedi low-level driver");
4131 MODULE_LICENSE("GPL");