mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-02-14 19:25:53 +00:00
117 lines
3.4 KiB
C
117 lines
3.4 KiB
C
// 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 <fmhess@users.sourceforge.net>
|
|
*/
|
|
|
|
/*
|
|
* 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 <fmhess@users.sourceforge.net>
|
|
* 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 "../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");
|