linux/drivers/staging/comedi/drivers/ni_labpc_cs.c
<<
>>
Prefs
   1/*
   2    comedi/drivers/ni_labpc_cs.c
   3    Driver for National Instruments daqcard-1200 boards
   4    Copyright (C) 2001, 2002, 2003 Frank Mori Hess <fmhess@users.sourceforge.net>
   5
   6    PCMCIA crap is adapted from dummy_cs.c 1.31 2001/08/24 12:13:13
   7    from the pcmcia package.
   8    The initial developer of the pcmcia dummy_cs.c code is David A. Hinds
   9    <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
  10    are Copyright (C) 1999 David A. Hinds.
  11
  12    This program is free software; you can redistribute it and/or modify
  13    it under the terms of the GNU General Public License as published by
  14    the Free Software Foundation; either version 2 of the License, or
  15    (at your option) any later version.
  16
  17    This program is distributed in the hope that it will be useful,
  18    but WITHOUT ANY WARRANTY; without even the implied warranty of
  19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20    GNU General Public License for more details.
  21
  22    You should have received a copy of the GNU General Public License
  23    along with this program; if not, write to the Free Software
  24    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  25
  26************************************************************************
  27*/
  28/*
  29Driver: ni_labpc_cs
  30Description: National Instruments Lab-PC (& compatibles)
  31Author: Frank Mori Hess <fmhess@users.sourceforge.net>
  32Devices: [National Instruments] DAQCard-1200 (daqcard-1200)
  33Status: works
  34
  35Thanks go to Fredrik Lingvall for much testing and perseverance in
  36helping to debug daqcard-1200 support.
  37
  38The 1200 series boards have onboard calibration dacs for correcting
  39analog input/output offsets and gains.  The proper settings for these
  40caldacs are stored on the board's eeprom.  To read the caldac values
  41from the eeprom and store them into a file that can be then be used by
  42comedilib, use the comedi_calibrate program.
  43
  44Configuration options:
  45  none
  46
  47The daqcard-1200 has quirky chanlist requirements
  48when scanning multiple channels.  Multiple channel scan
  49sequence must start at highest channel, then decrement down to
  50channel 0.  Chanlists consisting of all one channel
  51are also legal, and allow you to pace conversions in bursts.
  52
  53*/
  54
  55/*
  56
  57NI manuals:
  58340988a (daqcard-1200)
  59
  60*/
  61
  62#include "../comedidev.h"
  63
  64#include <linux/delay.h>
  65#include <linux/slab.h>
  66
  67#include "8253.h"
  68#include "8255.h"
  69#include "comedi_fc.h"
  70#include "ni_labpc.h"
  71
  72#include <pcmcia/cistpl.h>
  73#include <pcmcia/cisreg.h>
  74#include <pcmcia/ds.h>
  75
  76static const struct labpc_boardinfo labpc_cs_boards[] = {
  77        {
  78                .name                   = "daqcard-1200",
  79                .device_id              = 0x103,
  80                .ai_speed               = 10000,
  81                .register_layout        = labpc_1200_layout,
  82                .has_ao                 = 1,
  83                .ai_range_table         = &range_labpc_1200_ai,
  84                .ai_range_code          = labpc_1200_ai_gain_bits,
  85        },
  86};
  87
  88static int labpc_auto_attach(struct comedi_device *dev,
  89                             unsigned long context)
  90{
  91        struct pcmcia_device *link = comedi_to_pcmcia_dev(dev);
  92        struct labpc_private *devpriv;
  93        int ret;
  94
  95        /* The ni_labpc driver needs the board_ptr */
  96        dev->board_ptr = &labpc_cs_boards[0];
  97
  98        link->config_flags |= CONF_AUTO_SET_IO |
  99                              CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ;
 100        ret = comedi_pcmcia_enable(dev, NULL);
 101        if (ret)
 102                return ret;
 103        dev->iobase = link->resource[0]->start;
 104
 105        if (!link->irq)
 106                return -EINVAL;
 107
 108        devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
 109        if (!devpriv)
 110                return -ENOMEM;
 111        dev->private = devpriv;
 112
 113        return labpc_common_attach(dev, link->irq, IRQF_SHARED);
 114}
 115
 116static void labpc_detach(struct comedi_device *dev)
 117{
 118        labpc_common_detach(dev);
 119        comedi_pcmcia_disable(dev);
 120}
 121
 122static struct comedi_driver driver_labpc_cs = {
 123        .driver_name    = "ni_labpc_cs",
 124        .module         = THIS_MODULE,
 125        .auto_attach    = labpc_auto_attach,
 126        .detach         = labpc_detach,
 127};
 128
 129static int labpc_cs_attach(struct pcmcia_device *link)
 130{
 131        return comedi_pcmcia_auto_config(link, &driver_labpc_cs);
 132}
 133
 134static const struct pcmcia_device_id labpc_cs_ids[] = {
 135        PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0103),        /* daqcard-1200 */
 136        PCMCIA_DEVICE_NULL
 137};
 138MODULE_DEVICE_TABLE(pcmcia, labpc_cs_ids);
 139
 140static struct pcmcia_driver labpc_cs_driver = {
 141        .name           = "daqcard-1200",
 142        .owner          = THIS_MODULE,
 143        .id_table       = labpc_cs_ids,
 144        .probe          = labpc_cs_attach,
 145        .remove         = comedi_pcmcia_auto_unconfig,
 146};
 147module_comedi_pcmcia_driver(driver_labpc_cs, labpc_cs_driver);
 148
 149MODULE_DESCRIPTION("Comedi driver for National Instruments Lab-PC");
 150MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>");
 151MODULE_LICENSE("GPL");
 152