2 comedi/drivers/ni_labpc.c
3 Driver for National Instruments Lab-PC series boards and compatibles
4 Copyright (C) 2001, 2002, 2003 Frank Mori Hess <fmhess@users.sourceforge.net>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 ************************************************************************
24 Description: National Instruments Lab-PC (& compatibles)
25 Author: Frank Mori Hess <fmhess@users.sourceforge.net>
26 Devices: [National Instruments] Lab-PC-1200 (labpc-1200),
27 Lab-PC-1200AI (labpc-1200ai), Lab-PC+ (lab-pc+), PCI-1200 (ni_labpc)
30 Tested with lab-pc-1200. For the older Lab-PC+, not all input ranges
31 and analog references will work, the available ranges/arefs will
32 depend on how you have configured the jumpers on your board
33 (see your owner's manual).
35 Kernel-level ISA plug-and-play support for the lab-pc-1200
37 yet been added to the driver, mainly due to the fact that
38 I don't know the device id numbers. If you have one
40 please file a bug report at https://bugs.comedi.org/
41 so I can get the necessary information from you.
43 The 1200 series boards have onboard calibration dacs for correcting
44 analog input/output offsets and gains. The proper settings for these
45 caldacs are stored on the board's eeprom. To read the caldac values
46 from the eeprom and store them into a file that can be then be used by
47 comedilib, use the comedi_calibrate program.
49 Configuration options - ISA boards:
50 [0] - I/O port base address
51 [1] - IRQ (optional, required for timed or externally triggered conversions)
52 [2] - DMA channel (optional)
54 Configuration options - PCI boards:
58 The Lab-pc+ has quirky chanlist requirements
59 when scanning multiple channels. Multiple channel scan
60 sequence must start at highest channel, then decrement down to
61 channel 0. The rest of the cards can scan down like lab-pc+ or scan
62 up from channel zero. Chanlists consisting of all one channel
63 are also legal, and allow you to pace conversions in bursts.
70 341309a (labpc-1200 register manual)
77 /* #define LABPC_DEBUG enable debugging messages */
79 #include <linux/interrupt.h>
80 #include "../comedidev.h"
82 #include <linux/delay.h>
88 #include "comedi_fc.h"
91 #define DRV_NAME "ni_labpc"
93 #define LABPC_SIZE 32 /* size of io region used by board */
94 #define LABPC_TIMER_BASE 500 /* 2 MHz master clock */
96 /* Registers for the lab-pc+ */
98 /* write-only registers */
99 #define COMMAND1_REG 0x0
100 #define ADC_GAIN_MASK (0x7 << 4)
101 #define ADC_CHAN_BITS(x) ((x) & 0x7)
102 #define ADC_SCAN_EN_BIT 0x80 /* enables multi channel scans */
103 #define COMMAND2_REG 0x1
104 #define PRETRIG_BIT 0x1 /* enable pretriggering (used in conjunction with SWTRIG) */
105 #define HWTRIG_BIT 0x2 /* enable paced conversions on external trigger */
106 #define SWTRIG_BIT 0x4 /* enable paced conversions */
107 #define CASCADE_BIT 0x8 /* use two cascaded counters for pacing */
108 #define DAC_PACED_BIT(channel) (0x40 << ((channel) & 0x1))
109 #define COMMAND3_REG 0x2
110 #define DMA_EN_BIT 0x1 /* enable dma transfers */
111 #define DIO_INTR_EN_BIT 0x2 /* enable interrupts for 8255 */
112 #define DMATC_INTR_EN_BIT 0x4 /* enable dma terminal count interrupt */
113 #define TIMER_INTR_EN_BIT 0x8 /* enable timer interrupt */
114 #define ERR_INTR_EN_BIT 0x10 /* enable error interrupt */
115 #define ADC_FNE_INTR_EN_BIT 0x20 /* enable fifo not empty interrupt */
116 #define ADC_CONVERT_REG 0x3
117 #define DAC_LSB_REG(channel) (0x4 + 2 * ((channel) & 0x1))
118 #define DAC_MSB_REG(channel) (0x5 + 2 * ((channel) & 0x1))
119 #define ADC_CLEAR_REG 0x8
120 #define DMATC_CLEAR_REG 0xa
121 #define TIMER_CLEAR_REG 0xc
122 #define COMMAND6_REG 0xe /* 1200 boards only */
123 #define ADC_COMMON_BIT 0x1 /* select ground or common-mode reference */
124 #define ADC_UNIP_BIT 0x2 /* adc unipolar */
125 #define DAC_UNIP_BIT(channel) (0x4 << ((channel) & 0x1)) /* dac unipolar */
126 #define ADC_FHF_INTR_EN_BIT 0x20 /* enable fifo half full interrupt */
127 #define A1_INTR_EN_BIT 0x40 /* enable interrupt on end of hardware count */
128 #define ADC_SCAN_UP_BIT 0x80 /* scan up from channel zero instead of down to zero */
129 #define COMMAND4_REG 0xf
130 #define INTERVAL_SCAN_EN_BIT 0x1 /* enables 'interval' scanning */
131 #define EXT_SCAN_EN_BIT 0x2 /* enables external signal on counter b1 output to trigger scan */
132 #define EXT_CONVERT_OUT_BIT 0x4 /* chooses direction (output or input) for EXTCONV* line */
133 #define ADC_DIFF_BIT 0x8 /* chooses differential inputs for adc (in conjunction with board jumper) */
134 #define EXT_CONVERT_DISABLE_BIT 0x10
135 #define COMMAND5_REG 0x1c /* 1200 boards only, calibration stuff */
136 #define EEPROM_WRITE_UNPROTECT_BIT 0x4 /* enable eeprom for write */
137 #define DITHER_EN_BIT 0x8 /* enable dithering */
138 #define CALDAC_LOAD_BIT 0x10 /* load calibration dac */
139 #define SCLOCK_BIT 0x20 /* serial clock - rising edge writes, falling edge reads */
140 #define SDATA_BIT 0x40 /* serial data bit for writing to eeprom or calibration dacs */
141 #define EEPROM_EN_BIT 0x80 /* enable eeprom for read/write */
142 #define INTERVAL_COUNT_REG 0x1e
143 #define INTERVAL_LOAD_REG 0x1f
144 #define INTERVAL_LOAD_BITS 0x1
146 /* read-only registers */
147 #define STATUS1_REG 0x0
148 #define DATA_AVAIL_BIT 0x1 /* data is available in fifo */
149 #define OVERRUN_BIT 0x2 /* overrun has occurred */
150 #define OVERFLOW_BIT 0x4 /* fifo overflow */
151 #define TIMER_BIT 0x8 /* timer interrupt has occured */
152 #define DMATC_BIT 0x10 /* dma terminal count has occured */
153 #define EXT_TRIG_BIT 0x40 /* external trigger has occured */
154 #define STATUS2_REG 0x1d /* 1200 boards only */
155 #define EEPROM_OUT_BIT 0x1 /* programmable eeprom serial output */
156 #define A1_TC_BIT 0x2 /* counter A1 terminal count */
157 #define FNHF_BIT 0x4 /* fifo not half full */
158 #define ADC_FIFO_REG 0xa
160 #define DIO_BASE_REG 0x10
161 #define COUNTER_A_BASE_REG 0x14
162 #define COUNTER_A_CONTROL_REG (COUNTER_A_BASE_REG + 0x3)
163 #define INIT_A0_BITS 0x14 /* check modes put conversion pacer output in harmless state (a0 mode 2) */
164 #define INIT_A1_BITS 0x70 /* put hardware conversion counter output in harmless state (a1 mode 0) */
165 #define COUNTER_B_BASE_REG 0x18
167 static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it);
168 static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
169 static irqreturn_t labpc_interrupt(int irq, void *d);
170 static int labpc_drain_fifo(struct comedi_device *dev);
171 static void labpc_drain_dma(struct comedi_device *dev);
172 static void handle_isa_dma(struct comedi_device *dev);
173 static void labpc_drain_dregs(struct comedi_device *dev);
174 static int labpc_ai_cmdtest(struct comedi_device *dev,
175 struct comedi_subdevice *s, struct comedi_cmd *cmd);
176 static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s);
177 static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
178 struct comedi_insn *insn, unsigned int *data);
179 static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
180 struct comedi_insn *insn, unsigned int *data);
181 static int labpc_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
182 struct comedi_insn *insn, unsigned int *data);
183 static int labpc_calib_read_insn(struct comedi_device *dev,
184 struct comedi_subdevice *s,
185 struct comedi_insn *insn, unsigned int *data);
186 static int labpc_calib_write_insn(struct comedi_device *dev,
187 struct comedi_subdevice *s,
188 struct comedi_insn *insn, unsigned int *data);
189 static int labpc_eeprom_read_insn(struct comedi_device *dev,
190 struct comedi_subdevice *s,
191 struct comedi_insn *insn, unsigned int *data);
192 static int labpc_eeprom_write_insn(struct comedi_device *dev,
193 struct comedi_subdevice *s,
194 struct comedi_insn *insn,
196 static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd);
197 static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
198 #ifdef CONFIG_COMEDI_PCI
199 static int labpc_find_device(struct comedi_device *dev, int bus, int slot);
201 static int labpc_dio_mem_callback(int dir, int port, int data,
203 static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
204 unsigned int num_bits);
205 static unsigned int labpc_serial_in(struct comedi_device *dev);
206 static unsigned int labpc_eeprom_read(struct comedi_device *dev,
207 unsigned int address);
208 static unsigned int labpc_eeprom_read_status(struct comedi_device *dev);
209 static unsigned int labpc_eeprom_write(struct comedi_device *dev,
210 unsigned int address,
212 static void write_caldac(struct comedi_device *dev, unsigned int channel,
217 MODE_SINGLE_CHAN_INTERVAL,
222 /* analog input ranges */
223 #define NUM_LABPC_PLUS_AI_RANGES 16
224 /* indicates unipolar ranges */
225 static const int labpc_plus_is_unipolar[NUM_LABPC_PLUS_AI_RANGES] = {
244 /* map range index to gain bits */
245 static const int labpc_plus_ai_gain_bits[NUM_LABPC_PLUS_AI_RANGES] = {
264 static const struct comedi_lrange range_labpc_plus_ai = {
265 NUM_LABPC_PLUS_AI_RANGES,
286 #define NUM_LABPC_1200_AI_RANGES 14
287 /* indicates unipolar ranges */
288 const int labpc_1200_is_unipolar[NUM_LABPC_1200_AI_RANGES] = {
305 /* map range index to gain bits */
306 const int labpc_1200_ai_gain_bits[NUM_LABPC_1200_AI_RANGES] = {
323 const struct comedi_lrange range_labpc_1200_ai = {
324 NUM_LABPC_1200_AI_RANGES,
343 /* analog output ranges */
344 #define AO_RANGE_IS_UNIPOLAR 0x1
345 static const struct comedi_lrange range_labpc_ao = {
353 /* functions that do inb/outb and readb/writeb so we can use
354 * function pointers to decide which to use */
355 static inline unsigned int labpc_inb(unsigned long address)
360 static inline void labpc_outb(unsigned int byte, unsigned long address)
365 static inline unsigned int labpc_readb(unsigned long address)
367 return readb((void *)address);
370 static inline void labpc_writeb(unsigned int byte, unsigned long address)
372 writeb(byte, (void *)address);
375 static const struct labpc_board_struct labpc_boards[] = {
377 .name = "lab-pc-1200",
379 .bustype = isa_bustype,
380 .register_layout = labpc_1200_layout,
382 .ai_range_table = &range_labpc_1200_ai,
383 .ai_range_code = labpc_1200_ai_gain_bits,
384 .ai_range_is_unipolar = labpc_1200_is_unipolar,
386 .memory_mapped_io = 0,
389 .name = "lab-pc-1200ai",
391 .bustype = isa_bustype,
392 .register_layout = labpc_1200_layout,
394 .ai_range_table = &range_labpc_1200_ai,
395 .ai_range_code = labpc_1200_ai_gain_bits,
396 .ai_range_is_unipolar = labpc_1200_is_unipolar,
398 .memory_mapped_io = 0,
403 .bustype = isa_bustype,
404 .register_layout = labpc_plus_layout,
406 .ai_range_table = &range_labpc_plus_ai,
407 .ai_range_code = labpc_plus_ai_gain_bits,
408 .ai_range_is_unipolar = labpc_plus_is_unipolar,
410 .memory_mapped_io = 0,
412 #ifdef CONFIG_COMEDI_PCI
417 .bustype = pci_bustype,
418 .register_layout = labpc_1200_layout,
420 .ai_range_table = &range_labpc_1200_ai,
421 .ai_range_code = labpc_1200_ai_gain_bits,
422 .ai_range_is_unipolar = labpc_1200_is_unipolar,
424 .memory_mapped_io = 1,
426 /* dummy entry so pci board works when comedi_config is passed driver name */
429 .bustype = pci_bustype,
435 * Useful for shorthand access to the particular board structure
437 #define thisboard ((struct labpc_board_struct *)dev->board_ptr)
439 static const int dma_buffer_size = 0xff00; /* size in bytes of dma buffer */
440 static const int sample_size = 2; /* 2 bytes per sample */
442 #define devpriv ((struct labpc_private *)dev->private)
444 static struct comedi_driver driver_labpc = {
445 .driver_name = DRV_NAME,
446 .module = THIS_MODULE,
447 .attach = labpc_attach,
448 .detach = labpc_common_detach,
449 .num_names = ARRAY_SIZE(labpc_boards),
450 .board_name = &labpc_boards[0].name,
451 .offset = sizeof(struct labpc_board_struct),
454 #ifdef CONFIG_COMEDI_PCI
455 static DEFINE_PCI_DEVICE_TABLE(labpc_pci_table) = {
457 PCI_VENDOR_ID_NATINST, 0x161, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {
461 MODULE_DEVICE_TABLE(pci, labpc_pci_table);
462 #endif /* CONFIG_COMEDI_PCI */
464 static inline int labpc_counter_load(struct comedi_device *dev,
465 unsigned long base_address,
466 unsigned int counter_number,
467 unsigned int count, unsigned int mode)
469 if (thisboard->memory_mapped_io)
470 return i8254_mm_load((void *)base_address, 0, counter_number,
473 return i8254_load(base_address, 0, counter_number, count, mode);
476 int labpc_common_attach(struct comedi_device *dev, unsigned long iobase,
477 unsigned int irq, unsigned int dma_chan)
479 struct comedi_subdevice *s;
481 unsigned long dma_flags, isr_flags;
484 printk("comedi%d: ni_labpc: %s, io 0x%lx", dev->minor, thisboard->name,
487 printk(", irq %u", irq);
490 printk(", dma %u", dma_chan);
495 printk("io base address is zero!\n");
498 /* request io regions for isa boards */
499 if (thisboard->bustype == isa_bustype) {
500 /* check if io addresses are available */
501 if (!request_region(iobase, LABPC_SIZE,
502 driver_labpc.driver_name)) {
503 printk("I/O port conflict\n");
507 dev->iobase = iobase;
509 if (thisboard->memory_mapped_io) {
510 devpriv->read_byte = labpc_readb;
511 devpriv->write_byte = labpc_writeb;
513 devpriv->read_byte = labpc_inb;
514 devpriv->write_byte = labpc_outb;
516 /* initialize board's command registers */
517 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
518 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
519 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
520 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
521 if (thisboard->register_layout == labpc_1200_layout) {
522 devpriv->write_byte(devpriv->command5_bits,
523 dev->iobase + COMMAND5_REG);
524 devpriv->write_byte(devpriv->command6_bits,
525 dev->iobase + COMMAND6_REG);
531 if (thisboard->bustype == pci_bustype
532 || thisboard->bustype == pcmcia_bustype)
533 isr_flags |= IRQF_SHARED;
534 if (request_irq(irq, labpc_interrupt, isr_flags,
535 driver_labpc.driver_name, dev)) {
536 printk("unable to allocate irq %u\n", irq);
542 /* grab dma channel */
544 printk(" invalid dma channel %u\n", dma_chan);
546 } else if (dma_chan) {
547 /* allocate dma buffer */
548 devpriv->dma_buffer =
549 kmalloc(dma_buffer_size, GFP_KERNEL | GFP_DMA);
550 if (devpriv->dma_buffer == NULL) {
551 printk(" failed to allocate dma buffer\n");
554 if (request_dma(dma_chan, driver_labpc.driver_name)) {
555 printk(" failed to allocate dma channel %u\n",
559 devpriv->dma_chan = dma_chan;
560 dma_flags = claim_dma_lock();
561 disable_dma(devpriv->dma_chan);
562 set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
563 release_dma_lock(dma_flags);
566 dev->board_name = thisboard->name;
568 if (alloc_subdevices(dev, 5) < 0)
571 /* analog input subdevice */
572 s = dev->subdevices + 0;
573 dev->read_subdev = s;
574 s->type = COMEDI_SUBD_AI;
576 SDF_READABLE | SDF_GROUND | SDF_COMMON | SDF_DIFF | SDF_CMD_READ;
579 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
580 s->range_table = thisboard->ai_range_table;
581 s->do_cmd = labpc_ai_cmd;
582 s->do_cmdtest = labpc_ai_cmdtest;
583 s->insn_read = labpc_ai_rinsn;
584 s->cancel = labpc_cancel;
587 s = dev->subdevices + 1;
588 if (thisboard->has_ao) {
589 /* Could provide command support, except it only has a one sample
590 * hardware buffer for analog output and no underrun flag. */
591 s->type = COMEDI_SUBD_AO;
592 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_GROUND;
593 s->n_chan = NUM_AO_CHAN;
594 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
595 s->range_table = &range_labpc_ao;
596 s->insn_read = labpc_ao_rinsn;
597 s->insn_write = labpc_ao_winsn;
598 /* initialize analog outputs to a known value */
599 for (i = 0; i < s->n_chan; i++) {
600 devpriv->ao_value[i] = s->maxdata / 2;
601 lsb = devpriv->ao_value[i] & 0xff;
602 msb = (devpriv->ao_value[i] >> 8) & 0xff;
603 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(i));
604 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(i));
607 s->type = COMEDI_SUBD_UNUSED;
611 s = dev->subdevices + 2;
612 /* if board uses io memory we have to give a custom callback function to the 8255 driver */
613 if (thisboard->memory_mapped_io)
614 subdev_8255_init(dev, s, labpc_dio_mem_callback,
615 (unsigned long)(dev->iobase + DIO_BASE_REG));
617 subdev_8255_init(dev, s, NULL, dev->iobase + DIO_BASE_REG);
619 /* calibration subdevices for boards that have one */
620 s = dev->subdevices + 3;
621 if (thisboard->register_layout == labpc_1200_layout) {
622 s->type = COMEDI_SUBD_CALIB;
623 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
626 s->insn_read = labpc_calib_read_insn;
627 s->insn_write = labpc_calib_write_insn;
629 for (i = 0; i < s->n_chan; i++)
630 write_caldac(dev, i, s->maxdata / 2);
632 s->type = COMEDI_SUBD_UNUSED;
635 s = dev->subdevices + 4;
636 if (thisboard->register_layout == labpc_1200_layout) {
637 s->type = COMEDI_SUBD_MEMORY;
638 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
639 s->n_chan = EEPROM_SIZE;
641 s->insn_read = labpc_eeprom_read_insn;
642 s->insn_write = labpc_eeprom_write_insn;
644 for (i = 0; i < EEPROM_SIZE; i++) {
645 devpriv->eeprom_data[i] = labpc_eeprom_read(dev, i);
649 for (i = 0; i < EEPROM_SIZE; i++) {
650 printk(" %i:0x%x ", i, devpriv->eeprom_data[i]);
655 s->type = COMEDI_SUBD_UNUSED;
660 static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
662 unsigned long iobase = 0;
663 unsigned int irq = 0;
664 unsigned int dma_chan = 0;
665 #ifdef CONFIG_COMEDI_PCI
669 /* allocate and initialize dev->private */
670 if (alloc_private(dev, sizeof(struct labpc_private)) < 0)
673 /* get base address, irq etc. based on bustype */
674 switch (thisboard->bustype) {
676 iobase = it->options[0];
677 irq = it->options[1];
678 dma_chan = it->options[2];
681 #ifdef CONFIG_COMEDI_PCI
682 retval = labpc_find_device(dev, it->options[0], it->options[1]);
686 retval = mite_setup(devpriv->mite);
689 iobase = (unsigned long)devpriv->mite->daq_io_addr;
690 irq = mite_irq(devpriv->mite);
692 printk(" this driver has not been built with PCI support.\n");
698 (" this driver does not support pcmcia cards, use ni_labpc_cs.o\n");
702 printk("bug! couldn't determine board type\n");
707 return labpc_common_attach(dev, iobase, irq, dma_chan);
710 /* adapted from ni_pcimio for finding mite based boards (pc-1200) */
711 #ifdef CONFIG_COMEDI_PCI
712 static int labpc_find_device(struct comedi_device *dev, int bus, int slot)
714 struct mite_struct *mite;
716 for (mite = mite_devices; mite; mite = mite->next) {
719 /* if bus/slot are specified then make sure we have the right bus/slot */
721 if (bus != mite->pcidev->bus->number
722 || slot != PCI_SLOT(mite->pcidev->devfn))
725 for (i = 0; i < driver_labpc.num_names; i++) {
726 if (labpc_boards[i].bustype != pci_bustype)
728 if (mite_device_id(mite) == labpc_boards[i].device_id) {
729 devpriv->mite = mite;
730 /* fixup board pointer, in case we were using the dummy "ni_labpc" entry */
731 dev->board_ptr = &labpc_boards[i];
736 printk("no device found\n");
742 int labpc_common_detach(struct comedi_device *dev)
744 printk("comedi%d: ni_labpc: detach\n", dev->minor);
747 subdev_8255_cleanup(dev, dev->subdevices + 2);
749 /* only free stuff if it has been allocated by _attach */
750 if (devpriv->dma_buffer)
751 kfree(devpriv->dma_buffer);
752 if (devpriv->dma_chan)
753 free_dma(devpriv->dma_chan);
755 free_irq(dev->irq, dev);
756 if (thisboard->bustype == isa_bustype && dev->iobase)
757 release_region(dev->iobase, LABPC_SIZE);
758 #ifdef CONFIG_COMEDI_PCI
760 mite_unsetup(devpriv->mite);
766 static void labpc_clear_adc_fifo(const struct comedi_device *dev)
768 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
769 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
770 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
773 static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
777 spin_lock_irqsave(&dev->spinlock, flags);
778 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
779 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
780 spin_unlock_irqrestore(&dev->spinlock, flags);
782 devpriv->command3_bits = 0;
783 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
788 static enum scan_mode labpc_ai_scan_mode(const struct comedi_cmd *cmd)
790 if (cmd->chanlist_len == 1)
791 return MODE_SINGLE_CHAN;
793 /* chanlist may be NULL during cmdtest. */
794 if (cmd->chanlist == NULL)
795 return MODE_MULT_CHAN_UP;
797 if (CR_CHAN(cmd->chanlist[0]) == CR_CHAN(cmd->chanlist[1]))
798 return MODE_SINGLE_CHAN_INTERVAL;
800 if (CR_CHAN(cmd->chanlist[0]) < CR_CHAN(cmd->chanlist[1]))
801 return MODE_MULT_CHAN_UP;
803 if (CR_CHAN(cmd->chanlist[0]) > CR_CHAN(cmd->chanlist[1]))
804 return MODE_MULT_CHAN_DOWN;
806 printk("ni_labpc: bug! this should never happen\n");
811 static int labpc_ai_chanlist_invalid(const struct comedi_device *dev,
812 const struct comedi_cmd *cmd)
814 int mode, channel, range, aref, i;
816 if (cmd->chanlist == NULL)
819 mode = labpc_ai_scan_mode(cmd);
821 if (mode == MODE_SINGLE_CHAN)
824 if (mode == MODE_SINGLE_CHAN_INTERVAL) {
825 if (cmd->chanlist_len > 0xff) {
827 "ni_labpc: chanlist too long for single channel interval mode\n");
832 channel = CR_CHAN(cmd->chanlist[0]);
833 range = CR_RANGE(cmd->chanlist[0]);
834 aref = CR_AREF(cmd->chanlist[0]);
836 for (i = 0; i < cmd->chanlist_len; i++) {
839 case MODE_SINGLE_CHAN_INTERVAL:
840 if (CR_CHAN(cmd->chanlist[i]) != channel) {
842 "channel scanning order specified in chanlist is not supported by hardware.\n");
846 case MODE_MULT_CHAN_UP:
847 if (CR_CHAN(cmd->chanlist[i]) != i) {
849 "channel scanning order specified in chanlist is not supported by hardware.\n");
853 case MODE_MULT_CHAN_DOWN:
854 if (CR_CHAN(cmd->chanlist[i]) !=
855 cmd->chanlist_len - i - 1) {
857 "channel scanning order specified in chanlist is not supported by hardware.\n");
862 printk("ni_labpc: bug! in chanlist check\n");
867 if (CR_RANGE(cmd->chanlist[i]) != range) {
869 "entries in chanlist must all have the same range\n");
873 if (CR_AREF(cmd->chanlist[i]) != aref) {
875 "entries in chanlist must all have the same reference\n");
883 static int labpc_use_continuous_mode(const struct comedi_cmd *cmd)
885 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN)
888 if (cmd->scan_begin_src == TRIG_FOLLOW)
894 static unsigned int labpc_ai_convert_period(const struct comedi_cmd *cmd)
896 if (cmd->convert_src != TRIG_TIMER)
899 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
900 cmd->scan_begin_src == TRIG_TIMER)
901 return cmd->scan_begin_arg;
903 return cmd->convert_arg;
906 static void labpc_set_ai_convert_period(struct comedi_cmd *cmd, unsigned int ns)
908 if (cmd->convert_src != TRIG_TIMER)
911 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
912 cmd->scan_begin_src == TRIG_TIMER) {
913 cmd->scan_begin_arg = ns;
914 if (cmd->convert_arg > cmd->scan_begin_arg)
915 cmd->convert_arg = cmd->scan_begin_arg;
917 cmd->convert_arg = ns;
920 static unsigned int labpc_ai_scan_period(const struct comedi_cmd *cmd)
922 if (cmd->scan_begin_src != TRIG_TIMER)
925 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
926 cmd->convert_src == TRIG_TIMER)
929 return cmd->scan_begin_arg;
932 static void labpc_set_ai_scan_period(struct comedi_cmd *cmd, unsigned int ns)
934 if (cmd->scan_begin_src != TRIG_TIMER)
937 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
938 cmd->convert_src == TRIG_TIMER)
941 cmd->scan_begin_arg = ns;
944 static int labpc_ai_cmdtest(struct comedi_device *dev,
945 struct comedi_subdevice *s, struct comedi_cmd *cmd)
951 /* step 1: make sure trigger sources are trivially valid */
953 tmp = cmd->start_src;
954 cmd->start_src &= TRIG_NOW | TRIG_EXT;
955 if (!cmd->start_src || tmp != cmd->start_src)
958 tmp = cmd->scan_begin_src;
959 cmd->scan_begin_src &= TRIG_TIMER | TRIG_FOLLOW | TRIG_EXT;
960 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
963 tmp = cmd->convert_src;
964 cmd->convert_src &= TRIG_TIMER | TRIG_EXT;
965 if (!cmd->convert_src || tmp != cmd->convert_src)
968 tmp = cmd->scan_end_src;
969 cmd->scan_end_src &= TRIG_COUNT;
970 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
974 stop_mask = TRIG_COUNT | TRIG_NONE;
975 if (thisboard->register_layout == labpc_1200_layout)
976 stop_mask |= TRIG_EXT;
977 cmd->stop_src &= stop_mask;
978 if (!cmd->stop_src || tmp != cmd->stop_src)
984 /* step 2: make sure trigger sources are unique and mutually compatible */
986 if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT)
988 if (cmd->scan_begin_src != TRIG_TIMER &&
989 cmd->scan_begin_src != TRIG_FOLLOW &&
990 cmd->scan_begin_src != TRIG_EXT)
992 if (cmd->convert_src != TRIG_TIMER && cmd->convert_src != TRIG_EXT)
994 if (cmd->stop_src != TRIG_COUNT &&
995 cmd->stop_src != TRIG_EXT && cmd->stop_src != TRIG_NONE)
998 /* can't have external stop and start triggers at once */
999 if (cmd->start_src == TRIG_EXT && cmd->stop_src == TRIG_EXT)
1005 /* step 3: make sure arguments are trivially compatible */
1007 if (cmd->start_arg == TRIG_NOW && cmd->start_arg != 0) {
1012 if (!cmd->chanlist_len) {
1015 if (cmd->scan_end_arg != cmd->chanlist_len) {
1016 cmd->scan_end_arg = cmd->chanlist_len;
1020 if (cmd->convert_src == TRIG_TIMER) {
1021 if (cmd->convert_arg < thisboard->ai_speed) {
1022 cmd->convert_arg = thisboard->ai_speed;
1026 /* make sure scan timing is not too fast */
1027 if (cmd->scan_begin_src == TRIG_TIMER) {
1028 if (cmd->convert_src == TRIG_TIMER &&
1029 cmd->scan_begin_arg <
1030 cmd->convert_arg * cmd->chanlist_len) {
1031 cmd->scan_begin_arg =
1032 cmd->convert_arg * cmd->chanlist_len;
1035 if (cmd->scan_begin_arg <
1036 thisboard->ai_speed * cmd->chanlist_len) {
1037 cmd->scan_begin_arg =
1038 thisboard->ai_speed * cmd->chanlist_len;
1043 switch (cmd->stop_src) {
1045 if (!cmd->stop_arg) {
1051 if (cmd->stop_arg != 0) {
1056 /* TRIG_EXT doesn't care since it doesn't trigger off a numbered channel */
1064 /* step 4: fix up any arguments */
1066 tmp = cmd->convert_arg;
1067 tmp2 = cmd->scan_begin_arg;
1068 labpc_adc_timing(dev, cmd);
1069 if (tmp != cmd->convert_arg || tmp2 != cmd->scan_begin_arg)
1075 if (labpc_ai_chanlist_invalid(dev, cmd))
1081 static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
1083 int channel, range, aref;
1084 unsigned long irq_flags;
1086 struct comedi_async *async = s->async;
1087 struct comedi_cmd *cmd = &async->cmd;
1088 enum transfer_type xfer;
1089 unsigned long flags;
1092 comedi_error(dev, "no irq assigned, cannot perform command");
1096 range = CR_RANGE(cmd->chanlist[0]);
1097 aref = CR_AREF(cmd->chanlist[0]);
1099 /* make sure board is disabled before setting up aquisition */
1100 spin_lock_irqsave(&dev->spinlock, flags);
1101 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
1102 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1103 spin_unlock_irqrestore(&dev->spinlock, flags);
1105 devpriv->command3_bits = 0;
1106 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1108 /* initialize software conversion count */
1109 if (cmd->stop_src == TRIG_COUNT) {
1110 devpriv->count = cmd->stop_arg * cmd->chanlist_len;
1112 /* setup hardware conversion counter */
1113 if (cmd->stop_src == TRIG_EXT) {
1114 /* load counter a1 with count of 3 (pc+ manual says this is minimum allowed) using mode 0 */
1115 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
1118 comedi_error(dev, "error loading counter a1");
1121 } else /* otherwise, just put a1 in mode 0 with no count to set its output low */
1122 devpriv->write_byte(INIT_A1_BITS,
1123 dev->iobase + COUNTER_A_CONTROL_REG);
1125 /* figure out what method we will use to transfer data */
1126 if (devpriv->dma_chan && /* need a dma channel allocated */
1127 /* dma unsafe at RT priority, and too much setup time for TRIG_WAKE_EOS for */
1128 (cmd->flags & (TRIG_WAKE_EOS | TRIG_RT)) == 0 &&
1129 /* only available on the isa boards */
1130 thisboard->bustype == isa_bustype) {
1131 xfer = isa_dma_transfer;
1132 } else if (thisboard->register_layout == labpc_1200_layout && /* pc-plus has no fifo-half full interrupt */
1133 /* wake-end-of-scan should interrupt on fifo not empty */
1134 (cmd->flags & TRIG_WAKE_EOS) == 0 &&
1135 /* make sure we are taking more than just a few points */
1136 (cmd->stop_src != TRIG_COUNT || devpriv->count > 256)) {
1137 xfer = fifo_half_full_transfer;
1139 xfer = fifo_not_empty_transfer;
1140 devpriv->current_transfer = xfer;
1142 /* setup command6 register for 1200 boards */
1143 if (thisboard->register_layout == labpc_1200_layout) {
1144 /* reference inputs to ground or common? */
1145 if (aref != AREF_GROUND)
1146 devpriv->command6_bits |= ADC_COMMON_BIT;
1148 devpriv->command6_bits &= ~ADC_COMMON_BIT;
1149 /* bipolar or unipolar range? */
1150 if (thisboard->ai_range_is_unipolar[range])
1151 devpriv->command6_bits |= ADC_UNIP_BIT;
1153 devpriv->command6_bits &= ~ADC_UNIP_BIT;
1154 /* interrupt on fifo half full? */
1155 if (xfer == fifo_half_full_transfer)
1156 devpriv->command6_bits |= ADC_FHF_INTR_EN_BIT;
1158 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
1159 /* enable interrupt on counter a1 terminal count? */
1160 if (cmd->stop_src == TRIG_EXT)
1161 devpriv->command6_bits |= A1_INTR_EN_BIT;
1163 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
1164 /* are we scanning up or down through channels? */
1165 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP)
1166 devpriv->command6_bits |= ADC_SCAN_UP_BIT;
1168 devpriv->command6_bits &= ~ADC_SCAN_UP_BIT;
1169 /* write to register */
1170 devpriv->write_byte(devpriv->command6_bits,
1171 dev->iobase + COMMAND6_REG);
1174 /* setup channel list, etc (command1 register) */
1175 devpriv->command1_bits = 0;
1176 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP)
1177 channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
1179 channel = CR_CHAN(cmd->chanlist[0]);
1180 /* munge channel bits for differential / scan disabled mode */
1181 if (labpc_ai_scan_mode(cmd) != MODE_SINGLE_CHAN && aref == AREF_DIFF)
1183 devpriv->command1_bits |= ADC_CHAN_BITS(channel);
1184 devpriv->command1_bits |= thisboard->ai_range_code[range];
1185 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
1186 /* manual says to set scan enable bit on second pass */
1187 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP ||
1188 labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_DOWN) {
1189 devpriv->command1_bits |= ADC_SCAN_EN_BIT;
1190 /* need a brief delay before enabling scan, or scan list will get screwed when you switch
1191 * between scan up to scan down mode - dunno why */
1193 devpriv->write_byte(devpriv->command1_bits,
1194 dev->iobase + COMMAND1_REG);
1196 /* setup any external triggering/pacing (command4 register) */
1197 devpriv->command4_bits = 0;
1198 if (cmd->convert_src != TRIG_EXT)
1199 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
1200 /* XXX should discard first scan when using interval scanning
1201 * since manual says it is not synced with scan clock */
1202 if (labpc_use_continuous_mode(cmd) == 0) {
1203 devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT;
1204 if (cmd->scan_begin_src == TRIG_EXT)
1205 devpriv->command4_bits |= EXT_SCAN_EN_BIT;
1207 /* single-ended/differential */
1208 if (aref == AREF_DIFF)
1209 devpriv->command4_bits |= ADC_DIFF_BIT;
1210 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1212 devpriv->write_byte(cmd->chanlist_len,
1213 dev->iobase + INTERVAL_COUNT_REG);
1215 devpriv->write_byte(INTERVAL_LOAD_BITS,
1216 dev->iobase + INTERVAL_LOAD_REG);
1218 if (cmd->convert_src == TRIG_TIMER || cmd->scan_begin_src == TRIG_TIMER) {
1220 labpc_adc_timing(dev, cmd);
1221 /* load counter b0 in mode 3 */
1222 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
1223 0, devpriv->divisor_b0, 3);
1225 comedi_error(dev, "error loading counter b0");
1229 /* set up conversion pacing */
1230 if (labpc_ai_convert_period(cmd)) {
1231 /* load counter a0 in mode 2 */
1232 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
1233 0, devpriv->divisor_a0, 2);
1235 comedi_error(dev, "error loading counter a0");
1239 devpriv->write_byte(INIT_A0_BITS,
1240 dev->iobase + COUNTER_A_CONTROL_REG);
1242 /* set up scan pacing */
1243 if (labpc_ai_scan_period(cmd)) {
1244 /* load counter b1 in mode 2 */
1245 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
1246 1, devpriv->divisor_b1, 2);
1248 comedi_error(dev, "error loading counter b1");
1253 labpc_clear_adc_fifo(dev);
1255 /* set up dma transfer */
1256 if (xfer == isa_dma_transfer) {
1257 irq_flags = claim_dma_lock();
1258 disable_dma(devpriv->dma_chan);
1259 /* clear flip-flop to make sure 2-byte registers for
1260 * count and address get set correctly */
1261 clear_dma_ff(devpriv->dma_chan);
1262 set_dma_addr(devpriv->dma_chan,
1263 virt_to_bus(devpriv->dma_buffer));
1264 /* set appropriate size of transfer */
1265 devpriv->dma_transfer_size = labpc_suggest_transfer_size(*cmd);
1266 if (cmd->stop_src == TRIG_COUNT &&
1267 devpriv->count * sample_size < devpriv->dma_transfer_size) {
1268 devpriv->dma_transfer_size =
1269 devpriv->count * sample_size;
1271 set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
1272 enable_dma(devpriv->dma_chan);
1273 release_dma_lock(irq_flags);
1274 /* enable board's dma */
1275 devpriv->command3_bits |= DMA_EN_BIT | DMATC_INTR_EN_BIT;
1277 devpriv->command3_bits &= ~DMA_EN_BIT & ~DMATC_INTR_EN_BIT;
1279 /* enable error interrupts */
1280 devpriv->command3_bits |= ERR_INTR_EN_BIT;
1281 /* enable fifo not empty interrupt? */
1282 if (xfer == fifo_not_empty_transfer)
1283 devpriv->command3_bits |= ADC_FNE_INTR_EN_BIT;
1285 devpriv->command3_bits &= ~ADC_FNE_INTR_EN_BIT;
1286 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1288 /* startup aquisition */
1291 /* use 2 cascaded counters for pacing */
1292 spin_lock_irqsave(&dev->spinlock, flags);
1293 devpriv->command2_bits |= CASCADE_BIT;
1294 switch (cmd->start_src) {
1296 devpriv->command2_bits |= HWTRIG_BIT;
1297 devpriv->command2_bits &= ~PRETRIG_BIT & ~SWTRIG_BIT;
1300 devpriv->command2_bits |= SWTRIG_BIT;
1301 devpriv->command2_bits &= ~PRETRIG_BIT & ~HWTRIG_BIT;
1304 comedi_error(dev, "bug with start_src");
1308 switch (cmd->stop_src) {
1310 devpriv->command2_bits |= HWTRIG_BIT | PRETRIG_BIT;
1316 comedi_error(dev, "bug with stop_src");
1319 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1320 spin_unlock_irqrestore(&dev->spinlock, flags);
1325 /* interrupt service routine */
1326 static irqreturn_t labpc_interrupt(int irq, void *d)
1328 struct comedi_device *dev = d;
1329 struct comedi_subdevice *s = dev->read_subdev;
1330 struct comedi_async *async;
1331 struct comedi_cmd *cmd;
1333 if (dev->attached == 0) {
1334 comedi_error(dev, "premature interrupt");
1342 /* read board status */
1343 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1344 if (thisboard->register_layout == labpc_1200_layout)
1345 devpriv->status2_bits =
1346 devpriv->read_byte(dev->iobase + STATUS2_REG);
1348 if ((devpriv->status1_bits & (DMATC_BIT | TIMER_BIT | OVERFLOW_BIT |
1349 OVERRUN_BIT | DATA_AVAIL_BIT)) == 0
1350 && (devpriv->status2_bits & A1_TC_BIT) == 0
1351 && (devpriv->status2_bits & FNHF_BIT)) {
1355 if (devpriv->status1_bits & OVERRUN_BIT) {
1356 /* clear error interrupt */
1357 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1358 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1359 comedi_event(dev, s);
1360 comedi_error(dev, "overrun");
1364 if (devpriv->current_transfer == isa_dma_transfer) {
1365 /* if a dma terminal count of external stop trigger has occurred */
1366 if (devpriv->status1_bits & DMATC_BIT ||
1367 (thisboard->register_layout == labpc_1200_layout
1368 && devpriv->status2_bits & A1_TC_BIT)) {
1369 handle_isa_dma(dev);
1372 labpc_drain_fifo(dev);
1374 if (devpriv->status1_bits & TIMER_BIT) {
1375 comedi_error(dev, "handled timer interrupt?");
1377 devpriv->write_byte(0x1, dev->iobase + TIMER_CLEAR_REG);
1380 if (devpriv->status1_bits & OVERFLOW_BIT) {
1381 /* clear error interrupt */
1382 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1383 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1384 comedi_event(dev, s);
1385 comedi_error(dev, "overflow");
1388 /* handle external stop trigger */
1389 if (cmd->stop_src == TRIG_EXT) {
1390 if (devpriv->status2_bits & A1_TC_BIT) {
1391 labpc_drain_dregs(dev);
1392 labpc_cancel(dev, s);
1393 async->events |= COMEDI_CB_EOA;
1397 /* TRIG_COUNT end of acquisition */
1398 if (cmd->stop_src == TRIG_COUNT) {
1399 if (devpriv->count == 0) {
1400 labpc_cancel(dev, s);
1401 async->events |= COMEDI_CB_EOA;
1405 comedi_event(dev, s);
1409 /* read all available samples from ai fifo */
1410 static int labpc_drain_fifo(struct comedi_device *dev)
1412 unsigned int lsb, msb;
1414 struct comedi_async *async = dev->read_subdev->async;
1415 const int timeout = 10000;
1418 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1420 for (i = 0; (devpriv->status1_bits & DATA_AVAIL_BIT) && i < timeout;
1422 /* quit if we have all the data we want */
1423 if (async->cmd.stop_src == TRIG_COUNT) {
1424 if (devpriv->count == 0)
1428 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1429 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1430 data = (msb << 8) | lsb;
1431 cfc_write_to_buffer(dev->read_subdev, data);
1432 devpriv->status1_bits =
1433 devpriv->read_byte(dev->iobase + STATUS1_REG);
1436 comedi_error(dev, "ai timeout, fifo never empties");
1437 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1444 static void labpc_drain_dma(struct comedi_device *dev)
1446 struct comedi_subdevice *s = dev->read_subdev;
1447 struct comedi_async *async = s->async;
1449 unsigned long flags;
1450 unsigned int max_points, num_points, residue, leftover;
1453 status = devpriv->status1_bits;
1455 flags = claim_dma_lock();
1456 disable_dma(devpriv->dma_chan);
1457 /* clear flip-flop to make sure 2-byte registers for
1458 * count and address get set correctly */
1459 clear_dma_ff(devpriv->dma_chan);
1461 /* figure out how many points to read */
1462 max_points = devpriv->dma_transfer_size / sample_size;
1463 /* residue is the number of points left to be done on the dma
1464 * transfer. It should always be zero at this point unless
1465 * the stop_src is set to external triggering.
1467 residue = get_dma_residue(devpriv->dma_chan) / sample_size;
1468 num_points = max_points - residue;
1469 if (devpriv->count < num_points && async->cmd.stop_src == TRIG_COUNT)
1470 num_points = devpriv->count;
1472 /* figure out how many points will be stored next time */
1474 if (async->cmd.stop_src != TRIG_COUNT) {
1475 leftover = devpriv->dma_transfer_size / sample_size;
1476 } else if (devpriv->count > num_points) {
1477 leftover = devpriv->count - num_points;
1478 if (leftover > max_points)
1479 leftover = max_points;
1482 /* write data to comedi buffer */
1483 for (i = 0; i < num_points; i++) {
1484 cfc_write_to_buffer(s, devpriv->dma_buffer[i]);
1486 if (async->cmd.stop_src == TRIG_COUNT)
1487 devpriv->count -= num_points;
1489 /* set address and count for next transfer */
1490 set_dma_addr(devpriv->dma_chan, virt_to_bus(devpriv->dma_buffer));
1491 set_dma_count(devpriv->dma_chan, leftover * sample_size);
1492 release_dma_lock(flags);
1494 async->events |= COMEDI_CB_BLOCK;
1497 static void handle_isa_dma(struct comedi_device *dev)
1499 labpc_drain_dma(dev);
1501 enable_dma(devpriv->dma_chan);
1503 /* clear dma tc interrupt */
1504 devpriv->write_byte(0x1, dev->iobase + DMATC_CLEAR_REG);
1507 /* makes sure all data aquired by board is transfered to comedi (used
1508 * when aquisition is terminated by stop_src == TRIG_EXT). */
1509 static void labpc_drain_dregs(struct comedi_device *dev)
1511 if (devpriv->current_transfer == isa_dma_transfer)
1512 labpc_drain_dma(dev);
1514 labpc_drain_fifo(dev);
1517 static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1518 struct comedi_insn *insn, unsigned int *data)
1524 unsigned long flags;
1526 /* disable timed conversions */
1527 spin_lock_irqsave(&dev->spinlock, flags);
1528 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
1529 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1530 spin_unlock_irqrestore(&dev->spinlock, flags);
1532 /* disable interrupt generation and dma */
1533 devpriv->command3_bits = 0;
1534 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1536 /* set gain and channel */
1537 devpriv->command1_bits = 0;
1538 chan = CR_CHAN(insn->chanspec);
1539 range = CR_RANGE(insn->chanspec);
1540 devpriv->command1_bits |= thisboard->ai_range_code[range];
1541 /* munge channel bits for differential/scan disabled mode */
1542 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1544 devpriv->command1_bits |= ADC_CHAN_BITS(chan);
1545 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
1547 /* setup command6 register for 1200 boards */
1548 if (thisboard->register_layout == labpc_1200_layout) {
1549 /* reference inputs to ground or common? */
1550 if (CR_AREF(insn->chanspec) != AREF_GROUND)
1551 devpriv->command6_bits |= ADC_COMMON_BIT;
1553 devpriv->command6_bits &= ~ADC_COMMON_BIT;
1554 /* bipolar or unipolar range? */
1555 if (thisboard->ai_range_is_unipolar[range])
1556 devpriv->command6_bits |= ADC_UNIP_BIT;
1558 devpriv->command6_bits &= ~ADC_UNIP_BIT;
1559 /* don't interrupt on fifo half full */
1560 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
1561 /* don't enable interrupt on counter a1 terminal count? */
1562 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
1563 /* write to register */
1564 devpriv->write_byte(devpriv->command6_bits,
1565 dev->iobase + COMMAND6_REG);
1567 /* setup command4 register */
1568 devpriv->command4_bits = 0;
1569 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
1570 /* single-ended/differential */
1571 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1572 devpriv->command4_bits |= ADC_DIFF_BIT;
1573 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1575 /* initialize pacer counter output to make sure it doesn't cause any problems */
1576 devpriv->write_byte(INIT_A0_BITS, dev->iobase + COUNTER_A_CONTROL_REG);
1578 labpc_clear_adc_fifo(dev);
1580 for (n = 0; n < insn->n; n++) {
1581 /* trigger conversion */
1582 devpriv->write_byte(0x1, dev->iobase + ADC_CONVERT_REG);
1584 for (i = 0; i < timeout; i++) {
1585 if (devpriv->read_byte(dev->iobase +
1586 STATUS1_REG) & DATA_AVAIL_BIT)
1591 comedi_error(dev, "timeout");
1594 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1595 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1596 data[n] = (msb << 8) | lsb;
1602 /* analog output insn */
1603 static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1604 struct comedi_insn *insn, unsigned int *data)
1607 unsigned long flags;
1610 channel = CR_CHAN(insn->chanspec);
1612 /* turn off pacing of analog output channel */
1613 /* note: hardware bug in daqcard-1200 means pacing cannot
1614 * be independently enabled/disabled for its the two channels */
1615 spin_lock_irqsave(&dev->spinlock, flags);
1616 devpriv->command2_bits &= ~DAC_PACED_BIT(channel);
1617 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1618 spin_unlock_irqrestore(&dev->spinlock, flags);
1621 if (thisboard->register_layout == labpc_1200_layout) {
1622 range = CR_RANGE(insn->chanspec);
1623 if (range & AO_RANGE_IS_UNIPOLAR)
1624 devpriv->command6_bits |= DAC_UNIP_BIT(channel);
1626 devpriv->command6_bits &= ~DAC_UNIP_BIT(channel);
1627 /* write to register */
1628 devpriv->write_byte(devpriv->command6_bits,
1629 dev->iobase + COMMAND6_REG);
1632 lsb = data[0] & 0xff;
1633 msb = (data[0] >> 8) & 0xff;
1634 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(channel));
1635 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(channel));
1637 /* remember value for readback */
1638 devpriv->ao_value[channel] = data[0];
1643 /* analog output readback insn */
1644 static int labpc_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1645 struct comedi_insn *insn, unsigned int *data)
1647 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
1652 static int labpc_calib_read_insn(struct comedi_device *dev,
1653 struct comedi_subdevice *s,
1654 struct comedi_insn *insn, unsigned int *data)
1656 data[0] = devpriv->caldac[CR_CHAN(insn->chanspec)];
1661 static int labpc_calib_write_insn(struct comedi_device *dev,
1662 struct comedi_subdevice *s,
1663 struct comedi_insn *insn, unsigned int *data)
1665 int channel = CR_CHAN(insn->chanspec);
1667 write_caldac(dev, channel, data[0]);
1671 static int labpc_eeprom_read_insn(struct comedi_device *dev,
1672 struct comedi_subdevice *s,
1673 struct comedi_insn *insn, unsigned int *data)
1675 data[0] = devpriv->eeprom_data[CR_CHAN(insn->chanspec)];
1680 static int labpc_eeprom_write_insn(struct comedi_device *dev,
1681 struct comedi_subdevice *s,
1682 struct comedi_insn *insn, unsigned int *data)
1684 int channel = CR_CHAN(insn->chanspec);
1687 /* only allow writes to user area of eeprom */
1688 if (channel < 16 || channel > 127) {
1690 ("eeprom writes are only allowed to channels 16 through 127 (the pointer and user areas)");
1694 ret = labpc_eeprom_write(dev, channel, data[0]);
1701 /* utility function that suggests a dma transfer size in bytes */
1702 static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd)
1707 if (cmd.convert_src == TRIG_TIMER)
1708 freq = 1000000000 / cmd.convert_arg;
1709 /* return some default value */
1713 /* make buffer fill in no more than 1/3 second */
1714 size = (freq / 3) * sample_size;
1716 /* set a minimum and maximum size allowed */
1717 if (size > dma_buffer_size)
1718 size = dma_buffer_size - dma_buffer_size % sample_size;
1719 else if (size < sample_size)
1725 /* figures out what counter values to use based on command */
1726 static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
1728 const int max_counter_value = 0x10000; /* max value for 16 bit counter in mode 2 */
1729 const int min_counter_value = 2; /* min value for 16 bit counter in mode 2 */
1730 unsigned int base_period;
1732 /* if both convert and scan triggers are TRIG_TIMER, then they both rely on counter b0 */
1733 if (labpc_ai_convert_period(cmd) && labpc_ai_scan_period(cmd)) {
1734 /* pick the lowest b0 divisor value we can (for maximum input clock speed on convert and scan counters) */
1735 devpriv->divisor_b0 = (labpc_ai_scan_period(cmd) - 1) /
1736 (LABPC_TIMER_BASE * max_counter_value) + 1;
1737 if (devpriv->divisor_b0 < min_counter_value)
1738 devpriv->divisor_b0 = min_counter_value;
1739 if (devpriv->divisor_b0 > max_counter_value)
1740 devpriv->divisor_b0 = max_counter_value;
1742 base_period = LABPC_TIMER_BASE * devpriv->divisor_b0;
1744 /* set a0 for conversion frequency and b1 for scan frequency */
1745 switch (cmd->flags & TRIG_ROUND_MASK) {
1747 case TRIG_ROUND_NEAREST:
1748 devpriv->divisor_a0 =
1749 (labpc_ai_convert_period(cmd) +
1750 (base_period / 2)) / base_period;
1751 devpriv->divisor_b1 =
1752 (labpc_ai_scan_period(cmd) +
1753 (base_period / 2)) / base_period;
1756 devpriv->divisor_a0 =
1757 (labpc_ai_convert_period(cmd) + (base_period -
1759 devpriv->divisor_b1 =
1760 (labpc_ai_scan_period(cmd) + (base_period -
1763 case TRIG_ROUND_DOWN:
1764 devpriv->divisor_a0 =
1765 labpc_ai_convert_period(cmd) / base_period;
1766 devpriv->divisor_b1 =
1767 labpc_ai_scan_period(cmd) / base_period;
1770 /* make sure a0 and b1 values are acceptable */
1771 if (devpriv->divisor_a0 < min_counter_value)
1772 devpriv->divisor_a0 = min_counter_value;
1773 if (devpriv->divisor_a0 > max_counter_value)
1774 devpriv->divisor_a0 = max_counter_value;
1775 if (devpriv->divisor_b1 < min_counter_value)
1776 devpriv->divisor_b1 = min_counter_value;
1777 if (devpriv->divisor_b1 > max_counter_value)
1778 devpriv->divisor_b1 = max_counter_value;
1779 /* write corrected timings to command */
1780 labpc_set_ai_convert_period(cmd,
1781 base_period * devpriv->divisor_a0);
1782 labpc_set_ai_scan_period(cmd,
1783 base_period * devpriv->divisor_b1);
1784 /* if only one TRIG_TIMER is used, we can employ the generic cascaded timing functions */
1785 } else if (labpc_ai_scan_period(cmd)) {
1786 unsigned int scan_period;
1788 scan_period = labpc_ai_scan_period(cmd);
1789 /* calculate cascaded counter values that give desired scan timing */
1790 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
1791 &(devpriv->divisor_b1),
1792 &(devpriv->divisor_b0),
1794 cmd->flags & TRIG_ROUND_MASK);
1795 labpc_set_ai_scan_period(cmd, scan_period);
1796 } else if (labpc_ai_convert_period(cmd)) {
1797 unsigned int convert_period;
1799 convert_period = labpc_ai_convert_period(cmd);
1800 /* calculate cascaded counter values that give desired conversion timing */
1801 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
1802 &(devpriv->divisor_a0),
1803 &(devpriv->divisor_b0),
1805 cmd->flags & TRIG_ROUND_MASK);
1806 labpc_set_ai_convert_period(cmd, convert_period);
1810 static int labpc_dio_mem_callback(int dir, int port, int data,
1811 unsigned long iobase)
1814 writeb(data, (void *)(iobase + port));
1817 return readb((void *)(iobase + port));
1821 /* lowlevel write to eeprom/dac */
1822 static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
1823 unsigned int value_width)
1827 for (i = 1; i <= value_width; i++) {
1828 /* clear serial clock */
1829 devpriv->command5_bits &= ~SCLOCK_BIT;
1830 /* send bits most significant bit first */
1831 if (value & (1 << (value_width - i)))
1832 devpriv->command5_bits |= SDATA_BIT;
1834 devpriv->command5_bits &= ~SDATA_BIT;
1836 devpriv->write_byte(devpriv->command5_bits,
1837 dev->iobase + COMMAND5_REG);
1838 /* set clock to load bit */
1839 devpriv->command5_bits |= SCLOCK_BIT;
1841 devpriv->write_byte(devpriv->command5_bits,
1842 dev->iobase + COMMAND5_REG);
1846 /* lowlevel read from eeprom */
1847 static unsigned int labpc_serial_in(struct comedi_device *dev)
1849 unsigned int value = 0;
1851 const int value_width = 8; /* number of bits wide values are */
1853 for (i = 1; i <= value_width; i++) {
1854 /* set serial clock */
1855 devpriv->command5_bits |= SCLOCK_BIT;
1857 devpriv->write_byte(devpriv->command5_bits,
1858 dev->iobase + COMMAND5_REG);
1859 /* clear clock bit */
1860 devpriv->command5_bits &= ~SCLOCK_BIT;
1862 devpriv->write_byte(devpriv->command5_bits,
1863 dev->iobase + COMMAND5_REG);
1864 /* read bits most significant bit first */
1866 devpriv->status2_bits =
1867 devpriv->read_byte(dev->iobase + STATUS2_REG);
1868 if (devpriv->status2_bits & EEPROM_OUT_BIT) {
1869 value |= 1 << (value_width - i);
1876 static unsigned int labpc_eeprom_read(struct comedi_device *dev,
1877 unsigned int address)
1880 const int read_instruction = 0x3; /* bits to tell eeprom to expect a read */
1881 const int write_length = 8; /* 8 bit write lengths to eeprom */
1883 /* enable read/write to eeprom */
1884 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1886 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1887 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1889 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1891 /* send read instruction */
1892 labpc_serial_out(dev, read_instruction, write_length);
1893 /* send 8 bit address to read from */
1894 labpc_serial_out(dev, address, write_length);
1896 value = labpc_serial_in(dev);
1898 /* disable read/write to eeprom */
1899 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1901 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1906 static unsigned int labpc_eeprom_write(struct comedi_device *dev,
1907 unsigned int address, unsigned int value)
1909 const int write_enable_instruction = 0x6;
1910 const int write_instruction = 0x2;
1911 const int write_length = 8; /* 8 bit write lengths to eeprom */
1912 const int write_in_progress_bit = 0x1;
1913 const int timeout = 10000;
1916 /* make sure there isn't already a write in progress */
1917 for (i = 0; i < timeout; i++) {
1918 if ((labpc_eeprom_read_status(dev) & write_in_progress_bit) ==
1923 comedi_error(dev, "eeprom write timed out");
1926 /* update software copy of eeprom */
1927 devpriv->eeprom_data[address] = value;
1929 /* enable read/write to eeprom */
1930 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1932 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1933 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1935 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1937 /* send write_enable instruction */
1938 labpc_serial_out(dev, write_enable_instruction, write_length);
1939 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1941 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1943 /* send write instruction */
1944 devpriv->command5_bits |= EEPROM_EN_BIT;
1946 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1947 labpc_serial_out(dev, write_instruction, write_length);
1948 /* send 8 bit address to write to */
1949 labpc_serial_out(dev, address, write_length);
1951 labpc_serial_out(dev, value, write_length);
1952 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1954 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1956 /* disable read/write to eeprom */
1957 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1959 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1964 static unsigned int labpc_eeprom_read_status(struct comedi_device *dev)
1967 const int read_status_instruction = 0x5;
1968 const int write_length = 8; /* 8 bit write lengths to eeprom */
1970 /* enable read/write to eeprom */
1971 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1973 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1974 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1976 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1978 /* send read status instruction */
1979 labpc_serial_out(dev, read_status_instruction, write_length);
1981 value = labpc_serial_in(dev);
1983 /* disable read/write to eeprom */
1984 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1986 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1991 /* writes to 8 bit calibration dacs */
1992 static void write_caldac(struct comedi_device *dev, unsigned int channel,
1995 if (value == devpriv->caldac[channel])
1997 devpriv->caldac[channel] = value;
1999 /* clear caldac load bit and make sure we don't write to eeprom */
2000 devpriv->command5_bits &=
2001 ~CALDAC_LOAD_BIT & ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
2003 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2005 /* write 4 bit channel */
2006 labpc_serial_out(dev, channel, 4);
2007 /* write 8 bit caldac value */
2008 labpc_serial_out(dev, value, 8);
2010 /* set and clear caldac bit to load caldac value */
2011 devpriv->command5_bits |= CALDAC_LOAD_BIT;
2013 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2014 devpriv->command5_bits &= ~CALDAC_LOAD_BIT;
2016 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2019 #ifdef CONFIG_COMEDI_PCI
2020 COMEDI_PCI_INITCLEANUP(driver_labpc, labpc_pci_table);
2022 COMEDI_INITCLEANUP(driver_labpc);
2025 EXPORT_SYMBOL_GPL(labpc_common_attach);
2026 EXPORT_SYMBOL_GPL(labpc_common_detach);
2027 EXPORT_SYMBOL_GPL(range_labpc_1200_ai);
2028 EXPORT_SYMBOL_GPL(labpc_1200_ai_gain_bits);
2029 EXPORT_SYMBOL_GPL(labpc_1200_is_unipolar);