2 comedi/drivers/cb_pcidas.c
4 Developed by Ivan Martinez and Frank Mori Hess, with valuable help from
5 David Schleef and the rest of the Comedi developers comunity.
7 Copyright (C) 2001-2003 Ivan Martinez <imr@oersted.dtu.dk>
8 Copyright (C) 2001,2002 Frank Mori Hess <fmhess@users.sourceforge.net>
10 COMEDI - Linux Control and Measurement Device Interface
11 Copyright (C) 1997-8 David A. Schleef <ds@schleef.org>
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 ************************************************************************
31 Description: MeasurementComputing PCI-DAS series with the AMCC S5933 PCI controller
32 Author: Ivan Martinez <imr@oersted.dtu.dk>,
33 Frank Mori Hess <fmhess@users.sourceforge.net>
35 Devices: [Measurement Computing] PCI-DAS1602/16 (cb_pcidas),
36 PCI-DAS1602/16jr, PCI-DAS1602/12, PCI-DAS1200, PCI-DAS1200jr,
37 PCI-DAS1000, PCI-DAS1001, PCI_DAS1002
40 There are many reports of the driver being used with most of the
41 supported cards. Despite no detailed log is maintained, it can
42 be said that the driver is quite tested and stable.
44 The boards may be autocalibrated using the comedi_calibrate
47 Configuration options:
48 [0] - PCI bus of device (optional)
49 [1] - PCI slot of device (optional)
50 If bus/slot is not specified, the first supported
51 PCI device found will be used.
53 For commands, the scanned channels must be consecutive
54 (i.e. 4-5-6-7, 2-3-4,...), and must all have the same
61 analog triggering on 1602 series
64 #include "../comedidev.h"
65 #include <linux/delay.h>
66 #include <linux/interrupt.h>
70 #include "amcc_s5933.h"
71 #include "comedi_pci.h"
72 #include "comedi_fc.h"
74 #undef CB_PCIDAS_DEBUG /* disable debugging code */
75 /* #define CB_PCIDAS_DEBUG enable debugging code */
77 /* PCI vendor number of ComputerBoards/MeasurementComputing */
78 #define PCI_VENDOR_ID_CB 0x1307
79 #define TIMER_BASE 100 /* 10MHz master clock */
80 #define AI_BUFFER_SIZE 1024 /* maximum fifo size of any supported board */
81 #define AO_BUFFER_SIZE 1024 /* maximum fifo size of any supported board */
82 #define NUM_CHANNELS_8800 8
83 #define NUM_CHANNELS_7376 1
84 #define NUM_CHANNELS_8402 2
85 #define NUM_CHANNELS_DAC08 1
87 /* PCI-DAS base addresses */
89 /* indices of base address regions */
90 #define S5933_BADRINDEX 0
91 #define CONT_STAT_BADRINDEX 1
92 #define ADC_FIFO_BADRINDEX 2
93 #define PACER_BADRINDEX 3
94 #define AO_BADRINDEX 4
95 /* sizes of io regions */
96 #define CONT_STAT_SIZE 10
97 #define ADC_FIFO_SIZE 4
101 /* Control/Status registers */
102 #define INT_ADCFIFO 0 /* INTERRUPT / ADC FIFO register */
103 #define INT_EOS 0x1 /* interrupt end of scan */
104 #define INT_FHF 0x2 /* interrupt fifo half full */
105 #define INT_FNE 0x3 /* interrupt fifo not empty */
106 #define INT_MASK 0x3 /* mask of interrupt select bits */
107 #define INTE 0x4 /* interrupt enable */
108 #define DAHFIE 0x8 /* dac half full interrupt enable */
109 #define EOAIE 0x10 /* end of aquisition interrupt enable */
110 #define DAHFI 0x20 /* dac half full read status / write interrupt clear */
111 #define EOAI 0x40 /* read end of acq. interrupt status / write clear */
112 #define INT 0x80 /* read interrupt status / write clear */
113 #define EOBI 0x200 /* read end of burst interrupt status */
114 #define ADHFI 0x400 /* read half-full interrupt status */
115 #define ADNEI 0x800 /* read fifo not empty interrupt latch status */
116 #define ADNE 0x1000 /* read, fifo not empty (realtime, not latched) status */
117 #define DAEMIE 0x1000 /* write, dac empty interrupt enable */
118 #define LADFUL 0x2000 /* read fifo overflow / write clear */
119 #define DAEMI 0x4000 /* dac fifo empty interrupt status / write clear */
121 #define ADCMUX_CONT 2 /* ADC CHANNEL MUX AND CONTROL register */
122 #define BEGIN_SCAN(x) ((x) & 0xf)
123 #define END_SCAN(x) (((x) & 0xf) << 4)
124 #define GAIN_BITS(x) (((x) & 0x3) << 8)
125 #define UNIP 0x800 /* Analog front-end unipolar for range */
126 #define SE 0x400 /* Inputs in single-ended mode */
127 #define PACER_MASK 0x3000 /* pacer source bits */
128 #define PACER_INT 0x1000 /* internal pacer */
129 #define PACER_EXT_FALL 0x2000 /* external falling edge */
130 #define PACER_EXT_RISE 0x3000 /* external rising edge */
131 #define EOC 0x4000 /* adc not busy */
133 #define TRIG_CONTSTAT 4 /* TRIGGER CONTROL/STATUS register */
134 #define SW_TRIGGER 0x1 /* software start trigger */
135 #define EXT_TRIGGER 0x2 /* external start trigger */
136 #define ANALOG_TRIGGER 0x3 /* external analog trigger */
137 #define TRIGGER_MASK 0x3 /* mask of bits that determine start trigger */
138 #define TGEN 0x10 /* enable external start trigger */
139 #define BURSTE 0x20 /* burst mode enable */
140 #define XTRCL 0x80 /* clear external trigger */
142 #define CALIBRATION_REG 6 /* CALIBRATION register */
143 #define SELECT_8800_BIT 0x100 /* select 8800 caldac */
144 #define SELECT_TRIMPOT_BIT 0x200 /* select ad7376 trim pot */
145 #define SELECT_DAC08_BIT 0x400 /* select dac08 caldac */
146 #define CAL_SRC_BITS(x) (((x) & 0x7) << 11)
147 #define CAL_EN_BIT 0x4000 /* read calibration source instead of analog input channel 0 */
148 #define SERIAL_DATA_IN_BIT 0x8000 /* serial data stream going to 8800 and 7376 */
150 #define DAC_CSR 0x8 /* dac control and status register */
152 DACEN = 0x2, /* dac enable */
153 DAC_MODE_UPDATE_BOTH = 0x80, /* update both dacs when dac0 is written */
155 static inline unsigned int DAC_RANGE(unsigned int channel, unsigned int range)
157 return (range & 0x3) << (8 + 2 * (channel & 0x1));
160 static inline unsigned int DAC_RANGE_MASK(unsigned int channel)
162 return 0x3 << (8 + 2 * (channel & 0x1));
165 /* bits for 1602 series only */
166 enum dac_csr_bits_1602 {
167 DAC_EMPTY = 0x1, /* dac fifo empty, read, write clear */
168 DAC_START = 0x4, /* start/arm dac fifo operations */
169 DAC_PACER_MASK = 0x18, /* bits that set dac pacer source */
170 DAC_PACER_INT = 0x8, /* dac internal pacing */
171 DAC_PACER_EXT_FALL = 0x10, /* dac external pacing, falling edge */
172 DAC_PACER_EXT_RISE = 0x18, /* dac external pacing, rising edge */
174 static inline unsigned int DAC_CHAN_EN(unsigned int channel)
176 return 1 << (5 + (channel & 0x1)); /* enable channel 0 or 1 */
179 /* analog input fifo */
180 #define ADCDATA 0 /* ADC DATA register */
181 #define ADCFIFOCLR 2 /* ADC FIFO CLEAR */
183 /* pacer, counter, dio registers */
188 /* analog output registers for 100x, 1200 series */
189 static inline unsigned int DAC_DATA_REG(unsigned int channel)
191 return 2 * (channel & 0x1);
194 /* analog output registers for 1602 series*/
195 #define DACDATA 0 /* DAC DATA register */
196 #define DACFIFOCLR 2 /* DAC FIFO CLEAR */
198 /* bit in hexadecimal representation of range index that indicates unipolar input range */
199 #define IS_UNIPOLAR 0x4
200 /* analog input ranges for most boards */
201 static const struct comedi_lrange cb_pcidas_ranges = {
215 /* pci-das1001 input ranges */
216 static const struct comedi_lrange cb_pcidas_alt_ranges = {
230 /* analog output ranges */
231 static const struct comedi_lrange cb_pcidas_ao_ranges = {
246 struct cb_pcidas_board {
248 unsigned short device_id;
249 int ai_se_chans; /* Inputs in single-ended mode */
250 int ai_diff_chans; /* Inputs in differential mode */
251 int ai_bits; /* analog input resolution */
252 int ai_speed; /* fastest conversion period in ns */
253 int ao_nchan; /* number of analog out channels */
254 int has_ao_fifo; /* analog output has fifo */
255 int ao_scan_speed; /* analog output speed for 1602 series (for a scan, not conversion) */
256 int fifo_size; /* number of samples fifo can hold */
257 const struct comedi_lrange *ranges;
258 enum trimpot_model trimpot;
259 unsigned has_dac08:1;
262 static const struct cb_pcidas_board cb_pcidas_boards[] = {
264 .name = "pci-das1602/16",
272 .ao_scan_speed = 10000,
274 .ranges = &cb_pcidas_ranges,
279 .name = "pci-das1200",
288 .ranges = &cb_pcidas_ranges,
293 .name = "pci-das1602/12",
301 .ao_scan_speed = 4000,
303 .ranges = &cb_pcidas_ranges,
308 .name = "pci-das1200/jr",
317 .ranges = &cb_pcidas_ranges,
322 .name = "pci-das1602/16/jr",
331 .ranges = &cb_pcidas_ranges,
336 .name = "pci-das1000",
345 .ranges = &cb_pcidas_ranges,
350 .name = "pci-das1001",
359 .ranges = &cb_pcidas_alt_ranges,
364 .name = "pci-das1002",
373 .ranges = &cb_pcidas_ranges,
379 static DEFINE_PCI_DEVICE_TABLE(cb_pcidas_pci_table) = {
381 PCI_VENDOR_ID_CB, 0x0001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
382 PCI_VENDOR_ID_CB, 0x000f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
383 PCI_VENDOR_ID_CB, 0x0010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
384 PCI_VENDOR_ID_CB, 0x0019, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
385 PCI_VENDOR_ID_CB, 0x001c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
386 PCI_VENDOR_ID_CB, 0x004c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
387 PCI_VENDOR_ID_CB, 0x001a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
388 PCI_VENDOR_ID_CB, 0x001b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
392 MODULE_DEVICE_TABLE(pci, cb_pcidas_pci_table);
395 * Useful for shorthand access to the particular board structure
397 #define thisboard ((const struct cb_pcidas_board *)dev->board_ptr)
399 /* this structure is for data unique to this hardware driver. If
400 several hardware drivers keep similar information in this structure,
401 feel free to suggest moving the variable to the struct comedi_device struct. */
402 struct cb_pcidas_private {
403 /* would be useful for a PCI device */
404 struct pci_dev *pci_dev;
406 unsigned long s5933_config;
407 unsigned long control_status;
408 unsigned long adc_fifo;
409 unsigned long pacer_counter_dio;
410 unsigned long ao_registers;
411 /* divisors of master clock for analog input pacing */
412 unsigned int divisor1;
413 unsigned int divisor2;
414 volatile unsigned int count; /* number of analog input samples remaining */
415 volatile unsigned int adc_fifo_bits; /* bits to write to interupt/adcfifo register */
416 volatile unsigned int s5933_intcsr_bits; /* bits to write to amcc s5933 interrupt control/status register */
417 volatile unsigned int ao_control_bits; /* bits to write to ao control and status register */
418 short ai_buffer[AI_BUFFER_SIZE];
419 short ao_buffer[AO_BUFFER_SIZE];
420 /* divisors of master clock for analog output pacing */
421 unsigned int ao_divisor1;
422 unsigned int ao_divisor2;
423 volatile unsigned int ao_count; /* number of analog output samples remaining */
424 int ao_value[2]; /* remember what the analog outputs are set to, to allow readback */
425 unsigned int caldac_value[NUM_CHANNELS_8800]; /* for readback of caldac */
426 unsigned int trimpot_value[NUM_CHANNELS_8402]; /* for readback of trimpot */
427 unsigned int dac08_value;
428 unsigned int calibration_source;
432 * most drivers define the following macro to make it easy to
433 * access the private structure.
435 #define devpriv ((struct cb_pcidas_private *)dev->private)
438 * The struct comedi_driver structure tells the Comedi core module
439 * which functions to call to configure/deconfigure (attach/detach)
440 * the board, and also about the kernel module that contains
443 static int cb_pcidas_attach(struct comedi_device *dev,
444 struct comedi_devconfig *it);
445 static int cb_pcidas_detach(struct comedi_device *dev);
446 static struct comedi_driver driver_cb_pcidas = {
447 .driver_name = "cb_pcidas",
448 .module = THIS_MODULE,
449 .attach = cb_pcidas_attach,
450 .detach = cb_pcidas_detach,
453 static int cb_pcidas_ai_rinsn(struct comedi_device *dev,
454 struct comedi_subdevice *s,
455 struct comedi_insn *insn, unsigned int *data);
456 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
457 struct comedi_insn *insn, unsigned int *data);
458 static int cb_pcidas_ao_nofifo_winsn(struct comedi_device *dev,
459 struct comedi_subdevice *s,
460 struct comedi_insn *insn,
462 static int cb_pcidas_ao_fifo_winsn(struct comedi_device *dev,
463 struct comedi_subdevice *s,
464 struct comedi_insn *insn,
466 static int cb_pcidas_ao_readback_insn(struct comedi_device *dev,
467 struct comedi_subdevice *s,
468 struct comedi_insn *insn,
470 static int cb_pcidas_ai_cmd(struct comedi_device *dev,
471 struct comedi_subdevice *s);
472 static int cb_pcidas_ai_cmdtest(struct comedi_device *dev,
473 struct comedi_subdevice *s,
474 struct comedi_cmd *cmd);
475 static int cb_pcidas_ao_cmd(struct comedi_device *dev,
476 struct comedi_subdevice *s);
477 static int cb_pcidas_ao_inttrig(struct comedi_device *dev,
478 struct comedi_subdevice *subdev,
479 unsigned int trig_num);
480 static int cb_pcidas_ao_cmdtest(struct comedi_device *dev,
481 struct comedi_subdevice *s,
482 struct comedi_cmd *cmd);
483 static irqreturn_t cb_pcidas_interrupt(int irq, void *d);
484 static void handle_ao_interrupt(struct comedi_device *dev, unsigned int status);
485 static int cb_pcidas_cancel(struct comedi_device *dev,
486 struct comedi_subdevice *s);
487 static int cb_pcidas_ao_cancel(struct comedi_device *dev,
488 struct comedi_subdevice *s);
489 static void cb_pcidas_load_counters(struct comedi_device *dev, unsigned int *ns,
491 static int eeprom_read_insn(struct comedi_device *dev,
492 struct comedi_subdevice *s,
493 struct comedi_insn *insn, unsigned int *data);
494 static int caldac_read_insn(struct comedi_device *dev,
495 struct comedi_subdevice *s,
496 struct comedi_insn *insn, unsigned int *data);
497 static int caldac_write_insn(struct comedi_device *dev,
498 struct comedi_subdevice *s,
499 struct comedi_insn *insn, unsigned int *data);
500 static int trimpot_read_insn(struct comedi_device *dev,
501 struct comedi_subdevice *s,
502 struct comedi_insn *insn, unsigned int *data);
503 static int cb_pcidas_trimpot_write(struct comedi_device *dev,
504 unsigned int channel, unsigned int value);
505 static int trimpot_write_insn(struct comedi_device *dev,
506 struct comedi_subdevice *s,
507 struct comedi_insn *insn, unsigned int *data);
508 static int dac08_read_insn(struct comedi_device *dev,
509 struct comedi_subdevice *s, struct comedi_insn *insn,
511 static int dac08_write(struct comedi_device *dev, unsigned int value);
512 static int dac08_write_insn(struct comedi_device *dev,
513 struct comedi_subdevice *s,
514 struct comedi_insn *insn, unsigned int *data);
515 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
517 static int trimpot_7376_write(struct comedi_device *dev, uint8_t value);
518 static int trimpot_8402_write(struct comedi_device *dev, unsigned int channel,
520 static int nvram_read(struct comedi_device *dev, unsigned int address,
523 static inline unsigned int cal_enable_bits(struct comedi_device *dev)
525 return CAL_EN_BIT | CAL_SRC_BITS(devpriv->calibration_source);
529 * Attach is called by the Comedi core to configure the driver
530 * for a particular board.
532 static int cb_pcidas_attach(struct comedi_device *dev,
533 struct comedi_devconfig *it)
535 struct comedi_subdevice *s;
536 struct pci_dev *pcidev;
540 printk("comedi%d: cb_pcidas: ", dev->minor);
543 * Allocate the private structure area.
545 if (alloc_private(dev, sizeof(struct cb_pcidas_private)) < 0)
549 * Probe the device to determine what device in the series it is.
553 for (pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL);
555 pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
556 /* is it not a computer boards card? */
557 if (pcidev->vendor != PCI_VENDOR_ID_CB)
559 /* loop through cards supported by this driver */
560 for (index = 0; index < ARRAY_SIZE(cb_pcidas_boards); index++) {
561 if (cb_pcidas_boards[index].device_id != pcidev->device)
563 /* was a particular bus/slot requested? */
564 if (it->options[0] || it->options[1]) {
565 /* are we on the wrong bus/slot? */
566 if (pcidev->bus->number != it->options[0] ||
567 PCI_SLOT(pcidev->devfn) != it->options[1]) {
571 devpriv->pci_dev = pcidev;
572 dev->board_ptr = cb_pcidas_boards + index;
577 printk("No supported ComputerBoards/MeasurementComputing card found on "
578 "requested position\n");
583 printk("Found %s on bus %i, slot %i\n", cb_pcidas_boards[index].name,
584 pcidev->bus->number, PCI_SLOT(pcidev->devfn));
587 * Enable PCI device and reserve I/O ports.
589 if (comedi_pci_enable(pcidev, "cb_pcidas")) {
590 printk(" Failed to enable PCI device and request regions\n");
594 * Initialize devpriv->control_status and devpriv->adc_fifo to point to
595 * their base address.
597 devpriv->s5933_config =
598 pci_resource_start(devpriv->pci_dev, S5933_BADRINDEX);
599 devpriv->control_status =
600 pci_resource_start(devpriv->pci_dev, CONT_STAT_BADRINDEX);
602 pci_resource_start(devpriv->pci_dev, ADC_FIFO_BADRINDEX);
603 devpriv->pacer_counter_dio =
604 pci_resource_start(devpriv->pci_dev, PACER_BADRINDEX);
605 if (thisboard->ao_nchan) {
606 devpriv->ao_registers =
607 pci_resource_start(devpriv->pci_dev, AO_BADRINDEX);
609 /* disable and clear interrupts on amcc s5933 */
610 outl(INTCSR_INBOX_INTR_STATUS,
611 devpriv->s5933_config + AMCC_OP_REG_INTCSR);
614 if (request_irq(devpriv->pci_dev->irq, cb_pcidas_interrupt,
615 IRQF_SHARED, "cb_pcidas", dev)) {
616 printk(" unable to allocate irq %d\n", devpriv->pci_dev->irq);
619 dev->irq = devpriv->pci_dev->irq;
621 /* Initialize dev->board_name */
622 dev->board_name = thisboard->name;
625 * Allocate the subdevice structures.
627 if (alloc_subdevices(dev, 7) < 0)
630 s = dev->subdevices + 0;
631 /* analog input subdevice */
632 dev->read_subdev = s;
633 s->type = COMEDI_SUBD_AI;
634 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF | SDF_CMD_READ;
635 /* WARNING: Number of inputs in differential mode is ignored */
636 s->n_chan = thisboard->ai_se_chans;
637 s->len_chanlist = thisboard->ai_se_chans;
638 s->maxdata = (1 << thisboard->ai_bits) - 1;
639 s->range_table = thisboard->ranges;
640 s->insn_read = cb_pcidas_ai_rinsn;
641 s->insn_config = ai_config_insn;
642 s->do_cmd = cb_pcidas_ai_cmd;
643 s->do_cmdtest = cb_pcidas_ai_cmdtest;
644 s->cancel = cb_pcidas_cancel;
646 /* analog output subdevice */
647 s = dev->subdevices + 1;
648 if (thisboard->ao_nchan) {
649 s->type = COMEDI_SUBD_AO;
650 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_GROUND;
651 s->n_chan = thisboard->ao_nchan;
652 /* analog out resolution is the same as analog input resolution, so use ai_bits */
653 s->maxdata = (1 << thisboard->ai_bits) - 1;
654 s->range_table = &cb_pcidas_ao_ranges;
655 s->insn_read = cb_pcidas_ao_readback_insn;
656 if (thisboard->has_ao_fifo) {
657 dev->write_subdev = s;
658 s->subdev_flags |= SDF_CMD_WRITE;
659 s->insn_write = cb_pcidas_ao_fifo_winsn;
660 s->do_cmdtest = cb_pcidas_ao_cmdtest;
661 s->do_cmd = cb_pcidas_ao_cmd;
662 s->cancel = cb_pcidas_ao_cancel;
664 s->insn_write = cb_pcidas_ao_nofifo_winsn;
667 s->type = COMEDI_SUBD_UNUSED;
671 s = dev->subdevices + 2;
672 subdev_8255_init(dev, s, NULL, devpriv->pacer_counter_dio + DIO_8255);
675 s = dev->subdevices + 3;
676 s->type = COMEDI_SUBD_MEMORY;
677 s->subdev_flags = SDF_READABLE | SDF_INTERNAL;
680 s->insn_read = eeprom_read_insn;
683 s = dev->subdevices + 4;
684 s->type = COMEDI_SUBD_CALIB;
685 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
686 s->n_chan = NUM_CHANNELS_8800;
688 s->insn_read = caldac_read_insn;
689 s->insn_write = caldac_write_insn;
690 for (i = 0; i < s->n_chan; i++)
691 caldac_8800_write(dev, i, s->maxdata / 2);
693 /* trim potentiometer */
694 s = dev->subdevices + 5;
695 s->type = COMEDI_SUBD_CALIB;
696 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
697 if (thisboard->trimpot == AD7376) {
698 s->n_chan = NUM_CHANNELS_7376;
701 s->n_chan = NUM_CHANNELS_8402;
704 s->insn_read = trimpot_read_insn;
705 s->insn_write = trimpot_write_insn;
706 for (i = 0; i < s->n_chan; i++)
707 cb_pcidas_trimpot_write(dev, i, s->maxdata / 2);
710 s = dev->subdevices + 6;
711 if (thisboard->has_dac08) {
712 s->type = COMEDI_SUBD_CALIB;
713 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
714 s->n_chan = NUM_CHANNELS_DAC08;
715 s->insn_read = dac08_read_insn;
716 s->insn_write = dac08_write_insn;
718 dac08_write(dev, s->maxdata / 2);
720 s->type = COMEDI_SUBD_UNUSED;
722 /* make sure mailbox 4 is empty */
723 inl(devpriv->s5933_config + AMCC_OP_REG_IMB4);
724 /* Set bits to enable incoming mailbox interrupts on amcc s5933. */
725 devpriv->s5933_intcsr_bits =
726 INTCSR_INBOX_BYTE(3) | INTCSR_INBOX_SELECT(3) |
727 INTCSR_INBOX_FULL_INT;
728 /* clear and enable interrupt on amcc s5933 */
729 outl(devpriv->s5933_intcsr_bits | INTCSR_INBOX_INTR_STATUS,
730 devpriv->s5933_config + AMCC_OP_REG_INTCSR);
736 * cb_pcidas_detach is called to deconfigure a device. It should deallocate
738 * This function is also called when _attach() fails, so it should be
739 * careful not to release resources that were not necessarily
740 * allocated by _attach(). dev->private and dev->subdevices are
741 * deallocated automatically by the core.
743 static int cb_pcidas_detach(struct comedi_device *dev)
745 printk("comedi%d: cb_pcidas: remove\n", dev->minor);
748 if (devpriv->s5933_config) {
749 /* disable and clear interrupts on amcc s5933 */
750 outl(INTCSR_INBOX_INTR_STATUS,
751 devpriv->s5933_config + AMCC_OP_REG_INTCSR);
752 #ifdef CB_PCIDAS_DEBUG
753 printk("detaching, incsr is 0x%x\n",
754 inl(devpriv->s5933_config + AMCC_OP_REG_INTCSR));
759 free_irq(dev->irq, dev);
761 subdev_8255_cleanup(dev, dev->subdevices + 2);
762 if (devpriv && devpriv->pci_dev) {
763 if (devpriv->s5933_config)
764 comedi_pci_disable(devpriv->pci_dev);
765 pci_dev_put(devpriv->pci_dev);
772 * "instructions" read/write data in "one-shot" or "software-triggered"
775 static int cb_pcidas_ai_rinsn(struct comedi_device *dev,
776 struct comedi_subdevice *s,
777 struct comedi_insn *insn, unsigned int *data)
781 static const int timeout = 10000;
783 /* enable calibration input if appropriate */
784 if (insn->chanspec & CR_ALT_SOURCE) {
785 outw(cal_enable_bits(dev),
786 devpriv->control_status + CALIBRATION_REG);
789 outw(0, devpriv->control_status + CALIBRATION_REG);
790 channel = CR_CHAN(insn->chanspec);
792 /* set mux limits and gain */
793 bits = BEGIN_SCAN(channel) |
794 END_SCAN(channel) | GAIN_BITS(CR_RANGE(insn->chanspec));
795 /* set unipolar/bipolar */
796 if (CR_RANGE(insn->chanspec) & IS_UNIPOLAR)
798 /* set singleended/differential */
799 if (CR_AREF(insn->chanspec) != AREF_DIFF)
801 outw(bits, devpriv->control_status + ADCMUX_CONT);
804 outw(0, devpriv->adc_fifo + ADCFIFOCLR);
806 /* convert n samples */
807 for (n = 0; n < insn->n; n++) {
808 /* trigger conversion */
809 outw(0, devpriv->adc_fifo + ADCDATA);
811 /* wait for conversion to end */
812 /* return -ETIMEDOUT if there is a timeout */
813 for (i = 0; i < timeout; i++) {
814 if (inw(devpriv->control_status + ADCMUX_CONT) & EOC)
821 data[n] = inw(devpriv->adc_fifo + ADCDATA);
824 /* return the number of samples read/written */
828 static int ai_config_calibration_source(struct comedi_device *dev,
831 static const int num_calibration_sources = 8;
832 unsigned int source = data[1];
834 if (source >= num_calibration_sources) {
835 printk("invalid calibration source: %i\n", source);
839 devpriv->calibration_source = source;
844 static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s,
845 struct comedi_insn *insn, unsigned int *data)
850 case INSN_CONFIG_ALT_SOURCE:
851 return ai_config_calibration_source(dev, data);
860 /* analog output insn for pcidas-1000 and 1200 series */
861 static int cb_pcidas_ao_nofifo_winsn(struct comedi_device *dev,
862 struct comedi_subdevice *s,
863 struct comedi_insn *insn,
869 /* set channel and range */
870 channel = CR_CHAN(insn->chanspec);
871 spin_lock_irqsave(&dev->spinlock, flags);
872 devpriv->ao_control_bits &=
873 ~DAC_MODE_UPDATE_BOTH & ~DAC_RANGE_MASK(channel);
874 devpriv->ao_control_bits |=
875 DACEN | DAC_RANGE(channel, CR_RANGE(insn->chanspec));
876 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR);
877 spin_unlock_irqrestore(&dev->spinlock, flags);
879 /* remember value for readback */
880 devpriv->ao_value[channel] = data[0];
882 outw(data[0], devpriv->ao_registers + DAC_DATA_REG(channel));
887 /* analog output insn for pcidas-1602 series */
888 static int cb_pcidas_ao_fifo_winsn(struct comedi_device *dev,
889 struct comedi_subdevice *s,
890 struct comedi_insn *insn, unsigned int *data)
896 outw(0, devpriv->ao_registers + DACFIFOCLR);
898 /* set channel and range */
899 channel = CR_CHAN(insn->chanspec);
900 spin_lock_irqsave(&dev->spinlock, flags);
901 devpriv->ao_control_bits &=
902 ~DAC_CHAN_EN(0) & ~DAC_CHAN_EN(1) & ~DAC_RANGE_MASK(channel) &
904 devpriv->ao_control_bits |=
905 DACEN | DAC_RANGE(channel,
907 chanspec)) | DAC_CHAN_EN(channel) |
909 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR);
910 spin_unlock_irqrestore(&dev->spinlock, flags);
912 /* remember value for readback */
913 devpriv->ao_value[channel] = data[0];
915 outw(data[0], devpriv->ao_registers + DACDATA);
920 /* analog output readback insn */
921 /* XXX loses track of analog output value back after an analog ouput command is executed */
922 static int cb_pcidas_ao_readback_insn(struct comedi_device *dev,
923 struct comedi_subdevice *s,
924 struct comedi_insn *insn,
927 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
932 static int eeprom_read_insn(struct comedi_device *dev,
933 struct comedi_subdevice *s,
934 struct comedi_insn *insn, unsigned int *data)
939 retval = nvram_read(dev, CR_CHAN(insn->chanspec), &nvram_data);
943 data[0] = nvram_data;
948 static int caldac_write_insn(struct comedi_device *dev,
949 struct comedi_subdevice *s,
950 struct comedi_insn *insn, unsigned int *data)
952 const unsigned int channel = CR_CHAN(insn->chanspec);
954 return caldac_8800_write(dev, channel, data[0]);
957 static int caldac_read_insn(struct comedi_device *dev,
958 struct comedi_subdevice *s,
959 struct comedi_insn *insn, unsigned int *data)
961 data[0] = devpriv->caldac_value[CR_CHAN(insn->chanspec)];
966 /* 1602/16 pregain offset */
967 static int dac08_write(struct comedi_device *dev, unsigned int value)
969 if (devpriv->dac08_value == value)
972 devpriv->dac08_value = value;
974 outw(cal_enable_bits(dev) | (value & 0xff),
975 devpriv->control_status + CALIBRATION_REG);
977 outw(cal_enable_bits(dev) | SELECT_DAC08_BIT | (value & 0xff),
978 devpriv->control_status + CALIBRATION_REG);
980 outw(cal_enable_bits(dev) | (value & 0xff),
981 devpriv->control_status + CALIBRATION_REG);
987 static int dac08_write_insn(struct comedi_device *dev,
988 struct comedi_subdevice *s,
989 struct comedi_insn *insn, unsigned int *data)
991 return dac08_write(dev, data[0]);
994 static int dac08_read_insn(struct comedi_device *dev,
995 struct comedi_subdevice *s, struct comedi_insn *insn,
998 data[0] = devpriv->dac08_value;
1003 static int cb_pcidas_trimpot_write(struct comedi_device *dev,
1004 unsigned int channel, unsigned int value)
1006 if (devpriv->trimpot_value[channel] == value)
1009 devpriv->trimpot_value[channel] = value;
1010 switch (thisboard->trimpot) {
1012 trimpot_7376_write(dev, value);
1015 trimpot_8402_write(dev, channel, value);
1018 comedi_error(dev, "driver bug?");
1026 static int trimpot_write_insn(struct comedi_device *dev,
1027 struct comedi_subdevice *s,
1028 struct comedi_insn *insn, unsigned int *data)
1030 unsigned int channel = CR_CHAN(insn->chanspec);
1032 return cb_pcidas_trimpot_write(dev, channel, data[0]);
1035 static int trimpot_read_insn(struct comedi_device *dev,
1036 struct comedi_subdevice *s,
1037 struct comedi_insn *insn, unsigned int *data)
1039 unsigned int channel = CR_CHAN(insn->chanspec);
1041 data[0] = devpriv->trimpot_value[channel];
1046 static int cb_pcidas_ai_cmdtest(struct comedi_device *dev,
1047 struct comedi_subdevice *s,
1048 struct comedi_cmd *cmd)
1052 int i, gain, start_chan;
1054 /* cmdtest tests a particular command to see if it is valid.
1055 * Using the cmdtest ioctl, a user can create a valid cmd
1056 * and then have it executes by the cmd ioctl.
1058 * cmdtest returns 1,2,3,4 or 0, depending on which tests
1059 * the command passes. */
1061 /* step 1: make sure trigger sources are trivially valid */
1063 tmp = cmd->start_src;
1064 cmd->start_src &= TRIG_NOW | TRIG_EXT;
1065 if (!cmd->start_src || tmp != cmd->start_src)
1068 tmp = cmd->scan_begin_src;
1069 cmd->scan_begin_src &= TRIG_FOLLOW | TRIG_TIMER | TRIG_EXT;
1070 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
1073 tmp = cmd->convert_src;
1074 cmd->convert_src &= TRIG_TIMER | TRIG_NOW | TRIG_EXT;
1075 if (!cmd->convert_src || tmp != cmd->convert_src)
1078 tmp = cmd->scan_end_src;
1079 cmd->scan_end_src &= TRIG_COUNT;
1080 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
1083 tmp = cmd->stop_src;
1084 cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
1085 if (!cmd->stop_src || tmp != cmd->stop_src)
1091 /* step 2: make sure trigger sources are unique and mutually compatible */
1093 if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT)
1095 if (cmd->scan_begin_src != TRIG_FOLLOW &&
1096 cmd->scan_begin_src != TRIG_TIMER &&
1097 cmd->scan_begin_src != TRIG_EXT)
1099 if (cmd->convert_src != TRIG_TIMER &&
1100 cmd->convert_src != TRIG_EXT && cmd->convert_src != TRIG_NOW)
1102 if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE)
1105 /* make sure trigger sources are compatible with each other */
1106 if (cmd->scan_begin_src == TRIG_FOLLOW && cmd->convert_src == TRIG_NOW)
1108 if (cmd->scan_begin_src != TRIG_FOLLOW && cmd->convert_src != TRIG_NOW)
1110 if (cmd->start_src == TRIG_EXT &&
1111 (cmd->convert_src == TRIG_EXT || cmd->scan_begin_src == TRIG_EXT))
1117 /* step 3: make sure arguments are trivially compatible */
1119 if (cmd->start_arg != 0) {
1124 if (cmd->scan_begin_src == TRIG_TIMER) {
1125 if (cmd->scan_begin_arg <
1126 thisboard->ai_speed * cmd->chanlist_len) {
1127 cmd->scan_begin_arg =
1128 thisboard->ai_speed * cmd->chanlist_len;
1132 if (cmd->convert_src == TRIG_TIMER) {
1133 if (cmd->convert_arg < thisboard->ai_speed) {
1134 cmd->convert_arg = thisboard->ai_speed;
1139 if (cmd->scan_end_arg != cmd->chanlist_len) {
1140 cmd->scan_end_arg = cmd->chanlist_len;
1143 if (cmd->stop_src == TRIG_NONE) {
1145 if (cmd->stop_arg != 0) {
1154 /* step 4: fix up any arguments */
1156 if (cmd->scan_begin_src == TRIG_TIMER) {
1157 tmp = cmd->scan_begin_arg;
1158 i8253_cascade_ns_to_timer_2div(TIMER_BASE,
1159 &(devpriv->divisor1),
1160 &(devpriv->divisor2),
1161 &(cmd->scan_begin_arg),
1162 cmd->flags & TRIG_ROUND_MASK);
1163 if (tmp != cmd->scan_begin_arg)
1166 if (cmd->convert_src == TRIG_TIMER) {
1167 tmp = cmd->convert_arg;
1168 i8253_cascade_ns_to_timer_2div(TIMER_BASE,
1169 &(devpriv->divisor1),
1170 &(devpriv->divisor2),
1171 &(cmd->convert_arg),
1172 cmd->flags & TRIG_ROUND_MASK);
1173 if (tmp != cmd->convert_arg)
1180 /* check channel/gain list against card's limitations */
1181 if (cmd->chanlist) {
1182 gain = CR_RANGE(cmd->chanlist[0]);
1183 start_chan = CR_CHAN(cmd->chanlist[0]);
1184 for (i = 1; i < cmd->chanlist_len; i++) {
1185 if (CR_CHAN(cmd->chanlist[i]) !=
1186 (start_chan + i) % s->n_chan) {
1188 "entries in chanlist must be consecutive channels, counting upwards\n");
1191 if (CR_RANGE(cmd->chanlist[i]) != gain) {
1193 "entries in chanlist must all have the same gain\n");
1205 static int cb_pcidas_ai_cmd(struct comedi_device *dev,
1206 struct comedi_subdevice *s)
1208 struct comedi_async *async = s->async;
1209 struct comedi_cmd *cmd = &async->cmd;
1211 unsigned long flags;
1213 /* make sure CAL_EN_BIT is disabled */
1214 outw(0, devpriv->control_status + CALIBRATION_REG);
1215 /* initialize before settings pacer source and count values */
1216 outw(0, devpriv->control_status + TRIG_CONTSTAT);
1218 outw(0, devpriv->adc_fifo + ADCFIFOCLR);
1220 /* set mux limits, gain and pacer source */
1221 bits = BEGIN_SCAN(CR_CHAN(cmd->chanlist[0])) |
1222 END_SCAN(CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1])) |
1223 GAIN_BITS(CR_RANGE(cmd->chanlist[0]));
1224 /* set unipolar/bipolar */
1225 if (CR_RANGE(cmd->chanlist[0]) & IS_UNIPOLAR)
1227 /* set singleended/differential */
1228 if (CR_AREF(cmd->chanlist[0]) != AREF_DIFF)
1230 /* set pacer source */
1231 if (cmd->convert_src == TRIG_EXT || cmd->scan_begin_src == TRIG_EXT)
1232 bits |= PACER_EXT_RISE;
1235 outw(bits, devpriv->control_status + ADCMUX_CONT);
1237 #ifdef CB_PCIDAS_DEBUG
1238 printk("comedi: sent 0x%x to adcmux control\n", bits);
1242 if (cmd->convert_src == TRIG_TIMER)
1243 cb_pcidas_load_counters(dev, &cmd->convert_arg,
1244 cmd->flags & TRIG_ROUND_MASK);
1245 else if (cmd->scan_begin_src == TRIG_TIMER)
1246 cb_pcidas_load_counters(dev, &cmd->scan_begin_arg,
1247 cmd->flags & TRIG_ROUND_MASK);
1249 /* set number of conversions */
1250 if (cmd->stop_src == TRIG_COUNT)
1251 devpriv->count = cmd->chanlist_len * cmd->stop_arg;
1252 /* enable interrupts */
1253 spin_lock_irqsave(&dev->spinlock, flags);
1254 devpriv->adc_fifo_bits |= INTE;
1255 devpriv->adc_fifo_bits &= ~INT_MASK;
1256 if (cmd->flags & TRIG_WAKE_EOS) {
1257 if (cmd->convert_src == TRIG_NOW && cmd->chanlist_len > 1)
1258 devpriv->adc_fifo_bits |= INT_EOS; /* interrupt end of burst */
1260 devpriv->adc_fifo_bits |= INT_FNE; /* interrupt fifo not empty */
1262 devpriv->adc_fifo_bits |= INT_FHF; /* interrupt fifo half full */
1264 #ifdef CB_PCIDAS_DEBUG
1265 printk("comedi: adc_fifo_bits are 0x%x\n", devpriv->adc_fifo_bits);
1267 /* enable (and clear) interrupts */
1268 outw(devpriv->adc_fifo_bits | EOAI | INT | LADFUL,
1269 devpriv->control_status + INT_ADCFIFO);
1270 spin_unlock_irqrestore(&dev->spinlock, flags);
1272 /* set start trigger and burst mode */
1274 if (cmd->start_src == TRIG_NOW)
1276 else if (cmd->start_src == TRIG_EXT)
1277 bits |= EXT_TRIGGER | TGEN | XTRCL;
1279 comedi_error(dev, "bug!");
1282 if (cmd->convert_src == TRIG_NOW && cmd->chanlist_len > 1)
1284 outw(bits, devpriv->control_status + TRIG_CONTSTAT);
1285 #ifdef CB_PCIDAS_DEBUG
1286 printk("comedi: sent 0x%x to trig control\n", bits);
1292 static int cb_pcidas_ao_cmdtest(struct comedi_device *dev,
1293 struct comedi_subdevice *s,
1294 struct comedi_cmd *cmd)
1299 /* cmdtest tests a particular command to see if it is valid.
1300 * Using the cmdtest ioctl, a user can create a valid cmd
1301 * and then have it executes by the cmd ioctl.
1303 * cmdtest returns 1,2,3,4 or 0, depending on which tests
1304 * the command passes. */
1306 /* step 1: make sure trigger sources are trivially valid */
1308 tmp = cmd->start_src;
1309 cmd->start_src &= TRIG_INT;
1310 if (!cmd->start_src || tmp != cmd->start_src)
1313 tmp = cmd->scan_begin_src;
1314 cmd->scan_begin_src &= TRIG_TIMER | TRIG_EXT;
1315 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
1318 tmp = cmd->convert_src;
1319 cmd->convert_src &= TRIG_NOW;
1320 if (!cmd->convert_src || tmp != cmd->convert_src)
1323 tmp = cmd->scan_end_src;
1324 cmd->scan_end_src &= TRIG_COUNT;
1325 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
1328 tmp = cmd->stop_src;
1329 cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
1330 if (!cmd->stop_src || tmp != cmd->stop_src)
1336 /* step 2: make sure trigger sources are unique and mutually compatible */
1338 if (cmd->scan_begin_src != TRIG_TIMER &&
1339 cmd->scan_begin_src != TRIG_EXT)
1341 if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE)
1347 /* step 3: make sure arguments are trivially compatible */
1349 if (cmd->start_arg != 0) {
1354 if (cmd->scan_begin_src == TRIG_TIMER) {
1355 if (cmd->scan_begin_arg < thisboard->ao_scan_speed) {
1356 cmd->scan_begin_arg = thisboard->ao_scan_speed;
1361 if (cmd->scan_end_arg != cmd->chanlist_len) {
1362 cmd->scan_end_arg = cmd->chanlist_len;
1365 if (cmd->stop_src == TRIG_NONE) {
1367 if (cmd->stop_arg != 0) {
1376 /* step 4: fix up any arguments */
1378 if (cmd->scan_begin_src == TRIG_TIMER) {
1379 tmp = cmd->scan_begin_arg;
1380 i8253_cascade_ns_to_timer_2div(TIMER_BASE,
1381 &(devpriv->ao_divisor1),
1382 &(devpriv->ao_divisor2),
1383 &(cmd->scan_begin_arg),
1384 cmd->flags & TRIG_ROUND_MASK);
1385 if (tmp != cmd->scan_begin_arg)
1392 /* check channel/gain list against card's limitations */
1393 if (cmd->chanlist && cmd->chanlist_len > 1) {
1394 if (CR_CHAN(cmd->chanlist[0]) != 0 ||
1395 CR_CHAN(cmd->chanlist[1]) != 1) {
1397 "channels must be ordered channel 0, channel 1 in chanlist\n");
1408 static int cb_pcidas_ao_cmd(struct comedi_device *dev,
1409 struct comedi_subdevice *s)
1411 struct comedi_async *async = s->async;
1412 struct comedi_cmd *cmd = &async->cmd;
1414 unsigned long flags;
1416 /* set channel limits, gain */
1417 spin_lock_irqsave(&dev->spinlock, flags);
1418 for (i = 0; i < cmd->chanlist_len; i++) {
1419 /* enable channel */
1420 devpriv->ao_control_bits |=
1421 DAC_CHAN_EN(CR_CHAN(cmd->chanlist[i]));
1423 devpriv->ao_control_bits |= DAC_RANGE(CR_CHAN(cmd->chanlist[i]),
1428 /* disable analog out before settings pacer source and count values */
1429 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR);
1430 spin_unlock_irqrestore(&dev->spinlock, flags);
1433 outw(0, devpriv->ao_registers + DACFIFOCLR);
1436 if (cmd->scan_begin_src == TRIG_TIMER) {
1437 i8253_cascade_ns_to_timer_2div(TIMER_BASE,
1438 &(devpriv->ao_divisor1),
1439 &(devpriv->ao_divisor2),
1440 &(cmd->scan_begin_arg),
1443 /* Write the values of ctr1 and ctr2 into counters 1 and 2 */
1444 i8254_load(devpriv->pacer_counter_dio + DAC8254, 0, 1,
1445 devpriv->ao_divisor1, 2);
1446 i8254_load(devpriv->pacer_counter_dio + DAC8254, 0, 2,
1447 devpriv->ao_divisor2, 2);
1449 /* set number of conversions */
1450 if (cmd->stop_src == TRIG_COUNT)
1451 devpriv->ao_count = cmd->chanlist_len * cmd->stop_arg;
1452 /* set pacer source */
1453 spin_lock_irqsave(&dev->spinlock, flags);
1454 switch (cmd->scan_begin_src) {
1456 devpriv->ao_control_bits |= DAC_PACER_INT;
1459 devpriv->ao_control_bits |= DAC_PACER_EXT_RISE;
1462 spin_unlock_irqrestore(&dev->spinlock, flags);
1463 comedi_error(dev, "error setting dac pacer source");
1467 spin_unlock_irqrestore(&dev->spinlock, flags);
1469 async->inttrig = cb_pcidas_ao_inttrig;
1474 static int cb_pcidas_ao_inttrig(struct comedi_device *dev,
1475 struct comedi_subdevice *s,
1476 unsigned int trig_num)
1478 unsigned int num_bytes, num_points = thisboard->fifo_size;
1479 struct comedi_async *async = s->async;
1480 struct comedi_cmd *cmd = &s->async->cmd;
1481 unsigned long flags;
1487 if (cmd->stop_src == TRIG_COUNT && devpriv->ao_count < num_points)
1488 num_points = devpriv->ao_count;
1490 num_bytes = cfc_read_array_from_buffer(s, devpriv->ao_buffer,
1491 num_points * sizeof(short));
1492 num_points = num_bytes / sizeof(short);
1494 if (cmd->stop_src == TRIG_COUNT)
1495 devpriv->ao_count -= num_points;
1496 /* write data to board's fifo */
1497 outsw(devpriv->ao_registers + DACDATA, devpriv->ao_buffer, num_bytes);
1499 /* enable dac half-full and empty interrupts */
1500 spin_lock_irqsave(&dev->spinlock, flags);
1501 devpriv->adc_fifo_bits |= DAEMIE | DAHFIE;
1502 #ifdef CB_PCIDAS_DEBUG
1503 printk("comedi: adc_fifo_bits are 0x%x\n", devpriv->adc_fifo_bits);
1505 /* enable and clear interrupts */
1506 outw(devpriv->adc_fifo_bits | DAEMI | DAHFI,
1507 devpriv->control_status + INT_ADCFIFO);
1510 devpriv->ao_control_bits |= DAC_START | DACEN | DAC_EMPTY;
1511 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR);
1512 #ifdef CB_PCIDAS_DEBUG
1513 printk("comedi: sent 0x%x to dac control\n", devpriv->ao_control_bits);
1515 spin_unlock_irqrestore(&dev->spinlock, flags);
1517 async->inttrig = NULL;
1522 static irqreturn_t cb_pcidas_interrupt(int irq, void *d)
1524 struct comedi_device *dev = (struct comedi_device *)d;
1525 struct comedi_subdevice *s = dev->read_subdev;
1526 struct comedi_async *async;
1527 int status, s5933_status;
1528 int half_fifo = thisboard->fifo_size / 2;
1529 unsigned int num_samples, i;
1530 static const int timeout = 10000;
1531 unsigned long flags;
1533 if (dev->attached == 0)
1539 s5933_status = inl(devpriv->s5933_config + AMCC_OP_REG_INTCSR);
1540 #ifdef CB_PCIDAS_DEBUG
1541 printk("intcsr 0x%x\n", s5933_status);
1542 printk("mbef 0x%x\n", inl(devpriv->s5933_config + AMCC_OP_REG_MBEF));
1545 if ((INTCSR_INTR_ASSERTED & s5933_status) == 0)
1548 /* make sure mailbox 4 is empty */
1549 inl_p(devpriv->s5933_config + AMCC_OP_REG_IMB4);
1550 /* clear interrupt on amcc s5933 */
1551 outl(devpriv->s5933_intcsr_bits | INTCSR_INBOX_INTR_STATUS,
1552 devpriv->s5933_config + AMCC_OP_REG_INTCSR);
1554 status = inw(devpriv->control_status + INT_ADCFIFO);
1555 #ifdef CB_PCIDAS_DEBUG
1556 if ((status & (INT | EOAI | LADFUL | DAHFI | DAEMI)) == 0)
1557 comedi_error(dev, "spurious interrupt");
1560 /* check for analog output interrupt */
1561 if (status & (DAHFI | DAEMI))
1562 handle_ao_interrupt(dev, status);
1563 /* check for analog input interrupts */
1564 /* if fifo half-full */
1565 if (status & ADHFI) {
1567 num_samples = half_fifo;
1568 if (async->cmd.stop_src == TRIG_COUNT &&
1569 num_samples > devpriv->count) {
1570 num_samples = devpriv->count;
1572 insw(devpriv->adc_fifo + ADCDATA, devpriv->ai_buffer,
1574 cfc_write_array_to_buffer(s, devpriv->ai_buffer,
1575 num_samples * sizeof(short));
1576 devpriv->count -= num_samples;
1577 if (async->cmd.stop_src == TRIG_COUNT && devpriv->count == 0) {
1578 async->events |= COMEDI_CB_EOA;
1579 cb_pcidas_cancel(dev, s);
1581 /* clear half-full interrupt latch */
1582 spin_lock_irqsave(&dev->spinlock, flags);
1583 outw(devpriv->adc_fifo_bits | INT,
1584 devpriv->control_status + INT_ADCFIFO);
1585 spin_unlock_irqrestore(&dev->spinlock, flags);
1586 /* else if fifo not empty */
1587 } else if (status & (ADNEI | EOBI)) {
1588 for (i = 0; i < timeout; i++) {
1589 /* break if fifo is empty */
1590 if ((ADNE & inw(devpriv->control_status +
1593 cfc_write_to_buffer(s, inw(devpriv->adc_fifo));
1594 if (async->cmd.stop_src == TRIG_COUNT && --devpriv->count == 0) { /* end of acquisition */
1595 cb_pcidas_cancel(dev, s);
1596 async->events |= COMEDI_CB_EOA;
1600 /* clear not-empty interrupt latch */
1601 spin_lock_irqsave(&dev->spinlock, flags);
1602 outw(devpriv->adc_fifo_bits | INT,
1603 devpriv->control_status + INT_ADCFIFO);
1604 spin_unlock_irqrestore(&dev->spinlock, flags);
1605 } else if (status & EOAI) {
1607 "bug! encountered end of aquisition interrupt?");
1608 /* clear EOA interrupt latch */
1609 spin_lock_irqsave(&dev->spinlock, flags);
1610 outw(devpriv->adc_fifo_bits | EOAI,
1611 devpriv->control_status + INT_ADCFIFO);
1612 spin_unlock_irqrestore(&dev->spinlock, flags);
1614 /* check for fifo overflow */
1615 if (status & LADFUL) {
1616 comedi_error(dev, "fifo overflow");
1617 /* clear overflow interrupt latch */
1618 spin_lock_irqsave(&dev->spinlock, flags);
1619 outw(devpriv->adc_fifo_bits | LADFUL,
1620 devpriv->control_status + INT_ADCFIFO);
1621 spin_unlock_irqrestore(&dev->spinlock, flags);
1622 cb_pcidas_cancel(dev, s);
1623 async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
1626 comedi_event(dev, s);
1631 static void handle_ao_interrupt(struct comedi_device *dev, unsigned int status)
1633 struct comedi_subdevice *s = dev->write_subdev;
1634 struct comedi_async *async = s->async;
1635 struct comedi_cmd *cmd = &async->cmd;
1636 unsigned int half_fifo = thisboard->fifo_size / 2;
1637 unsigned int num_points;
1638 unsigned long flags;
1642 if (status & DAEMI) {
1643 /* clear dac empty interrupt latch */
1644 spin_lock_irqsave(&dev->spinlock, flags);
1645 outw(devpriv->adc_fifo_bits | DAEMI,
1646 devpriv->control_status + INT_ADCFIFO);
1647 spin_unlock_irqrestore(&dev->spinlock, flags);
1648 if (inw(devpriv->ao_registers + DAC_CSR) & DAC_EMPTY) {
1649 if (cmd->stop_src == TRIG_NONE ||
1650 (cmd->stop_src == TRIG_COUNT
1651 && devpriv->ao_count)) {
1652 comedi_error(dev, "dac fifo underflow");
1653 cb_pcidas_ao_cancel(dev, s);
1654 async->events |= COMEDI_CB_ERROR;
1656 async->events |= COMEDI_CB_EOA;
1658 } else if (status & DAHFI) {
1659 unsigned int num_bytes;
1661 /* figure out how many points we are writing to fifo */
1662 num_points = half_fifo;
1663 if (cmd->stop_src == TRIG_COUNT &&
1664 devpriv->ao_count < num_points)
1665 num_points = devpriv->ao_count;
1667 cfc_read_array_from_buffer(s, devpriv->ao_buffer,
1668 num_points * sizeof(short));
1669 num_points = num_bytes / sizeof(short);
1671 if (async->cmd.stop_src == TRIG_COUNT)
1672 devpriv->ao_count -= num_points;
1673 /* write data to board's fifo */
1674 outsw(devpriv->ao_registers + DACDATA, devpriv->ao_buffer,
1676 /* clear half-full interrupt latch */
1677 spin_lock_irqsave(&dev->spinlock, flags);
1678 outw(devpriv->adc_fifo_bits | DAHFI,
1679 devpriv->control_status + INT_ADCFIFO);
1680 spin_unlock_irqrestore(&dev->spinlock, flags);
1683 comedi_event(dev, s);
1686 /* cancel analog input command */
1687 static int cb_pcidas_cancel(struct comedi_device *dev,
1688 struct comedi_subdevice *s)
1690 unsigned long flags;
1692 spin_lock_irqsave(&dev->spinlock, flags);
1693 /* disable interrupts */
1694 devpriv->adc_fifo_bits &= ~INTE & ~EOAIE;
1695 outw(devpriv->adc_fifo_bits, devpriv->control_status + INT_ADCFIFO);
1696 spin_unlock_irqrestore(&dev->spinlock, flags);
1698 /* disable start trigger source and burst mode */
1699 outw(0, devpriv->control_status + TRIG_CONTSTAT);
1700 /* software pacer source */
1701 outw(0, devpriv->control_status + ADCMUX_CONT);
1706 /* cancel analog output command */
1707 static int cb_pcidas_ao_cancel(struct comedi_device *dev,
1708 struct comedi_subdevice *s)
1710 unsigned long flags;
1712 spin_lock_irqsave(&dev->spinlock, flags);
1713 /* disable interrupts */
1714 devpriv->adc_fifo_bits &= ~DAHFIE & ~DAEMIE;
1715 outw(devpriv->adc_fifo_bits, devpriv->control_status + INT_ADCFIFO);
1717 /* disable output */
1718 devpriv->ao_control_bits &= ~DACEN & ~DAC_PACER_MASK;
1719 outw(devpriv->ao_control_bits, devpriv->control_status + DAC_CSR);
1720 spin_unlock_irqrestore(&dev->spinlock, flags);
1725 static void cb_pcidas_load_counters(struct comedi_device *dev, unsigned int *ns,
1728 i8253_cascade_ns_to_timer_2div(TIMER_BASE, &(devpriv->divisor1),
1729 &(devpriv->divisor2), ns,
1730 rounding_flags & TRIG_ROUND_MASK);
1732 /* Write the values of ctr1 and ctr2 into counters 1 and 2 */
1733 i8254_load(devpriv->pacer_counter_dio + ADC8254, 0, 1,
1734 devpriv->divisor1, 2);
1735 i8254_load(devpriv->pacer_counter_dio + ADC8254, 0, 2,
1736 devpriv->divisor2, 2);
1739 static void write_calibration_bitstream(struct comedi_device *dev,
1740 unsigned int register_bits,
1741 unsigned int bitstream,
1742 unsigned int bitstream_length)
1744 static const int write_delay = 1;
1747 for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
1748 if (bitstream & bit)
1749 register_bits |= SERIAL_DATA_IN_BIT;
1751 register_bits &= ~SERIAL_DATA_IN_BIT;
1752 udelay(write_delay);
1753 outw(register_bits, devpriv->control_status + CALIBRATION_REG);
1757 static int caldac_8800_write(struct comedi_device *dev, unsigned int address,
1760 static const int num_caldac_channels = 8;
1761 static const int bitstream_length = 11;
1762 unsigned int bitstream = ((address & 0x7) << 8) | value;
1763 static const int caldac_8800_udelay = 1;
1765 if (address >= num_caldac_channels) {
1766 comedi_error(dev, "illegal caldac channel");
1770 if (value == devpriv->caldac_value[address])
1773 devpriv->caldac_value[address] = value;
1775 write_calibration_bitstream(dev, cal_enable_bits(dev), bitstream,
1778 udelay(caldac_8800_udelay);
1779 outw(cal_enable_bits(dev) | SELECT_8800_BIT,
1780 devpriv->control_status + CALIBRATION_REG);
1781 udelay(caldac_8800_udelay);
1782 outw(cal_enable_bits(dev), devpriv->control_status + CALIBRATION_REG);
1787 static int trimpot_7376_write(struct comedi_device *dev, uint8_t value)
1789 static const int bitstream_length = 7;
1790 unsigned int bitstream = value & 0x7f;
1791 unsigned int register_bits;
1792 static const int ad7376_udelay = 1;
1794 register_bits = cal_enable_bits(dev) | SELECT_TRIMPOT_BIT;
1795 udelay(ad7376_udelay);
1796 outw(register_bits, devpriv->control_status + CALIBRATION_REG);
1798 write_calibration_bitstream(dev, register_bits, bitstream,
1801 udelay(ad7376_udelay);
1802 outw(cal_enable_bits(dev), devpriv->control_status + CALIBRATION_REG);
1809 * ch 1 : adc postgain offset */
1810 static int trimpot_8402_write(struct comedi_device *dev, unsigned int channel,
1813 static const int bitstream_length = 10;
1814 unsigned int bitstream = ((channel & 0x3) << 8) | (value & 0xff);
1815 unsigned int register_bits;
1816 static const int ad8402_udelay = 1;
1818 register_bits = cal_enable_bits(dev) | SELECT_TRIMPOT_BIT;
1819 udelay(ad8402_udelay);
1820 outw(register_bits, devpriv->control_status + CALIBRATION_REG);
1822 write_calibration_bitstream(dev, register_bits, bitstream,
1825 udelay(ad8402_udelay);
1826 outw(cal_enable_bits(dev), devpriv->control_status + CALIBRATION_REG);
1831 static int wait_for_nvram_ready(unsigned long s5933_base_addr)
1833 static const int timeout = 1000;
1836 for (i = 0; i < timeout; i++) {
1837 if ((inb(s5933_base_addr +
1838 AMCC_OP_REG_MCSR_NVCMD) & MCSR_NV_BUSY)
1846 static int nvram_read(struct comedi_device *dev, unsigned int address,
1849 unsigned long iobase = devpriv->s5933_config;
1851 if (wait_for_nvram_ready(iobase) < 0)
1854 outb(MCSR_NV_ENABLE | MCSR_NV_LOAD_LOW_ADDR,
1855 iobase + AMCC_OP_REG_MCSR_NVCMD);
1856 outb(address & 0xff, iobase + AMCC_OP_REG_MCSR_NVDATA);
1857 outb(MCSR_NV_ENABLE | MCSR_NV_LOAD_HIGH_ADDR,
1858 iobase + AMCC_OP_REG_MCSR_NVCMD);
1859 outb((address >> 8) & 0xff, iobase + AMCC_OP_REG_MCSR_NVDATA);
1860 outb(MCSR_NV_ENABLE | MCSR_NV_READ, iobase + AMCC_OP_REG_MCSR_NVCMD);
1862 if (wait_for_nvram_ready(iobase) < 0)
1865 *data = inb(iobase + AMCC_OP_REG_MCSR_NVDATA);
1871 * A convenient macro that defines init_module() and cleanup_module(),
1874 COMEDI_PCI_INITCLEANUP(driver_cb_pcidas, cb_pcidas_pci_table);