⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 das1800.c

📁 rtlinux-3.2-pre3.tar.bz2 rtlinux3.2-pre3的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*    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 + -