?? apci1710_ssi.c
字號:
/**@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 + -