1 /*======================================================================
3 comedi/drivers/quatech_daqp_cs.c
5 Quatech DAQP PCMCIA data capture cards COMEDI client driver
6 Copyright (C) 2000, 2003 Brent Baccala <baccala@freesoft.org>
7 The DAQP interface code in this file is released into the public domain.
9 COMEDI - Linux Control and Measurement Device Interface
10 Copyright (C) 1998 David A. Schleef <ds@schleef.org>
11 http://www.comedi.org/
13 quatech_daqp_cs.c 1.10
15 Documentation for the DAQP PCMCIA cards can be found on Quatech's site:
17 ftp://ftp.quatech.com/Manuals/daqp-208.pdf
19 This manual is for both the DAQP-208 and the DAQP-308.
26 - ground ref or differential
27 - single-shot and timed both supported
28 - D/A conversion, single-shot
33 - any kind of triggering - external or D/A channel 1
34 - the card's optional expansion board
35 - the card's timer (for anything other than A/D conversion)
36 - D/A update modes other than immediate (i.e, timed)
37 - fancier timing modes
38 - setting card's FIFO buffer thresholds to anything but default
40 ======================================================================*/
43 Driver: quatech_daqp_cs
44 Description: Quatech DAQP PCMCIA data capture cards
45 Author: Brent Baccala <baccala@freesoft.org>
47 Devices: [Quatech] DAQP-208 (daqp), DAQP-308
50 #include "../comedidev.h"
52 #include <linux/version.h>
53 #include <pcmcia/cs_types.h>
54 #include <pcmcia/cs.h>
55 #include <pcmcia/cistpl.h>
56 #include <pcmcia/cisreg.h>
57 #include <pcmcia/ds.h>
60 All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If
61 you do not define PCMCIA_DEBUG at all, all the debug code will be
62 left out. If you compile with PCMCIA_DEBUG=0, the debug code will
63 be present but disabled -- but it can then be enabled for specific
64 modules at load time with a 'pc_debug=#' option to insmod.
68 static int pc_debug = PCMCIA_DEBUG;
69 module_param(pc_debug, int, 0644);
70 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
71 static char *version = "quatech_daqp_cs.c 1.10 2003/04/21 (Brent Baccala)";
73 #define DEBUG(n, args...)
76 /* Maximum number of separate DAQP devices we'll allow */
79 typedef struct local_info_t {
80 struct pcmcia_device *link;
86 enum { semaphore, buffer } interrupt_mode;
95 /* A list of "instances" of the device. */
97 static local_info_t *dev_table[MAX_DEV] = { NULL, /* ... */ };
99 /* The DAQP communicates with the system through a 16 byte I/O window. */
101 #define DAQP_FIFO_SIZE 4096
104 #define DAQP_SCANLIST 1
105 #define DAQP_CONTROL 2
106 #define DAQP_STATUS 2
107 #define DAQP_DIGITAL_IO 3
108 #define DAQP_PACER_LOW 4
109 #define DAQP_PACER_MID 5
110 #define DAQP_PACER_HIGH 6
111 #define DAQP_COMMAND 7
113 #define DAQP_TIMER 10
116 #define DAQP_SCANLIST_DIFFERENTIAL 0x4000
117 #define DAQP_SCANLIST_GAIN(x) ((x)<<12)
118 #define DAQP_SCANLIST_CHANNEL(x) ((x)<<8)
119 #define DAQP_SCANLIST_START 0x0080
120 #define DAQP_SCANLIST_EXT_GAIN(x) ((x)<<4)
121 #define DAQP_SCANLIST_EXT_CHANNEL(x) (x)
123 #define DAQP_CONTROL_PACER_100kHz 0xc0
124 #define DAQP_CONTROL_PACER_1MHz 0x80
125 #define DAQP_CONTROL_PACER_5MHz 0x40
126 #define DAQP_CONTROL_PACER_EXTERNAL 0x00
127 #define DAQP_CONTORL_EXPANSION 0x20
128 #define DAQP_CONTROL_EOS_INT_ENABLE 0x10
129 #define DAQP_CONTROL_FIFO_INT_ENABLE 0x08
130 #define DAQP_CONTROL_TRIGGER_ONESHOT 0x00
131 #define DAQP_CONTROL_TRIGGER_CONTINUOUS 0x04
132 #define DAQP_CONTROL_TRIGGER_INTERNAL 0x00
133 #define DAQP_CONTROL_TRIGGER_EXTERNAL 0x02
134 #define DAQP_CONTROL_TRIGGER_RISING 0x00
135 #define DAQP_CONTROL_TRIGGER_FALLING 0x01
137 #define DAQP_STATUS_IDLE 0x80
138 #define DAQP_STATUS_RUNNING 0x40
139 #define DAQP_STATUS_EVENTS 0x38
140 #define DAQP_STATUS_DATA_LOST 0x20
141 #define DAQP_STATUS_END_OF_SCAN 0x10
142 #define DAQP_STATUS_FIFO_THRESHOLD 0x08
143 #define DAQP_STATUS_FIFO_FULL 0x04
144 #define DAQP_STATUS_FIFO_NEARFULL 0x02
145 #define DAQP_STATUS_FIFO_EMPTY 0x01
147 #define DAQP_COMMAND_ARM 0x80
148 #define DAQP_COMMAND_RSTF 0x40
149 #define DAQP_COMMAND_RSTQ 0x20
150 #define DAQP_COMMAND_STOP 0x10
151 #define DAQP_COMMAND_LATCH 0x08
152 #define DAQP_COMMAND_100kHz 0x00
153 #define DAQP_COMMAND_50kHz 0x02
154 #define DAQP_COMMAND_25kHz 0x04
155 #define DAQP_COMMAND_FIFO_DATA 0x01
156 #define DAQP_COMMAND_FIFO_PROGRAM 0x00
158 #define DAQP_AUX_TRIGGER_TTL 0x00
159 #define DAQP_AUX_TRIGGER_ANALOG 0x80
160 #define DAQP_AUX_TRIGGER_PRETRIGGER 0x40
161 #define DAQP_AUX_TIMER_INT_ENABLE 0x20
162 #define DAQP_AUX_TIMER_RELOAD 0x00
163 #define DAQP_AUX_TIMER_PAUSE 0x08
164 #define DAQP_AUX_TIMER_GO 0x10
165 #define DAQP_AUX_TIMER_GO_EXTERNAL 0x18
166 #define DAQP_AUX_TIMER_EXTERNAL_SRC 0x04
167 #define DAQP_AUX_TIMER_INTERNAL_SRC 0x00
168 #define DAQP_AUX_DA_DIRECT 0x00
169 #define DAQP_AUX_DA_OVERFLOW 0x01
170 #define DAQP_AUX_DA_EXTERNAL 0x02
171 #define DAQP_AUX_DA_PACER 0x03
173 #define DAQP_AUX_RUNNING 0x80
174 #define DAQP_AUX_TRIGGERED 0x40
175 #define DAQP_AUX_DA_BUFFER 0x20
176 #define DAQP_AUX_TIMER_OVERFLOW 0x10
177 #define DAQP_AUX_CONVERSION 0x08
178 #define DAQP_AUX_DATA_LOST 0x04
179 #define DAQP_AUX_FIFO_NEARFULL 0x02
180 #define DAQP_AUX_FIFO_EMPTY 0x01
182 /* These range structures tell COMEDI how the sample values map to
183 * voltages. The A/D converter has four ranges: +/- 10V through
184 * +/- 1.25V, and the D/A converter has only one: +/- 5V.
187 static const comedi_lrange range_daqp_ai = { 4, {
195 static const comedi_lrange range_daqp_ao = { 1, {BIP_RANGE(5)} };
197 /*====================================================================*/
199 /* comedi interface code */
201 static int daqp_attach(comedi_device * dev, comedi_devconfig * it);
202 static int daqp_detach(comedi_device * dev);
203 static comedi_driver driver_daqp = {
204 driver_name:"quatech_daqp_cs",
212 static void daqp_dump(comedi_device * dev)
214 printk("DAQP: status %02x; aux status %02x\n",
215 inb(dev->iobase + DAQP_STATUS), inb(dev->iobase + DAQP_AUX));
218 static void hex_dump(char *str, void *ptr, int len)
220 unsigned char *cptr = ptr;
225 for (i = 0; i < len; i++) {
227 printk("\n0x%08x:", (unsigned int)cptr);
229 printk(" %02x", *(cptr++));
236 /* Cancel a running acquisition */
238 static int daqp_ai_cancel(comedi_device * dev, comedi_subdevice * s)
240 local_info_t *local = (local_info_t *) s->private;
246 outb(DAQP_COMMAND_STOP, dev->iobase + DAQP_COMMAND);
248 /* flush any linguring data in FIFO - superfluous here */
249 /* outb(DAQP_COMMAND_RSTF, dev->iobase+DAQP_COMMAND); */
251 local->interrupt_mode = semaphore;
258 * Operates in one of two modes. If local->interrupt_mode is
259 * 'semaphore', just signal the local->eos semaphore and return
260 * (one-shot mode). Otherwise (continuous mode), read data in from
261 * the card, transfer it to the buffer provided by the higher-level
262 * comedi kernel module, and signal various comedi callback routines,
263 * which run pretty quick.
266 static void daqp_interrupt(int irq, void *dev_id PT_REGS_ARG)
268 local_info_t *local = (local_info_t *) dev_id;
271 int loop_limit = 10000;
276 "daqp_interrupt(): irq %d for unknown device.\n", irq);
282 printk(KERN_WARNING "daqp_interrupt(): NULL comedi_device.\n");
286 if (!dev->attached) {
288 "daqp_interrupt(): comedi_device not yet attached.\n");
295 "daqp_interrupt(): NULL comedi_subdevice.\n");
299 if ((local_info_t *) s->private != local) {
301 "daqp_interrupt(): invalid comedi_subdevice.\n");
305 switch (local->interrupt_mode) {
314 while (!((status = inb(dev->iobase + DAQP_STATUS))
315 & DAQP_STATUS_FIFO_EMPTY)) {
319 if (status & DAQP_STATUS_DATA_LOST) {
321 COMEDI_CB_EOA | COMEDI_CB_OVERFLOW;
322 printk("daqp: data lost\n");
323 daqp_ai_cancel(dev, s);
327 data = inb(dev->iobase + DAQP_FIFO);
328 data |= inb(dev->iobase + DAQP_FIFO) << 8;
331 comedi_buf_put(s->async, data);
333 /* If there's a limit, decrement it
334 * and stop conversion if zero
337 if (local->count > 0) {
339 if (local->count == 0) {
340 daqp_ai_cancel(dev, s);
341 s->async->events |= COMEDI_CB_EOA;
346 if ((loop_limit--) <= 0)
350 if (loop_limit <= 0) {
352 "loop_limit reached in daqp_interrupt()\n");
353 daqp_ai_cancel(dev, s);
354 s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
357 s->async->events |= COMEDI_CB_BLOCK;
359 comedi_event(dev, s);
363 /* One-shot analog data acquisition routine */
365 static int daqp_ai_insn_read(comedi_device * dev, comedi_subdevice * s,
366 comedi_insn * insn, lsampl_t * data)
368 local_info_t *local = (local_info_t *) s->private;
377 /* Stop any running conversion */
378 daqp_ai_cancel(dev, s);
380 outb(0, dev->iobase + DAQP_AUX);
382 /* Reset scan list queue */
383 outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
385 /* Program one scan list entry */
387 v = DAQP_SCANLIST_CHANNEL(CR_CHAN(insn->chanspec))
388 | DAQP_SCANLIST_GAIN(CR_RANGE(insn->chanspec));
390 if (CR_AREF(insn->chanspec) == AREF_DIFF) {
391 v |= DAQP_SCANLIST_DIFFERENTIAL;
394 v |= DAQP_SCANLIST_START;
396 outb(v & 0xff, dev->iobase + DAQP_SCANLIST);
397 outb(v >> 8, dev->iobase + DAQP_SCANLIST);
399 /* Reset data FIFO (see page 28 of DAQP User's Manual) */
401 outb(DAQP_COMMAND_RSTF, dev->iobase + DAQP_COMMAND);
405 v = DAQP_CONTROL_TRIGGER_ONESHOT | DAQP_CONTROL_TRIGGER_INTERNAL
406 | DAQP_CONTROL_PACER_100kHz | DAQP_CONTROL_EOS_INT_ENABLE;
408 outb(v, dev->iobase + DAQP_CONTROL);
410 /* Reset any pending interrupts (my card has a tendancy to require
411 * require multiple reads on the status register to achieve this)
415 && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS)) ;
417 printk("daqp: couldn't clear interrupts in status register\n");
421 /* Make sure semaphore is blocked */
422 sema_init(&local->eos, 0);
423 local->interrupt_mode = semaphore;
427 for (i = 0; i < insn->n; i++) {
429 /* Start conversion */
430 outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA,
431 dev->iobase + DAQP_COMMAND);
433 /* Wait for interrupt service routine to unblock semaphore */
434 /* Maybe could use a timeout here, but it's interruptible */
435 if (down_interruptible(&local->eos))
438 data[i] = inb(dev->iobase + DAQP_FIFO);
439 data[i] |= inb(dev->iobase + DAQP_FIFO) << 8;
446 /* This function converts ns nanoseconds to a counter value suitable
447 * for programming the device. We always use the DAQP's 5 MHz clock,
448 * which with its 24-bit counter, allows values up to 84 seconds.
449 * Also, the function adjusts ns so that it cooresponds to the actual
450 * time that the device will use.
453 static int daqp_ns_to_timer(unsigned int *ns, int round)
463 /* cmdtest tests a particular command to see if it is valid.
464 * Using the cmdtest ioctl, a user can create a valid cmd
465 * and then have it executed by the cmd ioctl.
467 * cmdtest returns 1,2,3,4 or 0, depending on which tests
468 * the command passes.
471 static int daqp_ai_cmdtest(comedi_device * dev, comedi_subdevice * s,
477 /* step 1: make sure trigger sources are trivially valid */
479 tmp = cmd->start_src;
480 cmd->start_src &= TRIG_NOW;
481 if (!cmd->start_src || tmp != cmd->start_src)
484 tmp = cmd->scan_begin_src;
485 cmd->scan_begin_src &= TRIG_TIMER | TRIG_FOLLOW;
486 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
489 tmp = cmd->convert_src;
490 cmd->convert_src &= TRIG_TIMER | TRIG_NOW;
491 if (!cmd->convert_src || tmp != cmd->convert_src)
494 tmp = cmd->scan_end_src;
495 cmd->scan_end_src &= TRIG_COUNT;
496 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
500 cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
501 if (!cmd->stop_src || tmp != cmd->stop_src)
507 /* step 2: make sure trigger sources are unique and mutually compatible */
509 /* note that mutual compatiblity is not an issue here */
510 if (cmd->scan_begin_src != TRIG_TIMER &&
511 cmd->scan_begin_src != TRIG_FOLLOW)
513 if (cmd->convert_src != TRIG_NOW && cmd->convert_src != TRIG_TIMER)
515 if (cmd->scan_begin_src == TRIG_FOLLOW && cmd->convert_src == TRIG_NOW)
517 if (cmd->stop_src != TRIG_COUNT && cmd->stop_src != TRIG_NONE)
523 /* step 3: make sure arguments are trivially compatible */
525 if (cmd->start_arg != 0) {
529 #define MAX_SPEED 10000 /* 100 kHz - in nanoseconds */
531 if (cmd->scan_begin_src == TRIG_TIMER
532 && cmd->scan_begin_arg < MAX_SPEED) {
533 cmd->scan_begin_arg = MAX_SPEED;
537 /* If both scan_begin and convert are both timer values, the only
538 * way that can make sense is if the scan time is the number of
539 * conversions times the convert time
542 if (cmd->scan_begin_src == TRIG_TIMER && cmd->convert_src == TRIG_TIMER
543 && cmd->scan_begin_arg !=
544 cmd->convert_arg * cmd->scan_end_arg) {
548 if (cmd->convert_src == TRIG_TIMER && cmd->convert_arg < MAX_SPEED) {
549 cmd->convert_arg = MAX_SPEED;
553 if (cmd->scan_end_arg != cmd->chanlist_len) {
554 cmd->scan_end_arg = cmd->chanlist_len;
557 if (cmd->stop_src == TRIG_COUNT) {
558 if (cmd->stop_arg > 0x00ffffff) {
559 cmd->stop_arg = 0x00ffffff;
564 if (cmd->stop_arg != 0) {
573 /* step 4: fix up any arguments */
575 if (cmd->scan_begin_src == TRIG_TIMER) {
576 tmp = cmd->scan_begin_arg;
577 daqp_ns_to_timer(&cmd->scan_begin_arg,
578 cmd->flags & TRIG_ROUND_MASK);
579 if (tmp != cmd->scan_begin_arg)
583 if (cmd->convert_src == TRIG_TIMER) {
584 tmp = cmd->convert_arg;
585 daqp_ns_to_timer(&cmd->convert_arg,
586 cmd->flags & TRIG_ROUND_MASK);
587 if (tmp != cmd->convert_arg)
597 static int daqp_ai_cmd(comedi_device * dev, comedi_subdevice * s)
599 local_info_t *local = (local_info_t *) s->private;
600 comedi_cmd *cmd = &s->async->cmd;
602 int scanlist_start_on_every_entry;
612 /* Stop any running conversion */
613 daqp_ai_cancel(dev, s);
615 outb(0, dev->iobase + DAQP_AUX);
617 /* Reset scan list queue */
618 outb(DAQP_COMMAND_RSTQ, dev->iobase + DAQP_COMMAND);
620 /* Program pacer clock
622 * There's two modes we can operate in. If convert_src is
623 * TRIG_TIMER, then convert_arg specifies the time between
624 * each conversion, so we program the pacer clock to that
625 * frequency and set the SCANLIST_START bit on every scanlist
626 * entry. Otherwise, convert_src is TRIG_NOW, which means
627 * we want the fastest possible conversions, scan_begin_src
628 * is TRIG_TIMER, and scan_begin_arg specifies the time between
629 * each scan, so we program the pacer clock to this frequency
630 * and only set the SCANLIST_START bit on the first entry.
633 if (cmd->convert_src == TRIG_TIMER) {
634 int counter = daqp_ns_to_timer(&cmd->convert_arg,
635 cmd->flags & TRIG_ROUND_MASK);
636 outb(counter & 0xff, dev->iobase + DAQP_PACER_LOW);
637 outb((counter >> 8) & 0xff, dev->iobase + DAQP_PACER_MID);
638 outb((counter >> 16) & 0xff, dev->iobase + DAQP_PACER_HIGH);
639 scanlist_start_on_every_entry = 1;
641 int counter = daqp_ns_to_timer(&cmd->scan_begin_arg,
642 cmd->flags & TRIG_ROUND_MASK);
643 outb(counter & 0xff, dev->iobase + DAQP_PACER_LOW);
644 outb((counter >> 8) & 0xff, dev->iobase + DAQP_PACER_MID);
645 outb((counter >> 16) & 0xff, dev->iobase + DAQP_PACER_HIGH);
646 scanlist_start_on_every_entry = 0;
649 /* Program scan list */
651 for (i = 0; i < cmd->chanlist_len; i++) {
653 int chanspec = cmd->chanlist[i];
655 /* Program one scan list entry */
657 v = DAQP_SCANLIST_CHANNEL(CR_CHAN(chanspec))
658 | DAQP_SCANLIST_GAIN(CR_RANGE(chanspec));
660 if (CR_AREF(chanspec) == AREF_DIFF) {
661 v |= DAQP_SCANLIST_DIFFERENTIAL;
664 if (i == 0 || scanlist_start_on_every_entry) {
665 v |= DAQP_SCANLIST_START;
668 outb(v & 0xff, dev->iobase + DAQP_SCANLIST);
669 outb(v >> 8, dev->iobase + DAQP_SCANLIST);
672 /* Now it's time to program the FIFO threshold, basically the
673 * number of samples the card will buffer before it interrupts
676 * If we don't have a stop count, then use half the size of
677 * the FIFO (the manufacturer's recommendation). Consider
678 * that the FIFO can hold 2K samples (4K bytes). With the
679 * threshold set at half the FIFO size, we have a margin of
680 * error of 1024 samples. At the chip's maximum sample rate
681 * of 100,000 Hz, the CPU would have to delay interrupt
682 * service for a full 10 milliseconds in order to lose data
683 * here (as opposed to higher up in the kernel). I've never
684 * seen it happen. However, for slow sample rates it may
685 * buffer too much data and introduce too much delay for the
688 * If we have a stop count, then things get more interesting.
689 * If the stop count is less than the FIFO size (actually
690 * three-quarters of the FIFO size - see below), we just use
691 * the stop count itself as the threshold, the card interrupts
692 * us when that many samples have been taken, and we kill the
693 * acquisition at that point and are done. If the stop count
694 * is larger than that, then we divide it by 2 until it's less
695 * than three quarters of the FIFO size (we always leave the
696 * top quarter of the FIFO as protection against sluggish CPU
697 * interrupt response) and use that as the threshold. So, if
698 * the stop count is 4000 samples, we divide by two twice to
699 * get 1000 samples, use that as the threshold, take four
700 * interrupts to get our 4000 samples and are done.
702 * The algorithm could be more clever. For example, if 81000
703 * samples are requested, we could set the threshold to 1500
704 * samples and take 54 interrupts to get 81000. But 54 isn't
705 * a power of two, so this algorithm won't find that option.
706 * Instead, it'll set the threshold at 1266 and take 64
707 * interrupts to get 81024 samples, of which the last 24 will
708 * be discarded... but we won't get the last interrupt until
709 * they've been collected. To find the first option, the
710 * computer could look at the prime decomposition of the
711 * sample count (81000 = 3^4 * 5^3 * 2^3) and factor it into a
712 * threshold (1500 = 3 * 5^3 * 2^2) and an interrupt count (54
713 * = 3^3 * 2). Hmmm... a one-line while loop or prime
714 * decomposition of integers... I'll leave it the way it is.
716 * I'll also note a mini-race condition before ignoring it in
717 * the code. Let's say we're taking 4000 samples, as before.
718 * After 1000 samples, we get an interrupt. But before that
719 * interrupt is completely serviced, another sample is taken
720 * and loaded into the FIFO. Since the interrupt handler
721 * empties the FIFO before returning, it will read 1001 samples.
722 * If that happens four times, we'll end up taking 4004 samples,
723 * not 4000. The interrupt handler will discard the extra four
724 * samples (by halting the acquisition with four samples still
725 * in the FIFO), but we will have to wait for them.
727 * In short, this code works pretty well, but for either of
728 * the two reasons noted, might end up waiting for a few more
729 * samples than actually requested. Shouldn't make too much
733 /* Save away the number of conversions we should perform, and
734 * compute the FIFO threshold (in bytes, not samples - that's
735 * why we multiple local->count by 2 = sizeof(sample))
738 if (cmd->stop_src == TRIG_COUNT) {
739 local->count = cmd->stop_arg * cmd->scan_end_arg;
740 threshold = 2 * local->count;
741 while (threshold > DAQP_FIFO_SIZE * 3 / 4)
745 threshold = DAQP_FIFO_SIZE / 2;
748 /* Reset data FIFO (see page 28 of DAQP User's Manual) */
750 outb(DAQP_COMMAND_RSTF, dev->iobase + DAQP_COMMAND);
752 /* Set FIFO threshold. First two bytes are near-empty
753 * threshold, which is unused; next two bytes are near-full
754 * threshold. We computed the number of bytes we want in the
755 * FIFO when the interrupt is generated, what the card wants
756 * is actually the number of available bytes left in the FIFO
757 * when the interrupt is to happen.
760 outb(0x00, dev->iobase + DAQP_FIFO);
761 outb(0x00, dev->iobase + DAQP_FIFO);
763 outb((DAQP_FIFO_SIZE - threshold) & 0xff, dev->iobase + DAQP_FIFO);
764 outb((DAQP_FIFO_SIZE - threshold) >> 8, dev->iobase + DAQP_FIFO);
768 v = DAQP_CONTROL_TRIGGER_CONTINUOUS | DAQP_CONTROL_TRIGGER_INTERNAL
769 | DAQP_CONTROL_PACER_5MHz | DAQP_CONTROL_FIFO_INT_ENABLE;
771 outb(v, dev->iobase + DAQP_CONTROL);
773 /* Reset any pending interrupts (my card has a tendancy to require
774 * require multiple reads on the status register to achieve this)
778 && (inb(dev->iobase + DAQP_STATUS) & DAQP_STATUS_EVENTS)) ;
780 printk("daqp: couldn't clear interrupts in status register\n");
784 local->interrupt_mode = buffer;
788 /* Start conversion */
789 outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA,
790 dev->iobase + DAQP_COMMAND);
795 /* Single-shot analog output routine */
797 static int daqp_ao_insn_write(comedi_device * dev, comedi_subdevice * s,
798 comedi_insn * insn, lsampl_t * data)
800 local_info_t *local = (local_info_t *) s->private;
808 chan = CR_CHAN(insn->chanspec);
811 d ^= 0x0800; /* Flip the sign */
814 /* Make sure D/A update mode is direct update */
815 outb(0, dev->iobase + DAQP_AUX);
817 outw(d, dev->iobase + DAQP_DA);
822 /* Digital input routine */
824 static int daqp_di_insn_read(comedi_device * dev, comedi_subdevice * s,
825 comedi_insn * insn, lsampl_t * data)
827 local_info_t *local = (local_info_t *) s->private;
833 data[0] = inb(dev->iobase + DAQP_DIGITAL_IO);
838 /* Digital output routine */
840 static int daqp_do_insn_write(comedi_device * dev, comedi_subdevice * s,
841 comedi_insn * insn, lsampl_t * data)
843 local_info_t *local = (local_info_t *) s->private;
849 outw(data[0] & 0xf, dev->iobase + DAQP_DIGITAL_IO);
854 /* daqp_attach is called via comedi_config to attach a comedi device
855 * to a /dev/comedi*. Note that this is different from daqp_cs_attach()
856 * which is called by the pcmcia subsystem to attach the PCMCIA card
857 * when it is inserted.
860 static int daqp_attach(comedi_device * dev, comedi_devconfig * it)
863 local_info_t *local = dev_table[it->options[0]];
868 if (it->options[0] < 0 || it->options[0] >= MAX_DEV || !local) {
869 printk("comedi%d: No such daqp device %d\n",
870 dev->minor, it->options[0]);
874 /* Typically brittle code that I don't completely understand,
875 * but "it works on my card". The intent is to pull the model
876 * number of the card out the PCMCIA CIS and stash it away as
877 * the COMEDI board_name. Looks like the third field in
878 * CISTPL_VERS_1 (offset 2) holds what we're looking for. If
879 * it doesn't work, who cares, just leave it as "DAQP".
882 strcpy(local->board_name, "DAQP");
883 dev->board_name = local->board_name;
885 tuple.DesiredTuple = CISTPL_VERS_1;
886 if (pcmcia_get_first_tuple(local->link, &tuple) == 0) {
889 buf[0] = buf[sizeof(buf) - 1] = 0;
890 tuple.TupleData = buf;
891 tuple.TupleDataMax = sizeof(buf);
892 tuple.TupleOffset = 2;
893 if (pcmcia_get_tuple_data(local->link, &tuple) == 0) {
895 for (i = 0; i < tuple.TupleDataLen - 4; i++)
898 for (i++; i < tuple.TupleDataLen - 4; i++)
902 if ((i < tuple.TupleDataLen - 4)
903 && (strncmp(buf + i, "DAQP", 4) == 0)) {
904 strncpy(local->board_name, buf + i,
905 sizeof(local->board_name));
910 dev->iobase = local->link->io.BasePort1;
912 if ((ret = alloc_subdevices(dev, 4)) < 0)
915 printk("comedi%d: attaching daqp%d (io 0x%04lx)\n",
916 dev->minor, it->options[0], dev->iobase);
918 s = dev->subdevices + 0;
919 dev->read_subdev = s;
921 s->type = COMEDI_SUBD_AI;
922 s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF | SDF_CMD_READ;
924 s->len_chanlist = 2048;
926 s->range_table = &range_daqp_ai;
927 s->insn_read = daqp_ai_insn_read;
928 s->do_cmdtest = daqp_ai_cmdtest;
929 s->do_cmd = daqp_ai_cmd;
930 s->cancel = daqp_ai_cancel;
932 s = dev->subdevices + 1;
933 dev->write_subdev = s;
935 s->type = COMEDI_SUBD_AO;
936 s->subdev_flags = SDF_WRITEABLE;
940 s->range_table = &range_daqp_ao;
941 s->insn_write = daqp_ao_insn_write;
943 s = dev->subdevices + 2;
945 s->type = COMEDI_SUBD_DI;
946 s->subdev_flags = SDF_READABLE;
949 s->insn_read = daqp_di_insn_read;
951 s = dev->subdevices + 3;
953 s->type = COMEDI_SUBD_DO;
954 s->subdev_flags = SDF_WRITEABLE;
957 s->insn_write = daqp_do_insn_write;
962 /* daqp_detach (called from comedi_comdig) does nothing. If the PCMCIA
963 * card is removed, daqp_cs_detach() is called by the pcmcia subsystem.
966 static int daqp_detach(comedi_device * dev)
968 printk("comedi%d: detaching daqp\n", dev->minor);
973 /*====================================================================
975 PCMCIA interface code
977 The rest of the code in this file is based on dummy_cs.c v1.24
978 from the Linux pcmcia_cs distribution v3.1.8 and is subject
979 to the following license agreement.
981 The remaining contents of this file are subject to the Mozilla Public
982 License Version 1.1 (the "License"); you may not use this file
983 except in compliance with the License. You may obtain a copy of
984 the License at http://www.mozilla.org/MPL/
986 Software distributed under the License is distributed on an "AS
987 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
988 implied. See the License for the specific language governing
989 rights and limitations under the License.
991 The initial developer of the original code is David A. Hinds
992 <dhinds@pcmcia.sourceforge.org>. Portions created by David A. Hinds
993 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
995 Alternatively, the contents of this file may be used under the
996 terms of the GNU Public License version 2 (the "GPL"), in which
997 case the provisions of the GPL are applicable instead of the
998 above. If you wish to allow the use of your version of this file
999 only under the terms of the GPL and not to allow others to use
1000 your version of this file under the MPL, indicate your decision
1001 by deleting the provisions above and replace them with the notice
1002 and other provisions required by the GPL. If you do not delete
1003 the provisions above, a recipient may use your version of this
1004 file under either the MPL or the GPL.
1006 ======================================================================*/
1009 The event() function is this driver's Card Services event handler.
1010 It will be called by Card Services when an appropriate card status
1011 event is received. The config() and release() entry points are
1012 used to configure or release a socket, in response to card
1013 insertion and ejection events.
1015 Kernel version 2.6.16 upwards uses suspend() and resume() functions
1016 instead of an event() function.
1019 static void daqp_cs_config(struct pcmcia_device *link);
1020 static void daqp_cs_release(struct pcmcia_device *link);
1021 static int daqp_cs_suspend(struct pcmcia_device *p_dev);
1022 static int daqp_cs_resume(struct pcmcia_device *p_dev);
1025 The attach() and detach() entry points are used to create and destroy
1026 "instances" of the driver, where each instance represents everything
1027 needed to manage one actual PCMCIA card.
1030 static int daqp_cs_attach(struct pcmcia_device *);
1031 static void daqp_cs_detach(struct pcmcia_device *);
1034 The dev_info variable is the "key" that is used to match up this
1035 device driver with appropriate cards, through the card configuration
1039 static const dev_info_t dev_info = "quatech_daqp_cs";
1041 /*======================================================================
1043 daqp_cs_attach() creates an "instance" of the driver, allocating
1044 local data structures for one device. The device is registered
1047 The dev_link structure is initialized, but we don't actually
1048 configure the card at this point -- we wait until we receive a
1049 card insertion event.
1051 ======================================================================*/
1053 static int daqp_cs_attach(struct pcmcia_device *link)
1055 local_info_t *local;
1058 DEBUG(0, "daqp_cs_attach()\n");
1060 for (i = 0; i < MAX_DEV; i++)
1061 if (dev_table[i] == NULL)
1064 printk(KERN_NOTICE "daqp_cs: no devices available\n");
1068 /* Allocate space for private device-specific data */
1069 local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
1073 local->table_index = i;
1074 dev_table[i] = local;
1078 /* Interrupt setup */
1079 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
1080 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
1081 link->irq.Handler = daqp_interrupt;
1082 link->irq.Instance = local;
1085 General socket configuration defaults can go here. In this
1086 client, we assume very little, and rely on the CIS for almost
1087 everything. In most clients, many details (i.e., number, sizes,
1088 and attributes of IO windows) are fixed by the nature of the
1089 device, and can be hard-wired here.
1091 link->conf.Attributes = 0;
1092 link->conf.IntType = INT_MEMORY_AND_IO;
1094 daqp_cs_config(link);
1097 } /* daqp_cs_attach */
1099 /*======================================================================
1101 This deletes a driver "instance". The device is de-registered
1102 with Card Services. If it has been released, all local data
1103 structures are freed. Otherwise, the structures will be freed
1104 when the device is released.
1106 ======================================================================*/
1108 static void daqp_cs_detach(struct pcmcia_device *link)
1110 local_info_t *dev = link->priv;
1112 DEBUG(0, "daqp_cs_detach(0x%p)\n", link);
1114 if (link->dev_node) {
1116 daqp_cs_release(link);
1119 /* Unlink device structure, and free it */
1120 dev_table[dev->table_index] = NULL;
1124 } /* daqp_cs_detach */
1126 /*======================================================================
1128 daqp_cs_config() is scheduled to run after a CARD_INSERTION event
1129 is received, to configure the PCMCIA socket, and to make the
1130 device available to the system.
1132 ======================================================================*/
1134 static void daqp_cs_config(struct pcmcia_device *link)
1136 local_info_t *dev = link->priv;
1142 DEBUG(0, "daqp_cs_config(0x%p)\n", link);
1145 This reads the card's CONFIG tuple to find its configuration
1148 tuple.DesiredTuple = CISTPL_CONFIG;
1149 tuple.Attributes = 0;
1150 tuple.TupleData = buf;
1151 tuple.TupleDataMax = sizeof(buf);
1152 tuple.TupleOffset = 0;
1153 if ((last_ret = pcmcia_get_first_tuple(link, &tuple))) {
1154 cs_error(link, GetFirstTuple, last_ret);
1157 if ((last_ret = pcmcia_get_tuple_data(link, &tuple))) {
1158 cs_error(link, GetTupleData, last_ret);
1161 if ((last_ret = pcmcia_parse_tuple(&tuple, &parse))) {
1162 cs_error(link, ParseTuple, last_ret);
1165 link->conf.ConfigBase = parse.config.base;
1166 link->conf.Present = parse.config.rmask[0];
1169 In this loop, we scan the CIS for configuration table entries,
1170 each of which describes a valid card configuration, including
1171 voltage, IO window, memory window, and interrupt settings.
1173 We make no assumptions about the card to be configured: we use
1174 just the information available in the CIS. In an ideal world,
1175 this would work for any PCMCIA card, but it requires a complete
1176 and accurate CIS. In practice, a driver usually "knows" most of
1177 these things without consulting the CIS, and most client drivers
1178 will only use the CIS to fill in implementation-defined details.
1180 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
1181 if ((last_ret = pcmcia_get_first_tuple(link, &tuple))) {
1182 cs_error(link, GetFirstTuple, last_ret);
1186 cistpl_cftable_entry_t dflt = { 0 };
1187 cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
1188 if (pcmcia_get_tuple_data(link, &tuple))
1190 if (pcmcia_parse_tuple(&tuple, &parse))
1193 if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
1195 if (cfg->index == 0)
1197 link->conf.ConfigIndex = cfg->index;
1199 /* Do we need to allocate an interrupt? */
1200 if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)
1201 link->conf.Attributes |= CONF_ENABLE_IRQ;
1203 /* IO window settings */
1204 link->io.NumPorts1 = link->io.NumPorts2 = 0;
1205 if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
1206 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
1207 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
1208 if (!(io->flags & CISTPL_IO_8BIT))
1209 link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
1210 if (!(io->flags & CISTPL_IO_16BIT))
1211 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
1212 link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
1213 link->io.BasePort1 = io->win[0].base;
1214 link->io.NumPorts1 = io->win[0].len;
1216 link->io.Attributes2 = link->io.Attributes1;
1217 link->io.BasePort2 = io->win[1].base;
1218 link->io.NumPorts2 = io->win[1].len;
1222 /* This reserves IO space but doesn't actually enable it */
1223 if (pcmcia_request_io(link, &link->io))
1226 /* If we got this far, we're cool! */
1230 if ((last_ret = pcmcia_get_next_tuple(link, &tuple))) {
1231 cs_error(link, GetNextTuple, last_ret);
1237 Allocate an interrupt line. Note that this does not assign a
1238 handler to the interrupt, unless the 'Handler' member of the
1239 irq structure is initialized.
1241 if (link->conf.Attributes & CONF_ENABLE_IRQ)
1242 if ((last_ret = pcmcia_request_irq(link, &link->irq))) {
1243 cs_error(link, RequestIRQ, last_ret);
1248 This actually configures the PCMCIA socket -- setting up
1249 the I/O windows and the interrupt mapping, and putting the
1250 card and host interface into "Memory and IO" mode.
1252 if ((last_ret = pcmcia_request_configuration(link, &link->conf))) {
1253 cs_error(link, RequestConfiguration, last_ret);
1258 At this point, the dev_node_t structure(s) need to be
1259 initialized and arranged in a linked list at link->dev.
1261 /* Comedi's PCMCIA script uses this device name (extracted
1262 * from /var/lib/pcmcia/stab) to pass to comedi_config
1264 /* sprintf(dev->node.dev_name, "daqp%d", dev->table_index); */
1265 sprintf(dev->node.dev_name, "quatech_daqp_cs");
1266 dev->node.major = dev->node.minor = 0;
1267 link->dev_node = &dev->node;
1269 /* Finally, report what we've done */
1270 printk(KERN_INFO "%s: index 0x%02x",
1271 dev->node.dev_name, link->conf.ConfigIndex);
1272 if (link->conf.Attributes & CONF_ENABLE_IRQ)
1273 printk(", irq %u", link->irq.AssignedIRQ);
1274 if (link->io.NumPorts1)
1275 printk(", io 0x%04x-0x%04x", link->io.BasePort1,
1276 link->io.BasePort1 + link->io.NumPorts1 - 1);
1277 if (link->io.NumPorts2)
1278 printk(" & 0x%04x-0x%04x", link->io.BasePort2,
1279 link->io.BasePort2 + link->io.NumPorts2 - 1);
1285 daqp_cs_release(link);
1287 } /* daqp_cs_config */
1289 static void daqp_cs_release(struct pcmcia_device *link)
1291 DEBUG(0, "daqp_cs_release(0x%p)\n", link);
1293 pcmcia_disable_device(link);
1294 } /* daqp_cs_release */
1296 /*======================================================================
1298 The card status event handler. Mostly, this schedules other
1299 stuff to run after an event is received.
1301 When a CARD_REMOVAL event is received, we immediately set a
1302 private flag to block future accesses to this device. All the
1303 functions that actually access the device should check this flag
1304 to make sure the card is still present.
1306 ======================================================================*/
1308 static int daqp_cs_suspend(struct pcmcia_device *link)
1310 local_info_t *local = link->priv;
1312 /* Mark the device as stopped, to block IO until later */
1317 static int daqp_cs_resume(struct pcmcia_device *link)
1319 local_info_t *local = link->priv;
1326 /*====================================================================*/
1330 static struct pcmcia_device_id daqp_cs_id_table[] = {
1331 PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0027),
1335 MODULE_DEVICE_TABLE(pcmcia, daqp_cs_id_table);
1337 struct pcmcia_driver daqp_cs_driver = {
1338 .probe = daqp_cs_attach,
1339 .remove = daqp_cs_detach,
1340 .suspend = daqp_cs_suspend,
1341 .resume = daqp_cs_resume,
1342 .id_table = daqp_cs_id_table,
1343 .owner = THIS_MODULE,
1349 int __init init_module(void)
1351 DEBUG(0, "%s\n", version);
1352 pcmcia_register_driver(&daqp_cs_driver);
1353 comedi_driver_register(&driver_daqp);
1357 void __exit cleanup_module(void)
1359 DEBUG(0, "daqp_cs: unloading\n");
1360 comedi_driver_unregister(&driver_daqp);
1361 pcmcia_unregister_driver(&daqp_cs_driver);