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

📄 hwdrv_apci3120.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
                		}                 		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 + -