📄 das1800.c
字号:
/* das1800.c driver for Keitley das1700/das1800 series boards Copyright (C) 2000 Frank Mori Hess <fmhess@users.sourceforge.net> COMEDI - Linux Control and Measurement Device Interface Copyright (C) 2000 David A. Schleef <ds@schleef.org> 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: das1800.oDescription: Keithley Metrabyte DAS1800 (& compatibles)Author: Frank Mori Hess <fmhess@users.sourceforge.net>Devices: [Keithley Metrabyte] DAS-1701ST (das-1701st), DAS-1701ST-DA (das-1701st-da), DAS-1701/AO (das-1701ao), DAS-1702ST (das-1702st), DAS-1702ST-DA (das-1702st-da), DAS-1702HR (das-1702hr), DAS-1702HR-DA (das-1702hr-da), DAS-1702/AO (das-1702ao), DAS-1801ST (das-1801st), DAS-1801ST-DA (das-1801st-da), DAS-1801HC (das-1801hc), DAS-1801AO (das-1801ao), DAS-1802ST (das-1802st), DAS-1802ST-DA (das-1802st-da), DAS-1802HR (das-1802hr), DAS-1802HR-DA (das-1802hr-da), DAS-1802HC (das-1802hc), DAS-1802AO (das-1802ao)Status: worksThe waveform analog output on the 'ao' cards is not supported.If you need it, send me (Frank Hess) an email.Configuration options: [0] - I/O port base address [1] - IRQ (optional, required for timed or externally triggered conversions) [2] - DMA0 (optional, requires irq) [3] - DMA1 (optional, requires irq and dma0)*//*This driver supports the following Keithley boards:das-1701stdas-1701st-dadas-1701aodas-1702stdas-1702st-dadas-1702hrdas-1702hr-dadas-1702aodas-1801stdas-1801st-dadas-1801hcdas-1801aodas-1802stdas-1802st-dadas-1802hrdas-1802hr-dadas-1802hcdas-1802aoOptions: [0] - base io address [1] - irq (optional, required for timed or externally triggered conversions) [2] - dma0 (optional, requires irq) [3] - dma1 (optional, requires irq and dma0)irq can be omitted, although the cmd interface will not work without it.analog input cmd triggers supported: start_src: TRIG_NOW | TRIG_EXT scan_begin_src: TRIG_FOLLOW | TRIG_TIMER | TRIG_EXT scan_end_src: TRIG_COUNT convert_src: TRIG_TIMER | TRIG_EXT (TRIG_EXT requires scan_begin_src == TRIG_FOLLOW) stop_src: TRIG_COUNT | TRIG_EXT | TRIG_NONEscan_begin_src triggers TRIG_TIMER and TRIG_EXT use the card's'burst mode' which limits the valid conversion time to 64 microseconds(convert_arg <= 64000). This limitation does not apply if scan_begin_srcis TRIG_FOLLOW.NOTES:Only the DAS-1801ST has been tested by me.Unipolar and bipolar ranges cannot be mixed in the channel/gain list.TODO: Make it automatically allocate irq and dma channels if they are not specified Add support for analog out on 'ao' cards read insn for analog out*/#include <linux/comedidev.h>#include <linux/ioport.h>#include <asm/dma.h>#include "8253.h"#include "comedi_fc.h"// misc. defines#define DAS1800_SIZE 16 //uses 16 io addresses#define FIFO_SIZE 1024 // 1024 sample fifo#define TIMER_BASE 200 // 5 Mhz master clock#define UNIPOLAR 0x4 // bit that determines whether input range is uni/bipolar#define DMA_BUF_SIZE 0x1ff00 // size in bytes of dma buffers/* Registers for the das1800 */#define DAS1800_FIFO 0x0#define DAS1800_QRAM 0x0#define DAS1800_DAC 0x0#define DAS1800_SELECT 0x2#define ADC 0x0#define QRAM 0x1#define DAC(a) (0x2 + a)#define DAS1800_DIGITAL 0x3#define DAS1800_CONTROL_A 0x4#define FFEN 0x1#define CGEN 0x4#define CGSL 0x8#define TGEN 0x10#define TGSL 0x20#define ATEN 0x80#define DAS1800_CONTROL_B 0x5#define DMA_CH5 0x1#define DMA_CH6 0x2#define DMA_CH7 0x3#define DMA_CH5_CH6 0x5#define DMA_CH6_CH7 0x6#define DMA_CH7_CH5 0x7#define DMA_ENABLED 0x3 //mask used to determine if dma is enabled#define DMA_DUAL 0x4#define IRQ3 0x8#define IRQ5 0x10#define IRQ7 0x18#define IRQ10 0x28#define IRQ11 0x30#define IRQ15 0x38#define FIMD 0x40#define DAS1800_CONTROL_C 0X6#define IPCLK 0x1#define XPCLK 0x3#define BMDE 0x4#define CMEN 0x8#define UQEN 0x10#define SD 0x40#define UB 0x80#define DAS1800_STATUS 0x7// bits that prevent interrupt status bits (and CVEN) from being cleared on write#define CLEAR_INTR_MASK (CVEN_MASK | 0x1f)#define INT 0x1#define DMATC 0x2#define CT0TC 0x8#define OVF 0x10#define FHF 0x20#define FNE 0x40#define CVEN_MASK 0x40 // masks CVEN on write#define CVEN 0x80#define DAS1800_BURST_LENGTH 0x8#define DAS1800_BURST_RATE 0x9#define DAS1800_QRAM_ADDRESS 0xa#define DAS1800_COUNTER 0xc#define IOBASE2 0x400 //offset of additional ioports used on 'ao' cardsenum{ das1701st, das1701st_da, das1702st, das1702st_da, das1702hr, das1702hr_da, das1701ao, das1702ao, das1801st, das1801st_da, das1802st, das1802st_da, das1802hr, das1802hr_da, das1801hc, das1802hc, das1801ao, das1802ao};static int das1800_attach(comedi_device *dev, comedi_devconfig *it);static int das1800_detach(comedi_device *dev);static int das1800_probe(comedi_device *dev);static int das1800_cancel(comedi_device *dev, comedi_subdevice *s);static void das1800_interrupt(int irq, void *d, struct pt_regs *regs);static int das1800_ai_poll(comedi_device *dev,comedi_subdevice *s);static void das1800_ai_handler(comedi_device *dev);static void das1800_handle_dma(comedi_device *dev, comedi_subdevice *s, unsigned int status);static void das1800_flush_dma(comedi_device *dev, comedi_subdevice *s);static void das1800_flush_dma_channel(comedi_device *dev, comedi_subdevice *s, unsigned int channel, uint16_t *buffer);static void das1800_handle_fifo_half_full(comedi_device *dev, comedi_subdevice *s);static void das1800_handle_fifo_not_empty(comedi_device *dev, comedi_subdevice *s);static int das1800_ai_do_cmdtest(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd);static int das1800_ai_do_cmd(comedi_device *dev, comedi_subdevice *s);static int das1800_ai_rinsn(comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data);static int das1800_ao_winsn(comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data);static int das1800_di_rbits(comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data);static int das1800_do_wbits(comedi_device *dev, comedi_subdevice *s, comedi_insn *insn, lsampl_t *data);static int das1800_set_frequency(comedi_device *dev);static unsigned int burst_convert_arg(unsigned int convert_arg, int round_mode);static unsigned int suggest_transfer_size(comedi_cmd *cmd);// analog input rangesstatic comedi_lrange range_ai_das1801 = { 8, { RANGE( -5, 5 ), RANGE( -1, 1 ), RANGE( -0.1, 0.1 ), RANGE( -0.02, 0.02 ), RANGE( 0, 5 ), RANGE( 0, 1 ), RANGE( 0, 0.1 ), RANGE( 0, 0.02 ), }};static comedi_lrange range_ai_das1802 = { 8, { RANGE(-10, 10), RANGE(-5, 5), RANGE(-2.5, 2.5), RANGE(-1.25, 1.25), RANGE(0, 10), RANGE(0, 5), RANGE(0, 2.5), RANGE(0, 1.25), }};typedef struct das1800_board_struct{ char *name; int ai_speed; /* max conversion period in nanoseconds */ int resolution; /* bits of ai resolution */ int qram_len; /* length of card's channel / gain queue */ int common; /* supports AREF_COMMON flag */ int do_n_chan; /* number of digital output channels */ int ao_ability; /* 0 == no analog out, 1 == basic analog out, 2 == waveform analog out */ int ao_n_chan; /* number of analog out channels */ comedi_lrange *range_ai; /* available input ranges */}das1800_board;/* Warning: the maximum conversion speeds listed below are * not always achievable depending on board setup (see * user manual.) */static das1800_board das1800_boards[] ={ { name: "das-1701st", ai_speed: 6250, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 0, ao_n_chan: 0, range_ai: &range_ai_das1801, }, { name: "das-1701st-da", ai_speed: 6250, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 1, ao_n_chan: 4, range_ai: &range_ai_das1801, }, { name: "das-1702st", ai_speed: 6250, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 0, ao_n_chan: 0, range_ai: &range_ai_das1802, }, { name: "das-1702st-da", ai_speed: 6250, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 1, ao_n_chan: 4, range_ai: &range_ai_das1802, }, { name: "das-1702hr", ai_speed: 20000, resolution: 16, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 0, ao_n_chan: 0, range_ai: &range_ai_das1802, }, { name: "das-1702hr-da", ai_speed: 20000, resolution: 16, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 1, ao_n_chan: 2, range_ai: &range_ai_das1802, }, { name: "das-1701ao", ai_speed: 6250, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 2, ao_n_chan: 2, range_ai: &range_ai_das1801, }, { name: "das-1702ao", ai_speed: 6250, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 2, ao_n_chan: 2, range_ai: &range_ai_das1802, }, { name: "das-1801st", ai_speed: 3000, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 0, ao_n_chan: 0, range_ai: &range_ai_das1801, }, { name: "das-1801st-da", ai_speed: 3000, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 0, ao_n_chan: 4, range_ai: &range_ai_das1801, }, { name: "das-1802st", ai_speed: 3000, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 0, ao_n_chan: 0, range_ai: &range_ai_das1802, }, { name: "das-1802st-da", ai_speed: 3000, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 1, ao_n_chan: 4, range_ai: &range_ai_das1802, }, { name: "das-1802hr", ai_speed: 10000, resolution: 16, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 0, ao_n_chan: 0, range_ai: &range_ai_das1802, }, { name: "das-1802hr-da", ai_speed: 10000, resolution: 16, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 1, ao_n_chan: 2, range_ai: &range_ai_das1802, }, { name: "das-1801hc", ai_speed: 3000, resolution: 12, qram_len: 64, common: 0, do_n_chan: 8, ao_ability: 1, ao_n_chan: 2, range_ai: &range_ai_das1801, }, { name: "das-1802hc", ai_speed: 3000, resolution: 12, qram_len: 64, common: 0, do_n_chan: 8, ao_ability: 1, ao_n_chan: 2, range_ai: &range_ai_das1802, }, { name: "das-1801ao", ai_speed: 3000, resolution: 12, qram_len: 256, common: 1, do_n_chan: 4, ao_ability: 2, ao_n_chan: 2, range_ai: &range_ai_das1801, }, { name: "das-1802ao", ai_speed: 3000, resolution: 12, qram_len: 256,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -