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

📄 apci1710_ssi.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	{	INT    i_ReturnValue = 0;	BYTE   b_Cpt;	BYTE   b_Length;	BYTE   b_Schift;	BYTE   b_SSICpt;	DWORD dw_And;	DWORD dw_And1;	DWORD dw_And2;	DWORD dw_StatusReg;	DWORD dw_CounterValue;	BYTE  b_ModulNbr;	BYTE  b_SelectedSSI;	BYTE  b_ReadType;	PULONG pul_Position;	PULONG pul_TurnCpt;	PULONG pul_Position1;	PULONG pul_TurnCpt1;	i_ReturnValue	=	insn->n;	 	pul_Position1	=	(PULONG) &data[0];// For Read1	pul_TurnCpt1	=	(PULONG) &data[1];// For Read all       	pul_Position	=	(PULONG) &data[0];//0-2	pul_TurnCpt	=	(PULONG) &data[3];//3-5	b_ModulNbr		=   (BYTE) CR_AREF(insn->chanspec);	b_SelectedSSI	=	(BYTE) CR_CHAN(insn->chanspec);	b_ReadType		=	(BYTE) CR_RANGE(insn->chanspec);	/**************************/	/* Test the module number */	/**************************/	if (b_ModulNbr < 4)	   {	   /***********************/	   /* Test if SSI counter */	   /***********************/	   if ((devpriv->s_BoardInfos.		dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF0000UL) == APCI1710_SSI_COUNTER)	      {	      /***************************/	      /* Test if SSI initialised */	      /***************************/	      if (devpriv->s_ModuleInfo [b_ModulNbr].		  s_SSICounterInfo.		  b_SSIInit == 1)		 {          			switch(b_ReadType)			{			case APCI1710_SSI_READ1VALUE :		 /****************************************/		 /* Test the selected SSI counter number */		 /****************************************/		 if (b_SelectedSSI < 3)		    {		    /************************/		    /* Start the conversion */		    /************************/			outl(0,devpriv->s_BoardInfos.ui_Address + 8 + (64 * b_ModulNbr));					    do		       {		       /*******************/		       /* Read the status */		       /*******************/								dw_StatusReg = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr));		       }		    while ((dw_StatusReg & 0x1) != 0);		    /******************************/		    /* Read the SSI counter value */		    /******************************/					dw_CounterValue = inl(devpriv->s_BoardInfos.ui_Address + 4 + (b_SelectedSSI * 4) + (64 * b_ModulNbr));		    b_Length = devpriv->s_ModuleInfo [b_ModulNbr].s_SSICounterInfo.b_SSIProfile / 2;		    if ((b_Length * 2) != devpriv->s_ModuleInfo [b_ModulNbr].s_SSICounterInfo.b_SSIProfile)		       {		       b_Length ++;		       }		    b_Schift = b_Length - devpriv->s_ModuleInfo [b_ModulNbr].					  s_SSICounterInfo.					  b_PositionTurnLength;		    *pul_Position1 = dw_CounterValue >> b_Schift;		    dw_And = 1;		    for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr].					    s_SSICounterInfo.					    b_PositionTurnLength; b_Cpt ++)		       {		       dw_And = dw_And * 2;		       }		    *pul_Position1 = *pul_Position1 & ((dw_And) - 1);		    *pul_TurnCpt1 = dw_CounterValue >> b_Length;		    dw_And = 1;		    for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr].					    s_SSICounterInfo.					    b_TurnCptLength; b_Cpt ++)		       {		       dw_And = dw_And * 2;		       }		    *pul_TurnCpt1 = *pul_TurnCpt1 & ((dw_And) - 1);		    }		 else		    {		    /*****************************/		    /* The selected SSI is wrong */		    /*****************************/                   DPRINTK("The selected SSI is wrong\n");		    i_ReturnValue = -5;		    }          	break;		 case APCI1710_SSI_READALLVALUE :			 dw_And1 = 1;		 for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr].					 s_SSICounterInfo.					 b_PositionTurnLength; b_Cpt ++)		    {		    dw_And1 = dw_And1 * 2;		    }		 dw_And2 = 1;		 for (b_Cpt = 0; b_Cpt < devpriv->s_ModuleInfo [b_ModulNbr].					 s_SSICounterInfo.					 b_TurnCptLength; b_Cpt ++)		    {		    dw_And2 = dw_And2 * 2;		    }		 /************************/		 /* Start the conversion */		 /************************/				 outl(0,devpriv->s_BoardInfos.ui_Address + 8 + (64 * b_ModulNbr));		 do		    {		    /*******************/		    /* Read the status */		    /*******************/						dw_StatusReg = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr));		    }		 while ((dw_StatusReg & 0x1) != 0);		 for (b_SSICpt = 0; b_SSICpt < 3; b_SSICpt ++)		    {		    /******************************/		    /* Read the SSI counter value */		    /******************************/		  			 dw_CounterValue = inl(devpriv->s_BoardInfos.ui_Address + 4 + (b_SSICpt * 4) + (64 * b_ModulNbr));		    b_Length = devpriv->s_ModuleInfo [b_ModulNbr].			       s_SSICounterInfo.			       b_SSIProfile / 2;		    if ((b_Length * 2) != devpriv->s_ModuleInfo [b_ModulNbr].					  s_SSICounterInfo.					  b_SSIProfile)		       {		       b_Length ++;		       }		    b_Schift = b_Length - devpriv->s_ModuleInfo [b_ModulNbr].					  s_SSICounterInfo.					  b_PositionTurnLength;		    pul_Position [b_SSICpt] = dw_CounterValue >> b_Schift;		    pul_Position [b_SSICpt] = pul_Position [b_SSICpt] & ((dw_And1) - 1);		    pul_TurnCpt [b_SSICpt] = dw_CounterValue >> b_Length;		    pul_TurnCpt [b_SSICpt] = pul_TurnCpt [b_SSICpt] & ((dw_And2) - 1);		    }		 break;		 default :			 printk("Read Type Inputs Wrong\n");		 } // switch  ending		 }	      else		 {		 /***********************/		 /* SSI not initialised */		 /***********************/                DPRINTK("SSI not initialised\n");		 i_ReturnValue = -4;		 }	      }	   else	      {	      /**********************************/	      /* The module is not a SSI module */	      /**********************************/             DPRINTK("The module is not a SSI module\n");	      i_ReturnValue = -3; 	      }	   }	else	   {	   /***********************/	   /* Module number error */	   /***********************/	   DPRINTK("Module number error\n");		   i_ReturnValue = -2;	   }	return (i_ReturnValue);	}/*+----------------------------------------------------------------------------+| Function Name     : _INT_   i_APCI1710_ReadSSI1DigitalInput                ||                                       (BYTE_     b_BoardHandle,            ||                                        BYTE_     b_ModulNbr,               ||                                        BYTE_     b_InputChannel,           ||                                        PBYTE_   pb_ChannelStatus)          |+----------------------------------------------------------------------------+| Task              :					(0) Set the digital output from selected SSI moule         ||                     (b_ModuleNbr) ON                    (1) Set the digital output from selected SSI moule         ||                     (b_ModuleNbr) OFF        					(2)Read the status from selected SSI digital input        ||                     (b_InputChannel)                      (3)Read the status from all SSI digital inputs from       ||                     selected SSI module (b_ModulNbr)                   |+----------------------------------------------------------------------------+| Input Parameters  : BYTE_ b_BoardHandle         : Handle of board APCI-1710||                     BYTE_ b_ModulNbr    CR_AREF        : Module number to         ||                                                   configure (0 to 3)       ||                     BYTE_ b_InputChannel CR_CHAN       : Selection from digital   ||                        data[0] which IOTYPE                           input ( 0 to 2)          |+----------------------------------------------------------------------------+| Output Parameters : PBYTE_  pb_ChannelStatus    : Digital input channel    ||                                 data[0]                  status                   ||                                                   0 : Channle is not active||                                                   1 : Channle is active    |+----------------------------------------------------------------------------+| Return Value      : 0: No error                                            ||                    -1: The handle parameter of the board is wrong          ||                    -2: The module parameter is wrong                       ||                    -3: The module is not a SSI module                      ||                    -4: The selected SSI digital input is wrong             |+----------------------------------------------------------------------------+*/INT	i_APCI1710_InsnBitsSSIDigitalIO(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)	{	INT     i_ReturnValue = 0;	DWORD   dw_StatusReg;	BYTE    b_ModulNbr;	BYTE    b_InputChannel;	PBYTE   pb_ChannelStatus;        PBYTE   pb_InputStatus;	BYTE    b_IOType;	i_ReturnValue = insn->n;        b_ModulNbr    = (BYTE) CR_AREF(insn->chanspec);        b_IOType      = (BYTE) data[0];		/**************************/	/* Test the module number */	/**************************/	if (b_ModulNbr < 4)	   {	   /***********************/	   /* Test if SSI counter */	   /***********************/	   if ((devpriv->s_BoardInfos.		dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF0000UL) == APCI1710_SSI_COUNTER)	      {           switch(b_IOType)		   {		   case    APCI1710_SSI_SET_CHANNELON :					/*****************************/					/* Set the digital output ON */					/*****************************/					                   outl(1,devpriv->s_BoardInfos.ui_Address + 16 + (64 * b_ModulNbr));			       break ;		   case    APCI1710_SSI_SET_CHANNELOFF :					/******************************/					/* Set the digital output OFF */					/******************************/								   outl(0,devpriv->s_BoardInfos.ui_Address + 16 + (64 * b_ModulNbr));			       break ;		   				   case APCI1710_SSI_READ_1CHANNEL:	      			   /******************************************/	      			   /* Test the digital imnput channel number */	      			   /******************************************/           				b_InputChannel = (BYTE) CR_CHAN(insn->chanspec);		   			pb_ChannelStatus = (PBYTE) &data[0];	      				if (b_InputChannel <= 2)		 			{		 			/**************************/		 			/* Read all digital input */		 			/**************************/       		 								dw_StatusReg = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr));		 			*pb_ChannelStatus = (BYTE) (((~dw_StatusReg) >> (4 + b_InputChannel)) & 1);		 			}	      				else		 			{		 			/********************************/		 			/* Selected digital input error */		 			/********************************/                           DPRINTK("Selected digital input error\n");		 			i_ReturnValue = -4;		 			}		  			break;			case APCI1710_SSI_READ_ALLCHANNEL:          				/**************************/	      				/* Read all digital input */	      				/**************************/					pb_InputStatus = (PBYTE) &data[0];	      					  			dw_StatusReg	  = inl(devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr));	      				*pb_InputStatus = (BYTE) (((~dw_StatusReg) >> 4) & 7);					break;        		default :					printk("IO type wrong\n");		 } //switch end	      }	   else	      {	      /**********************************/	      /* The module is not a SSI module */	      /**********************************/	      DPRINTK("The module is not a SSI module\n"); 		      i_ReturnValue = -3;	      }	   }	else	   {	   /***********************/	   /* Module number error */	   /***********************/	   DPRINTK("Module number error\n");	   i_ReturnValue = -2;	   }	return (i_ReturnValue);	}

⌨️ 快捷键说明

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