From: Frank Mori Hess Date: Mon, 12 Apr 2010 17:37:51 +0000 (+0000) Subject: Added Adlink PCI-7230 driver from David Fernandez. X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=fe66c422800eaede752845aece3ec0f2156a5d4a;p=comedi.git Added Adlink PCI-7230 driver from David Fernandez. --- diff --git a/AUTHORS b/AUTHORS index 00ca7a13..f18a3a2d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,6 +13,7 @@ Dan Christian Andrea Cisternino Calin Culianu Michal Dobes +David Fernández Truxton Fulton Jon Grierson Juan Grigera diff --git a/comedi/drivers/Kbuild b/comedi/drivers/Kbuild index da209dff..6fb1d07a 100644 --- a/comedi/drivers/Kbuild +++ b/comedi/drivers/Kbuild @@ -26,6 +26,7 @@ obj-$(CONFIG_COMEDI_PCI_MODULES) += addi_apci_3501.o obj-$(CONFIG_COMEDI_PCI_MODULES) += addi_apci_3xxx.o #obj-$(CONFIG_COMEDI_PCI_MODULES) += addi_apci_all.o obj-$(CONFIG_COMEDI_PCI_MODULES) += adl_pci6208.o +obj-$(CONFIG_COMEDI_PCI_MODULES) += adl_pci7230.o obj-$(CONFIG_COMEDI_PCI_MODULES) += adl_pci7296.o obj-$(CONFIG_COMEDI_PCI_MODULES) += adl_pci7432.o obj-$(CONFIG_COMEDI_PCI_MODULES) += adl_pci8164.o diff --git a/comedi/drivers/Makefile.am b/comedi/drivers/Makefile.am index 85b7a1b0..956c3bba 100644 --- a/comedi/drivers/Makefile.am +++ b/comedi/drivers/Makefile.am @@ -105,6 +105,7 @@ pci_modules2= \ addi_apci_3501.ko \ addi_apci_3xxx.ko \ adl_pci6208.ko \ + adl_pci7230.ko \ adl_pci7296.ko \ adl_pci7432.ko \ adl_pci8164.ko \ diff --git a/comedi/drivers/adl_pci7230.c b/comedi/drivers/adl_pci7230.c new file mode 100644 index 00000000..a42dcc45 --- /dev/null +++ b/comedi/drivers/adl_pci7230.c @@ -0,0 +1,187 @@ +/* + comedi/drivers/adl_pci7230.c + + Hardware comedi driver fot PCI7230 Adlink card + Copyright (C) 2010 David Fernandez + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ +/* +Driver: adl_pci7230 +Description: Driver for the Adlink PCI-7230 32 ch. isolated digital io board +Devices: [ADLink] PCI-7230 (adl_pci7230) +Author: David Fernandez +Status: experimental +Updated: Mon, 14 Apr 2008 15:08:14 +0100 + +Configuration Options: + [0] - PCI bus of device (optional) + [1] - PCI slot of device (optional) + If bus/slot is not specified, the first supported + PCI device found will be used. +*/ + +#include +#include +#include "comedi_pci.h" + +#define PCI7230_DI 0x00 +#define PCI7230_DO 0x00 + +#define PCI_DEVICE_ID_PCI7230 0x7230 + +static DEFINE_PCI_DEVICE_TABLE(adl_pci7230_pci_table) = { + {PCI_VENDOR_ID_ADLINK, PCI_DEVICE_ID_PCI7230, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0} +}; + +MODULE_DEVICE_TABLE(pci, adl_pci7230_pci_table); + +typedef struct { + int data; + struct pci_dev *pci_dev; +} adl_pci7230_private; + +#define devpriv ((adl_pci7230_private *)dev->private) + +static int adl_pci7230_attach(comedi_device * dev, comedi_devconfig * it); +static int adl_pci7230_detach(comedi_device * dev); +static comedi_driver driver_adl_pci7230 = { + driver_name:"adl_pci7230", + module:THIS_MODULE, + attach:adl_pci7230_attach, + detach:adl_pci7230_detach, +}; + +/* Digital IO */ + +static int adl_pci7230_di_insn_bits(comedi_device * dev, comedi_subdevice * s, + comedi_insn * insn, lsampl_t * data); + +static int adl_pci7230_do_insn_bits(comedi_device * dev, comedi_subdevice * s, + comedi_insn * insn, lsampl_t * data); + +/* */ + +static int adl_pci7230_attach(comedi_device * dev, comedi_devconfig * it) +{ + struct pci_dev *pcidev; + comedi_subdevice *s; + int bus, slot; + + printk("comedi: attempt to attach...\n"); + printk("comedi%d: adl_pci7230\n", dev->minor); + + dev->board_name = "pci7230"; + bus = it->options[0]; + slot = it->options[1]; + + if (alloc_private(dev, sizeof(adl_pci7230_private)) < 0) + return -ENOMEM; + + if (alloc_subdevices(dev, 2) < 0) + return -ENOMEM; + + for (pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); + pcidev != NULL; + pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) { + + if (pcidev->vendor == PCI_VENDOR_ID_ADLINK && + pcidev->device == PCI_DEVICE_ID_PCI7230) { + if (bus || slot) { + /* requested particular bus/slot */ + if (pcidev->bus->number != bus || PCI_SLOT(pcidev->devfn) != slot) { + continue; + } + } + devpriv->pci_dev = pcidev; + if (comedi_pci_enable(pcidev, "adl_pci7230") < 0) { + printk("comedi%d: Failed to enable PCI device and request regions\n", dev->minor); + return -EIO; + } + dev->iobase = pci_resource_start(pcidev, 2); + printk("comedi: base addr %4lx\n", dev->iobase); + + s = dev->subdevices + 0; + /* Isolated do */ + s->type = COMEDI_SUBD_DO; + s->subdev_flags = SDF_WRITABLE | SDF_GROUND | SDF_COMMON; + s->n_chan = 16; + s->maxdata = 1; + s->range_table = &range_digital; + s->insn_bits = adl_pci7230_do_insn_bits; + + s = dev->subdevices + 1; + /* Isolated di */ + s->type = COMEDI_SUBD_DI; + s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_COMMON; + s->n_chan = 16; + s->maxdata = 1; + s->range_table = &range_digital; + s->insn_bits = adl_pci7230_di_insn_bits; + + printk("comedi: attached\n"); + + return 1; + } + } + + printk("comedi%d: no supported board found! (req. bus/slot : %d/%d)\n", dev->minor, bus, slot); + return -EIO; +} + +static int adl_pci7230_detach(comedi_device * dev) +{ + printk("comedi%d: pci7230: remove\n", dev->minor); + + if (devpriv && devpriv->pci_dev) { + if (dev->iobase) { + comedi_pci_disable(devpriv->pci_dev); + } + pci_dev_put(devpriv->pci_dev); + } + + return 0; +} + +static int adl_pci7230_do_insn_bits(comedi_device * dev, comedi_subdevice * s, + comedi_insn * insn, lsampl_t * data) +{ + if (insn->n != 2) + return -EINVAL; + + if (data[0]) { + s->state &= ~data[0]; + s->state |= (data[0] & data[1]); + + outl((s->state << 16) & 0xffffffff, dev->iobase + PCI7230_DO); + } + + return 2; +} + +static int adl_pci7230_di_insn_bits(comedi_device * dev, comedi_subdevice * s, + comedi_insn * insn, lsampl_t * data) +{ + if (insn->n != 2) + return -EINVAL; + + data[1] = inl(dev->iobase + PCI7230_DI) & 0xffffffff; + + return 2; +} + +COMEDI_PCI_INITCLEANUP(driver_adl_pci7230, adl_pci7230_pci_table);