📄 ni_pcimio.c
字号:
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 + -