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

📄 ni_pcimio.c

📁 rtlinux-3.2-pre3.tar.bz2 rtlinux3.2-pre3的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		ao_fifo_depth:  2048,		caldac:         {ad8804,mb88341,ad8522}, /* manual is wrong */	},#endif	{       device_id:      0x14e0,		name:           "pci-6110",		n_adchan:       4, 		adbits:         12,		ai_fifo_depth:  8192,		alwaysdither:   0,		gainlkup:       ai_gain_611x,		ai_speed:	200,		n_aochan:       2,		aobits:         16,		ao_671x:	1,		ao_unipolar:    0,		ao_fifo_depth:  2048,		reg_611x:	1,		caldac:         {ad8804,ad8804},	},	{       device_id:      0x14f0,		name:           "pci-6111",		n_adchan:       2,		adbits:         12,		ai_fifo_depth:  8192,		alwaysdither:   0,		gainlkup:       ai_gain_611x,		ai_speed:	200,		n_aochan:       2,		aobits:         16,		ao_671x:	1,		ao_unipolar:    0,		ao_fifo_depth:  2048,		reg_611x:	1,		caldac:         {ad8804,ad8804},	},#if 0	/* The 6115 boards probably need their own driver */	{       device_id:      0x2ed0,		name:           "pci-6115",		n_adchan:       4,		adbits:         12,		ai_fifo_depth:  8192,		alwaysdither:   0,		gainlkup:       ai_gain_611x,		ai_speed:	100,		n_aochan:       2,		aobits:         16,		ao_671x:	1,		ao_unipolar:    0,		ao_fifo_depth:  2048,		reg_611x:	1,		caldac:         {ad8804_debug,ad8804_debug,ad8804_debug},/* XXX */	},#endif#if 0	{       device_id:      0x0000,		name:           "pxi-6115",		n_adchan:       4,		adbits:         12,		ai_fifo_depth:  8192,		alwaysdither:   0,		gainlkup:       ai_gain_611x,		ai_speed:	100,		n_aochan:       2,		aobits:         16,		ao_671x:	1,		ao_unipolar:    0,		ao_fifo_depth:  2048,		reg_611x:	1,		caldac:         {ad8804_debug,ad8804_debug,ad8804_debug},/* XXX */	},#endif	{       device_id:      0x1880,		name:           "pci-6711",		n_adchan:       0, /* no analog input */		n_aochan:	4,		aobits:         12,		ao_unipolar:    0,		ao_fifo_depth:  8192,		ao_671x:	1,		caldac:         {mb88341,mb88341},/* XXX */	},	{       device_id:      0x1870,		name:           "pci-6713",		n_adchan:       0, /* no analog input */		n_aochan:	8,		aobits:         12,		ao_unipolar:    0,		ao_fifo_depth:  16384,		ao_671x:	1,		caldac:         {mb88341,mb88341},/* XXX */	},	{       device_id:      0x2b80,		name:           "pxi-6713",		n_adchan:       0, /* no analog input */		n_aochan:	8,		aobits:         12,		ao_unipolar:    0,		ao_fifo_depth:  16384,		ao_671x:	1,		caldac:         {mb88341,mb88341},/* XXX */	},#if 0	{       device_id:      0x1880,		name:           "pci-6731",		n_adchan:       0, /* no analog input */		n_aochan:	4,		aobits:         16,		ao_unipolar:    0,		ao_fifo_depth:  8192,		ao_671x:	1,		caldac:         {mb88341,mb88341},/* XXX */	},	{       device_id:      0x1870,		name:           "pci-6733",		n_adchan:       0, /* no analog input */		n_aochan:	8,		aobits:         16,		ao_unipolar:    0,		ao_fifo_depth:  16384,		ao_671x:	1,		caldac:         {mb88341,mb88341},/* XXX */	},#endif        {       device_id:      0x15b0,                name:           "pxi-6071e",                n_adchan:       64,                adbits:         12,                ai_fifo_depth:  512,                alwaysdither:   1,                gainlkup:       ai_gain_16,                ai_speed:       800,                n_aochan:       2,                aobits:         12,                ao_fifo_depth:  2048,                ao_unipolar:    1,		caldac:         {ad8804_debug},                has_8255:       0,        },        {       device_id:      0x11b0,                name:           "pxi-6070e",                n_adchan:       16,                adbits:         12,                ai_fifo_depth:  512,                alwaysdither:   1,                gainlkup:       ai_gain_16,                ai_speed:       800,                n_aochan:       2,                aobits:         12,                ao_fifo_depth:  2048,                ao_unipolar:    1,		caldac:         {mb88341},                has_8255:       0,        }, 	{	device_id:      0x18c0,		name:           "pxi-6052e",		n_adchan:       16,		adbits:         16,		ai_fifo_depth:  512,		alwaysdither:   1,		gainlkup:       ai_gain_16,		ai_speed:	3000,		n_aochan:       2,		aobits:         16,		ao_unipolar:    1,		ao_fifo_depth:  2048,		caldac:         {mb88341,mb88341,ad8522},	}, 	{	device_id:      0x1580,		name:           "pxi-6031e",		n_adchan:       64,		adbits:         16,		ai_fifo_depth:  512,		alwaysdither:   1,		gainlkup:       ai_gain_14,		ai_speed:	10000,		n_aochan:       2,		aobits:         16,		ao_fifo_depth:  2048,		ao_unipolar:    1,		caldac:         {dac8800,dac8043,ad8522},	},	{       device_id:      0x2890,		name:           "pci-6036e",		n_adchan:       16,		adbits:         16,		ai_fifo_depth:  512,		alwaysdither:   1,		gainlkup:       ai_gain_4,		ai_speed:	5000,		n_aochan:       2,		aobits:         16,		ao_fifo_depth:  0,		ao_unipolar:    0,		caldac:         {mb88341},		has_8255:	0,	},};#define n_pcimio_boards ((sizeof(ni_boards)/sizeof(ni_boards[0])))static int pcimio_attach(comedi_device *dev,comedi_devconfig *it);static int pcimio_detach(comedi_device *dev);static comedi_driver driver_pcimio={	driver_name:	"ni_pcimio",	module:		THIS_MODULE,	attach:		pcimio_attach,	detach: 	pcimio_detach,};COMEDI_INITCLEANUP(driver_pcimio);/* How we access registers */#define ni_writel(a,b)		(writel((a),dev->iobase+(b)))#define ni_readl(a)		(readl(dev->iobase+(a)))#define ni_writew(a,b)		(writew((a),dev->iobase+(b)))#define ni_readw(a)		(readw(dev->iobase+(a)))#define ni_writeb(a,b)		(writeb((a),dev->iobase+(b)))#define ni_readb(a)		(readb(dev->iobase+(a)))/* How we access STC registers *//* We automatically take advantage of STC registers that can be * read/written directly in the I/O space of the board.  Most * PCIMIO devices map the low 8 STC registers to iobase+addr*2. * The 611x devices map the write registers to iobase+addr*2, and * the read registers to iobase+(addr-1)*2. *//* However, the 611x boards still aren't working, so I'm disabling * non-windowed STC access temporarily */#define win_out(data,addr) __win_out(dev,data,addr)static inline void __win_out(comedi_device *dev, unsigned short data, int addr){	unsigned long flags;	comedi_spin_lock_irqsave(&dev->spinlock,flags);	ni_writew(addr,Window_Address);	ni_writew(data,Window_Data);	comedi_spin_unlock_irqrestore(&dev->spinlock,flags);}#define win_out2(data,addr) do{ \	win_out((data)>>16, (addr)); \	win_out((data)&0xffff, (addr)+1); \}while(0)#define win_in(addr) __win_in(dev,addr)static inline unsigned short __win_in(comedi_device *dev, int addr){	unsigned long flags;	int ret;	comedi_spin_lock_irqsave(&dev->spinlock,flags);	ni_writew(addr,Window_Address);	ret = ni_readw(Window_Data);	comedi_spin_unlock_irqrestore(&dev->spinlock,flags);	return ret;}#define ao_win_out(data,addr) __ao_win_out(dev,data,addr)static inline void __ao_win_out( comedi_device *dev, uint16_t data, int addr ){       unsigned long flags;       comedi_spin_lock_irqsave(&dev->spinlock,flags);       ni_writew(addr,AO_Window_Address_671x);       ni_writew(data,AO_Window_Data_671x);       comedi_spin_unlock_irqrestore(&dev->spinlock,flags);}#define ao_win_out2(data,addr) do{ \       ao_win_out((data)>>16, (addr)); \       ao_win_out((data)&0xffff, (addr)+1); \}while(0)#define interrupt_pin(a)	0#define IRQ_POLARITY 1#define NI_E_IRQ_FLAGS		SA_SHIRQtypedef struct{	struct mite_struct *mite;	NI_PRIVATE_COMMON	unsigned int last_buf_write_count;}ni_private;#define devpriv ((ni_private *)dev->private)#include "ni_mio_common.c"static int pcimio_find_device(comedi_device *dev,int bus,int slot);static int pcimio_ai_change(comedi_device *dev, comedi_subdevice *s,	unsigned long new_size);static int pcimio_ao_change(comedi_device *dev, comedi_subdevice *s,	unsigned long new_size);/* cleans up allocated resources */static int pcimio_detach(comedi_device *dev){	mio_common_detach(dev);	if(dev->private && devpriv->mite)		mite_unsetup(devpriv->mite);		if(dev->irq){		comedi_free_irq(dev->irq,dev);	}	return 0;}static int pcimio_attach(comedi_device *dev,comedi_devconfig *it){	int		ret;	printk("comedi%d: ni_pcimio:",dev->minor);	ret=alloc_private(dev,sizeof(ni_private));	if(ret<0)return ret;	ret=pcimio_find_device(dev,it->options[0],it->options[1]);	if(ret<0)return ret;	printk(" %s",boardtype.name);	dev->board_name=boardtype.name;	ret = mite_setup(devpriv->mite);	if(ret < 0)	{		printk(" error setting up mite\n");		return ret;	}	dev->iobase = mite_iobase(devpriv->mite);	dev->irq=mite_irq(devpriv->mite);	if(dev->irq==0){		printk(" unknown irq (bad)\n");	}else{		printk(" ( irq = %d )",dev->irq);		if( (ret=comedi_request_irq(dev->irq,ni_E_interrupt,NI_E_IRQ_FLAGS,"ni_pcimio",dev))<0 ){			printk(" irq not available\n");			dev->irq=0;		}	}	ret = ni_E_init(dev,it);	if(ret<0)return ret;	dev->subdevices[0].buf_change = pcimio_ai_change;	dev->subdevices[1].buf_change = pcimio_ao_change;	return ret;}static int pcimio_find_device(comedi_device *dev,int bus,int slot){	struct mite_struct *mite;	int i;	for(mite=mite_devices;mite;mite=mite->next){		if(mite->used)continue;		if(bus || slot){			if(bus!=mite->pcidev->bus->number ||			   slot!=PCI_SLOT(mite->pcidev->devfn))				continue;		}		for(i=0;i<n_pcimio_boards;i++){			if(mite_device_id(mite)==ni_boards[i].device_id){				dev->board_ptr=ni_boards+i;				devpriv->mite=mite;				return 0;			}		}	}	printk("no device found\n");	mite_list_devices();	return -EIO;}static int pcimio_ai_change(comedi_device *dev, comedi_subdevice *s,	unsigned long new_size){	int ret;	ret = mite_buf_change(devpriv->mite, AI_DMA_CHAN, s->async, new_size);	if(ret<0)return ret;	return 0;}static int pcimio_ao_change(comedi_device *dev, comedi_subdevice *s,	unsigned long new_size){	int ret;	ret = mite_buf_change(devpriv->mite, AO_DMA_CHAN, s->async, new_size);	if(ret<0)return ret;	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -