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 http://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)
76 #include <linux/pci.h>
77 #include <linux/interrupt.h>
78 #include <linux/slab.h>
80 #include <linux/delay.h>
82 #include "../comedidev.h"
89 #include "comedi_fc.h"
92 #define DRV_NAME "ni_labpc"
94 /* size of io region used by board */
96 /* 2 MHz master clock */
97 #define LABPC_TIMER_BASE 500
99 /* Registers for the lab-pc+ */
101 /* write-only registers */
102 #define COMMAND1_REG 0x0
103 #define ADC_GAIN_MASK (0x7 << 4)
104 #define ADC_CHAN_BITS(x) ((x) & 0x7)
105 /* enables multi channel scans */
106 #define ADC_SCAN_EN_BIT 0x80
107 #define COMMAND2_REG 0x1
108 /* enable pretriggering (used in conjunction with SWTRIG) */
109 #define PRETRIG_BIT 0x1
110 /* enable paced conversions on external trigger */
111 #define HWTRIG_BIT 0x2
112 /* enable paced conversions */
113 #define SWTRIG_BIT 0x4
114 /* use two cascaded counters for pacing */
115 #define CASCADE_BIT 0x8
116 #define DAC_PACED_BIT(channel) (0x40 << ((channel) & 0x1))
117 #define COMMAND3_REG 0x2
118 /* enable dma transfers */
119 #define DMA_EN_BIT 0x1
120 /* enable interrupts for 8255 */
121 #define DIO_INTR_EN_BIT 0x2
122 /* enable dma terminal count interrupt */
123 #define DMATC_INTR_EN_BIT 0x4
124 /* enable timer interrupt */
125 #define TIMER_INTR_EN_BIT 0x8
126 /* enable error interrupt */
127 #define ERR_INTR_EN_BIT 0x10
128 /* enable fifo not empty interrupt */
129 #define ADC_FNE_INTR_EN_BIT 0x20
130 #define ADC_CONVERT_REG 0x3
131 #define DAC_LSB_REG(channel) (0x4 + 2 * ((channel) & 0x1))
132 #define DAC_MSB_REG(channel) (0x5 + 2 * ((channel) & 0x1))
133 #define ADC_CLEAR_REG 0x8
134 #define DMATC_CLEAR_REG 0xa
135 #define TIMER_CLEAR_REG 0xc
136 /* 1200 boards only */
137 #define COMMAND6_REG 0xe
138 /* select ground or common-mode reference */
139 #define ADC_COMMON_BIT 0x1
141 #define ADC_UNIP_BIT 0x2
143 #define DAC_UNIP_BIT(channel) (0x4 << ((channel) & 0x1))
144 /* enable fifo half full interrupt */
145 #define ADC_FHF_INTR_EN_BIT 0x20
146 /* enable interrupt on end of hardware count */
147 #define A1_INTR_EN_BIT 0x40
148 /* scan up from channel zero instead of down to zero */
149 #define ADC_SCAN_UP_BIT 0x80
150 #define COMMAND4_REG 0xf
151 /* enables 'interval' scanning */
152 #define INTERVAL_SCAN_EN_BIT 0x1
153 /* enables external signal on counter b1 output to trigger scan */
154 #define EXT_SCAN_EN_BIT 0x2
155 /* chooses direction (output or input) for EXTCONV* line */
156 #define EXT_CONVERT_OUT_BIT 0x4
157 /* chooses differential inputs for adc (in conjunction with board jumper) */
158 #define ADC_DIFF_BIT 0x8
159 #define EXT_CONVERT_DISABLE_BIT 0x10
160 /* 1200 boards only, calibration stuff */
161 #define COMMAND5_REG 0x1c
162 /* enable eeprom for write */
163 #define EEPROM_WRITE_UNPROTECT_BIT 0x4
164 /* enable dithering */
165 #define DITHER_EN_BIT 0x8
166 /* load calibration dac */
167 #define CALDAC_LOAD_BIT 0x10
168 /* serial clock - rising edge writes, falling edge reads */
169 #define SCLOCK_BIT 0x20
170 /* serial data bit for writing to eeprom or calibration dacs */
171 #define SDATA_BIT 0x40
172 /* enable eeprom for read/write */
173 #define EEPROM_EN_BIT 0x80
174 #define INTERVAL_COUNT_REG 0x1e
175 #define INTERVAL_LOAD_REG 0x1f
176 #define INTERVAL_LOAD_BITS 0x1
178 /* read-only registers */
179 #define STATUS1_REG 0x0
180 /* data is available in fifo */
181 #define DATA_AVAIL_BIT 0x1
182 /* overrun has occurred */
183 #define OVERRUN_BIT 0x2
185 #define OVERFLOW_BIT 0x4
186 /* timer interrupt has occurred */
187 #define TIMER_BIT 0x8
188 /* dma terminal count has occurred */
189 #define DMATC_BIT 0x10
190 /* external trigger has occurred */
191 #define EXT_TRIG_BIT 0x40
192 /* 1200 boards only */
193 #define STATUS2_REG 0x1d
194 /* programmable eeprom serial output */
195 #define EEPROM_OUT_BIT 0x1
196 /* counter A1 terminal count */
197 #define A1_TC_BIT 0x2
198 /* fifo not half full */
200 #define ADC_FIFO_REG 0xa
202 #define DIO_BASE_REG 0x10
203 #define COUNTER_A_BASE_REG 0x14
204 #define COUNTER_A_CONTROL_REG (COUNTER_A_BASE_REG + 0x3)
205 /* check modes put conversion pacer output in harmless state (a0 mode 2) */
206 #define INIT_A0_BITS 0x14
207 /* put hardware conversion counter output in harmless state (a1 mode 0) */
208 #define INIT_A1_BITS 0x70
209 #define COUNTER_B_BASE_REG 0x18
213 MODE_SINGLE_CHAN_INTERVAL,
218 static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd,
219 enum scan_mode scan_mode);
220 #ifdef CONFIG_ISA_DMA_API
221 static unsigned int labpc_suggest_transfer_size(const struct comedi_cmd *cmd);
224 /* analog input ranges */
225 #define NUM_LABPC_PLUS_AI_RANGES 16
226 /* indicates unipolar ranges */
227 static const int labpc_plus_is_unipolar[NUM_LABPC_PLUS_AI_RANGES] = {
246 /* map range index to gain bits */
247 static const int labpc_plus_ai_gain_bits[NUM_LABPC_PLUS_AI_RANGES] = {
266 static const struct comedi_lrange range_labpc_plus_ai = {
267 NUM_LABPC_PLUS_AI_RANGES,
288 #define NUM_LABPC_1200_AI_RANGES 14
289 /* indicates unipolar ranges */
290 const int labpc_1200_is_unipolar[NUM_LABPC_1200_AI_RANGES] = {
306 EXPORT_SYMBOL_GPL(labpc_1200_is_unipolar);
308 /* map range index to gain bits */
309 const int labpc_1200_ai_gain_bits[NUM_LABPC_1200_AI_RANGES] = {
325 EXPORT_SYMBOL_GPL(labpc_1200_ai_gain_bits);
327 const struct comedi_lrange range_labpc_1200_ai = {
328 NUM_LABPC_1200_AI_RANGES,
346 EXPORT_SYMBOL_GPL(range_labpc_1200_ai);
348 /* analog output ranges */
349 #define AO_RANGE_IS_UNIPOLAR 0x1
350 static const struct comedi_lrange range_labpc_ao = {
358 /* functions that do inb/outb and readb/writeb so we can use
359 * function pointers to decide which to use */
360 static inline unsigned int labpc_inb(unsigned long address)
365 static inline void labpc_outb(unsigned int byte, unsigned long address)
370 static inline unsigned int labpc_readb(unsigned long address)
372 return readb((void __iomem *)address);
375 static inline void labpc_writeb(unsigned int byte, unsigned long address)
377 writeb(byte, (void __iomem *)address);
380 static const struct labpc_boardinfo labpc_boards[] = {
382 .name = "lab-pc-1200",
384 .bustype = isa_bustype,
385 .register_layout = labpc_1200_layout,
387 .ai_range_table = &range_labpc_1200_ai,
388 .ai_range_code = labpc_1200_ai_gain_bits,
389 .ai_range_is_unipolar = labpc_1200_is_unipolar,
391 .memory_mapped_io = 0,
394 .name = "lab-pc-1200ai",
396 .bustype = isa_bustype,
397 .register_layout = labpc_1200_layout,
399 .ai_range_table = &range_labpc_1200_ai,
400 .ai_range_code = labpc_1200_ai_gain_bits,
401 .ai_range_is_unipolar = labpc_1200_is_unipolar,
403 .memory_mapped_io = 0,
408 .bustype = isa_bustype,
409 .register_layout = labpc_plus_layout,
411 .ai_range_table = &range_labpc_plus_ai,
412 .ai_range_code = labpc_plus_ai_gain_bits,
413 .ai_range_is_unipolar = labpc_plus_is_unipolar,
415 .memory_mapped_io = 0,
417 #ifdef CONFIG_COMEDI_PCI_DRIVERS
422 .bustype = pci_bustype,
423 .register_layout = labpc_1200_layout,
425 .ai_range_table = &range_labpc_1200_ai,
426 .ai_range_code = labpc_1200_ai_gain_bits,
427 .ai_range_is_unipolar = labpc_1200_is_unipolar,
429 .memory_mapped_io = 1,
431 /* dummy entry so pci board works when comedi_config is passed driver name */
434 .bustype = pci_bustype,
439 /* size in bytes of dma buffer */
440 static const int dma_buffer_size = 0xff00;
441 /* 2 bytes per sample */
442 static const int sample_size = 2;
444 static inline int labpc_counter_load(struct comedi_device *dev,
445 unsigned long base_address,
446 unsigned int counter_number,
447 unsigned int count, unsigned int mode)
449 const struct labpc_boardinfo *thisboard = comedi_board(dev);
451 if (thisboard->memory_mapped_io)
452 return i8254_mm_load((void __iomem *)base_address, 0,
453 counter_number, count, mode);
455 return i8254_load(base_address, 0, counter_number, count, mode);
458 static void labpc_clear_adc_fifo(const struct comedi_device *dev)
460 struct labpc_private *devpriv = dev->private;
462 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
463 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
464 devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
467 static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
469 struct labpc_private *devpriv = dev->private;
472 spin_lock_irqsave(&dev->spinlock, flags);
473 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
474 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
475 spin_unlock_irqrestore(&dev->spinlock, flags);
477 devpriv->command3_bits = 0;
478 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
483 static enum scan_mode labpc_ai_scan_mode(const struct comedi_cmd *cmd)
485 if (cmd->chanlist_len == 1)
486 return MODE_SINGLE_CHAN;
488 /* chanlist may be NULL during cmdtest. */
489 if (cmd->chanlist == NULL)
490 return MODE_MULT_CHAN_UP;
492 if (CR_CHAN(cmd->chanlist[0]) == CR_CHAN(cmd->chanlist[1]))
493 return MODE_SINGLE_CHAN_INTERVAL;
495 if (CR_CHAN(cmd->chanlist[0]) < CR_CHAN(cmd->chanlist[1]))
496 return MODE_MULT_CHAN_UP;
498 if (CR_CHAN(cmd->chanlist[0]) > CR_CHAN(cmd->chanlist[1]))
499 return MODE_MULT_CHAN_DOWN;
501 pr_err("ni_labpc: bug! cannot determine AI scan mode\n");
505 static int labpc_ai_chanlist_invalid(const struct comedi_device *dev,
506 const struct comedi_cmd *cmd,
509 int channel, range, aref, i;
511 if (cmd->chanlist == NULL)
514 if (mode == MODE_SINGLE_CHAN)
517 if (mode == MODE_SINGLE_CHAN_INTERVAL) {
518 if (cmd->chanlist_len > 0xff) {
520 "ni_labpc: chanlist too long for single channel interval mode\n");
525 channel = CR_CHAN(cmd->chanlist[0]);
526 range = CR_RANGE(cmd->chanlist[0]);
527 aref = CR_AREF(cmd->chanlist[0]);
529 for (i = 0; i < cmd->chanlist_len; i++) {
532 case MODE_SINGLE_CHAN_INTERVAL:
533 if (CR_CHAN(cmd->chanlist[i]) != channel) {
535 "channel scanning order specified in chanlist is not supported by hardware.\n");
539 case MODE_MULT_CHAN_UP:
540 if (CR_CHAN(cmd->chanlist[i]) != i) {
542 "channel scanning order specified in chanlist is not supported by hardware.\n");
546 case MODE_MULT_CHAN_DOWN:
547 if (CR_CHAN(cmd->chanlist[i]) !=
548 cmd->chanlist_len - i - 1) {
550 "channel scanning order specified in chanlist is not supported by hardware.\n");
555 dev_err(dev->class_dev,
556 "ni_labpc: bug! in chanlist check\n");
561 if (CR_RANGE(cmd->chanlist[i]) != range) {
563 "entries in chanlist must all have the same range\n");
567 if (CR_AREF(cmd->chanlist[i]) != aref) {
569 "entries in chanlist must all have the same reference\n");
577 static int labpc_use_continuous_mode(const struct comedi_cmd *cmd,
580 if (mode == MODE_SINGLE_CHAN)
583 if (cmd->scan_begin_src == TRIG_FOLLOW)
589 static unsigned int labpc_ai_convert_period(const struct comedi_cmd *cmd,
592 if (cmd->convert_src != TRIG_TIMER)
595 if (mode == MODE_SINGLE_CHAN && cmd->scan_begin_src == TRIG_TIMER)
596 return cmd->scan_begin_arg;
598 return cmd->convert_arg;
601 static void labpc_set_ai_convert_period(struct comedi_cmd *cmd,
602 enum scan_mode mode, unsigned int ns)
604 if (cmd->convert_src != TRIG_TIMER)
607 if (mode == MODE_SINGLE_CHAN &&
608 cmd->scan_begin_src == TRIG_TIMER) {
609 cmd->scan_begin_arg = ns;
610 if (cmd->convert_arg > cmd->scan_begin_arg)
611 cmd->convert_arg = cmd->scan_begin_arg;
613 cmd->convert_arg = ns;
616 static unsigned int labpc_ai_scan_period(const struct comedi_cmd *cmd,
619 if (cmd->scan_begin_src != TRIG_TIMER)
622 if (mode == MODE_SINGLE_CHAN && cmd->convert_src == TRIG_TIMER)
625 return cmd->scan_begin_arg;
628 static void labpc_set_ai_scan_period(struct comedi_cmd *cmd,
629 enum scan_mode mode, unsigned int ns)
631 if (cmd->scan_begin_src != TRIG_TIMER)
634 if (mode == MODE_SINGLE_CHAN && cmd->convert_src == TRIG_TIMER)
637 cmd->scan_begin_arg = ns;
640 static int labpc_ai_cmdtest(struct comedi_device *dev,
641 struct comedi_subdevice *s, struct comedi_cmd *cmd)
643 const struct labpc_boardinfo *thisboard = comedi_board(dev);
646 unsigned int stop_mask;
649 /* Step 1 : check if triggers are trivially valid */
651 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
652 err |= cfc_check_trigger_src(&cmd->scan_begin_src,
653 TRIG_TIMER | TRIG_FOLLOW | TRIG_EXT);
654 err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_TIMER | TRIG_EXT);
655 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
657 stop_mask = TRIG_COUNT | TRIG_NONE;
658 if (thisboard->register_layout == labpc_1200_layout)
659 stop_mask |= TRIG_EXT;
660 err |= cfc_check_trigger_src(&cmd->stop_src, stop_mask);
665 /* Step 2a : make sure trigger sources are unique */
667 err |= cfc_check_trigger_is_unique(cmd->start_src);
668 err |= cfc_check_trigger_is_unique(cmd->scan_begin_src);
669 err |= cfc_check_trigger_is_unique(cmd->convert_src);
670 err |= cfc_check_trigger_is_unique(cmd->stop_src);
672 /* Step 2b : and mutually compatible */
674 /* can't have external stop and start triggers at once */
675 if (cmd->start_src == TRIG_EXT && cmd->stop_src == TRIG_EXT)
681 /* Step 3: check if arguments are trivially valid */
683 if (cmd->start_arg == TRIG_NOW)
684 err |= cfc_check_trigger_arg_is(&cmd->start_arg, 0);
686 if (!cmd->chanlist_len)
688 err |= cfc_check_trigger_arg_is(&cmd->scan_end_arg, cmd->chanlist_len);
690 if (cmd->convert_src == TRIG_TIMER)
691 err |= cfc_check_trigger_arg_min(&cmd->convert_arg,
692 thisboard->ai_speed);
694 /* make sure scan timing is not too fast */
695 if (cmd->scan_begin_src == TRIG_TIMER) {
696 if (cmd->convert_src == TRIG_TIMER)
697 err |= cfc_check_trigger_arg_min(&cmd->scan_begin_arg,
698 cmd->convert_arg * cmd->chanlist_len);
699 err |= cfc_check_trigger_arg_min(&cmd->scan_begin_arg,
700 thisboard->ai_speed * cmd->chanlist_len);
703 switch (cmd->stop_src) {
705 err |= cfc_check_trigger_arg_min(&cmd->stop_arg, 1);
708 err |= cfc_check_trigger_arg_is(&cmd->stop_arg, 0);
711 * TRIG_EXT doesn't care since it doesn't
712 * trigger off a numbered channel
721 /* step 4: fix up any arguments */
723 tmp = cmd->convert_arg;
724 tmp2 = cmd->scan_begin_arg;
725 mode = labpc_ai_scan_mode(cmd);
726 labpc_adc_timing(dev, cmd, mode);
727 if (tmp != cmd->convert_arg || tmp2 != cmd->scan_begin_arg)
733 if (labpc_ai_chanlist_invalid(dev, cmd, mode))
739 static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
741 const struct labpc_boardinfo *thisboard = comedi_board(dev);
742 struct labpc_private *devpriv = dev->private;
743 int channel, range, aref;
744 #ifdef CONFIG_ISA_DMA_API
745 unsigned long irq_flags;
748 struct comedi_async *async = s->async;
749 struct comedi_cmd *cmd = &async->cmd;
750 enum transfer_type xfer;
755 comedi_error(dev, "no irq assigned, cannot perform command");
759 range = CR_RANGE(cmd->chanlist[0]);
760 aref = CR_AREF(cmd->chanlist[0]);
762 /* make sure board is disabled before setting up acquisition */
763 spin_lock_irqsave(&dev->spinlock, flags);
764 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
765 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
766 spin_unlock_irqrestore(&dev->spinlock, flags);
768 devpriv->command3_bits = 0;
769 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
771 /* initialize software conversion count */
772 if (cmd->stop_src == TRIG_COUNT)
773 devpriv->count = cmd->stop_arg * cmd->chanlist_len;
775 /* setup hardware conversion counter */
776 if (cmd->stop_src == TRIG_EXT) {
778 * load counter a1 with count of 3
779 * (pc+ manual says this is minimum allowed) using mode 0
781 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
784 comedi_error(dev, "error loading counter a1");
788 * otherwise, just put a1 in mode 0
789 * with no count to set its output low
791 devpriv->write_byte(INIT_A1_BITS,
792 dev->iobase + COUNTER_A_CONTROL_REG);
794 #ifdef CONFIG_ISA_DMA_API
795 /* figure out what method we will use to transfer data */
796 if (devpriv->dma_chan && /* need a dma channel allocated */
798 * dma unsafe at RT priority,
799 * and too much setup time for TRIG_WAKE_EOS for
801 (cmd->flags & (TRIG_WAKE_EOS | TRIG_RT)) == 0 &&
802 /* only available on the isa boards */
803 thisboard->bustype == isa_bustype) {
804 xfer = isa_dma_transfer;
805 /* pc-plus has no fifo-half full interrupt */
808 if (thisboard->register_layout == labpc_1200_layout &&
809 /* wake-end-of-scan should interrupt on fifo not empty */
810 (cmd->flags & TRIG_WAKE_EOS) == 0 &&
811 /* make sure we are taking more than just a few points */
812 (cmd->stop_src != TRIG_COUNT || devpriv->count > 256)) {
813 xfer = fifo_half_full_transfer;
815 xfer = fifo_not_empty_transfer;
816 devpriv->current_transfer = xfer;
817 mode = labpc_ai_scan_mode(cmd);
819 /* setup command6 register for 1200 boards */
820 if (thisboard->register_layout == labpc_1200_layout) {
821 /* reference inputs to ground or common? */
822 if (aref != AREF_GROUND)
823 devpriv->command6_bits |= ADC_COMMON_BIT;
825 devpriv->command6_bits &= ~ADC_COMMON_BIT;
826 /* bipolar or unipolar range? */
827 if (thisboard->ai_range_is_unipolar[range])
828 devpriv->command6_bits |= ADC_UNIP_BIT;
830 devpriv->command6_bits &= ~ADC_UNIP_BIT;
831 /* interrupt on fifo half full? */
832 if (xfer == fifo_half_full_transfer)
833 devpriv->command6_bits |= ADC_FHF_INTR_EN_BIT;
835 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
836 /* enable interrupt on counter a1 terminal count? */
837 if (cmd->stop_src == TRIG_EXT)
838 devpriv->command6_bits |= A1_INTR_EN_BIT;
840 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
841 /* are we scanning up or down through channels? */
842 if (mode == MODE_MULT_CHAN_UP)
843 devpriv->command6_bits |= ADC_SCAN_UP_BIT;
845 devpriv->command6_bits &= ~ADC_SCAN_UP_BIT;
846 /* write to register */
847 devpriv->write_byte(devpriv->command6_bits,
848 dev->iobase + COMMAND6_REG);
851 /* setup channel list, etc (command1 register) */
852 devpriv->command1_bits = 0;
853 if (mode == MODE_MULT_CHAN_UP)
854 channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]);
856 channel = CR_CHAN(cmd->chanlist[0]);
857 /* munge channel bits for differential / scan disabled mode */
858 if ((mode == MODE_SINGLE_CHAN || mode == MODE_SINGLE_CHAN_INTERVAL) &&
861 devpriv->command1_bits |= ADC_CHAN_BITS(channel);
862 devpriv->command1_bits |= thisboard->ai_range_code[range];
863 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
864 /* manual says to set scan enable bit on second pass */
865 if (mode == MODE_MULT_CHAN_UP || mode == MODE_MULT_CHAN_DOWN) {
866 devpriv->command1_bits |= ADC_SCAN_EN_BIT;
867 /* need a brief delay before enabling scan, or scan
868 * list will get screwed when you switch
869 * between scan up to scan down mode - dunno why */
871 devpriv->write_byte(devpriv->command1_bits,
872 dev->iobase + COMMAND1_REG);
875 devpriv->write_byte(cmd->chanlist_len,
876 dev->iobase + INTERVAL_COUNT_REG);
878 devpriv->write_byte(INTERVAL_LOAD_BITS,
879 dev->iobase + INTERVAL_LOAD_REG);
881 if (cmd->convert_src == TRIG_TIMER || cmd->scan_begin_src == TRIG_TIMER) {
883 labpc_adc_timing(dev, cmd, mode);
884 /* load counter b0 in mode 3 */
885 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
886 0, devpriv->divisor_b0, 3);
888 comedi_error(dev, "error loading counter b0");
892 /* set up conversion pacing */
893 if (labpc_ai_convert_period(cmd, mode)) {
894 /* load counter a0 in mode 2 */
895 ret = labpc_counter_load(dev, dev->iobase + COUNTER_A_BASE_REG,
896 0, devpriv->divisor_a0, 2);
898 comedi_error(dev, "error loading counter a0");
902 devpriv->write_byte(INIT_A0_BITS,
903 dev->iobase + COUNTER_A_CONTROL_REG);
905 /* set up scan pacing */
906 if (labpc_ai_scan_period(cmd, mode)) {
907 /* load counter b1 in mode 2 */
908 ret = labpc_counter_load(dev, dev->iobase + COUNTER_B_BASE_REG,
909 1, devpriv->divisor_b1, 2);
911 comedi_error(dev, "error loading counter b1");
916 labpc_clear_adc_fifo(dev);
918 #ifdef CONFIG_ISA_DMA_API
919 /* set up dma transfer */
920 if (xfer == isa_dma_transfer) {
921 irq_flags = claim_dma_lock();
922 disable_dma(devpriv->dma_chan);
923 /* clear flip-flop to make sure 2-byte registers for
924 * count and address get set correctly */
925 clear_dma_ff(devpriv->dma_chan);
926 set_dma_addr(devpriv->dma_chan,
927 virt_to_bus(devpriv->dma_buffer));
928 /* set appropriate size of transfer */
929 devpriv->dma_transfer_size = labpc_suggest_transfer_size(cmd);
930 if (cmd->stop_src == TRIG_COUNT &&
931 devpriv->count * sample_size < devpriv->dma_transfer_size) {
932 devpriv->dma_transfer_size =
933 devpriv->count * sample_size;
935 set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
936 enable_dma(devpriv->dma_chan);
937 release_dma_lock(irq_flags);
938 /* enable board's dma */
939 devpriv->command3_bits |= DMA_EN_BIT | DMATC_INTR_EN_BIT;
941 devpriv->command3_bits &= ~DMA_EN_BIT & ~DMATC_INTR_EN_BIT;
944 /* enable error interrupts */
945 devpriv->command3_bits |= ERR_INTR_EN_BIT;
946 /* enable fifo not empty interrupt? */
947 if (xfer == fifo_not_empty_transfer)
948 devpriv->command3_bits |= ADC_FNE_INTR_EN_BIT;
950 devpriv->command3_bits &= ~ADC_FNE_INTR_EN_BIT;
951 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
953 /* setup any external triggering/pacing (command4 register) */
954 devpriv->command4_bits = 0;
955 if (cmd->convert_src != TRIG_EXT)
956 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
957 /* XXX should discard first scan when using interval scanning
958 * since manual says it is not synced with scan clock */
959 if (labpc_use_continuous_mode(cmd, mode) == 0) {
960 devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT;
961 if (cmd->scan_begin_src == TRIG_EXT)
962 devpriv->command4_bits |= EXT_SCAN_EN_BIT;
964 /* single-ended/differential */
965 if (aref == AREF_DIFF)
966 devpriv->command4_bits |= ADC_DIFF_BIT;
967 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
969 /* startup acquisition */
972 /* use 2 cascaded counters for pacing */
973 spin_lock_irqsave(&dev->spinlock, flags);
974 devpriv->command2_bits |= CASCADE_BIT;
975 switch (cmd->start_src) {
977 devpriv->command2_bits |= HWTRIG_BIT;
978 devpriv->command2_bits &= ~PRETRIG_BIT & ~SWTRIG_BIT;
981 devpriv->command2_bits |= SWTRIG_BIT;
982 devpriv->command2_bits &= ~PRETRIG_BIT & ~HWTRIG_BIT;
985 comedi_error(dev, "bug with start_src");
986 spin_unlock_irqrestore(&dev->spinlock, flags);
990 switch (cmd->stop_src) {
992 devpriv->command2_bits |= HWTRIG_BIT | PRETRIG_BIT;
998 comedi_error(dev, "bug with stop_src");
999 spin_unlock_irqrestore(&dev->spinlock, flags);
1002 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1003 spin_unlock_irqrestore(&dev->spinlock, flags);
1008 static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1009 struct comedi_insn *insn, unsigned int *data)
1011 const struct labpc_boardinfo *thisboard = comedi_board(dev);
1012 struct labpc_private *devpriv = dev->private;
1017 unsigned long flags;
1019 /* disable timed conversions */
1020 spin_lock_irqsave(&dev->spinlock, flags);
1021 devpriv->command2_bits &= ~SWTRIG_BIT & ~HWTRIG_BIT & ~PRETRIG_BIT;
1022 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1023 spin_unlock_irqrestore(&dev->spinlock, flags);
1025 /* disable interrupt generation and dma */
1026 devpriv->command3_bits = 0;
1027 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1029 /* set gain and channel */
1030 devpriv->command1_bits = 0;
1031 chan = CR_CHAN(insn->chanspec);
1032 range = CR_RANGE(insn->chanspec);
1033 devpriv->command1_bits |= thisboard->ai_range_code[range];
1034 /* munge channel bits for differential/scan disabled mode */
1035 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1037 devpriv->command1_bits |= ADC_CHAN_BITS(chan);
1038 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
1040 /* setup command6 register for 1200 boards */
1041 if (thisboard->register_layout == labpc_1200_layout) {
1042 /* reference inputs to ground or common? */
1043 if (CR_AREF(insn->chanspec) != AREF_GROUND)
1044 devpriv->command6_bits |= ADC_COMMON_BIT;
1046 devpriv->command6_bits &= ~ADC_COMMON_BIT;
1047 /* bipolar or unipolar range? */
1048 if (thisboard->ai_range_is_unipolar[range])
1049 devpriv->command6_bits |= ADC_UNIP_BIT;
1051 devpriv->command6_bits &= ~ADC_UNIP_BIT;
1052 /* don't interrupt on fifo half full */
1053 devpriv->command6_bits &= ~ADC_FHF_INTR_EN_BIT;
1054 /* don't enable interrupt on counter a1 terminal count? */
1055 devpriv->command6_bits &= ~A1_INTR_EN_BIT;
1056 /* write to register */
1057 devpriv->write_byte(devpriv->command6_bits,
1058 dev->iobase + COMMAND6_REG);
1060 /* setup command4 register */
1061 devpriv->command4_bits = 0;
1062 devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
1063 /* single-ended/differential */
1064 if (CR_AREF(insn->chanspec) == AREF_DIFF)
1065 devpriv->command4_bits |= ADC_DIFF_BIT;
1066 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1069 * initialize pacer counter output to make sure it doesn't
1070 * cause any problems
1072 devpriv->write_byte(INIT_A0_BITS, dev->iobase + COUNTER_A_CONTROL_REG);
1074 labpc_clear_adc_fifo(dev);
1076 for (n = 0; n < insn->n; n++) {
1077 /* trigger conversion */
1078 devpriv->write_byte(0x1, dev->iobase + ADC_CONVERT_REG);
1080 for (i = 0; i < timeout; i++) {
1081 if (devpriv->read_byte(dev->iobase +
1082 STATUS1_REG) & DATA_AVAIL_BIT)
1087 comedi_error(dev, "timeout");
1090 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1091 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1092 data[n] = (msb << 8) | lsb;
1098 #ifdef CONFIG_ISA_DMA_API
1099 /* utility function that suggests a dma transfer size in bytes */
1100 static unsigned int labpc_suggest_transfer_size(const struct comedi_cmd *cmd)
1105 if (cmd->convert_src == TRIG_TIMER)
1106 freq = 1000000000 / cmd->convert_arg;
1107 /* return some default value */
1111 /* make buffer fill in no more than 1/3 second */
1112 size = (freq / 3) * sample_size;
1114 /* set a minimum and maximum size allowed */
1115 if (size > dma_buffer_size)
1116 size = dma_buffer_size - dma_buffer_size % sample_size;
1117 else if (size < sample_size)
1124 /* figures out what counter values to use based on command */
1125 static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd,
1126 enum scan_mode mode)
1128 struct labpc_private *devpriv = dev->private;
1129 /* max value for 16 bit counter in mode 2 */
1130 const int max_counter_value = 0x10000;
1131 /* min value for 16 bit counter in mode 2 */
1132 const int min_counter_value = 2;
1133 unsigned int base_period;
1134 unsigned int scan_period;
1135 unsigned int convert_period;
1138 * if both convert and scan triggers are TRIG_TIMER, then they
1139 * both rely on counter b0
1141 convert_period = labpc_ai_convert_period(cmd, mode);
1142 scan_period = labpc_ai_scan_period(cmd, mode);
1143 if (convert_period && scan_period) {
1145 * pick the lowest b0 divisor value we can (for maximum input
1146 * clock speed on convert and scan counters)
1148 devpriv->divisor_b0 = (scan_period - 1) /
1149 (LABPC_TIMER_BASE * max_counter_value) + 1;
1150 if (devpriv->divisor_b0 < min_counter_value)
1151 devpriv->divisor_b0 = min_counter_value;
1152 if (devpriv->divisor_b0 > max_counter_value)
1153 devpriv->divisor_b0 = max_counter_value;
1155 base_period = LABPC_TIMER_BASE * devpriv->divisor_b0;
1157 /* set a0 for conversion frequency and b1 for scan frequency */
1158 switch (cmd->flags & TRIG_ROUND_MASK) {
1160 case TRIG_ROUND_NEAREST:
1161 devpriv->divisor_a0 =
1162 (convert_period + (base_period / 2)) / base_period;
1163 devpriv->divisor_b1 =
1164 (scan_period + (base_period / 2)) / base_period;
1167 devpriv->divisor_a0 =
1168 (convert_period + (base_period - 1)) / base_period;
1169 devpriv->divisor_b1 =
1170 (scan_period + (base_period - 1)) / base_period;
1172 case TRIG_ROUND_DOWN:
1173 devpriv->divisor_a0 = convert_period / base_period;
1174 devpriv->divisor_b1 = scan_period / base_period;
1177 /* make sure a0 and b1 values are acceptable */
1178 if (devpriv->divisor_a0 < min_counter_value)
1179 devpriv->divisor_a0 = min_counter_value;
1180 if (devpriv->divisor_a0 > max_counter_value)
1181 devpriv->divisor_a0 = max_counter_value;
1182 if (devpriv->divisor_b1 < min_counter_value)
1183 devpriv->divisor_b1 = min_counter_value;
1184 if (devpriv->divisor_b1 > max_counter_value)
1185 devpriv->divisor_b1 = max_counter_value;
1186 /* write corrected timings to command */
1187 labpc_set_ai_convert_period(cmd, mode,
1188 base_period * devpriv->divisor_a0);
1189 labpc_set_ai_scan_period(cmd, mode,
1190 base_period * devpriv->divisor_b1);
1192 * if only one TRIG_TIMER is used, we can employ the generic
1193 * cascaded timing functions
1195 } else if (scan_period) {
1197 * calculate cascaded counter values
1198 * that give desired scan timing
1200 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
1201 &(devpriv->divisor_b1),
1202 &(devpriv->divisor_b0),
1204 cmd->flags & TRIG_ROUND_MASK);
1205 labpc_set_ai_scan_period(cmd, mode, scan_period);
1206 } else if (convert_period) {
1208 * calculate cascaded counter values
1209 * that give desired conversion timing
1211 i8253_cascade_ns_to_timer_2div(LABPC_TIMER_BASE,
1212 &(devpriv->divisor_a0),
1213 &(devpriv->divisor_b0),
1215 cmd->flags & TRIG_ROUND_MASK);
1216 labpc_set_ai_convert_period(cmd, mode, convert_period);
1220 #ifdef CONFIG_ISA_DMA_API
1221 static void labpc_drain_dma(struct comedi_device *dev)
1223 struct labpc_private *devpriv = dev->private;
1224 struct comedi_subdevice *s = dev->read_subdev;
1225 struct comedi_async *async = s->async;
1227 unsigned long flags;
1228 unsigned int max_points, num_points, residue, leftover;
1231 status = devpriv->status1_bits;
1233 flags = claim_dma_lock();
1234 disable_dma(devpriv->dma_chan);
1235 /* clear flip-flop to make sure 2-byte registers for
1236 * count and address get set correctly */
1237 clear_dma_ff(devpriv->dma_chan);
1239 /* figure out how many points to read */
1240 max_points = devpriv->dma_transfer_size / sample_size;
1241 /* residue is the number of points left to be done on the dma
1242 * transfer. It should always be zero at this point unless
1243 * the stop_src is set to external triggering.
1245 residue = get_dma_residue(devpriv->dma_chan) / sample_size;
1246 num_points = max_points - residue;
1247 if (devpriv->count < num_points && async->cmd.stop_src == TRIG_COUNT)
1248 num_points = devpriv->count;
1250 /* figure out how many points will be stored next time */
1252 if (async->cmd.stop_src != TRIG_COUNT) {
1253 leftover = devpriv->dma_transfer_size / sample_size;
1254 } else if (devpriv->count > num_points) {
1255 leftover = devpriv->count - num_points;
1256 if (leftover > max_points)
1257 leftover = max_points;
1260 /* write data to comedi buffer */
1261 for (i = 0; i < num_points; i++)
1262 cfc_write_to_buffer(s, devpriv->dma_buffer[i]);
1264 if (async->cmd.stop_src == TRIG_COUNT)
1265 devpriv->count -= num_points;
1267 /* set address and count for next transfer */
1268 set_dma_addr(devpriv->dma_chan, virt_to_bus(devpriv->dma_buffer));
1269 set_dma_count(devpriv->dma_chan, leftover * sample_size);
1270 release_dma_lock(flags);
1272 async->events |= COMEDI_CB_BLOCK;
1275 static void handle_isa_dma(struct comedi_device *dev)
1277 struct labpc_private *devpriv = dev->private;
1279 labpc_drain_dma(dev);
1281 enable_dma(devpriv->dma_chan);
1283 /* clear dma tc interrupt */
1284 devpriv->write_byte(0x1, dev->iobase + DMATC_CLEAR_REG);
1288 /* read all available samples from ai fifo */
1289 static int labpc_drain_fifo(struct comedi_device *dev)
1291 struct labpc_private *devpriv = dev->private;
1292 unsigned int lsb, msb;
1294 struct comedi_async *async = dev->read_subdev->async;
1295 const int timeout = 10000;
1298 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1300 for (i = 0; (devpriv->status1_bits & DATA_AVAIL_BIT) && i < timeout;
1302 /* quit if we have all the data we want */
1303 if (async->cmd.stop_src == TRIG_COUNT) {
1304 if (devpriv->count == 0)
1308 lsb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1309 msb = devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
1310 data = (msb << 8) | lsb;
1311 cfc_write_to_buffer(dev->read_subdev, data);
1312 devpriv->status1_bits =
1313 devpriv->read_byte(dev->iobase + STATUS1_REG);
1316 comedi_error(dev, "ai timeout, fifo never empties");
1317 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1324 /* makes sure all data acquired by board is transferred to comedi (used
1325 * when acquisition is terminated by stop_src == TRIG_EXT). */
1326 static void labpc_drain_dregs(struct comedi_device *dev)
1328 #ifdef CONFIG_ISA_DMA_API
1329 struct labpc_private *devpriv = dev->private;
1331 if (devpriv->current_transfer == isa_dma_transfer)
1332 labpc_drain_dma(dev);
1335 labpc_drain_fifo(dev);
1338 /* interrupt service routine */
1339 static irqreturn_t labpc_interrupt(int irq, void *d)
1341 struct comedi_device *dev = d;
1342 const struct labpc_boardinfo *thisboard = comedi_board(dev);
1343 struct labpc_private *devpriv = dev->private;
1344 struct comedi_subdevice *s = dev->read_subdev;
1345 struct comedi_async *async;
1346 struct comedi_cmd *cmd;
1348 if (!dev->attached) {
1349 comedi_error(dev, "premature interrupt");
1357 /* read board status */
1358 devpriv->status1_bits = devpriv->read_byte(dev->iobase + STATUS1_REG);
1359 if (thisboard->register_layout == labpc_1200_layout)
1360 devpriv->status2_bits =
1361 devpriv->read_byte(dev->iobase + STATUS2_REG);
1363 if ((devpriv->status1_bits & (DMATC_BIT | TIMER_BIT | OVERFLOW_BIT |
1364 OVERRUN_BIT | DATA_AVAIL_BIT)) == 0
1365 && (devpriv->status2_bits & A1_TC_BIT) == 0
1366 && (devpriv->status2_bits & FNHF_BIT)) {
1370 if (devpriv->status1_bits & OVERRUN_BIT) {
1371 /* clear error interrupt */
1372 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1373 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1374 comedi_event(dev, s);
1375 comedi_error(dev, "overrun");
1379 #ifdef CONFIG_ISA_DMA_API
1380 if (devpriv->current_transfer == isa_dma_transfer) {
1382 * if a dma terminal count of external stop trigger
1385 if (devpriv->status1_bits & DMATC_BIT ||
1386 (thisboard->register_layout == labpc_1200_layout
1387 && devpriv->status2_bits & A1_TC_BIT)) {
1388 handle_isa_dma(dev);
1392 labpc_drain_fifo(dev);
1394 if (devpriv->status1_bits & TIMER_BIT) {
1395 comedi_error(dev, "handled timer interrupt?");
1397 devpriv->write_byte(0x1, dev->iobase + TIMER_CLEAR_REG);
1400 if (devpriv->status1_bits & OVERFLOW_BIT) {
1401 /* clear error interrupt */
1402 devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
1403 async->events |= COMEDI_CB_ERROR | COMEDI_CB_EOA;
1404 comedi_event(dev, s);
1405 comedi_error(dev, "overflow");
1408 /* handle external stop trigger */
1409 if (cmd->stop_src == TRIG_EXT) {
1410 if (devpriv->status2_bits & A1_TC_BIT) {
1411 labpc_drain_dregs(dev);
1412 labpc_cancel(dev, s);
1413 async->events |= COMEDI_CB_EOA;
1417 /* TRIG_COUNT end of acquisition */
1418 if (cmd->stop_src == TRIG_COUNT) {
1419 if (devpriv->count == 0) {
1420 labpc_cancel(dev, s);
1421 async->events |= COMEDI_CB_EOA;
1425 comedi_event(dev, s);
1429 /* analog output insn */
1430 static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
1431 struct comedi_insn *insn, unsigned int *data)
1433 const struct labpc_boardinfo *thisboard = comedi_board(dev);
1434 struct labpc_private *devpriv = dev->private;
1436 unsigned long flags;
1439 channel = CR_CHAN(insn->chanspec);
1441 /* turn off pacing of analog output channel */
1442 /* note: hardware bug in daqcard-1200 means pacing cannot
1443 * be independently enabled/disabled for its the two channels */
1444 spin_lock_irqsave(&dev->spinlock, flags);
1445 devpriv->command2_bits &= ~DAC_PACED_BIT(channel);
1446 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1447 spin_unlock_irqrestore(&dev->spinlock, flags);
1450 if (thisboard->register_layout == labpc_1200_layout) {
1451 range = CR_RANGE(insn->chanspec);
1452 if (range & AO_RANGE_IS_UNIPOLAR)
1453 devpriv->command6_bits |= DAC_UNIP_BIT(channel);
1455 devpriv->command6_bits &= ~DAC_UNIP_BIT(channel);
1456 /* write to register */
1457 devpriv->write_byte(devpriv->command6_bits,
1458 dev->iobase + COMMAND6_REG);
1461 lsb = data[0] & 0xff;
1462 msb = (data[0] >> 8) & 0xff;
1463 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(channel));
1464 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(channel));
1466 /* remember value for readback */
1467 devpriv->ao_value[channel] = data[0];
1472 /* analog output readback insn */
1473 static int labpc_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
1474 struct comedi_insn *insn, unsigned int *data)
1476 struct labpc_private *devpriv = dev->private;
1478 data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
1483 static int labpc_dio_mem_callback(int dir, int port, int data,
1484 unsigned long iobase)
1487 writeb(data, (void __iomem *)(iobase + port));
1490 return readb((void __iomem *)(iobase + port));
1494 /* lowlevel write to eeprom/dac */
1495 static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
1496 unsigned int value_width)
1498 struct labpc_private *devpriv = dev->private;
1501 for (i = 1; i <= value_width; i++) {
1502 /* clear serial clock */
1503 devpriv->command5_bits &= ~SCLOCK_BIT;
1504 /* send bits most significant bit first */
1505 if (value & (1 << (value_width - i)))
1506 devpriv->command5_bits |= SDATA_BIT;
1508 devpriv->command5_bits &= ~SDATA_BIT;
1510 devpriv->write_byte(devpriv->command5_bits,
1511 dev->iobase + COMMAND5_REG);
1512 /* set clock to load bit */
1513 devpriv->command5_bits |= SCLOCK_BIT;
1515 devpriv->write_byte(devpriv->command5_bits,
1516 dev->iobase + COMMAND5_REG);
1520 /* lowlevel read from eeprom */
1521 static unsigned int labpc_serial_in(struct comedi_device *dev)
1523 struct labpc_private *devpriv = dev->private;
1524 unsigned int value = 0;
1526 const int value_width = 8; /* number of bits wide values are */
1528 for (i = 1; i <= value_width; i++) {
1529 /* set serial clock */
1530 devpriv->command5_bits |= SCLOCK_BIT;
1532 devpriv->write_byte(devpriv->command5_bits,
1533 dev->iobase + COMMAND5_REG);
1534 /* clear clock bit */
1535 devpriv->command5_bits &= ~SCLOCK_BIT;
1537 devpriv->write_byte(devpriv->command5_bits,
1538 dev->iobase + COMMAND5_REG);
1539 /* read bits most significant bit first */
1541 devpriv->status2_bits =
1542 devpriv->read_byte(dev->iobase + STATUS2_REG);
1543 if (devpriv->status2_bits & EEPROM_OUT_BIT)
1544 value |= 1 << (value_width - i);
1550 static unsigned int labpc_eeprom_read(struct comedi_device *dev,
1551 unsigned int address)
1553 struct labpc_private *devpriv = dev->private;
1555 /* bits to tell eeprom to expect a read */
1556 const int read_instruction = 0x3;
1557 /* 8 bit write lengths to eeprom */
1558 const int write_length = 8;
1560 /* enable read/write to eeprom */
1561 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1563 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1564 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1566 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1568 /* send read instruction */
1569 labpc_serial_out(dev, read_instruction, write_length);
1570 /* send 8 bit address to read from */
1571 labpc_serial_out(dev, address, write_length);
1573 value = labpc_serial_in(dev);
1575 /* disable read/write to eeprom */
1576 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1578 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1583 static unsigned int labpc_eeprom_read_status(struct comedi_device *dev)
1585 struct labpc_private *devpriv = dev->private;
1587 const int read_status_instruction = 0x5;
1588 const int write_length = 8; /* 8 bit write lengths to eeprom */
1590 /* enable read/write to eeprom */
1591 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1593 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1594 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1596 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1598 /* send read status instruction */
1599 labpc_serial_out(dev, read_status_instruction, write_length);
1601 value = labpc_serial_in(dev);
1603 /* disable read/write to eeprom */
1604 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1606 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1611 static int labpc_eeprom_write(struct comedi_device *dev,
1612 unsigned int address, unsigned int value)
1614 struct labpc_private *devpriv = dev->private;
1615 const int write_enable_instruction = 0x6;
1616 const int write_instruction = 0x2;
1617 const int write_length = 8; /* 8 bit write lengths to eeprom */
1618 const int write_in_progress_bit = 0x1;
1619 const int timeout = 10000;
1622 /* make sure there isn't already a write in progress */
1623 for (i = 0; i < timeout; i++) {
1624 if ((labpc_eeprom_read_status(dev) & write_in_progress_bit) ==
1629 comedi_error(dev, "eeprom write timed out");
1632 /* update software copy of eeprom */
1633 devpriv->eeprom_data[address] = value;
1635 /* enable read/write to eeprom */
1636 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1638 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1639 devpriv->command5_bits |= EEPROM_EN_BIT | EEPROM_WRITE_UNPROTECT_BIT;
1641 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1643 /* send write_enable instruction */
1644 labpc_serial_out(dev, write_enable_instruction, write_length);
1645 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1647 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1649 /* send write instruction */
1650 devpriv->command5_bits |= EEPROM_EN_BIT;
1652 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1653 labpc_serial_out(dev, write_instruction, write_length);
1654 /* send 8 bit address to write to */
1655 labpc_serial_out(dev, address, write_length);
1657 labpc_serial_out(dev, value, write_length);
1658 devpriv->command5_bits &= ~EEPROM_EN_BIT;
1660 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1662 /* disable read/write to eeprom */
1663 devpriv->command5_bits &= ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1665 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1670 /* writes to 8 bit calibration dacs */
1671 static void write_caldac(struct comedi_device *dev, unsigned int channel,
1674 struct labpc_private *devpriv = dev->private;
1676 if (value == devpriv->caldac[channel])
1678 devpriv->caldac[channel] = value;
1680 /* clear caldac load bit and make sure we don't write to eeprom */
1681 devpriv->command5_bits &=
1682 ~CALDAC_LOAD_BIT & ~EEPROM_EN_BIT & ~EEPROM_WRITE_UNPROTECT_BIT;
1684 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1686 /* write 4 bit channel */
1687 labpc_serial_out(dev, channel, 4);
1688 /* write 8 bit caldac value */
1689 labpc_serial_out(dev, value, 8);
1691 /* set and clear caldac bit to load caldac value */
1692 devpriv->command5_bits |= CALDAC_LOAD_BIT;
1694 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1695 devpriv->command5_bits &= ~CALDAC_LOAD_BIT;
1697 devpriv->write_byte(devpriv->command5_bits, dev->iobase + COMMAND5_REG);
1700 static int labpc_calib_write_insn(struct comedi_device *dev,
1701 struct comedi_subdevice *s,
1702 struct comedi_insn *insn, unsigned int *data)
1704 int channel = CR_CHAN(insn->chanspec);
1706 write_caldac(dev, channel, data[0]);
1710 static int labpc_calib_read_insn(struct comedi_device *dev,
1711 struct comedi_subdevice *s,
1712 struct comedi_insn *insn, unsigned int *data)
1714 struct labpc_private *devpriv = dev->private;
1716 data[0] = devpriv->caldac[CR_CHAN(insn->chanspec)];
1721 static int labpc_eeprom_write_insn(struct comedi_device *dev,
1722 struct comedi_subdevice *s,
1723 struct comedi_insn *insn, unsigned int *data)
1725 int channel = CR_CHAN(insn->chanspec);
1728 /* only allow writes to user area of eeprom */
1729 if (channel < 16 || channel > 127) {
1730 dev_dbg(dev->class_dev,
1731 "eeprom writes are only allowed to channels 16 through 127 (the pointer and user areas)\n");
1735 ret = labpc_eeprom_write(dev, channel, data[0]);
1742 static int labpc_eeprom_read_insn(struct comedi_device *dev,
1743 struct comedi_subdevice *s,
1744 struct comedi_insn *insn, unsigned int *data)
1746 struct labpc_private *devpriv = dev->private;
1748 data[0] = devpriv->eeprom_data[CR_CHAN(insn->chanspec)];
1753 int labpc_common_attach(struct comedi_device *dev, unsigned long iobase,
1754 unsigned int irq, unsigned int dma_chan)
1756 const struct labpc_boardinfo *thisboard = comedi_board(dev);
1757 struct labpc_private *devpriv = dev->private;
1758 struct comedi_subdevice *s;
1760 unsigned long isr_flags;
1761 #ifdef CONFIG_ISA_DMA_API
1762 unsigned long dma_flags;
1767 dev_info(dev->class_dev, "ni_labpc: %s\n", thisboard->name);
1769 dev_err(dev->class_dev, "io base address is zero!\n");
1772 /* request io regions for isa boards */
1773 if (thisboard->bustype == isa_bustype) {
1774 /* check if io addresses are available */
1775 if (!request_region(iobase, LABPC_SIZE, DRV_NAME)) {
1776 dev_err(dev->class_dev, "I/O port conflict\n");
1780 dev->iobase = iobase;
1782 if (thisboard->memory_mapped_io) {
1783 devpriv->read_byte = labpc_readb;
1784 devpriv->write_byte = labpc_writeb;
1786 devpriv->read_byte = labpc_inb;
1787 devpriv->write_byte = labpc_outb;
1789 /* initialize board's command registers */
1790 devpriv->write_byte(devpriv->command1_bits, dev->iobase + COMMAND1_REG);
1791 devpriv->write_byte(devpriv->command2_bits, dev->iobase + COMMAND2_REG);
1792 devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
1793 devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
1794 if (thisboard->register_layout == labpc_1200_layout) {
1795 devpriv->write_byte(devpriv->command5_bits,
1796 dev->iobase + COMMAND5_REG);
1797 devpriv->write_byte(devpriv->command6_bits,
1798 dev->iobase + COMMAND6_REG);
1804 if (thisboard->bustype == pci_bustype
1805 || thisboard->bustype == pcmcia_bustype)
1806 isr_flags |= IRQF_SHARED;
1807 if (request_irq(irq, labpc_interrupt, isr_flags,
1809 dev_err(dev->class_dev, "unable to allocate irq %u\n",
1816 #ifdef CONFIG_ISA_DMA_API
1817 /* grab dma channel */
1819 dev_err(dev->class_dev, "invalid dma channel %u\n", dma_chan);
1821 } else if (dma_chan) {
1822 /* allocate dma buffer */
1823 devpriv->dma_buffer = kmalloc(dma_buffer_size,
1824 GFP_KERNEL | GFP_DMA);
1825 if (devpriv->dma_buffer == NULL)
1828 if (request_dma(dma_chan, DRV_NAME)) {
1829 dev_err(dev->class_dev,
1830 "failed to allocate dma channel %u\n",
1834 devpriv->dma_chan = dma_chan;
1835 dma_flags = claim_dma_lock();
1836 disable_dma(devpriv->dma_chan);
1837 set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
1838 release_dma_lock(dma_flags);
1842 dev->board_name = thisboard->name;
1844 ret = comedi_alloc_subdevices(dev, 5);
1848 /* analog input subdevice */
1849 s = &dev->subdevices[0];
1850 dev->read_subdev = s;
1851 s->type = COMEDI_SUBD_AI;
1853 SDF_READABLE | SDF_GROUND | SDF_COMMON | SDF_DIFF | SDF_CMD_READ;
1855 s->len_chanlist = 8;
1856 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
1857 s->range_table = thisboard->ai_range_table;
1858 s->do_cmd = labpc_ai_cmd;
1859 s->do_cmdtest = labpc_ai_cmdtest;
1860 s->insn_read = labpc_ai_rinsn;
1861 s->cancel = labpc_cancel;
1864 s = &dev->subdevices[1];
1865 if (thisboard->has_ao) {
1867 * Could provide command support, except it only has a
1868 * one sample hardware buffer for analog output and no
1871 s->type = COMEDI_SUBD_AO;
1872 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_GROUND;
1873 s->n_chan = NUM_AO_CHAN;
1874 s->maxdata = (1 << 12) - 1; /* 12 bit resolution */
1875 s->range_table = &range_labpc_ao;
1876 s->insn_read = labpc_ao_rinsn;
1877 s->insn_write = labpc_ao_winsn;
1878 /* initialize analog outputs to a known value */
1879 for (i = 0; i < s->n_chan; i++) {
1880 devpriv->ao_value[i] = s->maxdata / 2;
1881 lsb = devpriv->ao_value[i] & 0xff;
1882 msb = (devpriv->ao_value[i] >> 8) & 0xff;
1883 devpriv->write_byte(lsb, dev->iobase + DAC_LSB_REG(i));
1884 devpriv->write_byte(msb, dev->iobase + DAC_MSB_REG(i));
1887 s->type = COMEDI_SUBD_UNUSED;
1891 s = &dev->subdevices[2];
1892 /* if board uses io memory we have to give a custom callback
1893 * function to the 8255 driver */
1894 if (thisboard->memory_mapped_io)
1895 subdev_8255_init(dev, s, labpc_dio_mem_callback,
1896 (unsigned long)(dev->iobase + DIO_BASE_REG));
1898 subdev_8255_init(dev, s, NULL, dev->iobase + DIO_BASE_REG);
1900 /* calibration subdevices for boards that have one */
1901 s = &dev->subdevices[3];
1902 if (thisboard->register_layout == labpc_1200_layout) {
1903 s->type = COMEDI_SUBD_CALIB;
1904 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1907 s->insn_read = labpc_calib_read_insn;
1908 s->insn_write = labpc_calib_write_insn;
1910 for (i = 0; i < s->n_chan; i++)
1911 write_caldac(dev, i, s->maxdata / 2);
1913 s->type = COMEDI_SUBD_UNUSED;
1916 s = &dev->subdevices[4];
1917 if (thisboard->register_layout == labpc_1200_layout) {
1918 s->type = COMEDI_SUBD_MEMORY;
1919 s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL;
1920 s->n_chan = EEPROM_SIZE;
1922 s->insn_read = labpc_eeprom_read_insn;
1923 s->insn_write = labpc_eeprom_write_insn;
1925 for (i = 0; i < EEPROM_SIZE; i++)
1926 devpriv->eeprom_data[i] = labpc_eeprom_read(dev, i);
1928 s->type = COMEDI_SUBD_UNUSED;
1932 EXPORT_SYMBOL_GPL(labpc_common_attach);
1934 static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1936 const struct labpc_boardinfo *thisboard = comedi_board(dev);
1937 struct labpc_private *devpriv;
1938 unsigned long iobase = 0;
1939 unsigned int irq = 0;
1940 unsigned int dma_chan = 0;
1942 devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
1945 dev->private = devpriv;
1947 /* get base address, irq etc. based on bustype */
1948 switch (thisboard->bustype) {
1950 #ifdef CONFIG_ISA_DMA_API
1951 iobase = it->options[0];
1952 irq = it->options[1];
1953 dma_chan = it->options[2];
1955 dev_err(dev->class_dev,
1956 "ni_labpc driver has not been built with ISA DMA support.\n");
1961 #ifdef CONFIG_COMEDI_PCI_DRIVERS
1962 dev_err(dev->class_dev,
1963 "manual configuration of PCI board '%s' is not supported\n",
1967 dev_err(dev->class_dev,
1968 "ni_labpc driver has not been built with PCI support.\n");
1973 dev_err(dev->class_dev,
1974 "ni_labpc: bug! couldn't determine board type\n");
1979 return labpc_common_attach(dev, iobase, irq, dma_chan);
1982 static const struct labpc_boardinfo *
1983 labpc_pci_find_boardinfo(struct pci_dev *pcidev)
1985 unsigned int device_id = pcidev->device;
1988 for (n = 0; n < ARRAY_SIZE(labpc_boards); n++) {
1989 const struct labpc_boardinfo *board = &labpc_boards[n];
1990 if (board->bustype == pci_bustype &&
1991 board->device_id == device_id)
1997 static int labpc_auto_attach(struct comedi_device *dev,
1998 unsigned long context_unused)
2000 struct pci_dev *pcidev = comedi_to_pci_dev(dev);
2001 struct labpc_private *devpriv;
2002 unsigned long iobase;
2006 if (!IS_ENABLED(CONFIG_COMEDI_PCI_DRIVERS))
2009 ret = comedi_pci_enable(dev);
2013 devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
2016 dev->private = devpriv;
2018 dev->board_ptr = labpc_pci_find_boardinfo(pcidev);
2019 if (!dev->board_ptr)
2021 devpriv->mite = mite_alloc(pcidev);
2024 ret = mite_setup(devpriv->mite);
2027 iobase = (unsigned long)devpriv->mite->daq_io_addr;
2028 irq = mite_irq(devpriv->mite);
2029 return labpc_common_attach(dev, iobase, irq, 0);
2032 void labpc_common_detach(struct comedi_device *dev)
2034 const struct labpc_boardinfo *thisboard = comedi_board(dev);
2035 struct labpc_private *devpriv = dev->private;
2036 struct comedi_subdevice *s;
2040 if (dev->subdevices) {
2041 s = &dev->subdevices[2];
2042 subdev_8255_cleanup(dev, s);
2044 #ifdef CONFIG_ISA_DMA_API
2045 /* only free stuff if it has been allocated by _attach */
2046 kfree(devpriv->dma_buffer);
2047 if (devpriv->dma_chan)
2048 free_dma(devpriv->dma_chan);
2051 free_irq(dev->irq, dev);
2052 if (thisboard->bustype == isa_bustype && dev->iobase)
2053 release_region(dev->iobase, LABPC_SIZE);
2054 #ifdef CONFIG_COMEDI_PCI_DRIVERS
2055 if (devpriv->mite) {
2056 mite_unsetup(devpriv->mite);
2057 mite_free(devpriv->mite);
2059 if (thisboard->bustype == pci_bustype)
2060 comedi_pci_disable(dev);
2063 EXPORT_SYMBOL_GPL(labpc_common_detach);
2065 static struct comedi_driver labpc_driver = {
2066 .driver_name = DRV_NAME,
2067 .module = THIS_MODULE,
2068 .attach = labpc_attach,
2069 .auto_attach = labpc_auto_attach,
2070 .detach = labpc_common_detach,
2071 .num_names = ARRAY_SIZE(labpc_boards),
2072 .board_name = &labpc_boards[0].name,
2073 .offset = sizeof(struct labpc_boardinfo),
2076 #ifdef CONFIG_COMEDI_PCI_DRIVERS
2077 static DEFINE_PCI_DEVICE_TABLE(labpc_pci_table) = {
2078 { PCI_DEVICE(PCI_VENDOR_ID_NI, 0x161) },
2081 MODULE_DEVICE_TABLE(pci, labpc_pci_table);
2083 static int labpc_pci_probe(struct pci_dev *dev,
2084 const struct pci_device_id *id)
2086 return comedi_pci_auto_config(dev, &labpc_driver, id->driver_data);
2089 static struct pci_driver labpc_pci_driver = {
2091 .id_table = labpc_pci_table,
2092 .probe = labpc_pci_probe,
2093 .remove = comedi_pci_auto_unconfig,
2095 module_comedi_pci_driver(labpc_driver, labpc_pci_driver);
2097 module_comedi_driver(labpc_driver);
2101 MODULE_AUTHOR("Comedi http://www.comedi.org");
2102 MODULE_DESCRIPTION("Comedi low-level driver");
2103 MODULE_LICENSE("GPL");