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>
90 #include "comedi_pci.h"
94 #include "comedi_fc.h"
96 #undef PCIDAS64_DEBUG /* disable debugging code */
97 /* #define PCIDAS64_DEBUG enable debugging code */
100 #define DEBUG_PRINT(format, args...) printk(format , ## args)
102 #define DEBUG_PRINT(format, args...)
105 #define TIMER_BASE 25 /* 40MHz master clock */
106 #define PRESCALED_TIMER_BASE 10000 /* 100kHz 'prescaled' clock for slow acquisition, maybe I'll support this someday */
107 #define DMA_BUFFER_SIZE 0x1000
109 #define PCI_VENDOR_ID_COMPUTERBOARDS 0x1307
111 /* maximum value that can be loaded into board's 24-bit counters*/
112 static const int max_counter_value
= 0xffffff;
114 /* PCI-DAS64xxx base addresses */
116 /* indices of base address regions */
117 enum base_address_regions
{
118 PLX9080_BADDRINDEX
= 0,
120 DIO_COUNTER_BADDRINDEX
= 3,
123 /* priv(dev)->main_iobase registers */
124 enum write_only_registers
{
125 INTR_ENABLE_REG
= 0x0, /* interrupt enable register */
126 HW_CONFIG_REG
= 0x2, /* hardware config register */
128 DAQ_ATRIG_LOW_4020_REG
= 0xc,
129 ADC_CONTROL0_REG
= 0x10, /* adc control register 0 */
130 ADC_CONTROL1_REG
= 0x12, /* adc control register 1 */
131 CALIBRATION_REG
= 0x14,
132 ADC_SAMPLE_INTERVAL_LOWER_REG
= 0x16, /* lower 16 bits of adc sample interval counter */
133 ADC_SAMPLE_INTERVAL_UPPER_REG
= 0x18, /* upper 8 bits of adc sample interval counter */
134 ADC_DELAY_INTERVAL_LOWER_REG
= 0x1a, /* lower 16 bits of delay interval counter */
135 ADC_DELAY_INTERVAL_UPPER_REG
= 0x1c, /* upper 8 bits of delay interval counter */
136 ADC_COUNT_LOWER_REG
= 0x1e, /* lower 16 bits of hardware conversion/scan counter */
137 ADC_COUNT_UPPER_REG
= 0x20, /* upper 8 bits of hardware conversion/scan counter */
138 ADC_START_REG
= 0x22, /* software trigger to start acquisition */
139 ADC_CONVERT_REG
= 0x24, /* initiates single conversion */
140 ADC_QUEUE_CLEAR_REG
= 0x26, /* clears adc queue */
141 ADC_QUEUE_LOAD_REG
= 0x28, /* loads adc queue */
142 ADC_BUFFER_CLEAR_REG
= 0x2a,
143 ADC_QUEUE_HIGH_REG
= 0x2c, /* high channel for internal queue, use adc_chan_bits() inline above */
144 DAC_CONTROL0_REG
= 0x50, /* dac control register 0 */
145 DAC_CONTROL1_REG
= 0x52, /* dac control register 0 */
146 DAC_SAMPLE_INTERVAL_LOWER_REG
= 0x54, /* lower 16 bits of dac sample interval counter */
147 DAC_SAMPLE_INTERVAL_UPPER_REG
= 0x56, /* upper 8 bits of dac sample interval counter */
148 DAC_SELECT_REG
= 0x60,
149 DAC_START_REG
= 0x64,
150 DAC_BUFFER_CLEAR_REG
= 0x66, /* clear dac buffer */
152 static inline unsigned int dac_convert_reg(unsigned int channel
)
154 return 0x70 + (2 * (channel
& 0x1));
157 static inline unsigned int dac_lsb_4020_reg(unsigned int channel
)
159 return 0x70 + (4 * (channel
& 0x1));
162 static inline unsigned int dac_msb_4020_reg(unsigned int channel
)
164 return 0x72 + (4 * (channel
& 0x1));
167 enum read_only_registers
{
168 HW_STATUS_REG
= 0x0, /* hardware status register, reading this apparently clears pending interrupts as well */
169 PIPE1_READ_REG
= 0x4,
170 ADC_READ_PNTR_REG
= 0x8,
171 LOWER_XFER_REG
= 0x10,
172 ADC_WRITE_PNTR_REG
= 0xc,
176 enum read_write_registers
{
177 I8255_4020_REG
= 0x48, /* 8255 offset, for 4020 only */
178 ADC_QUEUE_FIFO_REG
= 0x100, /* external channel/gain queue, uses same bits as ADC_QUEUE_LOAD_REG */
179 ADC_FIFO_REG
= 0x200, /* adc data fifo */
180 DAC_FIFO_REG
= 0x300, /* dac data fifo, has weird interactions with external channel queue */
183 /* priv(dev)->dio_counter_iobase registers */
184 enum dio_counter_registers
{
185 DIO_8255_OFFSET
= 0x0,
188 DIO_DIRECTION_60XX_REG
= 0x40,
189 DIO_DATA_60XX_REG
= 0x48,
192 /* bit definitions for write-only registers */
194 enum intr_enable_contents
{
195 ADC_INTR_SRC_MASK
= 0x3, /* bits that set adc interrupt source */
196 ADC_INTR_QFULL_BITS
= 0x0, /* interrupt fifo quater full */
197 ADC_INTR_EOC_BITS
= 0x1, /* interrupt end of conversion */
198 ADC_INTR_EOSCAN_BITS
= 0x2, /* interrupt end of scan */
199 ADC_INTR_EOSEQ_BITS
= 0x3, /* interrupt end of sequence (probably wont use this it's pretty fancy) */
200 EN_ADC_INTR_SRC_BIT
= 0x4, /* enable adc interrupt source */
201 EN_ADC_DONE_INTR_BIT
= 0x8, /* enable adc acquisition done interrupt */
202 DAC_INTR_SRC_MASK
= 0x30,
203 DAC_INTR_QEMPTY_BITS
= 0x0,
204 DAC_INTR_HIGH_CHAN_BITS
= 0x10,
205 EN_DAC_INTR_SRC_BIT
= 0x40, /* enable dac interrupt source */
206 EN_DAC_DONE_INTR_BIT
= 0x80,
207 EN_ADC_ACTIVE_INTR_BIT
= 0x200, /* enable adc active interrupt */
208 EN_ADC_STOP_INTR_BIT
= 0x400, /* enable adc stop trigger interrupt */
209 EN_DAC_ACTIVE_INTR_BIT
= 0x800, /* enable dac active interrupt */
210 EN_DAC_UNDERRUN_BIT
= 0x4000, /* enable dac underrun status bit */
211 EN_ADC_OVERRUN_BIT
= 0x8000, /* enable adc overrun status bit */
214 enum hw_config_contents
{
215 MASTER_CLOCK_4020_MASK
= 0x3, /* bits that specify master clock source for 4020 */
216 INTERNAL_CLOCK_4020_BITS
= 0x1, /* use 40 MHz internal master clock for 4020 */
217 BNC_CLOCK_4020_BITS
= 0x2, /* use BNC input for master clock */
218 EXT_CLOCK_4020_BITS
= 0x3, /* use dio input for master clock */
219 EXT_QUEUE_BIT
= 0x200, /* use external channel/gain queue (more versatile than internal queue) */
220 SLOW_DAC_BIT
= 0x400, /* use 225 nanosec strobe when loading dac instead of 50 nanosec */
221 HW_CONFIG_DUMMY_BITS
= 0x2000, /* bit with unknown function yet given as default value in pci-das64 manual */
222 DMA_CH_SELECT_BIT
= 0x8000, /* bit selects channels 1/0 for analog input/output, otherwise 0/1 */
223 FIFO_SIZE_REG
= 0x4, /* allows adjustment of fifo sizes */
224 DAC_FIFO_SIZE_MASK
= 0xff00, /* bits that set dac fifo size */
225 DAC_FIFO_BITS
= 0xf800, /* 8k sample ao fifo */
227 #define DAC_FIFO_SIZE 0x2000
229 enum daq_atrig_low_4020_contents
{
230 EXT_AGATE_BNC_BIT
= 0x8000, /* use trig/ext clk bnc input for analog gate signal */
231 EXT_STOP_TRIG_BNC_BIT
= 0x4000, /* use trig/ext clk bnc input for external stop trigger signal */
232 EXT_START_TRIG_BNC_BIT
= 0x2000, /* use trig/ext clk bnc input for external start trigger signal */
234 static inline uint16_t analog_trig_low_threshold_bits(uint16_t threshold
)
236 return threshold
& 0xfff;
239 enum adc_control0_contents
{
240 ADC_GATE_SRC_MASK
= 0x3, /* bits that select gate */
241 ADC_SOFT_GATE_BITS
= 0x1, /* software gate */
242 ADC_EXT_GATE_BITS
= 0x2, /* external digital gate */
243 ADC_ANALOG_GATE_BITS
= 0x3, /* analog level gate */
244 ADC_GATE_LEVEL_BIT
= 0x4, /* level-sensitive gate (for digital) */
245 ADC_GATE_POLARITY_BIT
= 0x8, /* gate active low */
246 ADC_START_TRIG_SOFT_BITS
= 0x10,
247 ADC_START_TRIG_EXT_BITS
= 0x20,
248 ADC_START_TRIG_ANALOG_BITS
= 0x30,
249 ADC_START_TRIG_MASK
= 0x30,
250 ADC_START_TRIG_FALLING_BIT
= 0x40, /* trig 1 uses falling edge */
251 ADC_EXT_CONV_FALLING_BIT
= 0x800, /* external pacing uses falling edge */
252 ADC_SAMPLE_COUNTER_EN_BIT
= 0x1000, /* enable hardware scan counter */
253 ADC_DMA_DISABLE_BIT
= 0x4000, /* disables dma */
254 ADC_ENABLE_BIT
= 0x8000, /* master adc enable */
257 enum adc_control1_contents
{
258 ADC_QUEUE_CONFIG_BIT
= 0x1, /* should be set for boards with > 16 channels */
259 CONVERT_POLARITY_BIT
= 0x10,
260 EOC_POLARITY_BIT
= 0x20,
261 ADC_SW_GATE_BIT
= 0x40, /* software gate of adc */
262 ADC_DITHER_BIT
= 0x200, /* turn on extra noise for dithering */
263 RETRIGGER_BIT
= 0x800,
264 ADC_LO_CHANNEL_4020_MASK
= 0x300,
265 ADC_HI_CHANNEL_4020_MASK
= 0xc00,
266 TWO_CHANNEL_4020_BITS
= 0x1000, /* two channel mode for 4020 */
267 FOUR_CHANNEL_4020_BITS
= 0x2000, /* four channel mode for 4020 */
268 CHANNEL_MODE_4020_MASK
= 0x3000,
269 ADC_MODE_MASK
= 0xf000,
271 static inline uint16_t adc_lo_chan_4020_bits(unsigned int channel
)
273 return (channel
& 0x3) << 8;
276 static inline uint16_t adc_hi_chan_4020_bits(unsigned int channel
)
278 return (channel
& 0x3) << 10;
281 static inline uint16_t adc_mode_bits(unsigned int mode
)
283 return (mode
& 0xf) << 12;
286 enum calibration_contents
{
287 SELECT_8800_BIT
= 0x1,
288 SELECT_8402_64XX_BIT
= 0x2,
289 SELECT_1590_60XX_BIT
= 0x2,
290 CAL_EN_64XX_BIT
= 0x40, /* calibration enable for 64xx series */
291 SERIAL_DATA_IN_BIT
= 0x80,
292 SERIAL_CLOCK_BIT
= 0x100,
293 CAL_EN_60XX_BIT
= 0x200, /* calibration enable for 60xx series */
294 CAL_GAIN_BIT
= 0x800,
296 /* calibration sources for 6025 are:
306 static inline uint16_t adc_src_bits(unsigned int source
)
308 return (source
& 0xf) << 3;
311 static inline uint16_t adc_convert_chan_4020_bits(unsigned int channel
)
313 return (channel
& 0x3) << 8;
316 enum adc_queue_load_contents
{
317 UNIP_BIT
= 0x800, /* unipolar/bipolar bit */
318 ADC_SE_DIFF_BIT
= 0x1000, /* single-ended/ differential bit */
319 ADC_COMMON_BIT
= 0x2000, /* non-referenced single-ended (common-mode input) */
320 QUEUE_EOSEQ_BIT
= 0x4000, /* queue end of sequence */
321 QUEUE_EOSCAN_BIT
= 0x8000, /* queue end of scan */
323 static inline uint16_t adc_chan_bits(unsigned int channel
)
325 return channel
& 0x3f;
328 enum dac_control0_contents
{
329 DAC_ENABLE_BIT
= 0x8000, /* dac controller enable bit */
330 DAC_CYCLIC_STOP_BIT
= 0x4000,
331 DAC_WAVEFORM_MODE_BIT
= 0x100,
332 DAC_EXT_UPDATE_FALLING_BIT
= 0x80,
333 DAC_EXT_UPDATE_ENABLE_BIT
= 0x40,
334 WAVEFORM_TRIG_MASK
= 0x30,
335 WAVEFORM_TRIG_DISABLED_BITS
= 0x0,
336 WAVEFORM_TRIG_SOFT_BITS
= 0x10,
337 WAVEFORM_TRIG_EXT_BITS
= 0x20,
338 WAVEFORM_TRIG_ADC1_BITS
= 0x30,
339 WAVEFORM_TRIG_FALLING_BIT
= 0x8,
340 WAVEFORM_GATE_LEVEL_BIT
= 0x4,
341 WAVEFORM_GATE_ENABLE_BIT
= 0x2,
342 WAVEFORM_GATE_SELECT_BIT
= 0x1,
345 enum dac_control1_contents
{
346 DAC_WRITE_POLARITY_BIT
= 0x800, /* board-dependent setting */
347 DAC1_EXT_REF_BIT
= 0x200,
348 DAC0_EXT_REF_BIT
= 0x100,
349 DAC_OUTPUT_ENABLE_BIT
= 0x80, /* dac output enable bit */
350 DAC_UPDATE_POLARITY_BIT
= 0x40, /* board-dependent setting */
351 DAC_SW_GATE_BIT
= 0x20,
352 DAC1_UNIPOLAR_BIT
= 0x8,
353 DAC0_UNIPOLAR_BIT
= 0x2,
356 /* bit definitions for read-only registers */
357 enum hw_status_contents
{
358 DAC_UNDERRUN_BIT
= 0x1,
359 ADC_OVERRUN_BIT
= 0x2,
360 DAC_ACTIVE_BIT
= 0x4,
361 ADC_ACTIVE_BIT
= 0x8,
362 DAC_INTR_PENDING_BIT
= 0x10,
363 ADC_INTR_PENDING_BIT
= 0x20,
366 EXT_INTR_PENDING_BIT
= 0x100,
367 ADC_STOP_BIT
= 0x200,
369 static inline uint16_t pipe_full_bits(uint16_t hw_status_bits
)
371 return (hw_status_bits
>> 10) & 0x3;
374 static inline unsigned int dma_chain_flag_bits(uint16_t prepost_bits
)
376 return (prepost_bits
>> 6) & 0x3;
379 static inline unsigned int adc_upper_read_ptr_code(uint16_t prepost_bits
)
381 return (prepost_bits
>> 12) & 0x3;
384 static inline unsigned int adc_upper_write_ptr_code(uint16_t prepost_bits
)
386 return (prepost_bits
>> 14) & 0x3;
389 /* I2C addresses for 4020 */
391 RANGE_CAL_I2C_ADDR
= 0x20,
392 CALDAC0_I2C_ADDR
= 0xc,
393 CALDAC1_I2C_ADDR
= 0xd,
396 enum range_cal_i2c_contents
{
397 ADC_SRC_4020_MASK
= 0x70, /* bits that set what source the adc converter measures */
398 BNC_TRIG_THRESHOLD_0V_BIT
= 0x80, /* make bnc trig/ext clock threshold 0V instead of 2.5V */
400 static inline uint8_t adc_src_4020_bits(unsigned int source
)
402 return (source
<< 4) & ADC_SRC_4020_MASK
;
405 static inline uint8_t attenuate_bit(unsigned int channel
)
407 /* attenuate channel (+-5V input range) */
408 return 1 << (channel
& 0x3);
411 /* analog input ranges for 64xx boards */
412 static const struct comedi_lrange ai_ranges_64xx
= {
426 /* analog input ranges for 60xx boards */
427 static const struct comedi_lrange ai_ranges_60xx
= {
437 /* analog input ranges for 6030, etc boards */
438 static const struct comedi_lrange ai_ranges_6030
= {
458 /* analog input ranges for 6052, etc boards */
459 static const struct comedi_lrange ai_ranges_6052
= {
480 /* analog input ranges for 4020 board */
481 static const struct comedi_lrange ai_ranges_4020
= {
489 /* analog output ranges */
490 static const struct comedi_lrange ao_ranges_64xx
= {
500 static const int ao_range_code_64xx
[] = {
507 static const struct comedi_lrange ao_ranges_60xx
= {
514 static const int ao_range_code_60xx
[] = {
518 static const struct comedi_lrange ao_ranges_6030
= {
526 static const int ao_range_code_6030
[] = {
531 static const struct comedi_lrange ao_ranges_4020
= {
539 static const int ao_range_code_4020
[] = {
544 enum register_layout
{
550 struct hw_fifo_info
{
551 unsigned int num_segments
;
552 unsigned int max_segment_length
;
553 unsigned int sample_packing_ratio
;
554 uint16_t fifo_size_reg_mask
;
557 struct pcidas64_board
{
559 int device_id
; /* pci device id */
560 int ai_se_chans
; /* number of ai inputs in single-ended mode */
561 int ai_bits
; /* analog input resolution */
562 int ai_speed
; /* fastest conversion period in ns */
563 const struct comedi_lrange
*ai_range_table
;
564 int ao_nchan
; /* number of analog out channels */
565 int ao_bits
; /* analog output resolution */
566 int ao_scan_speed
; /* analog output speed (for a scan, not conversion) */
567 const struct comedi_lrange
*ao_range_table
;
568 const int *ao_range_code
;
569 const struct hw_fifo_info
*const ai_fifo
;
570 enum register_layout layout
; /* different board families have slightly different registers */
574 static const struct hw_fifo_info ai_fifo_4020
= {
576 .max_segment_length
= 0x8000,
577 .sample_packing_ratio
= 2,
578 .fifo_size_reg_mask
= 0x7f,
581 static const struct hw_fifo_info ai_fifo_64xx
= {
583 .max_segment_length
= 0x800,
584 .sample_packing_ratio
= 1,
585 .fifo_size_reg_mask
= 0x3f,
588 static const struct hw_fifo_info ai_fifo_60xx
= {
590 .max_segment_length
= 0x800,
591 .sample_packing_ratio
= 1,
592 .fifo_size_reg_mask
= 0x7f,
595 /* maximum number of dma transfers we will chain together into a ring
596 * (and the maximum number of dma buffers we maintain) */
597 #define MAX_AI_DMA_RING_COUNT (0x80000 / DMA_BUFFER_SIZE)
598 #define MIN_AI_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
599 #define AO_DMA_RING_COUNT (0x10000 / DMA_BUFFER_SIZE)
600 static inline unsigned int ai_dma_ring_count(struct pcidas64_board
*board
)
602 if (board
->layout
== LAYOUT_4020
)
603 return MAX_AI_DMA_RING_COUNT
;
605 return MIN_AI_DMA_RING_COUNT
;
608 static const int bytes_in_sample
= 2;
610 static const struct pcidas64_board pcidas64_boards
[] = {
612 .name
= "pci-das6402/16",
619 .ao_scan_speed
= 10000,
620 .layout
= LAYOUT_64XX
,
621 .ai_range_table
= &ai_ranges_64xx
,
622 .ao_range_table
= &ao_ranges_64xx
,
623 .ao_range_code
= ao_range_code_64xx
,
624 .ai_fifo
= &ai_fifo_64xx
,
628 .name
= "pci-das6402/12", /* XXX check */
635 .ao_scan_speed
= 10000,
636 .layout
= LAYOUT_64XX
,
637 .ai_range_table
= &ai_ranges_64xx
,
638 .ao_range_table
= &ao_ranges_64xx
,
639 .ao_range_code
= ao_range_code_64xx
,
640 .ai_fifo
= &ai_fifo_64xx
,
644 .name
= "pci-das64/m1/16",
651 .ao_scan_speed
= 10000,
652 .layout
= LAYOUT_64XX
,
653 .ai_range_table
= &ai_ranges_64xx
,
654 .ao_range_table
= &ao_ranges_64xx
,
655 .ao_range_code
= ao_range_code_64xx
,
656 .ai_fifo
= &ai_fifo_64xx
,
660 .name
= "pci-das64/m2/16",
667 .ao_scan_speed
= 10000,
668 .layout
= LAYOUT_64XX
,
669 .ai_range_table
= &ai_ranges_64xx
,
670 .ao_range_table
= &ao_ranges_64xx
,
671 .ao_range_code
= ao_range_code_64xx
,
672 .ai_fifo
= &ai_fifo_64xx
,
676 .name
= "pci-das64/m3/16",
683 .ao_scan_speed
= 10000,
684 .layout
= LAYOUT_64XX
,
685 .ai_range_table
= &ai_ranges_64xx
,
686 .ao_range_table
= &ao_ranges_64xx
,
687 .ao_range_code
= ao_range_code_64xx
,
688 .ai_fifo
= &ai_fifo_64xx
,
692 .name
= "pci-das6013",
699 .layout
= LAYOUT_60XX
,
700 .ai_range_table
= &ai_ranges_60xx
,
701 .ao_range_table
= &ao_ranges_60xx
,
702 .ao_range_code
= ao_range_code_60xx
,
703 .ai_fifo
= &ai_fifo_60xx
,
707 .name
= "pci-das6014",
714 .ao_scan_speed
= 100000,
715 .layout
= LAYOUT_60XX
,
716 .ai_range_table
= &ai_ranges_60xx
,
717 .ao_range_table
= &ao_ranges_60xx
,
718 .ao_range_code
= ao_range_code_60xx
,
719 .ai_fifo
= &ai_fifo_60xx
,
723 .name
= "pci-das6023",
729 .ao_scan_speed
= 100000,
730 .layout
= LAYOUT_60XX
,
731 .ai_range_table
= &ai_ranges_60xx
,
732 .ao_range_table
= &ao_ranges_60xx
,
733 .ao_range_code
= ao_range_code_60xx
,
734 .ai_fifo
= &ai_fifo_60xx
,
738 .name
= "pci-das6025",
745 .ao_scan_speed
= 100000,
746 .layout
= LAYOUT_60XX
,
747 .ai_range_table
= &ai_ranges_60xx
,
748 .ao_range_table
= &ao_ranges_60xx
,
749 .ao_range_code
= ao_range_code_60xx
,
750 .ai_fifo
= &ai_fifo_60xx
,
754 .name
= "pci-das6030",
761 .ao_scan_speed
= 10000,
762 .layout
= LAYOUT_60XX
,
763 .ai_range_table
= &ai_ranges_6030
,
764 .ao_range_table
= &ao_ranges_6030
,
765 .ao_range_code
= ao_range_code_6030
,
766 .ai_fifo
= &ai_fifo_60xx
,
770 .name
= "pci-das6031",
777 .ao_scan_speed
= 10000,
778 .layout
= LAYOUT_60XX
,
779 .ai_range_table
= &ai_ranges_6030
,
780 .ao_range_table
= &ao_ranges_6030
,
781 .ao_range_code
= ao_range_code_6030
,
782 .ai_fifo
= &ai_fifo_60xx
,
786 .name
= "pci-das6032",
792 .layout
= LAYOUT_60XX
,
793 .ai_range_table
= &ai_ranges_6030
,
794 .ai_fifo
= &ai_fifo_60xx
,
798 .name
= "pci-das6033",
804 .layout
= LAYOUT_60XX
,
805 .ai_range_table
= &ai_ranges_6030
,
806 .ai_fifo
= &ai_fifo_60xx
,
810 .name
= "pci-das6034",
817 .layout
= LAYOUT_60XX
,
818 .ai_range_table
= &ai_ranges_60xx
,
819 .ai_fifo
= &ai_fifo_60xx
,
823 .name
= "pci-das6035",
830 .ao_scan_speed
= 100000,
831 .layout
= LAYOUT_60XX
,
832 .ai_range_table
= &ai_ranges_60xx
,
833 .ao_range_table
= &ao_ranges_60xx
,
834 .ao_range_code
= ao_range_code_60xx
,
835 .ai_fifo
= &ai_fifo_60xx
,
839 .name
= "pci-das6036",
846 .ao_scan_speed
= 100000,
847 .layout
= LAYOUT_60XX
,
848 .ai_range_table
= &ai_ranges_60xx
,
849 .ao_range_table
= &ao_ranges_60xx
,
850 .ao_range_code
= ao_range_code_60xx
,
851 .ai_fifo
= &ai_fifo_60xx
,
855 .name
= "pci-das6040",
862 .ao_scan_speed
= 1000,
863 .layout
= LAYOUT_60XX
,
864 .ai_range_table
= &ai_ranges_6052
,
865 .ao_range_table
= &ao_ranges_6030
,
866 .ao_range_code
= ao_range_code_6030
,
867 .ai_fifo
= &ai_fifo_60xx
,
871 .name
= "pci-das6052",
878 .ao_scan_speed
= 3333,
879 .layout
= LAYOUT_60XX
,
880 .ai_range_table
= &ai_ranges_6052
,
881 .ao_range_table
= &ao_ranges_6030
,
882 .ao_range_code
= ao_range_code_6030
,
883 .ai_fifo
= &ai_fifo_60xx
,
887 .name
= "pci-das6070",
894 .ao_scan_speed
= 1000,
895 .layout
= LAYOUT_60XX
,
896 .ai_range_table
= &ai_ranges_6052
,
897 .ao_range_table
= &ao_ranges_6030
,
898 .ao_range_code
= ao_range_code_6030
,
899 .ai_fifo
= &ai_fifo_60xx
,
903 .name
= "pci-das6071",
910 .ao_scan_speed
= 1000,
911 .layout
= LAYOUT_60XX
,
912 .ai_range_table
= &ai_ranges_6052
,
913 .ao_range_table
= &ao_ranges_6030
,
914 .ao_range_code
= ao_range_code_6030
,
915 .ai_fifo
= &ai_fifo_60xx
,
919 .name
= "pci-das4020/12",
926 .ao_scan_speed
= 0, /* no hardware pacing on ao */
927 .layout
= LAYOUT_4020
,
928 .ai_range_table
= &ai_ranges_4020
,
929 .ao_range_table
= &ao_ranges_4020
,
930 .ao_range_code
= ao_range_code_4020
,
931 .ai_fifo
= &ai_fifo_4020
,
936 .name
= "pci-das6402/16/jr",
937 .device_id
= 0 /* XXX, */
942 .ao_scan_speed
= 10000,
943 .layout
= LAYOUT_64XX
,
944 .ai_range_table
= &ai_ranges_64xx
,
945 .ai_fifo
= ai_fifo_64xx
,
949 .name
= "pci-das64/m1/16/jr",
950 .device_id
= 0 /* XXX, */
955 .ao_scan_speed
= 10000,
956 .layout
= LAYOUT_64XX
,
957 .ai_range_table
= &ai_ranges_64xx
,
958 .ai_fifo
= ai_fifo_64xx
,
962 .name
= "pci-das64/m2/16/jr",
963 .device_id
= 0 /* XXX, */
968 .ao_scan_speed
= 10000,
969 .layout
= LAYOUT_64XX
,
970 .ai_range_table
= &ai_ranges_64xx
,
971 .ai_fifo
= ai_fifo_64xx
,
975 .name
= "pci-das64/m3/16/jr",
976 .device_id
= 0 /* XXX, */
981 .ao_scan_speed
= 10000,
982 .layout
= LAYOUT_64XX
,
983 .ai_range_table
= &ai_ranges_64xx
,
984 .ai_fifo
= ai_fifo_64xx
,
988 .name
= "pci-das64/m1/14",
989 .device_id
= 0, /* XXX */
994 .ao_scan_speed
= 10000,
995 .layout
= LAYOUT_64XX
,
996 .ai_range_table
= &ai_ranges_64xx
,
997 .ai_fifo
= ai_fifo_64xx
,
1001 .name
= "pci-das64/m2/14",
1002 .device_id
= 0, /* XXX */
1007 .ao_scan_speed
= 10000,
1008 .layout
= LAYOUT_64XX
,
1009 .ai_range_table
= &ai_ranges_64xx
,
1010 .ai_fifo
= ai_fifo_64xx
,
1014 .name
= "pci-das64/m3/14",
1015 .device_id
= 0, /* XXX */
1020 .ao_scan_speed
= 10000,
1021 .layout
= LAYOUT_64XX
,
1022 .ai_range_table
= &ai_ranges_64xx
,
1023 .ai_fifo
= ai_fifo_64xx
,
1029 static DEFINE_PCI_DEVICE_TABLE(pcidas64_pci_table
) = {
1030 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x001d) },
1031 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x001e) },
1032 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0035) },
1033 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0036) },
1034 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0037) },
1035 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0052) },
1036 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x005d) },
1037 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x005e) },
1038 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x005f) },
1039 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0061) },
1040 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0062) },
1041 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0063) },
1042 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0064) },
1043 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0066) },
1044 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0067) },
1045 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0068) },
1046 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x006f) },
1047 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0078) },
1048 { PCI_DEVICE(PCI_VENDOR_ID_COMPUTERBOARDS
, 0x0079) },
1052 MODULE_DEVICE_TABLE(pci
, pcidas64_pci_table
);
1054 static inline struct pcidas64_board
*board(const struct comedi_device
*dev
)
1056 return (struct pcidas64_board
*)dev
->board_ptr
;
1059 static inline unsigned short se_diff_bit_6xxx(struct comedi_device
*dev
,
1060 int use_differential
)
1062 if ((board(dev
)->layout
== LAYOUT_64XX
&& !use_differential
) ||
1063 (board(dev
)->layout
== LAYOUT_60XX
&& use_differential
))
1064 return ADC_SE_DIFF_BIT
;
1069 struct ext_clock_info
{
1070 unsigned int divisor
; /* master clock divisor to use for scans with external master clock */
1071 unsigned int chanspec
; /* chanspec for master clock input when used as scan begin src */
1074 /* this structure is for data unique to this hardware driver. */
1075 struct pcidas64_private
{
1077 struct pci_dev
*hw_dev
; /* pointer to board's pci_dev struct */
1078 /* base addresses (physical) */
1079 resource_size_t plx9080_phys_iobase
;
1080 resource_size_t main_phys_iobase
;
1081 resource_size_t dio_counter_phys_iobase
;
1082 /* base addresses (ioremapped) */
1083 void __iomem
*plx9080_iobase
;
1084 void __iomem
*main_iobase
;
1085 void __iomem
*dio_counter_iobase
;
1086 /* local address (used by dma controller) */
1087 uint32_t local0_iobase
;
1088 uint32_t local1_iobase
;
1089 volatile unsigned int ai_count
; /* number of analog input samples remaining */
1090 uint16_t *ai_buffer
[MAX_AI_DMA_RING_COUNT
]; /* dma buffers for analog input */
1091 dma_addr_t ai_buffer_bus_addr
[MAX_AI_DMA_RING_COUNT
]; /* physical addresses of ai dma buffers */
1092 struct plx_dma_desc
*ai_dma_desc
; /* array of ai dma descriptors read by plx9080, allocated to get proper alignment */
1093 dma_addr_t ai_dma_desc_bus_addr
; /* physical address of ai dma descriptor array */
1094 volatile unsigned int ai_dma_index
; /* index of the ai dma descriptor/buffer that is currently being used */
1095 uint16_t *ao_buffer
[AO_DMA_RING_COUNT
]; /* dma buffers for analog output */
1096 dma_addr_t ao_buffer_bus_addr
[AO_DMA_RING_COUNT
]; /* physical addresses of ao dma buffers */
1097 struct plx_dma_desc
*ao_dma_desc
;
1098 dma_addr_t ao_dma_desc_bus_addr
;
1099 volatile unsigned int ao_dma_index
; /* keeps track of buffer where the next ao sample should go */
1100 volatile unsigned long ao_count
; /* number of analog output samples remaining */
1101 volatile unsigned int ao_value
[2]; /* remember what the analog outputs are set to, to allow readback */
1102 unsigned int hw_revision
; /* stc chip hardware revision number */
1103 volatile unsigned int intr_enable_bits
; /* last bits sent to INTR_ENABLE_REG register */
1104 volatile uint16_t adc_control1_bits
; /* last bits sent to ADC_CONTROL1_REG register */
1105 volatile uint16_t fifo_size_bits
; /* last bits sent to FIFO_SIZE_REG register */
1106 volatile uint16_t hw_config_bits
; /* last bits sent to HW_CONFIG_REG register */
1107 volatile uint16_t dac_control1_bits
;
1108 volatile uint32_t plx_control_bits
; /* last bits written to plx9080 control register */
1109 volatile uint32_t plx_intcsr_bits
; /* last bits written to plx interrupt control and status register */
1110 volatile int calibration_source
; /* index of calibration source readable through ai ch0 */
1111 volatile uint8_t i2c_cal_range_bits
; /* bits written to i2c calibration/range register */
1112 volatile unsigned int ext_trig_falling
; /* configure digital triggers to trigger on falling edge */
1113 /* states of various devices stored to enable read-back */
1114 unsigned int ad8402_state
[2];
1115 unsigned int caldac_state
[8];
1116 volatile short ai_cmd_running
;
1117 unsigned int ai_fifo_segment_length
;
1118 struct ext_clock_info ext_clock
;
1119 short ao_bounce_buffer
[DAC_FIFO_SIZE
];
1122 /* inline function that makes it easier to
1123 * access the private structure.
1125 static inline struct pcidas64_private
*priv(struct comedi_device
*dev
)
1127 return dev
->private;
1131 * The comedi_driver structure tells the Comedi core module
1132 * which functions to call to configure/deconfigure (attach/detach)
1133 * the board, and also about the kernel module that contains
1136 static int attach(struct comedi_device
*dev
, struct comedi_devconfig
*it
);
1137 static int detach(struct comedi_device
*dev
);
1138 static struct comedi_driver driver_cb_pcidas
= {
1139 .driver_name
= "cb_pcidas64",
1140 .module
= THIS_MODULE
,
1145 static int ai_rinsn(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1146 struct comedi_insn
*insn
, unsigned int *data
);
1147 static int ai_config_insn(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1148 struct comedi_insn
*insn
, unsigned int *data
);
1149 static int ao_winsn(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1150 struct comedi_insn
*insn
, unsigned int *data
);
1151 static int ao_readback_insn(struct comedi_device
*dev
,
1152 struct comedi_subdevice
*s
,
1153 struct comedi_insn
*insn
, unsigned int *data
);
1154 static int ai_cmd(struct comedi_device
*dev
, struct comedi_subdevice
*s
);
1155 static int ai_cmdtest(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1156 struct comedi_cmd
*cmd
);
1157 static int ao_cmd(struct comedi_device
*dev
, struct comedi_subdevice
*s
);
1158 static int ao_inttrig(struct comedi_device
*dev
,
1159 struct comedi_subdevice
*subdev
, unsigned int trig_num
);
1160 static int ao_cmdtest(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1161 struct comedi_cmd
*cmd
);
1162 static irqreturn_t
handle_interrupt(int irq
, void *d
);
1163 static int ai_cancel(struct comedi_device
*dev
, struct comedi_subdevice
*s
);
1164 static int ao_cancel(struct comedi_device
*dev
, struct comedi_subdevice
*s
);
1165 static int dio_callback(int dir
, int port
, int data
, unsigned long arg
);
1166 static int dio_callback_4020(int dir
, int port
, int data
, unsigned long arg
);
1167 static int di_rbits(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1168 struct comedi_insn
*insn
, unsigned int *data
);
1169 static int do_wbits(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1170 struct comedi_insn
*insn
, unsigned int *data
);
1171 static int dio_60xx_config_insn(struct comedi_device
*dev
,
1172 struct comedi_subdevice
*s
,
1173 struct comedi_insn
*insn
, unsigned int *data
);
1174 static int dio_60xx_wbits(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1175 struct comedi_insn
*insn
, unsigned int *data
);
1176 static int calib_read_insn(struct comedi_device
*dev
,
1177 struct comedi_subdevice
*s
, struct comedi_insn
*insn
,
1178 unsigned int *data
);
1179 static int calib_write_insn(struct comedi_device
*dev
,
1180 struct comedi_subdevice
*s
,
1181 struct comedi_insn
*insn
, unsigned int *data
);
1182 static int ad8402_read_insn(struct comedi_device
*dev
,
1183 struct comedi_subdevice
*s
,
1184 struct comedi_insn
*insn
, unsigned int *data
);
1185 static void ad8402_write(struct comedi_device
*dev
, unsigned int channel
,
1186 unsigned int value
);
1187 static int ad8402_write_insn(struct comedi_device
*dev
,
1188 struct comedi_subdevice
*s
,
1189 struct comedi_insn
*insn
, unsigned int *data
);
1190 static int eeprom_read_insn(struct comedi_device
*dev
,
1191 struct comedi_subdevice
*s
,
1192 struct comedi_insn
*insn
, unsigned int *data
);
1193 static void check_adc_timing(struct comedi_device
*dev
, struct comedi_cmd
*cmd
);
1194 static unsigned int get_divisor(unsigned int ns
, unsigned int flags
);
1195 static void i2c_write(struct comedi_device
*dev
, unsigned int address
,
1196 const uint8_t * data
, unsigned int length
);
1197 static void caldac_write(struct comedi_device
*dev
, unsigned int channel
,
1198 unsigned int value
);
1199 static int caldac_8800_write(struct comedi_device
*dev
, unsigned int address
,
1201 /* static int dac_1590_write(struct comedi_device *dev, unsigned int dac_a, unsigned int dac_b); */
1202 static int caldac_i2c_write(struct comedi_device
*dev
,
1203 unsigned int caldac_channel
, unsigned int value
);
1204 static void abort_dma(struct comedi_device
*dev
, unsigned int channel
);
1205 static void disable_plx_interrupts(struct comedi_device
*dev
);
1206 static int set_ai_fifo_size(struct comedi_device
*dev
,
1207 unsigned int num_samples
);
1208 static unsigned int ai_fifo_size(struct comedi_device
*dev
);
1209 static int set_ai_fifo_segment_length(struct comedi_device
*dev
,
1210 unsigned int num_entries
);
1211 static void disable_ai_pacing(struct comedi_device
*dev
);
1212 static void disable_ai_interrupts(struct comedi_device
*dev
);
1213 static void enable_ai_interrupts(struct comedi_device
*dev
,
1214 const struct comedi_cmd
*cmd
);
1215 static unsigned int get_ao_divisor(unsigned int ns
, unsigned int flags
);
1216 static void load_ao_dma(struct comedi_device
*dev
,
1217 const struct comedi_cmd
*cmd
);
1219 static int __devinit
driver_cb_pcidas_pci_probe(struct pci_dev
*dev
,
1220 const struct pci_device_id
*ent
)
1222 return comedi_pci_auto_config(dev
, driver_cb_pcidas
.driver_name
);
1225 static void __devexit
driver_cb_pcidas_pci_remove(struct pci_dev
*dev
)
1227 comedi_pci_auto_unconfig(dev
);
1230 static struct pci_driver driver_cb_pcidas_pci_driver
= {
1231 .id_table
= pcidas64_pci_table
,
1232 .probe
= &driver_cb_pcidas_pci_probe
,
1233 .remove
= __devexit_p(&driver_cb_pcidas_pci_remove
)
1236 static int __init
driver_cb_pcidas_init_module(void)
1240 retval
= comedi_driver_register(&driver_cb_pcidas
);
1244 driver_cb_pcidas_pci_driver
.name
= (char *)driver_cb_pcidas
.driver_name
;
1245 return pci_register_driver(&driver_cb_pcidas_pci_driver
);
1248 static void __exit
driver_cb_pcidas_cleanup_module(void)
1250 pci_unregister_driver(&driver_cb_pcidas_pci_driver
);
1251 comedi_driver_unregister(&driver_cb_pcidas
);
1254 module_init(driver_cb_pcidas_init_module
);
1255 module_exit(driver_cb_pcidas_cleanup_module
);
1257 static unsigned int ai_range_bits_6xxx(const struct comedi_device
*dev
,
1258 unsigned int range_index
)
1260 const struct comedi_krange
*range
=
1261 &board(dev
)->ai_range_table
->range
[range_index
];
1262 unsigned int bits
= 0;
1264 switch (range
->max
) {
1293 comedi_error(dev
, "bug! in ai_range_bits_6xxx");
1296 if (range
->min
== 0)
1301 static unsigned int hw_revision(const struct comedi_device
*dev
,
1302 uint16_t hw_status_bits
)
1304 if (board(dev
)->layout
== LAYOUT_4020
)
1305 return (hw_status_bits
>> 13) & 0x7;
1307 return (hw_status_bits
>> 12) & 0xf;
1310 static void set_dac_range_bits(struct comedi_device
*dev
,
1311 volatile uint16_t * bits
, unsigned int channel
,
1314 unsigned int code
= board(dev
)->ao_range_code
[range
];
1317 comedi_error(dev
, "bug! bad channel?");
1319 comedi_error(dev
, "bug! bad range code?");
1321 *bits
&= ~(0x3 << (2 * channel
));
1322 *bits
|= code
<< (2 * channel
);
1325 static inline int ao_cmd_is_supported(const struct pcidas64_board
*board
)
1327 return board
->ao_nchan
&& board
->layout
!= LAYOUT_4020
;
1330 /* initialize plx9080 chip */
1331 static void init_plx9080(struct comedi_device
*dev
)
1334 void __iomem
*plx_iobase
= priv(dev
)->plx9080_iobase
;
1336 priv(dev
)->plx_control_bits
=
1337 readl(priv(dev
)->plx9080_iobase
+ PLX_CONTROL_REG
);
1340 DEBUG_PRINT(" plx interrupt status 0x%x\n",
1341 readl(plx_iobase
+ PLX_INTRCS_REG
));
1342 DEBUG_PRINT(" plx id bits 0x%x\n", readl(plx_iobase
+ PLX_ID_REG
));
1343 DEBUG_PRINT(" plx control reg 0x%x\n", priv(dev
)->plx_control_bits
);
1344 DEBUG_PRINT(" plx mode/arbitration reg 0x%x\n",
1345 readl(plx_iobase
+ PLX_MARB_REG
));
1346 DEBUG_PRINT(" plx region0 reg 0x%x\n",
1347 readl(plx_iobase
+ PLX_REGION0_REG
));
1348 DEBUG_PRINT(" plx region1 reg 0x%x\n",
1349 readl(plx_iobase
+ PLX_REGION1_REG
));
1351 DEBUG_PRINT(" plx revision 0x%x\n",
1352 readl(plx_iobase
+ PLX_REVISION_REG
));
1353 DEBUG_PRINT(" plx dma channel 0 mode 0x%x\n",
1354 readl(plx_iobase
+ PLX_DMA0_MODE_REG
));
1355 DEBUG_PRINT(" plx dma channel 1 mode 0x%x\n",
1356 readl(plx_iobase
+ PLX_DMA1_MODE_REG
));
1357 DEBUG_PRINT(" plx dma channel 0 pci address 0x%x\n",
1358 readl(plx_iobase
+ PLX_DMA0_PCI_ADDRESS_REG
));
1359 DEBUG_PRINT(" plx dma channel 0 local address 0x%x\n",
1360 readl(plx_iobase
+ PLX_DMA0_LOCAL_ADDRESS_REG
));
1361 DEBUG_PRINT(" plx dma channel 0 transfer size 0x%x\n",
1362 readl(plx_iobase
+ PLX_DMA0_TRANSFER_SIZE_REG
));
1363 DEBUG_PRINT(" plx dma channel 0 descriptor 0x%x\n",
1364 readl(plx_iobase
+ PLX_DMA0_DESCRIPTOR_REG
));
1365 DEBUG_PRINT(" plx dma channel 0 command status 0x%x\n",
1366 readb(plx_iobase
+ PLX_DMA0_CS_REG
));
1367 DEBUG_PRINT(" plx dma channel 0 threshold 0x%x\n",
1368 readl(plx_iobase
+ PLX_DMA0_THRESHOLD_REG
));
1369 DEBUG_PRINT(" plx bigend 0x%x\n", readl(plx_iobase
+ PLX_BIGEND_REG
));
1372 bits
= BIGEND_DMA0
| BIGEND_DMA1
;
1376 writel(bits
, priv(dev
)->plx9080_iobase
+ PLX_BIGEND_REG
);
1378 disable_plx_interrupts(dev
);
1383 /* configure dma0 mode */
1385 /* enable ready input, not sure if this is necessary */
1386 bits
|= PLX_DMA_EN_READYIN_BIT
;
1387 /* enable bterm, not sure if this is necessary */
1388 bits
|= PLX_EN_BTERM_BIT
;
1389 /* enable dma chaining */
1390 bits
|= PLX_EN_CHAIN_BIT
;
1391 /* enable interrupt on dma done (probably don't need this, since chain never finishes) */
1392 bits
|= PLX_EN_DMA_DONE_INTR_BIT
;
1393 /* don't increment local address during transfers (we are transferring from a fixed fifo register) */
1394 bits
|= PLX_LOCAL_ADDR_CONST_BIT
;
1395 /* route dma interrupt to pci bus */
1396 bits
|= PLX_DMA_INTR_PCI_BIT
;
1397 /* enable demand mode */
1398 bits
|= PLX_DEMAND_MODE_BIT
;
1399 /* enable local burst mode */
1400 bits
|= PLX_DMA_LOCAL_BURST_EN_BIT
;
1401 /* 4020 uses 32 bit dma */
1402 if (board(dev
)->layout
== LAYOUT_4020
) {
1403 bits
|= PLX_LOCAL_BUS_32_WIDE_BITS
;
1404 } else { /* localspace0 bus is 16 bits wide */
1405 bits
|= PLX_LOCAL_BUS_16_WIDE_BITS
;
1407 writel(bits
, plx_iobase
+ PLX_DMA1_MODE_REG
);
1408 if (ao_cmd_is_supported(board(dev
)))
1409 writel(bits
, plx_iobase
+ PLX_DMA0_MODE_REG
);
1411 /* enable interrupts on plx 9080 */
1412 priv(dev
)->plx_intcsr_bits
|=
1413 ICS_AERR
| ICS_PERR
| ICS_PIE
| ICS_PLIE
| ICS_PAIE
| ICS_LIE
|
1414 ICS_DMA0_E
| ICS_DMA1_E
;
1415 writel(priv(dev
)->plx_intcsr_bits
,
1416 priv(dev
)->plx9080_iobase
+ PLX_INTRCS_REG
);
1419 /* Allocate and initialize the subdevice structures.
1421 static int setup_subdevices(struct comedi_device
*dev
)
1423 struct comedi_subdevice
*s
;
1424 void __iomem
*dio_8255_iobase
;
1427 if (alloc_subdevices(dev
, 10) < 0)
1430 s
= dev
->subdevices
+ 0;
1431 /* analog input subdevice */
1432 dev
->read_subdev
= s
;
1433 s
->type
= COMEDI_SUBD_AI
;
1434 s
->subdev_flags
= SDF_READABLE
| SDF_GROUND
| SDF_DITHER
| SDF_CMD_READ
;
1435 if (board(dev
)->layout
== LAYOUT_60XX
)
1436 s
->subdev_flags
|= SDF_COMMON
| SDF_DIFF
;
1437 else if (board(dev
)->layout
== LAYOUT_64XX
)
1438 s
->subdev_flags
|= SDF_DIFF
;
1439 /* XXX Number of inputs in differential mode is ignored */
1440 s
->n_chan
= board(dev
)->ai_se_chans
;
1441 s
->len_chanlist
= 0x2000;
1442 s
->maxdata
= (1 << board(dev
)->ai_bits
) - 1;
1443 s
->range_table
= board(dev
)->ai_range_table
;
1444 s
->insn_read
= ai_rinsn
;
1445 s
->insn_config
= ai_config_insn
;
1447 s
->do_cmdtest
= ai_cmdtest
;
1448 s
->cancel
= ai_cancel
;
1449 if (board(dev
)->layout
== LAYOUT_4020
) {
1451 /* set adc to read from inputs (not internal calibration sources) */
1452 priv(dev
)->i2c_cal_range_bits
= adc_src_4020_bits(4);
1453 /* set channels to +-5 volt input ranges */
1454 for (i
= 0; i
< s
->n_chan
; i
++)
1455 priv(dev
)->i2c_cal_range_bits
|= attenuate_bit(i
);
1456 data
= priv(dev
)->i2c_cal_range_bits
;
1457 i2c_write(dev
, RANGE_CAL_I2C_ADDR
, &data
, sizeof(data
));
1460 /* analog output subdevice */
1461 s
= dev
->subdevices
+ 1;
1462 if (board(dev
)->ao_nchan
) {
1463 s
->type
= COMEDI_SUBD_AO
;
1465 SDF_READABLE
| SDF_WRITABLE
| SDF_GROUND
| SDF_CMD_WRITE
;
1466 s
->n_chan
= board(dev
)->ao_nchan
;
1467 s
->maxdata
= (1 << board(dev
)->ao_bits
) - 1;
1468 s
->range_table
= board(dev
)->ao_range_table
;
1469 s
->insn_read
= ao_readback_insn
;
1470 s
->insn_write
= ao_winsn
;
1471 if (ao_cmd_is_supported(board(dev
))) {
1472 dev
->write_subdev
= s
;
1473 s
->do_cmdtest
= ao_cmdtest
;
1475 s
->len_chanlist
= board(dev
)->ao_nchan
;
1476 s
->cancel
= ao_cancel
;
1479 s
->type
= COMEDI_SUBD_UNUSED
;
1483 s
= dev
->subdevices
+ 2;
1484 if (board(dev
)->layout
== LAYOUT_64XX
) {
1485 s
->type
= COMEDI_SUBD_DI
;
1486 s
->subdev_flags
= SDF_READABLE
;
1489 s
->range_table
= &range_digital
;
1490 s
->insn_bits
= di_rbits
;
1492 s
->type
= COMEDI_SUBD_UNUSED
;
1494 /* digital output */
1495 if (board(dev
)->layout
== LAYOUT_64XX
) {
1496 s
= dev
->subdevices
+ 3;
1497 s
->type
= COMEDI_SUBD_DO
;
1498 s
->subdev_flags
= SDF_WRITABLE
| SDF_READABLE
;
1501 s
->range_table
= &range_digital
;
1502 s
->insn_bits
= do_wbits
;
1504 s
->type
= COMEDI_SUBD_UNUSED
;
1507 s
= dev
->subdevices
+ 4;
1508 if (board(dev
)->has_8255
) {
1509 if (board(dev
)->layout
== LAYOUT_4020
) {
1511 priv(dev
)->main_iobase
+ I8255_4020_REG
;
1512 subdev_8255_init(dev
, s
, dio_callback_4020
,
1513 (unsigned long)dio_8255_iobase
);
1516 priv(dev
)->dio_counter_iobase
+ DIO_8255_OFFSET
;
1517 subdev_8255_init(dev
, s
, dio_callback
,
1518 (unsigned long)dio_8255_iobase
);
1521 s
->type
= COMEDI_SUBD_UNUSED
;
1523 /* 8 channel dio for 60xx */
1524 s
= dev
->subdevices
+ 5;
1525 if (board(dev
)->layout
== LAYOUT_60XX
) {
1526 s
->type
= COMEDI_SUBD_DIO
;
1527 s
->subdev_flags
= SDF_WRITABLE
| SDF_READABLE
;
1530 s
->range_table
= &range_digital
;
1531 s
->insn_config
= dio_60xx_config_insn
;
1532 s
->insn_bits
= dio_60xx_wbits
;
1534 s
->type
= COMEDI_SUBD_UNUSED
;
1537 s
= dev
->subdevices
+ 6;
1538 s
->type
= COMEDI_SUBD_CALIB
;
1539 s
->subdev_flags
= SDF_READABLE
| SDF_WRITABLE
| SDF_INTERNAL
;
1541 if (board(dev
)->layout
== LAYOUT_4020
)
1545 s
->insn_read
= calib_read_insn
;
1546 s
->insn_write
= calib_write_insn
;
1547 for (i
= 0; i
< s
->n_chan
; i
++)
1548 caldac_write(dev
, i
, s
->maxdata
/ 2);
1550 /* 2 channel ad8402 potentiometer */
1551 s
= dev
->subdevices
+ 7;
1552 if (board(dev
)->layout
== LAYOUT_64XX
) {
1553 s
->type
= COMEDI_SUBD_CALIB
;
1554 s
->subdev_flags
= SDF_READABLE
| SDF_WRITABLE
| SDF_INTERNAL
;
1556 s
->insn_read
= ad8402_read_insn
;
1557 s
->insn_write
= ad8402_write_insn
;
1559 for (i
= 0; i
< s
->n_chan
; i
++)
1560 ad8402_write(dev
, i
, s
->maxdata
/ 2);
1562 s
->type
= COMEDI_SUBD_UNUSED
;
1564 /* serial EEPROM, if present */
1565 s
= dev
->subdevices
+ 8;
1566 if (readl(priv(dev
)->plx9080_iobase
+ PLX_CONTROL_REG
) & CTL_EECHK
) {
1567 s
->type
= COMEDI_SUBD_MEMORY
;
1568 s
->subdev_flags
= SDF_READABLE
| SDF_INTERNAL
;
1570 s
->maxdata
= 0xffff;
1571 s
->insn_read
= eeprom_read_insn
;
1573 s
->type
= COMEDI_SUBD_UNUSED
;
1575 /* user counter subd XXX */
1576 s
= dev
->subdevices
+ 9;
1577 s
->type
= COMEDI_SUBD_UNUSED
;
1582 static void disable_plx_interrupts(struct comedi_device
*dev
)
1584 priv(dev
)->plx_intcsr_bits
= 0;
1585 writel(priv(dev
)->plx_intcsr_bits
,
1586 priv(dev
)->plx9080_iobase
+ PLX_INTRCS_REG
);
1589 static void init_stc_registers(struct comedi_device
*dev
)
1592 unsigned long flags
;
1594 spin_lock_irqsave(&dev
->spinlock
, flags
);
1596 /* bit should be set for 6025, although docs say boards with <= 16 chans should be cleared XXX */
1598 priv(dev
)->adc_control1_bits
|= ADC_QUEUE_CONFIG_BIT
;
1599 writew(priv(dev
)->adc_control1_bits
,
1600 priv(dev
)->main_iobase
+ ADC_CONTROL1_REG
);
1602 /* 6402/16 manual says this register must be initialized to 0xff? */
1603 writew(0xff, priv(dev
)->main_iobase
+ ADC_SAMPLE_INTERVAL_UPPER_REG
);
1605 bits
= SLOW_DAC_BIT
| DMA_CH_SELECT_BIT
;
1606 if (board(dev
)->layout
== LAYOUT_4020
)
1607 bits
|= INTERNAL_CLOCK_4020_BITS
;
1608 priv(dev
)->hw_config_bits
|= bits
;
1609 writew(priv(dev
)->hw_config_bits
,
1610 priv(dev
)->main_iobase
+ HW_CONFIG_REG
);
1612 writew(0, priv(dev
)->main_iobase
+ DAQ_SYNC_REG
);
1613 writew(0, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
1615 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
1617 /* set fifos to maximum size */
1618 priv(dev
)->fifo_size_bits
|= DAC_FIFO_BITS
;
1619 set_ai_fifo_segment_length(dev
,
1620 board(dev
)->ai_fifo
->max_segment_length
);
1622 priv(dev
)->dac_control1_bits
= DAC_OUTPUT_ENABLE_BIT
;
1623 priv(dev
)->intr_enable_bits
= /* EN_DAC_INTR_SRC_BIT | DAC_INTR_QEMPTY_BITS | */
1624 EN_DAC_DONE_INTR_BIT
| EN_DAC_UNDERRUN_BIT
;
1625 writew(priv(dev
)->intr_enable_bits
,
1626 priv(dev
)->main_iobase
+ INTR_ENABLE_REG
);
1628 disable_ai_pacing(dev
);
1631 static int alloc_and_init_dma_members(struct comedi_device
*dev
)
1635 /* alocate pci dma buffers */
1636 for (i
= 0; i
< ai_dma_ring_count(board(dev
)); i
++) {
1637 priv(dev
)->ai_buffer
[i
] =
1638 pci_alloc_consistent(priv(dev
)->hw_dev
, DMA_BUFFER_SIZE
,
1639 &priv(dev
)->ai_buffer_bus_addr
[i
]);
1640 if (priv(dev
)->ai_buffer
[i
] == NULL
)
1644 for (i
= 0; i
< AO_DMA_RING_COUNT
; i
++) {
1645 if (ao_cmd_is_supported(board(dev
))) {
1646 priv(dev
)->ao_buffer
[i
] =
1647 pci_alloc_consistent(priv(dev
)->hw_dev
,
1650 ao_buffer_bus_addr
[i
]);
1651 if (priv(dev
)->ao_buffer
[i
] == NULL
)
1656 /* allocate dma descriptors */
1657 priv(dev
)->ai_dma_desc
=
1658 pci_alloc_consistent(priv(dev
)->hw_dev
,
1659 sizeof(struct plx_dma_desc
) *
1660 ai_dma_ring_count(board(dev
)),
1661 &priv(dev
)->ai_dma_desc_bus_addr
);
1662 if (priv(dev
)->ai_dma_desc
== NULL
)
1665 DEBUG_PRINT("ai dma descriptors start at bus addr 0x%x\n",
1666 priv(dev
)->ai_dma_desc_bus_addr
);
1667 if (ao_cmd_is_supported(board(dev
))) {
1668 priv(dev
)->ao_dma_desc
=
1669 pci_alloc_consistent(priv(dev
)->hw_dev
,
1670 sizeof(struct plx_dma_desc
) *
1672 &priv(dev
)->ao_dma_desc_bus_addr
);
1673 if (priv(dev
)->ao_dma_desc
== NULL
)
1676 DEBUG_PRINT("ao dma descriptors start at bus addr 0x%x\n",
1677 priv(dev
)->ao_dma_desc_bus_addr
);
1679 /* initialize dma descriptors */
1680 for (i
= 0; i
< ai_dma_ring_count(board(dev
)); i
++) {
1681 priv(dev
)->ai_dma_desc
[i
].pci_start_addr
=
1682 cpu_to_le32(priv(dev
)->ai_buffer_bus_addr
[i
]);
1683 if (board(dev
)->layout
== LAYOUT_4020
)
1684 priv(dev
)->ai_dma_desc
[i
].local_start_addr
=
1685 cpu_to_le32(priv(dev
)->local1_iobase
+
1688 priv(dev
)->ai_dma_desc
[i
].local_start_addr
=
1689 cpu_to_le32(priv(dev
)->local0_iobase
+
1691 priv(dev
)->ai_dma_desc
[i
].transfer_size
= cpu_to_le32(0);
1692 priv(dev
)->ai_dma_desc
[i
].next
=
1693 cpu_to_le32((priv(dev
)->ai_dma_desc_bus_addr
+ ((i
+
1698 sizeof(priv(dev
)->ai_dma_desc
[0])) |
1699 PLX_DESC_IN_PCI_BIT
| PLX_INTR_TERM_COUNT
|
1700 PLX_XFER_LOCAL_TO_PCI
);
1702 if (ao_cmd_is_supported(board(dev
))) {
1703 for (i
= 0; i
< AO_DMA_RING_COUNT
; i
++) {
1704 priv(dev
)->ao_dma_desc
[i
].pci_start_addr
=
1705 cpu_to_le32(priv(dev
)->ao_buffer_bus_addr
[i
]);
1706 priv(dev
)->ao_dma_desc
[i
].local_start_addr
=
1707 cpu_to_le32(priv(dev
)->local0_iobase
+
1709 priv(dev
)->ao_dma_desc
[i
].transfer_size
=
1711 priv(dev
)->ao_dma_desc
[i
].next
=
1712 cpu_to_le32((priv(dev
)->ao_dma_desc_bus_addr
+
1713 ((i
+ 1) % (AO_DMA_RING_COUNT
)) *
1714 sizeof(priv(dev
)->ao_dma_desc
[0])) |
1715 PLX_DESC_IN_PCI_BIT
|
1716 PLX_INTR_TERM_COUNT
);
1722 static inline void warn_external_queue(struct comedi_device
*dev
)
1725 "AO command and AI external channel queue cannot be used simultaneously.");
1727 "Use internal AI channel queue (channels must be consecutive and use same range/aref)");
1731 * Attach is called by the Comedi core to configure the driver
1732 * for a particular board.
1734 static int attach(struct comedi_device
*dev
, struct comedi_devconfig
*it
)
1736 struct pci_dev
*pcidev
= NULL
;
1738 uint32_t local_range
, local_decode
;
1742 * Allocate the private structure area.
1744 if (alloc_private(dev
, sizeof(struct pcidas64_private
)) < 0)
1748 * Probe the device to determine what device in the series it is.
1751 for_each_pci_dev(pcidev
) {
1752 /* is it not a computer boards card? */
1753 if (pcidev
->vendor
!= PCI_VENDOR_ID_COMPUTERBOARDS
)
1755 /* loop through cards supported by this driver */
1756 for (index
= 0; index
< ARRAY_SIZE(pcidas64_boards
); index
++) {
1757 if (pcidas64_boards
[index
].device_id
!= pcidev
->device
)
1759 /* was a particular bus/slot requested? */
1760 if (it
->options
[0] || it
->options
[1]) {
1761 /* are we on the wrong bus/slot? */
1762 if (pcidev
->bus
->number
!= it
->options
[0] ||
1763 PCI_SLOT(pcidev
->devfn
) != it
->options
[1]) {
1767 priv(dev
)->hw_dev
= pcidev
;
1768 dev
->board_ptr
= pcidas64_boards
+ index
;
1775 if (dev
->board_ptr
== NULL
) {
1777 ("No supported ComputerBoards/MeasurementComputing card found\n");
1781 dev_dbg(dev
->hw_dev
, "Found %s on bus %i, slot %i\n", board(dev
)->name
,
1782 pcidev
->bus
->number
, PCI_SLOT(pcidev
->devfn
));
1784 if (comedi_pci_enable(pcidev
, driver_cb_pcidas
.driver_name
)) {
1785 dev_warn(dev
->hw_dev
, "failed to enable PCI device and request regions\n");
1788 pci_set_master(pcidev
);
1790 /* Initialize dev->board_name */
1791 dev
->board_name
= board(dev
)->name
;
1793 priv(dev
)->plx9080_phys_iobase
=
1794 pci_resource_start(pcidev
, PLX9080_BADDRINDEX
);
1795 priv(dev
)->main_phys_iobase
=
1796 pci_resource_start(pcidev
, MAIN_BADDRINDEX
);
1797 priv(dev
)->dio_counter_phys_iobase
=
1798 pci_resource_start(pcidev
, DIO_COUNTER_BADDRINDEX
);
1800 /* remap, won't work with 2.0 kernels but who cares */
1801 priv(dev
)->plx9080_iobase
= ioremap(priv(dev
)->plx9080_phys_iobase
,
1802 pci_resource_len(pcidev
,
1803 PLX9080_BADDRINDEX
));
1804 priv(dev
)->main_iobase
=
1805 ioremap(priv(dev
)->main_phys_iobase
,
1806 pci_resource_len(pcidev
, MAIN_BADDRINDEX
));
1807 priv(dev
)->dio_counter_iobase
=
1808 ioremap(priv(dev
)->dio_counter_phys_iobase
,
1809 pci_resource_len(pcidev
, DIO_COUNTER_BADDRINDEX
));
1811 if (!priv(dev
)->plx9080_iobase
|| !priv(dev
)->main_iobase
1812 || !priv(dev
)->dio_counter_iobase
) {
1813 dev_warn(dev
->hw_dev
, "failed to remap io memory\n");
1817 DEBUG_PRINT(" plx9080 remapped to 0x%p\n", priv(dev
)->plx9080_iobase
);
1818 DEBUG_PRINT(" main remapped to 0x%p\n", priv(dev
)->main_iobase
);
1819 DEBUG_PRINT(" diocounter remapped to 0x%p\n",
1820 priv(dev
)->dio_counter_iobase
);
1822 /* figure out what local addresses are */
1824 readl(priv(dev
)->plx9080_iobase
+ PLX_LAS0RNG_REG
) & LRNG_MEM_MASK
;
1826 readl(priv(dev
)->plx9080_iobase
+
1827 PLX_LAS0MAP_REG
) & local_range
& LMAP_MEM_MASK
;
1828 priv(dev
)->local0_iobase
=
1829 ((uint32_t) priv(dev
)->main_phys_iobase
& ~local_range
) |
1832 readl(priv(dev
)->plx9080_iobase
+ PLX_LAS1RNG_REG
) & LRNG_MEM_MASK
;
1834 readl(priv(dev
)->plx9080_iobase
+
1835 PLX_LAS1MAP_REG
) & local_range
& LMAP_MEM_MASK
;
1836 priv(dev
)->local1_iobase
=
1837 ((uint32_t) priv(dev
)->dio_counter_phys_iobase
& ~local_range
) |
1840 DEBUG_PRINT(" local 0 io addr 0x%x\n", priv(dev
)->local0_iobase
);
1841 DEBUG_PRINT(" local 1 io addr 0x%x\n", priv(dev
)->local1_iobase
);
1843 retval
= alloc_and_init_dma_members(dev
);
1847 priv(dev
)->hw_revision
=
1848 hw_revision(dev
, readw(priv(dev
)->main_iobase
+ HW_STATUS_REG
));
1849 dev_dbg(dev
->hw_dev
, "stc hardware revision %i\n",
1850 priv(dev
)->hw_revision
);
1852 init_stc_registers(dev
);
1854 if (request_irq(pcidev
->irq
, handle_interrupt
, IRQF_SHARED
,
1855 "cb_pcidas64", dev
)) {
1856 dev_dbg(dev
->hw_dev
, "unable to allocate irq %u\n",
1860 dev
->irq
= pcidev
->irq
;
1861 dev_dbg(dev
->hw_dev
, "irq %u\n", dev
->irq
);
1863 retval
= setup_subdevices(dev
);
1872 * _detach is called to deconfigure a device. It should deallocate
1874 * This function is also called when _attach() fails, so it should be
1875 * careful not to release resources that were not necessarily
1876 * allocated by _attach(). dev->private and dev->subdevices are
1877 * deallocated automatically by the core.
1879 static int detach(struct comedi_device
*dev
)
1884 free_irq(dev
->irq
, dev
);
1886 if (priv(dev
)->hw_dev
) {
1887 if (priv(dev
)->plx9080_iobase
) {
1888 disable_plx_interrupts(dev
);
1889 iounmap(priv(dev
)->plx9080_iobase
);
1891 if (priv(dev
)->main_iobase
)
1892 iounmap(priv(dev
)->main_iobase
);
1893 if (priv(dev
)->dio_counter_iobase
)
1894 iounmap(priv(dev
)->dio_counter_iobase
);
1895 /* free pci dma buffers */
1896 for (i
= 0; i
< ai_dma_ring_count(board(dev
)); i
++) {
1897 if (priv(dev
)->ai_buffer
[i
])
1898 pci_free_consistent(priv(dev
)->hw_dev
,
1903 (dev
)->ai_buffer_bus_addr
1906 for (i
= 0; i
< AO_DMA_RING_COUNT
; i
++) {
1907 if (priv(dev
)->ao_buffer
[i
])
1908 pci_free_consistent(priv(dev
)->hw_dev
,
1913 (dev
)->ao_buffer_bus_addr
1916 /* free dma descriptors */
1917 if (priv(dev
)->ai_dma_desc
)
1918 pci_free_consistent(priv(dev
)->hw_dev
,
1919 sizeof(struct plx_dma_desc
)
1921 ai_dma_ring_count(board
1923 priv(dev
)->ai_dma_desc
,
1925 ai_dma_desc_bus_addr
);
1926 if (priv(dev
)->ao_dma_desc
)
1927 pci_free_consistent(priv(dev
)->hw_dev
,
1928 sizeof(struct plx_dma_desc
)
1929 * AO_DMA_RING_COUNT
,
1930 priv(dev
)->ao_dma_desc
,
1932 ao_dma_desc_bus_addr
);
1933 if (priv(dev
)->main_phys_iobase
)
1934 comedi_pci_disable(priv(dev
)->hw_dev
);
1936 pci_dev_put(priv(dev
)->hw_dev
);
1939 if (dev
->subdevices
)
1940 subdev_8255_cleanup(dev
, dev
->subdevices
+ 4);
1945 static int ai_rinsn(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
1946 struct comedi_insn
*insn
, unsigned int *data
)
1948 unsigned int bits
= 0, n
, i
;
1949 unsigned int channel
, range
, aref
;
1950 unsigned long flags
;
1951 static const int timeout
= 100;
1953 DEBUG_PRINT("chanspec 0x%x\n", insn
->chanspec
);
1954 channel
= CR_CHAN(insn
->chanspec
);
1955 range
= CR_RANGE(insn
->chanspec
);
1956 aref
= CR_AREF(insn
->chanspec
);
1958 /* disable card's analog input interrupt sources and pacing */
1959 /* 4020 generates dac done interrupts even though they are disabled */
1960 disable_ai_pacing(dev
);
1962 spin_lock_irqsave(&dev
->spinlock
, flags
);
1963 if (insn
->chanspec
& CR_ALT_FILTER
)
1964 priv(dev
)->adc_control1_bits
|= ADC_DITHER_BIT
;
1966 priv(dev
)->adc_control1_bits
&= ~ADC_DITHER_BIT
;
1967 writew(priv(dev
)->adc_control1_bits
,
1968 priv(dev
)->main_iobase
+ ADC_CONTROL1_REG
);
1969 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
1971 if (board(dev
)->layout
!= LAYOUT_4020
) {
1972 /* use internal queue */
1973 priv(dev
)->hw_config_bits
&= ~EXT_QUEUE_BIT
;
1974 writew(priv(dev
)->hw_config_bits
,
1975 priv(dev
)->main_iobase
+ HW_CONFIG_REG
);
1977 /* ALT_SOURCE is internal calibration reference */
1978 if (insn
->chanspec
& CR_ALT_SOURCE
) {
1979 unsigned int cal_en_bit
;
1981 DEBUG_PRINT("reading calibration source\n");
1982 if (board(dev
)->layout
== LAYOUT_60XX
)
1983 cal_en_bit
= CAL_EN_60XX_BIT
;
1985 cal_en_bit
= CAL_EN_64XX_BIT
;
1986 /* select internal reference source to connect to channel 0 */
1988 adc_src_bits(priv(dev
)->calibration_source
),
1989 priv(dev
)->main_iobase
+ CALIBRATION_REG
);
1991 /* make sure internal calibration source is turned off */
1992 writew(0, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
1994 /* load internal queue */
1997 bits
|= ai_range_bits_6xxx(dev
, CR_RANGE(insn
->chanspec
));
1998 /* set single-ended / differential */
1999 bits
|= se_diff_bit_6xxx(dev
, aref
== AREF_DIFF
);
2000 if (aref
== AREF_COMMON
)
2001 bits
|= ADC_COMMON_BIT
;
2002 bits
|= adc_chan_bits(channel
);
2003 /* set stop channel */
2004 writew(adc_chan_bits(channel
),
2005 priv(dev
)->main_iobase
+ ADC_QUEUE_HIGH_REG
);
2006 /* set start channel, and rest of settings */
2007 writew(bits
, priv(dev
)->main_iobase
+ ADC_QUEUE_LOAD_REG
);
2009 uint8_t old_cal_range_bits
= priv(dev
)->i2c_cal_range_bits
;
2011 priv(dev
)->i2c_cal_range_bits
&= ~ADC_SRC_4020_MASK
;
2012 if (insn
->chanspec
& CR_ALT_SOURCE
) {
2013 DEBUG_PRINT("reading calibration source\n");
2014 priv(dev
)->i2c_cal_range_bits
|=
2015 adc_src_4020_bits(priv(dev
)->calibration_source
);
2016 } else { /* select BNC inputs */
2017 priv(dev
)->i2c_cal_range_bits
|= adc_src_4020_bits(4);
2021 priv(dev
)->i2c_cal_range_bits
|= attenuate_bit(channel
);
2023 priv(dev
)->i2c_cal_range_bits
&=
2024 ~attenuate_bit(channel
);
2025 /* update calibration/range i2c register only if necessary, as it is very slow */
2026 if (old_cal_range_bits
!= priv(dev
)->i2c_cal_range_bits
) {
2027 uint8_t i2c_data
= priv(dev
)->i2c_cal_range_bits
;
2028 i2c_write(dev
, RANGE_CAL_I2C_ADDR
, &i2c_data
,
2032 /* 4020 manual asks that sample interval register to be set before writing to convert register.
2033 * Using somewhat arbitrary setting of 4 master clock ticks = 0.1 usec */
2035 priv(dev
)->main_iobase
+ ADC_SAMPLE_INTERVAL_UPPER_REG
);
2037 priv(dev
)->main_iobase
+ ADC_SAMPLE_INTERVAL_LOWER_REG
);
2040 for (n
= 0; n
< insn
->n
; n
++) {
2042 /* clear adc buffer (inside loop for 4020 sake) */
2043 writew(0, priv(dev
)->main_iobase
+ ADC_BUFFER_CLEAR_REG
);
2045 /* trigger conversion, bits sent only matter for 4020 */
2046 writew(adc_convert_chan_4020_bits(CR_CHAN(insn
->chanspec
)),
2047 priv(dev
)->main_iobase
+ ADC_CONVERT_REG
);
2050 for (i
= 0; i
< timeout
; i
++) {
2051 bits
= readw(priv(dev
)->main_iobase
+ HW_STATUS_REG
);
2052 DEBUG_PRINT(" pipe bits 0x%x\n", pipe_full_bits(bits
));
2053 if (board(dev
)->layout
== LAYOUT_4020
) {
2054 if (readw(priv(dev
)->main_iobase
+
2055 ADC_WRITE_PNTR_REG
))
2058 if (pipe_full_bits(bits
))
2063 DEBUG_PRINT(" looped %i times waiting for data\n", i
);
2065 comedi_error(dev
, " analog input read insn timed out");
2066 printk(" status 0x%x\n", bits
);
2069 if (board(dev
)->layout
== LAYOUT_4020
)
2071 readl(priv(dev
)->dio_counter_iobase
+
2072 ADC_FIFO_REG
) & 0xffff;
2075 readw(priv(dev
)->main_iobase
+ PIPE1_READ_REG
);
2081 static int ai_config_calibration_source(struct comedi_device
*dev
,
2084 unsigned int source
= data
[1];
2085 int num_calibration_sources
;
2087 if (board(dev
)->layout
== LAYOUT_60XX
)
2088 num_calibration_sources
= 16;
2090 num_calibration_sources
= 8;
2091 if (source
>= num_calibration_sources
) {
2092 dev_dbg(dev
->hw_dev
, "invalid calibration source: %i\n",
2097 DEBUG_PRINT("setting calibration source to %i\n", source
);
2098 priv(dev
)->calibration_source
= source
;
2103 static int ai_config_block_size(struct comedi_device
*dev
, unsigned int *data
)
2106 const struct hw_fifo_info
*const fifo
= board(dev
)->ai_fifo
;
2107 unsigned int block_size
, requested_block_size
;
2110 requested_block_size
= data
[1];
2112 if (requested_block_size
) {
2114 requested_block_size
* fifo
->num_segments
/ bytes_in_sample
;
2116 retval
= set_ai_fifo_size(dev
, fifo_size
);
2122 block_size
= ai_fifo_size(dev
) / fifo
->num_segments
* bytes_in_sample
;
2124 data
[1] = block_size
;
2129 static int ai_config_master_clock_4020(struct comedi_device
*dev
,
2132 unsigned int divisor
= data
[4];
2141 case COMEDI_EV_SCAN_BEGIN
:
2142 priv(dev
)->ext_clock
.divisor
= divisor
;
2143 priv(dev
)->ext_clock
.chanspec
= data
[2];
2152 return retval
? retval
: 5;
2155 /* XXX could add support for 60xx series */
2156 static int ai_config_master_clock(struct comedi_device
*dev
, unsigned int *data
)
2159 switch (board(dev
)->layout
) {
2161 return ai_config_master_clock_4020(dev
, data
);
2171 static int ai_config_insn(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
2172 struct comedi_insn
*insn
, unsigned int *data
)
2177 case INSN_CONFIG_ALT_SOURCE
:
2178 return ai_config_calibration_source(dev
, data
);
2180 case INSN_CONFIG_BLOCK_SIZE
:
2181 return ai_config_block_size(dev
, data
);
2183 case INSN_CONFIG_TIMER_1
:
2184 return ai_config_master_clock(dev
, data
);
2193 static int ai_cmdtest(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
2194 struct comedi_cmd
*cmd
)
2198 unsigned int tmp_arg
, tmp_arg2
;
2201 unsigned int triggers
;
2203 /* step 1: make sure trigger sources are trivially valid */
2205 tmp
= cmd
->start_src
;
2206 cmd
->start_src
&= TRIG_NOW
| TRIG_EXT
;
2207 if (!cmd
->start_src
|| tmp
!= cmd
->start_src
)
2210 tmp
= cmd
->scan_begin_src
;
2211 triggers
= TRIG_TIMER
;
2212 if (board(dev
)->layout
== LAYOUT_4020
)
2213 triggers
|= TRIG_OTHER
;
2215 triggers
|= TRIG_FOLLOW
;
2216 cmd
->scan_begin_src
&= triggers
;
2217 if (!cmd
->scan_begin_src
|| tmp
!= cmd
->scan_begin_src
)
2220 tmp
= cmd
->convert_src
;
2221 triggers
= TRIG_TIMER
;
2222 if (board(dev
)->layout
== LAYOUT_4020
)
2223 triggers
|= TRIG_NOW
;
2225 triggers
|= TRIG_EXT
;
2226 cmd
->convert_src
&= triggers
;
2227 if (!cmd
->convert_src
|| tmp
!= cmd
->convert_src
)
2230 tmp
= cmd
->scan_end_src
;
2231 cmd
->scan_end_src
&= TRIG_COUNT
;
2232 if (!cmd
->scan_end_src
|| tmp
!= cmd
->scan_end_src
)
2235 tmp
= cmd
->stop_src
;
2236 cmd
->stop_src
&= TRIG_COUNT
| TRIG_EXT
| TRIG_NONE
;
2237 if (!cmd
->stop_src
|| tmp
!= cmd
->stop_src
)
2243 /* step 2: make sure trigger sources are unique and mutually compatible */
2245 /* uniqueness check */
2246 if (cmd
->start_src
!= TRIG_NOW
&& cmd
->start_src
!= TRIG_EXT
)
2248 if (cmd
->scan_begin_src
!= TRIG_TIMER
&&
2249 cmd
->scan_begin_src
!= TRIG_OTHER
&&
2250 cmd
->scan_begin_src
!= TRIG_FOLLOW
)
2252 if (cmd
->convert_src
!= TRIG_TIMER
&&
2253 cmd
->convert_src
!= TRIG_EXT
&& cmd
->convert_src
!= TRIG_NOW
)
2255 if (cmd
->stop_src
!= TRIG_COUNT
&&
2256 cmd
->stop_src
!= TRIG_NONE
&& cmd
->stop_src
!= TRIG_EXT
)
2259 /* compatibility check */
2260 if (cmd
->convert_src
== TRIG_EXT
&& cmd
->scan_begin_src
== TRIG_TIMER
)
2262 if (cmd
->stop_src
!= TRIG_COUNT
&&
2263 cmd
->stop_src
!= TRIG_NONE
&& cmd
->stop_src
!= TRIG_EXT
)
2269 /* step 3: make sure arguments are trivially compatible */
2271 if (cmd
->convert_src
== TRIG_TIMER
) {
2272 if (board(dev
)->layout
== LAYOUT_4020
) {
2273 if (cmd
->convert_arg
) {
2274 cmd
->convert_arg
= 0;
2278 if (cmd
->convert_arg
< board(dev
)->ai_speed
) {
2279 cmd
->convert_arg
= board(dev
)->ai_speed
;
2282 if (cmd
->scan_begin_src
== TRIG_TIMER
) {
2283 /* if scans are timed faster than conversion rate allows */
2284 if (cmd
->convert_arg
* cmd
->chanlist_len
>
2285 cmd
->scan_begin_arg
) {
2286 cmd
->scan_begin_arg
=
2295 if (!cmd
->chanlist_len
) {
2296 cmd
->chanlist_len
= 1;
2299 if (cmd
->scan_end_arg
!= cmd
->chanlist_len
) {
2300 cmd
->scan_end_arg
= cmd
->chanlist_len
;
2304 switch (cmd
->stop_src
) {
2308 if (!cmd
->stop_arg
) {
2314 if (cmd
->stop_arg
!= 0) {
2326 /* step 4: fix up any arguments */
2328 if (cmd
->convert_src
== TRIG_TIMER
) {
2329 tmp_arg
= cmd
->convert_arg
;
2330 tmp_arg2
= cmd
->scan_begin_arg
;
2331 check_adc_timing(dev
, cmd
);
2332 if (tmp_arg
!= cmd
->convert_arg
)
2334 if (tmp_arg2
!= cmd
->scan_begin_arg
)
2341 /* make sure user is doesn't change analog reference mid chanlist */
2342 if (cmd
->chanlist
) {
2343 aref
= CR_AREF(cmd
->chanlist
[0]);
2344 for (i
= 1; i
< cmd
->chanlist_len
; i
++) {
2345 if (aref
!= CR_AREF(cmd
->chanlist
[i
])) {
2347 "all elements in chanlist must use the same analog reference");
2352 /* check 4020 chanlist */
2353 if (board(dev
)->layout
== LAYOUT_4020
) {
2354 unsigned int first_channel
= CR_CHAN(cmd
->chanlist
[0]);
2355 for (i
= 1; i
< cmd
->chanlist_len
; i
++) {
2356 if (CR_CHAN(cmd
->chanlist
[i
]) !=
2357 first_channel
+ i
) {
2359 "chanlist must use consecutive channels");
2364 if (cmd
->chanlist_len
== 3) {
2366 "chanlist cannot be 3 channels long, use 1, 2, or 4 channels");
2378 static int use_hw_sample_counter(struct comedi_cmd
*cmd
)
2380 /* disable for now until I work out a race */
2383 if (cmd
->stop_src
== TRIG_COUNT
&& cmd
->stop_arg
<= max_counter_value
)
2389 static void setup_sample_counters(struct comedi_device
*dev
,
2390 struct comedi_cmd
*cmd
)
2392 if (cmd
->stop_src
== TRIG_COUNT
) {
2393 /* set software count */
2394 priv(dev
)->ai_count
= cmd
->stop_arg
* cmd
->chanlist_len
;
2396 /* load hardware conversion counter */
2397 if (use_hw_sample_counter(cmd
)) {
2398 writew(cmd
->stop_arg
& 0xffff,
2399 priv(dev
)->main_iobase
+ ADC_COUNT_LOWER_REG
);
2400 writew((cmd
->stop_arg
>> 16) & 0xff,
2401 priv(dev
)->main_iobase
+ ADC_COUNT_UPPER_REG
);
2403 writew(1, priv(dev
)->main_iobase
+ ADC_COUNT_LOWER_REG
);
2407 static inline unsigned int dma_transfer_size(struct comedi_device
*dev
)
2409 unsigned int num_samples
;
2412 priv(dev
)->ai_fifo_segment_length
*
2413 board(dev
)->ai_fifo
->sample_packing_ratio
;
2414 if (num_samples
> DMA_BUFFER_SIZE
/ sizeof(uint16_t))
2415 num_samples
= DMA_BUFFER_SIZE
/ sizeof(uint16_t);
2420 static void disable_ai_pacing(struct comedi_device
*dev
)
2422 unsigned long flags
;
2424 disable_ai_interrupts(dev
);
2426 spin_lock_irqsave(&dev
->spinlock
, flags
);
2427 priv(dev
)->adc_control1_bits
&= ~ADC_SW_GATE_BIT
;
2428 writew(priv(dev
)->adc_control1_bits
,
2429 priv(dev
)->main_iobase
+ ADC_CONTROL1_REG
);
2430 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
2432 /* disable pacing, triggering, etc */
2433 writew(ADC_DMA_DISABLE_BIT
| ADC_SOFT_GATE_BITS
| ADC_GATE_LEVEL_BIT
,
2434 priv(dev
)->main_iobase
+ ADC_CONTROL0_REG
);
2437 static void disable_ai_interrupts(struct comedi_device
*dev
)
2439 unsigned long flags
;
2441 spin_lock_irqsave(&dev
->spinlock
, flags
);
2442 priv(dev
)->intr_enable_bits
&=
2443 ~EN_ADC_INTR_SRC_BIT
& ~EN_ADC_DONE_INTR_BIT
&
2444 ~EN_ADC_ACTIVE_INTR_BIT
& ~EN_ADC_STOP_INTR_BIT
&
2445 ~EN_ADC_OVERRUN_BIT
& ~ADC_INTR_SRC_MASK
;
2446 writew(priv(dev
)->intr_enable_bits
,
2447 priv(dev
)->main_iobase
+ INTR_ENABLE_REG
);
2448 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
2450 DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev
)->intr_enable_bits
);
2453 static void enable_ai_interrupts(struct comedi_device
*dev
,
2454 const struct comedi_cmd
*cmd
)
2457 unsigned long flags
;
2459 bits
= EN_ADC_OVERRUN_BIT
| EN_ADC_DONE_INTR_BIT
|
2460 EN_ADC_ACTIVE_INTR_BIT
| EN_ADC_STOP_INTR_BIT
;
2461 /* Use pio transfer and interrupt on end of conversion if TRIG_WAKE_EOS flag is set. */
2462 if (cmd
->flags
& TRIG_WAKE_EOS
) {
2463 /* 4020 doesn't support pio transfers except for fifo dregs */
2464 if (board(dev
)->layout
!= LAYOUT_4020
)
2465 bits
|= ADC_INTR_EOSCAN_BITS
| EN_ADC_INTR_SRC_BIT
;
2467 spin_lock_irqsave(&dev
->spinlock
, flags
);
2468 priv(dev
)->intr_enable_bits
|= bits
;
2469 writew(priv(dev
)->intr_enable_bits
,
2470 priv(dev
)->main_iobase
+ INTR_ENABLE_REG
);
2471 DEBUG_PRINT("intr enable bits 0x%x\n", priv(dev
)->intr_enable_bits
);
2472 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
2475 static uint32_t ai_convert_counter_6xxx(const struct comedi_device
*dev
,
2476 const struct comedi_cmd
*cmd
)
2478 /* supposed to load counter with desired divisor minus 3 */
2479 return cmd
->convert_arg
/ TIMER_BASE
- 3;
2482 static uint32_t ai_scan_counter_6xxx(struct comedi_device
*dev
,
2483 struct comedi_cmd
*cmd
)
2486 /* figure out how long we need to delay at end of scan */
2487 switch (cmd
->scan_begin_src
) {
2489 count
= (cmd
->scan_begin_arg
-
2490 (cmd
->convert_arg
* (cmd
->chanlist_len
- 1)))
2494 count
= cmd
->convert_arg
/ TIMER_BASE
;
2503 static uint32_t ai_convert_counter_4020(struct comedi_device
*dev
,
2504 struct comedi_cmd
*cmd
)
2506 unsigned int divisor
;
2508 switch (cmd
->scan_begin_src
) {
2510 divisor
= cmd
->scan_begin_arg
/ TIMER_BASE
;
2513 divisor
= priv(dev
)->ext_clock
.divisor
;
2515 default: /* should never happen */
2516 comedi_error(dev
, "bug! failed to set ai pacing!");
2521 /* supposed to load counter with desired divisor minus 2 for 4020 */
2525 static void select_master_clock_4020(struct comedi_device
*dev
,
2526 const struct comedi_cmd
*cmd
)
2528 /* select internal/external master clock */
2529 priv(dev
)->hw_config_bits
&= ~MASTER_CLOCK_4020_MASK
;
2530 if (cmd
->scan_begin_src
== TRIG_OTHER
) {
2531 int chanspec
= priv(dev
)->ext_clock
.chanspec
;
2533 if (CR_CHAN(chanspec
))
2534 priv(dev
)->hw_config_bits
|= BNC_CLOCK_4020_BITS
;
2536 priv(dev
)->hw_config_bits
|= EXT_CLOCK_4020_BITS
;
2538 priv(dev
)->hw_config_bits
|= INTERNAL_CLOCK_4020_BITS
;
2540 writew(priv(dev
)->hw_config_bits
,
2541 priv(dev
)->main_iobase
+ HW_CONFIG_REG
);
2544 static void select_master_clock(struct comedi_device
*dev
,
2545 const struct comedi_cmd
*cmd
)
2547 switch (board(dev
)->layout
) {
2549 select_master_clock_4020(dev
, cmd
);
2556 static inline void dma_start_sync(struct comedi_device
*dev
,
2557 unsigned int channel
)
2559 unsigned long flags
;
2561 /* spinlock for plx dma control/status reg */
2562 spin_lock_irqsave(&dev
->spinlock
, flags
);
2564 writeb(PLX_DMA_EN_BIT
| PLX_DMA_START_BIT
|
2565 PLX_CLEAR_DMA_INTR_BIT
,
2566 priv(dev
)->plx9080_iobase
+ PLX_DMA1_CS_REG
);
2568 writeb(PLX_DMA_EN_BIT
| PLX_DMA_START_BIT
|
2569 PLX_CLEAR_DMA_INTR_BIT
,
2570 priv(dev
)->plx9080_iobase
+ PLX_DMA0_CS_REG
);
2571 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
2574 static void set_ai_pacing(struct comedi_device
*dev
, struct comedi_cmd
*cmd
)
2576 uint32_t convert_counter
= 0, scan_counter
= 0;
2578 check_adc_timing(dev
, cmd
);
2580 select_master_clock(dev
, cmd
);
2582 if (board(dev
)->layout
== LAYOUT_4020
) {
2583 convert_counter
= ai_convert_counter_4020(dev
, cmd
);
2585 convert_counter
= ai_convert_counter_6xxx(dev
, cmd
);
2586 scan_counter
= ai_scan_counter_6xxx(dev
, cmd
);
2589 /* load lower 16 bits of convert interval */
2590 writew(convert_counter
& 0xffff,
2591 priv(dev
)->main_iobase
+ ADC_SAMPLE_INTERVAL_LOWER_REG
);
2592 DEBUG_PRINT("convert counter 0x%x\n", convert_counter
);
2593 /* load upper 8 bits of convert interval */
2594 writew((convert_counter
>> 16) & 0xff,
2595 priv(dev
)->main_iobase
+ ADC_SAMPLE_INTERVAL_UPPER_REG
);
2596 /* load lower 16 bits of scan delay */
2597 writew(scan_counter
& 0xffff,
2598 priv(dev
)->main_iobase
+ ADC_DELAY_INTERVAL_LOWER_REG
);
2599 /* load upper 8 bits of scan delay */
2600 writew((scan_counter
>> 16) & 0xff,
2601 priv(dev
)->main_iobase
+ ADC_DELAY_INTERVAL_UPPER_REG
);
2602 DEBUG_PRINT("scan counter 0x%x\n", scan_counter
);
2605 static int use_internal_queue_6xxx(const struct comedi_cmd
*cmd
)
2608 for (i
= 0; i
+ 1 < cmd
->chanlist_len
; i
++) {
2609 if (CR_CHAN(cmd
->chanlist
[i
+ 1]) !=
2610 CR_CHAN(cmd
->chanlist
[i
]) + 1)
2612 if (CR_RANGE(cmd
->chanlist
[i
+ 1]) !=
2613 CR_RANGE(cmd
->chanlist
[i
]))
2615 if (CR_AREF(cmd
->chanlist
[i
+ 1]) != CR_AREF(cmd
->chanlist
[i
]))
2621 static int setup_channel_queue(struct comedi_device
*dev
,
2622 const struct comedi_cmd
*cmd
)
2624 unsigned short bits
;
2627 if (board(dev
)->layout
!= LAYOUT_4020
) {
2628 if (use_internal_queue_6xxx(cmd
)) {
2629 priv(dev
)->hw_config_bits
&= ~EXT_QUEUE_BIT
;
2630 writew(priv(dev
)->hw_config_bits
,
2631 priv(dev
)->main_iobase
+ HW_CONFIG_REG
);
2634 bits
|= adc_chan_bits(CR_CHAN(cmd
->chanlist
[0]));
2636 bits
|= ai_range_bits_6xxx(dev
,
2637 CR_RANGE(cmd
->chanlist
[0]));
2638 /* set single-ended / differential */
2639 bits
|= se_diff_bit_6xxx(dev
,
2640 CR_AREF(cmd
->chanlist
[0]) ==
2642 if (CR_AREF(cmd
->chanlist
[0]) == AREF_COMMON
)
2643 bits
|= ADC_COMMON_BIT
;
2644 /* set stop channel */
2645 writew(adc_chan_bits
2646 (CR_CHAN(cmd
->chanlist
[cmd
->chanlist_len
- 1])),
2647 priv(dev
)->main_iobase
+ ADC_QUEUE_HIGH_REG
);
2648 /* set start channel, and rest of settings */
2650 priv(dev
)->main_iobase
+ ADC_QUEUE_LOAD_REG
);
2652 /* use external queue */
2653 if (dev
->write_subdev
&& dev
->write_subdev
->busy
) {
2654 warn_external_queue(dev
);
2657 priv(dev
)->hw_config_bits
|= EXT_QUEUE_BIT
;
2658 writew(priv(dev
)->hw_config_bits
,
2659 priv(dev
)->main_iobase
+ HW_CONFIG_REG
);
2660 /* clear DAC buffer to prevent weird interactions */
2662 priv(dev
)->main_iobase
+ DAC_BUFFER_CLEAR_REG
);
2663 /* clear queue pointer */
2664 writew(0, priv(dev
)->main_iobase
+ ADC_QUEUE_CLEAR_REG
);
2665 /* load external queue */
2666 for (i
= 0; i
< cmd
->chanlist_len
; i
++) {
2670 adc_chan_bits(CR_CHAN(cmd
->chanlist
[i
]));
2672 bits
|= ai_range_bits_6xxx(dev
,
2676 /* set single-ended / differential */
2677 bits
|= se_diff_bit_6xxx(dev
,
2681 if (CR_AREF(cmd
->chanlist
[i
]) == AREF_COMMON
)
2682 bits
|= ADC_COMMON_BIT
;
2683 /* mark end of queue */
2684 if (i
== cmd
->chanlist_len
- 1)
2685 bits
|= QUEUE_EOSCAN_BIT
|
2688 priv(dev
)->main_iobase
+
2689 ADC_QUEUE_FIFO_REG
);
2691 ("wrote 0x%x to external channel queue\n",
2694 /* doing a queue clear is not specified in board docs,
2695 * but required for reliable operation */
2696 writew(0, priv(dev
)->main_iobase
+ ADC_QUEUE_CLEAR_REG
);
2697 /* prime queue holding register */
2698 writew(0, priv(dev
)->main_iobase
+ ADC_QUEUE_LOAD_REG
);
2701 unsigned short old_cal_range_bits
=
2702 priv(dev
)->i2c_cal_range_bits
;
2704 priv(dev
)->i2c_cal_range_bits
&= ~ADC_SRC_4020_MASK
;
2705 /* select BNC inputs */
2706 priv(dev
)->i2c_cal_range_bits
|= adc_src_4020_bits(4);
2708 for (i
= 0; i
< cmd
->chanlist_len
; i
++) {
2709 unsigned int channel
= CR_CHAN(cmd
->chanlist
[i
]);
2710 unsigned int range
= CR_RANGE(cmd
->chanlist
[i
]);
2713 priv(dev
)->i2c_cal_range_bits
|=
2714 attenuate_bit(channel
);
2716 priv(dev
)->i2c_cal_range_bits
&=
2717 ~attenuate_bit(channel
);
2719 /* update calibration/range i2c register only if necessary, as it is very slow */
2720 if (old_cal_range_bits
!= priv(dev
)->i2c_cal_range_bits
) {
2721 uint8_t i2c_data
= priv(dev
)->i2c_cal_range_bits
;
2722 i2c_write(dev
, RANGE_CAL_I2C_ADDR
, &i2c_data
,
2729 static inline void load_first_dma_descriptor(struct comedi_device
*dev
,
2730 unsigned int dma_channel
,
2731 unsigned int descriptor_bits
)
2733 /* The transfer size, pci address, and local address registers
2734 * are supposedly unused during chained dma,
2735 * but I have found that left over values from last operation
2736 * occasionally cause problems with transfer of first dma
2737 * block. Initializing them to zero seems to fix the problem. */
2740 priv(dev
)->plx9080_iobase
+ PLX_DMA1_TRANSFER_SIZE_REG
);
2741 writel(0, priv(dev
)->plx9080_iobase
+ PLX_DMA1_PCI_ADDRESS_REG
);
2743 priv(dev
)->plx9080_iobase
+ PLX_DMA1_LOCAL_ADDRESS_REG
);
2744 writel(descriptor_bits
,
2745 priv(dev
)->plx9080_iobase
+ PLX_DMA1_DESCRIPTOR_REG
);
2748 priv(dev
)->plx9080_iobase
+ PLX_DMA0_TRANSFER_SIZE_REG
);
2749 writel(0, priv(dev
)->plx9080_iobase
+ PLX_DMA0_PCI_ADDRESS_REG
);
2751 priv(dev
)->plx9080_iobase
+ PLX_DMA0_LOCAL_ADDRESS_REG
);
2752 writel(descriptor_bits
,
2753 priv(dev
)->plx9080_iobase
+ PLX_DMA0_DESCRIPTOR_REG
);
2757 static int ai_cmd(struct comedi_device
*dev
, struct comedi_subdevice
*s
)
2759 struct comedi_async
*async
= s
->async
;
2760 struct comedi_cmd
*cmd
= &async
->cmd
;
2763 unsigned long flags
;
2766 disable_ai_pacing(dev
);
2769 retval
= setup_channel_queue(dev
, cmd
);
2773 /* make sure internal calibration source is turned off */
2774 writew(0, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
2776 set_ai_pacing(dev
, cmd
);
2778 setup_sample_counters(dev
, cmd
);
2780 enable_ai_interrupts(dev
, cmd
);
2782 spin_lock_irqsave(&dev
->spinlock
, flags
);
2783 /* set mode, allow conversions through software gate */
2784 priv(dev
)->adc_control1_bits
|= ADC_SW_GATE_BIT
;
2785 priv(dev
)->adc_control1_bits
&= ~ADC_DITHER_BIT
;
2786 if (board(dev
)->layout
!= LAYOUT_4020
) {
2787 priv(dev
)->adc_control1_bits
&= ~ADC_MODE_MASK
;
2788 if (cmd
->convert_src
== TRIG_EXT
)
2789 priv(dev
)->adc_control1_bits
|= adc_mode_bits(13); /* good old mode 13 */
2791 priv(dev
)->adc_control1_bits
|= adc_mode_bits(8); /* mode 8. What else could you need? */
2793 priv(dev
)->adc_control1_bits
&= ~CHANNEL_MODE_4020_MASK
;
2794 if (cmd
->chanlist_len
== 4)
2795 priv(dev
)->adc_control1_bits
|= FOUR_CHANNEL_4020_BITS
;
2796 else if (cmd
->chanlist_len
== 2)
2797 priv(dev
)->adc_control1_bits
|= TWO_CHANNEL_4020_BITS
;
2798 priv(dev
)->adc_control1_bits
&= ~ADC_LO_CHANNEL_4020_MASK
;
2799 priv(dev
)->adc_control1_bits
|=
2800 adc_lo_chan_4020_bits(CR_CHAN(cmd
->chanlist
[0]));
2801 priv(dev
)->adc_control1_bits
&= ~ADC_HI_CHANNEL_4020_MASK
;
2802 priv(dev
)->adc_control1_bits
|=
2803 adc_hi_chan_4020_bits(CR_CHAN
2805 chanlist
[cmd
->chanlist_len
- 1]));
2807 writew(priv(dev
)->adc_control1_bits
,
2808 priv(dev
)->main_iobase
+ ADC_CONTROL1_REG
);
2809 DEBUG_PRINT("control1 bits 0x%x\n", priv(dev
)->adc_control1_bits
);
2810 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
2812 /* clear adc buffer */
2813 writew(0, priv(dev
)->main_iobase
+ ADC_BUFFER_CLEAR_REG
);
2815 if ((cmd
->flags
& TRIG_WAKE_EOS
) == 0 ||
2816 board(dev
)->layout
== LAYOUT_4020
) {
2817 priv(dev
)->ai_dma_index
= 0;
2819 /* set dma transfer size */
2820 for (i
= 0; i
< ai_dma_ring_count(board(dev
)); i
++)
2821 priv(dev
)->ai_dma_desc
[i
].transfer_size
=
2822 cpu_to_le32(dma_transfer_size(dev
) *
2825 /* give location of first dma descriptor */
2826 load_first_dma_descriptor(dev
, 1,
2827 priv(dev
)->ai_dma_desc_bus_addr
|
2828 PLX_DESC_IN_PCI_BIT
|
2829 PLX_INTR_TERM_COUNT
|
2830 PLX_XFER_LOCAL_TO_PCI
);
2832 dma_start_sync(dev
, 1);
2835 if (board(dev
)->layout
== LAYOUT_4020
) {
2836 /* set source for external triggers */
2838 if (cmd
->start_src
== TRIG_EXT
&& CR_CHAN(cmd
->start_arg
))
2839 bits
|= EXT_START_TRIG_BNC_BIT
;
2840 if (cmd
->stop_src
== TRIG_EXT
&& CR_CHAN(cmd
->stop_arg
))
2841 bits
|= EXT_STOP_TRIG_BNC_BIT
;
2842 writew(bits
, priv(dev
)->main_iobase
+ DAQ_ATRIG_LOW_4020_REG
);
2845 spin_lock_irqsave(&dev
->spinlock
, flags
);
2847 /* enable pacing, triggering, etc */
2848 bits
= ADC_ENABLE_BIT
| ADC_SOFT_GATE_BITS
| ADC_GATE_LEVEL_BIT
;
2849 if (cmd
->flags
& TRIG_WAKE_EOS
)
2850 bits
|= ADC_DMA_DISABLE_BIT
;
2851 /* set start trigger */
2852 if (cmd
->start_src
== TRIG_EXT
) {
2853 bits
|= ADC_START_TRIG_EXT_BITS
;
2854 if (cmd
->start_arg
& CR_INVERT
)
2855 bits
|= ADC_START_TRIG_FALLING_BIT
;
2856 } else if (cmd
->start_src
== TRIG_NOW
)
2857 bits
|= ADC_START_TRIG_SOFT_BITS
;
2858 if (use_hw_sample_counter(cmd
))
2859 bits
|= ADC_SAMPLE_COUNTER_EN_BIT
;
2860 writew(bits
, priv(dev
)->main_iobase
+ ADC_CONTROL0_REG
);
2861 DEBUG_PRINT("control0 bits 0x%x\n", bits
);
2863 priv(dev
)->ai_cmd_running
= 1;
2865 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
2867 /* start acquisition */
2868 if (cmd
->start_src
== TRIG_NOW
) {
2869 writew(0, priv(dev
)->main_iobase
+ ADC_START_REG
);
2870 DEBUG_PRINT("soft trig\n");
2876 /* read num_samples from 16 bit wide ai fifo */
2877 static void pio_drain_ai_fifo_16(struct comedi_device
*dev
)
2879 struct comedi_subdevice
*s
= dev
->read_subdev
;
2880 struct comedi_async
*async
= s
->async
;
2881 struct comedi_cmd
*cmd
= &async
->cmd
;
2883 uint16_t prepost_bits
;
2884 int read_segment
, read_index
, write_segment
, write_index
;
2888 /* get least significant 15 bits */
2890 readw(priv(dev
)->main_iobase
+ ADC_READ_PNTR_REG
) & 0x7fff;
2892 readw(priv(dev
)->main_iobase
+ ADC_WRITE_PNTR_REG
) & 0x7fff;
2893 /* Get most significant bits (grey code). Different boards use different code
2894 * so use a scheme that doesn't depend on encoding. This read must
2895 * occur after reading least significant 15 bits to avoid race
2896 * with fifo switching to next segment. */
2897 prepost_bits
= readw(priv(dev
)->main_iobase
+ PREPOST_REG
);
2899 /* if read and write pointers are not on the same fifo segment, read to the
2900 * end of the read segment */
2901 read_segment
= adc_upper_read_ptr_code(prepost_bits
);
2902 write_segment
= adc_upper_write_ptr_code(prepost_bits
);
2904 DEBUG_PRINT(" rd seg %i, wrt seg %i, rd idx %i, wrt idx %i\n",
2905 read_segment
, write_segment
, read_index
,
2908 if (read_segment
!= write_segment
)
2910 priv(dev
)->ai_fifo_segment_length
- read_index
;
2912 num_samples
= write_index
- read_index
;
2914 if (cmd
->stop_src
== TRIG_COUNT
) {
2915 if (priv(dev
)->ai_count
== 0)
2917 if (num_samples
> priv(dev
)->ai_count
)
2918 num_samples
= priv(dev
)->ai_count
;
2920 priv(dev
)->ai_count
-= num_samples
;
2923 if (num_samples
< 0) {
2924 dev_err(dev
->hw_dev
, "cb_pcidas64: bug! num_samples < 0\n");
2928 DEBUG_PRINT(" read %i samples from fifo\n", num_samples
);
2930 for (i
= 0; i
< num_samples
; i
++) {
2931 cfc_write_to_buffer(s
,
2932 readw(priv(dev
)->main_iobase
+
2936 } while (read_segment
!= write_segment
);
2939 /* Read from 32 bit wide ai fifo of 4020 - deal with insane grey coding of pointers.
2940 * The pci-4020 hardware only supports
2941 * dma transfers (it only supports the use of pio for draining the last remaining
2942 * points from the fifo when a data acquisition operation has completed).
2944 static void pio_drain_ai_fifo_32(struct comedi_device
*dev
)
2946 struct comedi_subdevice
*s
= dev
->read_subdev
;
2947 struct comedi_async
*async
= s
->async
;
2948 struct comedi_cmd
*cmd
= &async
->cmd
;
2950 unsigned int max_transfer
= 100000;
2953 readw(priv(dev
)->main_iobase
+ ADC_WRITE_PNTR_REG
) & 0x7fff;
2955 readw(priv(dev
)->main_iobase
+ ADC_READ_PNTR_REG
) & 0x7fff;
2957 if (cmd
->stop_src
== TRIG_COUNT
) {
2958 if (max_transfer
> priv(dev
)->ai_count
)
2959 max_transfer
= priv(dev
)->ai_count
;
2962 for (i
= 0; read_code
!= write_code
&& i
< max_transfer
;) {
2963 fifo_data
= readl(priv(dev
)->dio_counter_iobase
+ ADC_FIFO_REG
);
2964 cfc_write_to_buffer(s
, fifo_data
& 0xffff);
2966 if (i
< max_transfer
) {
2967 cfc_write_to_buffer(s
, (fifo_data
>> 16) & 0xffff);
2971 readw(priv(dev
)->main_iobase
+ ADC_READ_PNTR_REG
) & 0x7fff;
2973 priv(dev
)->ai_count
-= i
;
2977 static void pio_drain_ai_fifo(struct comedi_device
*dev
)
2979 if (board(dev
)->layout
== LAYOUT_4020
)
2980 pio_drain_ai_fifo_32(dev
);
2982 pio_drain_ai_fifo_16(dev
);
2985 static void drain_dma_buffers(struct comedi_device
*dev
, unsigned int channel
)
2987 struct comedi_async
*async
= dev
->read_subdev
->async
;
2988 uint32_t next_transfer_addr
;
2990 int num_samples
= 0;
2991 void __iomem
*pci_addr_reg
;
2995 priv(dev
)->plx9080_iobase
+ PLX_DMA1_PCI_ADDRESS_REG
;
2998 priv(dev
)->plx9080_iobase
+ PLX_DMA0_PCI_ADDRESS_REG
;
3000 /* loop until we have read all the full buffers */
3001 for (j
= 0, next_transfer_addr
= readl(pci_addr_reg
);
3002 (next_transfer_addr
<
3003 priv(dev
)->ai_buffer_bus_addr
[priv(dev
)->ai_dma_index
]
3004 || next_transfer_addr
>=
3005 priv(dev
)->ai_buffer_bus_addr
[priv(dev
)->ai_dma_index
] +
3006 DMA_BUFFER_SIZE
) && j
< ai_dma_ring_count(board(dev
)); j
++) {
3007 /* transfer data from dma buffer to comedi buffer */
3008 num_samples
= dma_transfer_size(dev
);
3009 if (async
->cmd
.stop_src
== TRIG_COUNT
) {
3010 if (num_samples
> priv(dev
)->ai_count
)
3011 num_samples
= priv(dev
)->ai_count
;
3012 priv(dev
)->ai_count
-= num_samples
;
3014 cfc_write_array_to_buffer(dev
->read_subdev
,
3015 priv(dev
)->ai_buffer
[priv(dev
)->
3017 num_samples
* sizeof(uint16_t));
3018 priv(dev
)->ai_dma_index
=
3019 (priv(dev
)->ai_dma_index
+
3020 1) % ai_dma_ring_count(board(dev
));
3022 DEBUG_PRINT("next buffer addr 0x%lx\n",
3023 (unsigned long)priv(dev
)->
3024 ai_buffer_bus_addr
[priv(dev
)->ai_dma_index
]);
3025 DEBUG_PRINT("pci addr reg 0x%x\n", next_transfer_addr
);
3027 /* XXX check for dma ring buffer overrun (use end-of-chain bit to mark last
3031 static void handle_ai_interrupt(struct comedi_device
*dev
,
3032 unsigned short status
,
3033 unsigned int plx_status
)
3035 struct comedi_subdevice
*s
= dev
->read_subdev
;
3036 struct comedi_async
*async
= s
->async
;
3037 struct comedi_cmd
*cmd
= &async
->cmd
;
3038 uint8_t dma1_status
;
3039 unsigned long flags
;
3041 /* check for fifo overrun */
3042 if (status
& ADC_OVERRUN_BIT
) {
3043 comedi_error(dev
, "fifo overrun");
3044 async
->events
|= COMEDI_CB_EOA
| COMEDI_CB_ERROR
;
3046 /* spin lock makes sure no one else changes plx dma control reg */
3047 spin_lock_irqsave(&dev
->spinlock
, flags
);
3048 dma1_status
= readb(priv(dev
)->plx9080_iobase
+ PLX_DMA1_CS_REG
);
3049 if (plx_status
& ICS_DMA1_A
) { /* dma chan 1 interrupt */
3050 writeb((dma1_status
& PLX_DMA_EN_BIT
) | PLX_CLEAR_DMA_INTR_BIT
,
3051 priv(dev
)->plx9080_iobase
+ PLX_DMA1_CS_REG
);
3052 DEBUG_PRINT("dma1 status 0x%x\n", dma1_status
);
3054 if (dma1_status
& PLX_DMA_EN_BIT
)
3055 drain_dma_buffers(dev
, 1);
3057 DEBUG_PRINT(" cleared dma ch1 interrupt\n");
3059 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3061 if (status
& ADC_DONE_BIT
)
3062 DEBUG_PRINT("adc done interrupt\n");
3064 /* drain fifo with pio */
3065 if ((status
& ADC_DONE_BIT
) ||
3066 ((cmd
->flags
& TRIG_WAKE_EOS
) &&
3067 (status
& ADC_INTR_PENDING_BIT
) &&
3068 (board(dev
)->layout
!= LAYOUT_4020
))) {
3069 DEBUG_PRINT("pio fifo drain\n");
3070 spin_lock_irqsave(&dev
->spinlock
, flags
);
3071 if (priv(dev
)->ai_cmd_running
) {
3072 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3073 pio_drain_ai_fifo(dev
);
3075 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3077 /* if we are have all the data, then quit */
3078 if ((cmd
->stop_src
== TRIG_COUNT
&& (int)priv(dev
)->ai_count
<= 0) ||
3079 (cmd
->stop_src
== TRIG_EXT
&& (status
& ADC_STOP_BIT
))) {
3080 async
->events
|= COMEDI_CB_EOA
;
3083 cfc_handle_events(dev
, s
);
3086 static inline unsigned int prev_ao_dma_index(struct comedi_device
*dev
)
3088 unsigned int buffer_index
;
3090 if (priv(dev
)->ao_dma_index
== 0)
3091 buffer_index
= AO_DMA_RING_COUNT
- 1;
3093 buffer_index
= priv(dev
)->ao_dma_index
- 1;
3094 return buffer_index
;
3097 static int last_ao_dma_load_completed(struct comedi_device
*dev
)
3099 unsigned int buffer_index
;
3100 unsigned int transfer_address
;
3101 unsigned short dma_status
;
3103 buffer_index
= prev_ao_dma_index(dev
);
3104 dma_status
= readb(priv(dev
)->plx9080_iobase
+ PLX_DMA0_CS_REG
);
3105 if ((dma_status
& PLX_DMA_DONE_BIT
) == 0)
3109 readl(priv(dev
)->plx9080_iobase
+ PLX_DMA0_PCI_ADDRESS_REG
);
3110 if (transfer_address
!= priv(dev
)->ao_buffer_bus_addr
[buffer_index
])
3116 static int ao_stopped_by_error(struct comedi_device
*dev
,
3117 const struct comedi_cmd
*cmd
)
3119 if (cmd
->stop_src
== TRIG_NONE
)
3121 if (cmd
->stop_src
== TRIG_COUNT
) {
3122 if (priv(dev
)->ao_count
)
3124 if (last_ao_dma_load_completed(dev
) == 0)
3130 static inline int ao_dma_needs_restart(struct comedi_device
*dev
,
3131 unsigned short dma_status
)
3133 if ((dma_status
& PLX_DMA_DONE_BIT
) == 0 ||
3134 (dma_status
& PLX_DMA_EN_BIT
) == 0)
3136 if (last_ao_dma_load_completed(dev
))
3142 static void restart_ao_dma(struct comedi_device
*dev
)
3144 unsigned int dma_desc_bits
;
3147 readl(priv(dev
)->plx9080_iobase
+ PLX_DMA0_DESCRIPTOR_REG
);
3148 dma_desc_bits
&= ~PLX_END_OF_CHAIN_BIT
;
3149 DEBUG_PRINT("restarting ao dma, descriptor reg 0x%x\n", dma_desc_bits
);
3150 load_first_dma_descriptor(dev
, 0, dma_desc_bits
);
3152 dma_start_sync(dev
, 0);
3155 static void handle_ao_interrupt(struct comedi_device
*dev
,
3156 unsigned short status
, unsigned int plx_status
)
3158 struct comedi_subdevice
*s
= dev
->write_subdev
;
3159 struct comedi_async
*async
;
3160 struct comedi_cmd
*cmd
;
3161 uint8_t dma0_status
;
3162 unsigned long flags
;
3164 /* board might not support ao, in which case write_subdev is NULL */
3170 /* spin lock makes sure no one else changes plx dma control reg */
3171 spin_lock_irqsave(&dev
->spinlock
, flags
);
3172 dma0_status
= readb(priv(dev
)->plx9080_iobase
+ PLX_DMA0_CS_REG
);
3173 if (plx_status
& ICS_DMA0_A
) { /* dma chan 0 interrupt */
3174 if ((dma0_status
& PLX_DMA_EN_BIT
)
3175 && !(dma0_status
& PLX_DMA_DONE_BIT
))
3176 writeb(PLX_DMA_EN_BIT
| PLX_CLEAR_DMA_INTR_BIT
,
3177 priv(dev
)->plx9080_iobase
+ PLX_DMA0_CS_REG
);
3179 writeb(PLX_CLEAR_DMA_INTR_BIT
,
3180 priv(dev
)->plx9080_iobase
+ PLX_DMA0_CS_REG
);
3181 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3182 DEBUG_PRINT("dma0 status 0x%x\n", dma0_status
);
3183 if (dma0_status
& PLX_DMA_EN_BIT
) {
3184 load_ao_dma(dev
, cmd
);
3185 /* try to recover from dma end-of-chain event */
3186 if (ao_dma_needs_restart(dev
, dma0_status
))
3187 restart_ao_dma(dev
);
3189 DEBUG_PRINT(" cleared dma ch0 interrupt\n");
3191 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3193 if ((status
& DAC_DONE_BIT
)) {
3194 async
->events
|= COMEDI_CB_EOA
;
3195 if (ao_stopped_by_error(dev
, cmd
))
3196 async
->events
|= COMEDI_CB_ERROR
;
3197 DEBUG_PRINT("plx dma0 desc reg 0x%x\n",
3198 readl(priv(dev
)->plx9080_iobase
+
3199 PLX_DMA0_DESCRIPTOR_REG
));
3200 DEBUG_PRINT("plx dma0 address reg 0x%x\n",
3201 readl(priv(dev
)->plx9080_iobase
+
3202 PLX_DMA0_PCI_ADDRESS_REG
));
3204 cfc_handle_events(dev
, s
);
3207 static irqreturn_t
handle_interrupt(int irq
, void *d
)
3209 struct comedi_device
*dev
= d
;
3210 unsigned short status
;
3211 uint32_t plx_status
;
3214 plx_status
= readl(priv(dev
)->plx9080_iobase
+ PLX_INTRCS_REG
);
3215 status
= readw(priv(dev
)->main_iobase
+ HW_STATUS_REG
);
3217 DEBUG_PRINT("cb_pcidas64: hw status 0x%x ", status
);
3218 DEBUG_PRINT("plx status 0x%x\n", plx_status
);
3220 /* an interrupt before all the postconfig stuff gets done could
3221 * cause a NULL dereference if we continue through the
3222 * interrupt handler */
3223 if (dev
->attached
== 0) {
3224 DEBUG_PRINT("cb_pcidas64: premature interrupt, ignoring",
3228 handle_ai_interrupt(dev
, status
, plx_status
);
3229 handle_ao_interrupt(dev
, status
, plx_status
);
3231 /* clear possible plx9080 interrupt sources */
3232 if (plx_status
& ICS_LDIA
) { /* clear local doorbell interrupt */
3233 plx_bits
= readl(priv(dev
)->plx9080_iobase
+ PLX_DBR_OUT_REG
);
3234 writel(plx_bits
, priv(dev
)->plx9080_iobase
+ PLX_DBR_OUT_REG
);
3235 DEBUG_PRINT(" cleared local doorbell bits 0x%x\n", plx_bits
);
3238 DEBUG_PRINT("exiting handler\n");
3243 static void abort_dma(struct comedi_device
*dev
, unsigned int channel
)
3245 unsigned long flags
;
3247 /* spinlock for plx dma control/status reg */
3248 spin_lock_irqsave(&dev
->spinlock
, flags
);
3250 plx9080_abort_dma(priv(dev
)->plx9080_iobase
, channel
);
3252 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3255 static int ai_cancel(struct comedi_device
*dev
, struct comedi_subdevice
*s
)
3257 unsigned long flags
;
3259 spin_lock_irqsave(&dev
->spinlock
, flags
);
3260 if (priv(dev
)->ai_cmd_running
== 0) {
3261 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3264 priv(dev
)->ai_cmd_running
= 0;
3265 spin_unlock_irqrestore(&dev
->spinlock
, flags
);
3267 disable_ai_pacing(dev
);
3271 DEBUG_PRINT("ai canceled\n");
3275 static int ao_winsn(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
3276 struct comedi_insn
*insn
, unsigned int *data
)
3278 int chan
= CR_CHAN(insn
->chanspec
);
3279 int range
= CR_RANGE(insn
->chanspec
);
3281 /* do some initializing */
3282 writew(0, priv(dev
)->main_iobase
+ DAC_CONTROL0_REG
);
3285 set_dac_range_bits(dev
, &priv(dev
)->dac_control1_bits
, chan
, range
);
3286 writew(priv(dev
)->dac_control1_bits
,
3287 priv(dev
)->main_iobase
+ DAC_CONTROL1_REG
);
3289 /* write to channel */
3290 if (board(dev
)->layout
== LAYOUT_4020
) {
3291 writew(data
[0] & 0xff,
3292 priv(dev
)->main_iobase
+ dac_lsb_4020_reg(chan
));
3293 writew((data
[0] >> 8) & 0xf,
3294 priv(dev
)->main_iobase
+ dac_msb_4020_reg(chan
));
3296 writew(data
[0], priv(dev
)->main_iobase
+ dac_convert_reg(chan
));
3299 /* remember output value */
3300 priv(dev
)->ao_value
[chan
] = data
[0];
3305 static int ao_readback_insn(struct comedi_device
*dev
,
3306 struct comedi_subdevice
*s
,
3307 struct comedi_insn
*insn
, unsigned int *data
)
3309 data
[0] = priv(dev
)->ao_value
[CR_CHAN(insn
->chanspec
)];
3314 static void set_dac_control0_reg(struct comedi_device
*dev
,
3315 const struct comedi_cmd
*cmd
)
3317 unsigned int bits
= DAC_ENABLE_BIT
| WAVEFORM_GATE_LEVEL_BIT
|
3318 WAVEFORM_GATE_ENABLE_BIT
| WAVEFORM_GATE_SELECT_BIT
;
3320 if (cmd
->start_src
== TRIG_EXT
) {
3321 bits
|= WAVEFORM_TRIG_EXT_BITS
;
3322 if (cmd
->start_arg
& CR_INVERT
)
3323 bits
|= WAVEFORM_TRIG_FALLING_BIT
;
3325 bits
|= WAVEFORM_TRIG_SOFT_BITS
;
3327 if (cmd
->scan_begin_src
== TRIG_EXT
) {
3328 bits
|= DAC_EXT_UPDATE_ENABLE_BIT
;
3329 if (cmd
->scan_begin_arg
& CR_INVERT
)
3330 bits
|= DAC_EXT_UPDATE_FALLING_BIT
;
3332 writew(bits
, priv(dev
)->main_iobase
+ DAC_CONTROL0_REG
);
3335 static void set_dac_control1_reg(struct comedi_device
*dev
,
3336 const struct comedi_cmd
*cmd
)
3340 for (i
= 0; i
< cmd
->chanlist_len
; i
++) {
3343 channel
= CR_CHAN(cmd
->chanlist
[i
]);
3344 range
= CR_RANGE(cmd
->chanlist
[i
]);
3345 set_dac_range_bits(dev
, &priv(dev
)->dac_control1_bits
, channel
,
3348 priv(dev
)->dac_control1_bits
|= DAC_SW_GATE_BIT
;
3349 writew(priv(dev
)->dac_control1_bits
,
3350 priv(dev
)->main_iobase
+ DAC_CONTROL1_REG
);
3353 static void set_dac_select_reg(struct comedi_device
*dev
,
3354 const struct comedi_cmd
*cmd
)
3357 unsigned int first_channel
, last_channel
;
3359 first_channel
= CR_CHAN(cmd
->chanlist
[0]);
3360 last_channel
= CR_CHAN(cmd
->chanlist
[cmd
->chanlist_len
- 1]);
3361 if (last_channel
< first_channel
)
3362 comedi_error(dev
, "bug! last ao channel < first ao channel");
3364 bits
= (first_channel
& 0x7) | (last_channel
& 0x7) << 3;
3366 writew(bits
, priv(dev
)->main_iobase
+ DAC_SELECT_REG
);
3369 static void set_dac_interval_regs(struct comedi_device
*dev
,
3370 const struct comedi_cmd
*cmd
)
3372 unsigned int divisor
;
3374 if (cmd
->scan_begin_src
!= TRIG_TIMER
)
3377 divisor
= get_ao_divisor(cmd
->scan_begin_arg
, cmd
->flags
);
3378 if (divisor
> max_counter_value
) {
3379 comedi_error(dev
, "bug! ao divisor too big");
3380 divisor
= max_counter_value
;
3382 writew(divisor
& 0xffff,
3383 priv(dev
)->main_iobase
+ DAC_SAMPLE_INTERVAL_LOWER_REG
);
3384 writew((divisor
>> 16) & 0xff,
3385 priv(dev
)->main_iobase
+ DAC_SAMPLE_INTERVAL_UPPER_REG
);
3388 static unsigned int load_ao_dma_buffer(struct comedi_device
*dev
,
3389 const struct comedi_cmd
*cmd
)
3391 unsigned int num_bytes
, buffer_index
, prev_buffer_index
;
3392 unsigned int next_bits
;
3394 buffer_index
= priv(dev
)->ao_dma_index
;
3395 prev_buffer_index
= prev_ao_dma_index(dev
);
3397 DEBUG_PRINT("attempting to load ao buffer %i (0x%x)\n", buffer_index
,
3398 priv(dev
)->ao_buffer_bus_addr
[buffer_index
]);
3400 num_bytes
= comedi_buf_read_n_available(dev
->write_subdev
->async
);
3401 if (num_bytes
> DMA_BUFFER_SIZE
)
3402 num_bytes
= DMA_BUFFER_SIZE
;
3403 if (cmd
->stop_src
== TRIG_COUNT
&& num_bytes
> priv(dev
)->ao_count
)
3404 num_bytes
= priv(dev
)->ao_count
;
3405 num_bytes
-= num_bytes
% bytes_in_sample
;
3410 DEBUG_PRINT("loading %i bytes\n", num_bytes
);
3412 num_bytes
= cfc_read_array_from_buffer(dev
->write_subdev
,
3414 ao_buffer
[buffer_index
],
3416 priv(dev
)->ao_dma_desc
[buffer_index
].transfer_size
=
3417 cpu_to_le32(num_bytes
);
3418 /* set end of chain bit so we catch underruns */
3419 next_bits
= le32_to_cpu(priv(dev
)->ao_dma_desc
[buffer_index
].next
);
3420 next_bits
|= PLX_END_OF_CHAIN_BIT
;
3421 priv(dev
)->ao_dma_desc
[buffer_index
].next
= cpu_to_le32(next_bits
);
3422 /* clear end of chain bit on previous buffer now that we have set it
3423 * for the last buffer */
3424 next_bits
= le32_to_cpu(priv(dev
)->ao_dma_desc
[prev_buffer_index
].next
);
3425 next_bits
&= ~PLX_END_OF_CHAIN_BIT
;
3426 priv(dev
)->ao_dma_desc
[prev_buffer_index
].next
= cpu_to_le32(next_bits
);
3428 priv(dev
)->ao_dma_index
= (buffer_index
+ 1) % AO_DMA_RING_COUNT
;
3429 priv(dev
)->ao_count
-= num_bytes
;
3434 static void load_ao_dma(struct comedi_device
*dev
, const struct comedi_cmd
*cmd
)
3436 unsigned int num_bytes
;
3437 unsigned int next_transfer_addr
;
3438 void __iomem
*pci_addr_reg
=
3439 priv(dev
)->plx9080_iobase
+ PLX_DMA0_PCI_ADDRESS_REG
;
3440 unsigned int buffer_index
;
3443 buffer_index
= priv(dev
)->ao_dma_index
;
3444 /* don't overwrite data that hasn't been transferred yet */
3445 next_transfer_addr
= readl(pci_addr_reg
);
3446 if (next_transfer_addr
>=
3447 priv(dev
)->ao_buffer_bus_addr
[buffer_index
]
3448 && next_transfer_addr
<
3449 priv(dev
)->ao_buffer_bus_addr
[buffer_index
] +
3452 num_bytes
= load_ao_dma_buffer(dev
, cmd
);
3453 } while (num_bytes
>= DMA_BUFFER_SIZE
);
3456 static int prep_ao_dma(struct comedi_device
*dev
, const struct comedi_cmd
*cmd
)
3458 unsigned int num_bytes
;
3461 /* clear queue pointer too, since external queue has
3462 * weird interactions with ao fifo */
3463 writew(0, priv(dev
)->main_iobase
+ ADC_QUEUE_CLEAR_REG
);
3464 writew(0, priv(dev
)->main_iobase
+ DAC_BUFFER_CLEAR_REG
);
3466 num_bytes
= (DAC_FIFO_SIZE
/ 2) * bytes_in_sample
;
3467 if (cmd
->stop_src
== TRIG_COUNT
&&
3468 num_bytes
/ bytes_in_sample
> priv(dev
)->ao_count
)
3469 num_bytes
= priv(dev
)->ao_count
* bytes_in_sample
;
3470 num_bytes
= cfc_read_array_from_buffer(dev
->write_subdev
,
3471 priv(dev
)->ao_bounce_buffer
,
3473 for (i
= 0; i
< num_bytes
/ bytes_in_sample
; i
++) {
3474 writew(priv(dev
)->ao_bounce_buffer
[i
],
3475 priv(dev
)->main_iobase
+ DAC_FIFO_REG
);
3477 priv(dev
)->ao_count
-= num_bytes
/ bytes_in_sample
;
3478 if (cmd
->stop_src
== TRIG_COUNT
&& priv(dev
)->ao_count
== 0)
3480 num_bytes
= load_ao_dma_buffer(dev
, cmd
);
3483 if (num_bytes
>= DMA_BUFFER_SIZE
) ;
3484 load_ao_dma(dev
, cmd
);
3486 dma_start_sync(dev
, 0);
3491 static inline int external_ai_queue_in_use(struct comedi_device
*dev
)
3493 if (dev
->read_subdev
->busy
)
3495 if (board(dev
)->layout
== LAYOUT_4020
)
3497 else if (use_internal_queue_6xxx(&dev
->read_subdev
->async
->cmd
))
3502 static int ao_cmd(struct comedi_device
*dev
, struct comedi_subdevice
*s
)
3504 struct comedi_cmd
*cmd
= &s
->async
->cmd
;
3506 if (external_ai_queue_in_use(dev
)) {
3507 warn_external_queue(dev
);
3510 /* disable analog output system during setup */
3511 writew(0x0, priv(dev
)->main_iobase
+ DAC_CONTROL0_REG
);
3513 priv(dev
)->ao_dma_index
= 0;
3514 priv(dev
)->ao_count
= cmd
->stop_arg
* cmd
->chanlist_len
;
3516 set_dac_select_reg(dev
, cmd
);
3517 set_dac_interval_regs(dev
, cmd
);
3518 load_first_dma_descriptor(dev
, 0, priv(dev
)->ao_dma_desc_bus_addr
|
3519 PLX_DESC_IN_PCI_BIT
| PLX_INTR_TERM_COUNT
);
3521 set_dac_control1_reg(dev
, cmd
);
3522 s
->async
->inttrig
= ao_inttrig
;
3527 static int ao_inttrig(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
3528 unsigned int trig_num
)
3530 struct comedi_cmd
*cmd
= &s
->async
->cmd
;
3536 retval
= prep_ao_dma(dev
, cmd
);
3540 set_dac_control0_reg(dev
, cmd
);
3542 if (cmd
->start_src
== TRIG_INT
)
3543 writew(0, priv(dev
)->main_iobase
+ DAC_START_REG
);
3545 s
->async
->inttrig
= NULL
;
3550 static int ao_cmdtest(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
3551 struct comedi_cmd
*cmd
)
3555 unsigned int tmp_arg
;
3558 /* step 1: make sure trigger sources are trivially valid */
3560 tmp
= cmd
->start_src
;
3561 cmd
->start_src
&= TRIG_INT
| TRIG_EXT
;
3562 if (!cmd
->start_src
|| tmp
!= cmd
->start_src
)
3565 tmp
= cmd
->scan_begin_src
;
3566 cmd
->scan_begin_src
&= TRIG_TIMER
| TRIG_EXT
;
3567 if (!cmd
->scan_begin_src
|| tmp
!= cmd
->scan_begin_src
)
3570 tmp
= cmd
->convert_src
;
3571 cmd
->convert_src
&= TRIG_NOW
;
3572 if (!cmd
->convert_src
|| tmp
!= cmd
->convert_src
)
3575 tmp
= cmd
->scan_end_src
;
3576 cmd
->scan_end_src
&= TRIG_COUNT
;
3577 if (!cmd
->scan_end_src
|| tmp
!= cmd
->scan_end_src
)
3580 tmp
= cmd
->stop_src
;
3581 cmd
->stop_src
&= TRIG_NONE
;
3582 if (!cmd
->stop_src
|| tmp
!= cmd
->stop_src
)
3588 /* step 2: make sure trigger sources are unique and mutually compatible */
3590 /* uniqueness check */
3591 if (cmd
->start_src
!= TRIG_INT
&& cmd
->start_src
!= TRIG_EXT
)
3593 if (cmd
->scan_begin_src
!= TRIG_TIMER
&&
3594 cmd
->scan_begin_src
!= TRIG_EXT
)
3597 /* compatibility check */
3598 if (cmd
->convert_src
== TRIG_EXT
&& cmd
->scan_begin_src
== TRIG_TIMER
)
3600 if (cmd
->stop_src
!= TRIG_COUNT
&&
3601 cmd
->stop_src
!= TRIG_NONE
&& cmd
->stop_src
!= TRIG_EXT
)
3607 /* step 3: make sure arguments are trivially compatible */
3609 if (cmd
->scan_begin_src
== TRIG_TIMER
) {
3610 if (cmd
->scan_begin_arg
< board(dev
)->ao_scan_speed
) {
3611 cmd
->scan_begin_arg
= board(dev
)->ao_scan_speed
;
3614 if (get_ao_divisor(cmd
->scan_begin_arg
,
3615 cmd
->flags
) > max_counter_value
) {
3616 cmd
->scan_begin_arg
=
3617 (max_counter_value
+ 2) * TIMER_BASE
;
3622 if (!cmd
->chanlist_len
) {
3623 cmd
->chanlist_len
= 1;
3626 if (cmd
->scan_end_arg
!= cmd
->chanlist_len
) {
3627 cmd
->scan_end_arg
= cmd
->chanlist_len
;
3634 /* step 4: fix up any arguments */
3636 if (cmd
->scan_begin_src
== TRIG_TIMER
) {
3637 tmp_arg
= cmd
->scan_begin_arg
;
3638 cmd
->scan_begin_arg
=
3639 get_divisor(cmd
->scan_begin_arg
, cmd
->flags
) * TIMER_BASE
;
3640 if (tmp_arg
!= cmd
->scan_begin_arg
)
3647 if (cmd
->chanlist
) {
3648 unsigned int first_channel
= CR_CHAN(cmd
->chanlist
[0]);
3649 for (i
= 1; i
< cmd
->chanlist_len
; i
++) {
3650 if (CR_CHAN(cmd
->chanlist
[i
]) != first_channel
+ i
) {
3652 "chanlist must use consecutive channels");
3665 static int ao_cancel(struct comedi_device
*dev
, struct comedi_subdevice
*s
)
3667 writew(0x0, priv(dev
)->main_iobase
+ DAC_CONTROL0_REG
);
3672 static int dio_callback(int dir
, int port
, int data
, unsigned long arg
)
3674 void __iomem
*iobase
= (void __iomem
*)arg
;
3676 writeb(data
, iobase
+ port
);
3677 DEBUG_PRINT("wrote 0x%x to port %i\n", data
, port
);
3680 return readb(iobase
+ port
);
3684 static int dio_callback_4020(int dir
, int port
, int data
, unsigned long arg
)
3686 void __iomem
*iobase
= (void __iomem
*)arg
;
3688 writew(data
, iobase
+ 2 * port
);
3691 return readw(iobase
+ 2 * port
);
3695 static int di_rbits(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
3696 struct comedi_insn
*insn
, unsigned int *data
)
3700 bits
= readb(priv(dev
)->dio_counter_iobase
+ DI_REG
);
3708 static int do_wbits(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
3709 struct comedi_insn
*insn
, unsigned int *data
)
3712 /* zero bits we are going to change */
3713 s
->state
&= ~data
[0];
3715 s
->state
|= data
[0] & data
[1];
3717 writeb(s
->state
, priv(dev
)->dio_counter_iobase
+ DO_REG
);
3724 static int dio_60xx_config_insn(struct comedi_device
*dev
,
3725 struct comedi_subdevice
*s
,
3726 struct comedi_insn
*insn
, unsigned int *data
)
3730 mask
= 1 << CR_CHAN(insn
->chanspec
);
3733 case INSN_CONFIG_DIO_INPUT
:
3734 s
->io_bits
&= ~mask
;
3736 case INSN_CONFIG_DIO_OUTPUT
:
3739 case INSN_CONFIG_DIO_QUERY
:
3740 data
[1] = (s
->io_bits
& mask
) ? COMEDI_OUTPUT
: COMEDI_INPUT
;
3747 priv(dev
)->dio_counter_iobase
+ DIO_DIRECTION_60XX_REG
);
3752 static int dio_60xx_wbits(struct comedi_device
*dev
, struct comedi_subdevice
*s
,
3753 struct comedi_insn
*insn
, unsigned int *data
)
3756 s
->state
&= ~data
[0];
3757 s
->state
|= (data
[0] & data
[1]);
3759 priv(dev
)->dio_counter_iobase
+ DIO_DATA_60XX_REG
);
3762 data
[1] = readb(priv(dev
)->dio_counter_iobase
+ DIO_DATA_60XX_REG
);
3767 static void caldac_write(struct comedi_device
*dev
, unsigned int channel
,
3770 priv(dev
)->caldac_state
[channel
] = value
;
3772 switch (board(dev
)->layout
) {
3775 caldac_8800_write(dev
, channel
, value
);
3778 caldac_i2c_write(dev
, channel
, value
);
3785 static int calib_write_insn(struct comedi_device
*dev
,
3786 struct comedi_subdevice
*s
,
3787 struct comedi_insn
*insn
, unsigned int *data
)
3789 int channel
= CR_CHAN(insn
->chanspec
);
3791 /* return immediately if setting hasn't changed, since
3792 * programming these things is slow */
3793 if (priv(dev
)->caldac_state
[channel
] == data
[0])
3796 caldac_write(dev
, channel
, data
[0]);
3801 static int calib_read_insn(struct comedi_device
*dev
,
3802 struct comedi_subdevice
*s
, struct comedi_insn
*insn
,
3805 unsigned int channel
= CR_CHAN(insn
->chanspec
);
3807 data
[0] = priv(dev
)->caldac_state
[channel
];
3812 static void ad8402_write(struct comedi_device
*dev
, unsigned int channel
,
3815 static const int bitstream_length
= 10;
3816 unsigned int bit
, register_bits
;
3817 unsigned int bitstream
= ((channel
& 0x3) << 8) | (value
& 0xff);
3818 static const int ad8402_udelay
= 1;
3820 priv(dev
)->ad8402_state
[channel
] = value
;
3822 register_bits
= SELECT_8402_64XX_BIT
;
3823 udelay(ad8402_udelay
);
3824 writew(register_bits
, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
3826 for (bit
= 1 << (bitstream_length
- 1); bit
; bit
>>= 1) {
3827 if (bitstream
& bit
)
3828 register_bits
|= SERIAL_DATA_IN_BIT
;
3830 register_bits
&= ~SERIAL_DATA_IN_BIT
;
3831 udelay(ad8402_udelay
);
3832 writew(register_bits
, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
3833 udelay(ad8402_udelay
);
3834 writew(register_bits
| SERIAL_CLOCK_BIT
,
3835 priv(dev
)->main_iobase
+ CALIBRATION_REG
);
3838 udelay(ad8402_udelay
);
3839 writew(0, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
3842 /* for pci-das6402/16, channel 0 is analog input gain and channel 1 is offset */
3843 static int ad8402_write_insn(struct comedi_device
*dev
,
3844 struct comedi_subdevice
*s
,
3845 struct comedi_insn
*insn
, unsigned int *data
)
3847 int channel
= CR_CHAN(insn
->chanspec
);
3849 /* return immediately if setting hasn't changed, since
3850 * programming these things is slow */
3851 if (priv(dev
)->ad8402_state
[channel
] == data
[0])
3854 priv(dev
)->ad8402_state
[channel
] = data
[0];
3856 ad8402_write(dev
, channel
, data
[0]);
3861 static int ad8402_read_insn(struct comedi_device
*dev
,
3862 struct comedi_subdevice
*s
,
3863 struct comedi_insn
*insn
, unsigned int *data
)
3865 unsigned int channel
= CR_CHAN(insn
->chanspec
);
3867 data
[0] = priv(dev
)->ad8402_state
[channel
];
3872 static uint16_t read_eeprom(struct comedi_device
*dev
, uint8_t address
)
3874 static const int bitstream_length
= 11;
3875 static const int read_command
= 0x6;
3876 unsigned int bitstream
= (read_command
<< 8) | address
;
3878 void __iomem
* const plx_control_addr
=
3879 priv(dev
)->plx9080_iobase
+ PLX_CONTROL_REG
;
3881 static const int value_length
= 16;
3882 static const int eeprom_udelay
= 1;
3884 udelay(eeprom_udelay
);
3885 priv(dev
)->plx_control_bits
&= ~CTL_EE_CLK
& ~CTL_EE_CS
;
3886 /* make sure we don't send anything to the i2c bus on 4020 */
3887 priv(dev
)->plx_control_bits
|= CTL_USERO
;
3888 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3889 /* activate serial eeprom */
3890 udelay(eeprom_udelay
);
3891 priv(dev
)->plx_control_bits
|= CTL_EE_CS
;
3892 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3894 /* write read command and desired memory address */
3895 for (bit
= 1 << (bitstream_length
- 1); bit
; bit
>>= 1) {
3896 /* set bit to be written */
3897 udelay(eeprom_udelay
);
3898 if (bitstream
& bit
)
3899 priv(dev
)->plx_control_bits
|= CTL_EE_W
;
3901 priv(dev
)->plx_control_bits
&= ~CTL_EE_W
;
3902 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3904 udelay(eeprom_udelay
);
3905 priv(dev
)->plx_control_bits
|= CTL_EE_CLK
;
3906 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3907 udelay(eeprom_udelay
);
3908 priv(dev
)->plx_control_bits
&= ~CTL_EE_CLK
;
3909 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3911 /* read back value from eeprom memory location */
3913 for (bit
= 1 << (value_length
- 1); bit
; bit
>>= 1) {
3915 udelay(eeprom_udelay
);
3916 priv(dev
)->plx_control_bits
|= CTL_EE_CLK
;
3917 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3918 udelay(eeprom_udelay
);
3919 priv(dev
)->plx_control_bits
&= ~CTL_EE_CLK
;
3920 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3921 udelay(eeprom_udelay
);
3922 if (readl(plx_control_addr
) & CTL_EE_R
)
3926 /* deactivate eeprom serial input */
3927 udelay(eeprom_udelay
);
3928 priv(dev
)->plx_control_bits
&= ~CTL_EE_CS
;
3929 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
3934 static int eeprom_read_insn(struct comedi_device
*dev
,
3935 struct comedi_subdevice
*s
,
3936 struct comedi_insn
*insn
, unsigned int *data
)
3938 data
[0] = read_eeprom(dev
, CR_CHAN(insn
->chanspec
));
3943 /* utility function that rounds desired timing to an achievable time, and
3944 * sets cmd members appropriately.
3945 * adc paces conversions from master clock by dividing by (x + 3) where x is 24 bit number
3947 static void check_adc_timing(struct comedi_device
*dev
, struct comedi_cmd
*cmd
)
3949 unsigned int convert_divisor
= 0, scan_divisor
;
3950 static const int min_convert_divisor
= 3;
3951 static const int max_convert_divisor
=
3952 max_counter_value
+ min_convert_divisor
;
3953 static const int min_scan_divisor_4020
= 2;
3954 unsigned long long max_scan_divisor
, min_scan_divisor
;
3956 if (cmd
->convert_src
== TRIG_TIMER
) {
3957 if (board(dev
)->layout
== LAYOUT_4020
) {
3958 cmd
->convert_arg
= 0;
3961 get_divisor(cmd
->convert_arg
, cmd
->flags
);
3962 if (convert_divisor
> max_convert_divisor
)
3963 convert_divisor
= max_convert_divisor
;
3964 if (convert_divisor
< min_convert_divisor
)
3965 convert_divisor
= min_convert_divisor
;
3966 cmd
->convert_arg
= convert_divisor
* TIMER_BASE
;
3968 } else if (cmd
->convert_src
== TRIG_NOW
)
3969 cmd
->convert_arg
= 0;
3971 if (cmd
->scan_begin_src
== TRIG_TIMER
) {
3972 scan_divisor
= get_divisor(cmd
->scan_begin_arg
, cmd
->flags
);
3973 if (cmd
->convert_src
== TRIG_TIMER
) {
3974 /* XXX check for integer overflows */
3975 min_scan_divisor
= convert_divisor
* cmd
->chanlist_len
;
3977 (convert_divisor
* cmd
->chanlist_len
- 1) +
3980 min_scan_divisor
= min_scan_divisor_4020
;
3981 max_scan_divisor
= max_counter_value
+ min_scan_divisor
;
3983 if (scan_divisor
> max_scan_divisor
)
3984 scan_divisor
= max_scan_divisor
;
3985 if (scan_divisor
< min_scan_divisor
)
3986 scan_divisor
= min_scan_divisor
;
3987 cmd
->scan_begin_arg
= scan_divisor
* TIMER_BASE
;
3993 /* Gets nearest achievable timing given master clock speed, does not
3994 * take into account possible minimum/maximum divisor values. Used
3995 * by other timing checking functions. */
3996 static unsigned int get_divisor(unsigned int ns
, unsigned int flags
)
3998 unsigned int divisor
;
4000 switch (flags
& TRIG_ROUND_MASK
) {
4002 divisor
= (ns
+ TIMER_BASE
- 1) / TIMER_BASE
;
4004 case TRIG_ROUND_DOWN
:
4005 divisor
= ns
/ TIMER_BASE
;
4007 case TRIG_ROUND_NEAREST
:
4009 divisor
= (ns
+ TIMER_BASE
/ 2) / TIMER_BASE
;
4015 static unsigned int get_ao_divisor(unsigned int ns
, unsigned int flags
)
4017 return get_divisor(ns
, flags
) - 2;
4020 /* adjusts the size of hardware fifo (which determines block size for dma xfers) */
4021 static int set_ai_fifo_size(struct comedi_device
*dev
, unsigned int num_samples
)
4023 unsigned int num_fifo_entries
;
4025 const struct hw_fifo_info
*const fifo
= board(dev
)->ai_fifo
;
4027 num_fifo_entries
= num_samples
/ fifo
->sample_packing_ratio
;
4029 retval
= set_ai_fifo_segment_length(dev
,
4031 fifo
->num_segments
);
4035 num_samples
= retval
* fifo
->num_segments
* fifo
->sample_packing_ratio
;
4037 DEBUG_PRINT("set hardware fifo size to %i\n", num_samples
);
4042 /* query length of fifo */
4043 static unsigned int ai_fifo_size(struct comedi_device
*dev
)
4045 return priv(dev
)->ai_fifo_segment_length
*
4046 board(dev
)->ai_fifo
->num_segments
*
4047 board(dev
)->ai_fifo
->sample_packing_ratio
;
4050 static int set_ai_fifo_segment_length(struct comedi_device
*dev
,
4051 unsigned int num_entries
)
4053 static const int increment_size
= 0x100;
4054 const struct hw_fifo_info
*const fifo
= board(dev
)->ai_fifo
;
4055 unsigned int num_increments
;
4058 if (num_entries
< increment_size
)
4059 num_entries
= increment_size
;
4060 if (num_entries
> fifo
->max_segment_length
)
4061 num_entries
= fifo
->max_segment_length
;
4063 /* 1 == 256 entries, 2 == 512 entries, etc */
4064 num_increments
= (num_entries
+ increment_size
/ 2) / increment_size
;
4066 bits
= (~(num_increments
- 1)) & fifo
->fifo_size_reg_mask
;
4067 priv(dev
)->fifo_size_bits
&= ~fifo
->fifo_size_reg_mask
;
4068 priv(dev
)->fifo_size_bits
|= bits
;
4069 writew(priv(dev
)->fifo_size_bits
,
4070 priv(dev
)->main_iobase
+ FIFO_SIZE_REG
);
4072 priv(dev
)->ai_fifo_segment_length
= num_increments
* increment_size
;
4074 DEBUG_PRINT("set hardware fifo segment length to %i\n",
4075 priv(dev
)->ai_fifo_segment_length
);
4077 return priv(dev
)->ai_fifo_segment_length
;
4080 /* pci-6025 8800 caldac:
4081 * address 0 == dac channel 0 offset
4082 * address 1 == dac channel 0 gain
4083 * address 2 == dac channel 1 offset
4084 * address 3 == dac channel 1 gain
4085 * address 4 == fine adc offset
4086 * address 5 == coarse adc offset
4087 * address 6 == coarse adc gain
4088 * address 7 == fine adc gain
4090 /* pci-6402/16 uses all 8 channels for dac:
4091 * address 0 == dac channel 0 fine gain
4092 * address 1 == dac channel 0 coarse gain
4093 * address 2 == dac channel 0 coarse offset
4094 * address 3 == dac channel 1 coarse offset
4095 * address 4 == dac channel 1 fine gain
4096 * address 5 == dac channel 1 coarse gain
4097 * address 6 == dac channel 0 fine offset
4098 * address 7 == dac channel 1 fine offset
4101 static int caldac_8800_write(struct comedi_device
*dev
, unsigned int address
,
4104 static const int num_caldac_channels
= 8;
4105 static const int bitstream_length
= 11;
4106 unsigned int bitstream
= ((address
& 0x7) << 8) | value
;
4107 unsigned int bit
, register_bits
;
4108 static const int caldac_8800_udelay
= 1;
4110 if (address
>= num_caldac_channels
) {
4111 comedi_error(dev
, "illegal caldac channel");
4114 for (bit
= 1 << (bitstream_length
- 1); bit
; bit
>>= 1) {
4116 if (bitstream
& bit
)
4117 register_bits
|= SERIAL_DATA_IN_BIT
;
4118 udelay(caldac_8800_udelay
);
4119 writew(register_bits
, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
4120 register_bits
|= SERIAL_CLOCK_BIT
;
4121 udelay(caldac_8800_udelay
);
4122 writew(register_bits
, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
4124 udelay(caldac_8800_udelay
);
4125 writew(SELECT_8800_BIT
, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
4126 udelay(caldac_8800_udelay
);
4127 writew(0, priv(dev
)->main_iobase
+ CALIBRATION_REG
);
4128 udelay(caldac_8800_udelay
);
4133 static int caldac_i2c_write(struct comedi_device
*dev
,
4134 unsigned int caldac_channel
, unsigned int value
)
4136 uint8_t serial_bytes
[3];
4139 /* manual has gain and offset bits switched */
4146 NOT_CLEAR_REGISTERS
= 0x20,
4149 switch (caldac_channel
) {
4150 case 0: /* chan 0 offset */
4151 i2c_addr
= CALDAC0_I2C_ADDR
;
4152 serial_bytes
[0] = OFFSET_0_2
;
4154 case 1: /* chan 1 offset */
4155 i2c_addr
= CALDAC0_I2C_ADDR
;
4156 serial_bytes
[0] = OFFSET_1_3
;
4158 case 2: /* chan 2 offset */
4159 i2c_addr
= CALDAC1_I2C_ADDR
;
4160 serial_bytes
[0] = OFFSET_0_2
;
4162 case 3: /* chan 3 offset */
4163 i2c_addr
= CALDAC1_I2C_ADDR
;
4164 serial_bytes
[0] = OFFSET_1_3
;
4166 case 4: /* chan 0 gain */
4167 i2c_addr
= CALDAC0_I2C_ADDR
;
4168 serial_bytes
[0] = GAIN_0_2
;
4170 case 5: /* chan 1 gain */
4171 i2c_addr
= CALDAC0_I2C_ADDR
;
4172 serial_bytes
[0] = GAIN_1_3
;
4174 case 6: /* chan 2 gain */
4175 i2c_addr
= CALDAC1_I2C_ADDR
;
4176 serial_bytes
[0] = GAIN_0_2
;
4178 case 7: /* chan 3 gain */
4179 i2c_addr
= CALDAC1_I2C_ADDR
;
4180 serial_bytes
[0] = GAIN_1_3
;
4183 comedi_error(dev
, "invalid caldac channel\n");
4187 serial_bytes
[1] = NOT_CLEAR_REGISTERS
| ((value
>> 8) & 0xf);
4188 serial_bytes
[2] = value
& 0xff;
4189 i2c_write(dev
, i2c_addr
, serial_bytes
, 3);
4193 /* Their i2c requires a huge delay on setting clock or data high for some reason */
4194 static const int i2c_high_udelay
= 1000;
4195 static const int i2c_low_udelay
= 10;
4197 /* set i2c data line high or low */
4198 static void i2c_set_sda(struct comedi_device
*dev
, int state
)
4200 static const int data_bit
= CTL_EE_W
;
4201 void __iomem
*plx_control_addr
= priv(dev
)->plx9080_iobase
+
4205 /* set data line high */
4206 priv(dev
)->plx_control_bits
&= ~data_bit
;
4207 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
4208 udelay(i2c_high_udelay
);
4209 } else { /* set data line low */
4211 priv(dev
)->plx_control_bits
|= data_bit
;
4212 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
4213 udelay(i2c_low_udelay
);
4217 /* set i2c clock line high or low */
4218 static void i2c_set_scl(struct comedi_device
*dev
, int state
)
4220 static const int clock_bit
= CTL_USERO
;
4221 void __iomem
*plx_control_addr
= priv(dev
)->plx9080_iobase
+
4225 /* set clock line high */
4226 priv(dev
)->plx_control_bits
&= ~clock_bit
;
4227 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
4228 udelay(i2c_high_udelay
);
4229 } else { /* set clock line low */
4231 priv(dev
)->plx_control_bits
|= clock_bit
;
4232 writel(priv(dev
)->plx_control_bits
, plx_control_addr
);
4233 udelay(i2c_low_udelay
);
4237 static void i2c_write_byte(struct comedi_device
*dev
, uint8_t byte
)
4240 unsigned int num_bits
= 8;
4242 DEBUG_PRINT("writing to i2c byte 0x%x\n", byte
);
4244 for (bit
= 1 << (num_bits
- 1); bit
; bit
>>= 1) {
4245 i2c_set_scl(dev
, 0);
4247 i2c_set_sda(dev
, 1);
4249 i2c_set_sda(dev
, 0);
4250 i2c_set_scl(dev
, 1);
4254 /* we can't really read the lines, so fake it */
4255 static int i2c_read_ack(struct comedi_device
*dev
)
4257 i2c_set_scl(dev
, 0);
4258 i2c_set_sda(dev
, 1);
4259 i2c_set_scl(dev
, 1);
4261 return 0; /* return fake acknowledge bit */
4264 /* send start bit */
4265 static void i2c_start(struct comedi_device
*dev
)
4267 i2c_set_scl(dev
, 1);
4268 i2c_set_sda(dev
, 1);
4269 i2c_set_sda(dev
, 0);
4273 static void i2c_stop(struct comedi_device
*dev
)
4275 i2c_set_scl(dev
, 0);
4276 i2c_set_sda(dev
, 0);
4277 i2c_set_scl(dev
, 1);
4278 i2c_set_sda(dev
, 1);
4281 static void i2c_write(struct comedi_device
*dev
, unsigned int address
,
4282 const uint8_t * data
, unsigned int length
)
4286 static const int read_bit
= 0x1;
4288 /* XXX need mutex to prevent simultaneous attempts to access eeprom and i2c bus */
4290 /* make sure we dont send anything to eeprom */
4291 priv(dev
)->plx_control_bits
&= ~CTL_EE_CS
;
4296 /* send address and write bit */
4297 bitstream
= (address
<< 1) & ~read_bit
;
4298 i2c_write_byte(dev
, bitstream
);
4300 /* get acknowledge */
4301 if (i2c_read_ack(dev
) != 0) {
4302 comedi_error(dev
, "i2c write failed: no acknowledge");
4306 /* write data bytes */
4307 for (i
= 0; i
< length
; i
++) {
4308 i2c_write_byte(dev
, data
[i
]);
4309 if (i2c_read_ack(dev
) != 0) {
4310 comedi_error(dev
, "i2c write failed: no acknowledge");
4318 MODULE_AUTHOR("Comedi http://www.comedi.org");
4319 MODULE_DESCRIPTION("Comedi low-level driver");
4320 MODULE_LICENSE("GPL");