3 hardware driver for Data Translation DT2817
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 1998 David A. Schleef <ds@schleef.org>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 Description: Data Translation DT2817
28 Devices: [Data Translation] DT2817 (dt2817)
30 A very simple digital I/O card. Four banks of 8 lines, each bank
31 is configurable for input or output. One wonders why it takes a
32 50 page manual to describe this thing.
34 The driver (which, btw, is much less than 50 pages) has 1 subdevice
35 with 32 channels, configurable in groups of 8.
37 Configuration options:
38 [0] - I/O port base base address
41 #include <linux/comedidev.h>
43 #include <linux/ioport.h>
53 static int dt2817_attach(comedi_device *dev,comedi_devconfig *it);
54 static int dt2817_detach(comedi_device *dev);
55 static comedi_driver driver_dt2817={
56 driver_name: "dt2817",
58 attach: dt2817_attach,
59 detach: dt2817_detach,
61 COMEDI_INITCLEANUP(driver_dt2817);
64 static int dt2817_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
65 comedi_insn *insn,lsampl_t *data)
71 if(insn->n!=1)return -EINVAL;
73 chan=CR_CHAN(insn->chanspec);
80 }else mask=0xff000000;
81 if(data[0])s->io_bits|=mask;
82 else s->io_bits&=~mask;
84 if(s->io_bits&0x000000ff)oe|=0x1;
85 if(s->io_bits&0x0000ff00)oe|=0x2;
86 if(s->io_bits&0x00ff0000)oe|=0x4;
87 if(s->io_bits&0xff000000)oe|=0x8;
89 outb(oe,dev->iobase + DT2817_CR);
94 static int dt2817_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
95 comedi_insn *insn,lsampl_t *data)
99 /* It's questionable whether it is more important in
100 * a driver like this to be deterministic or fast.
105 s->state &= ~data[0];
106 s->state |= (data[0]&data[1]);
108 changed &= s->io_bits;
109 if(changed&0x000000ff)
110 outb(s->state&0xff, dev->iobase + DT2817_DATA+0);
111 if(changed&0x0000ff00)
112 outb((s->state>>8)&0xff, dev->iobase + DT2817_DATA+1);
113 if(changed&0x00ff0000)
114 outb((s->state>>16)&0xff, dev->iobase + DT2817_DATA+2);
115 if(changed&0xff000000)
116 outb((s->state>>24)&0xff, dev->iobase + DT2817_DATA+3);
118 data[1] = inb(dev->iobase + DT2817_DATA + 0);
119 data[1] |= (inb(dev->iobase + DT2817_DATA + 1)<<8);
120 data[1] |= (inb(dev->iobase + DT2817_DATA + 2)<<16);
121 data[1] |= (inb(dev->iobase + DT2817_DATA + 3)<<24);
126 static int dt2817_attach(comedi_device *dev,comedi_devconfig *it)
130 unsigned long iobase;
132 iobase=it->options[0];
133 printk("comedi%d: dt2817: 0x%04lx ",dev->minor,iobase);
134 if(!request_region(iobase,DT2817_SIZE,"dt2817")){
135 printk("I/O port conflict\n");
138 dev->iobase = iobase;
139 dev->board_name="dt2817";
141 if((ret=alloc_subdevices(dev, 1))<0)
147 s->type=COMEDI_SUBD_DIO;
148 s->subdev_flags=SDF_READABLE|SDF_WRITABLE;
149 s->range_table=&range_digital;
151 s->insn_bits=dt2817_dio_insn_bits;
152 s->insn_config=dt2817_dio_insn_config;
155 outb(0,dev->iobase+DT2817_CR);
163 static int dt2817_detach(comedi_device *dev)
165 printk("comedi%d: dt2817: remove\n",dev->minor);
168 release_region(dev->iobase,DT2817_SIZE);