📄 hwdrv_apci3120.c
字号:
} while((us_TmpValue & APCI3120_EOS)!=APCI3120_EOS); for(i=0;i< devpriv->ui_AiNbrofChannels;i++) { //Read the result in FIFO and write them in shared memory us_TmpValue=inw(devpriv->iobase); data[i]=(UINT) us_TmpValue; } devpriv->b_InterruptMode = APCI3120_EOC_MODE; // Restore defaults. } break; default: printk("inputs wrong\n"); } devpriv->ui_EocEosConversionTime=0;// re initializing the variable; } return insn->n;}/*+----------------------------------------------------------------------------+| Function name :int i_APCI3120_StopCyclicAcquisition(comedi_device *dev,|| comedi_subdevice *s)|| |+----------------------------------------------------------------------------+| Task : Stops Cyclic acquisition || |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev || comedi_subdevice *s || |+----------------------------------------------------------------------------+| Return Value :0 || |+----------------------------------------------------------------------------+*/int i_APCI3120_StopCyclicAcquisition(comedi_device *dev,comedi_subdevice *s){ // Disable A2P Fifo write and AMWEN signal outw(0,devpriv->i_IobaseAddon + 4); //Disable Bus Master ADD ON outw(APCI3120_ADD_ON_AGCSTS_LOW,devpriv->i_IobaseAddon+0); outw(0,devpriv->i_IobaseAddon+2); outw(APCI3120_ADD_ON_AGCSTS_HIGH,devpriv->i_IobaseAddon+0); outw(0,devpriv->i_IobaseAddon+2); //Disable BUS Master PCI outl(0,devpriv->i_IobaseAmcc+AMCC_OP_REG_MCSR ); //outl(inl(devpriv->i_IobaseAmcc+AMCC_OP_REG_INTCSR)&(~AINT_WRITE_COMPL), devpriv->i_IobaseAmcc+AMCC_OP_REG_INTCSR); // stop amcc irqs //outl(inl(devpriv->i_IobaseAmcc+AMCC_OP_REG_MCSR)&(~EN_A2P_TRANSFERS), devpriv->i_IobaseAmcc+AMCC_OP_REG_MCSR); // stop DMA //Disable ext trigger i_APCI3120_ExttrigDisable(dev); devpriv->us_OutputRegister=0; //stop counters outw(devpriv->us_OutputRegister & APCI3120_DISABLE_TIMER0 & APCI3120_DISABLE_TIMER1,dev->iobase+APCI3120_WR_ADDRESS); outw(APCI3120_DISABLE_ALL_TIMER,dev->iobase+APCI3120_WR_ADDRESS); //DISABLE_ALL_INTERRUPT outb(APCI3120_DISABLE_ALL_INTERRUPT,dev->iobase+APCI3120_WRITE_MODE_SELECT); //Flush FIFO inb(dev->iobase+APCI3120_RESET_FIFO); inw(dev->iobase+APCI3120_RD_STATUS); devpriv->ui_AiActualScan=0; devpriv->ui_AiActualScanPosition=0; s->async->cur_chan=0; devpriv->ui_AiBufferPtr=0; devpriv->b_AiContinuous=0; devpriv->ui_DmaActualBuffer=0; devpriv->b_AiCyclicAcquisition=APCI3120_DISABLE; devpriv->b_InterruptMode=APCI3120_EOC_MODE; devpriv->b_EocEosInterrupt=APCI3120_DISABLE; i_APCI3120_Reset(dev); return 0; }/*+----------------------------------------------------------------------------+| Function name :int i_APCI3120_CommandTestAnalogInput(comedi_device *dev|| ,comedi_subdevice *s,comedi_cmd *cmd) || |+----------------------------------------------------------------------------+| Task : Test validity for a command for cyclic anlog input || acquisition | | |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev || comedi_subdevice *s || comedi_cmd *cmd |+----------------------------------------------------------------------------+| Return Value :0 || |+----------------------------------------------------------------------------+*/int i_APCI3120_CommandTestAnalogInput(comedi_device *dev,comedi_subdevice *s,comedi_cmd *cmd) { int err=0; int tmp;// divisor1,divisor2; // step 1: make sure trigger sources are trivially valid tmp=cmd->start_src; cmd->start_src &= TRIG_NOW|TRIG_EXT; if(!cmd->start_src || tmp!=cmd->start_src)err++; tmp=cmd->scan_begin_src; cmd->scan_begin_src &= TRIG_TIMER|TRIG_FOLLOW; if(!cmd->scan_begin_src || tmp!=cmd->scan_begin_src)err++; tmp=cmd->convert_src; cmd->convert_src &= TRIG_TIMER; if(!cmd->convert_src || tmp!=cmd->convert_src)err++; tmp=cmd->scan_end_src; cmd->scan_end_src &= TRIG_COUNT; if(!cmd->scan_end_src || tmp!=cmd->scan_end_src)err++; tmp=cmd->stop_src; cmd->stop_src &= TRIG_COUNT|TRIG_NONE; if(!cmd->stop_src || tmp!=cmd->stop_src)err++; if(err) return 1; //step 2: make sure trigger sources are unique and mutually compatible if(cmd->start_src!=TRIG_NOW && cmd->start_src!=TRIG_EXT) { err++; } if(cmd->scan_begin_src!=TRIG_TIMER && cmd->scan_begin_src!=TRIG_FOLLOW) err++; if(cmd->convert_src!=TRIG_TIMER ) err++; if(cmd->scan_end_src!=TRIG_COUNT) { cmd->scan_end_src=TRIG_COUNT; err++; } if(cmd->stop_src!=TRIG_NONE && cmd->stop_src!=TRIG_COUNT ) err++; if(err) return 2; // step 3: make sure arguments are trivially compatible if(cmd->start_arg!=0) { cmd->start_arg=0; err++; } if(cmd->scan_begin_src==TRIG_TIMER) // Test Delay timing { if(cmd->scan_begin_arg<this_board->ui_MinDelaytimeNs) { cmd->scan_begin_arg=this_board->ui_MinDelaytimeNs; err++; } } if(cmd->convert_src==TRIG_TIMER) // Test Acquisition timing { if (cmd->scan_begin_src==TRIG_TIMER) { if((cmd->convert_arg)&&(cmd->convert_arg<this_board->ui_MinAcquisitiontimeNs)) { cmd->convert_arg=this_board->ui_MinAcquisitiontimeNs; err++; } } else { if(cmd->convert_arg<this_board->ui_MinAcquisitiontimeNs) { cmd->convert_arg=this_board->ui_MinAcquisitiontimeNs; err++; } } } if(!cmd->chanlist_len) { cmd->chanlist_len=1; err++; } if(cmd->chanlist_len > this_board->i_AiChannelList) { cmd->chanlist_len=this_board->i_AiChannelList; err++; } if(cmd->stop_src==TRIG_COUNT) { if(!cmd->stop_arg) { cmd->stop_arg=1; err++; } } else { // TRIG_NONE if(cmd->stop_arg!=0){ cmd->stop_arg=0; err++; } } if(err) return 3; // step 4: fix up any arguments if(cmd->convert_src==TRIG_TIMER) { if(cmd->scan_begin_src==TRIG_TIMER && cmd->scan_begin_arg<cmd->convert_arg*cmd->scan_end_arg) { cmd->scan_begin_arg=cmd->convert_arg*cmd->scan_end_arg; err++; } } if(err)return 4; return 0; }/*+----------------------------------------------------------------------------+| Function name : int i_APCI3120_CommandAnalogInput(comedi_device *dev, || comedi_subdevice *s) || |+----------------------------------------------------------------------------+| Task : Does asynchronous acquisition || Determines the mode 1 or 2. || |+----------------------------------------------------------------------------+| Input Parameters : comedi_device *dev || comedi_subdevice *s || |+----------------------------------------------------------------------------+| Return Value : || |+----------------------------------------------------------------------------+*/ int i_APCI3120_CommandAnalogInput(comedi_device *dev,comedi_subdevice *s){ comedi_cmd *cmd=&s->async->cmd; //loading private structure with cmd structure inputs devpriv->ui_AiFlags=cmd->flags; devpriv->ui_AiNbrofChannels=cmd->chanlist_len; devpriv->ui_AiScanLength=cmd->scan_end_arg; devpriv->pui_AiChannelList=cmd->chanlist; //UPDATE-0.7.57->0.7.68devpriv->AiData=s->async->data; devpriv->AiData=s->async->prealloc_buf; //UPDATE-0.7.57->0.7.68devpriv->ui_AiDataLength=s->async->data_len; devpriv->ui_AiDataLength=s->async->prealloc_bufsz; if (cmd->stop_src==TRIG_COUNT) { devpriv->ui_AiNbrofScans=cmd->stop_arg; } else { devpriv->ui_AiNbrofScans=0; } devpriv->ui_AiTimer0=0; // variables changed to timer0,timer1 devpriv->ui_AiTimer1=0; if ((devpriv->ui_AiNbrofScans==0)||(devpriv->ui_AiNbrofScans==-1)) devpriv->b_AiContinuous=1; // user want neverending analog acquisition // stopped using cancel if(cmd->start_src==TRIG_EXT) devpriv->b_ExttrigEnable = APCI3120_ENABLE; else devpriv->b_ExttrigEnable = APCI3120_DISABLE; if(cmd->scan_begin_src==TRIG_FOLLOW) { // mode 1 or 3 if (cmd->convert_src==TRIG_TIMER) { // mode 1 devpriv->ui_AiTimer0=cmd->convert_arg;// timer constant in nano seconds //return this_board->i_hwdrv_CommandAnalogInput(1,dev,s); return i_APCI3120_CyclicAnalogInput(1,dev,s); } } if((cmd->scan_begin_src==TRIG_TIMER)&&(cmd->convert_src==TRIG_TIMER)) { // mode 2 devpriv->ui_AiTimer1=cmd->scan_begin_arg; devpriv->ui_AiTimer0=cmd->convert_arg;// variable changed timer2 to timer0 //return this_board->i_hwdrv_CommandAnalogInput(2,dev,s); return i_APCI3120_CyclicAnalogInput(2,dev,s); } return -1;}/*+----------------------------------------------------------------------------+| Function name : int i_APCI3120_CyclicAnalogInput(int mode, || comedi_device * dev,comedi_subdevice * s) |+----------------------------------------------------------------------------+| Task : This is used for analog input cyclic acquisition || Performs the command operations. || If DMA is configured does DMA initialization || otherwise does the acquisition with EOS interrupt. || |+----------------------------------------------------------------------------+| Input Parameters : || || |+----------------------------------------------------------------------------+| Return Value : |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -