2 comedi/drivers/adl_pci7432.c
4 Hardware comedi driver fot PCI7432 Adlink card
5 Copyright (C) 2004 Michel Lachine <mike@mikelachaine.ca>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 Description: Driver for the Adlink PCI-7432 64 ch. isolated digital io board
25 Devices: [ADLink] PCI-7432 (pci7432)
26 Author: Michel Lachaine <mike@mikelachaine.ca>
29 Configuration Options:
33 #include <linux/comedidev.h>
34 #include <linux/kernel.h>
35 #include <linux/pci.h>
37 #define PCI7432_DI 0x00
38 #define PCI7432_DO 0x00
40 #define PCI_DEVICE_ID_PCI7432 0x7432
48 static adl_pci7432_board adl_pci7432_boards[] = {
49 { "pci7432", PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7432 },
52 static struct pci_device_id adl_pci7432_pci_table[] __devinitdata = {
53 { PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7432, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
56 MODULE_DEVICE_TABLE(pci, adl_pci7432_pci_table);
58 #define thisboard ((adl_pci7432_board *)dev->board_ptr)
62 struct pci_dev *pci_dev;
63 } adl_pci7432_private;
65 #define devpriv ((adl_pci7432_private *)dev->private)
67 static int adl_pci7432_attach(comedi_device *dev,comedi_devconfig *it);
68 static int adl_pci7432_detach(comedi_device *dev);
69 static comedi_driver driver_adl_pci7432={
70 driver_name: "adl_pci7432",
72 attach: adl_pci7432_attach,
73 detach: adl_pci7432_detach,
75 board_name: (const char**)adl_pci7432_boards,
76 offset: sizeof(adl_pci7432_board),
81 static int adl_pci7432_di_insn_bits(comedi_device *dev,comedi_subdevice *s,
82 comedi_insn *insn,lsampl_t *data);
84 static int adl_pci7432_do_insn_bits(comedi_device *dev,comedi_subdevice *s,
85 comedi_insn *insn,lsampl_t *data);
89 static int adl_pci7432_attach(comedi_device *dev,comedi_devconfig *it)
91 struct pci_dev *pcidev;
94 printk("comedi: attempt to attach...\n");
95 printk("comedi%d: adl_pci7432: board=%s\n",dev->minor, thisboard->name);
97 dev->board_name = thisboard->name;
99 if(alloc_private(dev,sizeof(adl_pci7432_private))<0)
102 if(alloc_subdevices(dev, 2)<0)
105 for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ;
106 pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev))
109 if ( pcidev->vendor == PCI_VENDOR_ID_ADLINK &&
110 pcidev->device == PCI_DEVICE_ID_PCI7432 ) {
111 devpriv->pci_dev = pcidev;
112 if (pci_enable_device(pcidev) < 0) {
113 printk("comedi%d: Failed to enable PCI device\n", dev->minor);
116 if (pci_request_regions(pcidev, "adl_pci7432") < 0) {
117 printk("comedi%d: I/O port conflict\n", dev->minor);
120 dev->iobase = pci_resource_start ( pcidev, 2 );
121 printk ( "comedi: base addr %4lx\n", dev->iobase );
123 dev->board_ptr = adl_pci7432_boards + 0;
126 s->type = COMEDI_SUBD_DI;
127 s->subdev_flags = SDF_READABLE|SDF_GROUND|SDF_COMMON;
130 s->len_chanlist = 32;
131 s->io_bits = 0x00000000;
132 s->range_table = &range_digital;
133 s->insn_bits = adl_pci7432_di_insn_bits;
136 s->type = COMEDI_SUBD_DO;
137 s->subdev_flags = SDF_WRITABLE|SDF_GROUND|SDF_COMMON;
140 s->len_chanlist = 32;
141 s->io_bits = 0xffffffff;
142 s->range_table = &range_digital;
143 s->insn_bits = adl_pci7432_do_insn_bits;
149 printk("comedi: attached\n");
155 static int adl_pci7432_detach(comedi_device *dev)
157 printk("comedi%d: pci7432: remove\n",dev->minor);
159 if (devpriv && devpriv->pci_dev) {
161 pci_release_regions(devpriv->pci_dev);
162 pci_disable_device(devpriv->pci_dev);
164 pci_dev_put(devpriv->pci_dev);
171 static int adl_pci7432_do_insn_bits(comedi_device *dev,comedi_subdevice *s, comedi_insn *insn,lsampl_t *data)
173 printk ( "comedi: pci7432_do_insn_bits called\n" );
174 printk ( "comedi: data0: %8x data1: %8x\n", data[0], data[1] );
176 if(insn->n!=2)return -EINVAL;
179 s->state &= ~data[0];
180 s->state |= (data[0]&data[1]);
182 printk ( "comedi: out: %8x on iobase %4lx\n", s->state, dev->iobase + PCI7432_DO);
183 outl(s->state & 0xffffffff, dev->iobase + PCI7432_DO);
188 static int adl_pci7432_di_insn_bits(comedi_device *dev,comedi_subdevice *s, comedi_insn *insn,lsampl_t *data)
190 printk ( "comedi: pci7432_di_insn_bits called\n" );
191 printk ( "comedi: data0: %8x data1: %8x\n", data[0], data[1] );
193 if(insn->n!=2)return -EINVAL;
195 data[1] = inl(dev->iobase + PCI7432_DI) & 0xffffffff;
196 printk ( "comedi: data1 %8x\n", data[1] );
201 COMEDI_INITCLEANUP(driver_adl_pci7432);