blob: 14b13eae4c5074b923854b0860050fccc5ef1c38 [file] [log] [blame]
/**
@verbatim
Copyright (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 USA
You should 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 : INC_CPT.C | Version : 2.96 |
+-------------------------------+---------------------------------------+
| Project manager: Eric Stolz | Date : 02/12/2002 |
+-----------------------------------------------------------------------+
| Description : APCI-1710 incremental counter module |
| |
| |
+-----------------------------------------------------------------------+
| UPDATES |
+-----------------------------------------------------------------------+
| Date | Author | Description of updates |
+----------+-----------+------------------------------------------------+
| | | |
|----------|-----------|------------------------------------------------|
| 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
| | | available |
+-----------------------------------------------------------------------+
| 29/06/01 | Guinot C. | - 1100/0231 -> 0701/0232 |
| | | See i_APCI1710_DisableFrequencyMeasurement |
+-----------------------------------------------------------------------+
*/
/*
+----------------------------------------------------------------------------+
| Included files |
+----------------------------------------------------------------------------+
*/
#include "APCI1710_INCCPT.h"
/*
+----------------------------------------------------------------------------+
| int i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
struct comedi_insn *insn,unsigned int *data)
+----------------------------------------------------------------------------+
| Task : Configuration function for INC_CPT |
+----------------------------------------------------------------------------+
| Input Parameters : |
+----------------------------------------------------------------------------+
| Output Parameters : *data
+----------------------------------------------------------------------------+
| Return Value : |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
unsigned int ui_ConfigType;
int i_ReturnValue = 0;
ui_ConfigType = CR_CHAN(insn->chanspec);
printk("\nINC_CPT");
devpriv->tsk_Current = current; /* Save the current process task structure */
switch (ui_ConfigType) {
case APCI1710_INCCPT_INITCOUNTER:
i_ReturnValue = i_APCI1710_InitCounter(dev,
CR_AREF(insn->chanspec),
(unsigned char) data[0],
(unsigned char) data[1],
(unsigned char) data[2], (unsigned char) data[3], (unsigned char) data[4]);
break;
case APCI1710_INCCPT_COUNTERAUTOTEST:
i_ReturnValue = i_APCI1710_CounterAutoTest(dev,
(unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_INITINDEX:
i_ReturnValue = i_APCI1710_InitIndex(dev,
CR_AREF(insn->chanspec),
(unsigned char) data[0],
(unsigned char) data[1], (unsigned char) data[2], (unsigned char) data[3]);
break;
case APCI1710_INCCPT_INITREFERENCE:
i_ReturnValue = i_APCI1710_InitReference(dev,
CR_AREF(insn->chanspec), (unsigned char) data[0]);
break;
case APCI1710_INCCPT_INITEXTERNALSTROBE:
i_ReturnValue = i_APCI1710_InitExternalStrobe(dev,
CR_AREF(insn->chanspec),
(unsigned char) data[0], (unsigned char) data[1]);
break;
case APCI1710_INCCPT_INITCOMPARELOGIC:
i_ReturnValue = i_APCI1710_InitCompareLogic(dev,
CR_AREF(insn->chanspec), (unsigned int) data[0]);
break;
case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT:
i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev,
CR_AREF(insn->chanspec),
(unsigned char) data[0],
(unsigned char) data[1], (unsigned int) data[2], (unsigned int *) &data[0]);
break;
default:
printk("Insn Config : Config Parameter Wrong\n");
}
if (i_ReturnValue >= 0)
i_ReturnValue = insn->n;
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_InitCounter |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_CounterRange, |
| unsigned char_ b_FirstCounterModus, |
| unsigned char_ b_FirstCounterOption, |
| unsigned char_ b_SecondCounterModus, |
| unsigned char_ b_SecondCounterOption) |
+----------------------------------------------------------------------------+
| Task : Configure the counter operating mode from selected |
| module (b_ModulNbr). You must calling this function be |
| for you call any other function witch access of |
| counters. |
| |
| Counter range |
| ------------- |
| +------------------------------------+-----------------------------------+ |
| | Parameter Passed value | Description | |
| |------------------------------------+-----------------------------------| |
| |b_ModulNbr APCI1710_16BIT_COUNTER | The module is configured for | |
| | | two 16-bit counter. | |
| | | - b_FirstCounterModus and | |
| | | b_FirstCounterOption | |
| | | configure the first 16 bit | |
| | | counter. | |
| | | - b_SecondCounterModus and | |
| | | b_SecondCounterOption | |
| | | configure the second 16 bit | |
| | | counter. | |
| |------------------------------------+-----------------------------------| |
| |b_ModulNbr APCI1710_32BIT_COUNTER | The module is configured for one | |
| | | 32-bit counter. | |
| | | - b_FirstCounterModus and | |
| | | b_FirstCounterOption | |
| | | configure the 32 bit counter. | |
| | | - b_SecondCounterModus and | |
| | | b_SecondCounterOption | |
| | | are not used and have no | |
| | | importance. | |
| +------------------------------------+-----------------------------------+ |
| |
| Counter operating mode |
| ---------------------- |
| |
| +--------------------+-------------------------+-------------------------+ |
| | Parameter | Passed value | Description | |
| |--------------------+-------------------------+-------------------------| |
| |b_FirstCounterModus | APCI1710_QUADRUPLE_MODE | In the quadruple mode, | |
| | or | | the edge analysis | |
| |b_SecondCounterModus| | circuit generates a | |
| | | | counting pulse from | |
| | | | each edge of 2 signals | |
| | | | which are phase shifted | |
| | | | in relation to each | |
| | | | other. | |
| |--------------------+-------------------------+-------------------------| |
| |b_FirstCounterModus | APCI1710_DOUBLE_MODE | Functions in the same | |
| | or | | way as the quadruple | |
| |b_SecondCounterModus| | mode, except that only | |
| | | | two of the four edges | |
| | | | are analysed per | |
| | | | period | |
| |--------------------+-------------------------+-------------------------| |
| |b_FirstCounterModus | APCI1710_SIMPLE_MODE | Functions in the same | |
| | or | | way as the quadruple | |
| |b_SecondCounterModus| | mode, except that only | |
| | | | one of the four edges | |
| | | | is analysed per | |
| | | | period. | |
| |--------------------+-------------------------+-------------------------| |
| |b_FirstCounterModus | APCI1710_DIRECT_MODE | In the direct mode the | |
| | or | | both edge analysis | |
| |b_SecondCounterModus| | circuits are inactive. | |
| | | | The inputs A, B in the | |
| | | | 32-bit mode or A, B and | |
| | | | C, D in the 16-bit mode | |
| | | | represent, each, one | |
| | | | clock pulse gate circuit| |
| | | | There by frequency and | |
| | | | pulse duration | |
| | | | measurements can be | |
| | | | performed. | |
| +--------------------+-------------------------+-------------------------+ |
| |
| |
| IMPORTANT! |
| If you have configured the module for two 16-bit counter, a mixed |
| mode with a counter in quadruple/double/single mode |
| and the other counter in direct mode is not possible! |
| |
| |
| Counter operating option for quadruple/double/simple mode |
| --------------------------------------------------------- |
| |
| +----------------------+-------------------------+------------------------+|
| | Parameter | Passed value | Description ||
| |----------------------+-------------------------+------------------------||
| |b_FirstCounterOption | APCI1710_HYSTERESIS_ON | In both edge analysis ||
| | or | | circuits is available ||
| |b_SecondCounterOption | | one hysteresis circuit.||
| | | | It suppresses each ||
| | | | time the first counting||
| | | | pulse after a change ||
| | | | of rotation. ||
| |----------------------+-------------------------+------------------------||
| |b_FirstCounterOption | APCI1710_HYSTERESIS_OFF | The first counting ||
| | or | | pulse is not suppress ||
| |b_SecondCounterOption | | after a change of ||
| | | | rotation. ||
| +----------------------+-------------------------+------------------------+|
| |
| |
| IMPORTANT! |
| This option are only avaible if you have selected the direct mode. |
| |
| |
| Counter operating option for direct mode |
| ---------------------------------------- |
| |
| +----------------------+--------------------+----------------------------+ |
| | Parameter | Passed value | Description | |
| |----------------------+--------------------+----------------------------| |
| |b_FirstCounterOption | APCI1710_INCREMENT | The counter increment for | |
| | or | | each counting pulse | |
| |b_SecondCounterOption | | | |
| |----------------------+--------------------+----------------------------| |
| |b_FirstCounterOption | APCI1710_DECREMENT | The counter decrement for | |
| | or | | each counting pulse | |
| |b_SecondCounterOption | | | |
| +----------------------+--------------------+----------------------------+ |
| |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710|
| unsigned char_ b_ModulNbr : Module number to |
| configure (0 to 3) |
| unsigned char_ b_CounterRange : Selection form counter |
| range. |
| unsigned char_ b_FirstCounterModus : First counter operating |
| mode. |
| unsigned char_ b_FirstCounterOption : First counter option. |
| unsigned char_ b_SecondCounterModus : Second counter operating |
| mode. |
| unsigned char_ b_SecondCounterOption : Second counter option. |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The module is not a counter module |
| -3: The selected counter range is wrong. |
| -4: The selected first counter operating mode is wrong. |
| -5: The selected first counter operating option is wrong|
| -6: The selected second counter operating mode is wrong.|
| -7: The selected second counter operating option is |
| wrong. |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InitCounter(struct comedi_device *dev,
unsigned char b_ModulNbr,
unsigned char b_CounterRange,
unsigned char b_FirstCounterModus,
unsigned char b_FirstCounterOption,
unsigned char b_SecondCounterModus, unsigned char b_SecondCounterOption)
{
int i_ReturnValue = 0;
/*******************************/
/* Test if incremental counter */
/*******************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER) {
/**************************/
/* Test the counter range */
/**************************/
if (b_CounterRange == APCI1710_16BIT_COUNTER
|| b_CounterRange == APCI1710_32BIT_COUNTER) {
/********************************/
/* Test the first counter modus */
/********************************/
if (b_FirstCounterModus == APCI1710_QUADRUPLE_MODE ||
b_FirstCounterModus == APCI1710_DOUBLE_MODE ||
b_FirstCounterModus == APCI1710_SIMPLE_MODE ||
b_FirstCounterModus == APCI1710_DIRECT_MODE) {
/*********************************/
/* Test the first counter option */
/*********************************/
if ((b_FirstCounterModus == APCI1710_DIRECT_MODE
&& (b_FirstCounterOption ==
APCI1710_INCREMENT
|| b_FirstCounterOption
== APCI1710_DECREMENT))
|| (b_FirstCounterModus !=
APCI1710_DIRECT_MODE
&& (b_FirstCounterOption ==
APCI1710_HYSTERESIS_ON
|| b_FirstCounterOption
==
APCI1710_HYSTERESIS_OFF)))
{
/**************************/
/* Test if 16-bit counter */
/**************************/
if (b_CounterRange ==
APCI1710_16BIT_COUNTER) {
/*********************************/
/* Test the second counter modus */
/*********************************/
if ((b_FirstCounterModus !=
APCI1710_DIRECT_MODE
&&
(b_SecondCounterModus
==
APCI1710_QUADRUPLE_MODE
||
b_SecondCounterModus
==
APCI1710_DOUBLE_MODE
||
b_SecondCounterModus
==
APCI1710_SIMPLE_MODE))
|| (b_FirstCounterModus
==
APCI1710_DIRECT_MODE
&&
b_SecondCounterModus
==
APCI1710_DIRECT_MODE))
{
/**********************************/
/* Test the second counter option */
/**********************************/
if ((b_SecondCounterModus == APCI1710_DIRECT_MODE && (b_SecondCounterOption == APCI1710_INCREMENT || b_SecondCounterOption == APCI1710_DECREMENT)) || (b_SecondCounterModus != APCI1710_DIRECT_MODE && (b_SecondCounterOption == APCI1710_HYSTERESIS_ON || b_SecondCounterOption == APCI1710_HYSTERESIS_OFF))) {
i_ReturnValue =
0;
} else {
/*********************************************************/
/* The selected second counter operating option is wrong */
/*********************************************************/
DPRINTK("The selected second counter operating option is wrong\n");
i_ReturnValue =
-7;
}
} else {
/*******************************************************/
/* The selected second counter operating mode is wrong */
/*******************************************************/
DPRINTK("The selected second counter operating mode is wrong\n");
i_ReturnValue = -6;
}
}
} else {
/********************************************************/
/* The selected first counter operating option is wrong */
/********************************************************/
DPRINTK("The selected first counter operating option is wrong\n");
i_ReturnValue = -5;
}
} else {
/******************************************************/
/* The selected first counter operating mode is wrong */
/******************************************************/
DPRINTK("The selected first counter operating mode is wrong\n");
i_ReturnValue = -4;
}
} else {
/***************************************/
/* The selected counter range is wrong */
/***************************************/
DPRINTK("The selected counter range is wrong\n");
i_ReturnValue = -3;
}
/*************************/
/* Test if a error occur */
/*************************/
if (i_ReturnValue == 0) {
/**************************/
/* Test if 16-Bit counter */
/**************************/
if (b_CounterRange == APCI1710_32BIT_COUNTER) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister1 = b_CounterRange |
b_FirstCounterModus |
b_FirstCounterOption;
} else {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister1 = b_CounterRange |
(b_FirstCounterModus & 0x5) |
(b_FirstCounterOption & 0x20) |
(b_SecondCounterModus & 0xA) |
(b_SecondCounterOption & 0x40);
/***********************/
/* Test if direct mode */
/***********************/
if (b_FirstCounterModus == APCI1710_DIRECT_MODE) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister1 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister1 |
APCI1710_DIRECT_MODE;
}
}
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.
ui_Address + 20 + (64 * b_ModulNbr));
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_CounterInit = 1;
}
} else {
/**************************************/
/* The module is not a counter module */
/**************************************/
DPRINTK("The module is not a counter module\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_CounterAutoTest |
| (unsigned char_ b_BoardHandle, |
| unsigned char *_ pb_TestStatus) |
+----------------------------------------------------------------------------+
| Task : A test mode is intended for testing the component and |
| the connected periphery. All the 8-bit counter chains |
| are operated internally as down counters. |
| Independently from the external signals, |
| all the four 8-bit counter chains are decremented in |
| parallel by each negative clock pulse edge of CLKX. |
| |
| Counter auto test conclusion |
| ---------------------------- |
| +-----------------+-----------------------------+ |
| | pb_TestStatus | Error description | |
| | mask | | |
| |-----------------+-----------------------------| |
| | 0000 | No error detected | |
| |-----------------|-----------------------------| |
| | 0001 | Error detected of counter 0 | |
| |-----------------|-----------------------------| |
| | 0010 | Error detected of counter 1 | |
| |-----------------|-----------------------------| |
| | 0100 | Error detected of counter 2 | |
| |-----------------|-----------------------------| |
| | 1000 | Error detected of counter 3 | |
| +-----------------+-----------------------------+ |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_TestStatus : Auto test conclusion. See table|
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_CounterAutoTest(struct comedi_device *dev, unsigned char *pb_TestStatus)
{
unsigned char b_ModulCpt = 0;
int i_ReturnValue = 0;
unsigned int dw_LathchValue;
*pb_TestStatus = 0;
/********************************/
/* Test if counter module found */
/********************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[0] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER
|| (devpriv->s_BoardInfos.
dw_MolduleConfiguration[1] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER
|| (devpriv->s_BoardInfos.
dw_MolduleConfiguration[2] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER
|| (devpriv->s_BoardInfos.
dw_MolduleConfiguration[3] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER) {
for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) {
/*******************************/
/* Test if incremental counter */
/*******************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulCpt] &
0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER) {
/******************/
/* Start the test */
/******************/
outl(3, devpriv->s_BoardInfos.
ui_Address + 16 + (64 * b_ModulCpt));
/*********************/
/* Tatch the counter */
/*********************/
outl(1, devpriv->s_BoardInfos.
ui_Address + (64 * b_ModulCpt));
/************************/
/* Read the latch value */
/************************/
dw_LathchValue = inl(devpriv->s_BoardInfos.
ui_Address + 4 + (64 * b_ModulCpt));
if ((dw_LathchValue & 0xFF) !=
((dw_LathchValue >> 8) & 0xFF)
&& (dw_LathchValue & 0xFF) !=
((dw_LathchValue >> 16) & 0xFF)
&& (dw_LathchValue & 0xFF) !=
((dw_LathchValue >> 24) & 0xFF)) {
*pb_TestStatus =
*pb_TestStatus | (1 <<
b_ModulCpt);
}
/*****************/
/* Stop the test */
/*****************/
outl(0, devpriv->s_BoardInfos.
ui_Address + 16 + (64 * b_ModulCpt));
}
}
} else {
/***************************/
/* No counter module found */
/***************************/
DPRINTK("No counter module found\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_InitIndex (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_ReferenceAction, |
| unsigned char_ b_IndexOperation, |
| unsigned char_ b_AutoMode, |
| unsigned char_ b_InterruptEnable) |
+----------------------------------------------------------------------------+
| Task : Initialise the index corresponding to the selected |
| module (b_ModulNbr). If a INDEX flag occur, you have |
| the possibility to clear the 32-Bit counter or to latch|
| the current 32-Bit value in to the first latch |
| register. The b_IndexOperation parameter give the |
| possibility to choice the INDEX action. |
| If you have enabled the automatic mode, each INDEX |
| action is cleared automatically, else you must read |
| the index status ("i_APCI1710_ReadIndexStatus") |
| after each INDEX action. |
| |
| |
| Index action |
| ------------ |
| |
| +------------------------+------------------------------------+ |
| | b_IndexOperation | Operation | |
| |------------------------+------------------------------------| |
| |APCI1710_LATCH_COUNTER | After a index signal, the counter | |
| | | value (32-Bit) is latched in to | |
| | | the first latch register | |
| |------------------------|------------------------------------| |
| |APCI1710_CLEAR_COUNTER | After a index signal, the counter | |
| | | value is cleared (32-Bit) | |
| +------------------------+------------------------------------+ |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_ReferenceAction : Determine if the reference |
| must set or no for the |
| acceptance from index |
| APCI1710_ENABLE : |
| Reference must be set for |
| accepted the index |
| APCI1710_DISABLE : |
| Reference have not |
| importance |
| unsigned char_ b_IndexOperation : Index operating mode. |
| See table. |
| unsigned char_ b_AutoMode : Enable or disable the |
| automatic index reset. |
| APCI1710_ENABLE : |
| Enable the automatic mode |
| APCI1710_DISABLE : |
| Disable the automatic mode |
| unsigned char_ b_InterruptEnable : Enable or disable the |
| interrupt. |
| APCI1710_ENABLE : |
| Enable the interrupt |
| APCI1710_DISABLE : |
| Disable the interrupt |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4 The reference action parameter is wrong |
| -5: The index operating mode parameter is wrong |
| -6: The auto mode parameter is wrong |
| -7: Interrupt parameter is wrong |
| -8: Interrupt function not initialised. |
| See function "i_APCI1710_SetBoardIntRoutineX" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InitIndex(struct comedi_device *dev,
unsigned char b_ModulNbr,
unsigned char b_ReferenceAction,
unsigned char b_IndexOperation, unsigned char b_AutoMode, unsigned char b_InterruptEnable)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/********************************/
/* Test the reference parameter */
/********************************/
if (b_ReferenceAction == APCI1710_ENABLE ||
b_ReferenceAction == APCI1710_DISABLE) {
/****************************/
/* Test the index parameter */
/****************************/
if (b_IndexOperation ==
APCI1710_HIGH_EDGE_LATCH_COUNTER
|| b_IndexOperation ==
APCI1710_LOW_EDGE_LATCH_COUNTER
|| b_IndexOperation ==
APCI1710_HIGH_EDGE_CLEAR_COUNTER
|| b_IndexOperation ==
APCI1710_LOW_EDGE_CLEAR_COUNTER
|| b_IndexOperation ==
APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER
|| b_IndexOperation ==
APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
{
/********************************/
/* Test the auto mode parameter */
/********************************/
if (b_AutoMode == APCI1710_ENABLE ||
b_AutoMode == APCI1710_DISABLE)
{
/***************************/
/* Test the interrupt mode */
/***************************/
if (b_InterruptEnable ==
APCI1710_ENABLE
|| b_InterruptEnable ==
APCI1710_DISABLE) {
/************************************/
/* Makte the configuration commando */
/************************************/
if (b_ReferenceAction ==
APCI1710_ENABLE)
{
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
|
APCI1710_ENABLE_INDEX_ACTION;
} else {
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
&
APCI1710_DISABLE_INDEX_ACTION;
}
/****************************************/
/* Test if low level latch or/and clear */
/****************************************/
if (b_IndexOperation ==
APCI1710_LOW_EDGE_LATCH_COUNTER
||
b_IndexOperation
==
APCI1710_LOW_EDGE_CLEAR_COUNTER
||
b_IndexOperation
==
APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
{
/*************************************/
/* Set the index level to low (DQ26) */
/*************************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
|
APCI1710_SET_LOW_INDEX_LEVEL;
} else {
/**************************************/
/* Set the index level to high (DQ26) */
/**************************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
&
APCI1710_SET_HIGH_INDEX_LEVEL;
}
/***********************************/
/* Test if latch and clear counter */
/***********************************/
if (b_IndexOperation ==
APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER
||
b_IndexOperation
==
APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER)
{
/***************************************/
/* Set the latch and clear flag (DQ27) */
/***************************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
|
APCI1710_ENABLE_LATCH_AND_CLEAR;
} /* if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) */
else {
/*****************************************/
/* Clear the latch and clear flag (DQ27) */
/*****************************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
&
APCI1710_DISABLE_LATCH_AND_CLEAR;
/*************************/
/* Test if latch counter */
/*************************/
if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_COUNTER) {
/*********************************/
/* Enable the latch from counter */
/*********************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
|
APCI1710_INDEX_LATCH_COUNTER;
} else {
/*********************************/
/* Enable the clear from counter */
/*********************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
&
(~APCI1710_INDEX_LATCH_COUNTER);
}
} /* // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) */
if (b_AutoMode ==
APCI1710_DISABLE)
{
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
|
APCI1710_INDEX_AUTO_MODE;
} else {
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2
&
(~APCI1710_INDEX_AUTO_MODE);
}
if (b_InterruptEnable ==
APCI1710_ENABLE)
{
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3
|
APCI1710_ENABLE_INDEX_INT;
} else {
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3
&
APCI1710_DISABLE_INDEX_INT;
}
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.
b_IndexInit = 1;
} else {
/********************************/
/* Interrupt parameter is wrong */
/********************************/
DPRINTK("Interrupt parameter is wrong\n");
i_ReturnValue = -7;
}
} else {
/************************************/
/* The auto mode parameter is wrong */
/************************************/
DPRINTK("The auto mode parameter is wrong\n");
i_ReturnValue = -6;
}
} else {
/***********************************************/
/* The index operating mode parameter is wrong */
/***********************************************/
DPRINTK("The index operating mode parameter is wrong\n");
i_ReturnValue = -5;
}
} else {
/*******************************************/
/* The reference action parameter is wrong */
/*******************************************/
DPRINTK("The reference action parameter is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_InitReference |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_ReferenceLevel) |
+----------------------------------------------------------------------------+
| Task : Initialise the reference corresponding to the selected |
| module (b_ModulNbr). |
| |
| Reference level |
| --------------- |
| +--------------------+-------------------------+ |
| | b_ReferenceLevel | Operation | |
| +--------------------+-------------------------+ |
| | APCI1710_LOW | Reference occur if "0" | |
| |--------------------|-------------------------| |
| | APCI1710_HIGH | Reference occur if "1" | |
| +--------------------+-------------------------+ |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_ReferenceLevel : Reference level. |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number parameter is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Reference level parameter is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InitReference(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_ReferenceLevel)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/**************************************/
/* Test the reference level parameter */
/**************************************/
if (b_ReferenceLevel == 0 || b_ReferenceLevel == 1) {
if (b_ReferenceLevel == 1) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 |
APCI1710_REFERENCE_HIGH;
} else {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 &
APCI1710_REFERENCE_LOW;
}
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.ui_Address + 20 +
(64 * b_ModulNbr));
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_ReferenceInit = 1;
} else {
/**************************************/
/* Reference level parameter is wrong */
/**************************************/
DPRINTK("Reference level parameter is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_InitExternalStrobe |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_ExternalStrobe, |
| unsigned char_ b_ExternalStrobeLevel) |
+----------------------------------------------------------------------------+
| Task : Initialises the external strobe level corresponding to |
| the selected module (b_ModulNbr). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_ExternalStrobe : External strobe selection |
| 0 : External strobe A |
| 1 : External strobe B |
| unsigned char_ b_ExternalStrobeLevel : External strobe level |
| APCI1710_LOW : |
| External latch occurs if "0" |
| APCI1710_HIGH : |
| External latch occurs if "1" |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: Counter not initialised. |
| See function "i_APCI1710_InitCounter" |
| -4: External strobe selection is wrong |
| -5: External strobe level parameter is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InitExternalStrobe(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_ExternalStrobe, unsigned char b_ExternalStrobeLevel)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/**************************************/
/* Test the external strobe selection */
/**************************************/
if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) {
/******************/
/* Test the level */
/******************/
if ((b_ExternalStrobeLevel == APCI1710_HIGH) ||
((b_ExternalStrobeLevel == APCI1710_LOW
&& (devpriv->
s_BoardInfos.
dw_MolduleConfiguration
[b_ModulNbr] &
0xFFFF) >=
0x3135))) {
/*****************/
/* Set the level */
/*****************/
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4 = (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4 & (0xFF -
(0x10 << b_ExternalStrobe))) | ((b_ExternalStrobeLevel ^ 1) << (4 + b_ExternalStrobe));
} else {
/********************************************/
/* External strobe level parameter is wrong */
/********************************************/
DPRINTK("External strobe level parameter is wrong\n");
i_ReturnValue = -5;
}
} /* if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) */
else {
/**************************************/
/* External strobe selection is wrong */
/**************************************/
DPRINTK("External strobe selection is wrong\n");
i_ReturnValue = -4;
} /* if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) */
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_InitCompareLogic |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned int_ ui_CompareValue) |
+----------------------------------------------------------------------------+
| Task : Set the 32-Bit compare value. At that moment that the |
| incremental counter arrive to the compare value |
| (ui_CompareValue) a interrupt is generated. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned int_ ui_CompareValue : 32-Bit compare value |
+----------------------------------------------------------------------------+
| Output Parameters : -
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InitCompareLogic(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned int ui_CompareValue)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
outl(ui_CompareValue, devpriv->s_BoardInfos.
ui_Address + 28 + (64 * b_ModulNbr));
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_CompareLogicInit = 1;
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_InitFrequencyMeasurement |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_PCIInputClock, |
| unsigned char_ b_TimingUnity, |
| ULONG_ ul_TimingInterval, |
| PULONG_ pul_RealTimingInterval) |
+----------------------------------------------------------------------------+
| Task : Sets the time for the frequency measurement. |
| Configures the selected TOR incremental counter of the |
| selected module (b_ModulNbr). The ul_TimingInterval and|
| ul_TimingUnity determine the time base for the |
| measurement. The pul_RealTimingInterval returns the |
| real time value. You must call up this function before |
| you call up any other function which gives access to |
| the frequency measurement. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Number of the module to be |
| configured (0 to 3) |
| unsigned char_ b_PCIInputClock : Selection of the PCI bus |
| clock |
| - APCI1710_30MHZ : |
| The PC has a PCI bus clock |
| of 30 MHz |
| - APCI1710_33MHZ : |
| The PC has a PCI bus clock |
| of 33 MHz |
| unsigned char_ b_TimingUnity : Base time unit (0 to 2) |
| 0 : ns |
| 1 : æs |
| 2 : ms |
| ULONG_ ul_TimingInterval: Base time value. |
+----------------------------------------------------------------------------+
| Output Parameters : PULONG_ pul_RealTimingInterval : Real base time value. |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: The selected PCI input clock is wrong |
| -5: Timing unity selection is wrong |
| -6: Base timing selection is wrong |
| -7: 40MHz quartz not on board |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InitFrequencyMeasurement(struct comedi_device *dev,
unsigned char b_ModulNbr,
unsigned char b_PCIInputClock,
unsigned char b_TimingUnity,
unsigned int ul_TimingInterval, unsigned int *pul_RealTimingInterval)
{
int i_ReturnValue = 0;
unsigned int ul_TimerValue = 0;
double d_RealTimingInterval;
unsigned int dw_Status = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/**************************/
/* Test the PCI bus clock */
/**************************/
if ((b_PCIInputClock == APCI1710_30MHZ) ||
(b_PCIInputClock == APCI1710_33MHZ) ||
(b_PCIInputClock == APCI1710_40MHZ)) {
/************************/
/* Test the timing unit */
/************************/
if (b_TimingUnity <= 2) {
/**********************************/
/* Test the base timing selection */
/**********************************/
if (((b_PCIInputClock == APCI1710_30MHZ)
&& (b_TimingUnity == 0)
&& (ul_TimingInterval >=
266)
&& (ul_TimingInterval <=
8738133UL))
|| ((b_PCIInputClock ==
APCI1710_30MHZ)
&& (b_TimingUnity == 1)
&& (ul_TimingInterval >=
1)
&& (ul_TimingInterval <=
8738UL))
|| ((b_PCIInputClock ==
APCI1710_30MHZ)
&& (b_TimingUnity == 2)
&& (ul_TimingInterval >=
1)
&& (ul_TimingInterval <=
8UL))
|| ((b_PCIInputClock ==
APCI1710_33MHZ)
&& (b_TimingUnity == 0)
&& (ul_TimingInterval >=
242)
&& (ul_TimingInterval <=
7943757UL))
|| ((b_PCIInputClock ==
APCI1710_33MHZ)
&& (b_TimingUnity == 1)
&& (ul_TimingInterval >=
1)
&& (ul_TimingInterval <=
7943UL))
|| ((b_PCIInputClock ==
APCI1710_33MHZ)
&& (b_TimingUnity == 2)
&& (ul_TimingInterval >=
1)
&& (ul_TimingInterval <=
7UL))
|| ((b_PCIInputClock ==
APCI1710_40MHZ)
&& (b_TimingUnity == 0)
&& (ul_TimingInterval >=
200)
&& (ul_TimingInterval <=
6553500UL))
|| ((b_PCIInputClock ==
APCI1710_40MHZ)
&& (b_TimingUnity == 1)
&& (ul_TimingInterval >=
1)
&& (ul_TimingInterval <=
6553UL))
|| ((b_PCIInputClock ==
APCI1710_40MHZ)
&& (b_TimingUnity == 2)
&& (ul_TimingInterval >=
1)
&& (ul_TimingInterval <=
6UL))) {
/**********************/
/* Test if 40MHz used */
/**********************/
if (b_PCIInputClock ==
APCI1710_40MHZ) {
/******************************/
/* Test if firmware >= Rev1.5 */
/******************************/
if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3135) {
/*********************************/
/* Test if 40MHz quartz on board */
/*********************************/
/*INPDW (ps_APCI1710Variable->
s_Board [b_BoardHandle].
s_BoardInfos.
ui_Address + 36 + (64 * b_ModulNbr), &dw_Status); */
dw_Status =
inl
(devpriv->
s_BoardInfos.
ui_Address
+ 36 +
(64 * b_ModulNbr));
/******************************/
/* Test the quartz flag (DQ0) */
/******************************/
if ((dw_Status & 1) != 1) {
/*****************************/
/* 40MHz quartz not on board */
/*****************************/
DPRINTK("40MHz quartz not on board\n");
i_ReturnValue
=
-7;
}
} else {
/*****************************/
/* 40MHz quartz not on board */
/*****************************/
DPRINTK("40MHz quartz not on board\n");
i_ReturnValue =
-7;
}
} /* if (b_PCIInputClock == APCI1710_40MHZ) */
/***************************/
/* Test if not error occur */
/***************************/
if (i_ReturnValue == 0) {
/****************************/
/* Test the INC_CPT version */
/****************************/
if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131) {
/**********************/
/* Test if 40MHz used */
/**********************/
if (b_PCIInputClock == APCI1710_40MHZ) {
/*********************************/
/* Enable the 40MHz quarz (DQ30) */
/*********************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
|
APCI1710_ENABLE_40MHZ_FREQUENCY;
} /* if (b_PCIInputClock == APCI1710_40MHZ) */
else {
/**********************************/
/* Disable the 40MHz quarz (DQ30) */
/**********************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
&
APCI1710_DISABLE_40MHZ_FREQUENCY;
} /* if (b_PCIInputClock == APCI1710_40MHZ) */
/********************************/
/* Calculate the division fator */
/********************************/
fpu_begin();
switch (b_TimingUnity) {
/******/
/* ns */
/******/
case 0:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
(unsigned int)
(ul_TimingInterval
*
(0.00025 * b_PCIInputClock));
/*******************/
/* Round the value */
/*******************/
if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
*pul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(0.00025 * (double)b_PCIInputClock));
d_RealTimingInterval
=
(double)
ul_TimerValue
/
(0.00025
*
(double)
b_PCIInputClock);
if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
*pul_RealTimingInterval
=
*pul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
break;
/******/
/* æs */
/******/
case 1:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
(unsigned int)
(ul_TimingInterval
*
(0.25 * b_PCIInputClock));
/*******************/
/* Round the value */
/*******************/
if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
*pul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(0.25 * (double)b_PCIInputClock));
d_RealTimingInterval
=
(double)
ul_TimerValue
/
(
(double)
0.25
*
(double)
b_PCIInputClock);
if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
*pul_RealTimingInterval
=
*pul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
break;
/******/
/* ms */
/******/
case 2:
/******************/
/* Timer 0 factor */
/******************/
ul_TimerValue
=
ul_TimingInterval
*
(250.0
*
b_PCIInputClock);
/*******************/
/* Round the value */
/*******************/
if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
ul_TimerValue
=
ul_TimerValue
+
1;
}
/*****************************/
/* Calculate the real timing */
/*****************************/
*pul_RealTimingInterval
=
(unsigned int)
(ul_TimerValue
/
(250.0 * (double)b_PCIInputClock));
d_RealTimingInterval
=
(double)
ul_TimerValue
/
(250.0
*
(double)
b_PCIInputClock);
if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) {
*pul_RealTimingInterval
=
*pul_RealTimingInterval
+
1;
}
ul_TimingInterval
=
ul_TimingInterval
-
1;
ul_TimerValue
=
ul_TimerValue
-
2;
break;
}
fpu_end();
/*************************/
/* Write the timer value */
/*************************/
outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 32 + (64 * b_ModulNbr));
/*******************************/
/* Set the initialisation flag */
/*******************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.
b_FrequencyMeasurementInit
= 1;
} else {
/***************************/
/* Counter not initialised */
/***************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue =
-3;
}
} /* if (i_ReturnValue == 0) */
} else {
/**********************************/
/* Base timing selection is wrong */
/**********************************/
DPRINTK("Base timing selection is wrong\n");
i_ReturnValue = -6;
}
} else {
/***********************************/
/* Timing unity selection is wrong */
/***********************************/
DPRINTK("Timing unity selection is wrong\n");
i_ReturnValue = -5;
}
} else {
/*****************************************/
/* The selected PCI input clock is wrong */
/*****************************************/
DPRINTK("The selected PCI input clock is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*########################################################################### */
/* INSN BITS */
/*########################################################################### */
/*
+----------------------------------------------------------------------------+
| Function Name :INT i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
struct comedi_insn *insn,unsigned int *data) |
+----------------------------------------------------------------------------+
| Task : Set & Clear Functions for INC_CPT |
+----------------------------------------------------------------------------+
| Input Parameters :
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value :
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
unsigned int ui_BitsType;
int i_ReturnValue = 0;
ui_BitsType = CR_CHAN(insn->chanspec);
devpriv->tsk_Current = current; /* Save the current process task structure */
switch (ui_BitsType) {
case APCI1710_INCCPT_CLEARCOUNTERVALUE:
i_ReturnValue = i_APCI1710_ClearCounterValue(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_CLEARALLCOUNTERVALUE:
i_ReturnValue = i_APCI1710_ClearAllCounterValue(dev);
break;
case APCI1710_INCCPT_SETINPUTFILTER:
i_ReturnValue = i_APCI1710_SetInputFilter(dev,
(unsigned char) CR_AREF(insn->chanspec),
(unsigned char) data[0], (unsigned char) data[1]);
break;
case APCI1710_INCCPT_LATCHCOUNTER:
i_ReturnValue = i_APCI1710_LatchCounter(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
break;
case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE:
i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
break;
case APCI1710_INCCPT_SETDIGITALCHLON:
i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_SETDIGITALCHLOFF:
i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
default:
printk("Bits Config Parameter Wrong\n");
}
if (i_ReturnValue >= 0)
i_ReturnValue = insn->n;
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_ClearCounterValue |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Clear the counter value from selected module |
| (b_ModulNbr). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number parameter is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_ClearCounterValue(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*********************/
/* Clear the counter */
/*********************/
outl(1, devpriv->s_BoardInfos.
ui_Address + 16 + (64 * b_ModulNbr));
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_ClearAllCounterValue |
| (unsigned char_ b_BoardHandle) |
+----------------------------------------------------------------------------+
| Task : Clear all counter value. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_ClearAllCounterValue(struct comedi_device *dev)
{
unsigned char b_ModulCpt = 0;
int i_ReturnValue = 0;
/********************************/
/* Test if counter module found */
/********************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[0] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER
|| (devpriv->s_BoardInfos.
dw_MolduleConfiguration[1] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER
|| (devpriv->s_BoardInfos.
dw_MolduleConfiguration[2] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER
|| (devpriv->s_BoardInfos.
dw_MolduleConfiguration[3] & 0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER) {
for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) {
/*******************************/
/* Test if incremental counter */
/*******************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulCpt] &
0xFFFF0000UL) ==
APCI1710_INCREMENTAL_COUNTER) {
/*********************/
/* Clear the counter */
/*********************/
outl(1, devpriv->s_BoardInfos.
ui_Address + 16 + (64 * b_ModulCpt));
}
}
} else {
/***************************/
/* No counter module found */
/***************************/
DPRINTK("No counter module found\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_SetInputFilter |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_Module, |
| unsigned char_ b_PCIInputClock, |
| unsigned char_ b_Filter) |
+----------------------------------------------------------------------------+
| Task : Disable or enable the software filter from selected |
| module (b_ModulNbr). b_Filter determine the filter time|
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Number of the module to be |
| configured (0 to 3) |
| unsigned char_ b_PCIInputClock : Selection of the PCI bus |
| clock |
| - APCI1710_30MHZ : |
| The PC has a PCI bus clock |
| of 30 MHz |
| - APCI1710_33MHZ : |
| The PC has a PCI bus clock |
| of 33 MHz |
| - APCI1710_40MHZ : |
| The APCI1710 has a 40MHz |
| quartz |
| unsigned char_ b_Filter : Filter selection |
| |
| 30 MHz |
| ------ |
| 0: Software filter not used |
| 1: Filter from 266ns (3.750000MHz) |
| 2: Filter from 400ns (2.500000MHz) |
| 3: Filter from 533ns (1.876170MHz) |
| 4: Filter from 666ns (1.501501MHz) |
| 5: Filter from 800ns (1.250000MHz) |
| 6: Filter from 933ns (1.071800MHz) |
| 7: Filter from 1066ns (0.938080MHz) |
| 8: Filter from 1200ns (0.833333MHz) |
| 9: Filter from 1333ns (0.750000MHz) |
| 10: Filter from 1466ns (0.682100MHz) |
| 11: Filter from 1600ns (0.625000MHz) |
| 12: Filter from 1733ns (0.577777MHz) |
| 13: Filter from 1866ns (0.535900MHz) |
| 14: Filter from 2000ns (0.500000MHz) |
| 15: Filter from 2133ns (0.468800MHz) |
| |
| 33 MHz |
| ------ |
| 0: Software filter not used |
| 1: Filter from 242ns (4.125000MHz) |
| 2: Filter from 363ns (2.754820MHz) |
| 3: Filter from 484ns (2.066115MHz) |
| 4: Filter from 605ns (1.652892MHz) |
| 5: Filter from 726ns (1.357741MHz) |
| 6: Filter from 847ns (1.180637MHz) |
| 7: Filter from 968ns (1.033055MHz) |
| 8: Filter from 1089ns (0.918273MHz) |
| 9: Filter from 1210ns (0.826446MHz) |
| 10: Filter from 1331ns (0.751314MHz) |
| 11: Filter from 1452ns (0.688705MHz) |
| 12: Filter from 1573ns (0.635727MHz) |
| 13: Filter from 1694ns (0.590318MHz) |
| 14: Filter from 1815ns (0.550964MHz) |
| 15: Filter from 1936ns (0.516528MHz) |
| |
| 40 MHz |
| ------ |
| 0: Software filter not used |
| 1: Filter from 200ns (5.000000MHz) |
| 2: Filter from 300ns (3.333333MHz) |
| 3: Filter from 400ns (2.500000MHz) |
| 4: Filter from 500ns (2.000000MHz) |
| 5: Filter from 600ns (1.666666MHz) |
| 6: Filter from 700ns (1.428500MHz) |
| 7: Filter from 800ns (1.250000MHz) |
| 8: Filter from 900ns (1.111111MHz) |
| 9: Filter from 1000ns (1.000000MHz) |
| 10: Filter from 1100ns (0.909090MHz) |
| 11: Filter from 1200ns (0.833333MHz) |
| 12: Filter from 1300ns (0.769200MHz) |
| 13: Filter from 1400ns (0.714200MHz) |
| 14: Filter from 1500ns (0.666666MHz) |
| 15: Filter from 1600ns (0.625000MHz) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: The module is not a counter module |
| -4: The selected PCI input clock is wrong |
| -5: The selected filter value is wrong |
| -6: 40MHz quartz not on board |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_SetInputFilter(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_PCIInputClock, unsigned char b_Filter)
{
int i_ReturnValue = 0;
unsigned int dw_Status = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if incremental counter */
/*******************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
/******************************/
/* Test if firmware >= Rev1.5 */
/******************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF) >= 0x3135) {
/**************************/
/* Test the PCI bus clock */
/**************************/
if ((b_PCIInputClock == APCI1710_30MHZ) ||
(b_PCIInputClock == APCI1710_33MHZ) ||
(b_PCIInputClock == APCI1710_40MHZ)) {
/*************************/
/* Test the filter value */
/*************************/
if (b_Filter < 16) {
/**********************/
/* Test if 40MHz used */
/**********************/
if (b_PCIInputClock ==
APCI1710_40MHZ) {
/*********************************/
/* Test if 40MHz quartz on board */
/*********************************/
dw_Status =
inl(devpriv->
s_BoardInfos.
ui_Address +
36 +
(64 * b_ModulNbr));
/******************************/
/* Test the quartz flag (DQ0) */
/******************************/
if ((dw_Status & 1) !=
1) {
/*****************************/
/* 40MHz quartz not on board */
/*****************************/
DPRINTK("40MHz quartz not on board\n");
i_ReturnValue =
-6;
}
} /* if (b_PCIInputClock == APCI1710_40MHZ) */
/***************************/
/* Test if error not occur */
/***************************/
if (i_ReturnValue == 0) {
/**********************/
/* Test if 40MHz used */
/**********************/
if (b_PCIInputClock ==
APCI1710_40MHZ)
{
/*********************************/
/* Enable the 40MHz quarz (DQ31) */
/*********************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
|
APCI1710_ENABLE_40MHZ_FILTER;
} /* if (b_PCIInputClock == APCI1710_40MHZ) */
else {
/**********************************/
/* Disable the 40MHz quarz (DQ31) */
/**********************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
&
APCI1710_DISABLE_40MHZ_FILTER;
} /* if (b_PCIInputClock == APCI1710_40MHZ) */
/************************/
/* Set the filter value */
/************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3
=
(devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3
& 0x1F) |
((b_Filter &
0x7) <<
5);
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
=
(devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4
& 0xFE) |
((b_Filter &
0x8) >>
3);
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->
s_BoardInfos.
ui_Address +
20 +
(64 * b_ModulNbr));
} /* if (i_ReturnValue == 0) */
} /* if (b_Filter < 16) */
else {
/**************************************/
/* The selected filter value is wrong */
/**************************************/
DPRINTK("The selected filter value is wrong\n");
i_ReturnValue = -5;
} /* if (b_Filter < 16) */
} /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) */
else {
/*****************************************/
/* The selected PCI input clock is wrong */
/*****************************************/
DPRINTK("The selected PCI input clock is wrong\n");
i_ReturnValue = 4;
} /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) */
} else {
/**************************************/
/* The module is not a counter module */
/**************************************/
DPRINTK("The module is not a counter module\n");
i_ReturnValue = -3;
}
} else {
/**************************************/
/* The module is not a counter module */
/**************************************/
DPRINTK("The module is not a counter module\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_LatchCounter (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_LatchReg) |
+----------------------------------------------------------------------------+
| Task : Latch the courant value from selected module |
| (b_ModulNbr) in to the selected latch register |
| (b_LatchReg). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_LatchReg : Selected latch register |
| 0 : for the first latch register |
| 1 : for the second latch register |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: The selected latch register parameter is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_LatchCounter(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_LatchReg)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*************************************/
/* Test the latch register parameter */
/*************************************/
if (b_LatchReg < 2) {
/*********************/
/* Tatch the counter */
/*********************/
outl(1 << (b_LatchReg * 4),
devpriv->s_BoardInfos.ui_Address +
(64 * b_ModulNbr));
} else {
/**************************************************/
/* The selected latch register parameter is wrong */
/**************************************************/
DPRINTK("The selected latch register parameter is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_SetIndexAndReferenceSource |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_SourceSelection) |
+----------------------------------------------------------------------------+
| Task : Determine the hardware source for the index and the |
| reference logic. Per default the index logic is |
| connected to the difference input C and the reference |
| logic is connected to the 24V input E |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_SourceSelection : APCI1710_SOURCE_0 : |
| The index logic is connected |
| to the difference input C and|
| the reference logic is |
| connected to the 24V input E.|
| This is the default |
| configuration. |
| APCI1710_SOURCE_1 : |
| The reference logic is |
| connected to the difference |
| input C and the index logic |
| is connected to the 24V |
| input E |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: The module is not a counter module. |
| -4: The source selection is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_SetIndexAndReferenceSource(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_SourceSelection)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if incremental counter */
/*******************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
/******************************/
/* Test if firmware >= Rev1.5 */
/******************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration[b_ModulNbr] &
0xFFFF) >= 0x3135) {
/*****************************/
/* Test the source selection */
/*****************************/
if (b_SourceSelection == APCI1710_SOURCE_0 ||
b_SourceSelection == APCI1710_SOURCE_1)
{
/******************************************/
/* Test if invert the index and reference */
/******************************************/
if (b_SourceSelection ==
APCI1710_SOURCE_1) {
/********************************************/
/* Invert index and reference source (DQ25) */
/********************************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4 =
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4 |
APCI1710_INVERT_INDEX_RFERENCE;
} else {
/****************************************/
/* Set the default configuration (DQ25) */
/****************************************/
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4 =
devpriv->
s_ModuleInfo
[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister4 &
APCI1710_DEFAULT_INDEX_RFERENCE;
}
} /* if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) */
else {
/*********************************/
/* The source selection is wrong */
/*********************************/
DPRINTK("The source selection is wrong\n");
i_ReturnValue = -4;
} /* if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) */
} else {
/**************************************/
/* The module is not a counter module */
/**************************************/
DPRINTK("The module is not a counter module\n");
i_ReturnValue = -3;
}
} else {
/**************************************/
/* The module is not a counter module */
/**************************************/
DPRINTK("The module is not a counter module\n");
i_ReturnValue = -3;
}
} else {
/***************************************/
/* The selected module number is wrong */
/***************************************/
DPRINTK("The selected module number is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_SetDigitalChlOn |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Sets the digital output H Setting an output means |
| setting an ouput high. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Number of the module to be |
| configured (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_SetDigitalChlOn(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.b_ModeRegister3 | 0x10;
/*********************/
/* Set the output On */
/*********************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
ui_Address + 20 + (64 * b_ModulNbr));
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_SetDigitalChlOff |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Resets the digital output H. Resetting an output means |
| setting an ouput low. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Number of the module to be |
| configured (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_SetDigitalChlOff(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.b_ModeRegister3 & 0xEF;
/**********************/
/* Set the output Off */
/**********************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
ui_Address + 20 + (64 * b_ModulNbr));
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*########################################################################### */
/* INSN WRITE */
/*########################################################################### */
/*
+----------------------------------------------------------------------------+
| Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
struct comedi_insn *insn,unsigned int *data) |
+----------------------------------------------------------------------------+
| Task : Enable Disable functions for INC_CPT |
+----------------------------------------------------------------------------+
| Input Parameters :
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value :
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
unsigned int ui_WriteType;
int i_ReturnValue = 0;
ui_WriteType = CR_CHAN(insn->chanspec);
devpriv->tsk_Current = current; /* Save the current process task structure */
switch (ui_WriteType) {
case APCI1710_INCCPT_ENABLELATCHINTERRUPT:
i_ReturnValue = i_APCI1710_EnableLatchInterrupt(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_DISABLELATCHINTERRUPT:
i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE:
i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev,
(unsigned char) CR_AREF(insn->chanspec),
(unsigned char) data[0], (unsigned int) data[1]);
break;
case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE:
i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned int) data[0]);
break;
case APCI1710_INCCPT_ENABLEINDEX:
i_APCI1710_EnableIndex(dev, (unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_DISABLEINDEX:
i_ReturnValue = i_APCI1710_DisableIndex(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_ENABLECOMPARELOGIC:
i_ReturnValue = i_APCI1710_EnableCompareLogic(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_DISABLECOMPARELOGIC:
i_ReturnValue = i_APCI1710_DisableCompareLogic(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT:
i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]);
break;
case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT:
i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev,
(unsigned char) CR_AREF(insn->chanspec));
break;
default:
printk("Write Config Parameter Wrong\n");
}
if (i_ReturnValue >= 0)
i_ReturnValue = insn->n;
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_EnableLatchInterrupt |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Enable the latch interrupt from selected module |
| (b_ModulNbr). Each software or hardware latch occur a |
| interrupt. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Interrupt routine not installed see function |
| "i_APCI1710_SetBoardIntRoutine" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_EnableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/********************/
/* Enable interrupt */
/********************/
devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 | APCI1710_ENABLE_LATCH_INT;
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos.
ui_Address + 20 + (64 * b_ModulNbr));
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_DisableLatchInterrupt |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Disable the latch interrupt from selected module |
| (b_ModulNbr). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Interrupt routine not installed see function |
| "i_APCI1710_SetBoardIntRoutine" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_DisableLatchInterrupt(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4 &
((APCI1710_DISABLE_LATCH_INT << 8) | 0xFF),
devpriv->s_BoardInfos.ui_Address + 20 +
(64 * b_ModulNbr));
mdelay(1000);
/*********************/
/* Disable interrupt */
/*********************/
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 & APCI1710_DISABLE_LATCH_INT;
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_Write16BitCounterValue |
| (unsigned char_ b_BoardHandle |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_SelectedCounter, |
| unsigned int_ ui_WriteValue) |
+----------------------------------------------------------------------------+
| Task : Write a 16-Bit value (ui_WriteValue) in to the selected|
| 16-Bit counter (b_SelectedCounter) from selected module|
| (b_ModulNbr). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_SelectedCounter : Selected 16-Bit counter |
| (0 or 1) |
| unsigned int_ ui_WriteValue : 16-Bit write value |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: The selected 16-Bit counter parameter is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_Write16BitCounterValue(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int ui_WriteValue)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/******************************/
/* Test the counter selection */
/******************************/
if (b_SelectedCounter < 2) {
/*******************/
/* Write the value */
/*******************/
outl((unsigned int) ((unsigned int) (ui_WriteValue) << (16 *
b_SelectedCounter)),
devpriv->s_BoardInfos.ui_Address + 8 +
(b_SelectedCounter * 4) +
(64 * b_ModulNbr));
} else {
/**************************************************/
/* The selected 16-Bit counter parameter is wrong */
/**************************************************/
DPRINTK("The selected 16-Bit counter parameter is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_Write32BitCounterValue |
| (unsigned char_ b_BoardHandle |
| unsigned char_ b_ModulNbr, |
| ULONG_ ul_WriteValue) |
+----------------------------------------------------------------------------+
| Task : Write a 32-Bit value (ui_WriteValue) in to the selected|
| module (b_ModulNbr). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| ULONG_ ul_WriteValue : 32-Bit write value |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_Write32BitCounterValue(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned int ul_WriteValue)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*******************/
/* Write the value */
/*******************/
outl(ul_WriteValue, devpriv->s_BoardInfos.
ui_Address + 4 + (64 * b_ModulNbr));
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_EnableIndex (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Enable the INDEX actions |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Index not initialised see function |
| "i_APCI1710_InitIndex" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_EnableIndex(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
unsigned int ul_InterruptLatchReg;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*****************************/
/* Test if index initialised */
/*****************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 | APCI1710_ENABLE_INDEX;
ul_InterruptLatchReg =
inl(devpriv->s_BoardInfos.ui_Address +
24 + (64 * b_ModulNbr));
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.ui_Address + 20 +
(64 * b_ModulNbr));
} else {
/*************************************************************/
/* Index not initialised see function "i_APCI1710_InitIndex" */
/*************************************************************/
DPRINTK("Index not initialised \n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_DisableIndex (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Disable the INDEX actions |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Index not initialised see function |
| "i_APCI1710_InitIndex" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_DisableIndex(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*****************************/
/* Test if index initialised */
/*****************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister2 &
APCI1710_DISABLE_INDEX;
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.ui_Address + 20 +
(64 * b_ModulNbr));
} else {
/*************************************************************/
/* Index not initialised see function "i_APCI1710_InitIndex" */
/*************************************************************/
DPRINTK("Index not initialised \n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_EnableCompareLogic |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Enable the 32-Bit compare logic. At that moment that |
| the incremental counter arrive to the compare value a |
| interrupt is generated. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : -
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Compare logic not initialised. |
| See function "i_APCI1710_InitCompareLogic" |
| -5: Interrupt function not initialised. |
| See function "i_APCI1710_SetBoardIntRoutineX" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_EnableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*************************************/
/* Test if compare logic initialised */
/*************************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_CompareLogicInit == 1) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 |
APCI1710_ENABLE_COMPARE_INT;
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.ui_Address + 20 +
(64 * b_ModulNbr));
} else {
/*********************************/
/* Compare logic not initialised */
/*********************************/
DPRINTK("Compare logic not initialised\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_DisableCompareLogic |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Disable the 32-Bit compare logic.
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : -
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Compare logic not initialised. |
| See function "i_APCI1710_InitCompareLogic" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_DisableCompareLogic(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*************************************/
/* Test if compare logic initialised */
/*************************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_CompareLogicInit == 1) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 &
APCI1710_DISABLE_COMPARE_INT;
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.ui_Address + 20 +
(64 * b_ModulNbr));
} else {
/*********************************/
/* Compare logic not initialised */
/*********************************/
DPRINTK("Compare logic not initialised\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_EnableFrequencyMeasurement |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_InterruptEnable) |
+----------------------------------------------------------------------------+
| Task : Enables the frequency measurement function |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Number of the module to be |
| configured (0 to 3) |
| unsigned char_ b_InterruptEnable: Enable or disable the |
| interrupt. |
| APCI1710_ENABLE: |
| Enable the interrupt |
| APCI1710_DISABLE: |
| Disable the interrupt |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Frequency measurement logic not initialised. |
| See function "i_APCI1710_InitFrequencyMeasurement" |
| -5: Interrupt parameter is wrong |
| -6: Interrupt function not initialised. |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_EnableFrequencyMeasurement(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_InterruptEnable)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/********************************************/
/* Test if frequency measurement initialised */
/********************************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_FrequencyMeasurementInit == 1) {
/***************************/
/* Test the interrupt mode */
/***************************/
if ((b_InterruptEnable == APCI1710_DISABLE) ||
(b_InterruptEnable == APCI1710_ENABLE))
{
/************************************/
/* Enable the frequency measurement */
/************************************/
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 |
APCI1710_ENABLE_FREQUENCY;
/*********************************************/
/* Disable or enable the frequency interrupt */
/*********************************************/
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 = (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 &
APCI1710_DISABLE_FREQUENCY_INT)
| (b_InterruptEnable << 3);
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.
ui_Address + 20 +
(64 * b_ModulNbr));
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.
b_FrequencyMeasurementEnable =
1;
} else {
/********************************/
/* Interrupt parameter is wrong */
/********************************/
DPRINTK("Interrupt parameter is wrong\n");
i_ReturnValue = -5;
}
} else {
/***********************************************/
/* Frequency measurement logic not initialised */
/***********************************************/
DPRINTK("Frequency measurement logic not initialised\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_DisableFrequencyMeasurement |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr) |
+----------------------------------------------------------------------------+
| Task : Disables the frequency measurement function |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Number of the module to be |
| configured (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Frequency measurement logic not initialised. |
| See function "i_APCI1710_InitFrequencyMeasurement" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_DisableFrequencyMeasurement(struct comedi_device *dev, unsigned char b_ModulNbr)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/********************************************/
/* Test if frequency measurement initialised */
/********************************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_FrequencyMeasurementInit == 1) {
/*************************************/
/* Disable the frequency measurement */
/*************************************/
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 = devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister3 &
APCI1710_DISABLE_FREQUENCY
/* Begin CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared */
& APCI1710_DISABLE_FREQUENCY_INT;
/* End CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared */
/***************************/
/* Write the configuration */
/***************************/
outl(devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
dw_ModeRegister1_2_3_4,
devpriv->s_BoardInfos.ui_Address + 20 +
(64 * b_ModulNbr));
/*************************************/
/* Disable the frequency measurement */
/*************************************/
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.
b_FrequencyMeasurementEnable = 0;
} else {
/***********************************************/
/* Frequency measurement logic not initialised */
/***********************************************/
DPRINTK("Frequency measurement logic not initialised\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*########################################################################### */
/* INSN READ */
/*########################################################################### */
/*
+----------------------------------------------------------------------------+
| Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s,
struct comedi_insn *insn,unsigned int *data) |
+----------------------------------------------------------------------------+
| Task : Read and Get functions for INC_CPT |
+----------------------------------------------------------------------------+
| Input Parameters :
+----------------------------------------------------------------------------+
| Output Parameters : - |
+----------------------------------------------------------------------------+
| Return Value :
+----------------------------------------------------------------------------+
*/
int i_APCI1710_InsnReadINCCPT(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
unsigned int ui_ReadType;
int i_ReturnValue = 0;
ui_ReadType = CR_CHAN(insn->chanspec);
devpriv->tsk_Current = current; /* Save the current process task structure */
switch (ui_ReadType) {
case APCI1710_INCCPT_READLATCHREGISTERSTATUS:
i_ReturnValue = i_APCI1710_ReadLatchRegisterStatus(dev,
(unsigned char) CR_AREF(insn->chanspec),
(unsigned char) CR_RANGE(insn->chanspec), (unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_READLATCHREGISTERVALUE:
i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev,
(unsigned char) CR_AREF(insn->chanspec),
(unsigned char) CR_RANGE(insn->chanspec), (unsigned int *) &data[0]);
printk("Latch Register Value %d\n", data[0]);
break;
case APCI1710_INCCPT_READ16BITCOUNTERVALUE:
i_ReturnValue = i_APCI1710_Read16BitCounterValue(dev,
(unsigned char) CR_AREF(insn->chanspec),
(unsigned char) CR_RANGE(insn->chanspec), (unsigned int *) &data[0]);
break;
case APCI1710_INCCPT_READ32BITCOUNTERVALUE:
i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned int *) &data[0]);
break;
case APCI1710_INCCPT_GETINDEXSTATUS:
i_ReturnValue = i_APCI1710_GetIndexStatus(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_GETREFERENCESTATUS:
i_ReturnValue = i_APCI1710_GetReferenceStatus(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_GETUASSTATUS:
i_ReturnValue = i_APCI1710_GetUASStatus(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_GETCBSTATUS:
i_ReturnValue = i_APCI1710_GetCBStatus(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_GET16BITCBSTATUS:
i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev,
(unsigned char) CR_AREF(insn->chanspec),
(unsigned char *) &data[0], (unsigned char *) &data[1]);
break;
case APCI1710_INCCPT_GETUDSTATUS:
i_ReturnValue = i_APCI1710_GetUDStatus(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS:
i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev,
(unsigned char) CR_AREF(insn->chanspec), (unsigned char *) &data[0]);
break;
case APCI1710_INCCPT_READFREQUENCYMEASUREMENT:
i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev,
(unsigned char) CR_AREF(insn->chanspec),
(unsigned char *) &data[0],
(unsigned char *) &data[1], (unsigned int *) &data[2]);
break;
case APCI1710_INCCPT_READINTERRUPT:
data[0] = devpriv->s_InterruptParameters.
s_FIFOInterruptParameters[devpriv->
s_InterruptParameters.ui_Read].b_OldModuleMask;
data[1] = devpriv->s_InterruptParameters.
s_FIFOInterruptParameters[devpriv->
s_InterruptParameters.ui_Read].ul_OldInterruptMask;
data[2] = devpriv->s_InterruptParameters.
s_FIFOInterruptParameters[devpriv->
s_InterruptParameters.ui_Read].ul_OldCounterLatchValue;
/**************************/
/* Increment the read FIFO */
/***************************/
devpriv->
s_InterruptParameters.
ui_Read = (devpriv->s_InterruptParameters.
ui_Read + 1) % APCI1710_SAVE_INTERRUPT;
break;
default:
printk("ReadType Parameter wrong\n");
}
if (i_ReturnValue >= 0)
i_ReturnValue = insn->n;
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_ReadLatchRegisterStatus |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_LatchReg, |
| unsigned char *_ pb_LatchStatus) |
+----------------------------------------------------------------------------+
| Task : Read the latch register status from selected module |
| (b_ModulNbr) and selected latch register (b_LatchReg). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_LatchReg : Selected latch register |
| 0 : for the first latch register |
| 1 : for the second latch register |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_LatchStatus : Latch register status. |
| 0 : No latch occur |
| 1 : A software latch occur |
| 2 : A hardware latch occur |
| 3 : A software and hardware |
| latch occur |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: The selected latch register parameter is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_ReadLatchRegisterStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned char *pb_LatchStatus)
{
int i_ReturnValue = 0;
unsigned int dw_LatchReg;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*************************************/
/* Test the latch register parameter */
/*************************************/
if (b_LatchReg < 2) {
dw_LatchReg = inl(devpriv->s_BoardInfos.
ui_Address + (64 * b_ModulNbr));
*pb_LatchStatus =
(unsigned char) ((dw_LatchReg >> (b_LatchReg *
4)) & 0x3);
} else {
/**************************************************/
/* The selected latch register parameter is wrong */
/**************************************************/
DPRINTK("The selected latch register parameter is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_ReadLatchRegisterValue |
| (unsigned char_ b_BoardHandle,|
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_LatchReg, |
| PULONG_ pul_LatchValue) |
+----------------------------------------------------------------------------+
| Task : Read the latch register value from selected module |
| (b_ModulNbr) and selected latch register (b_LatchReg). |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_LatchReg : Selected latch register |
| 0 : for the first latch register |
| 1 : for the second latch register |
+----------------------------------------------------------------------------+
| Output Parameters : PULONG_ pul_LatchValue : Latch register value |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: The selected latch register parameter is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_ReadLatchRegisterValue(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned int *pul_LatchValue)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*************************************/
/* Test the latch register parameter */
/*************************************/
if (b_LatchReg < 2) {
*pul_LatchValue = inl(devpriv->s_BoardInfos.
ui_Address + ((b_LatchReg + 1) * 4) +
(64 * b_ModulNbr));
} else {
/**************************************************/
/* The selected latch register parameter is wrong */
/**************************************************/
DPRINTK("The selected latch register parameter is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_Read16BitCounterValue |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char_ b_SelectedCounter, |
| unsigned int *_ pui_CounterValue) |
+----------------------------------------------------------------------------+
| Task : Latch the selected 16-Bit counter (b_SelectedCounter) |
| from selected module (b_ModulNbr) in to the first |
| latch register and return the latched value. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
| unsigned char_ b_SelectedCounter : Selected 16-Bit counter |
| (0 or 1) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned int *_ pui_CounterValue : 16-Bit counter value |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: The selected 16-Bit counter parameter is wrong |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_Read16BitCounterValue(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int *pui_CounterValue)
{
int i_ReturnValue = 0;
unsigned int dw_LathchValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/******************************/
/* Test the counter selection */
/******************************/
if (b_SelectedCounter < 2) {
/*********************/
/* Latch the counter */
/*********************/
outl(1, devpriv->s_BoardInfos.
ui_Address + (64 * b_ModulNbr));
/************************/
/* Read the latch value */
/************************/
dw_LathchValue = inl(devpriv->s_BoardInfos.
ui_Address + 4 + (64 * b_ModulNbr));
*pui_CounterValue =
(unsigned int) ((dw_LathchValue >> (16 *
b_SelectedCounter)) &
0xFFFFU);
} else {
/**************************************************/
/* The selected 16-Bit counter parameter is wrong */
/**************************************************/
DPRINTK("The selected 16-Bit counter parameter is wrong\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_Read32BitCounterValue |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| PULONG_ pul_CounterValue) |
+----------------------------------------------------------------------------+
| Task : Latch the 32-Bit counter from selected module |
| (b_ModulNbr) in to the first latch register and return |
| the latched value. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : PULONG_ pul_CounterValue : 32-Bit counter value |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_Read32BitCounterValue(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned int *pul_CounterValue)
{
int i_ReturnValue = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*********************/
/* Tatch the counter */
/*********************/
outl(1, devpriv->s_BoardInfos.
ui_Address + (64 * b_ModulNbr));
/************************/
/* Read the latch value */
/************************/
*pul_CounterValue = inl(devpriv->s_BoardInfos.
ui_Address + 4 + (64 * b_ModulNbr));
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_GetIndexStatus (unsigned char_ b_BoardHandle,|
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_IndexStatus)|
+----------------------------------------------------------------------------+
| Task : Return the index status |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_IndexStatus : 0 : No INDEX occur |
| 1 : A INDEX occur |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Index not initialised see function |
| "i_APCI1710_InitIndex" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_GetIndexStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char *pb_IndexStatus)
{
int i_ReturnValue = 0;
unsigned int dw_StatusReg = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*****************************/
/* Test if index initialised */
/*****************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_IndexInit) {
dw_StatusReg = inl(devpriv->s_BoardInfos.
ui_Address + 12 + (64 * b_ModulNbr));
*pb_IndexStatus = (unsigned char) (dw_StatusReg & 1);
} else {
/*************************************************************/
/* Index not initialised see function "i_APCI1710_InitIndex" */
/*************************************************************/
DPRINTK("Index not initialised\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_GetReferenceStatus |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_ReferenceStatus) |
+----------------------------------------------------------------------------+
| Task : Return the reference status |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_ReferenceStatus : 0 : No REFERENCE occur |
| 1 : A REFERENCE occur |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Reference not initialised see function |
| "i_APCI1710_InitReference" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_GetReferenceStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char *pb_ReferenceStatus)
{
int i_ReturnValue = 0;
unsigned int dw_StatusReg = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*********************************/
/* Test if reference initialised */
/*********************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_ReferenceInit) {
dw_StatusReg = inl(devpriv->s_BoardInfos.
ui_Address + 24 + (64 * b_ModulNbr));
*pb_ReferenceStatus =
(unsigned char) (~dw_StatusReg & 1);
} else {
/*********************************************************************/
/* Reference not initialised see function "i_APCI1710_InitReference" */
/*********************************************************************/
DPRINTK("Reference not initialised\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_GetUASStatus |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_UASStatus) |
+----------------------------------------------------------------------------+
| Task : Return the error signal (UAS) status |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_UASStatus : 0 : UAS is low "0" |
| 1 : UAS is high "1" |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_GetUASStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char *pb_UASStatus)
{
int i_ReturnValue = 0;
unsigned int dw_StatusReg = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
dw_StatusReg = inl(devpriv->s_BoardInfos.
ui_Address + 24 + (64 * b_ModulNbr));
*pb_UASStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_GetCBStatus |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_CBStatus) |
+----------------------------------------------------------------------------+
| Task : Return the counter overflow status |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_CBStatus : 0 : Counter no overflow |
| 1 : Counter overflow |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_GetCBStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char *pb_CBStatus)
{
int i_ReturnValue = 0;
unsigned int dw_StatusReg = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
dw_StatusReg = inl(devpriv->s_BoardInfos.
ui_Address + 16 + (64 * b_ModulNbr));
*pb_CBStatus = (unsigned char) (dw_StatusReg & 1);
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_Get16BitCBStatus |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_CBStatusCounter0, |
| unsigned char *_ pb_CBStatusCounter1) |
+----------------------------------------------------------------------------+
| Task : Returns the counter overflow (counter initialised to |
| 2*16-bit) status from selected incremental counter |
| module |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_CBStatusCounter0 : 0 : No overflow occur for |
| the first 16-bit |
| counter |
| 1 : Overflow occur for the|
| first 16-bit counter |
| unsigned char *_ pb_CBStatusCounter1 : 0 : No overflow occur for |
| the second 16-bit |
| counter |
| 1 : Overflow occur for the|
| second 16-bit counter |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Counter not initialised to 2*16-bit mode. |
| See function "i_APCI1710_InitCounter" |
| -5: Firmware revision error |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_Get16BitCBStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char *pb_CBStatusCounter0, unsigned char *pb_CBStatusCounter1)
{
int i_ReturnValue = 0;
unsigned int dw_StatusReg = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*************************/
/* Test if 2*16-Bit mode */
/*************************/
if ((devpriv->s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_ModeRegister.
s_ByteModeRegister.
b_ModeRegister1 & 0x10) == 0x10) {
/*****************************/
/* Test the Firmware version */
/*****************************/
if ((devpriv->s_BoardInfos.
dw_MolduleConfiguration
[b_ModulNbr] & 0xFFFF) >=
0x3136) {
dw_StatusReg =
inl(devpriv->s_BoardInfos.
ui_Address + 16 +
(64 * b_ModulNbr));
*pb_CBStatusCounter1 =
(unsigned char) ((dw_StatusReg >> 0) &
1);
*pb_CBStatusCounter0 =
(unsigned char) ((dw_StatusReg >> 1) &
1);
} /* if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) */
else {
/****************************/
/* Firmware revision error */
/****************************/
i_ReturnValue = -5;
} /* if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) */
} /* if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) */
else {
/********************************************/
/* Counter not initialised to 2*16-bit mode */
/* "i_APCI1710_InitCounter" */
/********************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -4;
} /* if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) */
} /* if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) */
else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
} /* if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) */
} /* if (b_ModulNbr < 4) */
else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
} /* if (b_ModulNbr < 4) */
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_GetUDStatus |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_UDStatus) |
+----------------------------------------------------------------------------+
| Task : Return the counter progress status |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
| selected mode down |
| 1 : Counter progress in the |
| selected mode up |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_GetUDStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char *pb_UDStatus)
{
int i_ReturnValue = 0;
unsigned int dw_StatusReg = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
dw_StatusReg = inl(devpriv->s_BoardInfos.
ui_Address + 24 + (64 * b_ModulNbr));
*pb_UDStatus = (unsigned char) ((dw_StatusReg >> 2) & 1);
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_GetInterruptUDLatchedStatus |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_UDStatus) |
+----------------------------------------------------------------------------+
| Task : Return the counter progress latched status after a |
| index interrupt occur. |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Module number to configure |
| (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
| selected mode down |
| 1 : Counter progress in the |
| selected mode up |
| 2 : No index interrupt occur |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: No counter module found |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Interrupt function not initialised. |
| See function "i_APCI1710_SetBoardIntRoutineX" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device *dev,
unsigned char b_ModulNbr, unsigned char *pb_UDStatus)
{
int i_ReturnValue = 0;
unsigned int dw_StatusReg = 0;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/*********************************/
/* Test if index interrupt occur */
/*********************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_IndexInterruptOccur == 1) {
devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_IndexInterruptOccur = 0;
dw_StatusReg = inl(devpriv->s_BoardInfos.
ui_Address + 12 + (64 * b_ModulNbr));
*pb_UDStatus = (unsigned char) ((dw_StatusReg >> 1) & 1);
} else {
/****************************/
/* No index interrupt occur */
/****************************/
*pb_UDStatus = 2;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}
/*
+----------------------------------------------------------------------------+
| Function Name : _INT_ i_APCI1710_ReadFrequencyMeasurement |
| (unsigned char_ b_BoardHandle, |
| unsigned char_ b_ModulNbr, |
| unsigned char *_ pb_Status, |
| PULONG_ pul_ReadValue) |
+----------------------------------------------------------------------------+
| Task : Returns the status (pb_Status) and the number of |
| increments in the set time. |
| See function " i_APCI1710_InitFrequencyMeasurement " |
+----------------------------------------------------------------------------+
| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
| unsigned char_ b_ModulNbr : Number of the module to be |
| configured (0 to 3) |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_ pb_Status : Returns the frequency |
| measurement status |
| 0 : Counting cycle not |
| started. |
| 1 : Counting cycle started. |
| 2 : Counting cycle stopped. |
| The measurement cycle is |
| completed. |
| unsigned char *_ pb_UDStatus : 0 : Counter progress in the |
| selected mode down |
| 1 : Counter progress in the |
| selected mode up |
| PULONG_ pul_ReadValue : Return the number of |
| increments in the defined |
| time base. |
+----------------------------------------------------------------------------+
| Return Value : 0: No error |
| -1: The handle parameter of the board is wrong |
| -2: The selected module number is wrong |
| -3: Counter not initialised see function |
| "i_APCI1710_InitCounter" |
| -4: Frequency measurement logic not initialised. |
| See function "i_APCI1710_InitFrequencyMeasurement" |
+----------------------------------------------------------------------------+
*/
int i_APCI1710_ReadFrequencyMeasurement(struct comedi_device *dev,
unsigned char b_ModulNbr,
unsigned char *pb_Status, unsigned char *pb_UDStatus, unsigned int *pul_ReadValue)
{
int i_ReturnValue = 0;
unsigned int ui_16BitValue;
unsigned int dw_StatusReg;
/**************************/
/* Test the module number */
/**************************/
if (b_ModulNbr < 4) {
/*******************************/
/* Test if counter initialised */
/*******************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) {
/********************************************/
/* Test if frequency measurement initialised */
/********************************************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.b_FrequencyMeasurementInit == 1) {
/******************/
/* Test if enable */
/******************/
if (devpriv->
s_ModuleInfo[b_ModulNbr].
s_SiemensCounterInfo.
s_InitFlag.
b_FrequencyMeasurementEnable == 1) {
/*******************/
/* Read the status */
/*******************/
dw_StatusReg =
inl(devpriv->s_BoardInfos.
ui_Address + 32 +
(64 * b_ModulNbr));
/**************************/
/* Test if frequency stop */
/**************************/
if (dw_StatusReg & 1) {
*pb_Status = 2;
*pb_UDStatus =
(unsigned char) ((dw_StatusReg >>
1) & 3);
/******************/
/* Read the value */
/******************/
*pul_ReadValue =
inl(devpriv->
s_BoardInfos.
ui_Address + 28 +
(64 * b_ModulNbr));
if (*pb_UDStatus == 0) {
/*************************/
/* Test the counter mode */
/*************************/
if ((devpriv->s_ModuleInfo[b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & APCI1710_16BIT_COUNTER) == APCI1710_16BIT_COUNTER) {
/****************************************/
/* Test if 16-bit counter 1 pulse occur */
/****************************************/
if ((*pul_ReadValue & 0xFFFFU) != 0) {
ui_16BitValue
=
(unsigned int)
*
pul_ReadValue
&
0xFFFFU;
*pul_ReadValue
=
(*pul_ReadValue
&
0xFFFF0000UL)
|
(0xFFFFU
-
ui_16BitValue);
}
/****************************************/
/* Test if 16-bit counter 2 pulse occur */
/****************************************/
if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
ui_16BitValue
=
(unsigned int)
(
(*pul_ReadValue
>>
16)
&
0xFFFFU);
*pul_ReadValue
=
(*pul_ReadValue
&
0xFFFFUL)
|
(
(0xFFFFU - ui_16BitValue) << 16);
}
} else {
if (*pul_ReadValue != 0) {
*pul_ReadValue
=
0xFFFFFFFFUL
-
*pul_ReadValue;
}
}
} else {
if (*pb_UDStatus == 1) {
/****************************************/
/* Test if 16-bit counter 2 pulse occur */
/****************************************/
if ((*pul_ReadValue & 0xFFFF0000UL) != 0) {
ui_16BitValue
=
(unsigned int)
(
(*pul_ReadValue
>>
16)
&
0xFFFFU);
*pul_ReadValue
=
(*pul_ReadValue
&
0xFFFFUL)
|
(
(0xFFFFU - ui_16BitValue) << 16);
}
} else {
if (*pb_UDStatus
== 2) {
/****************************************/
/* Test if 16-bit counter 1 pulse occur */
/****************************************/
if ((*pul_ReadValue & 0xFFFFU) != 0) {
ui_16BitValue
=
(unsigned int)
*
pul_ReadValue
&
0xFFFFU;
*pul_ReadValue
=
(*pul_ReadValue
&
0xFFFF0000UL)
|
(0xFFFFU
-
ui_16BitValue);
}
}
}
}
} else {
*pb_Status = 1;
*pb_UDStatus = 0;
}
} else {
*pb_Status = 0;
*pb_UDStatus = 0;
}
} else {
/***********************************************/
/* Frequency measurement logic not initialised */
/***********************************************/
DPRINTK("Frequency measurement logic not initialised\n");
i_ReturnValue = -4;
}
} else {
/****************************************/
/* Counter not initialised see function */
/* "i_APCI1710_InitCounter" */
/****************************************/
DPRINTK("Counter not initialised\n");
i_ReturnValue = -3;
}
} else {
/*************************************************/
/* The selected module number parameter is wrong */
/*************************************************/
DPRINTK("The selected module number parameter is wrong\n");
i_ReturnValue = -2;
}
return i_ReturnValue;
}