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);
489 printk(", dma %u", dma_chan);
493 printk("io base address is zero!\n");
496 /* request io regions for isa boards */
497 if (thisboard->bustype == isa_bustype) {
498 /* check if io addresses are available */
499 if (!request_region(iobase, LABPC_SIZE,
500 driver_labpc.driver_name)) {
501 printk("I/O port conflict\n");
505 dev->iobase = iobase;
507 if (thisboard->memory_mapped_io) {
508 devpriv->read_byte = labpc_readb;
509 devpriv->write_byte = labpc_writeb;
511 devpriv->read_byte = labpc_inb;
512 devpriv->write_byte = labpc_outb;
514 /* initialize board's command registers */
515 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
516 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
517 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
518 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
519 if (thisboard->register_layout == labpc_1200_layout) {
520 devpriv->write_byte(devpriv->command5_bits,
521 dev->iobase + COMMAND5_REG);
522 devpriv->write_byte(devpriv->command6_bits,
523 dev->iobase + COMMAND6_REG);
529 if (thisboard->bustype == pci_bustype)
530 isr_flags |= IRQF_SHARED;
531 if (request_irq(irq, labpc_interrupt, isr_flags,
532 driver_labpc.driver_name, dev)) {
533 printk("unable to allocate irq %u\n", irq);
539 /* grab dma channel */
541 printk(" invalid dma channel %u\n", dma_chan);
543 } else if (dma_chan) {
544 /* allocate dma buffer */
545 devpriv->dma_buffer =
546 kmalloc(dma_buffer_size, GFP_KERNEL | GFP_DMA);
547 if (devpriv->dma_buffer == NULL) {
548 printk(" failed to allocate dma buffer\n");
551 if (request_dma(dma_chan, driver_labpc.driver_name)) {
552 printk(" failed to allocate dma channel %u\n",
556 devpriv->dma_chan = dma_chan;
557 dma_flags = claim_dma_lock();
558 disable_dma(devpriv->dma_chan);
559 set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
560 release_dma_lock(dma_flags);
563 dev->board_name = thisboard->name;
565 if (alloc_subdevices(dev, 5) < 0)
568 /* analog input subdevice */
569 s = dev->subdevices + 0;
570 dev->read_subdev = s;
571 s->type = COMEDI_SUBD_AI;
573 SDF_READABLE | SDF_GROUND | SDF_COMMON | SDF_DIFF | SDF_CMD_READ;
576 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
577 s->range_table = thisboard->ai_range_table;
578 s->do_cmd = labpc_ai_cmd;
579 s->do_cmdtest = labpc_ai_cmdtest;
580 s->insn_read = labpc_ai_rinsn;
581 s->cancel = labpc_cancel;
584 s = dev->subdevices + 1;
585 if (thisboard->has_ao) {
586 /* Could provide command support, except it only has a one sample
587 * hardware buffer for analog output and no underrun flag. */
588 s->type = COMEDI_SUBD_AO;
589 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_GROUND;
590 s->n_chan = NUM_AO_CHAN;
591 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
592 s->range_table = &range_labpc_ao;
593 s->insn_read = labpc_ao_rinsn;
594 s->insn_write = labpc_ao_winsn;
595 /* initialize analog outputs to a known value */
596 for (i = 0; i < s->n_chan; i++) {
597 devpriv->ao_value[i] = s->maxdata / 2;
598 lsb = devpriv->ao_value[i] & 0xff;
599 msb = (devpriv->ao_value[i] >> 8) & 0xff;
600 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(i));
601 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(i));
604 s->type = COMEDI_SUBD_UNUSED;
608 s = dev->subdevices + 2;
609 /* if board uses io memory we have to give a custom callback function to the 8255 driver */
610 if (thisboard->memory_mapped_io)
611 subdev_8255_init(dev, s, labpc_dio_mem_callback,
612 (unsigned long)(dev->iobase + DIO_BASE_REG));
614 subdev_8255_init(dev, s, NULL, dev->iobase + DIO_BASE_REG);
616 /* calibration subdevices for boards that have one */
617 s = dev->subdevices + 3;
618 if (thisboard->register_layout == labpc_1200_layout) {
619 s->type = COMEDI_SUBD_CALIB;
620 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
623 s->insn_read = labpc_calib_read_insn;
624 s->insn_write = labpc_calib_write_insn;
626 for (i = 0; i < s->n_chan; i++)
627 write_caldac(dev, i, s->maxdata / 2);
629 s->type = COMEDI_SUBD_UNUSED;
632 s = dev->subdevices + 4;
633 if (thisboard->register_layout == labpc_1200_layout) {
634 s->type = COMEDI_SUBD_MEMORY;
635 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
636 s->n_chan = EEPROM_SIZE;
638 s->insn_read = labpc_eeprom_read_insn;
639 s->insn_write = labpc_eeprom_write_insn;
641 for (i = 0; i < EEPROM_SIZE; i++) {
642 devpriv->eeprom_data[i] = labpc_eeprom_read(dev, i);
646 for (i = 0; i < EEPROM_SIZE; i++) {
647 printk(" %i:0x%x ", i, devpriv->eeprom_data[i]);
652 s->type = COMEDI_SUBD_UNUSED;
657 static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
659 unsigned long iobase = 0;
660 unsigned int irq = 0;
661 unsigned int dma_chan = 0;
662 #ifdef CONFIG_COMEDI_PCI
666 /* allocate and initialize dev->private */
667 if (alloc_private(dev, sizeof(struct labpc_private)) < 0)
670 /* get base address, irq etc. based on bustype */
671 switch (thisboard->bustype) {
673 iobase = it->options[0];
674 irq = it->options[1];
675 dma_chan = it->options[2];
678 #ifdef CONFIG_COMEDI_PCI
679 retval = labpc_find_device(dev, it->options[0], it->options[1]);
683 retval = mite_setup(devpriv->mite);
686 iobase = (unsigned long)devpriv->mite->daq_io_addr;
687 irq = mite_irq(devpriv->mite);
689 printk(" this driver has not been built with PCI support.\n");
695 (" this driver does not support pcmcia cards, use ni_labpc_cs.o\n");
699 printk("bug! couldn't determine board type\n");
704 return labpc_common_attach(dev, iobase, irq, dma_chan);
707 /* adapted from ni_pcimio for finding mite based boards (pc-1200) */
708 #ifdef CONFIG_COMEDI_PCI
709 static int labpc_find_device(struct comedi_device *dev, int bus, int slot)
711 struct mite_struct *mite;
713 for (mite = mite_devices; mite; mite = mite->next) {
716 /* if bus/slot are specified then make sure we have the right bus/slot */
718 if (bus != mite->pcidev->bus->number
719 || slot != PCI_SLOT(mite->pcidev->devfn))
722 for (i = 0; i < driver_labpc.num_names; i++) {
723 if (labpc_boards[i].bustype != pci_bustype)
725 if (mite_device_id(mite) == labpc_boards[i].device_id) {
726 devpriv->mite = mite;
727 /* fixup board pointer, in case we were using the dummy "ni_labpc" entry */
728 dev->board_ptr = &labpc_boards[i];
733 printk("no device found\n");
739 int labpc_common_detach(struct comedi_device *dev)
741 printk("comedi%d: ni_labpc: detach\n", dev->minor);
744 subdev_8255_cleanup(dev, dev->subdevices + 2);
746 /* only free stuff if it has been allocated by _attach */
747 if (devpriv->dma_buffer)
748 kfree(devpriv->dma_buffer);
749 if (devpriv->dma_chan)
750 free_dma(devpriv->dma_chan);
752 free_irq(dev->irq, dev);
753 if (thisboard->bustype == isa_bustype && dev->iobase)
754 release_region(dev->iobase, LABPC_SIZE);
755 #ifdef CONFIG_COMEDI_PCI
757 mite_unsetup(devpriv->mite);
763 static void labpc_clear_adc_fifo(const struct comedi_device *dev)
765 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
766 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
767 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
770 static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
774 spin_lock_irqsave(&dev->spinlock, flags);
775 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
776 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
777 spin_unlock_irqrestore(&dev->spinlock, flags);
779 devpriv->command3_bits = 0;
780 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
785 static enum scan_mode labpc_ai_scan_mode(const struct comedi_cmd *cmd)
787 if (cmd->chanlist_len == 1)
788 return MODE_SINGLE_CHAN;
790 /* chanlist may be NULL during cmdtest. */
791 if (cmd->chanlist == NULL)
792 return MODE_MULT_CHAN_UP;
794 if (CR_CHAN(cmd->chanlist[0]) == CR_CHAN(cmd->chanlist[1]))
795 return MODE_SINGLE_CHAN_INTERVAL;
797 if (CR_CHAN(cmd->chanlist[0]) < CR_CHAN(cmd->chanlist[1]))
798 return MODE_MULT_CHAN_UP;
800 if (CR_CHAN(cmd->chanlist[0]) > CR_CHAN(cmd->chanlist[1]))
801 return MODE_MULT_CHAN_DOWN;
803 printk("ni_labpc: bug! this should never happen\n");
808 static int labpc_ai_chanlist_invalid(const struct comedi_device *dev,
809 const struct comedi_cmd *cmd)
811 int mode, channel, range, aref, i;
813 if (cmd->chanlist == NULL)
816 mode = labpc_ai_scan_mode(cmd);
818 if (mode == MODE_SINGLE_CHAN)
821 if (mode == MODE_SINGLE_CHAN_INTERVAL) {
822 if (cmd->chanlist_len > 0xff) {
824 "ni_labpc: chanlist too long for single channel interval mode\n");
829 channel = CR_CHAN(cmd->chanlist[0]);
830 range = CR_RANGE(cmd->chanlist[0]);
831 aref = CR_AREF(cmd->chanlist[0]);
833 for (i = 0; i < cmd->chanlist_len; i++) {
836 case MODE_SINGLE_CHAN_INTERVAL:
837 if (CR_CHAN(cmd->chanlist[i]) != channel) {
839 "channel scanning order specified in chanlist is not supported by hardware.\n");
843 case MODE_MULT_CHAN_UP:
844 if (CR_CHAN(cmd->chanlist[i]) != i) {
846 "channel scanning order specified in chanlist is not supported by hardware.\n");
850 case MODE_MULT_CHAN_DOWN:
851 if (CR_CHAN(cmd->chanlist[i]) !=
852 cmd->chanlist_len - i - 1) {
854 "channel scanning order specified in chanlist is not supported by hardware.\n");
859 printk("ni_labpc: bug! in chanlist check\n");
864 if (CR_RANGE(cmd->chanlist[i]) != range) {
866 "entries in chanlist must all have the same range\n");
870 if (CR_AREF(cmd->chanlist[i]) != aref) {
872 "entries in chanlist must all have the same reference\n");
880 static int labpc_use_continuous_mode(const struct comedi_cmd *cmd)
882 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN)
885 if (cmd->scan_begin_src == TRIG_FOLLOW)
891 static unsigned int labpc_ai_convert_period(const struct comedi_cmd *cmd)
893 if (cmd->convert_src != TRIG_TIMER)
896 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
897 cmd->scan_begin_src == TRIG_TIMER)
898 return cmd->scan_begin_arg;
900 return cmd->convert_arg;
903 static void labpc_set_ai_convert_period(struct comedi_cmd *cmd, unsigned int ns)
905 if (cmd->convert_src != TRIG_TIMER)
908 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
909 cmd->scan_begin_src == TRIG_TIMER) {
910 cmd->scan_begin_arg = ns;
911 if (cmd->convert_arg > cmd->scan_begin_arg)
912 cmd->convert_arg = cmd->scan_begin_arg;
914 cmd->convert_arg = ns;
917 static unsigned int labpc_ai_scan_period(const struct comedi_cmd *cmd)
919 if (cmd->scan_begin_src != TRIG_TIMER)
922 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
923 cmd->convert_src == TRIG_TIMER)
926 return cmd->scan_begin_arg;
929 static void labpc_set_ai_scan_period(struct comedi_cmd *cmd, unsigned int ns)
931 if (cmd->scan_begin_src != TRIG_TIMER)
934 if (labpc_ai_scan_mode(cmd) == MODE_SINGLE_CHAN &&
935 cmd->convert_src == TRIG_TIMER)
938 cmd->scan_begin_arg = ns;
941 static int labpc_ai_cmdtest(struct comedi_device *dev,
942 struct comedi_subdevice *s, struct comedi_cmd *cmd)
948 /* step 1: make sure trigger sources are trivially valid */
950 tmp = cmd->start_src;
951 cmd->start_src &= TRIG_NOW | TRIG_EXT;
952 if (!cmd->start_src || tmp != cmd->start_src)
955 tmp = cmd->scan_begin_src;
956 cmd->scan_begin_src &= TRIG_TIMER | TRIG_FOLLOW | TRIG_EXT;
957 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
960 tmp = cmd->convert_src;
961 cmd->convert_src &= TRIG_TIMER | TRIG_EXT;
962 if (!cmd->convert_src || tmp != cmd->convert_src)
965 tmp = cmd->scan_end_src;
966 cmd->scan_end_src &= TRIG_COUNT;
967 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
971 stop_mask = TRIG_COUNT | TRIG_NONE;
972 if (thisboard->register_layout == labpc_1200_layout)
973 stop_mask |= TRIG_EXT;
974 cmd->stop_src &= stop_mask;
975 if (!cmd->stop_src || tmp != cmd->stop_src)
981 /* step 2: make sure trigger sources are unique and mutually compatible */
983 if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT)
985 if (cmd->scan_begin_src != TRIG_TIMER &&
986 cmd->scan_begin_src != TRIG_FOLLOW &&
987 cmd->scan_begin_src != TRIG_EXT)
989 if (cmd->convert_src != TRIG_TIMER && cmd->convert_src != TRIG_EXT)
991 if (cmd->stop_src != TRIG_COUNT &&
992 cmd->stop_src != TRIG_EXT && cmd->stop_src != TRIG_NONE)
995 /* can't have external stop and start triggers at once */
996 if (cmd->start_src == TRIG_EXT && cmd->stop_src == TRIG_EXT)
1002 /* step 3: make sure arguments are trivially compatible */
1004 if (cmd->start_arg == TRIG_NOW && cmd->start_arg != 0) {
1009 if (!cmd->chanlist_len) {
1012 if (cmd->scan_end_arg != cmd->chanlist_len) {
1013 cmd->scan_end_arg = cmd->chanlist_len;
1017 if (cmd->convert_src == TRIG_TIMER) {
1018 if (cmd->convert_arg < thisboard->ai_speed) {
1019 cmd->convert_arg = thisboard->ai_speed;
1023 /* make sure scan timing is not too fast */
1024 if (cmd->scan_begin_src == TRIG_TIMER) {
1025 if (cmd->convert_src == TRIG_TIMER &&
1026 cmd->scan_begin_arg <
1027 cmd->convert_arg * cmd->chanlist_len) {
1028 cmd->scan_begin_arg =
1029 cmd->convert_arg * cmd->chanlist_len;
1032 if (cmd->scan_begin_arg <
1033 thisboard->ai_speed * cmd->chanlist_len) {
1034 cmd->scan_begin_arg =
1035 thisboard->ai_speed * cmd->chanlist_len;
1040 switch (cmd->stop_src) {
1042 if (!cmd->stop_arg) {
1048 if (cmd->stop_arg != 0) {
1053 /* TRIG_EXT doesn't care since it doesn't trigger off a numbered channel */
1061 /* step 4: fix up any arguments */
1063 tmp = cmd->convert_arg;
1064 tmp2 = cmd->scan_begin_arg;
1065 labpc_adc_timing(dev, cmd);
1066 if (tmp != cmd->convert_arg || tmp2 != cmd->scan_begin_arg)
1072 if (labpc_ai_chanlist_invalid(dev, cmd))
1078 static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
1080 int channel, range, aref;
1081 unsigned long irq_flags;
1083 struct comedi_async *async = s->async;
1084 struct comedi_cmd *cmd = &async->cmd;
1085 enum transfer_type xfer;
1086 unsigned long flags;
1089 comedi_error(dev, "no irq assigned, cannot perform command");
1093 range = CR_RANGE(cmd->chanlist[0]);
1094 aref = CR_AREF(cmd->chanlist[0]);
1096 /* make sure board is disabled before setting up aquisition */
1097 spin_lock_irqsave(&dev->spinlock, flags);
1098 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
1099 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1100 spin_unlock_irqrestore(&dev->spinlock, flags);
1102 devpriv->command3_bits = 0;
1103 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1105 /* initialize software conversion count */
1106 if (cmd->stop_src == TRIG_COUNT) {
1107 devpriv->count = cmd->stop_arg * cmd->chanlist_len;
1109 /* setup hardware conversion counter */
1110 if (cmd->stop_src == TRIG_EXT) {
1111 /* load counter a1 with count of 3 (pc+ manual says this is minimum allowed) using mode 0 */
1112 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
1115 comedi_error(dev, "error loading counter a1");
1118 } else /* otherwise, just put a1 in mode 0 with no count to set its output low */
1119 devpriv->write_byte(INIT_A1_BITS,
1120 dev->iobase + COUNTER_A_CONTROL_REG);
1122 /* figure out what method we will use to transfer data */
1123 if (devpriv->dma_chan && /* need a dma channel allocated */
1124 /* dma unsafe at RT priority, and too much setup time for TRIG_WAKE_EOS for */
1125 (cmd->flags & (TRIG_WAKE_EOS | TRIG_RT)) == 0 &&
1126 /* only available on the isa boards */
1127 thisboard->bustype == isa_bustype) {
1128 xfer = isa_dma_transfer;
1129 } else if (thisboard->register_layout == labpc_1200_layout && /* pc-plus has no fifo-half full interrupt */
1130 /* wake-end-of-scan should interrupt on fifo not empty */
1131 (cmd->flags & TRIG_WAKE_EOS) == 0 &&
1132 /* make sure we are taking more than just a few points */
1133 (cmd->stop_src != TRIG_COUNT || devpriv->count > 256)) {
1134 xfer = fifo_half_full_transfer;
1136 xfer = fifo_not_empty_transfer;
1137 devpriv->current_transfer = xfer;
1139 /* setup command6 register for 1200 boards */
1140 if (thisboard->register_layout == labpc_1200_layout) {
1141 /* reference inputs to ground or common? */
1142 if (aref != AREF_GROUND)
1143 devpriv->command6_bits |= ADC_COMMON_BIT;
1145 devpriv->command6_bits &= ~ADC_COMMON_BIT;
1146 /* bipolar or unipolar range? */
1147 if (thisboard->ai_range_is_unipolar[range])
1148 devpriv->command6_bits |= ADC_UNIP_BIT;
1150 devpriv->command6_bits &= ~ADC_UNIP_BIT;
1151 /* interrupt on fifo half full? */
1152 if (xfer == fifo_half_full_transfer)
1153 devpriv->command6_bits |= ADC_FHF_INTR_EN_BIT;
1155 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
1156 /* enable interrupt on counter a1 terminal count? */
1157 if (cmd->stop_src == TRIG_EXT)
1158 devpriv->command6_bits |= A1_INTR_EN_BIT;
1160 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
1161 /* are we scanning up or down through channels? */
1162 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP)
1163 devpriv->command6_bits |= ADC_SCAN_UP_BIT;
1165 devpriv->command6_bits &= ~ADC_SCAN_UP_BIT;
1166 /* write to register */
1167 devpriv->write_byte(devpriv->command6_bits,
1168 dev->iobase + COMMAND6_REG);
1171 /* setup channel list, etc (command1 register) */
1172 devpriv->command1_bits = 0;
1173 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP)
1174 channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
1176 channel = CR_CHAN(cmd->chanlist[0]);
1177 /* munge channel bits for differential / scan disabled mode */
1178 if (labpc_ai_scan_mode(cmd) != MODE_SINGLE_CHAN && aref == AREF_DIFF)
1180 devpriv->command1_bits |= ADC_CHAN_BITS(channel);
1181 devpriv->command1_bits |= thisboard->ai_range_code[range];
1182 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
1183 /* manual says to set scan enable bit on second pass */
1184 if (labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_UP ||
1185 labpc_ai_scan_mode(cmd) == MODE_MULT_CHAN_DOWN) {
1186 devpriv->command1_bits |= ADC_SCAN_EN_BIT;
1187 /* need a brief delay before enabling scan, or scan list will get screwed when you switch
1188 * between scan up to scan down mode - dunno why */
1190 devpriv->write_byte(devpriv->command1_bits,
1191 dev->iobase + COMMAND1_REG);
1193 /* setup any external triggering/pacing (command4 register) */
1194 devpriv->command4_bits = 0;
1195 if (cmd->convert_src != TRIG_EXT)
1196 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
1197 /* XXX should discard first scan when using interval scanning
1198 * since manual says it is not synced with scan clock */
1199 if (labpc_use_continuous_mode(cmd) == 0) {
1200 devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT;
1201 if (cmd->scan_begin_src == TRIG_EXT)
1202 devpriv->command4_bits |= EXT_SCAN_EN_BIT;
1204 /* single-ended/differential */
1205 if (aref == AREF_DIFF)
1206 devpriv->command4_bits |= ADC_DIFF_BIT;
1207 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1209 devpriv->write_byte(cmd->chanlist_len,
1210 dev->iobase + INTERVAL_COUNT_REG);
1212 devpriv->write_byte(INTERVAL_LOAD_BITS,
1213 dev->iobase + INTERVAL_LOAD_REG);
1215 if (cmd->convert_src == TRIG_TIMER || cmd->scan_begin_src == TRIG_TIMER) {
1217 labpc_adc_timing(dev, cmd);
1218 /* load counter b0 in mode 3 */
1219 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
1220 0, devpriv->divisor_b0, 3);
1222 comedi_error(dev, "error loading counter b0");
1226 /* set up conversion pacing */
1227 if (labpc_ai_convert_period(cmd)) {
1228 /* load counter a0 in mode 2 */
1229 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
1230 0, devpriv->divisor_a0, 2);
1232 comedi_error(dev, "error loading counter a0");
1236 devpriv->write_byte(INIT_A0_BITS,
1237 dev->iobase + COUNTER_A_CONTROL_REG);
1239 /* set up scan pacing */
1240 if (labpc_ai_scan_period(cmd)) {
1241 /* load counter b1 in mode 2 */
1242 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
1243 1, devpriv->divisor_b1, 2);
1245 comedi_error(dev, "error loading counter b1");
1250 labpc_clear_adc_fifo(dev);
1252 /* set up dma transfer */
1253 if (xfer == isa_dma_transfer) {
1254 irq_flags = claim_dma_lock();
1255 disable_dma(devpriv->dma_chan);
1256 /* clear flip-flop to make sure 2-byte registers for
1257 * count and address get set correctly */
1258 clear_dma_ff(devpriv->dma_chan);
1259 set_dma_addr(devpriv->dma_chan,
1260 virt_to_bus(devpriv->dma_buffer));
1261 /* set appropriate size of transfer */
1262 devpriv->dma_transfer_size = labpc_suggest_transfer_size(*cmd);
1263 if (cmd->stop_src == TRIG_COUNT &&
1264 devpriv->count * sample_size < devpriv->dma_transfer_size) {
1265 devpriv->dma_transfer_size =
1266 devpriv->count * sample_size;
1268 set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
1269 enable_dma(devpriv->dma_chan);
1270 release_dma_lock(irq_flags);
1271 /* enable board's dma */
1272 devpriv->command3_bits |= DMA_EN_BIT | DMATC_INTR_EN_BIT;
1274 devpriv->command3_bits &= ~DMA_EN_BIT & ~DMATC_INTR_EN_BIT;
1276 /* enable error interrupts */
1277 devpriv->command3_bits |= ERR_INTR_EN_BIT;
1278 /* enable fifo not empty interrupt? */
1279 if (xfer == fifo_not_empty_transfer)
1280 devpriv->command3_bits |= ADC_FNE_INTR_EN_BIT;
1282 devpriv->command3_bits &= ~ADC_FNE_INTR_EN_BIT;
1283 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1285 /* startup aquisition */
1288 /* use 2 cascaded counters for pacing */
1289 spin_lock_irqsave(&dev->spinlock, flags);
1290 devpriv->command2_bits |= CASCADE_BIT;
1291 switch (cmd->start_src) {
1293 devpriv->command2_bits |= HWTRIG_BIT;
1294 devpriv->command2_bits &= ~PRETRIG_BIT & ~SWTRIG_BIT;
1297 devpriv->command2_bits |= SWTRIG_BIT;
1298 devpriv->command2_bits &= ~PRETRIG_BIT & ~HWTRIG_BIT;
1301 comedi_error(dev, "bug with start_src");
1305 switch (cmd->stop_src) {
1307 devpriv->command2_bits |= HWTRIG_BIT | PRETRIG_BIT;
1313 comedi_error(dev, "bug with stop_src");
1316 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1317 spin_unlock_irqrestore(&dev->spinlock, flags);
1322 /* interrupt service routine */
1323 static irqreturn_t labpc_interrupt(int irq, void *d)
1325 struct comedi_device *dev = d;
1326 struct comedi_subdevice *s = dev->read_subdev;
1327 struct comedi_async *async;
1328 struct comedi_cmd *cmd;
1330 if (dev->attached == 0) {
1331 comedi_error(dev, "premature interrupt");
1339 /* read board status */
1340 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1341 if (thisboard->register_layout == labpc_1200_layout)
1342 devpriv->status2_bits =
1343 devpriv->read_byte(dev->iobase + STATUS2_REG);
1345 if ((devpriv->status1_bits & (DMATC_BIT | TIMER_BIT | OVERFLOW_BIT |
1346 OVERRUN_BIT | DATA_AVAIL_BIT)) == 0
1347 && (devpriv->status2_bits & A1_TC_BIT) == 0
1348 && (devpriv->status2_bits & FNHF_BIT)) {
1352 if (devpriv->status1_bits & OVERRUN_BIT) {
1353 /* clear error interrupt */
1354 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1355 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1356 comedi_event(dev, s);
1357 comedi_error(dev, "overrun");
1361 if (devpriv->current_transfer == isa_dma_transfer) {
1362 /* if a dma terminal count of external stop trigger has occurred */
1363 if (devpriv->status1_bits & DMATC_BIT ||
1364 (thisboard->register_layout == labpc_1200_layout
1365 && devpriv->status2_bits & A1_TC_BIT)) {
1366 handle_isa_dma(dev);
1369 labpc_drain_fifo(dev);
1371 if (devpriv->status1_bits & TIMER_BIT) {
1372 comedi_error(dev, "handled timer interrupt?");
1374 devpriv->write_byte(0x1, dev->iobase + TIMER_CLEAR_REG);
1377 if (devpriv->status1_bits & OVERFLOW_BIT) {
1378 /* clear error interrupt */
1379 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1380 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1381 comedi_event(dev, s);
1382 comedi_error(dev, "overflow");
1385 /* handle external stop trigger */
1386 if (cmd->stop_src == TRIG_EXT) {
1387 if (devpriv->status2_bits & A1_TC_BIT) {
1388 labpc_drain_dregs(dev);
1389 labpc_cancel(dev, s);
1390 async->events |= COMEDI_CB_EOA;
1394 /* TRIG_COUNT end of acquisition */
1395 if (cmd->stop_src == TRIG_COUNT) {
1396 if (devpriv->count == 0) {
1397 labpc_cancel(dev, s);
1398 async->events |= COMEDI_CB_EOA;
1402 comedi_event(dev, s);
1406 /* read all available samples from ai fifo */
1407 static int labpc_drain_fifo(struct comedi_device *dev)
1409 unsigned int lsb, msb;
1411 struct comedi_async *async = dev->read_subdev->async;
1412 const int timeout = 10000;
1415 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1417 for (i = 0; (devpriv->status1_bits & DATA_AVAIL_BIT) && i < timeout;
1419 /* quit if we have all the data we want */
1420 if (async->cmd.stop_src == TRIG_COUNT) {
1421 if (devpriv->count == 0)
1425 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1426 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1427 data = (msb << 8) | lsb;
1428 cfc_write_to_buffer(dev->read_subdev, data);
1429 devpriv->status1_bits =
1430 devpriv->read_byte(dev->iobase + STATUS1_REG);
1433 comedi_error(dev, "ai timeout, fifo never empties");
1434 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1441 static void labpc_drain_dma(struct comedi_device *dev)
1443 struct comedi_subdevice *s = dev->read_subdev;
1444 struct comedi_async *async = s->async;
1446 unsigned long flags;
1447 unsigned int max_points, num_points, residue, leftover;
1450 status = devpriv->status1_bits;
1452 flags = claim_dma_lock();
1453 disable_dma(devpriv->dma_chan);
1454 /* clear flip-flop to make sure 2-byte registers for
1455 * count and address get set correctly */
1456 clear_dma_ff(devpriv->dma_chan);
1458 /* figure out how many points to read */
1459 max_points = devpriv->dma_transfer_size / sample_size;
1460 /* residue is the number of points left to be done on the dma
1461 * transfer. It should always be zero at this point unless
1462 * the stop_src is set to external triggering.
1464 residue = get_dma_residue(devpriv->dma_chan) / sample_size;
1465 num_points = max_points - residue;
1466 if (devpriv->count < num_points && async->cmd.stop_src == TRIG_COUNT)
1467 num_points = devpriv->count;
1469 /* figure out how many points will be stored next time */
1471 if (async->cmd.stop_src != TRIG_COUNT) {
1472 leftover = devpriv->dma_transfer_size / sample_size;
1473 } else if (devpriv->count > num_points) {
1474 leftover = devpriv->count - num_points;
1475 if (leftover > max_points)
1476 leftover = max_points;
1479 /* write data to comedi buffer */
1480 for (i = 0; i < num_points; i++) {
1481 cfc_write_to_buffer(s, devpriv->dma_buffer[i]);
1483 if (async->cmd.stop_src == TRIG_COUNT)
1484 devpriv->count -= num_points;
1486 /* set address and count for next transfer */
1487 set_dma_addr(devpriv->dma_chan, virt_to_bus(devpriv->dma_buffer));
1488 set_dma_count(devpriv->dma_chan, leftover * sample_size);
1489 release_dma_lock(flags);
1491 async->events |= COMEDI_CB_BLOCK;
1494 static void handle_isa_dma(struct comedi_device *dev)
1496 labpc_drain_dma(dev);
1498 enable_dma(devpriv->dma_chan);
1500 /* clear dma tc interrupt */
1501 devpriv->write_byte(0x1, dev->iobase + DMATC_CLEAR_REG);
1504 /* makes sure all data aquired by board is transfered to comedi (used
1505 * when aquisition is terminated by stop_src == TRIG_EXT). */
1506 static void labpc_drain_dregs(struct comedi_device *dev)
1508 if (devpriv->current_transfer == isa_dma_transfer)
1509 labpc_drain_dma(dev);
1511 labpc_drain_fifo(dev);
1514 static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1515 struct comedi_insn *insn, unsigned int *data)
1521 unsigned long flags;
1523 /* disable timed conversions */
1524 spin_lock_irqsave(&dev->spinlock, flags);
1525 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
1526 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1527 spin_unlock_irqrestore(&dev->spinlock, flags);
1529 /* disable interrupt generation and dma */
1530 devpriv->command3_bits = 0;
1531 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1533 /* set gain and channel */
1534 devpriv->command1_bits = 0;
1535 chan = CR_CHAN(insn->chanspec);
1536 range = CR_RANGE(insn->chanspec);
1537 devpriv->command1_bits |= thisboard->ai_range_code[range];
1538 /* munge channel bits for differential/scan disabled mode */
1539 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1541 devpriv->command1_bits |= ADC_CHAN_BITS(chan);
1542 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
1544 /* setup command6 register for 1200 boards */
1545 if (thisboard->register_layout == labpc_1200_layout) {
1546 /* reference inputs to ground or common? */
1547 if (CR_AREF(insn->chanspec) != AREF_GROUND)
1548 devpriv->command6_bits |= ADC_COMMON_BIT;
1550 devpriv->command6_bits &= ~ADC_COMMON_BIT;
1551 /* bipolar or unipolar range? */
1552 if (thisboard->ai_range_is_unipolar[range])
1553 devpriv->command6_bits |= ADC_UNIP_BIT;
1555 devpriv->command6_bits &= ~ADC_UNIP_BIT;
1556 /* don't interrupt on fifo half full */
1557 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
1558 /* don't enable interrupt on counter a1 terminal count? */
1559 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
1560 /* write to register */
1561 devpriv->write_byte(devpriv->command6_bits,
1562 dev->iobase + COMMAND6_REG);
1564 /* setup command4 register */
1565 devpriv->command4_bits = 0;
1566 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
1567 /* single-ended/differential */
1568 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1569 devpriv->command4_bits |= ADC_DIFF_BIT;
1570 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1572 /* initialize pacer counter output to make sure it doesn't cause any problems */
1573 devpriv->write_byte(INIT_A0_BITS, dev->iobase + COUNTER_A_CONTROL_REG);
1575 labpc_clear_adc_fifo(dev);
1577 for (n = 0; n < insn->n; n++) {
1578 /* trigger conversion */
1579 devpriv->write_byte(0x1, dev->iobase + ADC_CONVERT_REG);
1581 for (i = 0; i < timeout; i++) {
1582 if (devpriv->read_byte(dev->iobase +
1583 STATUS1_REG) & DATA_AVAIL_BIT)
1588 comedi_error(dev, "timeout");
1591 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1592 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1593 data[n] = (msb << 8) | lsb;
1599 /* analog output insn */
1600 static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1601 struct comedi_insn *insn, unsigned int *data)
1604 unsigned long flags;
1607 channel = CR_CHAN(insn->chanspec);
1609 /* turn off pacing of analog output channel */
1610 /* note: hardware bug in daqcard-1200 means pacing cannot
1611 * be independently enabled/disabled for its the two channels */
1612 spin_lock_irqsave(&dev->spinlock, flags);
1613 devpriv->command2_bits &= ~DAC_PACED_BIT(channel);
1614 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1615 spin_unlock_irqrestore(&dev->spinlock, flags);
1618 if (thisboard->register_layout == labpc_1200_layout) {
1619 range = CR_RANGE(insn->chanspec);
1620 if (range & AO_RANGE_IS_UNIPOLAR)
1621 devpriv->command6_bits |= DAC_UNIP_BIT(channel);
1623 devpriv->command6_bits &= ~DAC_UNIP_BIT(channel);
1624 /* write to register */
1625 devpriv->write_byte(devpriv->command6_bits,
1626 dev->iobase + COMMAND6_REG);
1629 lsb = data[0] & 0xff;
1630 msb = (data[0] >> 8) & 0xff;
1631 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(channel));
1632 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(channel));
1634 /* remember value for readback */
1635 devpriv->ao_value[channel] = data[0];
1640 /* analog output readback insn */
1641 static int labpc_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1642 struct comedi_insn *insn, unsigned int *data)
1644 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
1649 static int labpc_calib_read_insn(struct comedi_device *dev,
1650 struct comedi_subdevice *s,
1651 struct comedi_insn *insn, unsigned int *data)
1653 data[0] = devpriv->caldac[CR_CHAN(insn->chanspec)];
1658 static int labpc_calib_write_insn(struct comedi_device *dev,
1659 struct comedi_subdevice *s,
1660 struct comedi_insn *insn, unsigned int *data)
1662 int channel = CR_CHAN(insn->chanspec);
1664 write_caldac(dev, channel, data[0]);
1668 static int labpc_eeprom_read_insn(struct comedi_device *dev,
1669 struct comedi_subdevice *s,
1670 struct comedi_insn *insn, unsigned int *data)
1672 data[0] = devpriv->eeprom_data[CR_CHAN(insn->chanspec)];
1677 static int labpc_eeprom_write_insn(struct comedi_device *dev,
1678 struct comedi_subdevice *s,
1679 struct comedi_insn *insn, unsigned int *data)
1681 int channel = CR_CHAN(insn->chanspec);
1684 /* only allow writes to user area of eeprom */
1685 if (channel < 16 || channel > 127) {
1687 ("eeprom writes are only allowed to channels 16 through 127 (the pointer and user areas)");
1691 ret = labpc_eeprom_write(dev, channel, data[0]);
1698 /* utility function that suggests a dma transfer size in bytes */
1699 static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd)
1704 if (cmd.convert_src == TRIG_TIMER)
1705 freq = 1000000000 / cmd.convert_arg;
1706 /* return some default value */
1710 /* make buffer fill in no more than 1/3 second */
1711 size = (freq / 3) * sample_size;
1713 /* set a minimum and maximum size allowed */
1714 if (size > dma_buffer_size)
1715 size = dma_buffer_size - dma_buffer_size % sample_size;
1716 else if (size < sample_size)
1722 /* figures out what counter values to use based on command */
1723 static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd)
1725 const int max_counter_value = 0x10000; /* max value for 16 bit counter in mode 2 */
1726 const int min_counter_value = 2; /* min value for 16 bit counter in mode 2 */
1727 unsigned int base_period;
1729 /* if both convert and scan triggers are TRIG_TIMER, then they both rely on counter b0 */
1730 if (labpc_ai_convert_period(cmd) && labpc_ai_scan_period(cmd)) {
1731 /* pick the lowest b0 divisor value we can (for maximum input clock speed on convert and scan counters) */
1732 devpriv->divisor_b0 = (labpc_ai_scan_period(cmd) - 1) /
1733 (LABPC_TIMER_BASE * max_counter_value) + 1;
1734 if (devpriv->divisor_b0 < min_counter_value)
1735 devpriv->divisor_b0 = min_counter_value;
1736 if (devpriv->divisor_b0 > max_counter_value)
1737 devpriv->divisor_b0 = max_counter_value;
1739 base_period = LABPC_TIMER_BASE * devpriv->divisor_b0;
1741 /* set a0 for conversion frequency and b1 for scan frequency */
1742 switch (cmd->flags & TRIG_ROUND_MASK) {
1744 case TRIG_ROUND_NEAREST:
1745 devpriv->divisor_a0 =
1746 (labpc_ai_convert_period(cmd) +
1747 (base_period / 2)) / base_period;
1748 devpriv->divisor_b1 =
1749 (labpc_ai_scan_period(cmd) +
1750 (base_period / 2)) / base_period;
1753 devpriv->divisor_a0 =
1754 (labpc_ai_convert_period(cmd) + (base_period -
1756 devpriv->divisor_b1 =
1757 (labpc_ai_scan_period(cmd) + (base_period -
1760 case TRIG_ROUND_DOWN:
1761 devpriv->divisor_a0 =
1762 labpc_ai_convert_period(cmd) / base_period;
1763 devpriv->divisor_b1 =
1764 labpc_ai_scan_period(cmd) / base_period;
1767 /* make sure a0 and b1 values are acceptable */
1768 if (devpriv->divisor_a0 < min_counter_value)
1769 devpriv->divisor_a0 = min_counter_value;
1770 if (devpriv->divisor_a0 > max_counter_value)
1771 devpriv->divisor_a0 = max_counter_value;
1772 if (devpriv->divisor_b1 < min_counter_value)
1773 devpriv->divisor_b1 = min_counter_value;
1774 if (devpriv->divisor_b1 > max_counter_value)
1775 devpriv->divisor_b1 = max_counter_value;
1776 /* write corrected timings to command */
1777 labpc_set_ai_convert_period(cmd,
1778 base_period * devpriv->divisor_a0);
1779 labpc_set_ai_scan_period(cmd,
1780 base_period * devpriv->divisor_b1);
1781 /* if only one TRIG_TIMER is used, we can employ the generic cascaded timing functions */
1782 } else if (labpc_ai_scan_period(cmd)) {
1783 unsigned int scan_period;
1785 scan_period = labpc_ai_scan_period(cmd);
1786 /* calculate cascaded counter values that give desired scan timing */
1787 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
1788 &(devpriv->divisor_b1),
1789 &(devpriv->divisor_b0),
1791 cmd->flags & TRIG_ROUND_MASK);
1792 labpc_set_ai_scan_period(cmd, scan_period);
1793 } else if (labpc_ai_convert_period(cmd)) {
1794 unsigned int convert_period;
1796 convert_period = labpc_ai_convert_period(cmd);
1797 /* calculate cascaded counter values that give desired conversion timing */
1798 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
1799 &(devpriv->divisor_a0),
1800 &(devpriv->divisor_b0),
1802 cmd->flags & TRIG_ROUND_MASK);
1803 labpc_set_ai_convert_period(cmd, convert_period);
1807 static int labpc_dio_mem_callback(int dir, int port, int data,
1808 unsigned long iobase)
1811 writeb(data, (void *)(iobase + port));
1814 return readb((void *)(iobase + port));
1818 /* lowlevel write to eeprom/dac */
1819 static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
1820 unsigned int value_width)
1824 for (i = 1; i <= value_width; i++) {
1825 /* clear serial clock */
1826 devpriv->command5_bits &= ~SCLOCK_BIT;
1827 /* send bits most significant bit first */
1828 if (value & (1 << (value_width - i)))
1829 devpriv->command5_bits |= SDATA_BIT;
1831 devpriv->command5_bits &= ~SDATA_BIT;
1833 devpriv->write_byte(devpriv->command5_bits,
1834 dev->iobase + COMMAND5_REG);
1835 /* set clock to load bit */
1836 devpriv->command5_bits |= SCLOCK_BIT;
1838 devpriv->write_byte(devpriv->command5_bits,
1839 dev->iobase + COMMAND5_REG);
1843 /* lowlevel read from eeprom */
1844 static unsigned int labpc_serial_in(struct comedi_device *dev)
1846 unsigned int value = 0;
1848 const int value_width = 8; /* number of bits wide values are */
1850 for (i = 1; i <= value_width; i++) {
1851 /* set serial clock */
1852 devpriv->command5_bits |= SCLOCK_BIT;
1854 devpriv->write_byte(devpriv->command5_bits,
1855 dev->iobase + COMMAND5_REG);
1856 /* clear clock bit */
1857 devpriv->command5_bits &= ~SCLOCK_BIT;
1859 devpriv->write_byte(devpriv->command5_bits,
1860 dev->iobase + COMMAND5_REG);
1861 /* read bits most significant bit first */
1863 devpriv->status2_bits =
1864 devpriv->read_byte(dev->iobase + STATUS2_REG);
1865 if (devpriv->status2_bits & EEPROM_OUT_BIT) {
1866 value |= 1 << (value_width - i);
1873 static unsigned int labpc_eeprom_read(struct comedi_device *dev,
1874 unsigned int address)
1877 const int read_instruction = 0x3; /* bits to tell eeprom to expect a read */
1878 const int write_length = 8; /* 8 bit write lengths to eeprom */
1880 /* enable read/write to eeprom */
1881 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1883 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1884 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1886 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1888 /* send read instruction */
1889 labpc_serial_out(dev, read_instruction, write_length);
1890 /* send 8 bit address to read from */
1891 labpc_serial_out(dev, address, write_length);
1893 value = labpc_serial_in(dev);
1895 /* disable read/write to eeprom */
1896 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1898 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1903 static unsigned int labpc_eeprom_write(struct comedi_device *dev,
1904 unsigned int address, unsigned int value)
1906 const int write_enable_instruction = 0x6;
1907 const int write_instruction = 0x2;
1908 const int write_length = 8; /* 8 bit write lengths to eeprom */
1909 const int write_in_progress_bit = 0x1;
1910 const int timeout = 10000;
1913 /* make sure there isn't already a write in progress */
1914 for (i = 0; i < timeout; i++) {
1915 if ((labpc_eeprom_read_status(dev) & write_in_progress_bit) ==
1920 comedi_error(dev, "eeprom write timed out");
1923 /* update software copy of eeprom */
1924 devpriv->eeprom_data[address] = value;
1926 /* enable read/write to eeprom */
1927 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1929 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1930 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1932 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1934 /* send write_enable instruction */
1935 labpc_serial_out(dev, write_enable_instruction, write_length);
1936 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1938 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1940 /* send write instruction */
1941 devpriv->command5_bits |= EEPROM_EN_BIT;
1943 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1944 labpc_serial_out(dev, write_instruction, write_length);
1945 /* send 8 bit address to write to */
1946 labpc_serial_out(dev, address, write_length);
1948 labpc_serial_out(dev, value, write_length);
1949 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1951 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1953 /* disable read/write to eeprom */
1954 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1956 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1961 static unsigned int labpc_eeprom_read_status(struct comedi_device *dev)
1964 const int read_status_instruction = 0x5;
1965 const int write_length = 8; /* 8 bit write lengths to eeprom */
1967 /* enable read/write to eeprom */
1968 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1970 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1971 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1973 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1975 /* send read status instruction */
1976 labpc_serial_out(dev, read_status_instruction, write_length);
1978 value = labpc_serial_in(dev);
1980 /* disable read/write to eeprom */
1981 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1983 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1988 /* writes to 8 bit calibration dacs */
1989 static void write_caldac(struct comedi_device *dev, unsigned int channel,
1992 if (value == devpriv->caldac[channel])
1994 devpriv->caldac[channel] = value;
1996 /* clear caldac load bit and make sure we don't write to eeprom */
1997 devpriv->command5_bits &=
1998 ~CALDAC_LOAD_BIT & ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
2000 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2002 /* write 4 bit channel */
2003 labpc_serial_out(dev, channel, 4);
2004 /* write 8 bit caldac value */
2005 labpc_serial_out(dev, value, 8);
2007 /* set and clear caldac bit to load caldac value */
2008 devpriv->command5_bits |= CALDAC_LOAD_BIT;
2010 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2011 devpriv->command5_bits &= ~CALDAC_LOAD_BIT;
2013 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
2016 #ifdef CONFIG_COMEDI_PCI
2017 COMEDI_PCI_INITCLEANUP(driver_labpc, labpc_pci_table);
2019 COMEDI_INITCLEANUP(driver_labpc);
2022 EXPORT_SYMBOL_GPL(labpc_common_attach);
2023 EXPORT_SYMBOL_GPL(labpc_common_detach);
2024 EXPORT_SYMBOL_GPL(range_labpc_1200_ai);
2025 EXPORT_SYMBOL_GPL(labpc_1200_ai_gain_bits);
2026 EXPORT_SYMBOL_GPL(labpc_1200_is_unipolar);