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.
22 Description: Amplicon PCI263
23 Author: Ian Abbott <abbotti@mev.co.uk>
24 Devices: [Amplicon] PCI263 (amplc_pci263)
25 Updated: Fri, 12 Apr 2013 15:19:36 +0100
28 Configuration options: not applicable, uses PCI auto config
30 The board appears as one subdevice, with 16 digital outputs, each
31 connected to a reed-relay. Relay contacts are closed when output is 1.
32 The state of the outputs can be read.
35 #include <linux/pci.h>
37 #include "../comedidev.h"
39 #define PCI263_DRIVER_NAME "amplc_pci263"
41 /* PCI263 PCI configuration register information */
42 #define PCI_DEVICE_ID_AMPLICON_PCI263 0x000c
44 static int pci263_do_insn_bits(struct comedi_device
*dev
,
45 struct comedi_subdevice
*s
,
46 struct comedi_insn
*insn
, unsigned int *data
)
48 /* The insn data is a mask in data[0] and the new data
49 * in data[1], each channel cooresponding to a bit. */
52 s
->state
|= data
[0] & data
[1];
53 /* Write out the new digital output lines */
54 outb(s
->state
& 0xFF, dev
->iobase
);
55 outb(s
->state
>> 8, dev
->iobase
+ 1);
60 static int pci263_auto_attach(struct comedi_device
*dev
,
61 unsigned long context_unused
)
63 struct pci_dev
*pci_dev
= comedi_to_pci_dev(dev
);
64 struct comedi_subdevice
*s
;
67 ret
= comedi_pci_enable(dev
);
71 dev
->iobase
= pci_resource_start(pci_dev
, 2);
72 ret
= comedi_alloc_subdevices(dev
, 1);
76 s
= &dev
->subdevices
[0];
77 /* digital output subdevice */
78 s
->type
= COMEDI_SUBD_DO
;
79 s
->subdev_flags
= SDF_READABLE
| SDF_WRITABLE
;
82 s
->range_table
= &range_digital
;
83 s
->insn_bits
= pci263_do_insn_bits
;
84 /* read initial relay state */
85 s
->state
= inb(dev
->iobase
) | (inb(dev
->iobase
+ 1) << 8);
87 dev_info(dev
->class_dev
, "%s (pci %s) attached\n", dev
->board_name
,
92 static struct comedi_driver amplc_pci263_driver
= {
93 .driver_name
= PCI263_DRIVER_NAME
,
94 .module
= THIS_MODULE
,
95 .auto_attach
= pci263_auto_attach
,
96 .detach
= comedi_pci_disable
,
99 static DEFINE_PCI_DEVICE_TABLE(pci263_pci_table
) = {
100 { PCI_DEVICE(PCI_VENDOR_ID_AMPLICON
, PCI_DEVICE_ID_AMPLICON_PCI263
) },
103 MODULE_DEVICE_TABLE(pci
, pci263_pci_table
);
105 static int amplc_pci263_pci_probe(struct pci_dev
*dev
,
106 const struct pci_device_id
*id
)
108 return comedi_pci_auto_config(dev
, &lc_pci263_driver
,
112 static struct pci_driver amplc_pci263_pci_driver
= {
113 .name
= PCI263_DRIVER_NAME
,
114 .id_table
= pci263_pci_table
,
115 .probe
= &lc_pci263_pci_probe
,
116 .remove
= comedi_pci_auto_unconfig
,
118 module_comedi_pci_driver(amplc_pci263_driver
, amplc_pci263_pci_driver
);
120 MODULE_AUTHOR("Comedi http://www.comedi.org");
121 MODULE_DESCRIPTION("Comedi driver for Amplicon PCI263 relay board");
122 MODULE_LICENSE("GPL");