// SPDX-License-Identifier: GPL-2.0+
/*
* comedi/drivers/ni_labpc.c
* Driver for National Instruments Lab-PC series boards and compatibles
* Copyright (C) 2001-2003 Frank Mori Hess <[email protected]>
*/
/*
* Driver: ni_labpc
* Description: National Instruments Lab-PC (& compatibles)
* Devices: [National Instruments] Lab-PC-1200 (lab-pc-1200),
* Lab-PC-1200AI (lab-pc-1200ai), Lab-PC+ (lab-pc+)
* Author: Frank Mori Hess <[email protected]>
* Status: works
*
* Configuration options - ISA boards:
* [0] - I/O port base address
* [1] - IRQ (optional, required for timed or externally triggered
* conversions)
* [2] - DMA channel (optional)
*
* Tested with lab-pc-1200. For the older Lab-PC+, not all input
* ranges and analog references will work, the available ranges/arefs
* will depend on how you have configured the jumpers on your board
* (see your owner's manual).
*
* Kernel-level ISA plug-and-play support for the lab-pc-1200 boards
* has not yet been added to the driver, mainly due to the fact that
* I don't know the device id numbers. If you have one of these boards,
* please file a bug report at https://comedi.org/ so I can get the
* necessary information from you.
*
* The 1200 series boards have onboard calibration dacs for correcting
* analog input/output offsets and gains. The proper settings for these
* caldacs are stored on the board's eeprom. To read the caldac values
* from the eeprom and store them into a file that can be then be used
* by comedilib, use the comedi_calibrate program.
*
* The Lab-pc+ has quirky chanlist requirements when scanning multiple
* channels. Multiple channel scan sequence must start at highest channel,
* then decrement down to channel 0. The rest of the cards can scan down
* like lab-pc+ or scan up from channel zero. Chanlists consisting of all
* one channel are also legal, and allow you to pace conversions in bursts.
*
* NI manuals:
* 341309a (labpc-1200 register manual)
* 320502b (lab-pc+)
*/
#include <linux/module.h>
#include <linux/comedi/comedidev.h>
#include "ni_labpc.h"
#include "ni_labpc_isadma.h"
static const struct labpc_boardinfo labpc_boards[] = {
{
.name = "lab-pc-1200",
.ai_speed = 10000,
.ai_scan_up = 1,
.has_ao = 1,
.is_labpc1200 = 1,
}, {
.name = "lab-pc-1200ai",
.ai_speed = 10000,
.ai_scan_up = 1,
.is_labpc1200 = 1,
}, {
.name = "lab-pc+",
.ai_speed = 12000,
.has_ao = 1,
},
};
static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
{
unsigned int irq = it->options[1];
unsigned int dma_chan = it->options[2];
int ret;
ret = comedi_request_region(dev, it->options[0], 0x20);
if (ret)
return ret;
ret = labpc_common_attach(dev, irq, 0);
if (ret)
return ret;
if (dev->irq)
labpc_init_dma_chan(dev, dma_chan);
return 0;
}
static void labpc_detach(struct comedi_device *dev)
{
labpc_free_dma_chan(dev);
labpc_common_detach(dev);
comedi_legacy_detach(dev);
}
static struct comedi_driver labpc_driver = {
.driver_name = "ni_labpc",
.module = THIS_MODULE,
.attach = labpc_attach,
.detach = labpc_detach,
.num_names = ARRAY_SIZE(labpc_boards),
.board_name = &labpc_boards[0].name,
.offset = sizeof(struct labpc_boardinfo),
};
module_comedi_driver(labpc_driver);
MODULE_AUTHOR("Comedi https://www.comedi.org");
MODULE_DESCRIPTION("Comedi driver for NI Lab-PC ISA boards");
MODULE_LICENSE("GPL");