2 comedi/drivers/cb_pcidas64.c
3 This is a driver for the ComputerBoards/MeasurementComputing PCI-DAS
4 64xx, 60xx, and 4020 cards.
6 Author: Frank Mori Hess <fmhess@users.sourceforge.net>
7 Copyright (C) 2001, 2002 Frank Mori Hess
9 Thanks also go to the following people:
11 Steve Rosenbluth, for providing the source code for
12 his pci-das6402 driver, and source code for working QNX pci-6402
13 drivers by Greg Laird and Mariusz Bogacz. None of the code was
14 used directly here, but it was useful as an additional source of
15 documentation on how to program the boards.
17 John Sims, for much testing and feedback on pcidas-4020 support.
19 COMEDI - Linux Control and Measurement Device Interface
20 Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
22 This program is free software; you can redistribute it and/or modify
23 it under the terms of the GNU General Public License as published by
24 the Free Software Foundation; either version 2 of the License, or
25 (at your option) any later version.
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
32 You should have received a copy of the GNU General Public License
33 along with this program; if not, write to the Free Software
34 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
36 ************************************************************************/
41 Description: MeasurementComputing PCI-DAS64xx, 60XX, and 4020 series with the PLX 9080 PCI controller
42 Author: Frank Mori Hess <fmhess@users.sourceforge.net>
45 Devices: [Measurement Computing] PCI-DAS6402/16 (cb_pcidas64),
46 PCI-DAS6402/12, PCI-DAS64/M1/16, PCI-DAS64/M2/16,
47 PCI-DAS64/M3/16, PCI-DAS6402/16/JR, PCI-DAS64/M1/16/JR,
48 PCI-DAS64/M2/16/JR, PCI-DAS64/M3/16/JR, PCI-DAS64/M1/14,
49 PCI-DAS64/M2/14, PCI-DAS64/M3/14, PCI-DAS6013, PCI-DAS6014,
50 PCI-DAS6023, PCI-DAS6025, PCI-DAS6030,
51 PCI-DAS6031, PCI-DAS6032, PCI-DAS6033, PCI-DAS6034,
52 PCI-DAS6035, PCI-DAS6036, PCI-DAS6040, PCI-DAS6052,
53 PCI-DAS6070, PCI-DAS6071, PCI-DAS4020/12
55 Configuration options:
56 [0] - PCI bus of device (optional)
57 [1] - PCI slot of device (optional)
59 These boards may be autocalibrated with the comedi_calibrate utility.
61 To select the bnc trigger input on the 4020 (instead of the dio input),
62 specify a nonzero channel in the chanspec. If you wish to use an external
63 master clock on the 4020, you may do so by setting the scan_begin_src
64 to TRIG_OTHER, and using an INSN_CONFIG_TIMER_1 configuration insn
65 to configure the divisor to use for the external clock.
67 Some devices are not identified because the PCI device IDs are not yet
68 known. If you have such a board, please file a bug report at
69 https://bugs.comedi.org.
76 make it return error if user attempts an ai command that uses the
77 external queue, and an ao command simultaneously
78 user counter subdevice
79 there are a number of boards this driver will support when they are
80 fully released, but does not yet since the pci device id numbers
81 are not yet available.
82 support prescaled 100khz clock for slow pacing (not available on 6000 series?)
83 make ao fifo size adjustable like ai fifo
86 #include "../comedidev.h"
87 #include <linux/delay.h>
88 #include <linux/interrupt.h>
93 #include "comedi_fc.h"
95 #undef PCIDAS64_DEBUG /* disable debugging code */
96 /* #define PCIDAS64_DEBUG enable debugging code */
99 #define DEBUG_PRINT(format, args...) printk(format , ## args)
101 #define DEBUG_PRINT(format, args...)
104 #define TIMER_BASE 25 /* 40MHz master clock */
105 #define PRESCALED_TIMER_BASE 10000 /* 100kHz 'prescaled' clock for slow acquisition, maybe I'll support this someday */
106 #define DMA_BUFFER_SIZE 0x1000
108 /* maximum value that can be loaded into board's 24-bit counters*/
109 static const int max_counter_value = 0xffffff;
111 /* PCI-DAS64xxx base addresses */
113 /* indices of base address regions */
114 enum base_address_regions {
115 PLX9080_BADDRINDEX = 0,
117 DIO_COUNTER_BADDRINDEX = 3,
120 /* devpriv->main_iobase registers */
121 enum write_only_registers {
122 INTR_ENABLE_REG = 0x0, /* interrupt enable register */
123 HW_CONFIG_REG = 0x2, /* hardware config register */
125 DAQ_ATRIG_LOW_4020_REG = 0xc,
126 ADC_CONTROL0_REG = 0x10, /* adc control register 0 */
127 ADC_CONTROL1_REG = 0x12, /* adc control register 1 */
128 CALIBRATION_REG = 0x14,
129 ADC_SAMPLE_INTERVAL_LOWER_REG = 0x16, /* lower 16 bits of adc sample interval counter */
130 ADC_SAMPLE_INTERVAL_UPPER_REG = 0x18, /* upper 8 bits of adc sample interval counter */
131 ADC_DELAY_INTERVAL_LOWER_REG = 0x1a, /* lower 16 bits of delay interval counter */
132 ADC_DELAY_INTERVAL_UPPER_REG = 0x1c, /* upper 8 bits of delay interval counter */
133 ADC_COUNT_LOWER_REG = 0x1e, /* lower 16 bits of hardware conversion/scan counter */
134 ADC_COUNT_UPPER_REG = 0x20, /* upper 8 bits of hardware conversion/scan counter */
135 ADC_START_REG = 0x22, /* software trigger to start acquisition */
136 ADC_CONVERT_REG = 0x24, /* initiates single conversion */
137 ADC_QUEUE_CLEAR_REG = 0x26, /* clears adc queue */
138 ADC_QUEUE_LOAD_REG = 0x28, /* loads adc queue */
139 ADC_BUFFER_CLEAR_REG = 0x2a,
140 ADC_QUEUE_HIGH_REG = 0x2c, /* high channel for internal queue, use adc_chan_bits() inline above */
141 DAC_CONTROL0_REG = 0x50, /* dac control register 0 */
142 DAC_CONTROL1_REG = 0x52, /* dac control register 0 */
143 DAC_SAMPLE_INTERVAL_LOWER_REG = 0x54, /* lower 16 bits of dac sample interval counter */
144 DAC_SAMPLE_INTERVAL_UPPER_REG = 0x56, /* upper 8 bits of dac sample interval counter */
145 DAC_SELECT_REG = 0x60,
146 DAC_START_REG = 0x64,
147 DAC_BUFFER_CLEAR_REG = 0x66, /* clear dac buffer */
149 static inline unsigned int dac_convert_reg(unsigned int channel)
151 return 0x70 + (2 * (channel & 0x1));
154 static inline unsigned int dac_lsb_4020_reg(unsigned int channel)
156 return 0x70 + (4 * (channel & 0x1));
159 static inline unsigned int dac_msb_4020_reg(unsigned int channel)
161 return 0x72 + (4 * (channel & 0x1));
164 enum read_only_registers {
165 HW_STATUS_REG = 0x0, /* hardware status register, reading this apparently clears pending interrupts as well */
166 PIPE1_READ_REG = 0x4,
167 ADC_READ_PNTR_REG = 0x8,
168 LOWER_XFER_REG = 0x10,
169 ADC_WRITE_PNTR_REG = 0xc,
173 enum read_write_registers {
174 I8255_4020_REG = 0x48, /* 8255 offset, for 4020 only */
175 ADC_QUEUE_FIFO_REG = 0x100, /* external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
176 ADC_FIFO_REG = 0x200, /* adc data fifo */
177 DAC_FIFO_REG = 0x300, /* dac data fifo, has weird interactions with external channel queue */
180 /* devpriv->dio_counter_iobase registers */
181 enum dio_counter_registers {
182 DIO_8255_OFFSET = 0x0,
185 DIO_DIRECTION_60XX_REG = 0x40,
186 DIO_DATA_60XX_REG = 0x48,
189 /* bit definitions for write-only registers */
191 enum intr_enable_contents {
192 ADC_INTR_SRC_MASK = 0x3, /* bits that set adc interrupt source */
193 ADC_INTR_QFULL_BITS = 0x0, /* interrupt fifo quater full */
194 ADC_INTR_EOC_BITS = 0x1, /* interrupt end of conversion */
195 ADC_INTR_EOSCAN_BITS = 0x2, /* interrupt end of scan */
196 ADC_INTR_EOSEQ_BITS = 0x3, /* interrupt end of sequence (probably wont use this it's pretty fancy) */
197 EN_ADC_INTR_SRC_BIT = 0x4, /* enable adc interrupt source */
198 EN_ADC_DONE_INTR_BIT = 0x8, /* enable adc acquisition done interrupt */
199 DAC_INTR_SRC_MASK = 0x30,
200 DAC_INTR_QEMPTY_BITS = 0x0,
201 DAC_INTR_HIGH_CHAN_BITS = 0x10,
202 EN_DAC_INTR_SRC_BIT = 0x40, /* enable dac interrupt source */
203 EN_DAC_DONE_INTR_BIT = 0x80,
204 EN_ADC_ACTIVE_INTR_BIT = 0x200, /* enable adc active interrupt */
205 EN_ADC_STOP_INTR_BIT = 0x400, /* enable adc stop trigger interrupt */
206 EN_DAC_ACTIVE_INTR_BIT = 0x800, /* enable dac active interrupt */
207 EN_DAC_UNDERRUN_BIT = 0x4000, /* enable dac underrun status bit */
208 EN_ADC_OVERRUN_BIT = 0x8000, /* enable adc overrun status bit */
211 enum hw_config_contents {
212 MASTER_CLOCK_4020_MASK = 0x3, /* bits that specify master clock source for 4020 */
213 INTERNAL_CLOCK_4020_BITS = 0x1, /* use 40 MHz internal master clock for 4020 */
214 BNC_CLOCK_4020_BITS = 0x2, /* use BNC input for master clock */
215 EXT_CLOCK_4020_BITS = 0x3, /* use dio input for master clock */
216 EXT_QUEUE_BIT = 0x200, /* use external channel/gain queue (more versatile than internal queue) */
217 SLOW_DAC_BIT = 0x400, /* use 225 nanosec strobe when loading dac instead of 50 nanosec */
218 HW_CONFIG_DUMMY_BITS = 0x2000, /* bit with unknown function yet given as default value in pci-das64 manual */
219 DMA_CH_SELECT_BIT = 0x8000, /* bit selects channels 1/0 for analog input/output, otherwise 0/1 */
220 FIFO_SIZE_REG = 0x4, /* allows adjustment of fifo sizes */
221 DAC_FIFO_SIZE_MASK = 0xff00, /* bits that set dac fifo size */
222 DAC_FIFO_BITS = 0xf800, /* 8k sample ao fifo */
224 #define DAC_FIFO_SIZE 0x2000
226 enum daq_atrig_low_4020_contents {
227 EXT_AGATE_BNC_BIT = 0x8000, /* use trig/ext clk bnc input for analog gate signal */
228 EXT_STOP_TRIG_BNC_BIT = 0x4000, /* use trig/ext clk bnc input for external stop trigger signal */
229 EXT_START_TRIG_BNC_BIT = 0x2000, /* use trig/ext clk bnc input for external start trigger signal */
231 static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold)
233 return threshold & 0xfff;
236 enum adc_control0_contents {
237 ADC_GATE_SRC_MASK = 0x3, /* bits that select gate */
238 ADC_SOFT_GATE_BITS = 0x1, /* software gate */
239 ADC_EXT_GATE_BITS = 0x2, /* external digital gate */
240 ADC_ANALOG_GATE_BITS = 0x3, /* analog level gate */
241 ADC_GATE_LEVEL_BIT = 0x4, /* level-sensitive gate (for digital) */
242 ADC_GATE_POLARITY_BIT = 0x8, /* gate active low */
243 ADC_START_TRIG_SOFT_BITS = 0x10,
244 ADC_START_TRIG_EXT_BITS = 0x20,
245 ADC_START_TRIG_ANALOG_BITS = 0x30,
246 ADC_START_TRIG_MASK = 0x30,
247 ADC_START_TRIG_FALLING_BIT = 0x40, /* trig 1 uses falling edge */
248 ADC_EXT_CONV_FALLING_BIT = 0x800, /* external pacing uses falling edge */
249 ADC_SAMPLE_COUNTER_EN_BIT = 0x1000, /* enable hardware scan counter */
250 ADC_DMA_DISABLE_BIT = 0x4000, /* disables dma */
251 ADC_ENABLE_BIT = 0x8000, /* master adc enable */
254 enum adc_control1_contents {
255 ADC_QUEUE_CONFIG_BIT = 0x1, /* should be set for boards with > 16 channels */
256 CONVERT_POLARITY_BIT = 0x10,
257 EOC_POLARITY_BIT = 0x20,
258 ADC_SW_GATE_BIT = 0x40, /* software gate of adc */
259 ADC_DITHER_BIT = 0x200, /* turn on extra noise for dithering */
260 RETRIGGER_BIT = 0x800,
261 ADC_LO_CHANNEL_4020_MASK = 0x300,
262 ADC_HI_CHANNEL_4020_MASK = 0xc00,
263 TWO_CHANNEL_4020_BITS = 0x1000, /* two channel mode for 4020 */
264 FOUR_CHANNEL_4020_BITS = 0x2000, /* four channel mode for 4020 */
265 CHANNEL_MODE_4020_MASK = 0x3000,
266 ADC_MODE_MASK = 0xf000,
268 static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel)
270 return (channel & 0x3) << 8;
273 static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel)
275 return (channel & 0x3) << 10;
278 static inline uint16_t adc_mode_bits(unsigned int mode)
280 return (mode & 0xf) << 12;
283 enum calibration_contents {
284 SELECT_8800_BIT = 0x1,
285 SELECT_8402_64XX_BIT = 0x2,
286 SELECT_1590_60XX_BIT = 0x2,
287 CAL_EN_64XX_BIT = 0x40, /* calibration enable for 64xx series */
288 SERIAL_DATA_IN_BIT = 0x80,
289 SERIAL_CLOCK_BIT = 0x100,
290 CAL_EN_60XX_BIT = 0x200, /* calibration enable for 60xx series */
291 CAL_GAIN_BIT = 0x800,
293 /* calibration sources for 6025 are:
303 static inline uint16_t adc_src_bits(unsigned int source)
305 return (source & 0xf) << 3;
308 static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel)
310 return (channel & 0x3) << 8;
313 enum adc_queue_load_contents {
314 UNIP_BIT = 0x800, /* unipolar/bipolar bit */
315 ADC_SE_DIFF_BIT = 0x1000, /* single-ended/ differential bit */
316 ADC_COMMON_BIT = 0x2000, /* non-referenced single-ended (common-mode input) */
317 QUEUE_EOSEQ_BIT = 0x4000, /* queue end of sequence */
318 QUEUE_EOSCAN_BIT = 0x8000, /* queue end of scan */
320 static inline uint16_t adc_chan_bits(unsigned int channel)
322 return channel & 0x3f;
325 enum dac_control0_contents {
326 DAC_ENABLE_BIT = 0x8000, /* dac controller enable bit */
327 DAC_CYCLIC_STOP_BIT = 0x4000,
328 DAC_WAVEFORM_MODE_BIT = 0x100,
329 DAC_EXT_UPDATE_FALLING_BIT = 0x80,
330 DAC_EXT_UPDATE_ENABLE_BIT = 0x40,
331 WAVEFORM_TRIG_MASK = 0x30,
332 WAVEFORM_TRIG_DISABLED_BITS = 0x0,
333 WAVEFORM_TRIG_SOFT_BITS = 0x10,
334 WAVEFORM_TRIG_EXT_BITS = 0x20,
335 WAVEFORM_TRIG_ADC1_BITS = 0x30,
336 WAVEFORM_TRIG_FALLING_BIT = 0x8,
337 WAVEFORM_GATE_LEVEL_BIT = 0x4,
338 WAVEFORM_GATE_ENABLE_BIT = 0x2,
339 WAVEFORM_GATE_SELECT_BIT = 0x1,
342 enum dac_control1_contents {
343 DAC_WRITE_POLARITY_BIT = 0x800, /* board-dependent setting */
344 DAC1_EXT_REF_BIT = 0x200,
345 DAC0_EXT_REF_BIT = 0x100,
346 DAC_OUTPUT_ENABLE_BIT = 0x80, /* dac output enable bit */
347 DAC_UPDATE_POLARITY_BIT = 0x40, /* board-dependent setting */
348 DAC_SW_GATE_BIT = 0x20,
349 DAC1_UNIPOLAR_BIT = 0x8,
350 DAC0_UNIPOLAR_BIT = 0x2,
353 /* bit definitions for read-only registers */
354 enum hw_status_contents {
355 DAC_UNDERRUN_BIT = 0x1,
356 ADC_OVERRUN_BIT = 0x2,
357 DAC_ACTIVE_BIT = 0x4,
358 ADC_ACTIVE_BIT = 0x8,
359 DAC_INTR_PENDING_BIT = 0x10,
360 ADC_INTR_PENDING_BIT = 0x20,
363 EXT_INTR_PENDING_BIT = 0x100,
364 ADC_STOP_BIT = 0x200,
366 static inline uint16_t pipe_full_bits(uint16_t hw_status_bits)
368 return (hw_status_bits >> 10) & 0x3;
371 static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits)
373 return (prepost_bits >> 6) & 0x3;
376 static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits)
378 return (prepost_bits >> 12) & 0x3;
381 static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits)
383 return (prepost_bits >> 14) & 0x3;
386 /* I2C addresses for 4020 */
388 RANGE_CAL_I2C_ADDR = 0x20,
389 CALDAC0_I2C_ADDR = 0xc,
390 CALDAC1_I2C_ADDR = 0xd,
393 enum range_cal_i2c_contents {
394 ADC_SRC_4020_MASK = 0x70, /* bits that set what source the adc converter measures */
395 BNC_TRIG_THRESHOLD_0V_BIT = 0x80, /* make bnc trig/ext clock threshold 0V instead of 2.5V */
397 static inline uint8_t adc_src_4020_bits(unsigned int source)
399 return (source << 4) & ADC_SRC_4020_MASK;
402 static inline uint8_t attenuate_bit(unsigned int channel)
404 /* attenuate channel (+-5V input range) */
405 return 1 << (channel & 0x3);
408 /* analog input ranges for 64xx boards */
409 static const struct comedi_lrange ai_ranges_64xx = {
423 /* analog input ranges for 60xx boards */
424 static const struct comedi_lrange ai_ranges_60xx = {
434 /* analog input ranges for 6030, etc boards */
435 static const struct comedi_lrange ai_ranges_6030 = {
455 /* analog input ranges for 6052, etc boards */
456 static const struct comedi_lrange ai_ranges_6052 = {
477 /* analog input ranges for 4020 board */
478 static const struct comedi_lrange ai_ranges_4020 = {
486 /* analog output ranges */
487 static const struct comedi_lrange ao_ranges_64xx = {
497 static const int ao_range_code_64xx[] = {
504 static const struct comedi_lrange ao_ranges_60xx = {
511 static const int ao_range_code_60xx[] = {
515 static const struct comedi_lrange ao_ranges_6030 = {
523 static const int ao_range_code_6030[] = {
528 static const struct comedi_lrange ao_ranges_4020 = {
536 static const int ao_range_code_4020[] = {
541 enum register_layout {
547 struct hw_fifo_info {
548 unsigned int num_segments;
549 unsigned int max_segment_length;
550 unsigned int sample_packing_ratio;
551 uint16_t fifo_size_reg_mask;
554 struct pcidas64_board {
556 int device_id; /* pci device id */
557 int ai_se_chans; /* number of ai inputs in single-ended mode */
558 int ai_bits; /* analog input resolution */
559 int ai_speed; /* fastest conversion period in ns */
560 const struct comedi_lrange *ai_range_table;
561 int ao_nchan; /* number of analog out channels */
562 int ao_bits; /* analog output resolution */
563 int ao_scan_speed; /* analog output speed (for a scan, not conversion) */
564 const struct comedi_lrange *ao_range_table;
565 const int *ao_range_code;
566 const struct hw_fifo_info *const ai_fifo;
567 enum register_layout layout; /* different board families have slightly different registers */
571 static const struct hw_fifo_info ai_fifo_4020 = {
573 .max_segment_length = 0x8000,
574 .sample_packing_ratio = 2,
575 .fifo_size_reg_mask = 0x7f,
578 static const struct hw_fifo_info ai_fifo_64xx = {
580 .max_segment_length = 0x800,
581 .sample_packing_ratio = 1,
582 .fifo_size_reg_mask = 0x3f,
585 static const struct hw_fifo_info ai_fifo_60xx = {
587 .max_segment_length = 0x800,
588 .sample_packing_ratio = 1,
589 .fifo_size_reg_mask = 0x7f,
592 /* maximum number of dma transfers we will chain together into a ring
593 * (and the maximum number of dma buffers we maintain) */
594 #define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
595 #define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
596 #define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
597 static inline unsigned int ai_dma_ring_count(struct pcidas64_board *board)
599 if (board->layout == LAYOUT_4020)
600 return MAX_AI_DMA_RING_COUNT;
602 return MIN_AI_DMA_RING_COUNT;
605 static const int bytes_in_sample = 2;
607 static const struct pcidas64_board pcidas64_boards[] = {
609 .name = "pci-das6402/16",
616 .ao_scan_speed = 10000,
617 .layout = LAYOUT_64XX,
618 .ai_range_table = &ai_ranges_64xx,
619 .ao_range_table = &ao_ranges_64xx,
620 .ao_range_code = ao_range_code_64xx,
621 .ai_fifo = &ai_fifo_64xx,
625 .name = "pci-das6402/12", /* XXX check */
632 .ao_scan_speed = 10000,
633 .layout = LAYOUT_64XX,
634 .ai_range_table = &ai_ranges_64xx,
635 .ao_range_table = &ao_ranges_64xx,
636 .ao_range_code = ao_range_code_64xx,
637 .ai_fifo = &ai_fifo_64xx,
641 .name = "pci-das64/m1/16",
648 .ao_scan_speed = 10000,
649 .layout = LAYOUT_64XX,
650 .ai_range_table = &ai_ranges_64xx,
651 .ao_range_table = &ao_ranges_64xx,
652 .ao_range_code = ao_range_code_64xx,
653 .ai_fifo = &ai_fifo_64xx,
657 .name = "pci-das64/m2/16",
664 .ao_scan_speed = 10000,
665 .layout = LAYOUT_64XX,
666 .ai_range_table = &ai_ranges_64xx,
667 .ao_range_table = &ao_ranges_64xx,
668 .ao_range_code = ao_range_code_64xx,
669 .ai_fifo = &ai_fifo_64xx,
673 .name = "pci-das64/m3/16",
680 .ao_scan_speed = 10000,
681 .layout = LAYOUT_64XX,
682 .ai_range_table = &ai_ranges_64xx,
683 .ao_range_table = &ao_ranges_64xx,
684 .ao_range_code = ao_range_code_64xx,
685 .ai_fifo = &ai_fifo_64xx,
689 .name = "pci-das6013",
696 .layout = LAYOUT_60XX,
697 .ai_range_table = &ai_ranges_60xx,
698 .ao_range_table = &ao_ranges_60xx,
699 .ao_range_code = ao_range_code_60xx,
700 .ai_fifo = &ai_fifo_60xx,
704 .name = "pci-das6014",
711 .ao_scan_speed = 100000,
712 .layout = LAYOUT_60XX,
713 .ai_range_table = &ai_ranges_60xx,
714 .ao_range_table = &ao_ranges_60xx,
715 .ao_range_code = ao_range_code_60xx,
716 .ai_fifo = &ai_fifo_60xx,
720 .name = "pci-das6023",
726 .ao_scan_speed = 100000,
727 .layout = LAYOUT_60XX,
728 .ai_range_table = &ai_ranges_60xx,
729 .ao_range_table = &ao_ranges_60xx,
730 .ao_range_code = ao_range_code_60xx,
731 .ai_fifo = &ai_fifo_60xx,
735 .name = "pci-das6025",
742 .ao_scan_speed = 100000,
743 .layout = LAYOUT_60XX,
744 .ai_range_table = &ai_ranges_60xx,
745 .ao_range_table = &ao_ranges_60xx,
746 .ao_range_code = ao_range_code_60xx,
747 .ai_fifo = &ai_fifo_60xx,
751 .name = "pci-das6030",
758 .ao_scan_speed = 10000,
759 .layout = LAYOUT_60XX,
760 .ai_range_table = &ai_ranges_6030,
761 .ao_range_table = &ao_ranges_6030,
762 .ao_range_code = ao_range_code_6030,
763 .ai_fifo = &ai_fifo_60xx,
767 .name = "pci-das6031",
774 .ao_scan_speed = 10000,
775 .layout = LAYOUT_60XX,
776 .ai_range_table = &ai_ranges_6030,
777 .ao_range_table = &ao_ranges_6030,
778 .ao_range_code = ao_range_code_6030,
779 .ai_fifo = &ai_fifo_60xx,
783 .name = "pci-das6032",
789 .layout = LAYOUT_60XX,
790 .ai_range_table = &ai_ranges_6030,
791 .ai_fifo = &ai_fifo_60xx,
795 .name = "pci-das6033",
801 .layout = LAYOUT_60XX,
802 .ai_range_table = &ai_ranges_6030,
803 .ai_fifo = &ai_fifo_60xx,
807 .name = "pci-das6034",
814 .layout = LAYOUT_60XX,
815 .ai_range_table = &ai_ranges_60xx,
816 .ai_fifo = &ai_fifo_60xx,
820 .name = "pci-das6035",
827 .ao_scan_speed = 100000,
828 .layout = LAYOUT_60XX,
829 .ai_range_table = &ai_ranges_60xx,
830 .ao_range_table = &ao_ranges_60xx,
831 .ao_range_code = ao_range_code_60xx,
832 .ai_fifo = &ai_fifo_60xx,
836 .name = "pci-das6036",
843 .ao_scan_speed = 100000,
844 .layout = LAYOUT_60XX,
845 .ai_range_table = &ai_ranges_60xx,
846 .ao_range_table = &ao_ranges_60xx,
847 .ao_range_code = ao_range_code_60xx,
848 .ai_fifo = &ai_fifo_60xx,
852 .name = "pci-das6040",
859 .ao_scan_speed = 1000,
860 .layout = LAYOUT_60XX,
861 .ai_range_table = &ai_ranges_6052,
862 .ao_range_table = &ao_ranges_6030,
863 .ao_range_code = ao_range_code_6030,
864 .ai_fifo = &ai_fifo_60xx,
868 .name = "pci-das6052",
875 .ao_scan_speed = 3333,
876 .layout = LAYOUT_60XX,
877 .ai_range_table = &ai_ranges_6052,
878 .ao_range_table = &ao_ranges_6030,
879 .ao_range_code = ao_range_code_6030,
880 .ai_fifo = &ai_fifo_60xx,
884 .name = "pci-das6070",
891 .ao_scan_speed = 1000,
892 .layout = LAYOUT_60XX,
893 .ai_range_table = &ai_ranges_6052,
894 .ao_range_table = &ao_ranges_6030,
895 .ao_range_code = ao_range_code_6030,
896 .ai_fifo = &ai_fifo_60xx,
900 .name = "pci-das6071",
907 .ao_scan_speed = 1000,
908 .layout = LAYOUT_60XX,
909 .ai_range_table = &ai_ranges_6052,
910 .ao_range_table = &ao_ranges_6030,
911 .ao_range_code = ao_range_code_6030,
912 .ai_fifo = &ai_fifo_60xx,
916 .name = "pci-das4020/12",
923 .ao_scan_speed = 0, /* no hardware pacing on ao */
924 .layout = LAYOUT_4020,
925 .ai_range_table = &ai_ranges_4020,
926 .ao_range_table = &ao_ranges_4020,
927 .ao_range_code = ao_range_code_4020,
928 .ai_fifo = &ai_fifo_4020,
933 .name = "pci-das6402/16/jr",
934 .device_id = 0 /* XXX, */
939 .ao_scan_speed = 10000,
940 .layout = LAYOUT_64XX,
941 .ai_range_table = &ai_ranges_64xx,
942 .ai_fifo = ai_fifo_64xx,
946 .name = "pci-das64/m1/16/jr",
947 .device_id = 0 /* XXX, */
952 .ao_scan_speed = 10000,
953 .layout = LAYOUT_64XX,
954 .ai_range_table = &ai_ranges_64xx,
955 .ai_fifo = ai_fifo_64xx,
959 .name = "pci-das64/m2/16/jr",
960 .device_id = 0 /* XXX, */
965 .ao_scan_speed = 10000,
966 .layout = LAYOUT_64XX,
967 .ai_range_table = &ai_ranges_64xx,
968 .ai_fifo = ai_fifo_64xx,
972 .name = "pci-das64/m3/16/jr",
973 .device_id = 0 /* XXX, */
978 .ao_scan_speed = 10000,
979 .layout = LAYOUT_64XX,
980 .ai_range_table = &ai_ranges_64xx,
981 .ai_fifo = ai_fifo_64xx,
985 .name = "pci-das64/m1/14",
986 .device_id = 0, /* XXX */
991 .ao_scan_speed = 10000,
992 .layout = LAYOUT_64XX,
993 .ai_range_table = &ai_ranges_64xx,
994 .ai_fifo = ai_fifo_64xx,
998 .name = "pci-das64/m2/14",
999 .device_id = 0, /* XXX */
1004 .ao_scan_speed = 10000,
1005 .layout = LAYOUT_64XX,
1006 .ai_range_table = &ai_ranges_64xx,
1007 .ai_fifo = ai_fifo_64xx,
1011 .name = "pci-das64/m3/14",
1012 .device_id = 0, /* XXX */
1017 .ao_scan_speed = 10000,
1018 .layout = LAYOUT_64XX,
1019 .ai_range_table = &ai_ranges_64xx,
1020 .ai_fifo = ai_fifo_64xx,
1026 static inline struct pcidas64_board *board(const struct comedi_device *dev)
1028 return (struct pcidas64_board *)dev->board_ptr;
1031 static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev,
1032 int use_differential)
1034 if ((board(dev)->layout == LAYOUT_64XX && !use_differential) ||
1035 (board(dev)->layout == LAYOUT_60XX && use_differential))
1036 return ADC_SE_DIFF_BIT;
1041 struct ext_clock_info {
1042 unsigned int divisor; /* master clock divisor to use for scans with external master clock */
1043 unsigned int chanspec; /* chanspec for master clock input when used as scan begin src */
1046 /* this structure is for data unique to this hardware driver. */
1047 struct pcidas64_private {
1048 /* base addresses (physical) */
1049 resource_size_t plx9080_phys_iobase;
1050 resource_size_t main_phys_iobase;
1051 resource_size_t dio_counter_phys_iobase;
1052 /* base addresses (ioremapped) */
1053 void __iomem *plx9080_iobase;
1054 void __iomem *main_iobase;
1055 void __iomem *dio_counter_iobase;
1056 /* local address (used by dma controller) */
1057 uint32_t local0_iobase;
1058 uint32_t local1_iobase;
1059 volatile unsigned int ai_count; /* number of analog input samples remaining */
1060 uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT]; /* dma buffers for analog input */
1061 dma_addr_t ai_buffer_bus_addr[MAX_AI_DMA_RING_COUNT]; /* physical addresses of ai dma buffers */
1062 struct plx_dma_desc *ai_dma_desc; /* array of ai dma descriptors read by plx9080, allocated to get proper alignment */
1063 dma_addr_t ai_dma_desc_bus_addr; /* physical address of ai dma descriptor array */
1064 volatile unsigned int ai_dma_index; /* index of the ai dma descriptor/buffer that is currently being used */
1065 uint16_t *ao_buffer[AO_DMA_RING_COUNT]; /* dma buffers for analog output */
1066 dma_addr_t ao_buffer_bus_addr[AO_DMA_RING_COUNT]; /* physical addresses of ao dma buffers */
1067 struct plx_dma_desc *ao_dma_desc;
1068 dma_addr_t ao_dma_desc_bus_addr;
1069 volatile unsigned int ao_dma_index; /* keeps track of buffer where the next ao sample should go */
1070 volatile unsigned long ao_count; /* number of analog output samples remaining */
1071 volatile unsigned int ao_value[2]; /* remember what the analog outputs are set to, to allow readback */
1072 unsigned int hw_revision; /* stc chip hardware revision number */
1073 volatile unsigned int intr_enable_bits; /* last bits sent to INTR_ENABLE_REG register */
1074 volatile uint16_t adc_control1_bits; /* last bits sent to ADC_CONTROL1_REG register */
1075 volatile uint16_t fifo_size_bits; /* last bits sent to FIFO_SIZE_REG register */
1076 volatile uint16_t hw_config_bits; /* last bits sent to HW_CONFIG_REG register */
1077 volatile uint16_t dac_control1_bits;
1078 volatile uint32_t plx_control_bits; /* last bits written to plx9080 control register */
1079 volatile uint32_t plx_intcsr_bits; /* last bits written to plx interrupt control and status register */
1080 volatile int calibration_source; /* index of calibration source readable through ai ch0 */
1081 volatile uint8_t i2c_cal_range_bits; /* bits written to i2c calibration/range register */
1082 volatile unsigned int ext_trig_falling; /* configure digital triggers to trigger on falling edge */
1083 /* states of various devices stored to enable read-back */
1084 unsigned int ad8402_state[2];
1085 unsigned int caldac_state[8];
1086 volatile short ai_cmd_running;
1087 unsigned int ai_fifo_segment_length;
1088 struct ext_clock_info ext_clock;
1089 short ao_bounce_buffer[DAC_FIFO_SIZE];
1092 static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1093 struct comedi_insn *insn, unsigned int *data);
1094 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
1095 struct comedi_insn *insn, unsigned int *data);
1096 static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1097 struct comedi_insn *insn, unsigned int *data);
1098 static int ao_readback_insn(struct comedi_device *dev,
1099 struct comedi_subdevice *s,
1100 struct comedi_insn *insn, unsigned int *data);
1101 static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1102 static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1103 struct comedi_cmd *cmd);
1104 static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
1105 static int ao_inttrig(struct comedi_device *dev,
1106 struct comedi_subdevice *subdev, unsigned int trig_num);
1107 static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
1108 struct comedi_cmd *cmd);
1109 static irqreturn_t handle_interrupt(int irq, void *d);
1110 static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1111 static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
1112 static int dio_callback(int dir, int port, int data, unsigned long arg);
1113 static int dio_callback_4020(int dir, int port, int data, unsigned long arg);
1114 static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
1115 struct comedi_insn *insn, unsigned int *data);
1116 static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1117 struct comedi_insn *insn, unsigned int *data);
1118 static int dio_60xx_config_insn(struct comedi_device *dev,
1119 struct comedi_subdevice *s,
1120 struct comedi_insn *insn, unsigned int *data);
1121 static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
1122 struct comedi_insn *insn, unsigned int *data);
1123 static int calib_read_insn(struct comedi_device *dev,
1124 struct comedi_subdevice *s, struct comedi_insn *insn,
1125 unsigned int *data);
1126 static int calib_write_insn(struct comedi_device *dev,
1127 struct comedi_subdevice *s,
1128 struct comedi_insn *insn, unsigned int *data);
1129 static int ad8402_read_insn(struct comedi_device *dev,
1130 struct comedi_subdevice *s,
1131 struct comedi_insn *insn, unsigned int *data);
1132 static void ad8402_write(struct comedi_device *dev, unsigned int channel,
1133 unsigned int value);
1134 static int ad8402_write_insn(struct comedi_device *dev,
1135 struct comedi_subdevice *s,
1136 struct comedi_insn *insn, unsigned int *data);
1137 static int eeprom_read_insn(struct comedi_device *dev,
1138 struct comedi_subdevice *s,
1139 struct comedi_insn *insn, unsigned int *data);
1140 static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
1141 static unsigned int get_divisor(unsigned int ns, unsigned int flags);
1142 static void i2c_write(struct comedi_device *dev, unsigned int address,
1143 const uint8_t *data, unsigned int length);
1144 static void caldac_write(struct comedi_device *dev, unsigned int channel,
1145 unsigned int value);
1146 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
1148 /* static int dac_1590_write(struct comedi_device *dev, unsigned int dac_a, unsigned int dac_b); */
1149 static int caldac_i2c_write(struct comedi_device *dev,
1150 unsigned int caldac_channel, unsigned int value);
1151 static void abort_dma(struct comedi_device *dev, unsigned int channel);
1152 static void disable_plx_interrupts(struct comedi_device *dev);
1153 static int set_ai_fifo_size(struct comedi_device *dev,
1154 unsigned int num_samples);
1155 static unsigned int ai_fifo_size(struct comedi_device *dev);
1156 static int set_ai_fifo_segment_length(struct comedi_device *dev,
1157 unsigned int num_entries);
1158 static void disable_ai_pacing(struct comedi_device *dev);
1159 static void disable_ai_interrupts(struct comedi_device *dev);
1160 static void enable_ai_interrupts(struct comedi_device *dev,
1161 const struct comedi_cmd *cmd);
1162 static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags);
1163 static void load_ao_dma(struct comedi_device *dev,
1164 const struct comedi_cmd *cmd);
1166 static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
1167 unsigned int range_index)
1169 const struct comedi_krange *range =
1170 &board(dev)->ai_range_table->range[range_index];
1171 unsigned int bits = 0;
1173 switch (range->max) {
1202 comedi_error(dev, "bug! in ai_range_bits_6xxx");
1205 if (range->min == 0)
1210 static unsigned int hw_revision(const struct comedi_device *dev,
1211 uint16_t hw_status_bits)
1213 if (board(dev)->layout == LAYOUT_4020)
1214 return (hw_status_bits >> 13) & 0x7;
1216 return (hw_status_bits >> 12) & 0xf;
1219 static void set_dac_range_bits(struct comedi_device *dev,
1220 volatile uint16_t *bits, unsigned int channel,
1223 unsigned int code = board(dev)->ao_range_code[range];
1226 comedi_error(dev, "bug! bad channel?");
1228 comedi_error(dev, "bug! bad range code?");
1230 *bits &= ~(0x3 << (2 * channel));
1231 *bits |= code << (2 * channel);
1234 static inline int ao_cmd_is_supported(const struct pcidas64_board *board)
1236 return board->ao_nchan && board->layout != LAYOUT_4020;
1239 /* initialize plx9080 chip */
1240 static void init_plx9080(struct comedi_device *dev)
1242 struct pcidas64_private *devpriv = dev->private;
1244 void __iomem *plx_iobase = devpriv->plx9080_iobase;
1246 devpriv->plx_control_bits =
1247 readl(devpriv->plx9080_iobase + PLX_CONTROL_REG);
1250 DEBUG_PRINT(" plx interrupt status 0x%x\n",
1251 readl(plx_iobase + PLX_INTRCS_REG));
1252 DEBUG_PRINT(" plx id bits 0x%x\n", readl(plx_iobase + PLX_ID_REG));
1253 DEBUG_PRINT(" plx control reg 0x%x\n", devpriv->plx_control_bits);
1254 DEBUG_PRINT(" plx mode/arbitration reg 0x%x\n",
1255 readl(plx_iobase + PLX_MARB_REG));
1256 DEBUG_PRINT(" plx region0 reg 0x%x\n",
1257 readl(plx_iobase + PLX_REGION0_REG));
1258 DEBUG_PRINT(" plx region1 reg 0x%x\n",
1259 readl(plx_iobase + PLX_REGION1_REG));
1261 DEBUG_PRINT(" plx revision 0x%x\n",
1262 readl(plx_iobase + PLX_REVISION_REG));
1263 DEBUG_PRINT(" plx dma channel 0 mode 0x%x\n",
1264 readl(plx_iobase + PLX_DMA0_MODE_REG));
1265 DEBUG_PRINT(" plx dma channel 1 mode 0x%x\n",
1266 readl(plx_iobase + PLX_DMA1_MODE_REG));
1267 DEBUG_PRINT(" plx dma channel 0 pci address 0x%x\n",
1268 readl(plx_iobase + PLX_DMA0_PCI_ADDRESS_REG));
1269 DEBUG_PRINT(" plx dma channel 0 local address 0x%x\n",
1270 readl(plx_iobase + PLX_DMA0_LOCAL_ADDRESS_REG));
1271 DEBUG_PRINT(" plx dma channel 0 transfer size 0x%x\n",
1272 readl(plx_iobase + PLX_DMA0_TRANSFER_SIZE_REG));
1273 DEBUG_PRINT(" plx dma channel 0 descriptor 0x%x\n",
1274 readl(plx_iobase + PLX_DMA0_DESCRIPTOR_REG));
1275 DEBUG_PRINT(" plx dma channel 0 command status 0x%x\n",
1276 readb(plx_iobase + PLX_DMA0_CS_REG));
1277 DEBUG_PRINT(" plx dma channel 0 threshold 0x%x\n",
1278 readl(plx_iobase + PLX_DMA0_THRESHOLD_REG));
1279 DEBUG_PRINT(" plx bigend 0x%x\n", readl(plx_iobase + PLX_BIGEND_REG));
1282 bits = BIGEND_DMA0 | BIGEND_DMA1;
1286 writel(bits, devpriv->plx9080_iobase + PLX_BIGEND_REG);
1288 disable_plx_interrupts(dev);
1293 /* configure dma0 mode */
1295 /* enable ready input, not sure if this is necessary */
1296 bits |= PLX_DMA_EN_READYIN_BIT;
1297 /* enable bterm, not sure if this is necessary */
1298 bits |= PLX_EN_BTERM_BIT;
1299 /* enable dma chaining */
1300 bits |= PLX_EN_CHAIN_BIT;
1301 /* enable interrupt on dma done (probably don't need this, since chain never finishes) */
1302 bits |= PLX_EN_DMA_DONE_INTR_BIT;
1303 /* don't increment local address during transfers (we are transferring from a fixed fifo register) */
1304 bits |= PLX_LOCAL_ADDR_CONST_BIT;
1305 /* route dma interrupt to pci bus */
1306 bits |= PLX_DMA_INTR_PCI_BIT;
1307 /* enable demand mode */
1308 bits |= PLX_DEMAND_MODE_BIT;
1309 /* enable local burst mode */
1310 bits |= PLX_DMA_LOCAL_BURST_EN_BIT;
1311 /* 4020 uses 32 bit dma */
1312 if (board(dev)->layout == LAYOUT_4020) {
1313 bits |= PLX_LOCAL_BUS_32_WIDE_BITS;
1314 } else { /* localspace0 bus is 16 bits wide */
1315 bits |= PLX_LOCAL_BUS_16_WIDE_BITS;
1317 writel(bits, plx_iobase + PLX_DMA1_MODE_REG);
1318 if (ao_cmd_is_supported(board(dev)))
1319 writel(bits, plx_iobase + PLX_DMA0_MODE_REG);
1321 /* enable interrupts on plx 9080 */
1322 devpriv->plx_intcsr_bits |=
1323 ICS_AERR | ICS_PERR | ICS_PIE | ICS_PLIE | ICS_PAIE | ICS_LIE |
1324 ICS_DMA0_E | ICS_DMA1_E;
1325 writel(devpriv->plx_intcsr_bits,
1326 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1329 /* Allocate and initialize the subdevice structures.
1331 static int setup_subdevices(struct comedi_device *dev)
1333 struct pcidas64_private *devpriv = dev->private;
1334 struct comedi_subdevice *s;
1335 void __iomem *dio_8255_iobase;
1339 ret = comedi_alloc_subdevices(dev, 10);
1343 s = &dev->subdevices[0];
1344 /* analog input subdevice */
1345 dev->read_subdev = s;
1346 s->type = COMEDI_SUBD_AI;
1347 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DITHER | SDF_CMD_READ;
1348 if (board(dev)->layout == LAYOUT_60XX)
1349 s->subdev_flags |= SDF_COMMON | SDF_DIFF;
1350 else if (board(dev)->layout == LAYOUT_64XX)
1351 s->subdev_flags |= SDF_DIFF;
1352 /* XXX Number of inputs in differential mode is ignored */
1353 s->n_chan = board(dev)->ai_se_chans;
1354 s->len_chanlist = 0x2000;
1355 s->maxdata = (1 << board(dev)->ai_bits) - 1;
1356 s->range_table = board(dev)->ai_range_table;
1357 s->insn_read = ai_rinsn;
1358 s->insn_config = ai_config_insn;
1360 s->do_cmdtest = ai_cmdtest;
1361 s->cancel = ai_cancel;
1362 if (board(dev)->layout == LAYOUT_4020) {
1364 /* set adc to read from inputs (not internal calibration sources) */
1365 devpriv->i2c_cal_range_bits = adc_src_4020_bits(4);
1366 /* set channels to +-5 volt input ranges */
1367 for (i = 0; i < s->n_chan; i++)
1368 devpriv->i2c_cal_range_bits |= attenuate_bit(i);
1369 data = devpriv->i2c_cal_range_bits;
1370 i2c_write(dev, RANGE_CAL_I2C_ADDR, &data, sizeof(data));
1373 /* analog output subdevice */
1374 s = &dev->subdevices[1];
1375 if (board(dev)->ao_nchan) {
1376 s->type = COMEDI_SUBD_AO;
1378 SDF_READABLE | SDF_WRITABLE | SDF_GROUND | SDF_CMD_WRITE;
1379 s->n_chan = board(dev)->ao_nchan;
1380 s->maxdata = (1 << board(dev)->ao_bits) - 1;
1381 s->range_table = board(dev)->ao_range_table;
1382 s->insn_read = ao_readback_insn;
1383 s->insn_write = ao_winsn;
1384 if (ao_cmd_is_supported(board(dev))) {
1385 dev->write_subdev = s;
1386 s->do_cmdtest = ao_cmdtest;
1388 s->len_chanlist = board(dev)->ao_nchan;
1389 s->cancel = ao_cancel;
1392 s->type = COMEDI_SUBD_UNUSED;
1396 s = &dev->subdevices[2];
1397 if (board(dev)->layout == LAYOUT_64XX) {
1398 s->type = COMEDI_SUBD_DI;
1399 s->subdev_flags = SDF_READABLE;
1402 s->range_table = &range_digital;
1403 s->insn_bits = di_rbits;
1405 s->type = COMEDI_SUBD_UNUSED;
1407 /* digital output */
1408 if (board(dev)->layout == LAYOUT_64XX) {
1409 s = &dev->subdevices[3];
1410 s->type = COMEDI_SUBD_DO;
1411 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1414 s->range_table = &range_digital;
1415 s->insn_bits = do_wbits;
1417 s->type = COMEDI_SUBD_UNUSED;
1420 s = &dev->subdevices[4];
1421 if (board(dev)->has_8255) {
1422 if (board(dev)->layout == LAYOUT_4020) {
1424 devpriv->main_iobase + I8255_4020_REG;
1425 subdev_8255_init(dev, s, dio_callback_4020,
1426 (unsigned long)dio_8255_iobase);
1429 devpriv->dio_counter_iobase + DIO_8255_OFFSET;
1430 subdev_8255_init(dev, s, dio_callback,
1431 (unsigned long)dio_8255_iobase);
1434 s->type = COMEDI_SUBD_UNUSED;
1436 /* 8 channel dio for 60xx */
1437 s = &dev->subdevices[5];
1438 if (board(dev)->layout == LAYOUT_60XX) {
1439 s->type = COMEDI_SUBD_DIO;
1440 s->subdev_flags = SDF_WRITABLE | SDF_READABLE;
1443 s->range_table = &range_digital;
1444 s->insn_config = dio_60xx_config_insn;
1445 s->insn_bits = dio_60xx_wbits;
1447 s->type = COMEDI_SUBD_UNUSED;
1450 s = &dev->subdevices[6];
1451 s->type = COMEDI_SUBD_CALIB;
1452 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1454 if (board(dev)->layout == LAYOUT_4020)
1458 s->insn_read = calib_read_insn;
1459 s->insn_write = calib_write_insn;
1460 for (i = 0; i < s->n_chan; i++)
1461 caldac_write(dev, i, s->maxdata / 2);
1463 /* 2 channel ad8402 potentiometer */
1464 s = &dev->subdevices[7];
1465 if (board(dev)->layout == LAYOUT_64XX) {
1466 s->type = COMEDI_SUBD_CALIB;
1467 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1469 s->insn_read = ad8402_read_insn;
1470 s->insn_write = ad8402_write_insn;
1472 for (i = 0; i < s->n_chan; i++)
1473 ad8402_write(dev, i, s->maxdata / 2);
1475 s->type = COMEDI_SUBD_UNUSED;
1477 /* serial EEPROM, if present */
1478 s = &dev->subdevices[8];
1479 if (readl(devpriv->plx9080_iobase + PLX_CONTROL_REG) & CTL_EECHK) {
1480 s->type = COMEDI_SUBD_MEMORY;
1481 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
1483 s->maxdata = 0xffff;
1484 s->insn_read = eeprom_read_insn;
1486 s->type = COMEDI_SUBD_UNUSED;
1488 /* user counter subd XXX */
1489 s = &dev->subdevices[9];
1490 s->type = COMEDI_SUBD_UNUSED;
1495 static void disable_plx_interrupts(struct comedi_device *dev)
1497 struct pcidas64_private *devpriv = dev->private;
1499 devpriv->plx_intcsr_bits = 0;
1500 writel(devpriv->plx_intcsr_bits,
1501 devpriv->plx9080_iobase + PLX_INTRCS_REG);
1504 static void init_stc_registers(struct comedi_device *dev)
1506 struct pcidas64_private *devpriv = dev->private;
1508 unsigned long flags;
1510 spin_lock_irqsave(&dev->spinlock, flags);
1512 /* bit should be set for 6025, although docs say boards with <= 16 chans should be cleared XXX */
1514 devpriv->adc_control1_bits |= ADC_QUEUE_CONFIG_BIT;
1515 writew(devpriv->adc_control1_bits,
1516 devpriv->main_iobase + ADC_CONTROL1_REG);
1518 /* 6402/16 manual says this register must be initialized to 0xff? */
1519 writew(0xff, devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1521 bits = SLOW_DAC_BIT | DMA_CH_SELECT_BIT;
1522 if (board(dev)->layout == LAYOUT_4020)
1523 bits |= INTERNAL_CLOCK_4020_BITS;
1524 devpriv->hw_config_bits |= bits;
1525 writew(devpriv->hw_config_bits,
1526 devpriv->main_iobase + HW_CONFIG_REG);
1528 writew(0, devpriv->main_iobase + DAQ_SYNC_REG);
1529 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1531 spin_unlock_irqrestore(&dev->spinlock, flags);
1533 /* set fifos to maximum size */
1534 devpriv->fifo_size_bits |= DAC_FIFO_BITS;
1535 set_ai_fifo_segment_length(dev,
1536 board(dev)->ai_fifo->max_segment_length);
1538 devpriv->dac_control1_bits = DAC_OUTPUT_ENABLE_BIT;
1539 devpriv->intr_enable_bits = /* EN_DAC_INTR_SRC_BIT | DAC_INTR_QEMPTY_BITS | */
1540 EN_DAC_DONE_INTR_BIT | EN_DAC_UNDERRUN_BIT;
1541 writew(devpriv->intr_enable_bits,
1542 devpriv->main_iobase + INTR_ENABLE_REG);
1544 disable_ai_pacing(dev);
1547 static int alloc_and_init_dma_members(struct comedi_device *dev)
1549 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1550 struct pcidas64_private *devpriv = dev->private;
1553 /* alocate pci dma buffers */
1554 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1555 devpriv->ai_buffer[i] =
1556 pci_alloc_consistent(pcidev, DMA_BUFFER_SIZE,
1557 &devpriv->ai_buffer_bus_addr[i]);
1558 if (devpriv->ai_buffer[i] == NULL)
1562 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1563 if (ao_cmd_is_supported(board(dev))) {
1564 devpriv->ao_buffer[i] =
1565 pci_alloc_consistent(pcidev,
1568 ao_buffer_bus_addr[i]);
1569 if (devpriv->ao_buffer[i] == NULL)
1574 /* allocate dma descriptors */
1575 devpriv->ai_dma_desc =
1576 pci_alloc_consistent(pcidev,
1577 sizeof(struct plx_dma_desc) *
1578 ai_dma_ring_count(board(dev)),
1579 &devpriv->ai_dma_desc_bus_addr);
1580 if (devpriv->ai_dma_desc == NULL)
1583 DEBUG_PRINT("ai dma descriptors start at bus addr 0x%x\n",
1584 devpriv->ai_dma_desc_bus_addr);
1585 if (ao_cmd_is_supported(board(dev))) {
1586 devpriv->ao_dma_desc =
1587 pci_alloc_consistent(pcidev,
1588 sizeof(struct plx_dma_desc) *
1590 &devpriv->ao_dma_desc_bus_addr);
1591 if (devpriv->ao_dma_desc == NULL)
1594 DEBUG_PRINT("ao dma descriptors start at bus addr 0x%x\n",
1595 devpriv->ao_dma_desc_bus_addr);
1597 /* initialize dma descriptors */
1598 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1599 devpriv->ai_dma_desc[i].pci_start_addr =
1600 cpu_to_le32(devpriv->ai_buffer_bus_addr[i]);
1601 if (board(dev)->layout == LAYOUT_4020)
1602 devpriv->ai_dma_desc[i].local_start_addr =
1603 cpu_to_le32(devpriv->local1_iobase +
1606 devpriv->ai_dma_desc[i].local_start_addr =
1607 cpu_to_le32(devpriv->local0_iobase +
1609 devpriv->ai_dma_desc[i].transfer_size = cpu_to_le32(0);
1610 devpriv->ai_dma_desc[i].next =
1611 cpu_to_le32((devpriv->ai_dma_desc_bus_addr + ((i +
1616 sizeof(devpriv->ai_dma_desc[0])) |
1617 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT |
1618 PLX_XFER_LOCAL_TO_PCI);
1620 if (ao_cmd_is_supported(board(dev))) {
1621 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1622 devpriv->ao_dma_desc[i].pci_start_addr =
1623 cpu_to_le32(devpriv->ao_buffer_bus_addr[i]);
1624 devpriv->ao_dma_desc[i].local_start_addr =
1625 cpu_to_le32(devpriv->local0_iobase +
1627 devpriv->ao_dma_desc[i].transfer_size =
1629 devpriv->ao_dma_desc[i].next =
1630 cpu_to_le32((devpriv->ao_dma_desc_bus_addr +
1631 ((i + 1) % (AO_DMA_RING_COUNT)) *
1632 sizeof(devpriv->ao_dma_desc[0])) |
1633 PLX_DESC_IN_PCI_BIT |
1634 PLX_INTR_TERM_COUNT);
1640 static inline void warn_external_queue(struct comedi_device *dev)
1643 "AO command and AI external channel queue cannot be used simultaneously.");
1645 "Use internal AI channel queue (channels must be consecutive and use same range/aref)");
1648 static struct pci_dev *cb_pcidas64_find_pci_dev(struct comedi_device *dev,
1649 struct comedi_devconfig *it)
1651 struct pci_dev *pcidev = NULL;
1652 int bus = it->options[0];
1653 int slot = it->options[1];
1656 for_each_pci_dev(pcidev) {
1658 if (bus != pcidev->bus->number ||
1659 slot != PCI_SLOT(pcidev->devfn))
1662 if (pcidev->vendor != PCI_VENDOR_ID_CB)
1665 for (i = 0; i < ARRAY_SIZE(pcidas64_boards); i++) {
1666 if (pcidas64_boards[i].device_id != pcidev->device)
1668 dev->board_ptr = pcidas64_boards + i;
1672 dev_err(dev->class_dev,
1673 "No supported board found! (req. bus %d, slot %d)\n",
1679 * Attach is called by the Comedi core to configure the driver
1680 * for a particular board.
1682 static int attach(struct comedi_device *dev, struct comedi_devconfig *it)
1684 struct pcidas64_private *devpriv;
1685 struct pci_dev *pcidev;
1686 uint32_t local_range, local_decode;
1689 devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
1692 dev->private = devpriv;
1694 pcidev = cb_pcidas64_find_pci_dev(dev, it);
1697 comedi_set_hw_dev(dev, &pcidev->dev);
1699 if (comedi_pci_enable(pcidev, dev->driver->driver_name)) {
1700 dev_warn(dev->class_dev,
1701 "failed to enable PCI device and request regions\n");
1704 pci_set_master(pcidev);
1706 /* Initialize dev->board_name */
1707 dev->board_name = board(dev)->name;
1709 dev->iobase = pci_resource_start(pcidev, MAIN_BADDRINDEX);
1711 devpriv->plx9080_phys_iobase =
1712 pci_resource_start(pcidev, PLX9080_BADDRINDEX);
1713 devpriv->main_phys_iobase = dev->iobase;
1714 devpriv->dio_counter_phys_iobase =
1715 pci_resource_start(pcidev, DIO_COUNTER_BADDRINDEX);
1717 /* remap, won't work with 2.0 kernels but who cares */
1718 devpriv->plx9080_iobase = ioremap(devpriv->plx9080_phys_iobase,
1719 pci_resource_len(pcidev,
1720 PLX9080_BADDRINDEX));
1721 devpriv->main_iobase =
1722 ioremap(devpriv->main_phys_iobase,
1723 pci_resource_len(pcidev, MAIN_BADDRINDEX));
1724 devpriv->dio_counter_iobase =
1725 ioremap(devpriv->dio_counter_phys_iobase,
1726 pci_resource_len(pcidev, DIO_COUNTER_BADDRINDEX));
1728 if (!devpriv->plx9080_iobase || !devpriv->main_iobase
1729 || !devpriv->dio_counter_iobase) {
1730 dev_warn(dev->class_dev, "failed to remap io memory\n");
1734 DEBUG_PRINT(" plx9080 remapped to 0x%p\n", devpriv->plx9080_iobase);
1735 DEBUG_PRINT(" main remapped to 0x%p\n", devpriv->main_iobase);
1736 DEBUG_PRINT(" diocounter remapped to 0x%p\n",
1737 devpriv->dio_counter_iobase);
1739 /* figure out what local addresses are */
1741 readl(devpriv->plx9080_iobase + PLX_LAS0RNG_REG) & LRNG_MEM_MASK;
1743 readl(devpriv->plx9080_iobase +
1744 PLX_LAS0MAP_REG) & local_range & LMAP_MEM_MASK;
1745 devpriv->local0_iobase =
1746 ((uint32_t) devpriv->main_phys_iobase & ~local_range) |
1749 readl(devpriv->plx9080_iobase + PLX_LAS1RNG_REG) & LRNG_MEM_MASK;
1751 readl(devpriv->plx9080_iobase +
1752 PLX_LAS1MAP_REG) & local_range & LMAP_MEM_MASK;
1753 devpriv->local1_iobase =
1754 ((uint32_t) devpriv->dio_counter_phys_iobase & ~local_range) |
1757 DEBUG_PRINT(" local 0 io addr 0x%x\n", devpriv->local0_iobase);
1758 DEBUG_PRINT(" local 1 io addr 0x%x\n", devpriv->local1_iobase);
1760 retval = alloc_and_init_dma_members(dev);
1764 devpriv->hw_revision =
1765 hw_revision(dev, readw(devpriv->main_iobase + HW_STATUS_REG));
1766 dev_dbg(dev->class_dev, "stc hardware revision %i\n",
1767 devpriv->hw_revision);
1769 init_stc_registers(dev);
1771 if (request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED,
1772 "cb_pcidas64", dev)) {
1773 dev_dbg(dev->class_dev, "unable to allocate irq %u\n",
1777 dev->irq = pcidev->irq;
1778 dev_dbg(dev->class_dev, "irq %u\n", dev->irq);
1780 retval = setup_subdevices(dev);
1788 static void detach(struct comedi_device *dev)
1790 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
1791 struct pcidas64_private *devpriv = dev->private;
1795 free_irq(dev->irq, dev);
1798 if (devpriv->plx9080_iobase) {
1799 disable_plx_interrupts(dev);
1800 iounmap(devpriv->plx9080_iobase);
1802 if (devpriv->main_iobase)
1803 iounmap(devpriv->main_iobase);
1804 if (devpriv->dio_counter_iobase)
1805 iounmap(devpriv->dio_counter_iobase);
1806 /* free pci dma buffers */
1807 for (i = 0; i < ai_dma_ring_count(board(dev)); i++) {
1808 if (devpriv->ai_buffer[i])
1809 pci_free_consistent(pcidev,
1811 devpriv->ai_buffer[i],
1812 devpriv->ai_buffer_bus_addr[i]);
1814 for (i = 0; i < AO_DMA_RING_COUNT; i++) {
1815 if (devpriv->ao_buffer[i])
1816 pci_free_consistent(pcidev,
1818 devpriv->ao_buffer[i],
1819 devpriv->ao_buffer_bus_addr[i]);
1821 /* free dma descriptors */
1822 if (devpriv->ai_dma_desc)
1823 pci_free_consistent(pcidev,
1824 sizeof(struct plx_dma_desc) *
1825 ai_dma_ring_count(board(dev)),
1826 devpriv->ai_dma_desc,
1827 devpriv->ai_dma_desc_bus_addr);
1828 if (devpriv->ao_dma_desc)
1829 pci_free_consistent(pcidev,
1830 sizeof(struct plx_dma_desc) *
1832 devpriv->ao_dma_desc,
1833 devpriv->ao_dma_desc_bus_addr);
1836 if (dev->subdevices)
1837 subdev_8255_cleanup(dev, &dev->subdevices[4]);
1840 comedi_pci_disable(pcidev);
1842 pci_dev_put(pcidev);
1846 static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1847 struct comedi_insn *insn, unsigned int *data)
1849 struct pcidas64_private *devpriv = dev->private;
1850 unsigned int bits = 0, n, i;
1851 unsigned int channel, range, aref;
1852 unsigned long flags;
1853 static const int timeout = 100;
1855 DEBUG_PRINT("chanspec 0x%x\n", insn->chanspec);
1856 channel = CR_CHAN(insn->chanspec);
1857 range = CR_RANGE(insn->chanspec);
1858 aref = CR_AREF(insn->chanspec);
1860 /* disable card's analog input interrupt sources and pacing */
1861 /* 4020 generates dac done interrupts even though they are disabled */
1862 disable_ai_pacing(dev);
1864 spin_lock_irqsave(&dev->spinlock, flags);
1865 if (insn->chanspec & CR_ALT_FILTER)
1866 devpriv->adc_control1_bits |= ADC_DITHER_BIT;
1868 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
1869 writew(devpriv->adc_control1_bits,
1870 devpriv->main_iobase + ADC_CONTROL1_REG);
1871 spin_unlock_irqrestore(&dev->spinlock, flags);
1873 if (board(dev)->layout != LAYOUT_4020) {
1874 /* use internal queue */
1875 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
1876 writew(devpriv->hw_config_bits,
1877 devpriv->main_iobase + HW_CONFIG_REG);
1879 /* ALT_SOURCE is internal calibration reference */
1880 if (insn->chanspec & CR_ALT_SOURCE) {
1881 unsigned int cal_en_bit;
1883 DEBUG_PRINT("reading calibration source\n");
1884 if (board(dev)->layout == LAYOUT_60XX)
1885 cal_en_bit = CAL_EN_60XX_BIT;
1887 cal_en_bit = CAL_EN_64XX_BIT;
1888 /* select internal reference source to connect to channel 0 */
1890 adc_src_bits(devpriv->calibration_source),
1891 devpriv->main_iobase + CALIBRATION_REG);
1893 /* make sure internal calibration source is turned off */
1894 writew(0, devpriv->main_iobase + CALIBRATION_REG);
1896 /* load internal queue */
1899 bits |= ai_range_bits_6xxx(dev, CR_RANGE(insn->chanspec));
1900 /* set single-ended / differential */
1901 bits |= se_diff_bit_6xxx(dev, aref == AREF_DIFF);
1902 if (aref == AREF_COMMON)
1903 bits |= ADC_COMMON_BIT;
1904 bits |= adc_chan_bits(channel);
1905 /* set stop channel */
1906 writew(adc_chan_bits(channel),
1907 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
1908 /* set start channel, and rest of settings */
1909 writew(bits, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
1911 uint8_t old_cal_range_bits = devpriv->i2c_cal_range_bits;
1913 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
1914 if (insn->chanspec & CR_ALT_SOURCE) {
1915 DEBUG_PRINT("reading calibration source\n");
1916 devpriv->i2c_cal_range_bits |=
1917 adc_src_4020_bits(devpriv->calibration_source);
1918 } else { /* select BNC inputs */
1919 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
1923 devpriv->i2c_cal_range_bits |= attenuate_bit(channel);
1925 devpriv->i2c_cal_range_bits &=
1926 ~attenuate_bit(channel);
1927 /* update calibration/range i2c register only if necessary, as it is very slow */
1928 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
1929 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
1930 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
1934 /* 4020 manual asks that sample interval register to be set before writing to convert register.
1935 * Using somewhat arbitrary setting of 4 master clock ticks = 0.1 usec */
1937 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
1939 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
1942 for (n = 0; n < insn->n; n++) {
1944 /* clear adc buffer (inside loop for 4020 sake) */
1945 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
1947 /* trigger conversion, bits sent only matter for 4020 */
1948 writew(adc_convert_chan_4020_bits(CR_CHAN(insn->chanspec)),
1949 devpriv->main_iobase + ADC_CONVERT_REG);
1952 for (i = 0; i < timeout; i++) {
1953 bits = readw(devpriv->main_iobase + HW_STATUS_REG);
1954 DEBUG_PRINT(" pipe bits 0x%x\n", pipe_full_bits(bits));
1955 if (board(dev)->layout == LAYOUT_4020) {
1956 if (readw(devpriv->main_iobase +
1957 ADC_WRITE_PNTR_REG))
1960 if (pipe_full_bits(bits))
1965 DEBUG_PRINT(" looped %i times waiting for data\n", i);
1967 comedi_error(dev, " analog input read insn timed out");
1968 printk(" status 0x%x\n", bits);
1971 if (board(dev)->layout == LAYOUT_4020)
1973 readl(devpriv->dio_counter_iobase +
1974 ADC_FIFO_REG) & 0xffff;
1977 readw(devpriv->main_iobase + PIPE1_READ_REG);
1983 static int ai_config_calibration_source(struct comedi_device *dev,
1986 struct pcidas64_private *devpriv = dev->private;
1987 unsigned int source = data[1];
1988 int num_calibration_sources;
1990 if (board(dev)->layout == LAYOUT_60XX)
1991 num_calibration_sources = 16;
1993 num_calibration_sources = 8;
1994 if (source >= num_calibration_sources) {
1995 dev_dbg(dev->class_dev, "invalid calibration source: %i\n",
2000 DEBUG_PRINT("setting calibration source to %i\n", source);
2001 devpriv->calibration_source = source;
2006 static int ai_config_block_size(struct comedi_device *dev, unsigned int *data)
2009 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
2010 unsigned int block_size, requested_block_size;
2013 requested_block_size = data[1];
2015 if (requested_block_size) {
2017 requested_block_size * fifo->num_segments / bytes_in_sample;
2019 retval = set_ai_fifo_size(dev, fifo_size);
2025 block_size = ai_fifo_size(dev) / fifo->num_segments * bytes_in_sample;
2027 data[1] = block_size;
2032 static int ai_config_master_clock_4020(struct comedi_device *dev,
2035 struct pcidas64_private *devpriv = dev->private;
2036 unsigned int divisor = data[4];
2045 case COMEDI_EV_SCAN_BEGIN:
2046 devpriv->ext_clock.divisor = divisor;
2047 devpriv->ext_clock.chanspec = data[2];
2056 return retval ? retval : 5;
2059 /* XXX could add support for 60xx series */
2060 static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data)
2063 switch (board(dev)->layout) {
2065 return ai_config_master_clock_4020(dev, data);
2075 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
2076 struct comedi_insn *insn, unsigned int *data)
2081 case INSN_CONFIG_ALT_SOURCE:
2082 return ai_config_calibration_source(dev, data);
2084 case INSN_CONFIG_BLOCK_SIZE:
2085 return ai_config_block_size(dev, data);
2087 case INSN_CONFIG_TIMER_1:
2088 return ai_config_master_clock(dev, data);
2097 static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
2098 struct comedi_cmd *cmd)
2101 unsigned int tmp_arg, tmp_arg2;
2104 unsigned int triggers;
2106 /* Step 1 : check if triggers are trivially valid */
2108 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
2110 triggers = TRIG_TIMER;
2111 if (board(dev)->layout == LAYOUT_4020)
2112 triggers |= TRIG_OTHER;
2114 triggers |= TRIG_FOLLOW;
2115 err |= cfc_check_trigger_src(&cmd->scan_begin_src, triggers);
2117 triggers = TRIG_TIMER;
2118 if (board(dev)->layout == LAYOUT_4020)
2119 triggers |= TRIG_NOW;
2121 triggers |= TRIG_EXT;
2122 err |= cfc_check_trigger_src(&cmd->convert_src, triggers);
2124 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
2125 err |= cfc_check_trigger_src(&cmd->stop_src,
2126 TRIG_COUNT | TRIG_EXT | TRIG_NONE);
2131 /* Step 2a : make sure trigger sources are unique */
2133 err |= cfc_check_trigger_is_unique(cmd->start_src);
2134 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
2135 err |= cfc_check_trigger_is_unique(cmd->convert_src);
2136 err |= cfc_check_trigger_is_unique(cmd->stop_src);
2138 /* Step 2b : and mutually compatible */
2140 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
2142 if (cmd->stop_src != TRIG_COUNT &&
2143 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
2149 /* step 3: make sure arguments are trivially compatible */
2151 if (cmd->convert_src == TRIG_TIMER) {
2152 if (board(dev)->layout == LAYOUT_4020) {
2153 if (cmd->convert_arg) {
2154 cmd->convert_arg = 0;
2158 if (cmd->convert_arg < board(dev)->ai_speed) {
2159 cmd->convert_arg = board(dev)->ai_speed;
2162 if (cmd->scan_begin_src == TRIG_TIMER) {
2163 /* if scans are timed faster than conversion rate allows */
2164 if (cmd->convert_arg * cmd->chanlist_len >
2165 cmd->scan_begin_arg) {
2166 cmd->scan_begin_arg =
2175 if (!cmd->chanlist_len) {
2176 cmd->chanlist_len = 1;
2179 if (cmd->scan_end_arg != cmd->chanlist_len) {
2180 cmd->scan_end_arg = cmd->chanlist_len;
2184 switch (cmd->stop_src) {
2188 if (!cmd->stop_arg) {
2194 if (cmd->stop_arg != 0) {
2206 /* step 4: fix up any arguments */
2208 if (cmd->convert_src == TRIG_TIMER) {
2209 tmp_arg = cmd->convert_arg;
2210 tmp_arg2 = cmd->scan_begin_arg;
2211 check_adc_timing(dev, cmd);
2212 if (tmp_arg != cmd->convert_arg)
2214 if (tmp_arg2 != cmd->scan_begin_arg)
2221 /* make sure user is doesn't change analog reference mid chanlist */
2222 if (cmd->chanlist) {
2223 aref = CR_AREF(cmd->chanlist[0]);
2224 for (i = 1; i < cmd->chanlist_len; i++) {
2225 if (aref != CR_AREF(cmd->chanlist[i])) {
2227 "all elements in chanlist must use the same analog reference");
2232 /* check 4020 chanlist */
2233 if (board(dev)->layout == LAYOUT_4020) {
2234 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
2235 for (i = 1; i < cmd->chanlist_len; i++) {
2236 if (CR_CHAN(cmd->chanlist[i]) !=
2237 first_channel + i) {
2239 "chanlist must use consecutive channels");
2244 if (cmd->chanlist_len == 3) {
2246 "chanlist cannot be 3 channels long, use 1, 2, or 4 channels");
2258 static int use_hw_sample_counter(struct comedi_cmd *cmd)
2260 /* disable for now until I work out a race */
2263 if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value)
2269 static void setup_sample_counters(struct comedi_device *dev,
2270 struct comedi_cmd *cmd)
2272 struct pcidas64_private *devpriv = dev->private;
2274 if (cmd->stop_src == TRIG_COUNT) {
2275 /* set software count */
2276 devpriv->ai_count = cmd->stop_arg * cmd->chanlist_len;
2278 /* load hardware conversion counter */
2279 if (use_hw_sample_counter(cmd)) {
2280 writew(cmd->stop_arg & 0xffff,
2281 devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2282 writew((cmd->stop_arg >> 16) & 0xff,
2283 devpriv->main_iobase + ADC_COUNT_UPPER_REG);
2285 writew(1, devpriv->main_iobase + ADC_COUNT_LOWER_REG);
2289 static inline unsigned int dma_transfer_size(struct comedi_device *dev)
2291 struct pcidas64_private *devpriv = dev->private;
2292 unsigned int num_samples;
2295 devpriv->ai_fifo_segment_length *
2296 board(dev)->ai_fifo->sample_packing_ratio;
2297 if (num_samples > DMA_BUFFER_SIZE / sizeof(uint16_t))
2298 num_samples = DMA_BUFFER_SIZE / sizeof(uint16_t);
2303 static void disable_ai_pacing(struct comedi_device *dev)
2305 struct pcidas64_private *devpriv = dev->private;
2306 unsigned long flags;
2308 disable_ai_interrupts(dev);
2310 spin_lock_irqsave(&dev->spinlock, flags);
2311 devpriv->adc_control1_bits &= ~ADC_SW_GATE_BIT;
2312 writew(devpriv->adc_control1_bits,
2313 devpriv->main_iobase + ADC_CONTROL1_REG);
2314 spin_unlock_irqrestore(&dev->spinlock, flags);
2316 /* disable pacing, triggering, etc */
2317 writew(ADC_DMA_DISABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT,
2318 devpriv->main_iobase + ADC_CONTROL0_REG);
2321 static void disable_ai_interrupts(struct comedi_device *dev)
2323 struct pcidas64_private *devpriv = dev->private;
2324 unsigned long flags;
2326 spin_lock_irqsave(&dev->spinlock, flags);
2327 devpriv->intr_enable_bits &=
2328 ~EN_ADC_INTR_SRC_BIT & ~EN_ADC_DONE_INTR_BIT &
2329 ~EN_ADC_ACTIVE_INTR_BIT & ~EN_ADC_STOP_INTR_BIT &
2330 ~EN_ADC_OVERRUN_BIT & ~ADC_INTR_SRC_MASK;
2331 writew(devpriv->intr_enable_bits,
2332 devpriv->main_iobase + INTR_ENABLE_REG);
2333 spin_unlock_irqrestore(&dev->spinlock, flags);
2335 DEBUG_PRINT("intr enable bits 0x%x\n", devpriv->intr_enable_bits);
2338 static void enable_ai_interrupts(struct comedi_device *dev,
2339 const struct comedi_cmd *cmd)
2341 struct pcidas64_private *devpriv = dev->private;
2343 unsigned long flags;
2345 bits = EN_ADC_OVERRUN_BIT | EN_ADC_DONE_INTR_BIT |
2346 EN_ADC_ACTIVE_INTR_BIT | EN_ADC_STOP_INTR_BIT;
2347 /* Use pio transfer and interrupt on end of conversion if TRIG_WAKE_EOS flag is set. */
2348 if (cmd->flags & TRIG_WAKE_EOS) {
2349 /* 4020 doesn't support pio transfers except for fifo dregs */
2350 if (board(dev)->layout != LAYOUT_4020)
2351 bits |= ADC_INTR_EOSCAN_BITS | EN_ADC_INTR_SRC_BIT;
2353 spin_lock_irqsave(&dev->spinlock, flags);
2354 devpriv->intr_enable_bits |= bits;
2355 writew(devpriv->intr_enable_bits,
2356 devpriv->main_iobase + INTR_ENABLE_REG);
2357 DEBUG_PRINT("intr enable bits 0x%x\n", devpriv->intr_enable_bits);
2358 spin_unlock_irqrestore(&dev->spinlock, flags);
2361 static uint32_t ai_convert_counter_6xxx(const struct comedi_device *dev,
2362 const struct comedi_cmd *cmd)
2364 /* supposed to load counter with desired divisor minus 3 */
2365 return cmd->convert_arg / TIMER_BASE - 3;
2368 static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev,
2369 struct comedi_cmd *cmd)
2372 /* figure out how long we need to delay at end of scan */
2373 switch (cmd->scan_begin_src) {
2375 count = (cmd->scan_begin_arg -
2376 (cmd->convert_arg * (cmd->chanlist_len - 1)))
2380 count = cmd->convert_arg / TIMER_BASE;
2389 static uint32_t ai_convert_counter_4020(struct comedi_device *dev,
2390 struct comedi_cmd *cmd)
2392 struct pcidas64_private *devpriv = dev->private;
2393 unsigned int divisor;
2395 switch (cmd->scan_begin_src) {
2397 divisor = cmd->scan_begin_arg / TIMER_BASE;
2400 divisor = devpriv->ext_clock.divisor;
2402 default: /* should never happen */
2403 comedi_error(dev, "bug! failed to set ai pacing!");
2408 /* supposed to load counter with desired divisor minus 2 for 4020 */
2412 static void select_master_clock_4020(struct comedi_device *dev,
2413 const struct comedi_cmd *cmd)
2415 struct pcidas64_private *devpriv = dev->private;
2417 /* select internal/external master clock */
2418 devpriv->hw_config_bits &= ~MASTER_CLOCK_4020_MASK;
2419 if (cmd->scan_begin_src == TRIG_OTHER) {
2420 int chanspec = devpriv->ext_clock.chanspec;
2422 if (CR_CHAN(chanspec))
2423 devpriv->hw_config_bits |= BNC_CLOCK_4020_BITS;
2425 devpriv->hw_config_bits |= EXT_CLOCK_4020_BITS;
2427 devpriv->hw_config_bits |= INTERNAL_CLOCK_4020_BITS;
2429 writew(devpriv->hw_config_bits,
2430 devpriv->main_iobase + HW_CONFIG_REG);
2433 static void select_master_clock(struct comedi_device *dev,
2434 const struct comedi_cmd *cmd)
2436 switch (board(dev)->layout) {
2438 select_master_clock_4020(dev, cmd);
2445 static inline void dma_start_sync(struct comedi_device *dev,
2446 unsigned int channel)
2448 struct pcidas64_private *devpriv = dev->private;
2449 unsigned long flags;
2451 /* spinlock for plx dma control/status reg */
2452 spin_lock_irqsave(&dev->spinlock, flags);
2454 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2455 PLX_CLEAR_DMA_INTR_BIT,
2456 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2458 writeb(PLX_DMA_EN_BIT | PLX_DMA_START_BIT |
2459 PLX_CLEAR_DMA_INTR_BIT,
2460 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
2461 spin_unlock_irqrestore(&dev->spinlock, flags);
2464 static void set_ai_pacing(struct comedi_device *dev, struct comedi_cmd *cmd)
2466 struct pcidas64_private *devpriv = dev->private;
2467 uint32_t convert_counter = 0, scan_counter = 0;
2469 check_adc_timing(dev, cmd);
2471 select_master_clock(dev, cmd);
2473 if (board(dev)->layout == LAYOUT_4020) {
2474 convert_counter = ai_convert_counter_4020(dev, cmd);
2476 convert_counter = ai_convert_counter_6xxx(dev, cmd);
2477 scan_counter = ai_scan_counter_6xxx(dev, cmd);
2480 /* load lower 16 bits of convert interval */
2481 writew(convert_counter & 0xffff,
2482 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_LOWER_REG);
2483 DEBUG_PRINT("convert counter 0x%x\n", convert_counter);
2484 /* load upper 8 bits of convert interval */
2485 writew((convert_counter >> 16) & 0xff,
2486 devpriv->main_iobase + ADC_SAMPLE_INTERVAL_UPPER_REG);
2487 /* load lower 16 bits of scan delay */
2488 writew(scan_counter & 0xffff,
2489 devpriv->main_iobase + ADC_DELAY_INTERVAL_LOWER_REG);
2490 /* load upper 8 bits of scan delay */
2491 writew((scan_counter >> 16) & 0xff,
2492 devpriv->main_iobase + ADC_DELAY_INTERVAL_UPPER_REG);
2493 DEBUG_PRINT("scan counter 0x%x\n", scan_counter);
2496 static int use_internal_queue_6xxx(const struct comedi_cmd *cmd)
2499 for (i = 0; i + 1 < cmd->chanlist_len; i++) {
2500 if (CR_CHAN(cmd->chanlist[i + 1]) !=
2501 CR_CHAN(cmd->chanlist[i]) + 1)
2503 if (CR_RANGE(cmd->chanlist[i + 1]) !=
2504 CR_RANGE(cmd->chanlist[i]))
2506 if (CR_AREF(cmd->chanlist[i + 1]) != CR_AREF(cmd->chanlist[i]))
2512 static int setup_channel_queue(struct comedi_device *dev,
2513 const struct comedi_cmd *cmd)
2515 struct pcidas64_private *devpriv = dev->private;
2516 unsigned short bits;
2519 if (board(dev)->layout != LAYOUT_4020) {
2520 if (use_internal_queue_6xxx(cmd)) {
2521 devpriv->hw_config_bits &= ~EXT_QUEUE_BIT;
2522 writew(devpriv->hw_config_bits,
2523 devpriv->main_iobase + HW_CONFIG_REG);
2526 bits |= adc_chan_bits(CR_CHAN(cmd->chanlist[0]));
2528 bits |= ai_range_bits_6xxx(dev,
2529 CR_RANGE(cmd->chanlist[0]));
2530 /* set single-ended / differential */
2531 bits |= se_diff_bit_6xxx(dev,
2532 CR_AREF(cmd->chanlist[0]) ==
2534 if (CR_AREF(cmd->chanlist[0]) == AREF_COMMON)
2535 bits |= ADC_COMMON_BIT;
2536 /* set stop channel */
2537 writew(adc_chan_bits
2538 (CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])),
2539 devpriv->main_iobase + ADC_QUEUE_HIGH_REG);
2540 /* set start channel, and rest of settings */
2542 devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2544 /* use external queue */
2545 if (dev->write_subdev && dev->write_subdev->busy) {
2546 warn_external_queue(dev);
2549 devpriv->hw_config_bits |= EXT_QUEUE_BIT;
2550 writew(devpriv->hw_config_bits,
2551 devpriv->main_iobase + HW_CONFIG_REG);
2552 /* clear DAC buffer to prevent weird interactions */
2554 devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
2555 /* clear queue pointer */
2556 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2557 /* load external queue */
2558 for (i = 0; i < cmd->chanlist_len; i++) {
2562 adc_chan_bits(CR_CHAN(cmd->chanlist[i]));
2564 bits |= ai_range_bits_6xxx(dev,
2568 /* set single-ended / differential */
2569 bits |= se_diff_bit_6xxx(dev,
2573 if (CR_AREF(cmd->chanlist[i]) == AREF_COMMON)
2574 bits |= ADC_COMMON_BIT;
2575 /* mark end of queue */
2576 if (i == cmd->chanlist_len - 1)
2577 bits |= QUEUE_EOSCAN_BIT |
2580 devpriv->main_iobase +
2581 ADC_QUEUE_FIFO_REG);
2583 ("wrote 0x%x to external channel queue\n",
2586 /* doing a queue clear is not specified in board docs,
2587 * but required for reliable operation */
2588 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
2589 /* prime queue holding register */
2590 writew(0, devpriv->main_iobase + ADC_QUEUE_LOAD_REG);
2593 unsigned short old_cal_range_bits =
2594 devpriv->i2c_cal_range_bits;
2596 devpriv->i2c_cal_range_bits &= ~ADC_SRC_4020_MASK;
2597 /* select BNC inputs */
2598 devpriv->i2c_cal_range_bits |= adc_src_4020_bits(4);
2600 for (i = 0; i < cmd->chanlist_len; i++) {
2601 unsigned int channel = CR_CHAN(cmd->chanlist[i]);
2602 unsigned int range = CR_RANGE(cmd->chanlist[i]);
2605 devpriv->i2c_cal_range_bits |=
2606 attenuate_bit(channel);
2608 devpriv->i2c_cal_range_bits &=
2609 ~attenuate_bit(channel);
2611 /* update calibration/range i2c register only if necessary, as it is very slow */
2612 if (old_cal_range_bits != devpriv->i2c_cal_range_bits) {
2613 uint8_t i2c_data = devpriv->i2c_cal_range_bits;
2614 i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data,
2621 static inline void load_first_dma_descriptor(struct comedi_device *dev,
2622 unsigned int dma_channel,
2623 unsigned int descriptor_bits)
2625 struct pcidas64_private *devpriv = dev->private;
2627 /* The transfer size, pci address, and local address registers
2628 * are supposedly unused during chained dma,
2629 * but I have found that left over values from last operation
2630 * occasionally cause problems with transfer of first dma
2631 * block. Initializing them to zero seems to fix the problem. */
2634 devpriv->plx9080_iobase + PLX_DMA1_TRANSFER_SIZE_REG);
2635 writel(0, devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG);
2637 devpriv->plx9080_iobase + PLX_DMA1_LOCAL_ADDRESS_REG);
2638 writel(descriptor_bits,
2639 devpriv->plx9080_iobase + PLX_DMA1_DESCRIPTOR_REG);
2642 devpriv->plx9080_iobase + PLX_DMA0_TRANSFER_SIZE_REG);
2643 writel(0, devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
2645 devpriv->plx9080_iobase + PLX_DMA0_LOCAL_ADDRESS_REG);
2646 writel(descriptor_bits,
2647 devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
2651 static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
2653 struct pcidas64_private *devpriv = dev->private;
2654 struct comedi_async *async = s->async;
2655 struct comedi_cmd *cmd = &async->cmd;
2658 unsigned long flags;
2661 disable_ai_pacing(dev);
2664 retval = setup_channel_queue(dev, cmd);
2668 /* make sure internal calibration source is turned off */
2669 writew(0, devpriv->main_iobase + CALIBRATION_REG);
2671 set_ai_pacing(dev, cmd);
2673 setup_sample_counters(dev, cmd);
2675 enable_ai_interrupts(dev, cmd);
2677 spin_lock_irqsave(&dev->spinlock, flags);
2678 /* set mode, allow conversions through software gate */
2679 devpriv->adc_control1_bits |= ADC_SW_GATE_BIT;
2680 devpriv->adc_control1_bits &= ~ADC_DITHER_BIT;
2681 if (board(dev)->layout != LAYOUT_4020) {
2682 devpriv->adc_control1_bits &= ~ADC_MODE_MASK;
2683 if (cmd->convert_src == TRIG_EXT)
2684 devpriv->adc_control1_bits |= adc_mode_bits(13); /* good old mode 13 */
2686 devpriv->adc_control1_bits |= adc_mode_bits(8); /* mode 8. What else could you need? */
2688 devpriv->adc_control1_bits &= ~CHANNEL_MODE_4020_MASK;
2689 if (cmd->chanlist_len == 4)
2690 devpriv->adc_control1_bits |= FOUR_CHANNEL_4020_BITS;
2691 else if (cmd->chanlist_len == 2)
2692 devpriv->adc_control1_bits |= TWO_CHANNEL_4020_BITS;
2693 devpriv->adc_control1_bits &= ~ADC_LO_CHANNEL_4020_MASK;
2694 devpriv->adc_control1_bits |=
2695 adc_lo_chan_4020_bits(CR_CHAN(cmd->chanlist[0]));
2696 devpriv->adc_control1_bits &= ~ADC_HI_CHANNEL_4020_MASK;
2697 devpriv->adc_control1_bits |=
2698 adc_hi_chan_4020_bits(CR_CHAN
2700 chanlist[cmd->chanlist_len - 1]));
2702 writew(devpriv->adc_control1_bits,
2703 devpriv->main_iobase + ADC_CONTROL1_REG);
2704 DEBUG_PRINT("control1 bits 0x%x\n", devpriv->adc_control1_bits);
2705 spin_unlock_irqrestore(&dev->spinlock, flags);
2707 /* clear adc buffer */
2708 writew(0, devpriv->main_iobase + ADC_BUFFER_CLEAR_REG);
2710 if ((cmd->flags & TRIG_WAKE_EOS) == 0 ||
2711 board(dev)->layout == LAYOUT_4020) {
2712 devpriv->ai_dma_index = 0;
2714 /* set dma transfer size */
2715 for (i = 0; i < ai_dma_ring_count(board(dev)); i++)
2716 devpriv->ai_dma_desc[i].transfer_size =
2717 cpu_to_le32(dma_transfer_size(dev) *
2720 /* give location of first dma descriptor */
2721 load_first_dma_descriptor(dev, 1,
2722 devpriv->ai_dma_desc_bus_addr |
2723 PLX_DESC_IN_PCI_BIT |
2724 PLX_INTR_TERM_COUNT |
2725 PLX_XFER_LOCAL_TO_PCI);
2727 dma_start_sync(dev, 1);
2730 if (board(dev)->layout == LAYOUT_4020) {
2731 /* set source for external triggers */
2733 if (cmd->start_src == TRIG_EXT && CR_CHAN(cmd->start_arg))
2734 bits |= EXT_START_TRIG_BNC_BIT;
2735 if (cmd->stop_src == TRIG_EXT && CR_CHAN(cmd->stop_arg))
2736 bits |= EXT_STOP_TRIG_BNC_BIT;
2737 writew(bits, devpriv->main_iobase + DAQ_ATRIG_LOW_4020_REG);
2740 spin_lock_irqsave(&dev->spinlock, flags);
2742 /* enable pacing, triggering, etc */
2743 bits = ADC_ENABLE_BIT | ADC_SOFT_GATE_BITS | ADC_GATE_LEVEL_BIT;
2744 if (cmd->flags & TRIG_WAKE_EOS)
2745 bits |= ADC_DMA_DISABLE_BIT;
2746 /* set start trigger */
2747 if (cmd->start_src == TRIG_EXT) {
2748 bits |= ADC_START_TRIG_EXT_BITS;
2749 if (cmd->start_arg & CR_INVERT)
2750 bits |= ADC_START_TRIG_FALLING_BIT;
2751 } else if (cmd->start_src == TRIG_NOW)
2752 bits |= ADC_START_TRIG_SOFT_BITS;
2753 if (use_hw_sample_counter(cmd))
2754 bits |= ADC_SAMPLE_COUNTER_EN_BIT;
2755 writew(bits, devpriv->main_iobase + ADC_CONTROL0_REG);
2756 DEBUG_PRINT("control0 bits 0x%x\n", bits);
2758 devpriv->ai_cmd_running = 1;
2760 spin_unlock_irqrestore(&dev->spinlock, flags);
2762 /* start acquisition */
2763 if (cmd->start_src == TRIG_NOW) {
2764 writew(0, devpriv->main_iobase + ADC_START_REG);
2765 DEBUG_PRINT("soft trig\n");
2771 /* read num_samples from 16 bit wide ai fifo */
2772 static void pio_drain_ai_fifo_16(struct comedi_device *dev)
2774 struct pcidas64_private *devpriv = dev->private;
2775 struct comedi_subdevice *s = dev->read_subdev;
2776 struct comedi_async *async = s->async;
2777 struct comedi_cmd *cmd = &async->cmd;
2779 uint16_t prepost_bits;
2780 int read_segment, read_index, write_segment, write_index;
2784 /* get least significant 15 bits */
2786 readw(devpriv->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2788 readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2789 /* Get most significant bits (grey code). Different boards use different code
2790 * so use a scheme that doesn't depend on encoding. This read must
2791 * occur after reading least significant 15 bits to avoid race
2792 * with fifo switching to next segment. */
2793 prepost_bits = readw(devpriv->main_iobase + PREPOST_REG);
2795 /* if read and write pointers are not on the same fifo segment, read to the
2796 * end of the read segment */
2797 read_segment = adc_upper_read_ptr_code(prepost_bits);
2798 write_segment = adc_upper_write_ptr_code(prepost_bits);
2800 DEBUG_PRINT(" rd seg %i, wrt seg %i, rd idx %i, wrt idx %i\n",
2801 read_segment, write_segment, read_index,
2804 if (read_segment != write_segment)
2806 devpriv->ai_fifo_segment_length - read_index;
2808 num_samples = write_index - read_index;
2810 if (cmd->stop_src == TRIG_COUNT) {
2811 if (devpriv->ai_count == 0)
2813 if (num_samples > devpriv->ai_count)
2814 num_samples = devpriv->ai_count;
2816 devpriv->ai_count -= num_samples;
2819 if (num_samples < 0) {
2820 dev_err(dev->class_dev,
2821 "cb_pcidas64: bug! num_samples < 0\n");
2825 DEBUG_PRINT(" read %i samples from fifo\n", num_samples);
2827 for (i = 0; i < num_samples; i++) {
2828 cfc_write_to_buffer(s,
2829 readw(devpriv->main_iobase +
2833 } while (read_segment != write_segment);
2836 /* Read from 32 bit wide ai fifo of 4020 - deal with insane grey coding of pointers.
2837 * The pci-4020 hardware only supports
2838 * dma transfers (it only supports the use of pio for draining the last remaining
2839 * points from the fifo when a data acquisition operation has completed).
2841 static void pio_drain_ai_fifo_32(struct comedi_device *dev)
2843 struct pcidas64_private *devpriv = dev->private;
2844 struct comedi_subdevice *s = dev->read_subdev;
2845 struct comedi_async *async = s->async;
2846 struct comedi_cmd *cmd = &async->cmd;
2848 unsigned int max_transfer = 100000;
2851 readw(devpriv->main_iobase + ADC_WRITE_PNTR_REG) & 0x7fff;
2853 readw(devpriv->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2855 if (cmd->stop_src == TRIG_COUNT) {
2856 if (max_transfer > devpriv->ai_count)
2857 max_transfer = devpriv->ai_count;
2860 for (i = 0; read_code != write_code && i < max_transfer;) {
2861 fifo_data = readl(devpriv->dio_counter_iobase + ADC_FIFO_REG);
2862 cfc_write_to_buffer(s, fifo_data & 0xffff);
2864 if (i < max_transfer) {
2865 cfc_write_to_buffer(s, (fifo_data >> 16) & 0xffff);
2869 readw(devpriv->main_iobase + ADC_READ_PNTR_REG) & 0x7fff;
2871 devpriv->ai_count -= i;
2875 static void pio_drain_ai_fifo(struct comedi_device *dev)
2877 if (board(dev)->layout == LAYOUT_4020)
2878 pio_drain_ai_fifo_32(dev);
2880 pio_drain_ai_fifo_16(dev);
2883 static void drain_dma_buffers(struct comedi_device *dev, unsigned int channel)
2885 struct pcidas64_private *devpriv = dev->private;
2886 struct comedi_async *async = dev->read_subdev->async;
2887 uint32_t next_transfer_addr;
2889 int num_samples = 0;
2890 void __iomem *pci_addr_reg;
2894 devpriv->plx9080_iobase + PLX_DMA1_PCI_ADDRESS_REG;
2897 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
2899 /* loop until we have read all the full buffers */
2900 for (j = 0, next_transfer_addr = readl(pci_addr_reg);
2901 (next_transfer_addr <
2902 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index]
2903 || next_transfer_addr >=
2904 devpriv->ai_buffer_bus_addr[devpriv->ai_dma_index] +
2905 DMA_BUFFER_SIZE) && j < ai_dma_ring_count(board(dev)); j++) {
2906 /* transfer data from dma buffer to comedi buffer */
2907 num_samples = dma_transfer_size(dev);
2908 if (async->cmd.stop_src == TRIG_COUNT) {
2909 if (num_samples > devpriv->ai_count)
2910 num_samples = devpriv->ai_count;
2911 devpriv->ai_count -= num_samples;
2913 cfc_write_array_to_buffer(dev->read_subdev,
2914 devpriv->ai_buffer[devpriv->
2916 num_samples * sizeof(uint16_t));
2917 devpriv->ai_dma_index =
2918 (devpriv->ai_dma_index +
2919 1) % ai_dma_ring_count(board(dev));
2921 DEBUG_PRINT("next buffer addr 0x%lx\n",
2922 (unsigned long)devpriv->
2923 ai_buffer_bus_addr[devpriv->ai_dma_index]);
2924 DEBUG_PRINT("pci addr reg 0x%x\n", next_transfer_addr);
2926 /* XXX check for dma ring buffer overrun (use end-of-chain bit to mark last
2930 static void handle_ai_interrupt(struct comedi_device *dev,
2931 unsigned short status,
2932 unsigned int plx_status)
2934 struct pcidas64_private *devpriv = dev->private;
2935 struct comedi_subdevice *s = dev->read_subdev;
2936 struct comedi_async *async = s->async;
2937 struct comedi_cmd *cmd = &async->cmd;
2938 uint8_t dma1_status;
2939 unsigned long flags;
2941 /* check for fifo overrun */
2942 if (status & ADC_OVERRUN_BIT) {
2943 comedi_error(dev, "fifo overrun");
2944 async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
2946 /* spin lock makes sure no one else changes plx dma control reg */
2947 spin_lock_irqsave(&dev->spinlock, flags);
2948 dma1_status = readb(devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2949 if (plx_status & ICS_DMA1_A) { /* dma chan 1 interrupt */
2950 writeb((dma1_status & PLX_DMA_EN_BIT) | PLX_CLEAR_DMA_INTR_BIT,
2951 devpriv->plx9080_iobase + PLX_DMA1_CS_REG);
2952 DEBUG_PRINT("dma1 status 0x%x\n", dma1_status);
2954 if (dma1_status & PLX_DMA_EN_BIT)
2955 drain_dma_buffers(dev, 1);
2957 DEBUG_PRINT(" cleared dma ch1 interrupt\n");
2959 spin_unlock_irqrestore(&dev->spinlock, flags);
2961 if (status & ADC_DONE_BIT)
2962 DEBUG_PRINT("adc done interrupt\n");
2964 /* drain fifo with pio */
2965 if ((status & ADC_DONE_BIT) ||
2966 ((cmd->flags & TRIG_WAKE_EOS) &&
2967 (status & ADC_INTR_PENDING_BIT) &&
2968 (board(dev)->layout != LAYOUT_4020))) {
2969 DEBUG_PRINT("pio fifo drain\n");
2970 spin_lock_irqsave(&dev->spinlock, flags);
2971 if (devpriv->ai_cmd_running) {
2972 spin_unlock_irqrestore(&dev->spinlock, flags);
2973 pio_drain_ai_fifo(dev);
2975 spin_unlock_irqrestore(&dev->spinlock, flags);
2977 /* if we are have all the data, then quit */
2978 if ((cmd->stop_src == TRIG_COUNT && (int)devpriv->ai_count <= 0) ||
2979 (cmd->stop_src == TRIG_EXT && (status & ADC_STOP_BIT))) {
2980 async->events |= COMEDI_CB_EOA;
2983 cfc_handle_events(dev, s);
2986 static inline unsigned int prev_ao_dma_index(struct comedi_device *dev)
2988 struct pcidas64_private *devpriv = dev->private;
2989 unsigned int buffer_index;
2991 if (devpriv->ao_dma_index == 0)
2992 buffer_index = AO_DMA_RING_COUNT - 1;
2994 buffer_index = devpriv->ao_dma_index - 1;
2995 return buffer_index;
2998 static int last_ao_dma_load_completed(struct comedi_device *dev)
3000 struct pcidas64_private *devpriv = dev->private;
3001 unsigned int buffer_index;
3002 unsigned int transfer_address;
3003 unsigned short dma_status;
3005 buffer_index = prev_ao_dma_index(dev);
3006 dma_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3007 if ((dma_status & PLX_DMA_DONE_BIT) == 0)
3011 readl(devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG);
3012 if (transfer_address != devpriv->ao_buffer_bus_addr[buffer_index])
3018 static int ao_stopped_by_error(struct comedi_device *dev,
3019 const struct comedi_cmd *cmd)
3021 struct pcidas64_private *devpriv = dev->private;
3023 if (cmd->stop_src == TRIG_NONE)
3025 if (cmd->stop_src == TRIG_COUNT) {
3026 if (devpriv->ao_count)
3028 if (last_ao_dma_load_completed(dev) == 0)
3034 static inline int ao_dma_needs_restart(struct comedi_device *dev,
3035 unsigned short dma_status)
3037 if ((dma_status & PLX_DMA_DONE_BIT) == 0 ||
3038 (dma_status & PLX_DMA_EN_BIT) == 0)
3040 if (last_ao_dma_load_completed(dev))
3046 static void restart_ao_dma(struct comedi_device *dev)
3048 struct pcidas64_private *devpriv = dev->private;
3049 unsigned int dma_desc_bits;
3052 readl(devpriv->plx9080_iobase + PLX_DMA0_DESCRIPTOR_REG);
3053 dma_desc_bits &= ~PLX_END_OF_CHAIN_BIT;
3054 DEBUG_PRINT("restarting ao dma, descriptor reg 0x%x\n", dma_desc_bits);
3055 load_first_dma_descriptor(dev, 0, dma_desc_bits);
3057 dma_start_sync(dev, 0);
3060 static void handle_ao_interrupt(struct comedi_device *dev,
3061 unsigned short status, unsigned int plx_status)
3063 struct pcidas64_private *devpriv = dev->private;
3064 struct comedi_subdevice *s = dev->write_subdev;
3065 struct comedi_async *async;
3066 struct comedi_cmd *cmd;
3067 uint8_t dma0_status;
3068 unsigned long flags;
3070 /* board might not support ao, in which case write_subdev is NULL */
3076 /* spin lock makes sure no one else changes plx dma control reg */
3077 spin_lock_irqsave(&dev->spinlock, flags);
3078 dma0_status = readb(devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3079 if (plx_status & ICS_DMA0_A) { /* dma chan 0 interrupt */
3080 if ((dma0_status & PLX_DMA_EN_BIT)
3081 && !(dma0_status & PLX_DMA_DONE_BIT))
3082 writeb(PLX_DMA_EN_BIT | PLX_CLEAR_DMA_INTR_BIT,
3083 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3085 writeb(PLX_CLEAR_DMA_INTR_BIT,
3086 devpriv->plx9080_iobase + PLX_DMA0_CS_REG);
3087 spin_unlock_irqrestore(&dev->spinlock, flags);
3088 DEBUG_PRINT("dma0 status 0x%x\n", dma0_status);
3089 if (dma0_status & PLX_DMA_EN_BIT) {
3090 load_ao_dma(dev, cmd);
3091 /* try to recover from dma end-of-chain event */
3092 if (ao_dma_needs_restart(dev, dma0_status))
3093 restart_ao_dma(dev);
3095 DEBUG_PRINT(" cleared dma ch0 interrupt\n");
3097 spin_unlock_irqrestore(&dev->spinlock, flags);
3099 if ((status & DAC_DONE_BIT)) {
3100 async->events |= COMEDI_CB_EOA;
3101 if (ao_stopped_by_error(dev, cmd))
3102 async->events |= COMEDI_CB_ERROR;
3103 DEBUG_PRINT("plx dma0 desc reg 0x%x\n",
3104 readl(devpriv->plx9080_iobase +
3105 PLX_DMA0_DESCRIPTOR_REG));
3106 DEBUG_PRINT("plx dma0 address reg 0x%x\n",
3107 readl(devpriv->plx9080_iobase +
3108 PLX_DMA0_PCI_ADDRESS_REG));
3110 cfc_handle_events(dev, s);
3113 static irqreturn_t handle_interrupt(int irq, void *d)
3115 struct comedi_device *dev = d;
3116 struct pcidas64_private *devpriv = dev->private;
3117 unsigned short status;
3118 uint32_t plx_status;
3121 plx_status = readl(devpriv->plx9080_iobase + PLX_INTRCS_REG);
3122 status = readw(devpriv->main_iobase + HW_STATUS_REG);
3124 DEBUG_PRINT("cb_pcidas64: hw status 0x%x ", status);
3125 DEBUG_PRINT("plx status 0x%x\n", plx_status);
3127 /* an interrupt before all the postconfig stuff gets done could
3128 * cause a NULL dereference if we continue through the
3129 * interrupt handler */
3130 if (dev->attached == 0) {
3131 DEBUG_PRINT("cb_pcidas64: premature interrupt, ignoring",
3135 handle_ai_interrupt(dev, status, plx_status);
3136 handle_ao_interrupt(dev, status, plx_status);
3138 /* clear possible plx9080 interrupt sources */
3139 if (plx_status & ICS_LDIA) { /* clear local doorbell interrupt */
3140 plx_bits = readl(devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3141 writel(plx_bits, devpriv->plx9080_iobase + PLX_DBR_OUT_REG);
3142 DEBUG_PRINT(" cleared local doorbell bits 0x%x\n", plx_bits);
3145 DEBUG_PRINT("exiting handler\n");
3150 static void abort_dma(struct comedi_device *dev, unsigned int channel)
3152 struct pcidas64_private *devpriv = dev->private;
3153 unsigned long flags;
3155 /* spinlock for plx dma control/status reg */
3156 spin_lock_irqsave(&dev->spinlock, flags);
3158 plx9080_abort_dma(devpriv->plx9080_iobase, channel);
3160 spin_unlock_irqrestore(&dev->spinlock, flags);
3163 static int ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3165 struct pcidas64_private *devpriv = dev->private;
3166 unsigned long flags;
3168 spin_lock_irqsave(&dev->spinlock, flags);
3169 if (devpriv->ai_cmd_running == 0) {
3170 spin_unlock_irqrestore(&dev->spinlock, flags);
3173 devpriv->ai_cmd_running = 0;
3174 spin_unlock_irqrestore(&dev->spinlock, flags);
3176 disable_ai_pacing(dev);
3180 DEBUG_PRINT("ai canceled\n");
3184 static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
3185 struct comedi_insn *insn, unsigned int *data)
3187 struct pcidas64_private *devpriv = dev->private;
3188 int chan = CR_CHAN(insn->chanspec);
3189 int range = CR_RANGE(insn->chanspec);
3191 /* do some initializing */
3192 writew(0, devpriv->main_iobase + DAC_CONTROL0_REG);
3195 set_dac_range_bits(dev, &devpriv->dac_control1_bits, chan, range);
3196 writew(devpriv->dac_control1_bits,
3197 devpriv->main_iobase + DAC_CONTROL1_REG);
3199 /* write to channel */
3200 if (board(dev)->layout == LAYOUT_4020) {
3201 writew(data[0] & 0xff,
3202 devpriv->main_iobase + dac_lsb_4020_reg(chan));
3203 writew((data[0] >> 8) & 0xf,
3204 devpriv->main_iobase + dac_msb_4020_reg(chan));
3206 writew(data[0], devpriv->main_iobase + dac_convert_reg(chan));
3209 /* remember output value */
3210 devpriv->ao_value[chan] = data[0];
3215 static int ao_readback_insn(struct comedi_device *dev,
3216 struct comedi_subdevice *s,
3217 struct comedi_insn *insn, unsigned int *data)
3219 struct pcidas64_private *devpriv = dev->private;
3221 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
3226 static void set_dac_control0_reg(struct comedi_device *dev,
3227 const struct comedi_cmd *cmd)
3229 struct pcidas64_private *devpriv = dev->private;
3230 unsigned int bits = DAC_ENABLE_BIT | WAVEFORM_GATE_LEVEL_BIT |
3231 WAVEFORM_GATE_ENABLE_BIT | WAVEFORM_GATE_SELECT_BIT;
3233 if (cmd->start_src == TRIG_EXT) {
3234 bits |= WAVEFORM_TRIG_EXT_BITS;
3235 if (cmd->start_arg & CR_INVERT)
3236 bits |= WAVEFORM_TRIG_FALLING_BIT;
3238 bits |= WAVEFORM_TRIG_SOFT_BITS;
3240 if (cmd->scan_begin_src == TRIG_EXT) {
3241 bits |= DAC_EXT_UPDATE_ENABLE_BIT;
3242 if (cmd->scan_begin_arg & CR_INVERT)
3243 bits |= DAC_EXT_UPDATE_FALLING_BIT;
3245 writew(bits, devpriv->main_iobase + DAC_CONTROL0_REG);
3248 static void set_dac_control1_reg(struct comedi_device *dev,
3249 const struct comedi_cmd *cmd)
3251 struct pcidas64_private *devpriv = dev->private;
3254 for (i = 0; i < cmd->chanlist_len; i++) {
3257 channel = CR_CHAN(cmd->chanlist[i]);
3258 range = CR_RANGE(cmd->chanlist[i]);
3259 set_dac_range_bits(dev, &devpriv->dac_control1_bits, channel,
3262 devpriv->dac_control1_bits |= DAC_SW_GATE_BIT;
3263 writew(devpriv->dac_control1_bits,
3264 devpriv->main_iobase + DAC_CONTROL1_REG);
3267 static void set_dac_select_reg(struct comedi_device *dev,
3268 const struct comedi_cmd *cmd)
3270 struct pcidas64_private *devpriv = dev->private;
3272 unsigned int first_channel, last_channel;
3274 first_channel = CR_CHAN(cmd->chanlist[0]);
3275 last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
3276 if (last_channel < first_channel)
3277 comedi_error(dev, "bug! last ao channel < first ao channel");
3279 bits = (first_channel & 0x7) | (last_channel & 0x7) << 3;
3281 writew(bits, devpriv->main_iobase + DAC_SELECT_REG);
3284 static void set_dac_interval_regs(struct comedi_device *dev,
3285 const struct comedi_cmd *cmd)
3287 struct pcidas64_private *devpriv = dev->private;
3288 unsigned int divisor;
3290 if (cmd->scan_begin_src != TRIG_TIMER)
3293 divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags);
3294 if (divisor > max_counter_value) {
3295 comedi_error(dev, "bug! ao divisor too big");
3296 divisor = max_counter_value;
3298 writew(divisor & 0xffff,
3299 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_LOWER_REG);
3300 writew((divisor >> 16) & 0xff,
3301 devpriv->main_iobase + DAC_SAMPLE_INTERVAL_UPPER_REG);
3304 static unsigned int load_ao_dma_buffer(struct comedi_device *dev,
3305 const struct comedi_cmd *cmd)
3307 struct pcidas64_private *devpriv = dev->private;
3308 unsigned int num_bytes, buffer_index, prev_buffer_index;
3309 unsigned int next_bits;
3311 buffer_index = devpriv->ao_dma_index;
3312 prev_buffer_index = prev_ao_dma_index(dev);
3314 DEBUG_PRINT("attempting to load ao buffer %i (0x%x)\n", buffer_index,
3315 devpriv->ao_buffer_bus_addr[buffer_index]);
3317 num_bytes = comedi_buf_read_n_available(dev->write_subdev->async);
3318 if (num_bytes > DMA_BUFFER_SIZE)
3319 num_bytes = DMA_BUFFER_SIZE;
3320 if (cmd->stop_src == TRIG_COUNT && num_bytes > devpriv->ao_count)
3321 num_bytes = devpriv->ao_count;
3322 num_bytes -= num_bytes % bytes_in_sample;
3327 DEBUG_PRINT("loading %i bytes\n", num_bytes);
3329 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3331 ao_buffer[buffer_index],
3333 devpriv->ao_dma_desc[buffer_index].transfer_size =
3334 cpu_to_le32(num_bytes);
3335 /* set end of chain bit so we catch underruns */
3336 next_bits = le32_to_cpu(devpriv->ao_dma_desc[buffer_index].next);
3337 next_bits |= PLX_END_OF_CHAIN_BIT;
3338 devpriv->ao_dma_desc[buffer_index].next = cpu_to_le32(next_bits);
3339 /* clear end of chain bit on previous buffer now that we have set it
3340 * for the last buffer */
3341 next_bits = le32_to_cpu(devpriv->ao_dma_desc[prev_buffer_index].next);
3342 next_bits &= ~PLX_END_OF_CHAIN_BIT;
3343 devpriv->ao_dma_desc[prev_buffer_index].next = cpu_to_le32(next_bits);
3345 devpriv->ao_dma_index = (buffer_index + 1) % AO_DMA_RING_COUNT;
3346 devpriv->ao_count -= num_bytes;
3351 static void load_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3353 struct pcidas64_private *devpriv = dev->private;
3354 unsigned int num_bytes;
3355 unsigned int next_transfer_addr;
3356 void __iomem *pci_addr_reg =
3357 devpriv->plx9080_iobase + PLX_DMA0_PCI_ADDRESS_REG;
3358 unsigned int buffer_index;
3361 buffer_index = devpriv->ao_dma_index;
3362 /* don't overwrite data that hasn't been transferred yet */
3363 next_transfer_addr = readl(pci_addr_reg);
3364 if (next_transfer_addr >=
3365 devpriv->ao_buffer_bus_addr[buffer_index]
3366 && next_transfer_addr <
3367 devpriv->ao_buffer_bus_addr[buffer_index] +
3370 num_bytes = load_ao_dma_buffer(dev, cmd);
3371 } while (num_bytes >= DMA_BUFFER_SIZE);
3374 static int prep_ao_dma(struct comedi_device *dev, const struct comedi_cmd *cmd)
3376 struct pcidas64_private *devpriv = dev->private;
3377 unsigned int num_bytes;
3380 /* clear queue pointer too, since external queue has
3381 * weird interactions with ao fifo */
3382 writew(0, devpriv->main_iobase + ADC_QUEUE_CLEAR_REG);
3383 writew(0, devpriv->main_iobase + DAC_BUFFER_CLEAR_REG);
3385 num_bytes = (DAC_FIFO_SIZE / 2) * bytes_in_sample;
3386 if (cmd->stop_src == TRIG_COUNT &&
3387 num_bytes / bytes_in_sample > devpriv->ao_count)
3388 num_bytes = devpriv->ao_count * bytes_in_sample;
3389 num_bytes = cfc_read_array_from_buffer(dev->write_subdev,
3390 devpriv->ao_bounce_buffer,
3392 for (i = 0; i < num_bytes / bytes_in_sample; i++) {
3393 writew(devpriv->ao_bounce_buffer[i],
3394 devpriv->main_iobase + DAC_FIFO_REG);
3396 devpriv->ao_count -= num_bytes / bytes_in_sample;
3397 if (cmd->stop_src == TRIG_COUNT && devpriv->ao_count == 0)
3399 num_bytes = load_ao_dma_buffer(dev, cmd);
3402 if (num_bytes >= DMA_BUFFER_SIZE) ;
3403 load_ao_dma(dev, cmd);
3405 dma_start_sync(dev, 0);
3410 static inline int external_ai_queue_in_use(struct comedi_device *dev)
3412 if (dev->read_subdev->busy)
3414 if (board(dev)->layout == LAYOUT_4020)
3416 else if (use_internal_queue_6xxx(&dev->read_subdev->async->cmd))
3421 static int ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
3423 struct pcidas64_private *devpriv = dev->private;
3424 struct comedi_cmd *cmd = &s->async->cmd;
3426 if (external_ai_queue_in_use(dev)) {
3427 warn_external_queue(dev);
3430 /* disable analog output system during setup */
3431 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3433 devpriv->ao_dma_index = 0;
3434 devpriv->ao_count = cmd->stop_arg * cmd->chanlist_len;
3436 set_dac_select_reg(dev, cmd);
3437 set_dac_interval_regs(dev, cmd);
3438 load_first_dma_descriptor(dev, 0, devpriv->ao_dma_desc_bus_addr |
3439 PLX_DESC_IN_PCI_BIT | PLX_INTR_TERM_COUNT);
3441 set_dac_control1_reg(dev, cmd);
3442 s->async->inttrig = ao_inttrig;
3447 static int ao_inttrig(struct comedi_device *dev, struct comedi_subdevice *s,
3448 unsigned int trig_num)
3450 struct pcidas64_private *devpriv = dev->private;
3451 struct comedi_cmd *cmd = &s->async->cmd;
3457 retval = prep_ao_dma(dev, cmd);
3461 set_dac_control0_reg(dev, cmd);
3463 if (cmd->start_src == TRIG_INT)
3464 writew(0, devpriv->main_iobase + DAC_START_REG);
3466 s->async->inttrig = NULL;
3471 static int ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
3472 struct comedi_cmd *cmd)
3475 unsigned int tmp_arg;
3478 /* Step 1 : check if triggers are trivially valid */
3480 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_INT | TRIG_EXT);
3481 err |= cfc_check_trigger_src(&cmd->scan_begin_src,
3482 TRIG_TIMER | TRIG_EXT);
3483 err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_NOW);
3484 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
3485 err |= cfc_check_trigger_src(&cmd->stop_src, TRIG_NONE);
3490 /* Step 2a : make sure trigger sources are unique */
3492 err |= cfc_check_trigger_is_unique(cmd->start_src);
3493 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
3495 /* Step 2b : and mutually compatible */
3497 if (cmd->convert_src == TRIG_EXT && cmd->scan_begin_src == TRIG_TIMER)
3499 if (cmd->stop_src != TRIG_COUNT &&
3500 cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_EXT)
3506 /* step 3: make sure arguments are trivially compatible */
3508 if (cmd->scan_begin_src == TRIG_TIMER) {
3509 if (cmd->scan_begin_arg < board(dev)->ao_scan_speed) {
3510 cmd->scan_begin_arg = board(dev)->ao_scan_speed;
3513 if (get_ao_divisor(cmd->scan_begin_arg,
3514 cmd->flags) > max_counter_value) {
3515 cmd->scan_begin_arg =
3516 (max_counter_value + 2) * TIMER_BASE;
3521 if (!cmd->chanlist_len) {
3522 cmd->chanlist_len = 1;
3525 if (cmd->scan_end_arg != cmd->chanlist_len) {
3526 cmd->scan_end_arg = cmd->chanlist_len;
3533 /* step 4: fix up any arguments */
3535 if (cmd->scan_begin_src == TRIG_TIMER) {
3536 tmp_arg = cmd->scan_begin_arg;
3537 cmd->scan_begin_arg =
3538 get_divisor(cmd->scan_begin_arg, cmd->flags) * TIMER_BASE;
3539 if (tmp_arg != cmd->scan_begin_arg)
3546 if (cmd->chanlist) {
3547 unsigned int first_channel = CR_CHAN(cmd->chanlist[0]);
3548 for (i = 1; i < cmd->chanlist_len; i++) {
3549 if (CR_CHAN(cmd->chanlist[i]) != first_channel + i) {
3551 "chanlist must use consecutive channels");
3564 static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
3566 struct pcidas64_private *devpriv = dev->private;
3568 writew(0x0, devpriv->main_iobase + DAC_CONTROL0_REG);
3573 static int dio_callback(int dir, int port, int data, unsigned long arg)
3575 void __iomem *iobase = (void __iomem *)arg;
3577 writeb(data, iobase + port);
3578 DEBUG_PRINT("wrote 0x%x to port %i\n", data, port);
3581 return readb(iobase + port);
3585 static int dio_callback_4020(int dir, int port, int data, unsigned long arg)
3587 void __iomem *iobase = (void __iomem *)arg;
3589 writew(data, iobase + 2 * port);
3592 return readw(iobase + 2 * port);
3596 static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s,
3597 struct comedi_insn *insn, unsigned int *data)
3599 struct pcidas64_private *devpriv = dev->private;
3602 bits = readb(devpriv->dio_counter_iobase + DI_REG);
3610 static int do_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3611 struct comedi_insn *insn, unsigned int *data)
3613 struct pcidas64_private *devpriv = dev->private;
3616 /* zero bits we are going to change */
3617 s->state &= ~data[0];
3619 s->state |= data[0] & data[1];
3621 writeb(s->state, devpriv->dio_counter_iobase + DO_REG);
3628 static int dio_60xx_config_insn(struct comedi_device *dev,
3629 struct comedi_subdevice *s,
3630 struct comedi_insn *insn, unsigned int *data)
3632 struct pcidas64_private *devpriv = dev->private;
3635 mask = 1 << CR_CHAN(insn->chanspec);
3638 case INSN_CONFIG_DIO_INPUT:
3639 s->io_bits &= ~mask;
3641 case INSN_CONFIG_DIO_OUTPUT:
3644 case INSN_CONFIG_DIO_QUERY:
3645 data[1] = (s->io_bits & mask) ? COMEDI_OUTPUT : COMEDI_INPUT;
3652 devpriv->dio_counter_iobase + DIO_DIRECTION_60XX_REG);
3657 static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_subdevice *s,
3658 struct comedi_insn *insn, unsigned int *data)
3660 struct pcidas64_private *devpriv = dev->private;
3663 s->state &= ~data[0];
3664 s->state |= (data[0] & data[1]);
3666 devpriv->dio_counter_iobase + DIO_DATA_60XX_REG);
3669 data[1] = readb(devpriv->dio_counter_iobase + DIO_DATA_60XX_REG);
3674 static void caldac_write(struct comedi_device *dev, unsigned int channel,
3677 struct pcidas64_private *devpriv = dev->private;
3679 devpriv->caldac_state[channel] = value;
3681 switch (board(dev)->layout) {
3684 caldac_8800_write(dev, channel, value);
3687 caldac_i2c_write(dev, channel, value);
3694 static int calib_write_insn(struct comedi_device *dev,
3695 struct comedi_subdevice *s,
3696 struct comedi_insn *insn, unsigned int *data)
3698 struct pcidas64_private *devpriv = dev->private;
3699 int channel = CR_CHAN(insn->chanspec);
3701 /* return immediately if setting hasn't changed, since
3702 * programming these things is slow */
3703 if (devpriv->caldac_state[channel] == data[0])
3706 caldac_write(dev, channel, data[0]);
3711 static int calib_read_insn(struct comedi_device *dev,
3712 struct comedi_subdevice *s, struct comedi_insn *insn,
3715 struct pcidas64_private *devpriv = dev->private;
3716 unsigned int channel = CR_CHAN(insn->chanspec);
3718 data[0] = devpriv->caldac_state[channel];
3723 static void ad8402_write(struct comedi_device *dev, unsigned int channel,
3726 struct pcidas64_private *devpriv = dev->private;
3727 static const int bitstream_length = 10;
3728 unsigned int bit, register_bits;
3729 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
3730 static const int ad8402_udelay = 1;
3732 devpriv->ad8402_state[channel] = value;
3734 register_bits = SELECT_8402_64XX_BIT;
3735 udelay(ad8402_udelay);
3736 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3738 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3739 if (bitstream & bit)
3740 register_bits |= SERIAL_DATA_IN_BIT;
3742 register_bits &= ~SERIAL_DATA_IN_BIT;
3743 udelay(ad8402_udelay);
3744 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
3745 udelay(ad8402_udelay);
3746 writew(register_bits | SERIAL_CLOCK_BIT,
3747 devpriv->main_iobase + CALIBRATION_REG);
3750 udelay(ad8402_udelay);
3751 writew(0, devpriv->main_iobase + CALIBRATION_REG);
3754 /* for pci-das6402/16, channel 0 is analog input gain and channel 1 is offset */
3755 static int ad8402_write_insn(struct comedi_device *dev,
3756 struct comedi_subdevice *s,
3757 struct comedi_insn *insn, unsigned int *data)
3759 struct pcidas64_private *devpriv = dev->private;
3760 int channel = CR_CHAN(insn->chanspec);
3762 /* return immediately if setting hasn't changed, since
3763 * programming these things is slow */
3764 if (devpriv->ad8402_state[channel] == data[0])
3767 devpriv->ad8402_state[channel] = data[0];
3769 ad8402_write(dev, channel, data[0]);
3774 static int ad8402_read_insn(struct comedi_device *dev,
3775 struct comedi_subdevice *s,
3776 struct comedi_insn *insn, unsigned int *data)
3778 struct pcidas64_private *devpriv = dev->private;
3779 unsigned int channel = CR_CHAN(insn->chanspec);
3781 data[0] = devpriv->ad8402_state[channel];
3786 static uint16_t read_eeprom(struct comedi_device *dev, uint8_t address)
3788 struct pcidas64_private *devpriv = dev->private;
3789 static const int bitstream_length = 11;
3790 static const int read_command = 0x6;
3791 unsigned int bitstream = (read_command << 8) | address;
3793 void __iomem * const plx_control_addr =
3794 devpriv->plx9080_iobase + PLX_CONTROL_REG;
3796 static const int value_length = 16;
3797 static const int eeprom_udelay = 1;
3799 udelay(eeprom_udelay);
3800 devpriv->plx_control_bits &= ~CTL_EE_CLK & ~CTL_EE_CS;
3801 /* make sure we don't send anything to the i2c bus on 4020 */
3802 devpriv->plx_control_bits |= CTL_USERO;
3803 writel(devpriv->plx_control_bits, plx_control_addr);
3804 /* activate serial eeprom */
3805 udelay(eeprom_udelay);
3806 devpriv->plx_control_bits |= CTL_EE_CS;
3807 writel(devpriv->plx_control_bits, plx_control_addr);
3809 /* write read command and desired memory address */
3810 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
3811 /* set bit to be written */
3812 udelay(eeprom_udelay);
3813 if (bitstream & bit)
3814 devpriv->plx_control_bits |= CTL_EE_W;
3816 devpriv->plx_control_bits &= ~CTL_EE_W;
3817 writel(devpriv->plx_control_bits, plx_control_addr);
3819 udelay(eeprom_udelay);
3820 devpriv->plx_control_bits |= CTL_EE_CLK;
3821 writel(devpriv->plx_control_bits, plx_control_addr);
3822 udelay(eeprom_udelay);
3823 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3824 writel(devpriv->plx_control_bits, plx_control_addr);
3826 /* read back value from eeprom memory location */
3828 for (bit = 1 << (value_length - 1); bit; bit >>= 1) {
3830 udelay(eeprom_udelay);
3831 devpriv->plx_control_bits |= CTL_EE_CLK;
3832 writel(devpriv->plx_control_bits, plx_control_addr);
3833 udelay(eeprom_udelay);
3834 devpriv->plx_control_bits &= ~CTL_EE_CLK;
3835 writel(devpriv->plx_control_bits, plx_control_addr);
3836 udelay(eeprom_udelay);
3837 if (readl(plx_control_addr) & CTL_EE_R)
3841 /* deactivate eeprom serial input */
3842 udelay(eeprom_udelay);
3843 devpriv->plx_control_bits &= ~CTL_EE_CS;
3844 writel(devpriv->plx_control_bits, plx_control_addr);
3849 static int eeprom_read_insn(struct comedi_device *dev,
3850 struct comedi_subdevice *s,
3851 struct comedi_insn *insn, unsigned int *data)
3853 data[0] = read_eeprom(dev, CR_CHAN(insn->chanspec));
3858 /* utility function that rounds desired timing to an achievable time, and
3859 * sets cmd members appropriately.
3860 * adc paces conversions from master clock by dividing by (x + 3) where x is 24 bit number
3862 static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
3864 unsigned int convert_divisor = 0, scan_divisor;
3865 static const int min_convert_divisor = 3;
3866 static const int max_convert_divisor =
3867 max_counter_value + min_convert_divisor;
3868 static const int min_scan_divisor_4020 = 2;
3869 unsigned long long max_scan_divisor, min_scan_divisor;
3871 if (cmd->convert_src == TRIG_TIMER) {
3872 if (board(dev)->layout == LAYOUT_4020) {
3873 cmd->convert_arg = 0;
3876 get_divisor(cmd->convert_arg, cmd->flags);
3877 if (convert_divisor > max_convert_divisor)
3878 convert_divisor = max_convert_divisor;
3879 if (convert_divisor < min_convert_divisor)
3880 convert_divisor = min_convert_divisor;
3881 cmd->convert_arg = convert_divisor * TIMER_BASE;
3883 } else if (cmd->convert_src == TRIG_NOW)
3884 cmd->convert_arg = 0;
3886 if (cmd->scan_begin_src == TRIG_TIMER) {
3887 scan_divisor = get_divisor(cmd->scan_begin_arg, cmd->flags);
3888 if (cmd->convert_src == TRIG_TIMER) {
3889 /* XXX check for integer overflows */
3890 min_scan_divisor = convert_divisor * cmd->chanlist_len;
3892 (convert_divisor * cmd->chanlist_len - 1) +
3895 min_scan_divisor = min_scan_divisor_4020;
3896 max_scan_divisor = max_counter_value + min_scan_divisor;
3898 if (scan_divisor > max_scan_divisor)
3899 scan_divisor = max_scan_divisor;
3900 if (scan_divisor < min_scan_divisor)
3901 scan_divisor = min_scan_divisor;
3902 cmd->scan_begin_arg = scan_divisor * TIMER_BASE;
3908 /* Gets nearest achievable timing given master clock speed, does not
3909 * take into account possible minimum/maximum divisor values. Used
3910 * by other timing checking functions. */
3911 static unsigned int get_divisor(unsigned int ns, unsigned int flags)
3913 unsigned int divisor;
3915 switch (flags & TRIG_ROUND_MASK) {
3917 divisor = (ns + TIMER_BASE - 1) / TIMER_BASE;
3919 case TRIG_ROUND_DOWN:
3920 divisor = ns / TIMER_BASE;
3922 case TRIG_ROUND_NEAREST:
3924 divisor = (ns + TIMER_BASE / 2) / TIMER_BASE;
3930 static unsigned int get_ao_divisor(unsigned int ns, unsigned int flags)
3932 return get_divisor(ns, flags) - 2;
3935 /* adjusts the size of hardware fifo (which determines block size for dma xfers) */
3936 static int set_ai_fifo_size(struct comedi_device *dev, unsigned int num_samples)
3938 unsigned int num_fifo_entries;
3940 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
3942 num_fifo_entries = num_samples / fifo->sample_packing_ratio;
3944 retval = set_ai_fifo_segment_length(dev,
3946 fifo->num_segments);
3950 num_samples = retval * fifo->num_segments * fifo->sample_packing_ratio;
3952 DEBUG_PRINT("set hardware fifo size to %i\n", num_samples);
3957 /* query length of fifo */
3958 static unsigned int ai_fifo_size(struct comedi_device *dev)
3960 struct pcidas64_private *devpriv = dev->private;
3962 return devpriv->ai_fifo_segment_length *
3963 board(dev)->ai_fifo->num_segments *
3964 board(dev)->ai_fifo->sample_packing_ratio;
3967 static int set_ai_fifo_segment_length(struct comedi_device *dev,
3968 unsigned int num_entries)
3970 struct pcidas64_private *devpriv = dev->private;
3971 static const int increment_size = 0x100;
3972 const struct hw_fifo_info *const fifo = board(dev)->ai_fifo;
3973 unsigned int num_increments;
3976 if (num_entries < increment_size)
3977 num_entries = increment_size;
3978 if (num_entries > fifo->max_segment_length)
3979 num_entries = fifo->max_segment_length;
3981 /* 1 == 256 entries, 2 == 512 entries, etc */
3982 num_increments = (num_entries + increment_size / 2) / increment_size;
3984 bits = (~(num_increments - 1)) & fifo->fifo_size_reg_mask;
3985 devpriv->fifo_size_bits &= ~fifo->fifo_size_reg_mask;
3986 devpriv->fifo_size_bits |= bits;
3987 writew(devpriv->fifo_size_bits,
3988 devpriv->main_iobase + FIFO_SIZE_REG);
3990 devpriv->ai_fifo_segment_length = num_increments * increment_size;
3992 DEBUG_PRINT("set hardware fifo segment length to %i\n",
3993 devpriv->ai_fifo_segment_length);
3995 return devpriv->ai_fifo_segment_length;
3998 /* pci-6025 8800 caldac:
3999 * address 0 == dac channel 0 offset
4000 * address 1 == dac channel 0 gain
4001 * address 2 == dac channel 1 offset
4002 * address 3 == dac channel 1 gain
4003 * address 4 == fine adc offset
4004 * address 5 == coarse adc offset
4005 * address 6 == coarse adc gain
4006 * address 7 == fine adc gain
4008 /* pci-6402/16 uses all 8 channels for dac:
4009 * address 0 == dac channel 0 fine gain
4010 * address 1 == dac channel 0 coarse gain
4011 * address 2 == dac channel 0 coarse offset
4012 * address 3 == dac channel 1 coarse offset
4013 * address 4 == dac channel 1 fine gain
4014 * address 5 == dac channel 1 coarse gain
4015 * address 6 == dac channel 0 fine offset
4016 * address 7 == dac channel 1 fine offset
4019 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
4022 struct pcidas64_private *devpriv = dev->private;
4023 static const int num_caldac_channels = 8;
4024 static const int bitstream_length = 11;
4025 unsigned int bitstream = ((address & 0x7) << 8) | value;
4026 unsigned int bit, register_bits;
4027 static const int caldac_8800_udelay = 1;
4029 if (address >= num_caldac_channels) {
4030 comedi_error(dev, "illegal caldac channel");
4033 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
4035 if (bitstream & bit)
4036 register_bits |= SERIAL_DATA_IN_BIT;
4037 udelay(caldac_8800_udelay);
4038 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
4039 register_bits |= SERIAL_CLOCK_BIT;
4040 udelay(caldac_8800_udelay);
4041 writew(register_bits, devpriv->main_iobase + CALIBRATION_REG);
4043 udelay(caldac_8800_udelay);
4044 writew(SELECT_8800_BIT, devpriv->main_iobase + CALIBRATION_REG);
4045 udelay(caldac_8800_udelay);
4046 writew(0, devpriv->main_iobase + CALIBRATION_REG);
4047 udelay(caldac_8800_udelay);
4052 static int caldac_i2c_write(struct comedi_device *dev,
4053 unsigned int caldac_channel, unsigned int value)
4055 uint8_t serial_bytes[3];
4058 /* manual has gain and offset bits switched */
4065 NOT_CLEAR_REGISTERS = 0x20,
4068 switch (caldac_channel) {
4069 case 0: /* chan 0 offset */
4070 i2c_addr = CALDAC0_I2C_ADDR;
4071 serial_bytes[0] = OFFSET_0_2;
4073 case 1: /* chan 1 offset */
4074 i2c_addr = CALDAC0_I2C_ADDR;
4075 serial_bytes[0] = OFFSET_1_3;
4077 case 2: /* chan 2 offset */
4078 i2c_addr = CALDAC1_I2C_ADDR;
4079 serial_bytes[0] = OFFSET_0_2;
4081 case 3: /* chan 3 offset */
4082 i2c_addr = CALDAC1_I2C_ADDR;
4083 serial_bytes[0] = OFFSET_1_3;
4085 case 4: /* chan 0 gain */
4086 i2c_addr = CALDAC0_I2C_ADDR;
4087 serial_bytes[0] = GAIN_0_2;
4089 case 5: /* chan 1 gain */
4090 i2c_addr = CALDAC0_I2C_ADDR;
4091 serial_bytes[0] = GAIN_1_3;
4093 case 6: /* chan 2 gain */
4094 i2c_addr = CALDAC1_I2C_ADDR;
4095 serial_bytes[0] = GAIN_0_2;
4097 case 7: /* chan 3 gain */
4098 i2c_addr = CALDAC1_I2C_ADDR;
4099 serial_bytes[0] = GAIN_1_3;
4102 comedi_error(dev, "invalid caldac channel\n");
4106 serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf);
4107 serial_bytes[2] = value & 0xff;
4108 i2c_write(dev, i2c_addr, serial_bytes, 3);
4112 /* Their i2c requires a huge delay on setting clock or data high for some reason */
4113 static const int i2c_high_udelay = 1000;
4114 static const int i2c_low_udelay = 10;
4116 /* set i2c data line high or low */
4117 static void i2c_set_sda(struct comedi_device *dev, int state)
4119 struct pcidas64_private *devpriv = dev->private;
4120 static const int data_bit = CTL_EE_W;
4121 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
4125 /* set data line high */
4126 devpriv->plx_control_bits &= ~data_bit;
4127 writel(devpriv->plx_control_bits, plx_control_addr);
4128 udelay(i2c_high_udelay);
4129 } else { /* set data line low */
4131 devpriv->plx_control_bits |= data_bit;
4132 writel(devpriv->plx_control_bits, plx_control_addr);
4133 udelay(i2c_low_udelay);
4137 /* set i2c clock line high or low */
4138 static void i2c_set_scl(struct comedi_device *dev, int state)
4140 struct pcidas64_private *devpriv = dev->private;
4141 static const int clock_bit = CTL_USERO;
4142 void __iomem *plx_control_addr = devpriv->plx9080_iobase +
4146 /* set clock line high */
4147 devpriv->plx_control_bits &= ~clock_bit;
4148 writel(devpriv->plx_control_bits, plx_control_addr);
4149 udelay(i2c_high_udelay);
4150 } else { /* set clock line low */
4152 devpriv->plx_control_bits |= clock_bit;
4153 writel(devpriv->plx_control_bits, plx_control_addr);
4154 udelay(i2c_low_udelay);
4158 static void i2c_write_byte(struct comedi_device *dev, uint8_t byte)
4161 unsigned int num_bits = 8;
4163 DEBUG_PRINT("writing to i2c byte 0x%x\n", byte);
4165 for (bit = 1 << (num_bits - 1); bit; bit >>= 1) {
4166 i2c_set_scl(dev, 0);
4168 i2c_set_sda(dev, 1);
4170 i2c_set_sda(dev, 0);
4171 i2c_set_scl(dev, 1);
4175 /* we can't really read the lines, so fake it */
4176 static int i2c_read_ack(struct comedi_device *dev)
4178 i2c_set_scl(dev, 0);
4179 i2c_set_sda(dev, 1);
4180 i2c_set_scl(dev, 1);
4182 return 0; /* return fake acknowledge bit */
4185 /* send start bit */
4186 static void i2c_start(struct comedi_device *dev)
4188 i2c_set_scl(dev, 1);
4189 i2c_set_sda(dev, 1);
4190 i2c_set_sda(dev, 0);
4194 static void i2c_stop(struct comedi_device *dev)
4196 i2c_set_scl(dev, 0);
4197 i2c_set_sda(dev, 0);
4198 i2c_set_scl(dev, 1);
4199 i2c_set_sda(dev, 1);
4202 static void i2c_write(struct comedi_device *dev, unsigned int address,
4203 const uint8_t *data, unsigned int length)
4205 struct pcidas64_private *devpriv = dev->private;
4208 static const int read_bit = 0x1;
4210 /* XXX need mutex to prevent simultaneous attempts to access eeprom and i2c bus */
4212 /* make sure we dont send anything to eeprom */
4213 devpriv->plx_control_bits &= ~CTL_EE_CS;
4218 /* send address and write bit */
4219 bitstream = (address << 1) & ~read_bit;
4220 i2c_write_byte(dev, bitstream);
4222 /* get acknowledge */
4223 if (i2c_read_ack(dev) != 0) {
4224 comedi_error(dev, "i2c write failed: no acknowledge");
4228 /* write data bytes */
4229 for (i = 0; i < length; i++) {
4230 i2c_write_byte(dev, data[i]);
4231 if (i2c_read_ack(dev) != 0) {
4232 comedi_error(dev, "i2c write failed: no acknowledge");
4240 static struct comedi_driver cb_pcidas64_driver = {
4241 .driver_name = "cb_pcidas64",
4242 .module = THIS_MODULE,
4247 static int __devinit cb_pcidas64_pci_probe(struct pci_dev *dev,
4248 const struct pci_device_id *ent)
4250 return comedi_pci_auto_config(dev, &cb_pcidas64_driver);
4253 static void __devexit cb_pcidas64_pci_remove(struct pci_dev *dev)
4255 comedi_pci_auto_unconfig(dev);
4258 static DEFINE_PCI_DEVICE_TABLE(cb_pcidas64_pci_table) = {
4259 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x001d) },
4260 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x001e) },
4261 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0035) },
4262 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0036) },
4263 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0037) },
4264 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0052) },
4265 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x005d) },
4266 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x005e) },
4267 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x005f) },
4268 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0061) },
4269 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0062) },
4270 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0063) },
4271 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0064) },
4272 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0066) },
4273 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0067) },
4274 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0068) },
4275 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x006f) },
4276 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0078) },
4277 { PCI_DEVICE(PCI_VENDOR_ID_CB, 0x0079) },
4280 MODULE_DEVICE_TABLE(pci, cb_pcidas64_pci_table);
4282 static struct pci_driver cb_pcidas64_pci_driver = {
4283 .name = "cb_pcidas64",
4284 .id_table = cb_pcidas64_pci_table,
4285 .probe = cb_pcidas64_pci_probe,
4286 .remove = __devexit_p(cb_pcidas64_pci_remove),
4288 module_comedi_pci_driver(cb_pcidas64_driver, cb_pcidas64_pci_driver);
4290 MODULE_AUTHOR("Comedi http://www.comedi.org");
4291 MODULE_DESCRIPTION("Comedi low-level driver");
4292 MODULE_LICENSE("GPL");