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

📄 hwdrv_apci3xxx.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
| Task              : Reads the value of the Digital input Port i.e.4channels|+----------------------------------------------------------------------------+| Input Parameters  : -                                                      |+----------------------------------------------------------------------------+| Output Parameters : data[0] : Port value                                   |+----------------------------------------------------------------------------+| Return Value      :>0: No error                                            ||                    ....                                                    ||                    -101 : Data size error                                  |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnBitsDigitalInput (comedi_device    *dev,                                     comedi_subdevice *s,                                      comedi_insn      *insn,                                     lsampl_t         *data)	{	INT    i_ReturnValue = insn->n;	DWORD dw_Temp        = 0;		/************************/	/* Test the buffer size */	/************************/		if (insn->n >= 1)	   {	   dw_Temp=  inl (devpriv->iobase + 32);	   *data= dw_Temp & 0xf;	   }	else	   {	   /*******************/	   /* Data size error */	   /*******************/	       	   printk("Buffer size error\n");	   i_ReturnValue = -101;	   }	   	return (i_ReturnValue); 	}/*+----------------------------------------------------------------------------+|                           DIGITAL OUTPUT SUBDEVICE                         |+----------------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+| Function name     :int i_APCI3XXX_InsnBitsDigitalOutput                    ||                                          (comedi_device *dev,              ||                                           comedi_subdevice *s,             ||                                           comedi_insn *insn,               ||                                           lsampl_t *data)                  |+----------------------------------------------------------------------------+| Task              : Write the selected output mask and read the status from| |                     all digital output channles                            |+----------------------------------------------------------------------------+| Input Parameters  : dw_ChannelMask = data [0];                             ||                     dw_BitMask     = data [1];                             |+----------------------------------------------------------------------------+| Output Parameters : data[1] : All digital output channles states           |+----------------------------------------------------------------------------+| Return Value      : >0  : No error                                         ||                    -4   : Channel mask error                               ||                    -101 : Data size error                                  |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnBitsDigitalOutput (comedi_device    *dev,                                      comedi_subdevice *s,                                       comedi_insn      *insn,                                      lsampl_t         *data)	{	INT        i_ReturnValue = insn->n;	BYTE       b_ChannelCpt  = 0;	DWORD     dw_ChannelMask = 0;	DWORD     dw_BitMask     = 0;	DWORD     dw_Status      = 0;	/************************/	/* Test the buffer size */	/************************/		if (insn->n >= 2)	   {	   /*******************************/	   /* Get the channe and bit mask */	   /*******************************/	   	   dw_ChannelMask = data [0];	   dw_BitMask     = data [1];	   	   /*************************/	   /* Test the channel mask */	   /*************************/	   	   if ((dw_ChannelMask & 0XFFFFFFF0) == 0)	      {	      /*********************************/	      /* Test if set/reset any channel */	      /*********************************/	   	      if (dw_ChannelMask & 0xF)	         {	         /********************************/	         /* Read the digital output port */	         /********************************/	      	         dw_Status = inl(devpriv->iobase + 48);	      	         for (b_ChannelCpt = 0; b_ChannelCpt < 4; b_ChannelCpt ++)	            {	            if ((dw_ChannelMask >> b_ChannelCpt) & 1)	               {	               dw_Status = (dw_Status & (0xF - (1 << b_ChannelCpt))) | (dw_BitMask & (1 << b_ChannelCpt));	               }	            }	      	         outl (dw_Status, devpriv->iobase + 48);	         }	   	      /********************************/	      /* Read the digital output port */	      /********************************/	         	      data [1] = inl(devpriv->iobase + 48);	      }	   else	      {	      /************************/	      /* Config command error */	      /************************/	      	      printk("Channel mask error\n");	      i_ReturnValue = -4;	      }	   }	else	   {	   /*******************/	   /* Data size error */	   /*******************/	       	   printk("Buffer size error\n");	   i_ReturnValue = -101;	   }	   	   	return (i_ReturnValue);	}/*+----------------------------------------------------------------------------+| Function name     :int i_APCI3XXX_InsnWriteDigitalOutput                   ||                                          (comedi_device *dev,              ||                                           comedi_subdevice *s,             ||                                           comedi_insn *insn,               ||                                           lsampl_t *data)                  |+----------------------------------------------------------------------------+| Task              : Set the state from digital output channel              |+----------------------------------------------------------------------------+| Input Parameters  : b_Channel = CR_CHAN(insn->chanspec)                    ||                     b_State   = data [0]                                   |+----------------------------------------------------------------------------+| Output Parameters : -                                                      |+----------------------------------------------------------------------------+| Return Value      : >0  : No error                                         ||                    -3   : Channel selection error                          ||                    -101 : Data size error                                  |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnWriteDigitalOutput (comedi_device    *dev,                                       comedi_subdevice *s,                                        comedi_insn      *insn,                                       lsampl_t         *data)	{	INT    i_ReturnValue = insn->n;	BYTE   b_Channel     = CR_CHAN(insn->chanspec);	BYTE   b_State       = 0;	DWORD dw_Status      = 0;      	/************************/	/* Test the buffer size */	/************************/		if (insn->n >= 1)	   {	   /***************************/	   /* Test the channel number */	   /***************************/		   if(b_Channel < devpriv->ps_BoardInfo->i_NbrDoChannel)	      {	      /*******************/	      /* Get the command */	      /*******************/	   	      b_State = (BYTE) data[0];		      /********************************/	      /* Read the digital output port */	      /********************************/	      	      dw_Status = inl(devpriv->iobase + 48);	      	      dw_Status = (dw_Status & (0xF - (1 << b_Channel))) | ((b_State & 1) << b_Channel);	      outl (dw_Status, devpriv->iobase + 48);	      }	   else	      {	      /***************************/	      /* Channel selection error */	      /***************************/	       	      printk("Channel selection error\n");	      i_ReturnValue = -3;	      }	   }	else	   {	   /*******************/	   /* Data size error */	   /*******************/	       	   printk("Buffer size error\n");	   i_ReturnValue = -101;	   }	   	return (i_ReturnValue); 	}/*+----------------------------------------------------------------------------+| Function name     :int i_APCI3XXX_InsnReadDigitalOutput                    ||                                          (comedi_device *dev,              ||                                           comedi_subdevice *s,             ||                                           comedi_insn *insn,               ||                                           lsampl_t *data)                  |+----------------------------------------------------------------------------+| Task              : Read the state from digital output channel             |+----------------------------------------------------------------------------+| Input Parameters  : b_Channel = CR_CHAN(insn->chanspec)                    |+----------------------------------------------------------------------------+| Output Parameters : b_State   = data [0]                                   |+----------------------------------------------------------------------------+| Return Value      : >0  : No error                                         ||                    -3   : Channel selection error                          ||                    -101 : Data size error                                  |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnReadDigitalOutput (comedi_device    *dev,                                       comedi_subdevice *s,                                        comedi_insn      *insn,                                       lsampl_t         *data)	{	INT    i_ReturnValue = insn->n;	BYTE   b_Channel     = CR_CHAN(insn->chanspec);	DWORD dw_Status      = 0;      	/************************/	/* Test the buffer size */	/************************/		if (insn->n >= 1)	   {	   /***************************/	   /* Test the channel number */	   /***************************/		   if(b_Channel < devpriv->ps_BoardInfo->i_NbrDoChannel)	      {	      /********************************/	      /* Read the digital output port */	      /********************************/	      	      dw_Status = inl(devpriv->iobase + 48);	      	      dw_Status = (dw_Status >> b_Channel) & 1;	      *data = dw_Status;	      }	   else	      {	      /***************************/	      /* Channel selection error */	      /***************************/	       	      printk("Channel selection error\n");	      i_ReturnValue = -3;	      }	   }	else	   {	   /*******************/	   /* Data size error */	   /*******************/	       	   printk("Buffer size error\n");	   i_ReturnValue = -101;	   }	   	return (i_ReturnValue); 	}/*+----------------------------------------------------------------------------+| Function   Name   : int i_APCI3XXX_Reset(comedi_device *dev)               |                                                         +----------------------------------------------------------------------------+| Task              :resets all the registers                                |+----------------------------------------------------------------------------+| Input Parameters  : comedi_device *dev                                     |+----------------------------------------------------------------------------+| Output Parameters : -                                                      |+----------------------------------------------------------------------------+| Return Value      : -                                                      |+----------------------------------------------------------------------------+*/	  int     i_APCI3XXX_Reset(comedi_device *dev) 	{	unsigned char b_Cpt = 0;		/*************************/	/* Disable the interrupt */	/*************************/		disable_irq(dev->irq);		/****************************/	/* Reset the interrupt flag */	/****************************/		devpriv->b_EocEosInterrupt = 0;		/***************************/	/* Clear the start command */	/***************************/		writel (0, (void *) (devpriv->dw_AiBase + 8));		/*****************************/	/* Reset the interrupt flags */	/***

⌨️ 快捷键说明

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