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

📄 apci1710_ssi.c

📁 最新版comedi的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**@verbatimCopyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.                 ADDI-DATA GmbH         Dieselstrasse 3         D-77833 Ottersweier         Tel: +19(0)7223/9493-0         Fax: +49(0)7223/9493-92         http://www.addi-data-com         info@addi-data.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USAYou shoud also find the complete GPL in the COPYING file accompanying this source code.@endverbatim*//*      +-----------------------------------------------------------------------+  | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |  +-----------------------------------------------------------------------+  | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |  | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |  +-----------------------------------------------------------------------+  | Project     : API APCI1710    | Compiler : gcc                        |  | Module name : SSI.C           | Version  : 2.96                       |  +-------------------------------+---------------------------------------+  | Project manager: Eric Stolz   | Date     :  02/12/2002                |  +-----------------------------------------------------------------------+  | Description :   APCI-1710 SSI counter module                          |  |                                                                       |  |                                                                       |  +-----------------------------------------------------------------------+  |                             UPDATES                                   |  +-----------------------------------------------------------------------+  |   Date   |   Author  |          Description of updates                |  +----------+-----------+------------------------------------------------+  | 13/05/98 | S. Weber  | SSI digital input / output implementation      |  |----------|-----------|------------------------------------------------|  | 22/03/00 | C.Guinot  | 0100/0226 -> 0200/0227                         |  |          |           | Änderung in InitSSI Funktion                   |  |          |           | b_SSIProfile >= 2 anstatt b_SSIProfile > 2     |  |          |           |                                                |  +-----------------------------------------------------------------------+  | 08/05/00 | Guinot C  | - 0400/0228 All Function in RING 0             |  |          |           |   available                                    |  +-----------------------------------------------------------------------+*//*+----------------------------------------------------------------------------+|                               Included files                               |+----------------------------------------------------------------------------+*/#include "APCI1710_Ssi.h"/*+----------------------------------------------------------------------------+| Function Name     : _INT_ i_APCI1710_InitSSI                               ||                               (BYTE_    b_BoardHandle,                     ||                                BYTE_    b_ModulNbr,                        ||                                BYTE_    b_SSIProfile,                      ||                                BYTE_    b_PositionTurnLength,              ||                                BYTE_    b_TurnCptLength,                   ||                                BYTE_    b_PCIInputClock,                   ||                                ULONG_  ul_SSIOutputClock,                  ||                                BYTE_    b_SSICountingMode)                 |+----------------------------------------------------------------------------+| Task              : Configure the SSI operating mode from selected module  ||                     (b_ModulNbr). You must calling this function be for you||                     call any other function witch access of SSI.           |+----------------------------------------------------------------------------+| Input Parameters  : BYTE_ b_BoardHandle         : Handle of board APCI-1710||                     BYTE_ b_ModulNbr            : Module number to         ||                                                   configure (0 to 3)       ||                     BYTE_  b_SSIProfile         : Selection from SSI       ||                                                   profile length (2 to 32).||                     BYTE_  b_PositionTurnLength : Selection from SSI       ||                                                   position data length     ||                                                   (1 to 31).               ||                     BYTE_  b_TurnCptLength      : Selection from SSI turn  ||                                                   counter data length      ||                                                   (1 to 31).               ||                     BYTE   b_PCIInputClock      : Selection from PCI bus   ||                                                   clock                    ||                                                 - APCI1710_30MHZ :         ||                                                   The PC have a PCI bus    ||                                                   clock from 30 MHz        ||                                                 - APCI1710_33MHZ :         ||                                                   The PC have a PCI bus    ||                                                   clock from 33 MHz        ||                     ULONG_ ul_SSIOutputClock    : Selection from SSI output||                                                   clock.                   ||                                                   From  229 to 5 000 000 Hz||                                                   for 30 MHz selection.    ||                                                   From  252 to 5 000 000 Hz||                                                   for 33 MHz selection.    ||                     BYTE   b_SSICountingMode    : SSI counting mode        ||                                                   selection                ||                                                 - APCI1710_BINARY_MODE :   ||                                                    Binary counting mode.   ||                                                 - APCI1710_GRAY_MODE :     ||                                                    Gray counting mode.	b_ModulNbr			= CR_AREF(insn->chanspec);	b_SSIProfile		= (BYTE) data[0];  	b_PositionTurnLength= (BYTE) data[1];  	b_TurnCptLength		= (BYTE) data[2];	b_PCIInputClock		= (BYTE) data[3];	ul_SSIOutputClock	= (ULONG) data[4];	b_SSICountingMode	= (BYTE)  data[5];     |+----------------------------------------------------------------------------+| Output Parameters : -                                                      |+----------------------------------------------------------------------------+| 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 profile length is wrong            ||                    -5: The selected SSI position data length is wrong      ||                    -6: The selected SSI turn counter data length is wrong  ||                    -7: The selected PCI input clock is wrong               ||                    -8: The selected SSI output clock is wrong              ||                    -9: The selected SSI counting mode parameter is wrong   |+----------------------------------------------------------------------------+*/INT   i_APCI1710_InsnConfigInitSSI(comedi_device *dev,comedi_subdevice *s,	comedi_insn *insn,lsampl_t *data)	{	INT    i_ReturnValue = 0;	UINT   ui_TimerValue;	BYTE   b_ModulNbr,b_SSIProfile,b_PositionTurnLength,b_TurnCptLength,b_PCIInputClock,b_SSICountingMode;	ULONG  ul_SSIOutputClock;				b_ModulNbr			= CR_AREF(insn->chanspec);	b_SSIProfile		= (BYTE) data[0];  	b_PositionTurnLength= (BYTE) data[1];  	b_TurnCptLength		= (BYTE) data[2];	b_PCIInputClock		= (BYTE) data[3];	ul_SSIOutputClock	= (ULONG) data[4];	b_SSICountingMode	= (BYTE)  data[5];	i_ReturnValue		= insn->n;	/**************************/	/* 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 the SSI profile length */	      /*******************************/	      // CG 22/03/00 b_SSIProfile >= 2 anstatt b_SSIProfile > 2	      if (b_SSIProfile >= 2 && b_SSIProfile < 33)		 {		 /*************************************/		 /* Test the SSI position data length */		 /*************************************/		 if (b_PositionTurnLength > 0 && b_PositionTurnLength < 32)		    {		    /*****************************************/		    /* Test the SSI turn counter data length */		    /*****************************************/		    if (b_TurnCptLength > 0 && b_TurnCptLength < 32)		       {		       /***************************/		       /* Test the profile length */		       /***************************/		       if ((b_TurnCptLength + b_PositionTurnLength) <= b_SSIProfile)			  {			  /****************************/			  /* Test the PCI input clock */			  /****************************/			  if (b_PCIInputClock == APCI1710_30MHZ || b_PCIInputClock == APCI1710_33MHZ)			     {			     /*************************/			     /* Test the output clock */			     /*************************/			     if ((b_PCIInputClock == APCI1710_30MHZ &&				  (ul_SSIOutputClock > 228 && ul_SSIOutputClock <= 5000000UL)) ||				 (b_PCIInputClock == APCI1710_33MHZ &&				  (ul_SSIOutputClock > 251 && ul_SSIOutputClock <= 5000000UL)))				{				if (b_SSICountingMode == APCI1710_BINARY_MODE ||				    b_SSICountingMode == APCI1710_GRAY_MODE)				   {				   /**********************/				   /* Save configuration */				   /**********************/				   devpriv->s_ModuleInfo [b_ModulNbr].				   s_SSICounterInfo.				   b_SSIProfile = b_SSIProfile;				   				   devpriv->s_ModuleInfo [b_ModulNbr].				   s_SSICounterInfo.				   b_PositionTurnLength = b_PositionTurnLength;				   devpriv->s_ModuleInfo [b_ModulNbr].				   s_SSICounterInfo.				   b_TurnCptLength = b_TurnCptLength;				   /*********************************/				   /* Initialise the profile length */				   /*********************************/				   if (b_SSICountingMode == APCI1710_BINARY_MODE)				      {				    					outl(b_SSIProfile + 1,devpriv->s_BoardInfos.ui_Address + 4 + (64 * b_ModulNbr));				      }				   else				      {											   outl(b_SSIProfile,devpriv->s_BoardInfos.ui_Address + 4 + (64 * b_ModulNbr));				      }				   /******************************/				   /* Calculate the output clock */				   /******************************/				   ui_TimerValue = (UINT) (((ULONG) (b_PCIInputClock) * 500000UL) / ul_SSIOutputClock);				   /************************/				   /* Initialise the timer */				   /************************/				  				    outl(ui_TimerValue,devpriv->s_BoardInfos.ui_Address + (64 * b_ModulNbr));				   /********************************/				   /* Initialise the counting mode */				   /********************************/										outl(7 * b_SSICountingMode,devpriv->s_BoardInfos.ui_Address + 12 + (64 * b_ModulNbr));				   					devpriv->s_ModuleInfo [b_ModulNbr].s_SSICounterInfo.b_SSIInit = 1;				   }				else				   {				   /*****************************************************/				   /* The selected SSI counting mode parameter is wrong */				   /*****************************************************/                          DPRINTK("The selected SSI counting mode parameter is wrong\n");				   i_ReturnValue = -9;				   }				}			     else				{				/******************************************/				/* The selected SSI output clock is wrong */				/******************************************/				DPRINTK("The selected SSI output clock is wrong\n");				i_ReturnValue = -8;				}			     }			  else			     {			     /*****************************************/			     /* The selected PCI input clock is wrong */			     /*****************************************/				 DPRINTK("The selected PCI input clock is wrong\n");			     i_ReturnValue = -7;			     }			  }		       else			  {			  /********************************************/			  /* The selected SSI profile length is wrong */			  /********************************************/			  DPRINTK("The selected SSI profile length is wrong\n");				  i_ReturnValue = -4;			  }		       }		    else		       {		       /******************************************************/		       /* The selected SSI turn counter data length is wrong */		       /******************************************************/			   DPRINTK("The selected SSI turn counter data length is wrong\n");			       i_ReturnValue = -6;		       }		    }		 else		    {		    /**************************************************/		    /* The selected SSI position data length is wrong */		    /**************************************************/			DPRINTK("The selected SSI position data length is wrong\n");		    i_ReturnValue = -5;		    }		 }	      else		 {		 /********************************************/		 /* The selected SSI profile length is wrong */		 /********************************************/		 DPRINTK("The selected SSI profile length is wrong\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_Read1SSIValue                        ||                               (BYTE_     b_BoardHandle,                    ||                                BYTE_     b_ModulNbr,                       ||                                BYTE_     b_SelectedSSI,                    ||                                PULONG_ pul_Position,                       ||                                PULONG_ pul_TurnCpt)  INT i_APCI1710_ReadSSIValue(comedi_device *dev,comedi_subdevice *s,	comedi_insn *insn,lsampl_t *data)                       |+----------------------------------------------------------------------------+| Task              :  						Read the selected SSI counter (b_SelectedSSI) from     ||                     selected module (b_ModulNbr).						or Read all SSI counter (b_SelectedSSI) from              ||                     selected module (b_ModulNbr).                            |+----------------------------------------------------------------------------+| Input Parameters  : BYTE_ b_BoardHandle         : Handle of board APCI-1710||                     BYTE_ b_ModulNbr            : Module number to         ||                                                   configure (0 to 3)       ||                     BYTE_ b_SelectedSSI         : Selection from SSI       ||                                                   counter (0 to 2)        b_ModulNbr		=   (BYTE) CR_AREF(insn->chanspec);	b_SelectedSSI	=	(BYTE) CR_CHAN(insn->chanspec); (in case of single ssi)	b_ReadType		=	(BYTE) CR_RANGE(insn->chanspec);|+----------------------------------------------------------------------------+| Output Parameters : PULONG_  pul_Position       : SSI position in the turn ||                     PULONG_  pul_TurnCpt        : Number of turns pul_Position	=	(PULONG) &data[0];	pul_TurnCpt		=	(PULONG) &data[1];         |+----------------------------------------------------------------------------+| 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: SSI not initialised see function                    ||                        "i_APCI1710_InitSSI"                                ||                    -5: The selected SSI is wrong                           |+----------------------------------------------------------------------------+*/   INT i_APCI1710_InsnReadSSIValue(comedi_device *dev,comedi_subdevice *s,	comedi_insn *insn,lsampl_t *data)

⌨️ 快捷键说明

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