| /** |
| @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 : TOR.C | Version : 2.96 | |
| +-------------------------------+---------------------------------------+ |
| | Project manager: Eric Stolz | Date : 02/12/2002 | |
| +-----------------------------------------------------------------------+ |
| | Description : APCI-1710 tor counter module | |
| | | |
| | | |
| +-----------------------------------------------------------------------+ |
| | UPDATES | |
| +-----------------------------------------------------------------------+ |
| | Date | Author | Description of updates | |
| +----------+-----------+------------------------------------------------+ |
| | 27/01/99 | S. Weber | 40 MHz implementation | |
| +-----------------------------------------------------------------------+ |
| | 28/04/00 | S. Weber | Simple,double and quadruple mode implementation| |
| | | | Extern clock implementation | |
| +-----------------------------------------------------------------------+ |
| | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 | |
| | | | available | |
| +-----------------------------------------------------------------------+ |
| */ |
| |
| #define APCI1710_30MHZ 30 |
| #define APCI1710_33MHZ 33 |
| #define APCI1710_40MHZ 40 |
| |
| #define APCI1710_GATE_INPUT 10 |
| |
| #define APCI1710_TOR_SIMPLE_MODE 2 |
| #define APCI1710_TOR_DOUBLE_MODE 3 |
| #define APCI1710_TOR_QUADRUPLE_MODE 4 |
| |
| #define APCI1710_SINGLE 0 |
| #define APCI1710_CONTINUOUS 1 |
| |
| #define APCI1710_TOR_GETPROGRESSSTATUS 0 |
| #define APCI1710_TOR_GETCOUNTERVALUE 1 |
| #define APCI1710_TOR_READINTERRUPT 2 |
| |
| /* |
| +----------------------------------------------------------------------------+ |
| | Function Name : _INT_ i_APCI1710_InitTorCounter | |
| | (unsigned char_ b_BoardHandle, | |
| | unsigned char_ b_ModulNbr, | |
| | unsigned char_ b_TorCounter, | |
| | unsigned char_ b_PCIInputClock, | |
| | unsigned char_ b_TimingUnit, | |
| | ULONG_ ul_TimingInterval, | |
| | PULONG_ pul_RealTimingInterval) | |
| +----------------------------------------------------------------------------+ |
| | Task : Configure the selected tor counter (b_TorCounter) | |
| | from selected module (b_ModulNbr). | |
| | The ul_TimingInterval and ul_TimingUnit determine the | |
| | timing base for the measurement. | |
| | The pul_RealTimingInterval return the real timing | |
| | value. You must calling this function be for you call | |
| | any other function witch access of the tor counter. | |
| | | |
| +----------------------------------------------------------------------------+ |
| | Input Parameters : | |
| | |
| CR_AREF unsigned char_ b_ModulNbr : Module number to configure | |
| | (0 to 3) | |
| | data[0] unsigned char_ b_TorCounter : Tor counter selection | |
| | (0 or 1). | |
| | data[1] unsigned char_ b_PCIInputClock : Selection from PCI bus clock| |
| | - APCI1710_30MHZ : | |
| | The PC have a PCI bus | |
| | clock from 30 MHz | |
| | - APCI1710_33MHZ : | |
| | The PC have a PCI bus | |
| | clock from 33 MHz | |
| | - APCI1710_40MHZ | |
| | The APCI-1710 have a | |
| | integrated 40Mhz | |
| | quartz. | |
| | - APCI1710_GATE_INPUT | |
| | Used the gate input for | |
| | the base clock. If you | |
| | have selected this option,| |
| | than it is not possibl to | |
| | used the gate input for | |
| | enabled the acquisition | |
| | data[2] unsigned char_ b_TimingUnit : Base timing unit (0 to 4) | |
| | 0 : ns | |
| | 1 : µs | |
| | 2 : ms | |
| | 3 : s | |
| | 4 : mn | |
| | data[3] ULONG_ ul_TimingInterval : Base timing value. | |
| +----------------------------------------------------------------------------+ |
| | Output Parameters : PULONG_ pul_RealTimingInterval : Real base timing | |
| | data[0] value. | |
| +----------------------------------------------------------------------------+ |
| | Return Value : 0: No error | |
| | -1: The handle parameter of the board is wrong | |
| | -2: Module selection wrong | |
| | -3: The module is not a tor counter module | |
| | -4: Tor counter selection is wrong | |
| | -5: The selected PCI input clock is wrong | |
| | -6: Timing unit selection is wrong | |
| | -7: Base timing selection is wrong | |
| | -8: You can not used the 40MHz clock selection wich | |
| | this board | |
| | -9: You can not used the 40MHz clock selection wich | |
| | this TOR version | |
| +----------------------------------------------------------------------------+ |
| */ |
| |
| static int i_APCI1710_InsnConfigInitTorCounter(struct comedi_device *dev, |
| struct comedi_subdevice *s, |
| struct comedi_insn *insn, |
| unsigned int *data) |
| { |
| struct addi_private *devpriv = dev->private; |
| int i_ReturnValue = 0; |
| unsigned int ul_TimerValue = 0; |
| unsigned int dw_Command; |
| double d_RealTimingInterval = 0; |
| unsigned char b_ModulNbr; |
| unsigned char b_TorCounter; |
| unsigned char b_PCIInputClock; |
| unsigned char b_TimingUnit; |
| unsigned int ul_TimingInterval; |
| unsigned int ul_RealTimingInterval = 0; |
| |
| i_ReturnValue = insn->n; |
| b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec); |
| |
| b_TorCounter = (unsigned char) data[0]; |
| b_PCIInputClock = (unsigned char) data[1]; |
| b_TimingUnit = (unsigned char) data[2]; |
| ul_TimingInterval = (unsigned int) data[3]; |
| printk("INPUT clock %d\n", b_PCIInputClock); |
| |
| /**************************/ |
| /* Test the module number */ |
| /**************************/ |
| |
| if (b_ModulNbr < 4) { |
| /***********************/ |
| /* Test if tor counter */ |
| /***********************/ |
| |
| if ((devpriv->s_BoardInfos. |
| dw_MolduleConfiguration[b_ModulNbr] & |
| 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { |
| /**********************************/ |
| /* Test the tor counter selection */ |
| /**********************************/ |
| |
| if (b_TorCounter <= 1) { |
| /**************************/ |
| /* Test the PCI bus clock */ |
| /**************************/ |
| |
| if ((b_PCIInputClock == APCI1710_30MHZ) || |
| (b_PCIInputClock == APCI1710_33MHZ) || |
| (b_PCIInputClock == APCI1710_40MHZ) || |
| (b_PCIInputClock == |
| APCI1710_GATE_INPUT)) { |
| /************************/ |
| /* Test the timing unit */ |
| /************************/ |
| |
| if ((b_TimingUnit <= 4) |
| || (b_PCIInputClock == |
| APCI1710_GATE_INPUT)) { |
| /**********************************/ |
| /* Test the base timing selection */ |
| /**********************************/ |
| |
| if (((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 133) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230650UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 9UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 121) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691043UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 520UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 8UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 100) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496729UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 7UL)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && (ul_TimingInterval >= 2))) { |
| /**************************/ |
| /* Test the board version */ |
| /**************************/ |
| |
| if (((b_PCIInputClock == APCI1710_40MHZ) && (devpriv->s_BoardInfos.b_BoardVersion > 0)) || (b_PCIInputClock != APCI1710_40MHZ)) { |
| /************************/ |
| /* Test the TOR version */ |
| /************************/ |
| |
| if (((b_PCIInputClock == APCI1710_40MHZ) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3132)) || (b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) { |
| /*********************************/ |
| /* Test if not extern clock used */ |
| /*********************************/ |
| |
| if (b_PCIInputClock != APCI1710_GATE_INPUT) { |
| fpu_begin |
| (); |
| /****************************************/ |
| /* Calculate the timer 0 division fator */ |
| /****************************************/ |
| |
| switch (b_TimingUnit) { |
| /******/ |
| /* 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 */ |
| /*****************************/ |
| |
| ul_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)ul_RealTimingInterval + 0.5)) { |
| ul_RealTimingInterval |
| = |
| ul_RealTimingInterval |
| + |
| 1; |
| } |
| |
| ul_TimingInterval |
| = |
| ul_TimingInterval |
| - |
| 1; |
| ul_TimerValue |
| = |
| ul_TimerValue |
| - |
| 2; |
| |
| if (b_PCIInputClock != APCI1710_40MHZ) { |
| ul_TimerValue |
| = |
| (unsigned int) |
| ( |
| (double) |
| (ul_TimerValue) |
| * |
| 1.007752288); |
| } |
| |
| 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 */ |
| /*****************************/ |
| |
| ul_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)ul_RealTimingInterval + 0.5)) { |
| ul_RealTimingInterval |
| = |
| ul_RealTimingInterval |
| + |
| 1; |
| } |
| |
| ul_TimingInterval |
| = |
| ul_TimingInterval |
| - |
| 1; |
| ul_TimerValue |
| = |
| ul_TimerValue |
| - |
| 2; |
| |
| if (b_PCIInputClock != APCI1710_40MHZ) { |
| ul_TimerValue |
| = |
| (unsigned int) |
| ( |
| (double) |
| (ul_TimerValue) |
| * |
| 1.007752288); |
| } |
| |
| 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 */ |
| /*****************************/ |
| |
| ul_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)ul_RealTimingInterval + 0.5)) { |
| ul_RealTimingInterval |
| = |
| ul_RealTimingInterval |
| + |
| 1; |
| } |
| |
| ul_TimingInterval |
| = |
| ul_TimingInterval |
| - |
| 1; |
| ul_TimerValue |
| = |
| ul_TimerValue |
| - |
| 2; |
| |
| if (b_PCIInputClock != APCI1710_40MHZ) { |
| ul_TimerValue |
| = |
| (unsigned int) |
| ( |
| (double) |
| (ul_TimerValue) |
| * |
| 1.007752288); |
| } |
| |
| break; |
| |
| /*****/ |
| /* s */ |
| /*****/ |
| |
| case 3: |
| |
| /******************/ |
| /* Timer 0 factor */ |
| /******************/ |
| |
| ul_TimerValue |
| = |
| (unsigned int) |
| (ul_TimingInterval |
| * |
| (250000.0 |
| * |
| b_PCIInputClock)); |
| |
| /*******************/ |
| /* Round the value */ |
| /*******************/ |
| |
| if ((double)((double)ul_TimingInterval * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { |
| ul_TimerValue |
| = |
| ul_TimerValue |
| + |
| 1; |
| } |
| |
| /*****************************/ |
| /* Calculate the real timing */ |
| /*****************************/ |
| |
| ul_RealTimingInterval |
| = |
| (unsigned int) |
| (ul_TimerValue |
| / |
| (250000.0 |
| * |
| (double) |
| b_PCIInputClock)); |
| d_RealTimingInterval |
| = |
| (double) |
| ul_TimerValue |
| / |
| (250000.0 |
| * |
| (double) |
| b_PCIInputClock); |
| |
| if ((double)((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) { |
| ul_RealTimingInterval |
| = |
| ul_RealTimingInterval |
| + |
| 1; |
| } |
| |
| ul_TimingInterval |
| = |
| ul_TimingInterval |
| - |
| 1; |
| ul_TimerValue |
| = |
| ul_TimerValue |
| - |
| 2; |
| |
| if (b_PCIInputClock != APCI1710_40MHZ) { |
| ul_TimerValue |
| = |
| (unsigned int) |
| ( |
| (double) |
| (ul_TimerValue) |
| * |
| 1.007752288); |
| } |
| |
| break; |
| |
| /******/ |
| /* mn */ |
| /******/ |
| |
| case 4: |
| |
| /******************/ |
| /* Timer 0 factor */ |
| /******************/ |
| |
| ul_TimerValue |
| = |
| (unsigned int) |
| ( |
| (ul_TimingInterval |
| * |
| 60) |
| * |
| (250000.0 |
| * |
| b_PCIInputClock)); |
| |
| /*******************/ |
| /* Round the value */ |
| /*******************/ |
| |
| if ((double)((double)(ul_TimingInterval * 60.0) * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { |
| ul_TimerValue |
| = |
| ul_TimerValue |
| + |
| 1; |
| } |
| |
| /*****************************/ |
| /* Calculate the real timing */ |
| /*****************************/ |
| |
| ul_RealTimingInterval |
| = |
| (unsigned int) |
| (ul_TimerValue |
| / |
| (250000.0 |
| * |
| (double) |
| b_PCIInputClock)) |
| / |
| 60; |
| d_RealTimingInterval |
| = |
| ( |
| (double) |
| ul_TimerValue |
| / |
| (250000.0 |
| * |
| (double) |
| b_PCIInputClock)) |
| / |
| 60.0; |
| |
| if ((double)(((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) / 60.0) >= (double)((double)ul_RealTimingInterval + 0.5)) { |
| ul_RealTimingInterval |
| = |
| ul_RealTimingInterval |
| + |
| 1; |
| } |
| |
| ul_TimingInterval |
| = |
| ul_TimingInterval |
| - |
| 1; |
| ul_TimerValue |
| = |
| ul_TimerValue |
| - |
| 2; |
| |
| if (b_PCIInputClock != APCI1710_40MHZ) { |
| ul_TimerValue |
| = |
| (unsigned int) |
| ( |
| (double) |
| (ul_TimerValue) |
| * |
| 1.007752288); |
| } |
| |
| break; |
| } |
| |
| fpu_end(); |
| } /* if (b_PCIInputClock != APCI1710_GATE_INPUT) */ |
| else { |
| /*************************************************************/ |
| /* 2 Clock used for the overflow and the reload from counter */ |
| /*************************************************************/ |
| |
| ul_TimerValue |
| = |
| ul_TimingInterval |
| - |
| 2; |
| } /* if (b_PCIInputClock != APCI1710_GATE_INPUT) */ |
| |
| /****************************/ |
| /* Save the PCI input clock */ |
| /****************************/ |
| devpriv-> |
| s_ModuleInfo |
| [b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| b_PCIInputClock |
| = |
| b_PCIInputClock; |
| |
| /************************/ |
| /* Save the timing unit */ |
| /************************/ |
| |
| devpriv-> |
| s_ModuleInfo |
| [b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo |
| [b_TorCounter]. |
| b_TimingUnit |
| = |
| b_TimingUnit; |
| |
| /************************/ |
| /* Save the base timing */ |
| /************************/ |
| devpriv-> |
| s_ModuleInfo |
| [b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo |
| [b_TorCounter]. |
| d_TimingInterval |
| = |
| d_RealTimingInterval; |
| |
| devpriv-> |
| s_ModuleInfo |
| [b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo |
| [b_TorCounter]. |
| ul_RealTimingInterval |
| = |
| ul_RealTimingInterval; |
| |
| /*******************/ |
| /* Get the command */ |
| /*******************/ |
| |
| dw_Command |
| = |
| inl |
| (devpriv-> |
| s_BoardInfos. |
| ui_Address |
| + |
| 4 |
| + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| dw_Command |
| = |
| (dw_Command |
| >> |
| 4) |
| & |
| 0xF; |
| |
| /******************/ |
| /* Test if 40 MHz */ |
| /******************/ |
| |
| if (b_PCIInputClock == APCI1710_40MHZ) { |
| /****************************/ |
| /* Set the 40 MHz selection */ |
| /****************************/ |
| |
| dw_Command |
| = |
| dw_Command |
| | |
| 0x10; |
| } |
| |
| /*****************************/ |
| /* Test if extern clock used */ |
| /*****************************/ |
| |
| if (b_PCIInputClock == APCI1710_GATE_INPUT) { |
| /****************************/ |
| /* Set the 40 MHz selection */ |
| /****************************/ |
| |
| dw_Command |
| = |
| dw_Command |
| | |
| 0x20; |
| } |
| |
| /*************************/ |
| /* Write the new command */ |
| /*************************/ |
| |
| outl(dw_Command, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| /*******************/ |
| /* Disable the tor */ |
| /*******************/ |
| |
| outl(0, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| /*************************/ |
| /* Set the timer 1 value */ |
| /*************************/ |
| |
| outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 0 + (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| /*********************/ |
| /* Tor counter init. */ |
| /*********************/ |
| |
| devpriv-> |
| s_ModuleInfo |
| [b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo |
| [b_TorCounter]. |
| b_TorCounterInit |
| = |
| 1; |
| } else { |
| /***********************************************/ |
| /* TOR version error for 40MHz clock selection */ |
| /***********************************************/ |
| |
| DPRINTK("TOR version error for 40MHz clock selection\n"); |
| i_ReturnValue |
| = |
| -9; |
| } |
| } else { |
| /**************************************************************/ |
| /* You can not used the 40MHz clock selection wich this board */ |
| /**************************************************************/ |
| |
| DPRINTK("You can not used the 40MHz clock selection wich this board\n"); |
| i_ReturnValue = |
| -8; |
| } |
| } else { |
| /**********************************/ |
| /* Base timing selection is wrong */ |
| /**********************************/ |
| |
| DPRINTK("Base timing selection is wrong\n"); |
| i_ReturnValue = -7; |
| } |
| } /* if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) */ |
| else { |
| /**********************************/ |
| /* Timing unit selection is wrong */ |
| /**********************************/ |
| |
| DPRINTK("Timing unit selection is wrong\n"); |
| i_ReturnValue = -6; |
| } /* if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) */ |
| } /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) */ |
| else { |
| /*****************************************/ |
| /* The selected PCI input clock is wrong */ |
| /*****************************************/ |
| |
| DPRINTK("The selected PCI input clock is wrong\n"); |
| i_ReturnValue = -5; |
| } /* if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) */ |
| } /* if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) */ |
| else { |
| /**********************************/ |
| /* Tor Counter selection is wrong */ |
| /**********************************/ |
| |
| DPRINTK("Tor Counter selection is wrong\n"); |
| i_ReturnValue = -4; |
| } /* if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) */ |
| } else { |
| /******************************************/ |
| /* The module is not a tor counter module */ |
| /******************************************/ |
| |
| DPRINTK("The module is not a tor counter module\n"); |
| i_ReturnValue = -3; |
| } |
| } else { |
| /***********************/ |
| /* Module number error */ |
| /***********************/ |
| |
| DPRINTK("Module number error\n"); |
| i_ReturnValue = -2; |
| } |
| data[0] = (unsigned int) ul_RealTimingInterval; |
| return i_ReturnValue; |
| } |
| |
| /* |
| +----------------------------------------------------------------------------+ |
| | Function Name : _INT_ i_APCI1710_EnableTorCounter | |
| | (unsigned char_ b_BoardHandle, | |
| | unsigned char_ b_ModulNbr, | |
| | unsigned char_ b_TorCounter, | |
| | unsigned char_ b_InputMode, | |
| | unsigned char_ b_ExternGate, | |
| | unsigned char_ b_CycleMode, | |
| | unsigned char_ b_InterruptEnable) | |
| +----------------------------------------------------------------------------+ |
| | Task : Enable the tor counter (b_TorCounter) from selected | |
| | module (b_ModulNbr). You must calling the | |
| | "i_APCI1710_InitTorCounter" function be for you call | |
| | this function. | |
| | If you enable the tor counter interrupt, the | |
| | tor counter generate a interrupt after the timing cycle| |
| | See function "i_APCI1710_SetBoardIntRoutineX" and the | |
| | Interrupt mask description chapter from this manual. | |
| | The b_CycleMode parameter determine if you will | |
| | measured a single or more cycle. | |
| +----------------------------------------------------------------------------+ |
| | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | |
| | unsigned char_ b_ModulNbr : Selected module number (0 to 3) | |
| | unsigned char_ b_TorCounter : Tor counter selection (0 or 1). | |
| | unsigned char_ b_InputMode : Input signal level selection | |
| | 0 : Tor count each low level | |
| | 1 : Tor count each high level| |
| | unsigned char_ b_ExternGate : Extern gate action selection | |
| | 0 : Extern gate signal not | |
| | used | |
| | 1 : Extern gate signal used. | |
| | If you selected the | |
| | single mode, each high | |
| | level signal start the | |
| | counter. | |
| | If you selected the | |
| | continuous mode, the | |
| | first high level signal | |
| | start the tor counter | |
| | | |
| | APCI1710_TOR_QUADRUPLE _MODE : | |
| | In the quadruple mode, the edge| |
| | analysis circuit generates a | |
| | counting pulse from each edge | |
| | of 2 signals which are phase | |
| | shifted in relation to each | |
| | other. | |
| | The gate input is used for the | |
| | signal B | |
| | | |
| | APCI1710_TOR_DOUBLE_MODE: | |
| | Functions in the same way as | |
| | the quadruple mode, except that| |
| | only two of the four edges are | |
| | analysed per period. | |
| | The gate input is used for the | |
| | signal B | |
| | | |
| | APCI1710_TOR_SIMPLE_MODE: | |
| | Functions in the same way as | |
| | the quadruple mode, except that| |
| | only one of the four edges is | |
| | analysed per period. | |
| | The gate input is used for the | |
| | signal B | |
| | | |
| | unsigned char_ b_CycleMode : Selected the tor counter | |
| | acquisition mode | |
| | unsigned char_ b_InterruptEnable : Enable or disable the | |
| | tor counter interrupt. | |
| | APCI1710_ENABLE: | |
| | Enable the tor counter | |
| | interrupt | |
| | APCI1710_DISABLE: | |
| | Disable the tor counter | |
| | interrupt | |
| +----------------------------------------------------------------------------+ |
| | Output Parameters : - | |
| +----------------------------------------------------------------------------+ |
| | Return Value : 0: No error | |
| | -1: The handle parameter of the board is wrong | |
| | -2: Module selection wrong | |
| | -3: The module is not a tor counter module | |
| | -4: Tor counter selection is wrong | |
| | -5: Tor counter not initialised see function | |
| | "i_APCI1710_InitTorCounter" | |
| | -6: Tor input signal selection is wrong | |
| | -7: Extern gate signal mode is wrong | |
| | -8: Tor counter acquisition mode cycle is wrong | |
| | -9: Interrupt parameter is wrong | |
| | -10:Interrupt function not initialised. | |
| | See function "i_APCI1710_SetBoardIntRoutineX" | |
| +----------------------------------------------------------------------------+ |
| */ |
| /* |
| +----------------------------------------------------------------------------+ |
| | Function Name : _INT_ i_APCI1710_DisableTorCounter | |
| | (unsigned char_ b_BoardHandle, | |
| | unsigned char_ b_ModulNbr, | |
| | unsigned char_ b_TorCounter) | |
| +----------------------------------------------------------------------------+ |
| | Task : Disable the tor counter (b_TorCounter) from selected | |
| | module (b_ModulNbr). If you disable the tor counter | |
| | after a start cycle occur and you restart the tor | |
| | counter witch the " i_APCI1710_EnableTorCounter" | |
| | function, the status register is cleared | |
| +----------------------------------------------------------------------------+ |
| | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | |
| | unsigned char_ b_ModulNbr : Selected module number (0 to 3) | |
| | unsigned char_ b_TorCounter : Tor counter selection (0 or 1). | |
| +----------------------------------------------------------------------------+ |
| | Output Parameters : - | |
| +----------------------------------------------------------------------------+ |
| | Return Value : 0: No error | |
| | -1: The handle parameter of the board is wrong | |
| | -2: Module selection wrong | |
| | -3: The module is not a tor counter module | |
| | -4: Tor counter selection is wrong | |
| | -5: Tor counter not initialised see function | |
| | "i_APCI1710_InitTorCounter" | |
| | -6: Tor counter not enabled see function | |
| | "i_APCI1710_EnableTorCounter" | |
| +----------------------------------------------------------------------------+ |
| */ |
| |
| static int i_APCI1710_InsnWriteEnableDisableTorCounter(struct comedi_device *dev, |
| struct comedi_subdevice *s, |
| struct comedi_insn *insn, |
| unsigned int *data) |
| { |
| struct addi_private *devpriv = dev->private; |
| int i_ReturnValue = 0; |
| unsigned int dw_Status; |
| unsigned int dw_DummyRead; |
| unsigned int dw_ConfigReg; |
| unsigned char b_ModulNbr, b_Action; |
| unsigned char b_TorCounter; |
| unsigned char b_InputMode; |
| unsigned char b_ExternGate; |
| unsigned char b_CycleMode; |
| unsigned char b_InterruptEnable; |
| |
| b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec); |
| b_Action = (unsigned char) data[0]; /* enable or disable */ |
| b_TorCounter = (unsigned char) data[1]; |
| b_InputMode = (unsigned char) data[2]; |
| b_ExternGate = (unsigned char) data[3]; |
| b_CycleMode = (unsigned char) data[4]; |
| b_InterruptEnable = (unsigned char) data[5]; |
| i_ReturnValue = insn->n; |
| devpriv->tsk_Current = current; /* Save the current process task structure */ |
| /**************************/ |
| /* Test the module number */ |
| /**************************/ |
| |
| if (b_ModulNbr < 4) { |
| /***********************/ |
| /* Test if tor counter */ |
| /***********************/ |
| |
| if ((devpriv->s_BoardInfos. |
| dw_MolduleConfiguration[b_ModulNbr] & |
| 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { |
| /**********************************/ |
| /* Test the tor counter selection */ |
| /**********************************/ |
| |
| if (b_TorCounter <= 1) { |
| switch (b_Action) /* Enable or Disable */ |
| { |
| case APCI1710_ENABLE: |
| /***********************************/ |
| /* Test if tor counter initialised */ |
| /***********************************/ |
| |
| dw_Status = |
| inl(devpriv->s_BoardInfos. |
| ui_Address + 8 + |
| (16 * b_TorCounter) + |
| (64 * b_ModulNbr)); |
| |
| if (dw_Status & 0x10) { |
| /******************************/ |
| /* Test the input signal mode */ |
| /******************************/ |
| |
| if (b_InputMode == 0 || |
| b_InputMode == 1 || |
| b_InputMode == |
| APCI1710_TOR_SIMPLE_MODE |
| || b_InputMode == |
| APCI1710_TOR_DOUBLE_MODE |
| || b_InputMode == |
| APCI1710_TOR_QUADRUPLE_MODE) |
| { |
| /************************************/ |
| /* Test the extern gate signal mode */ |
| /************************************/ |
| |
| if (b_ExternGate == 0 |
| || b_ExternGate |
| == 1 |
| || b_InputMode > |
| 1) { |
| /*********************************/ |
| /* Test the cycle mode parameter */ |
| /*********************************/ |
| |
| if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) { |
| /***************************/ |
| /* Test the interrupt flag */ |
| /***************************/ |
| |
| if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) { |
| |
| /***************************/ |
| /* Save the interrupt mode */ |
| /***************************/ |
| |
| devpriv-> |
| s_ModuleInfo |
| [b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo |
| [b_TorCounter]. |
| b_InterruptEnable |
| = |
| b_InterruptEnable; |
| |
| /*******************/ |
| /* Get the command */ |
| /*******************/ |
| |
| dw_ConfigReg |
| = |
| inl |
| (devpriv-> |
| s_BoardInfos. |
| ui_Address |
| + |
| 4 |
| + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| dw_ConfigReg |
| = |
| (dw_ConfigReg |
| >> |
| 4) |
| & |
| 0x30; |
| |
| /********************************/ |
| /* Test if not direct mode used */ |
| /********************************/ |
| |
| if (b_InputMode > 1) { |
| /*******************************/ |
| /* Extern gate can not be used */ |
| /*******************************/ |
| |
| b_ExternGate |
| = |
| 0; |
| |
| /*******************************************/ |
| /* Enable the extern gate for the Signal B */ |
| /*******************************************/ |
| |
| dw_ConfigReg |
| = |
| dw_ConfigReg |
| | |
| 0x40; |
| |
| /***********************/ |
| /* Test if simple mode */ |
| /***********************/ |
| |
| if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) { |
| /**************************/ |
| /* Enable the sinple mode */ |
| /**************************/ |
| |
| dw_ConfigReg |
| = |
| dw_ConfigReg |
| | |
| 0x780; |
| |
| } /* if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) */ |
| |
| /***********************/ |
| /* Test if double mode */ |
| /***********************/ |
| |
| if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) { |
| /**************************/ |
| /* Enable the double mode */ |
| /**************************/ |
| |
| dw_ConfigReg |
| = |
| dw_ConfigReg |
| | |
| 0x180; |
| |
| } /* if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) */ |
| |
| b_InputMode |
| = |
| 0; |
| } /* if (b_InputMode > 1) */ |
| |
| /*******************/ |
| /* Set the command */ |
| /*******************/ |
| |
| dw_ConfigReg |
| = |
| dw_ConfigReg |
| | |
| b_CycleMode |
| | |
| (b_InterruptEnable |
| * |
| 2) |
| | |
| (b_InputMode |
| * |
| 4) |
| | |
| (b_ExternGate |
| * |
| 8); |
| |
| /*****************************/ |
| /* Clear the status register */ |
| /*****************************/ |
| |
| dw_DummyRead |
| = |
| inl |
| (devpriv-> |
| s_BoardInfos. |
| ui_Address |
| + |
| 0 |
| + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| /***************************************/ |
| /* Clear the interrupt status register */ |
| /***************************************/ |
| |
| dw_DummyRead |
| = |
| inl |
| (devpriv-> |
| s_BoardInfos. |
| ui_Address |
| + |
| 12 |
| + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| /********************/ |
| /* Set the commando */ |
| /********************/ |
| |
| outl(dw_ConfigReg, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| /****************/ |
| /* Set the gate */ |
| /****************/ |
| |
| outl(1, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| } /* if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) */ |
| else { |
| /********************************/ |
| /* Interrupt parameter is wrong */ |
| /********************************/ |
| |
| DPRINTK("Interrupt parameter is wrong\n"); |
| i_ReturnValue |
| = |
| -9; |
| } /* if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) */ |
| } /* if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) */ |
| else { |
| /***********************************************/ |
| /* Tor counter acquisition mode cycle is wrong */ |
| /***********************************************/ |
| |
| DPRINTK("Tor counter acquisition mode cycle is wrong\n"); |
| i_ReturnValue |
| = |
| -8; |
| } /* if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) */ |
| } /* if (b_ExternGate >= 0 && b_ExternGate <= 1) */ |
| else { |
| /***********************************/ |
| /* Extern gate input mode is wrong */ |
| /***********************************/ |
| |
| DPRINTK("Extern gate input mode is wrong\n"); |
| i_ReturnValue = |
| -7; |
| } /* if (b_ExternGate >= 0 && b_ExternGate <= 1) */ |
| } /* if (b_InputMode >= 0 && b_InputMode <= 1) */ |
| else { |
| /***************************************/ |
| /* Tor input signal selection is wrong */ |
| /***************************************/ |
| |
| DPRINTK("Tor input signal selection is wrong\n"); |
| i_ReturnValue = -6; |
| } |
| } else { |
| /*******************************/ |
| /* Tor counter not initialised */ |
| /*******************************/ |
| |
| DPRINTK("Tor counter not initialised\n"); |
| i_ReturnValue = -5; |
| } |
| break; |
| |
| case APCI1710_DISABLE: |
| /***********************************/ |
| /* Test if tor counter initialised */ |
| /***********************************/ |
| |
| dw_Status = inl(devpriv->s_BoardInfos. |
| ui_Address + 8 + |
| (16 * b_TorCounter) + |
| (64 * b_ModulNbr)); |
| |
| /*******************************/ |
| /* Test if counter initialised */ |
| /*******************************/ |
| |
| if (dw_Status & 0x10) { |
| /***************************/ |
| /* Test if counter enabled */ |
| /***************************/ |
| |
| if (dw_Status & 0x1) { |
| /****************************/ |
| /* Clear the interrupt mode */ |
| /****************************/ |
| devpriv-> |
| s_ModuleInfo |
| [b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo |
| [b_TorCounter]. |
| b_InterruptEnable |
| = |
| APCI1710_DISABLE; |
| |
| /******************/ |
| /* Clear the gate */ |
| /******************/ |
| |
| outl(0, devpriv-> |
| s_BoardInfos. |
| ui_Address + 8 + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| } /* if (dw_Status & 0x1) */ |
| else { |
| /***************************/ |
| /* Tor counter not enabled */ |
| /***************************/ |
| |
| DPRINTK("Tor counter not enabled \n"); |
| i_ReturnValue = -6; |
| } /* if (dw_Status & 0x1) */ |
| } /* if (dw_Status & 0x10) */ |
| else { |
| /*******************************/ |
| /* Tor counter not initialised */ |
| /*******************************/ |
| |
| DPRINTK("Tor counter not initialised\n"); |
| i_ReturnValue = -5; |
| } /* // if (dw_Status & 0x10) */ |
| |
| } /* switch */ |
| } /* if (b_TorCounter <= 1) */ |
| else { |
| /**********************************/ |
| /* Tor counter selection is wrong */ |
| /**********************************/ |
| |
| DPRINTK("Tor counter selection is wrong\n"); |
| i_ReturnValue = -4; |
| } /* if (b_TorCounter <= 1) */ |
| } else { |
| /******************************************/ |
| /* The module is not a tor counter module */ |
| /******************************************/ |
| |
| DPRINTK("The module is not a tor counter module \n"); |
| i_ReturnValue = -3; |
| } |
| } else { |
| /***********************/ |
| /* Module number error */ |
| /***********************/ |
| |
| DPRINTK("Module number error \n"); |
| i_ReturnValue = -2; |
| } |
| |
| return i_ReturnValue; |
| } |
| |
| /* |
| +----------------------------------------------------------------------------+ |
| | Function Name : _INT_ i_APCI1710_GetTorCounterInitialisation | |
| | (unsigned char_ b_BoardHandle, | |
| | unsigned char_ b_ModulNbr, | |
| | unsigned char_ b_TorCounter, | |
| | unsigned char *_ pb_TimingUnit, | |
| | PULONG_ pul_TimingInterval, | |
| | unsigned char *_ pb_InputMode, | |
| | unsigned char *_ pb_ExternGate, | |
| | unsigned char *_ pb_CycleMode, | |
| | unsigned char *_ pb_Enable, | |
| | unsigned char *_ pb_InterruptEnable)| |
| +----------------------------------------------------------------------------+ |
| | Task : Enable the tor counter (b_TorCounter) from selected | |
| | module (b_ModulNbr). You must calling the | |
| | "i_APCI1710_InitTorCounter" function be for you call | |
| | this function. | |
| | If you enable the tor counter interrupt, the | |
| | tor counter generate a interrupt after the timing cycle| |
| | See function "i_APCI1710_SetBoardIntRoutineX" and the | |
| | Interrupt mask description chapter from this manual. | |
| | The b_CycleMode parameter determine if you will | |
| | measured a single or more cycle. | |
| +----------------------------------------------------------------------------+ |
| | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | |
| | unsigned char_ b_ModulNbr : Selected module number (0 to 3) | |
| | unsigned char_ b_TorCounter : Tor counter selection (0 or 1) |
| |
| b_ModulNbr = CR_AREF(insn->chanspec); |
| b_TorCounter = CR_CHAN(insn->chanspec); |
| . | |
| +----------------------------------------------------------------------------+ |
| | Output Parameters : unsigned char *_ pb_TimingUnit : Base timing unit (0 to 4) | |
| | 0 : ns | |
| | 1 : µs | |
| | 2 : ms | |
| | 3 : s | |
| | 4 : mn | |
| | PULONG_ pul_TimingInterval : Base timing value. | |
| | unsigned char *_ pb_InputMode : Input signal level | |
| | selection | |
| | 0 : Tor count each low level | |
| | 1 : Tor count each high level| |
| | unsigned char *_ pb_ExternGate : Extern gate action | |
| | selection | |
| | 0 : Extern gate signal not | |
| | used | |
| | 1 : Extern gate signal used| |
| | unsigned char *_ pb_CycleMode : Tor counter acquisition | |
| | mode | |
| | unsigned char *_ pb_Enable : Indicate if the tor counter| |
| | is enabled or no | |
| | 0 : Tor counter disabled | |
| | 1 : Tor counter enabled | |
| | unsigned char *_ pb_InterruptEnable : Enable or disable the | |
| | tor counter interrupt. | |
| | APCI1710_ENABLE: | |
| | Enable the tor counter | |
| | interrupt | |
| | APCI1710_DISABLE: | |
| | Disable the tor counter | |
| | interrupt |
| pb_TimingUnit = (unsigned char *) &data[0]; |
| pul_TimingInterval = (unsigned int *) &data[1]; |
| pb_InputMode = (unsigned char *) &data[2]; |
| pb_ExternGate = (unsigned char *) &data[3]; |
| pb_CycleMode = (unsigned char *) &data[4]; |
| pb_Enable = (unsigned char *) &data[5]; |
| pb_InterruptEnable = (unsigned char *) &data[6]; |
| | |
| +----------------------------------------------------------------------------+ |
| | Return Value : 0: No error | |
| | -1: The handle parameter of the board is wrong | |
| | -2: Module selection wrong | |
| | -3: The module is not a tor counter module | |
| | -4: Tor counter selection is wrong | |
| | -5: Tor counter not initialised see function | |
| | "i_APCI1710_InitTorCounter" | |
| +----------------------------------------------------------------------------+ |
| */ |
| |
| static int i_APCI1710_InsnReadGetTorCounterInitialisation(struct comedi_device *dev, |
| struct comedi_subdevice *s, |
| struct comedi_insn *insn, |
| unsigned int *data) |
| { |
| struct addi_private *devpriv = dev->private; |
| int i_ReturnValue = 0; |
| unsigned int dw_Status; |
| unsigned char b_ModulNbr; |
| unsigned char b_TorCounter; |
| unsigned char *pb_TimingUnit; |
| unsigned int *pul_TimingInterval; |
| unsigned char *pb_InputMode; |
| unsigned char *pb_ExternGate; |
| unsigned char *pb_CycleMode; |
| unsigned char *pb_Enable; |
| unsigned char *pb_InterruptEnable; |
| |
| i_ReturnValue = insn->n; |
| b_ModulNbr = CR_AREF(insn->chanspec); |
| b_TorCounter = CR_CHAN(insn->chanspec); |
| |
| pb_TimingUnit = (unsigned char *) &data[0]; |
| pul_TimingInterval = (unsigned int *) &data[1]; |
| pb_InputMode = (unsigned char *) &data[2]; |
| pb_ExternGate = (unsigned char *) &data[3]; |
| pb_CycleMode = (unsigned char *) &data[4]; |
| pb_Enable = (unsigned char *) &data[5]; |
| pb_InterruptEnable = (unsigned char *) &data[6]; |
| |
| /**************************/ |
| /* Test the module number */ |
| /**************************/ |
| |
| if (b_ModulNbr < 4) { |
| /***********************/ |
| /* Test if tor counter */ |
| /***********************/ |
| |
| if ((devpriv->s_BoardInfos. |
| dw_MolduleConfiguration[b_ModulNbr] & |
| 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { |
| /**********************************/ |
| /* Test the tor counter selection */ |
| /**********************************/ |
| |
| if (b_TorCounter <= 1) { |
| |
| /***********************************/ |
| /* Test if tor counter initialised */ |
| /***********************************/ |
| |
| dw_Status = inl(devpriv->s_BoardInfos. |
| ui_Address + 8 + (16 * b_TorCounter) + |
| (64 * b_ModulNbr)); |
| |
| if (dw_Status & 0x10) { |
| *pb_Enable = dw_Status & 1; |
| |
| /********************/ |
| /* Get the commando */ |
| /********************/ |
| |
| dw_Status = inl(devpriv->s_BoardInfos. |
| ui_Address + 4 + |
| (16 * b_TorCounter) + |
| (64 * b_ModulNbr)); |
| |
| *pb_CycleMode = |
| (unsigned char) ((dw_Status >> 4) & 1); |
| *pb_InterruptEnable = |
| (unsigned char) ((dw_Status >> 5) & 1); |
| |
| /******************************************************/ |
| /* Test if extern gate used for clock or for signal B */ |
| /******************************************************/ |
| |
| if (dw_Status & 0x600) { |
| /*****************************************/ |
| /* Test if extern gate used for signal B */ |
| /*****************************************/ |
| |
| if (dw_Status & 0x400) { |
| /***********************/ |
| /* Test if simple mode */ |
| /***********************/ |
| |
| if ((dw_Status & 0x7800) |
| == 0x7800) { |
| *pb_InputMode = |
| APCI1710_TOR_SIMPLE_MODE; |
| } |
| |
| /***********************/ |
| /* Test if double mode */ |
| /***********************/ |
| |
| if ((dw_Status & 0x7800) |
| == 0x1800) { |
| *pb_InputMode = |
| APCI1710_TOR_DOUBLE_MODE; |
| } |
| |
| /**************************/ |
| /* Test if quadruple mode */ |
| /**************************/ |
| |
| if ((dw_Status & 0x7800) |
| == 0x0000) { |
| *pb_InputMode = |
| APCI1710_TOR_QUADRUPLE_MODE; |
| } |
| } /* if (dw_Status & 0x400) */ |
| else { |
| *pb_InputMode = 1; |
| } /* // if (dw_Status & 0x400) */ |
| |
| /************************/ |
| /* Extern gate not used */ |
| /************************/ |
| |
| *pb_ExternGate = 0; |
| } /* if (dw_Status & 0x600) */ |
| else { |
| *pb_InputMode = |
| (unsigned char) ((dw_Status >> 6) |
| & 1); |
| *pb_ExternGate = |
| (unsigned char) ((dw_Status >> 7) |
| & 1); |
| } /* if (dw_Status & 0x600) */ |
| |
| *pb_TimingUnit = |
| devpriv-> |
| s_ModuleInfo[b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo[b_TorCounter]. |
| b_TimingUnit; |
| |
| *pul_TimingInterval = |
| devpriv-> |
| s_ModuleInfo[b_ModulNbr]. |
| s_TorCounterModuleInfo. |
| s_TorCounterInfo[b_TorCounter]. |
| ul_RealTimingInterval; |
| } else { |
| /*******************************/ |
| /* Tor counter not initialised */ |
| /*******************************/ |
| |
| DPRINTK("Tor counter not initialised\n"); |
| i_ReturnValue = -5; |
| } |
| |
| } /* if (b_TorCounter <= 1) */ |
| else { |
| /**********************************/ |
| /* Tor counter selection is wrong */ |
| /**********************************/ |
| |
| DPRINTK("Tor counter selection is wrong \n"); |
| i_ReturnValue = -4; |
| } /* if (b_TorCounter <= 1) */ |
| } else { |
| /******************************************/ |
| /* The module is not a tor counter module */ |
| /******************************************/ |
| |
| DPRINTK("The module is not a tor counter module\n"); |
| i_ReturnValue = -3; |
| } |
| } else { |
| /***********************/ |
| /* Module number error */ |
| /***********************/ |
| |
| DPRINTK("Module number error\n"); |
| i_ReturnValue = -2; |
| } |
| |
| return i_ReturnValue; |
| } |
| |
| /* |
| +----------------------------------------------------------------------------+ |
| | Function Name : _INT_ i_APCI1710_ReadTorCounterValue | |
| | (unsigned char_ b_BoardHandle, | |
| | unsigned char_ b_ModulNbr, | |
| | unsigned char_ b_TorCounter, | |
| | unsigned int_ ui_TimeOut, | |
| | unsigned char *_ pb_TorCounterStatus, | |
| | PULONG_ pul_TorCounterValue) | |
| +----------------------------------------------------------------------------+ |
| | Task case APCI1710_TOR_GETPROGRESSSTATUS: Return the tor counter |
| (b_TorCounter) status (pb_TorCounterStatus) from selected tor counter | |
| | module (b_ModulNbr). |
| |
| case APCI1710_TOR_GETCOUNTERVALUE : |
| Return the tor counter (b_TorCounter) status | |
| | (pb_TorCounterStatus) and the timing value | |
| | (pul_TorCounterValue) after a conting cycle stop | |
| | from selected tor counter module (b_ModulNbr). | |
| +----------------------------------------------------------------------------+ |
| | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | |
| | unsigned char_ b_ModulNbr : Selected module number (0 to 3) | |
| | unsigned char_ b_TorCounter : Tor counter selection (0 or 1). |
| b_ModulNbr = CR_AREF(insn->chanspec); |
| b_ReadType = (unsigned char) data[0]; |
| b_TorCounter = (unsigned char) data[1]; |
| ui_TimeOut = (unsigned int) data[2]; | |
| +----------------------------------------------------------------------------+ |
| | Output Parameters : unsigned char *_ pb_TorCounterStatus : Return the tor counter | |
| | status. | |
| | 0 : Conting cycle not started| |
| | Software gate not set. | |
| | 1 : Conting cycle started. | |
| | Software gate set. | |
| | 2 : Conting cycle stopped. | |
| | The conting cycle is | |
| | terminate. | |
| | 3 : A overflow occur. You | |
| | must change the base | |
| | timing witch the | |
| | function | |
| | "i_APCI1710_InitTorCounter"| |
| | 4 : Timeeout occur | |
| | unsigned int * pul_TorCounterValue : Tor counter value. |
| pb_TorCounterStatus=(unsigned char *) &data[0]; |
| pul_TorCounterValue=(unsigned int *) &data[1]; | |
| +----------------------------------------------------------------------------+ |
| | Return Value : 0: No error | |
| | -1: The handle parameter of the board is wrong | |
| | -2: Module selection wrong | |
| | -3: The module is not a tor counter module | |
| | -4: Tor counter selection is wrong | |
| | -5: Tor counter not initialised see function | |
| | "i_APCI1710_InitTorCounter" | |
| | -6: Tor counter not enabled see function | |
| | "i_APCI1710_EnableTorCounter" | |
| | -7: Timeout parameter is wrong (0 to 65535) | |
| +----------------------------------------------------------------------------+ |
| */ |
| |
| static int i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue(struct comedi_device *dev, |
| struct comedi_subdevice *s, |
| struct comedi_insn *insn, |
| unsigned int *data) |
| { |
| struct addi_private *devpriv = dev->private; |
| int i_ReturnValue = 0; |
| unsigned int dw_Status; |
| unsigned int dw_TimeOut = 0; |
| unsigned char b_ModulNbr; |
| unsigned char b_TorCounter; |
| unsigned char b_ReadType; |
| unsigned int ui_TimeOut; |
| unsigned char *pb_TorCounterStatus; |
| unsigned int *pul_TorCounterValue; |
| |
| i_ReturnValue = insn->n; |
| b_ModulNbr = CR_AREF(insn->chanspec); |
| b_ReadType = (unsigned char) data[0]; |
| b_TorCounter = (unsigned char) data[1]; |
| ui_TimeOut = (unsigned int) data[2]; |
| pb_TorCounterStatus = (unsigned char *) &data[0]; |
| pul_TorCounterValue = (unsigned int *) &data[1]; |
| |
| /**************************/ |
| /* Test the module number */ |
| /**************************/ |
| |
| if (b_ReadType == APCI1710_TOR_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; |
| |
| return insn->n; |
| } |
| |
| if (b_ModulNbr < 4) { |
| /***********************/ |
| /* Test if tor counter */ |
| /***********************/ |
| |
| if ((devpriv->s_BoardInfos. |
| dw_MolduleConfiguration[b_ModulNbr] & |
| 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { |
| /**********************************/ |
| /* Test the tor counter selection */ |
| /**********************************/ |
| |
| if (b_TorCounter <= 1) { |
| /***********************************/ |
| /* Test if tor counter initialised */ |
| /***********************************/ |
| |
| dw_Status = inl(devpriv->s_BoardInfos. |
| ui_Address + 8 + (16 * b_TorCounter) + |
| (64 * b_ModulNbr)); |
| |
| /*******************************/ |
| /* Test if counter initialised */ |
| /*******************************/ |
| |
| if (dw_Status & 0x10) { |
| /***************************/ |
| /* Test if counter enabled */ |
| /***************************/ |
| |
| if (dw_Status & 0x1) { |
| |
| switch (b_ReadType) { |
| |
| case APCI1710_TOR_GETPROGRESSSTATUS: |
| /*******************/ |
| /* Read the status */ |
| /*******************/ |
| |
| dw_Status = |
| inl(devpriv-> |
| s_BoardInfos. |
| ui_Address + 4 + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| dw_Status = |
| dw_Status & 0xF; |
| |
| /*****************/ |
| /* Test if start */ |
| /*****************/ |
| |
| if (dw_Status & 1) { |
| if (dw_Status & |
| 2) { |
| if (dw_Status & 4) { |
| /************************/ |
| /* Tor counter overflow */ |
| /************************/ |
| |
| *pb_TorCounterStatus |
| = |
| 3; |
| } else { |
| /***********************/ |
| /* Tor counter started */ |
| /***********************/ |
| |
| *pb_TorCounterStatus |
| = |
| 2; |
| } |
| } else { |
| /***********************/ |
| /* Tor counter started */ |
| /***********************/ |
| |
| *pb_TorCounterStatus |
| = |
| 1; |
| } |
| } else { |
| /***************************/ |
| /* Tor counter not started */ |
| /***************************/ |
| |
| *pb_TorCounterStatus |
| = 0; |
| } |
| break; |
| |
| case APCI1710_TOR_GETCOUNTERVALUE: |
| |
| /*****************************/ |
| /* Test the timout parameter */ |
| /*****************************/ |
| |
| if ((ui_TimeOut >= 0) |
| && (ui_TimeOut |
| <= |
| 65535UL)) |
| { |
| for (;;) { |
| /*******************/ |
| /* Read the status */ |
| /*******************/ |
| |
| dw_Status |
| = |
| inl |
| (devpriv-> |
| s_BoardInfos. |
| ui_Address |
| + |
| 4 |
| + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| /********************/ |
| /* Test if overflow */ |
| /********************/ |
| |
| if ((dw_Status & 4) == 4) { |
| /******************/ |
| /* Overflow occur */ |
| /******************/ |
| |
| *pb_TorCounterStatus |
| = |
| 3; |
| |
| /******************/ |
| /* Read the value */ |
| /******************/ |
| |
| *pul_TorCounterValue |
| = |
| inl |
| (devpriv-> |
| s_BoardInfos. |
| ui_Address |
| + |
| 0 |
| + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| break; |
| } /* if ((dw_Status & 4) == 4) */ |
| else { |
| /*******************************/ |
| /* Test if measurement stopped */ |
| /*******************************/ |
| |
| if ((dw_Status & 2) == 2) { |
| /***********************/ |
| /* A stop signal occur */ |
| /***********************/ |
| |
| *pb_TorCounterStatus |
| = |
| 2; |
| |
| /******************/ |
| /* Read the value */ |
| /******************/ |
| |
| *pul_TorCounterValue |
| = |
| inl |
| (devpriv-> |
| s_BoardInfos. |
| ui_Address |
| + |
| 0 |
| + |
| (16 * b_TorCounter) + (64 * b_ModulNbr)); |
| |
| break; |
| } /* if ((dw_Status & 2) == 2) */ |
| else { |
| /*******************************/ |
| /* Test if measurement started */ |
| /*******************************/ |
| |
| if ((dw_Status & 1) == 1) { |
| /************************/ |
| /* A start signal occur */ |
| /************************/ |
| |
| *pb_TorCounterStatus |
| = |
| 1; |
| } /* if ((dw_Status & 1) == 1) */ |
| else { |
| /***************************/ |
| /* Measurement not started */ |
| /***************************/ |
| |
| *pb_TorCounterStatus |
| = |
| 0; |
| } /* if ((dw_Status & 1) == 1) */ |
| } /* if ((dw_Status & 2) == 2) */ |
| } /* if ((dw_Status & 8) == 8) */ |
| |
| if (dw_TimeOut == ui_TimeOut) { |
| /*****************/ |
| /* Timeout occur */ |
| /*****************/ |
| |
| break; |
| } else { |
| /*************************/ |
| /* Increment the timeout */ |
| /*************************/ |
| |
| dw_TimeOut |
| = |
| dw_TimeOut |
| + |
| 1; |
| |
| mdelay(1000); |
| } |
| } /* for (;;) */ |
| |
| /*************************/ |
| /* Test if timeout occur */ |
| /*************************/ |
| |
| if ((*pb_TorCounterStatus != 3) && (dw_TimeOut == ui_TimeOut) && (ui_TimeOut != 0)) { |
| /*****************/ |
| /* Timeout occur */ |
| /*****************/ |
| |
| *pb_TorCounterStatus |
| = |
| 4; |
| } |
| } else { |
| /******************************/ |
| /* Timeout parameter is wrong */ |
| /******************************/ |
| |
| DPRINTK("Timeout parameter is wrong\n"); |
| i_ReturnValue = |
| -7; |
| } |
| break; |
| |
| default: |
| printk("Inputs wrong\n"); |
| } /* switch end */ |
| } /* if (dw_Status & 0x1) */ |
| else { |
| /***************************/ |
| /* Tor counter not enabled */ |
| /***************************/ |
| |
| DPRINTK("Tor counter not enabled\n"); |
| i_ReturnValue = -6; |
| } /* if (dw_Status & 0x1) */ |
| } else { |
| /*******************************/ |
| /* Tor counter not initialised */ |
| /*******************************/ |
| |
| DPRINTK("Tor counter not initialised\n"); |
| i_ReturnValue = -5; |
| } |
| } /* if (b_TorCounter <= 1) */ |
| else { |
| /**********************************/ |
| /* Tor counter selection is wrong */ |
| /**********************************/ |
| |
| DPRINTK("Tor counter selection is wrong\n"); |
| i_ReturnValue = -4; |
| } /* if (b_TorCounter <= 1) */ |
| } else { |
| /******************************************/ |
| /* The module is not a tor counter module */ |
| /******************************************/ |
| |
| DPRINTK("The module is not a tor counter module\n"); |
| i_ReturnValue = -3; |
| } |
| } else { |
| /***********************/ |
| /* Module number error */ |
| /***********************/ |
| |
| DPRINTK("Module number error\n"); |
| i_ReturnValue = -2; |
| } |
| |
| return i_ReturnValue; |
| } |