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

📄 hwdrv_apci3xxx.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	      data [1] = data [1] | (inl(devpriv->iobase + 64) << 8);		      /************************/	      /* Test if port 2 input */	      /************************/	         	      if ((devpriv->ul_TTLPortConfiguration[0] & 0xFF) == 0)	         {	         data [1] = data [1] | (inl(devpriv->iobase + 96) << 16);	         }	      else	         {	         data [1] = data [1] | (inl(devpriv->iobase + 112) << 16);	         }	      }	   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_InsnReadTTLIO                           ||                          (comedi_device    *dev,                           ||                           comedi_subdevice *s,                             ||                           comedi_insn      *insn,                          ||                           lsampl_t         *data)                          |+----------------------------------------------------------------------------+| Task              : Read the status from selected channel                  |+----------------------------------------------------------------------------+| Input Parameters  : b_Channel = CR_CHAN(insn->chanspec)                    |+----------------------------------------------------------------------------+| Output Parameters : data[0] : Selected TTL channel state                   |+----------------------------------------------------------------------------+| Return Value      : 0   : No error                                         ||                    -3   : Channel selection error                          ||                    -101 : Data size error                                  |+----------------------------------------------------------------------------+*/int i_APCI3XXX_InsnReadTTLIO (comedi_device    *dev,                              comedi_subdevice *s,                              comedi_insn      *insn,                              lsampl_t         *data)	{	BYTE         b_Channel      = (BYTE) CR_CHAN(insn->chanspec);	INT          i_ReturnValue  = insn->n;	lsampl_t * pls_ReadData     = data;	/************************/	/* Test the buffer size */	/************************/		if (insn->n >= 1)	   {	   /***********************/	   /* Test if read port 0 */	   /***********************/	   	   if (b_Channel < 8)	      {	      /*******************************************/	      /* Read port 0 (first digital output port) */	      /*******************************************/	         	      pls_ReadData [0] = inl(devpriv->iobase + 80);	      pls_ReadData [0] = (pls_ReadData [0] >> b_Channel) & 1;	      }	   else	      {	      /***********************/	      /* Test if read port 1 */	      /***********************/	   	      if ((b_Channel > 7) && (b_Channel < 16))	         {	         /******************************************/	         /* Read port 1 (first digital input port) */	         /******************************************/	         	         pls_ReadData [0] = inl(devpriv->iobase + 64);	         pls_ReadData [0] = (pls_ReadData [0] >> (b_Channel - 8)) & 1;	         }	      else	         {	         /***********************/	         /* Test if read port 2 */	         /***********************/	   	         if ((b_Channel > 15) && (b_Channel < 24))	            {	            /************************/	            /* Test if port 2 input */	            /************************/	         	            if ((devpriv->ul_TTLPortConfiguration[0] & 0xFF) == 0)	               {	               pls_ReadData [0] = inl(devpriv->iobase + 96);	               pls_ReadData [0] = (pls_ReadData [0] >> (b_Channel - 16)) & 1;	               }	            else	               {	               pls_ReadData [0] = inl(devpriv->iobase + 112);	               pls_ReadData [0] = (pls_ReadData [0] >> (b_Channel - 16)) & 1;	               }	            }	         else	            {	            /***************************/	            /* Channel selection error */	            /***************************/	            	            i_ReturnValue = -3;	            printk ("Channel %d selection error\n", b_Channel);	            }	         }	      }	   }	else	   {	   /*******************/	   /* Data size error */	   /*******************/	       	   printk("Buffer size error\n");	   i_ReturnValue = -101;	   }	return (i_ReturnValue);	}/*+----------------------------------------------------------------------------+|                        TTL OUTPUT FUNCTIONS                                |+----------------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+| Function Name     : INT     i_APCI3XXX_InsnWriteTTLIO                      ||                          (comedi_device    *dev,                           ||                           comedi_subdevice *s,                             ||                           comedi_insn      *insn,                          ||                           lsampl_t         *data)                          |+----------------------------------------------------------------------------+| Task              : Set the state from TTL 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_InsnWriteTTLIO   (comedi_device    *dev,                                  comedi_subdevice *s,                                  comedi_insn      *insn,                                  lsampl_t         *data)	{	INT          i_ReturnValue   = insn->n;	BYTE         b_Channel       = (BYTE) CR_CHAN(insn->chanspec);	BYTE         b_State         = 0;	DWORD       dw_Status        = 0;	/************************/	/* Test the buffer size */	/************************/		if (insn->n >= 1)	   {	   b_State = (BYTE) data [0];	   	   /***********************/	   /* Test if read port 0 */	   /***********************/	   	   if (b_Channel < 8)	      {	      /*****************************************************************************/	      /* Read port 0 (first digital output port) and set/reset the selcted channel */	      /*****************************************************************************/	         	      dw_Status = inl(devpriv->iobase + 80);	      dw_Status = (dw_Status & (0xFF - (1 << b_Channel))) | ((b_State & 1) << b_Channel);	      outl(dw_Status, devpriv->iobase + 80);	      }	   else	      {	      /***********************/	      /* Test if read port 2 */	      /***********************/	   	      if ((b_Channel > 15) && (b_Channel < 24))	         {	         /*************************/	         /* Test if port 2 output */	         /*************************/	         	         if ((devpriv->ul_TTLPortConfiguration[0] & 0xFF) == 0xFF)	            {	            /*****************************************************************************/	            /* Read port 2 (first digital output port) and set/reset the selcted channel */	            /*****************************************************************************/	         	            dw_Status = inl(devpriv->iobase + 112);	            dw_Status = (dw_Status & (0xFF - (1 << (b_Channel - 16)))) | ((b_State & 1) << (b_Channel - 16));	            outl(dw_Status, devpriv->iobase + 112);	            }	         else	            {	            /***************************/	            /* Channel selection error */	            /***************************/	            	            i_ReturnValue = -3;	            printk ("Channel %d selection error\n", b_Channel);	            }	          }	      else	         {	         /***************************/	         /* Channel selection error */	         /***************************/	            	         i_ReturnValue = -3;	         printk ("Channel %d selection error\n", b_Channel);	         }	      }	   }	else	   {	   /*******************/	   /* Data size error */	   /*******************/	       	   printk("Buffer size error\n");	   i_ReturnValue = -101;	   }	return (i_ReturnValue);	}/*+----------------------------------------------------------------------------+|                           DIGITAL INPUT SUBDEVICE                          |+----------------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+| Function name     :int i_APCI3XXX_InsnReadDigitalInput                     ||                                          (comedi_device *dev,              ||                                           comedi_subdevice *s,             ||                                           comedi_insn *insn,               ||                                           lsampl_t *data)                  |+----------------------------------------------------------------------------+| Task              : Reads the value of the specified Digital input channel |+----------------------------------------------------------------------------+| Input Parameters  : b_Channel = CR_CHAN(insn->chanspec) (0 to 3)           |+----------------------------------------------------------------------------+| Output Parameters : data[0] : Channel value                                |+----------------------------------------------------------------------------+| Return Value      : 0   : No error                                         ||                    -3   : Channel selection error                          ||                    -101 : Data size error                                  |+----------------------------------------------------------------------------+*/int	i_APCI3XXX_InsnReadDigitalInput(comedi_device    *dev,                                        comedi_subdevice *s,                                         comedi_insn      *insn,                                        lsampl_t         *data)	{	INT    i_ReturnValue = insn->n;	BYTE   b_Channel     = (BYTE) CR_CHAN(insn->chanspec);	DWORD dw_Temp        = 0;         	/***************************/	/* Test the channel number */	/***************************/		if(b_Channel <= devpriv->ps_BoardInfo->i_NbrDiChannel)	   {	   /************************/	   /* Test the buffer size */	   /************************/		   if (insn->n >= 1)	      {	      dw_Temp = inl (devpriv->iobase + 32);	      *data = (dw_Temp >> b_Channel) & 1;	      }	   else	      {	      /*******************/	      /* Data size error */	      /*******************/	       	      printk("Buffer size error\n");	      i_ReturnValue = -101;	      }	   }	else 	   {	   /***************************/	   /* Channel selection error */	   /***************************/	       	   printk("Channel selection error\n");	   i_ReturnValue = -3;	   }	   	return (i_ReturnValue); 	}/*+----------------------------------------------------------------------------+| Function name     :int i_APCI3XXX_InsnBitsDigitalInput                     ||                                          (comedi_device *dev,              ||                                           comedi_subdevice *s,             ||                                           comedi_insn *insn,               ||                                           lsampl_t *data)                  |+----------------------------------------------------------------------------+

⌨️ 快捷键说明

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