2 comedi/drivers/amplc_pci263.c
3 Driver for Amplicon PCI263 relay board.
5 Copyright (C) 2002 MEV Ltd. <http://www.mev.co.uk/>
7 COMEDI - Linux Control and Measurement Device Interface
8 Copyright (C) 2000 David A. Schleef <ds@schleef.org>
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 Description: Amplicon PCI263
28 Author: Ian Abbott <abbotti@mev.co.uk>
29 Devices: [Amplicon] PCI263 (amplc_pci263)
30 Updated: Fri, 12 Apr 2013 15:19:36 +0100
33 Configuration options: not applicable, uses PCI auto config
35 The board appears as one subdevice, with 16 digital outputs, each
36 connected to a reed-relay. Relay contacts are closed when output is 1.
37 The state of the outputs can be read.
40 #include <linux/pci.h>
42 #include "../comedidev.h"
44 #define PCI263_DRIVER_NAME "amplc_pci263"
46 /* PCI263 PCI configuration register information */
47 #define PCI_DEVICE_ID_AMPLICON_PCI263 0x000c
49 static int pci263_do_insn_bits(struct comedi_device
*dev
,
50 struct comedi_subdevice
*s
,
51 struct comedi_insn
*insn
, unsigned int *data
)
53 /* The insn data is a mask in data[0] and the new data
54 * in data[1], each channel cooresponding to a bit. */
57 s
->state
|= data
[0] & data
[1];
58 /* Write out the new digital output lines */
59 outb(s
->state
& 0xFF, dev
->iobase
);
60 outb(s
->state
>> 8, dev
->iobase
+ 1);
68 static int pci263_auto_attach(struct comedi_device
*dev
,
69 unsigned long context_unused
)
71 struct pci_dev
*pci_dev
= comedi_to_pci_dev(dev
);
72 struct comedi_subdevice
*s
;
75 ret
= comedi_pci_enable(dev
);
79 dev
->iobase
= pci_resource_start(pci_dev
, 2);
80 ret
= comedi_alloc_subdevices(dev
, 1);
84 s
= &dev
->subdevices
[0];
85 /* digital output subdevice */
86 s
->type
= COMEDI_SUBD_DO
;
87 s
->subdev_flags
= SDF_READABLE
| SDF_WRITABLE
;
90 s
->range_table
= &range_digital
;
91 s
->insn_bits
= pci263_do_insn_bits
;
92 /* read initial relay state */
93 s
->state
= inb(dev
->iobase
) | (inb(dev
->iobase
+ 1) << 8);
95 dev_info(dev
->class_dev
, "%s (pci %s) attached\n", dev
->board_name
,
100 static struct comedi_driver amplc_pci263_driver
= {
101 .driver_name
= PCI263_DRIVER_NAME
,
102 .module
= THIS_MODULE
,
103 .auto_attach
= pci263_auto_attach
,
104 .detach
= comedi_pci_disable
,
107 static DEFINE_PCI_DEVICE_TABLE(pci263_pci_table
) = {
108 { PCI_DEVICE(PCI_VENDOR_ID_AMPLICON
, PCI_DEVICE_ID_AMPLICON_PCI263
) },
111 MODULE_DEVICE_TABLE(pci
, pci263_pci_table
);
113 static int amplc_pci263_pci_probe(struct pci_dev
*dev
,
114 const struct pci_device_id
*id
)
116 return comedi_pci_auto_config(dev
, &lc_pci263_driver
,
120 static struct pci_driver amplc_pci263_pci_driver
= {
121 .name
= PCI263_DRIVER_NAME
,
122 .id_table
= pci263_pci_table
,
123 .probe
= &lc_pci263_pci_probe
,
124 .remove
= comedi_pci_auto_unconfig
,
126 module_comedi_pci_driver(amplc_pci263_driver
, amplc_pci263_pci_driver
);
128 MODULE_AUTHOR("Comedi http://www.comedi.org");
129 MODULE_DESCRIPTION("Comedi driver for Amplicon PCI263 relay board");
130 MODULE_LICENSE("GPL");