APCI1710_INCCPT.c revision 117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9
1/** 2@verbatim 3 4Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module. 5 6 ADDI-DATA GmbH 7 Dieselstrasse 3 8 D-77833 Ottersweier 9 Tel: +19(0)7223/9493-0 10 Fax: +49(0)7223/9493-92 11 http://www.addi-data-com 12 info@addi-data.com 13 14This 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. 15 16This 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. 17 18You 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 19 20You shoud also find the complete GPL in the COPYING file accompanying this source code. 21 22@endverbatim 23*/ 24/* 25 +-----------------------------------------------------------------------+ 26 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier | 27 +-----------------------------------------------------------------------+ 28 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com | 29 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com | 30 +-----------------------------------------------------------------------+ 31 | Project : API APCI1710 | Compiler : gcc | 32 | Module name : INC_CPT.C | Version : 2.96 | 33 +-------------------------------+---------------------------------------+ 34 | Project manager: Eric Stolz | Date : 02/12/2002 | 35 +-----------------------------------------------------------------------+ 36 | Description : APCI-1710 incremental counter module | 37 | | 38 | | 39 +-----------------------------------------------------------------------+ 40 | UPDATES | 41 +-----------------------------------------------------------------------+ 42 | Date | Author | Description of updates | 43 +----------+-----------+------------------------------------------------+ 44 | | | | 45 |----------|-----------|------------------------------------------------| 46 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 | 47 | | | available | 48 +-----------------------------------------------------------------------+ 49 | 29/06/01 | Guinot C. | - 1100/0231 -> 0701/0232 | 50 | | | See i_APCI1710_DisableFrequencyMeasurement | 51 +-----------------------------------------------------------------------+ 52*/ 53 54/* 55+----------------------------------------------------------------------------+ 56| Included files | 57+----------------------------------------------------------------------------+ 58*/ 59 60#include "APCI1710_INCCPT.h" 61 62/* 63+----------------------------------------------------------------------------+ 64| int i_APCI1710_InsnConfigINCCPT(struct comedi_device *dev,struct comedi_subdevice *s, 65struct comedi_insn *insn,unsigned int *data) 66 67+----------------------------------------------------------------------------+ 68| Task : Configuration function for INC_CPT | 69+----------------------------------------------------------------------------+ 70| Input Parameters : | 71+----------------------------------------------------------------------------+ 72| Output Parameters : *data 73+----------------------------------------------------------------------------+ 74| Return Value : | 75+----------------------------------------------------------------------------+ 76*/ 77 78int i_APCI1710_InsnConfigINCCPT(struct comedi_device * dev, struct comedi_subdevice * s, 79 struct comedi_insn * insn, unsigned int * data) 80{ 81 unsigned int ui_ConfigType; 82 int i_ReturnValue = 0; 83 ui_ConfigType = CR_CHAN(insn->chanspec); 84 85 printk("\nINC_CPT"); 86 87 devpriv->tsk_Current = current; // Save the current process task structure 88 switch (ui_ConfigType) { 89 case APCI1710_INCCPT_INITCOUNTER: 90 i_ReturnValue = i_APCI1710_InitCounter(dev, 91 CR_AREF(insn->chanspec), 92 (unsigned char) data[0], 93 (unsigned char) data[1], 94 (unsigned char) data[2], (unsigned char) data[3], (unsigned char) data[4]); 95 break; 96 97 case APCI1710_INCCPT_COUNTERAUTOTEST: 98 i_ReturnValue = i_APCI1710_CounterAutoTest(dev, 99 (unsigned char *) & data[0]); 100 break; 101 102 case APCI1710_INCCPT_INITINDEX: 103 i_ReturnValue = i_APCI1710_InitIndex(dev, 104 CR_AREF(insn->chanspec), 105 (unsigned char) data[0], 106 (unsigned char) data[1], (unsigned char) data[2], (unsigned char) data[3]); 107 break; 108 109 case APCI1710_INCCPT_INITREFERENCE: 110 i_ReturnValue = i_APCI1710_InitReference(dev, 111 CR_AREF(insn->chanspec), (unsigned char) data[0]); 112 break; 113 114 case APCI1710_INCCPT_INITEXTERNALSTROBE: 115 i_ReturnValue = i_APCI1710_InitExternalStrobe(dev, 116 CR_AREF(insn->chanspec), 117 (unsigned char) data[0], (unsigned char) data[1]); 118 break; 119 120 case APCI1710_INCCPT_INITCOMPARELOGIC: 121 i_ReturnValue = i_APCI1710_InitCompareLogic(dev, 122 CR_AREF(insn->chanspec), (unsigned int) data[0]); 123 break; 124 125 case APCI1710_INCCPT_INITFREQUENCYMEASUREMENT: 126 i_ReturnValue = i_APCI1710_InitFrequencyMeasurement(dev, 127 CR_AREF(insn->chanspec), 128 (unsigned char) data[0], 129 (unsigned char) data[1], (ULONG) data[2], (PULONG) & data[0]); 130 break; 131 132 default: 133 printk("Insn Config : Config Parameter Wrong\n"); 134 135 } 136 137 if (i_ReturnValue >= 0) 138 i_ReturnValue = insn->n; 139 return (i_ReturnValue); 140} 141 142/* 143+----------------------------------------------------------------------------+ 144| Function Name : _INT_ i_APCI1710_InitCounter | 145| (unsigned char_ b_BoardHandle, | 146| unsigned char_ b_ModulNbr, | 147| unsigned char_ b_CounterRange, | 148| unsigned char_ b_FirstCounterModus, | 149| unsigned char_ b_FirstCounterOption, | 150| unsigned char_ b_SecondCounterModus, | 151| unsigned char_ b_SecondCounterOption) | 152+----------------------------------------------------------------------------+ 153| Task : Configure the counter operating mode from selected | 154| module (b_ModulNbr). You must calling this function be | 155| for you call any other function witch access of | 156| counters. | 157| | 158| Counter range | 159| ------------- | 160| +------------------------------------+-----------------------------------+ | 161| | Parameter Passed value | Description | | 162| |------------------------------------+-----------------------------------| | 163| |b_ModulNbr APCI1710_16BIT_COUNTER | The module is configured for | | 164| | | two 16-bit counter. | | 165| | | - b_FirstCounterModus and | | 166| | | b_FirstCounterOption | | 167| | | configure the first 16 bit | | 168| | | counter. | | 169| | | - b_SecondCounterModus and | | 170| | | b_SecondCounterOption | | 171| | | configure the second 16 bit | | 172| | | counter. | | 173| |------------------------------------+-----------------------------------| | 174| |b_ModulNbr APCI1710_32BIT_COUNTER | The module is configured for one | | 175| | | 32-bit counter. | | 176| | | - b_FirstCounterModus and | | 177| | | b_FirstCounterOption | | 178| | | configure the 32 bit counter. | | 179| | | - b_SecondCounterModus and | | 180| | | b_SecondCounterOption | | 181| | | are not used and have no | | 182| | | importance. | | 183| +------------------------------------+-----------------------------------+ | 184| | 185| Counter operating mode | 186| ---------------------- | 187| | 188| +--------------------+-------------------------+-------------------------+ | 189| | Parameter | Passed value | Description | | 190| |--------------------+-------------------------+-------------------------| | 191| |b_FirstCounterModus | APCI1710_QUADRUPLE_MODE | In the quadruple mode, | | 192| | or | | the edge analysis | | 193| |b_SecondCounterModus| | circuit generates a | | 194| | | | counting pulse from | | 195| | | | each edge of 2 signals | | 196| | | | which are phase shifted | | 197| | | | in relation to each | | 198| | | | other. | | 199| |--------------------+-------------------------+-------------------------| | 200| |b_FirstCounterModus | APCI1710_DOUBLE_MODE | Functions in the same | | 201| | or | | way as the quadruple | | 202| |b_SecondCounterModus| | mode, except that only | | 203| | | | two of the four edges | | 204| | | | are analysed per | | 205| | | | period | | 206| |--------------------+-------------------------+-------------------------| | 207| |b_FirstCounterModus | APCI1710_SIMPLE_MODE | Functions in the same | | 208| | or | | way as the quadruple | | 209| |b_SecondCounterModus| | mode, except that only | | 210| | | | one of the four edges | | 211| | | | is analysed per | | 212| | | | period. | | 213| |--------------------+-------------------------+-------------------------| | 214| |b_FirstCounterModus | APCI1710_DIRECT_MODE | In the direct mode the | | 215| | or | | both edge analysis | | 216| |b_SecondCounterModus| | circuits are inactive. | | 217| | | | The inputs A, B in the | | 218| | | | 32-bit mode or A, B and | | 219| | | | C, D in the 16-bit mode | | 220| | | | represent, each, one | | 221| | | | clock pulse gate circuit| | 222| | | | There by frequency and | | 223| | | | pulse duration | | 224| | | | measurements can be | | 225| | | | performed. | | 226| +--------------------+-------------------------+-------------------------+ | 227| | 228| | 229| IMPORTANT! | 230| If you have configured the module for two 16-bit counter, a mixed | 231| mode with a counter in quadruple/double/single mode | 232| and the other counter in direct mode is not possible! | 233| | 234| | 235| Counter operating option for quadruple/double/simple mode | 236| --------------------------------------------------------- | 237| | 238| +----------------------+-------------------------+------------------------+| 239| | Parameter | Passed value | Description || 240| |----------------------+-------------------------+------------------------|| 241| |b_FirstCounterOption | APCI1710_HYSTERESIS_ON | In both edge analysis || 242| | or | | circuits is available || 243| |b_SecondCounterOption | | one hysteresis circuit.|| 244| | | | It suppresses each || 245| | | | time the first counting|| 246| | | | pulse after a change || 247| | | | of rotation. || 248| |----------------------+-------------------------+------------------------|| 249| |b_FirstCounterOption | APCI1710_HYSTERESIS_OFF | The first counting || 250| | or | | pulse is not suppress || 251| |b_SecondCounterOption | | after a change of || 252| | | | rotation. || 253| +----------------------+-------------------------+------------------------+| 254| | 255| | 256| IMPORTANT! | 257| This option are only avaible if you have selected the direct mode. | 258| | 259| | 260| Counter operating option for direct mode | 261| ---------------------------------------- | 262| | 263| +----------------------+--------------------+----------------------------+ | 264| | Parameter | Passed value | Description | | 265| |----------------------+--------------------+----------------------------| | 266| |b_FirstCounterOption | APCI1710_INCREMENT | The counter increment for | | 267| | or | | each counting pulse | | 268| |b_SecondCounterOption | | | | 269| |----------------------+--------------------+----------------------------| | 270| |b_FirstCounterOption | APCI1710_DECREMENT | The counter decrement for | | 271| | or | | each counting pulse | | 272| |b_SecondCounterOption | | | | 273| +----------------------+--------------------+----------------------------+ | 274| | 275+----------------------------------------------------------------------------+ 276| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710| 277| unsigned char_ b_ModulNbr : Module number to | 278| configure (0 to 3) | 279| unsigned char_ b_CounterRange : Selection form counter | 280| range. | 281| unsigned char_ b_FirstCounterModus : First counter operating | 282| mode. | 283| unsigned char_ b_FirstCounterOption : First counter option. | 284| unsigned char_ b_SecondCounterModus : Second counter operating | 285| mode. | 286| unsigned char_ b_SecondCounterOption : Second counter option. | 287+----------------------------------------------------------------------------+ 288| Output Parameters : - | 289+----------------------------------------------------------------------------+ 290| Return Value : 0: No error | 291| -1: The handle parameter of the board is wrong | 292| -2: The module is not a counter module | 293| -3: The selected counter range is wrong. | 294| -4: The selected first counter operating mode is wrong. | 295| -5: The selected first counter operating option is wrong| 296| -6: The selected second counter operating mode is wrong.| 297| -7: The selected second counter operating option is | 298| wrong. | 299+----------------------------------------------------------------------------+ 300*/ 301 302int i_APCI1710_InitCounter(struct comedi_device * dev, 303 unsigned char b_ModulNbr, 304 unsigned char b_CounterRange, 305 unsigned char b_FirstCounterModus, 306 unsigned char b_FirstCounterOption, 307 unsigned char b_SecondCounterModus, unsigned char b_SecondCounterOption) 308{ 309 int i_ReturnValue = 0; 310 311 /*******************************/ 312 /* Test if incremental counter */ 313 /*******************************/ 314 315 if ((devpriv->s_BoardInfos. 316 dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF0000UL) == 317 APCI1710_INCREMENTAL_COUNTER) { 318 /**************************/ 319 /* Test the counter range */ 320 /**************************/ 321 322 if (b_CounterRange == APCI1710_16BIT_COUNTER 323 || b_CounterRange == APCI1710_32BIT_COUNTER) { 324 /********************************/ 325 /* Test the first counter modus */ 326 /********************************/ 327 328 if (b_FirstCounterModus == APCI1710_QUADRUPLE_MODE || 329 b_FirstCounterModus == APCI1710_DOUBLE_MODE || 330 b_FirstCounterModus == APCI1710_SIMPLE_MODE || 331 b_FirstCounterModus == APCI1710_DIRECT_MODE) { 332 /*********************************/ 333 /* Test the first counter option */ 334 /*********************************/ 335 336 if ((b_FirstCounterModus == APCI1710_DIRECT_MODE 337 && (b_FirstCounterOption == 338 APCI1710_INCREMENT 339 || b_FirstCounterOption 340 == APCI1710_DECREMENT)) 341 || (b_FirstCounterModus != 342 APCI1710_DIRECT_MODE 343 && (b_FirstCounterOption == 344 APCI1710_HYSTERESIS_ON 345 || b_FirstCounterOption 346 == 347 APCI1710_HYSTERESIS_OFF))) 348 { 349 /**************************/ 350 /* Test if 16-bit counter */ 351 /**************************/ 352 353 if (b_CounterRange == 354 APCI1710_16BIT_COUNTER) { 355 /*********************************/ 356 /* Test the second counter modus */ 357 /*********************************/ 358 359 if ((b_FirstCounterModus != 360 APCI1710_DIRECT_MODE 361 && 362 (b_SecondCounterModus 363 == 364 APCI1710_QUADRUPLE_MODE 365 || 366 b_SecondCounterModus 367 == 368 APCI1710_DOUBLE_MODE 369 || 370 b_SecondCounterModus 371 == 372 APCI1710_SIMPLE_MODE)) 373 || (b_FirstCounterModus 374 == 375 APCI1710_DIRECT_MODE 376 && 377 b_SecondCounterModus 378 == 379 APCI1710_DIRECT_MODE)) 380 { 381 /**********************************/ 382 /* Test the second counter option */ 383 /**********************************/ 384 385 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))) { 386 i_ReturnValue = 387 0; 388 } else { 389 /*********************************************************/ 390 /* The selected second counter operating option is wrong */ 391 /*********************************************************/ 392 393 DPRINTK("The selected second counter operating option is wrong\n"); 394 i_ReturnValue = 395 -7; 396 } 397 } else { 398 /*******************************************************/ 399 /* The selected second counter operating mode is wrong */ 400 /*******************************************************/ 401 402 DPRINTK("The selected second counter operating mode is wrong\n"); 403 i_ReturnValue = -6; 404 } 405 } 406 } else { 407 /********************************************************/ 408 /* The selected first counter operating option is wrong */ 409 /********************************************************/ 410 411 DPRINTK("The selected first counter operating option is wrong\n"); 412 i_ReturnValue = -5; 413 } 414 } else { 415 /******************************************************/ 416 /* The selected first counter operating mode is wrong */ 417 /******************************************************/ 418 DPRINTK("The selected first counter operating mode is wrong\n"); 419 i_ReturnValue = -4; 420 } 421 } else { 422 /***************************************/ 423 /* The selected counter range is wrong */ 424 /***************************************/ 425 426 DPRINTK("The selected counter range is wrong\n"); 427 i_ReturnValue = -3; 428 } 429 430 /*************************/ 431 /* Test if a error occur */ 432 /*************************/ 433 434 if (i_ReturnValue == 0) { 435 /**************************/ 436 /* Test if 16-Bit counter */ 437 /**************************/ 438 439 if (b_CounterRange == APCI1710_32BIT_COUNTER) { 440 devpriv-> 441 s_ModuleInfo[b_ModulNbr]. 442 s_SiemensCounterInfo. 443 s_ModeRegister. 444 s_ByteModeRegister. 445 b_ModeRegister1 = b_CounterRange | 446 b_FirstCounterModus | 447 b_FirstCounterOption; 448 } else { 449 devpriv-> 450 s_ModuleInfo[b_ModulNbr]. 451 s_SiemensCounterInfo. 452 s_ModeRegister. 453 s_ByteModeRegister. 454 b_ModeRegister1 = b_CounterRange | 455 (b_FirstCounterModus & 0x5) | 456 (b_FirstCounterOption & 0x20) | 457 (b_SecondCounterModus & 0xA) | 458 (b_SecondCounterOption & 0x40); 459 460 /***********************/ 461 /* Test if direct mode */ 462 /***********************/ 463 464 if (b_FirstCounterModus == APCI1710_DIRECT_MODE) { 465 devpriv-> 466 s_ModuleInfo[b_ModulNbr]. 467 s_SiemensCounterInfo. 468 s_ModeRegister. 469 s_ByteModeRegister. 470 b_ModeRegister1 = devpriv-> 471 s_ModuleInfo[b_ModulNbr]. 472 s_SiemensCounterInfo. 473 s_ModeRegister. 474 s_ByteModeRegister. 475 b_ModeRegister1 | 476 APCI1710_DIRECT_MODE; 477 } 478 } 479 480 /***************************/ 481 /* Write the configuration */ 482 /***************************/ 483 484 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 485 s_SiemensCounterInfo. 486 s_ModeRegister. 487 dw_ModeRegister1_2_3_4, 488 devpriv->s_BoardInfos. 489 ui_Address + 20 + (64 * b_ModulNbr)); 490 491 devpriv-> 492 s_ModuleInfo[b_ModulNbr]. 493 s_SiemensCounterInfo. 494 s_InitFlag.b_CounterInit = 1; 495 } 496 } else { 497 /**************************************/ 498 /* The module is not a counter module */ 499 /**************************************/ 500 501 DPRINTK("The module is not a counter module\n"); 502 i_ReturnValue = -2; 503 } 504 505 return (i_ReturnValue); 506} 507 508/* 509+----------------------------------------------------------------------------+ 510| Function Name : _INT_ i_APCI1710_CounterAutoTest | 511| (unsigned char_ b_BoardHandle, | 512| unsigned char *_ pb_TestStatus) | 513+----------------------------------------------------------------------------+ 514| Task : A test mode is intended for testing the component and | 515| the connected periphery. All the 8-bit counter chains | 516| are operated internally as down counters. | 517| Independently from the external signals, | 518| all the four 8-bit counter chains are decremented in | 519| parallel by each negative clock pulse edge of CLKX. | 520| | 521| Counter auto test conclusion | 522| ---------------------------- | 523| +-----------------+-----------------------------+ | 524| | pb_TestStatus | Error description | | 525| | mask | | | 526| |-----------------+-----------------------------| | 527| | 0000 | No error detected | | 528| |-----------------|-----------------------------| | 529| | 0001 | Error detected of counter 0 | | 530| |-----------------|-----------------------------| | 531| | 0010 | Error detected of counter 1 | | 532| |-----------------|-----------------------------| | 533| | 0100 | Error detected of counter 2 | | 534| |-----------------|-----------------------------| | 535| | 1000 | Error detected of counter 3 | | 536| +-----------------+-----------------------------+ | 537+----------------------------------------------------------------------------+ 538| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | | 539+----------------------------------------------------------------------------+ 540| Output Parameters : unsigned char *_ pb_TestStatus : Auto test conclusion. See table| 541+----------------------------------------------------------------------------+ 542| Return Value : 0: No error | 543| -1: The handle parameter of the board is wrong | 544| -2: No counter module found | 545+----------------------------------------------------------------------------+ 546*/ 547 548int i_APCI1710_CounterAutoTest(struct comedi_device * dev, unsigned char * pb_TestStatus) 549{ 550 unsigned char b_ModulCpt = 0; 551 int i_ReturnValue = 0; 552 DWORD dw_LathchValue; 553 554 *pb_TestStatus = 0; 555 556 /********************************/ 557 /* Test if counter module found */ 558 /********************************/ 559 560 if ((devpriv->s_BoardInfos. 561 dw_MolduleConfiguration[0] & 0xFFFF0000UL) == 562 APCI1710_INCREMENTAL_COUNTER 563 || (devpriv->s_BoardInfos. 564 dw_MolduleConfiguration[1] & 0xFFFF0000UL) == 565 APCI1710_INCREMENTAL_COUNTER 566 || (devpriv->s_BoardInfos. 567 dw_MolduleConfiguration[2] & 0xFFFF0000UL) == 568 APCI1710_INCREMENTAL_COUNTER 569 || (devpriv->s_BoardInfos. 570 dw_MolduleConfiguration[3] & 0xFFFF0000UL) == 571 APCI1710_INCREMENTAL_COUNTER) { 572 for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) { 573 /*******************************/ 574 /* Test if incremental counter */ 575 /*******************************/ 576 577 if ((devpriv->s_BoardInfos. 578 dw_MolduleConfiguration[b_ModulCpt] & 579 0xFFFF0000UL) == 580 APCI1710_INCREMENTAL_COUNTER) { 581 /******************/ 582 /* Start the test */ 583 /******************/ 584 585 outl(3, devpriv->s_BoardInfos. 586 ui_Address + 16 + (64 * b_ModulCpt)); 587 588 /*********************/ 589 /* Tatch the counter */ 590 /*********************/ 591 592 outl(1, devpriv->s_BoardInfos. 593 ui_Address + (64 * b_ModulCpt)); 594 595 /************************/ 596 /* Read the latch value */ 597 /************************/ 598 599 dw_LathchValue = inl(devpriv->s_BoardInfos. 600 ui_Address + 4 + (64 * b_ModulCpt)); 601 602 if ((dw_LathchValue & 0xFF) != 603 ((dw_LathchValue >> 8) & 0xFF) 604 && (dw_LathchValue & 0xFF) != 605 ((dw_LathchValue >> 16) & 0xFF) 606 && (dw_LathchValue & 0xFF) != 607 ((dw_LathchValue >> 24) & 0xFF)) { 608 *pb_TestStatus = 609 *pb_TestStatus | (1 << 610 b_ModulCpt); 611 } 612 613 /*****************/ 614 /* Stop the test */ 615 /*****************/ 616 617 outl(0, devpriv->s_BoardInfos. 618 ui_Address + 16 + (64 * b_ModulCpt)); 619 } 620 } 621 } else { 622 /***************************/ 623 /* No counter module found */ 624 /***************************/ 625 626 DPRINTK("No counter module found\n"); 627 i_ReturnValue = -2; 628 } 629 630 return (i_ReturnValue); 631} 632 633/* 634+----------------------------------------------------------------------------+ 635| Function Name : _INT_ i_APCI1710_InitIndex (unsigned char_ b_BoardHandle, | 636| unsigned char_ b_ModulNbr, | 637| unsigned char_ b_ReferenceAction, | 638| unsigned char_ b_IndexOperation, | 639| unsigned char_ b_AutoMode, | 640| unsigned char_ b_InterruptEnable) | 641+----------------------------------------------------------------------------+ 642| Task : Initialise the index corresponding to the selected | 643| module (b_ModulNbr). If a INDEX flag occur, you have | 644| the possibility to clear the 32-Bit counter or to latch| 645| the current 32-Bit value in to the first latch | 646| register. The b_IndexOperation parameter give the | 647| possibility to choice the INDEX action. | 648| If you have enabled the automatic mode, each INDEX | 649| action is cleared automatically, else you must read | 650| the index status ("i_APCI1710_ReadIndexStatus") | 651| after each INDEX action. | 652| | 653| | 654| Index action | 655| ------------ | 656| | 657| +------------------------+------------------------------------+ | 658| | b_IndexOperation | Operation | | 659| |------------------------+------------------------------------| | 660| |APCI1710_LATCH_COUNTER | After a index signal, the counter | | 661| | | value (32-Bit) is latched in to | | 662| | | the first latch register | | 663| |------------------------|------------------------------------| | 664| |APCI1710_CLEAR_COUNTER | After a index signal, the counter | | 665| | | value is cleared (32-Bit) | | 666| +------------------------+------------------------------------+ | 667+----------------------------------------------------------------------------+ 668| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 669| unsigned char_ b_ModulNbr : Module number to configure | 670| (0 to 3) | 671| unsigned char_ b_ReferenceAction : Determine if the reference | 672| must set or no for the | 673| acceptance from index | 674| APCI1710_ENABLE : | 675| Reference must be set for | 676| accepted the index | 677| APCI1710_DISABLE : | 678| Reference have not | 679| importance | 680| unsigned char_ b_IndexOperation : Index operating mode. | 681| See table. | 682| unsigned char_ b_AutoMode : Enable or disable the | 683| automatic index reset. | 684| APCI1710_ENABLE : | 685| Enable the automatic mode | 686| APCI1710_DISABLE : | 687| Disable the automatic mode | 688| unsigned char_ b_InterruptEnable : Enable or disable the | 689| interrupt. | 690| APCI1710_ENABLE : | 691| Enable the interrupt | 692| APCI1710_DISABLE : | 693| Disable the interrupt | 694+----------------------------------------------------------------------------+ 695| Output Parameters : - | 696+----------------------------------------------------------------------------+ 697| Return Value : 0: No error | 698| -1: The handle parameter of the board is wrong | 699| -2: No counter module found | 700| -3: Counter not initialised see function | 701| "i_APCI1710_InitCounter" | 702| -4 The reference action parameter is wrong | 703| -5: The index operating mode parameter is wrong | 704| -6: The auto mode parameter is wrong | 705| -7: Interrupt parameter is wrong | 706| -8: Interrupt function not initialised. | 707| See function "i_APCI1710_SetBoardIntRoutineX" | 708+----------------------------------------------------------------------------+ 709*/ 710 711int i_APCI1710_InitIndex(struct comedi_device * dev, 712 unsigned char b_ModulNbr, 713 unsigned char b_ReferenceAction, 714 unsigned char b_IndexOperation, unsigned char b_AutoMode, unsigned char b_InterruptEnable) 715{ 716 int i_ReturnValue = 0; 717 718 /**************************/ 719 /* Test the module number */ 720 /**************************/ 721 722 if (b_ModulNbr < 4) { 723 /*******************************/ 724 /* Test if counter initialised */ 725 /*******************************/ 726 727 if (devpriv-> 728 s_ModuleInfo[b_ModulNbr]. 729 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 730 /********************************/ 731 /* Test the reference parameter */ 732 /********************************/ 733 734 if (b_ReferenceAction == APCI1710_ENABLE || 735 b_ReferenceAction == APCI1710_DISABLE) { 736 /****************************/ 737 /* Test the index parameter */ 738 /****************************/ 739 740 if (b_IndexOperation == 741 APCI1710_HIGH_EDGE_LATCH_COUNTER 742 || b_IndexOperation == 743 APCI1710_LOW_EDGE_LATCH_COUNTER 744 || b_IndexOperation == 745 APCI1710_HIGH_EDGE_CLEAR_COUNTER 746 || b_IndexOperation == 747 APCI1710_LOW_EDGE_CLEAR_COUNTER 748 || b_IndexOperation == 749 APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER 750 || b_IndexOperation == 751 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 752 { 753 /********************************/ 754 /* Test the auto mode parameter */ 755 /********************************/ 756 757 if (b_AutoMode == APCI1710_ENABLE || 758 b_AutoMode == APCI1710_DISABLE) 759 { 760 /***************************/ 761 /* Test the interrupt mode */ 762 /***************************/ 763 764 if (b_InterruptEnable == 765 APCI1710_ENABLE 766 || b_InterruptEnable == 767 APCI1710_DISABLE) { 768 769 /************************************/ 770 /* Makte the configuration commando */ 771 /************************************/ 772 773 if (b_ReferenceAction == 774 APCI1710_ENABLE) 775 { 776 devpriv-> 777 s_ModuleInfo 778 [b_ModulNbr]. 779 s_SiemensCounterInfo. 780 s_ModeRegister. 781 s_ByteModeRegister. 782 b_ModeRegister2 783 = 784 devpriv-> 785 s_ModuleInfo 786 [b_ModulNbr]. 787 s_SiemensCounterInfo. 788 s_ModeRegister. 789 s_ByteModeRegister. 790 b_ModeRegister2 791 | 792 APCI1710_ENABLE_INDEX_ACTION; 793 } else { 794 devpriv-> 795 s_ModuleInfo 796 [b_ModulNbr]. 797 s_SiemensCounterInfo. 798 s_ModeRegister. 799 s_ByteModeRegister. 800 b_ModeRegister2 801 = 802 devpriv-> 803 s_ModuleInfo 804 [b_ModulNbr]. 805 s_SiemensCounterInfo. 806 s_ModeRegister. 807 s_ByteModeRegister. 808 b_ModeRegister2 809 & 810 APCI1710_DISABLE_INDEX_ACTION; 811 } 812 813 /****************************************/ 814 /* Test if low level latch or/and clear */ 815 /****************************************/ 816 817 if (b_IndexOperation == 818 APCI1710_LOW_EDGE_LATCH_COUNTER 819 || 820 b_IndexOperation 821 == 822 APCI1710_LOW_EDGE_CLEAR_COUNTER 823 || 824 b_IndexOperation 825 == 826 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 827 { 828 /*************************************/ 829 /* Set the index level to low (DQ26) */ 830 /*************************************/ 831 832 devpriv-> 833 s_ModuleInfo 834 [b_ModulNbr]. 835 s_SiemensCounterInfo. 836 s_ModeRegister. 837 s_ByteModeRegister. 838 b_ModeRegister4 839 = 840 devpriv-> 841 s_ModuleInfo 842 [b_ModulNbr]. 843 s_SiemensCounterInfo. 844 s_ModeRegister. 845 s_ByteModeRegister. 846 b_ModeRegister4 847 | 848 APCI1710_SET_LOW_INDEX_LEVEL; 849 } else { 850 /**************************************/ 851 /* Set the index level to high (DQ26) */ 852 /**************************************/ 853 854 devpriv-> 855 s_ModuleInfo 856 [b_ModulNbr]. 857 s_SiemensCounterInfo. 858 s_ModeRegister. 859 s_ByteModeRegister. 860 b_ModeRegister4 861 = 862 devpriv-> 863 s_ModuleInfo 864 [b_ModulNbr]. 865 s_SiemensCounterInfo. 866 s_ModeRegister. 867 s_ByteModeRegister. 868 b_ModeRegister4 869 & 870 APCI1710_SET_HIGH_INDEX_LEVEL; 871 } 872 873 /***********************************/ 874 /* Test if latch and clear counter */ 875 /***********************************/ 876 877 if (b_IndexOperation == 878 APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER 879 || 880 b_IndexOperation 881 == 882 APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 883 { 884 /***************************************/ 885 /* Set the latch and clear flag (DQ27) */ 886 /***************************************/ 887 888 devpriv-> 889 s_ModuleInfo 890 [b_ModulNbr]. 891 s_SiemensCounterInfo. 892 s_ModeRegister. 893 s_ByteModeRegister. 894 b_ModeRegister4 895 = 896 devpriv-> 897 s_ModuleInfo 898 [b_ModulNbr]. 899 s_SiemensCounterInfo. 900 s_ModeRegister. 901 s_ByteModeRegister. 902 b_ModeRegister4 903 | 904 APCI1710_ENABLE_LATCH_AND_CLEAR; 905 } // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 906 else { 907 /*****************************************/ 908 /* Clear the latch and clear flag (DQ27) */ 909 /*****************************************/ 910 911 devpriv-> 912 s_ModuleInfo 913 [b_ModulNbr]. 914 s_SiemensCounterInfo. 915 s_ModeRegister. 916 s_ByteModeRegister. 917 b_ModeRegister4 918 = 919 devpriv-> 920 s_ModuleInfo 921 [b_ModulNbr]. 922 s_SiemensCounterInfo. 923 s_ModeRegister. 924 s_ByteModeRegister. 925 b_ModeRegister4 926 & 927 APCI1710_DISABLE_LATCH_AND_CLEAR; 928 929 /*************************/ 930 /* Test if latch counter */ 931 /*************************/ 932 933 if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_COUNTER) { 934 /*********************************/ 935 /* Enable the latch from counter */ 936 /*********************************/ 937 938 devpriv-> 939 s_ModuleInfo 940 [b_ModulNbr]. 941 s_SiemensCounterInfo. 942 s_ModeRegister. 943 s_ByteModeRegister. 944 b_ModeRegister2 945 = 946 devpriv-> 947 s_ModuleInfo 948 [b_ModulNbr]. 949 s_SiemensCounterInfo. 950 s_ModeRegister. 951 s_ByteModeRegister. 952 b_ModeRegister2 953 | 954 APCI1710_INDEX_LATCH_COUNTER; 955 } else { 956 /*********************************/ 957 /* Enable the clear from counter */ 958 /*********************************/ 959 960 devpriv-> 961 s_ModuleInfo 962 [b_ModulNbr]. 963 s_SiemensCounterInfo. 964 s_ModeRegister. 965 s_ByteModeRegister. 966 b_ModeRegister2 967 = 968 devpriv-> 969 s_ModuleInfo 970 [b_ModulNbr]. 971 s_SiemensCounterInfo. 972 s_ModeRegister. 973 s_ByteModeRegister. 974 b_ModeRegister2 975 & 976 (~APCI1710_INDEX_LATCH_COUNTER); 977 } 978 } // // if (b_IndexOperation == APCI1710_HIGH_EDGE_LATCH_AND_CLEAR_COUNTER || b_IndexOperation == APCI1710_LOW_EDGE_LATCH_AND_CLEAR_COUNTER) 979 980 if (b_AutoMode == 981 APCI1710_DISABLE) 982 { 983 devpriv-> 984 s_ModuleInfo 985 [b_ModulNbr]. 986 s_SiemensCounterInfo. 987 s_ModeRegister. 988 s_ByteModeRegister. 989 b_ModeRegister2 990 = 991 devpriv-> 992 s_ModuleInfo 993 [b_ModulNbr]. 994 s_SiemensCounterInfo. 995 s_ModeRegister. 996 s_ByteModeRegister. 997 b_ModeRegister2 998 | 999 APCI1710_INDEX_AUTO_MODE; 1000 } else { 1001 devpriv-> 1002 s_ModuleInfo 1003 [b_ModulNbr]. 1004 s_SiemensCounterInfo. 1005 s_ModeRegister. 1006 s_ByteModeRegister. 1007 b_ModeRegister2 1008 = 1009 devpriv-> 1010 s_ModuleInfo 1011 [b_ModulNbr]. 1012 s_SiemensCounterInfo. 1013 s_ModeRegister. 1014 s_ByteModeRegister. 1015 b_ModeRegister2 1016 & 1017 (~APCI1710_INDEX_AUTO_MODE); 1018 } 1019 1020 if (b_InterruptEnable == 1021 APCI1710_ENABLE) 1022 { 1023 devpriv-> 1024 s_ModuleInfo 1025 [b_ModulNbr]. 1026 s_SiemensCounterInfo. 1027 s_ModeRegister. 1028 s_ByteModeRegister. 1029 b_ModeRegister3 1030 = 1031 devpriv-> 1032 s_ModuleInfo 1033 [b_ModulNbr]. 1034 s_SiemensCounterInfo. 1035 s_ModeRegister. 1036 s_ByteModeRegister. 1037 b_ModeRegister3 1038 | 1039 APCI1710_ENABLE_INDEX_INT; 1040 } else { 1041 devpriv-> 1042 s_ModuleInfo 1043 [b_ModulNbr]. 1044 s_SiemensCounterInfo. 1045 s_ModeRegister. 1046 s_ByteModeRegister. 1047 b_ModeRegister3 1048 = 1049 devpriv-> 1050 s_ModuleInfo 1051 [b_ModulNbr]. 1052 s_SiemensCounterInfo. 1053 s_ModeRegister. 1054 s_ByteModeRegister. 1055 b_ModeRegister3 1056 & 1057 APCI1710_DISABLE_INDEX_INT; 1058 } 1059 1060 devpriv-> 1061 s_ModuleInfo 1062 [b_ModulNbr]. 1063 s_SiemensCounterInfo. 1064 s_InitFlag. 1065 b_IndexInit = 1; 1066 1067 } else { 1068 /********************************/ 1069 /* Interrupt parameter is wrong */ 1070 /********************************/ 1071 DPRINTK("Interrupt parameter is wrong\n"); 1072 i_ReturnValue = -7; 1073 } 1074 } else { 1075 /************************************/ 1076 /* The auto mode parameter is wrong */ 1077 /************************************/ 1078 1079 DPRINTK("The auto mode parameter is wrong\n"); 1080 i_ReturnValue = -6; 1081 } 1082 } else { 1083 /***********************************************/ 1084 /* The index operating mode parameter is wrong */ 1085 /***********************************************/ 1086 1087 DPRINTK("The index operating mode parameter is wrong\n"); 1088 i_ReturnValue = -5; 1089 } 1090 } else { 1091 /*******************************************/ 1092 /* The reference action parameter is wrong */ 1093 /*******************************************/ 1094 1095 DPRINTK("The reference action parameter is wrong\n"); 1096 i_ReturnValue = -4; 1097 } 1098 } else { 1099 /****************************************/ 1100 /* Counter not initialised see function */ 1101 /* "i_APCI1710_InitCounter" */ 1102 /****************************************/ 1103 1104 DPRINTK("Counter not initialised\n"); 1105 i_ReturnValue = -3; 1106 } 1107 } else { 1108 /*************************************************/ 1109 /* The selected module number parameter is wrong */ 1110 /*************************************************/ 1111 1112 DPRINTK("The selected module number parameter is wrong\n"); 1113 i_ReturnValue = -2; 1114 } 1115 1116 return (i_ReturnValue); 1117} 1118 1119/* 1120+----------------------------------------------------------------------------+ 1121| Function Name : _INT_ i_APCI1710_InitReference | 1122| (unsigned char_ b_BoardHandle, | 1123| unsigned char_ b_ModulNbr, | 1124| unsigned char_ b_ReferenceLevel) | 1125+----------------------------------------------------------------------------+ 1126| Task : Initialise the reference corresponding to the selected | 1127| module (b_ModulNbr). | 1128| | 1129| Reference level | 1130| --------------- | 1131| +--------------------+-------------------------+ | 1132| | b_ReferenceLevel | Operation | | 1133| +--------------------+-------------------------+ | 1134| | APCI1710_LOW | Reference occur if "0" | | 1135| |--------------------|-------------------------| | 1136| | APCI1710_HIGH | Reference occur if "1" | | 1137| +--------------------+-------------------------+ | 1138+----------------------------------------------------------------------------+ 1139| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 1140| unsigned char_ b_ModulNbr : Module number to configure | 1141| (0 to 3) | 1142| unsigned char_ b_ReferenceLevel : Reference level. | 1143+----------------------------------------------------------------------------+ 1144| Output Parameters : - | 1145+----------------------------------------------------------------------------+ 1146| Return Value : 0: No error | 1147| -1: The handle parameter of the board is wrong | 1148| -2: The selected module number parameter is wrong | 1149| -3: Counter not initialised see function | 1150| "i_APCI1710_InitCounter" | 1151| -4: Reference level parameter is wrong | 1152+----------------------------------------------------------------------------+ 1153*/ 1154 1155int i_APCI1710_InitReference(struct comedi_device * dev, 1156 unsigned char b_ModulNbr, unsigned char b_ReferenceLevel) 1157{ 1158 int i_ReturnValue = 0; 1159 1160 /**************************/ 1161 /* Test the module number */ 1162 /**************************/ 1163 1164 if (b_ModulNbr < 4) { 1165 /*******************************/ 1166 /* Test if counter initialised */ 1167 /*******************************/ 1168 1169 if (devpriv-> 1170 s_ModuleInfo[b_ModulNbr]. 1171 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 1172 /**************************************/ 1173 /* Test the reference level parameter */ 1174 /**************************************/ 1175 1176 if (b_ReferenceLevel == 0 || b_ReferenceLevel == 1) { 1177 if (b_ReferenceLevel == 1) { 1178 devpriv-> 1179 s_ModuleInfo[b_ModulNbr]. 1180 s_SiemensCounterInfo. 1181 s_ModeRegister. 1182 s_ByteModeRegister. 1183 b_ModeRegister2 = devpriv-> 1184 s_ModuleInfo[b_ModulNbr]. 1185 s_SiemensCounterInfo. 1186 s_ModeRegister. 1187 s_ByteModeRegister. 1188 b_ModeRegister2 | 1189 APCI1710_REFERENCE_HIGH; 1190 } else { 1191 devpriv-> 1192 s_ModuleInfo[b_ModulNbr]. 1193 s_SiemensCounterInfo. 1194 s_ModeRegister. 1195 s_ByteModeRegister. 1196 b_ModeRegister2 = devpriv-> 1197 s_ModuleInfo[b_ModulNbr]. 1198 s_SiemensCounterInfo. 1199 s_ModeRegister. 1200 s_ByteModeRegister. 1201 b_ModeRegister2 & 1202 APCI1710_REFERENCE_LOW; 1203 } 1204 1205 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 1206 s_SiemensCounterInfo. 1207 s_ModeRegister. 1208 dw_ModeRegister1_2_3_4, 1209 devpriv->s_BoardInfos.ui_Address + 20 + 1210 (64 * b_ModulNbr)); 1211 1212 devpriv-> 1213 s_ModuleInfo[b_ModulNbr]. 1214 s_SiemensCounterInfo. 1215 s_InitFlag.b_ReferenceInit = 1; 1216 } else { 1217 /**************************************/ 1218 /* Reference level parameter is wrong */ 1219 /**************************************/ 1220 1221 DPRINTK("Reference level parameter is wrong\n"); 1222 i_ReturnValue = -4; 1223 } 1224 } else { 1225 /****************************************/ 1226 /* Counter not initialised see function */ 1227 /* "i_APCI1710_InitCounter" */ 1228 /****************************************/ 1229 1230 DPRINTK("Counter not initialised\n"); 1231 i_ReturnValue = -3; 1232 } 1233 } else { 1234 /*************************************************/ 1235 /* The selected module number parameter is wrong */ 1236 /*************************************************/ 1237 1238 DPRINTK("The selected module number parameter is wrong\n"); 1239 i_ReturnValue = -2; 1240 } 1241 1242 return (i_ReturnValue); 1243} 1244 1245/* 1246+----------------------------------------------------------------------------+ 1247| Function Name : _INT_ i_APCI1710_InitExternalStrobe | 1248| (unsigned char_ b_BoardHandle, | 1249| unsigned char_ b_ModulNbr, | 1250| unsigned char_ b_ExternalStrobe, | 1251| unsigned char_ b_ExternalStrobeLevel) | 1252+----------------------------------------------------------------------------+ 1253| Task : Initialises the external strobe level corresponding to | 1254| the selected module (b_ModulNbr). | 1255+----------------------------------------------------------------------------+ 1256| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 1257| unsigned char_ b_ModulNbr : Module number to configure | 1258| (0 to 3) | 1259| unsigned char_ b_ExternalStrobe : External strobe selection | 1260| 0 : External strobe A | 1261| 1 : External strobe B | 1262| unsigned char_ b_ExternalStrobeLevel : External strobe level | 1263| APCI1710_LOW : | 1264| External latch occurs if "0" | 1265| APCI1710_HIGH : | 1266| External latch occurs if "1" | 1267+----------------------------------------------------------------------------+ 1268| Output Parameters : - | 1269+----------------------------------------------------------------------------+ 1270| Return Value : 0: No error | 1271| -1: The handle parameter of the board is wrong | 1272| -2: The selected module number is wrong | 1273| -3: Counter not initialised. | 1274| See function "i_APCI1710_InitCounter" | 1275| -4: External strobe selection is wrong | 1276| -5: External strobe level parameter is wrong | 1277+----------------------------------------------------------------------------+ 1278*/ 1279 1280int i_APCI1710_InitExternalStrobe(struct comedi_device * dev, 1281 unsigned char b_ModulNbr, unsigned char b_ExternalStrobe, unsigned char b_ExternalStrobeLevel) 1282{ 1283 int i_ReturnValue = 0; 1284 1285 /**************************/ 1286 /* Test the module number */ 1287 /**************************/ 1288 1289 if (b_ModulNbr < 4) { 1290 /*******************************/ 1291 /* Test if counter initialised */ 1292 /*******************************/ 1293 1294 if (devpriv-> 1295 s_ModuleInfo[b_ModulNbr]. 1296 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 1297 /**************************************/ 1298 /* Test the external strobe selection */ 1299 /**************************************/ 1300 1301 if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) { 1302 /******************/ 1303 /* Test the level */ 1304 /******************/ 1305 1306 if ((b_ExternalStrobeLevel == APCI1710_HIGH) || 1307 ((b_ExternalStrobeLevel == APCI1710_LOW 1308 && (devpriv-> 1309 s_BoardInfos. 1310 dw_MolduleConfiguration 1311 [b_ModulNbr] & 1312 0xFFFF) >= 1313 0x3135))) { 1314 /*****************/ 1315 /* Set the level */ 1316 /*****************/ 1317 1318 devpriv-> 1319 s_ModuleInfo[b_ModulNbr]. 1320 s_SiemensCounterInfo. 1321 s_ModeRegister. 1322 s_ByteModeRegister. 1323 b_ModeRegister4 = (devpriv-> 1324 s_ModuleInfo[b_ModulNbr]. 1325 s_SiemensCounterInfo. 1326 s_ModeRegister. 1327 s_ByteModeRegister. 1328 b_ModeRegister4 & (0xFF - 1329 (0x10 << b_ExternalStrobe))) | ((b_ExternalStrobeLevel ^ 1) << (4 + b_ExternalStrobe)); 1330 } else { 1331 /********************************************/ 1332 /* External strobe level parameter is wrong */ 1333 /********************************************/ 1334 1335 DPRINTK("External strobe level parameter is wrong\n"); 1336 i_ReturnValue = -5; 1337 } 1338 } // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) 1339 else { 1340 /**************************************/ 1341 /* External strobe selection is wrong */ 1342 /**************************************/ 1343 1344 DPRINTK("External strobe selection is wrong\n"); 1345 i_ReturnValue = -4; 1346 } // if (b_ExternalStrobe == 0 || b_ExternalStrobe == 1) 1347 } else { 1348 /****************************************/ 1349 /* Counter not initialised see function */ 1350 /* "i_APCI1710_InitCounter" */ 1351 /****************************************/ 1352 1353 DPRINTK("Counter not initialised\n"); 1354 i_ReturnValue = -3; 1355 } 1356 } else { 1357 /*************************************************/ 1358 /* The selected module number parameter is wrong */ 1359 /*************************************************/ 1360 1361 DPRINTK("The selected module number parameter is wrong\n"); 1362 i_ReturnValue = -2; 1363 } 1364 1365 return (i_ReturnValue); 1366} 1367 1368 /* 1369 +----------------------------------------------------------------------------+ 1370 | Function Name : _INT_ i_APCI1710_InitCompareLogic | 1371 | (unsigned char_ b_BoardHandle, | 1372 | unsigned char_ b_ModulNbr, | 1373 | unsigned int_ ui_CompareValue) | 1374 +----------------------------------------------------------------------------+ 1375 | Task : Set the 32-Bit compare value. At that moment that the | 1376 | incremental counter arrive to the compare value | 1377 | (ui_CompareValue) a interrupt is generated. | 1378 +----------------------------------------------------------------------------+ 1379 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 1380 | unsigned char_ b_ModulNbr : Module number to configure | 1381 | (0 to 3) | 1382 | unsigned int_ ui_CompareValue : 32-Bit compare value | 1383 +----------------------------------------------------------------------------+ 1384 | Output Parameters : - 1385 +----------------------------------------------------------------------------+ 1386 | Return Value : 0: No error | 1387 | -1: The handle parameter of the board is wrong | 1388 | -2: No counter module found | 1389 | -3: Counter not initialised see function | 1390 | "i_APCI1710_InitCounter" | 1391 +----------------------------------------------------------------------------+ 1392 */ 1393 1394int i_APCI1710_InitCompareLogic(struct comedi_device * dev, 1395 unsigned char b_ModulNbr, unsigned int ui_CompareValue) 1396{ 1397 int i_ReturnValue = 0; 1398 1399 /**************************/ 1400 /* Test the module number */ 1401 /**************************/ 1402 1403 if (b_ModulNbr < 4) { 1404 /*******************************/ 1405 /* Test if counter initialised */ 1406 /*******************************/ 1407 1408 if (devpriv-> 1409 s_ModuleInfo[b_ModulNbr]. 1410 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 1411 1412 outl(ui_CompareValue, devpriv->s_BoardInfos. 1413 ui_Address + 28 + (64 * b_ModulNbr)); 1414 1415 devpriv-> 1416 s_ModuleInfo[b_ModulNbr]. 1417 s_SiemensCounterInfo. 1418 s_InitFlag.b_CompareLogicInit = 1; 1419 } else { 1420 /****************************************/ 1421 /* Counter not initialised see function */ 1422 /* "i_APCI1710_InitCounter" */ 1423 /****************************************/ 1424 1425 DPRINTK("Counter not initialised\n"); 1426 i_ReturnValue = -3; 1427 } 1428 } else { 1429 /*************************************************/ 1430 /* The selected module number parameter is wrong */ 1431 /*************************************************/ 1432 1433 DPRINTK("The selected module number parameter is wrong\n"); 1434 i_ReturnValue = -2; 1435 } 1436 1437 return (i_ReturnValue); 1438} 1439 1440/* 1441+----------------------------------------------------------------------------+ 1442| Function Name : _INT_ i_APCI1710_InitFrequencyMeasurement | 1443| (unsigned char_ b_BoardHandle, | 1444| unsigned char_ b_ModulNbr, | 1445| unsigned char_ b_PCIInputClock, | 1446| unsigned char_ b_TimingUnity, | 1447| ULONG_ ul_TimingInterval, | 1448| PULONG_ pul_RealTimingInterval) | 1449+----------------------------------------------------------------------------+ 1450| Task : Sets the time for the frequency measurement. | 1451| Configures the selected TOR incremental counter of the | 1452| selected module (b_ModulNbr). The ul_TimingInterval and| 1453| ul_TimingUnity determine the time base for the | 1454| measurement. The pul_RealTimingInterval returns the | 1455| real time value. You must call up this function before | 1456| you call up any other function which gives access to | 1457| the frequency measurement. | 1458+----------------------------------------------------------------------------+ 1459| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 1460| unsigned char_ b_ModulNbr : Number of the module to be | 1461| configured (0 to 3) | 1462| unsigned char_ b_PCIInputClock : Selection of the PCI bus | 1463| clock | 1464| - APCI1710_30MHZ : | 1465| The PC has a PCI bus clock | 1466| of 30 MHz | 1467| - APCI1710_33MHZ : | 1468| The PC has a PCI bus clock | 1469| of 33 MHz | 1470| unsigned char_ b_TimingUnity : Base time unit (0 to 2) | 1471| 0 : ns | 1472| 1 : æs | 1473| 2 : ms | 1474| ULONG_ ul_TimingInterval: Base time value. | 1475+----------------------------------------------------------------------------+ 1476| Output Parameters : PULONG_ pul_RealTimingInterval : Real base time value. | 1477+----------------------------------------------------------------------------+ 1478| Return Value : 0: No error | 1479| -1: The handle parameter of the board is wrong | 1480| -2: The selected module number is wrong | 1481| -3: Counter not initialised see function | 1482| "i_APCI1710_InitCounter" | 1483| -4: The selected PCI input clock is wrong | 1484| -5: Timing unity selection is wrong | 1485| -6: Base timing selection is wrong | 1486| -7: 40MHz quartz not on board | 1487+----------------------------------------------------------------------------+ 1488*/ 1489 1490int i_APCI1710_InitFrequencyMeasurement(struct comedi_device * dev, 1491 unsigned char b_ModulNbr, 1492 unsigned char b_PCIInputClock, 1493 unsigned char b_TimingUnity, 1494 ULONG ul_TimingInterval, PULONG pul_RealTimingInterval) 1495{ 1496 int i_ReturnValue = 0; 1497 ULONG ul_TimerValue = 0; 1498 double d_RealTimingInterval; 1499 DWORD dw_Status = 0; 1500 1501 /**************************/ 1502 /* Test the module number */ 1503 /**************************/ 1504 1505 if (b_ModulNbr < 4) { 1506 /*******************************/ 1507 /* Test if counter initialised */ 1508 /*******************************/ 1509 1510 if (devpriv-> 1511 s_ModuleInfo[b_ModulNbr]. 1512 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 1513 /**************************/ 1514 /* Test the PCI bus clock */ 1515 /**************************/ 1516 1517 if ((b_PCIInputClock == APCI1710_30MHZ) || 1518 (b_PCIInputClock == APCI1710_33MHZ) || 1519 (b_PCIInputClock == APCI1710_40MHZ)) { 1520 /************************/ 1521 /* Test the timing unit */ 1522 /************************/ 1523 1524 if (b_TimingUnity <= 2) { 1525 /**********************************/ 1526 /* Test the base timing selection */ 1527 /**********************************/ 1528 1529 if (((b_PCIInputClock == APCI1710_30MHZ) 1530 && (b_TimingUnity == 0) 1531 && (ul_TimingInterval >= 1532 266) 1533 && (ul_TimingInterval <= 1534 8738133UL)) 1535 || ((b_PCIInputClock == 1536 APCI1710_30MHZ) 1537 && (b_TimingUnity == 1) 1538 && (ul_TimingInterval >= 1539 1) 1540 && (ul_TimingInterval <= 1541 8738UL)) 1542 || ((b_PCIInputClock == 1543 APCI1710_30MHZ) 1544 && (b_TimingUnity == 2) 1545 && (ul_TimingInterval >= 1546 1) 1547 && (ul_TimingInterval <= 1548 8UL)) 1549 || ((b_PCIInputClock == 1550 APCI1710_33MHZ) 1551 && (b_TimingUnity == 0) 1552 && (ul_TimingInterval >= 1553 242) 1554 && (ul_TimingInterval <= 1555 7943757UL)) 1556 || ((b_PCIInputClock == 1557 APCI1710_33MHZ) 1558 && (b_TimingUnity == 1) 1559 && (ul_TimingInterval >= 1560 1) 1561 && (ul_TimingInterval <= 1562 7943UL)) 1563 || ((b_PCIInputClock == 1564 APCI1710_33MHZ) 1565 && (b_TimingUnity == 2) 1566 && (ul_TimingInterval >= 1567 1) 1568 && (ul_TimingInterval <= 1569 7UL)) 1570 || ((b_PCIInputClock == 1571 APCI1710_40MHZ) 1572 && (b_TimingUnity == 0) 1573 && (ul_TimingInterval >= 1574 200) 1575 && (ul_TimingInterval <= 1576 6553500UL)) 1577 || ((b_PCIInputClock == 1578 APCI1710_40MHZ) 1579 && (b_TimingUnity == 1) 1580 && (ul_TimingInterval >= 1581 1) 1582 && (ul_TimingInterval <= 1583 6553UL)) 1584 || ((b_PCIInputClock == 1585 APCI1710_40MHZ) 1586 && (b_TimingUnity == 2) 1587 && (ul_TimingInterval >= 1588 1) 1589 && (ul_TimingInterval <= 1590 6UL))) { 1591 /**********************/ 1592 /* Test if 40MHz used */ 1593 /**********************/ 1594 1595 if (b_PCIInputClock == 1596 APCI1710_40MHZ) { 1597 /******************************/ 1598 /* Test if firmware >= Rev1.5 */ 1599 /******************************/ 1600 1601 if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3135) { 1602 /*********************************/ 1603 /* Test if 40MHz quartz on board */ 1604 /*********************************/ 1605 1606 /*INPDW (ps_APCI1710Variable-> 1607 s_Board [b_BoardHandle]. 1608 s_BoardInfos. 1609 ui_Address + 36 + (64 * b_ModulNbr), &dw_Status); */ 1610 dw_Status = 1611 inl 1612 (devpriv-> 1613 s_BoardInfos. 1614 ui_Address 1615 + 36 + 1616 (64 * b_ModulNbr)); 1617 1618 /******************************/ 1619 /* Test the quartz flag (DQ0) */ 1620 /******************************/ 1621 1622 if ((dw_Status & 1) != 1) { 1623 /*****************************/ 1624 /* 40MHz quartz not on board */ 1625 /*****************************/ 1626 1627 DPRINTK("40MHz quartz not on board\n"); 1628 i_ReturnValue 1629 = 1630 -7; 1631 } 1632 } else { 1633 /*****************************/ 1634 /* 40MHz quartz not on board */ 1635 /*****************************/ 1636 DPRINTK("40MHz quartz not on board\n"); 1637 i_ReturnValue = 1638 -7; 1639 } 1640 } // if (b_PCIInputClock == APCI1710_40MHZ) 1641 1642 /***************************/ 1643 /* Test if not error occur */ 1644 /***************************/ 1645 1646 if (i_ReturnValue == 0) { 1647 /****************************/ 1648 /* Test the INC_CPT version */ 1649 /****************************/ 1650 1651 if ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131) { 1652 1653 /**********************/ 1654 /* Test if 40MHz used */ 1655 /**********************/ 1656 1657 if (b_PCIInputClock == APCI1710_40MHZ) { 1658 /*********************************/ 1659 /* Enable the 40MHz quarz (DQ30) */ 1660 /*********************************/ 1661 1662 devpriv-> 1663 s_ModuleInfo 1664 [b_ModulNbr]. 1665 s_SiemensCounterInfo. 1666 s_ModeRegister. 1667 s_ByteModeRegister. 1668 b_ModeRegister4 1669 = 1670 devpriv-> 1671 s_ModuleInfo 1672 [b_ModulNbr]. 1673 s_SiemensCounterInfo. 1674 s_ModeRegister. 1675 s_ByteModeRegister. 1676 b_ModeRegister4 1677 | 1678 APCI1710_ENABLE_40MHZ_FREQUENCY; 1679 } // if (b_PCIInputClock == APCI1710_40MHZ) 1680 else { 1681 /**********************************/ 1682 /* Disable the 40MHz quarz (DQ30) */ 1683 /**********************************/ 1684 1685 devpriv-> 1686 s_ModuleInfo 1687 [b_ModulNbr]. 1688 s_SiemensCounterInfo. 1689 s_ModeRegister. 1690 s_ByteModeRegister. 1691 b_ModeRegister4 1692 = 1693 devpriv-> 1694 s_ModuleInfo 1695 [b_ModulNbr]. 1696 s_SiemensCounterInfo. 1697 s_ModeRegister. 1698 s_ByteModeRegister. 1699 b_ModeRegister4 1700 & 1701 APCI1710_DISABLE_40MHZ_FREQUENCY; 1702 1703 } // if (b_PCIInputClock == APCI1710_40MHZ) 1704 1705 /********************************/ 1706 /* Calculate the division fator */ 1707 /********************************/ 1708 1709 fpu_begin(); 1710 switch (b_TimingUnity) { 1711 /******/ 1712 /* ns */ 1713 /******/ 1714 1715 case 0: 1716 1717 /******************/ 1718 /* Timer 0 factor */ 1719 /******************/ 1720 1721 ul_TimerValue 1722 = 1723 (ULONG) 1724 (ul_TimingInterval 1725 * 1726 (0.00025 * b_PCIInputClock)); 1727 1728 /*******************/ 1729 /* Round the value */ 1730 /*******************/ 1731 1732 if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 1733 ul_TimerValue 1734 = 1735 ul_TimerValue 1736 + 1737 1; 1738 } 1739 1740 /*****************************/ 1741 /* Calculate the real timing */ 1742 /*****************************/ 1743 1744 *pul_RealTimingInterval 1745 = 1746 (ULONG) 1747 (ul_TimerValue 1748 / 1749 (0.00025 * (double)b_PCIInputClock)); 1750 d_RealTimingInterval 1751 = 1752 (double) 1753 ul_TimerValue 1754 / 1755 (0.00025 1756 * 1757 (double) 1758 b_PCIInputClock); 1759 1760 if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) { 1761 *pul_RealTimingInterval 1762 = 1763 *pul_RealTimingInterval 1764 + 1765 1; 1766 } 1767 1768 ul_TimingInterval 1769 = 1770 ul_TimingInterval 1771 - 1772 1; 1773 ul_TimerValue 1774 = 1775 ul_TimerValue 1776 - 1777 2; 1778 1779 break; 1780 1781 /******/ 1782 /* æs */ 1783 /******/ 1784 1785 case 1: 1786 1787 /******************/ 1788 /* Timer 0 factor */ 1789 /******************/ 1790 1791 ul_TimerValue 1792 = 1793 (ULONG) 1794 (ul_TimingInterval 1795 * 1796 (0.25 * b_PCIInputClock)); 1797 1798 /*******************/ 1799 /* Round the value */ 1800 /*******************/ 1801 1802 if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 1803 ul_TimerValue 1804 = 1805 ul_TimerValue 1806 + 1807 1; 1808 } 1809 1810 /*****************************/ 1811 /* Calculate the real timing */ 1812 /*****************************/ 1813 1814 *pul_RealTimingInterval 1815 = 1816 (ULONG) 1817 (ul_TimerValue 1818 / 1819 (0.25 * (double)b_PCIInputClock)); 1820 d_RealTimingInterval 1821 = 1822 (double) 1823 ul_TimerValue 1824 / 1825 ( 1826 (double) 1827 0.25 1828 * 1829 (double) 1830 b_PCIInputClock); 1831 1832 if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) { 1833 *pul_RealTimingInterval 1834 = 1835 *pul_RealTimingInterval 1836 + 1837 1; 1838 } 1839 1840 ul_TimingInterval 1841 = 1842 ul_TimingInterval 1843 - 1844 1; 1845 ul_TimerValue 1846 = 1847 ul_TimerValue 1848 - 1849 2; 1850 1851 break; 1852 1853 /******/ 1854 /* ms */ 1855 /******/ 1856 1857 case 2: 1858 1859 /******************/ 1860 /* Timer 0 factor */ 1861 /******************/ 1862 1863 ul_TimerValue 1864 = 1865 ul_TimingInterval 1866 * 1867 (250.0 1868 * 1869 b_PCIInputClock); 1870 1871 /*******************/ 1872 /* Round the value */ 1873 /*******************/ 1874 1875 if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 1876 ul_TimerValue 1877 = 1878 ul_TimerValue 1879 + 1880 1; 1881 } 1882 1883 /*****************************/ 1884 /* Calculate the real timing */ 1885 /*****************************/ 1886 1887 *pul_RealTimingInterval 1888 = 1889 (ULONG) 1890 (ul_TimerValue 1891 / 1892 (250.0 * (double)b_PCIInputClock)); 1893 d_RealTimingInterval 1894 = 1895 (double) 1896 ul_TimerValue 1897 / 1898 (250.0 1899 * 1900 (double) 1901 b_PCIInputClock); 1902 1903 if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)*pul_RealTimingInterval + 0.5)) { 1904 *pul_RealTimingInterval 1905 = 1906 *pul_RealTimingInterval 1907 + 1908 1; 1909 } 1910 1911 ul_TimingInterval 1912 = 1913 ul_TimingInterval 1914 - 1915 1; 1916 ul_TimerValue 1917 = 1918 ul_TimerValue 1919 - 1920 2; 1921 1922 break; 1923 } 1924 1925 fpu_end(); 1926 /*************************/ 1927 /* Write the timer value */ 1928 /*************************/ 1929 1930 outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 32 + (64 * b_ModulNbr)); 1931 1932 /*******************************/ 1933 /* Set the initialisation flag */ 1934 /*******************************/ 1935 1936 devpriv-> 1937 s_ModuleInfo 1938 [b_ModulNbr]. 1939 s_SiemensCounterInfo. 1940 s_InitFlag. 1941 b_FrequencyMeasurementInit 1942 = 1; 1943 } else { 1944 /***************************/ 1945 /* Counter not initialised */ 1946 /***************************/ 1947 1948 DPRINTK("Counter not initialised\n"); 1949 i_ReturnValue = 1950 -3; 1951 } 1952 } // if (i_ReturnValue == 0) 1953 } else { 1954 /**********************************/ 1955 /* Base timing selection is wrong */ 1956 /**********************************/ 1957 1958 DPRINTK("Base timing selection is wrong\n"); 1959 i_ReturnValue = -6; 1960 } 1961 } else { 1962 /***********************************/ 1963 /* Timing unity selection is wrong */ 1964 /***********************************/ 1965 1966 DPRINTK("Timing unity selection is wrong\n"); 1967 i_ReturnValue = -5; 1968 } 1969 } else { 1970 /*****************************************/ 1971 /* The selected PCI input clock is wrong */ 1972 /*****************************************/ 1973 1974 DPRINTK("The selected PCI input clock is wrong\n"); 1975 i_ReturnValue = -4; 1976 } 1977 } else { 1978 /****************************************/ 1979 /* Counter not initialised see function */ 1980 /* "i_APCI1710_InitCounter" */ 1981 /****************************************/ 1982 1983 DPRINTK("Counter not initialised\n"); 1984 i_ReturnValue = -3; 1985 } 1986 } else { 1987 /*************************************************/ 1988 /* The selected module number parameter is wrong */ 1989 /*************************************************/ 1990 1991 DPRINTK("The selected module number parameter is wrong\n"); 1992 i_ReturnValue = -2; 1993 } 1994 1995 return (i_ReturnValue); 1996} 1997 1998/*########################################################################### */ 1999 2000 //INSN BITS 2001/*########################################################################### */ 2002 2003/* 2004+----------------------------------------------------------------------------+ 2005| Function Name :INT i_APCI1710_InsnBitsINCCPT(struct comedi_device *dev,struct comedi_subdevice *s, 2006struct comedi_insn *insn,unsigned int *data) | 2007+----------------------------------------------------------------------------+ 2008| Task : Set & Clear Functions for INC_CPT | 2009+----------------------------------------------------------------------------+ 2010| Input Parameters : 2011+----------------------------------------------------------------------------+ 2012| Output Parameters : - | 2013+----------------------------------------------------------------------------+ 2014| Return Value : 2015+----------------------------------------------------------------------------+ 2016*/ 2017 2018int i_APCI1710_InsnBitsINCCPT(struct comedi_device * dev, struct comedi_subdevice * s, 2019 struct comedi_insn * insn, unsigned int * data) 2020{ 2021 unsigned int ui_BitsType; 2022 int i_ReturnValue = 0; 2023 ui_BitsType = CR_CHAN(insn->chanspec); 2024 devpriv->tsk_Current = current; // Save the current process task structure 2025 2026 switch (ui_BitsType) { 2027 case APCI1710_INCCPT_CLEARCOUNTERVALUE: 2028 i_ReturnValue = i_APCI1710_ClearCounterValue(dev, 2029 (unsigned char) CR_AREF(insn->chanspec)); 2030 break; 2031 2032 case APCI1710_INCCPT_CLEARALLCOUNTERVALUE: 2033 i_ReturnValue = i_APCI1710_ClearAllCounterValue(dev); 2034 break; 2035 2036 case APCI1710_INCCPT_SETINPUTFILTER: 2037 i_ReturnValue = i_APCI1710_SetInputFilter(dev, 2038 (unsigned char) CR_AREF(insn->chanspec), 2039 (unsigned char) data[0], (unsigned char) data[1]); 2040 break; 2041 2042 case APCI1710_INCCPT_LATCHCOUNTER: 2043 i_ReturnValue = i_APCI1710_LatchCounter(dev, 2044 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]); 2045 break; 2046 2047 case APCI1710_INCCPT_SETINDEXANDREFERENCESOURCE: 2048 i_ReturnValue = i_APCI1710_SetIndexAndReferenceSource(dev, 2049 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]); 2050 break; 2051 2052 case APCI1710_INCCPT_SETDIGITALCHLON: 2053 i_ReturnValue = i_APCI1710_SetDigitalChlOn(dev, 2054 (unsigned char) CR_AREF(insn->chanspec)); 2055 break; 2056 2057 case APCI1710_INCCPT_SETDIGITALCHLOFF: 2058 i_ReturnValue = i_APCI1710_SetDigitalChlOff(dev, 2059 (unsigned char) CR_AREF(insn->chanspec)); 2060 break; 2061 2062 default: 2063 printk("Bits Config Parameter Wrong\n"); 2064 } 2065 2066 if (i_ReturnValue >= 0) 2067 i_ReturnValue = insn->n; 2068 return (i_ReturnValue); 2069} 2070 2071/* 2072+----------------------------------------------------------------------------+ 2073| Function Name : _INT_ i_APCI1710_ClearCounterValue | 2074| (unsigned char_ b_BoardHandle, | 2075| unsigned char_ b_ModulNbr) | 2076+----------------------------------------------------------------------------+ 2077| Task : Clear the counter value from selected module | 2078| (b_ModulNbr). | 2079+----------------------------------------------------------------------------+ 2080| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 2081| unsigned char_ b_ModulNbr : Module number to configure | 2082| (0 to 3) | 2083+----------------------------------------------------------------------------+ 2084| Output Parameters : - | 2085+----------------------------------------------------------------------------+ 2086| Return Value : 0: No error | 2087| -1: The handle parameter of the board is wrong | 2088| -2: The selected module number parameter is wrong | 2089| -3: Counter not initialised see function | 2090| "i_APCI1710_InitCounter" | 2091+----------------------------------------------------------------------------+ 2092*/ 2093 2094int i_APCI1710_ClearCounterValue(struct comedi_device * dev, unsigned char b_ModulNbr) 2095{ 2096 int i_ReturnValue = 0; 2097 2098 /**************************/ 2099 /* Test the module number */ 2100 /**************************/ 2101 2102 if (b_ModulNbr < 4) { 2103 /*******************************/ 2104 /* Test if counter initialised */ 2105 /*******************************/ 2106 2107 if (devpriv-> 2108 s_ModuleInfo[b_ModulNbr]. 2109 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 2110 /*********************/ 2111 /* Clear the counter */ 2112 /*********************/ 2113 2114 outl(1, devpriv->s_BoardInfos. 2115 ui_Address + 16 + (64 * b_ModulNbr)); 2116 } else { 2117 /****************************************/ 2118 /* Counter not initialised see function */ 2119 /* "i_APCI1710_InitCounter" */ 2120 /****************************************/ 2121 2122 DPRINTK("Counter not initialised\n"); 2123 i_ReturnValue = -3; 2124 } 2125 } else { 2126 /*************************************************/ 2127 /* The selected module number parameter is wrong */ 2128 /*************************************************/ 2129 2130 DPRINTK("The selected module number parameter is wrong\n"); 2131 i_ReturnValue = -2; 2132 } 2133 2134 return (i_ReturnValue); 2135} 2136 2137/* 2138+----------------------------------------------------------------------------+ 2139| Function Name : _INT_ i_APCI1710_ClearAllCounterValue | 2140| (unsigned char_ b_BoardHandle) | 2141+----------------------------------------------------------------------------+ 2142| Task : Clear all counter value. | 2143+----------------------------------------------------------------------------+ 2144| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 2145+----------------------------------------------------------------------------+ 2146| Output Parameters : - | 2147+----------------------------------------------------------------------------+ 2148| Return Value : 0: No error | 2149| -1: The handle parameter of the board is wrong | 2150| -2: No counter module found | 2151+----------------------------------------------------------------------------+ 2152*/ 2153 2154int i_APCI1710_ClearAllCounterValue(struct comedi_device * dev) 2155{ 2156 unsigned char b_ModulCpt = 0; 2157 int i_ReturnValue = 0; 2158 2159 /********************************/ 2160 /* Test if counter module found */ 2161 /********************************/ 2162 2163 if ((devpriv->s_BoardInfos. 2164 dw_MolduleConfiguration[0] & 0xFFFF0000UL) == 2165 APCI1710_INCREMENTAL_COUNTER 2166 || (devpriv->s_BoardInfos. 2167 dw_MolduleConfiguration[1] & 0xFFFF0000UL) == 2168 APCI1710_INCREMENTAL_COUNTER 2169 || (devpriv->s_BoardInfos. 2170 dw_MolduleConfiguration[2] & 0xFFFF0000UL) == 2171 APCI1710_INCREMENTAL_COUNTER 2172 || (devpriv->s_BoardInfos. 2173 dw_MolduleConfiguration[3] & 0xFFFF0000UL) == 2174 APCI1710_INCREMENTAL_COUNTER) { 2175 for (b_ModulCpt = 0; b_ModulCpt < 4; b_ModulCpt++) { 2176 /*******************************/ 2177 /* Test if incremental counter */ 2178 /*******************************/ 2179 2180 if ((devpriv->s_BoardInfos. 2181 dw_MolduleConfiguration[b_ModulCpt] & 2182 0xFFFF0000UL) == 2183 APCI1710_INCREMENTAL_COUNTER) { 2184 /*********************/ 2185 /* Clear the counter */ 2186 /*********************/ 2187 2188 outl(1, devpriv->s_BoardInfos. 2189 ui_Address + 16 + (64 * b_ModulCpt)); 2190 } 2191 } 2192 } else { 2193 /***************************/ 2194 /* No counter module found */ 2195 /***************************/ 2196 2197 DPRINTK("No counter module found\n"); 2198 i_ReturnValue = -2; 2199 } 2200 2201 return (i_ReturnValue); 2202} 2203 2204/* 2205+----------------------------------------------------------------------------+ 2206| Function Name : _INT_ i_APCI1710_SetInputFilter | 2207| (unsigned char_ b_BoardHandle, | 2208| unsigned char_ b_Module, | 2209| unsigned char_ b_PCIInputClock, | 2210| unsigned char_ b_Filter) | 2211+----------------------------------------------------------------------------+ 2212| Task : Disable or enable the software filter from selected | 2213| module (b_ModulNbr). b_Filter determine the filter time| 2214+----------------------------------------------------------------------------+ 2215| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 2216| unsigned char_ b_ModulNbr : Number of the module to be | 2217| configured (0 to 3) | 2218| unsigned char_ b_PCIInputClock : Selection of the PCI bus | 2219| clock | 2220| - APCI1710_30MHZ : | 2221| The PC has a PCI bus clock | 2222| of 30 MHz | 2223| - APCI1710_33MHZ : | 2224| The PC has a PCI bus clock | 2225| of 33 MHz | 2226| - APCI1710_40MHZ : | 2227| The APCI1710 has a 40MHz | 2228| quartz | 2229| unsigned char_ b_Filter : Filter selection | 2230| | 2231| 30 MHz | 2232| ------ | 2233| 0: Software filter not used | 2234| 1: Filter from 266ns (3.750000MHz) | 2235| 2: Filter from 400ns (2.500000MHz) | 2236| 3: Filter from 533ns (1.876170MHz) | 2237| 4: Filter from 666ns (1.501501MHz) | 2238| 5: Filter from 800ns (1.250000MHz) | 2239| 6: Filter from 933ns (1.071800MHz) | 2240| 7: Filter from 1066ns (0.938080MHz) | 2241| 8: Filter from 1200ns (0.833333MHz) | 2242| 9: Filter from 1333ns (0.750000MHz) | 2243| 10: Filter from 1466ns (0.682100MHz) | 2244| 11: Filter from 1600ns (0.625000MHz) | 2245| 12: Filter from 1733ns (0.577777MHz) | 2246| 13: Filter from 1866ns (0.535900MHz) | 2247| 14: Filter from 2000ns (0.500000MHz) | 2248| 15: Filter from 2133ns (0.468800MHz) | 2249| | 2250| 33 MHz | 2251| ------ | 2252| 0: Software filter not used | 2253| 1: Filter from 242ns (4.125000MHz) | 2254| 2: Filter from 363ns (2.754820MHz) | 2255| 3: Filter from 484ns (2.066115MHz) | 2256| 4: Filter from 605ns (1.652892MHz) | 2257| 5: Filter from 726ns (1.357741MHz) | 2258| 6: Filter from 847ns (1.180637MHz) | 2259| 7: Filter from 968ns (1.033055MHz) | 2260| 8: Filter from 1089ns (0.918273MHz) | 2261| 9: Filter from 1210ns (0.826446MHz) | 2262| 10: Filter from 1331ns (0.751314MHz) | 2263| 11: Filter from 1452ns (0.688705MHz) | 2264| 12: Filter from 1573ns (0.635727MHz) | 2265| 13: Filter from 1694ns (0.590318MHz) | 2266| 14: Filter from 1815ns (0.550964MHz) | 2267| 15: Filter from 1936ns (0.516528MHz) | 2268| | 2269| 40 MHz | 2270| ------ | 2271| 0: Software filter not used | 2272| 1: Filter from 200ns (5.000000MHz) | 2273| 2: Filter from 300ns (3.333333MHz) | 2274| 3: Filter from 400ns (2.500000MHz) | 2275| 4: Filter from 500ns (2.000000MHz) | 2276| 5: Filter from 600ns (1.666666MHz) | 2277| 6: Filter from 700ns (1.428500MHz) | 2278| 7: Filter from 800ns (1.250000MHz) | 2279| 8: Filter from 900ns (1.111111MHz) | 2280| 9: Filter from 1000ns (1.000000MHz) | 2281| 10: Filter from 1100ns (0.909090MHz) | 2282| 11: Filter from 1200ns (0.833333MHz) | 2283| 12: Filter from 1300ns (0.769200MHz) | 2284| 13: Filter from 1400ns (0.714200MHz) | 2285| 14: Filter from 1500ns (0.666666MHz) | 2286| 15: Filter from 1600ns (0.625000MHz) | 2287+----------------------------------------------------------------------------+ 2288| Output Parameters : - | 2289+----------------------------------------------------------------------------+ 2290| Return Value : 0: No error | 2291| -1: The handle parameter of the board is wrong | 2292| -2: The selected module number is wrong | 2293| -3: The module is not a counter module | 2294| -4: The selected PCI input clock is wrong | 2295| -5: The selected filter value is wrong | 2296| -6: 40MHz quartz not on board | 2297+----------------------------------------------------------------------------+ 2298*/ 2299 2300int i_APCI1710_SetInputFilter(struct comedi_device * dev, 2301 unsigned char b_ModulNbr, unsigned char b_PCIInputClock, unsigned char b_Filter) 2302{ 2303 int i_ReturnValue = 0; 2304 DWORD dw_Status = 0; 2305 2306 /**************************/ 2307 /* Test the module number */ 2308 /**************************/ 2309 2310 if (b_ModulNbr < 4) { 2311 /*******************************/ 2312 /* Test if incremental counter */ 2313 /*******************************/ 2314 2315 if ((devpriv->s_BoardInfos. 2316 dw_MolduleConfiguration[b_ModulNbr] & 2317 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) { 2318 /******************************/ 2319 /* Test if firmware >= Rev1.5 */ 2320 /******************************/ 2321 2322 if ((devpriv->s_BoardInfos. 2323 dw_MolduleConfiguration[b_ModulNbr] & 2324 0xFFFF) >= 0x3135) { 2325 /**************************/ 2326 /* Test the PCI bus clock */ 2327 /**************************/ 2328 2329 if ((b_PCIInputClock == APCI1710_30MHZ) || 2330 (b_PCIInputClock == APCI1710_33MHZ) || 2331 (b_PCIInputClock == APCI1710_40MHZ)) { 2332 /*************************/ 2333 /* Test the filter value */ 2334 /*************************/ 2335 2336 if (b_Filter < 16) { 2337 /**********************/ 2338 /* Test if 40MHz used */ 2339 /**********************/ 2340 2341 if (b_PCIInputClock == 2342 APCI1710_40MHZ) { 2343 /*********************************/ 2344 /* Test if 40MHz quartz on board */ 2345 /*********************************/ 2346 2347 dw_Status = 2348 inl(devpriv-> 2349 s_BoardInfos. 2350 ui_Address + 2351 36 + 2352 (64 * b_ModulNbr)); 2353 2354 /******************************/ 2355 /* Test the quartz flag (DQ0) */ 2356 /******************************/ 2357 2358 if ((dw_Status & 1) != 2359 1) { 2360 /*****************************/ 2361 /* 40MHz quartz not on board */ 2362 /*****************************/ 2363 2364 DPRINTK("40MHz quartz not on board\n"); 2365 i_ReturnValue = 2366 -6; 2367 } 2368 } // if (b_PCIInputClock == APCI1710_40MHZ) 2369 2370 /***************************/ 2371 /* Test if error not occur */ 2372 /***************************/ 2373 2374 if (i_ReturnValue == 0) { 2375 /**********************/ 2376 /* Test if 40MHz used */ 2377 /**********************/ 2378 2379 if (b_PCIInputClock == 2380 APCI1710_40MHZ) 2381 { 2382 /*********************************/ 2383 /* Enable the 40MHz quarz (DQ31) */ 2384 /*********************************/ 2385 2386 devpriv-> 2387 s_ModuleInfo 2388 [b_ModulNbr]. 2389 s_SiemensCounterInfo. 2390 s_ModeRegister. 2391 s_ByteModeRegister. 2392 b_ModeRegister4 2393 = 2394 devpriv-> 2395 s_ModuleInfo 2396 [b_ModulNbr]. 2397 s_SiemensCounterInfo. 2398 s_ModeRegister. 2399 s_ByteModeRegister. 2400 b_ModeRegister4 2401 | 2402 APCI1710_ENABLE_40MHZ_FILTER; 2403 2404 } // if (b_PCIInputClock == APCI1710_40MHZ) 2405 else { 2406 /**********************************/ 2407 /* Disable the 40MHz quarz (DQ31) */ 2408 /**********************************/ 2409 2410 devpriv-> 2411 s_ModuleInfo 2412 [b_ModulNbr]. 2413 s_SiemensCounterInfo. 2414 s_ModeRegister. 2415 s_ByteModeRegister. 2416 b_ModeRegister4 2417 = 2418 devpriv-> 2419 s_ModuleInfo 2420 [b_ModulNbr]. 2421 s_SiemensCounterInfo. 2422 s_ModeRegister. 2423 s_ByteModeRegister. 2424 b_ModeRegister4 2425 & 2426 APCI1710_DISABLE_40MHZ_FILTER; 2427 2428 } // if (b_PCIInputClock == APCI1710_40MHZ) 2429 2430 /************************/ 2431 /* Set the filter value */ 2432 /************************/ 2433 2434 devpriv-> 2435 s_ModuleInfo 2436 [b_ModulNbr]. 2437 s_SiemensCounterInfo. 2438 s_ModeRegister. 2439 s_ByteModeRegister. 2440 b_ModeRegister3 2441 = 2442 (devpriv-> 2443 s_ModuleInfo 2444 [b_ModulNbr]. 2445 s_SiemensCounterInfo. 2446 s_ModeRegister. 2447 s_ByteModeRegister. 2448 b_ModeRegister3 2449 & 0x1F) | 2450 ((b_Filter & 2451 0x7) << 2452 5); 2453 2454 devpriv-> 2455 s_ModuleInfo 2456 [b_ModulNbr]. 2457 s_SiemensCounterInfo. 2458 s_ModeRegister. 2459 s_ByteModeRegister. 2460 b_ModeRegister4 2461 = 2462 (devpriv-> 2463 s_ModuleInfo 2464 [b_ModulNbr]. 2465 s_SiemensCounterInfo. 2466 s_ModeRegister. 2467 s_ByteModeRegister. 2468 b_ModeRegister4 2469 & 0xFE) | 2470 ((b_Filter & 2471 0x8) >> 2472 3); 2473 2474 /***************************/ 2475 /* Write the configuration */ 2476 /***************************/ 2477 2478 outl(devpriv-> 2479 s_ModuleInfo 2480 [b_ModulNbr]. 2481 s_SiemensCounterInfo. 2482 s_ModeRegister. 2483 dw_ModeRegister1_2_3_4, 2484 devpriv-> 2485 s_BoardInfos. 2486 ui_Address + 2487 20 + 2488 (64 * b_ModulNbr)); 2489 } // if (i_ReturnValue == 0) 2490 } // if (b_Filter < 16) 2491 else { 2492 /**************************************/ 2493 /* The selected filter value is wrong */ 2494 /**************************************/ 2495 2496 DPRINTK("The selected filter value is wrong\n"); 2497 i_ReturnValue = -5; 2498 } // if (b_Filter < 16) 2499 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) 2500 else { 2501 /*****************************************/ 2502 /* The selected PCI input clock is wrong */ 2503 /*****************************************/ 2504 2505 DPRINTK("The selected PCI input clock is wrong\n"); 2506 i_ReturnValue = 4; 2507 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ) || (b_PCIInputClock == APCI1710_40MHZ)) 2508 } else { 2509 /**************************************/ 2510 /* The module is not a counter module */ 2511 /**************************************/ 2512 2513 DPRINTK("The module is not a counter module\n"); 2514 i_ReturnValue = -3; 2515 } 2516 } else { 2517 /**************************************/ 2518 /* The module is not a counter module */ 2519 /**************************************/ 2520 2521 DPRINTK("The module is not a counter module\n"); 2522 i_ReturnValue = -3; 2523 } 2524 } else { 2525 /*************************************************/ 2526 /* The selected module number parameter is wrong */ 2527 /*************************************************/ 2528 2529 DPRINTK("The selected module number parameter is wrong\n"); 2530 i_ReturnValue = -2; 2531 } 2532 2533 return (i_ReturnValue); 2534} 2535 2536/* 2537+----------------------------------------------------------------------------+ 2538| Function Name : _INT_ i_APCI1710_LatchCounter (unsigned char_ b_BoardHandle, | 2539| unsigned char_ b_ModulNbr, | 2540| unsigned char_ b_LatchReg) | 2541+----------------------------------------------------------------------------+ 2542| Task : Latch the courant value from selected module | 2543| (b_ModulNbr) in to the selected latch register | 2544| (b_LatchReg). | 2545+----------------------------------------------------------------------------+ 2546| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 2547| unsigned char_ b_ModulNbr : Module number to configure | 2548| (0 to 3) | 2549| unsigned char_ b_LatchReg : Selected latch register | 2550| 0 : for the first latch register | 2551| 1 : for the second latch register | 2552+----------------------------------------------------------------------------+ 2553| Output Parameters : - | 2554+----------------------------------------------------------------------------+ 2555| Return Value : 0: No error | 2556| -1: The handle parameter of the board is wrong | 2557| -2: No counter module found | 2558| -3: Counter not initialised see function | 2559| "i_APCI1710_InitCounter" | 2560| -4: The selected latch register parameter is wrong | 2561+----------------------------------------------------------------------------+ 2562*/ 2563 2564int i_APCI1710_LatchCounter(struct comedi_device * dev, 2565 unsigned char b_ModulNbr, unsigned char b_LatchReg) 2566{ 2567 int i_ReturnValue = 0; 2568 2569 /**************************/ 2570 /* Test the module number */ 2571 /**************************/ 2572 2573 if (b_ModulNbr < 4) { 2574 /*******************************/ 2575 /* Test if counter initialised */ 2576 /*******************************/ 2577 2578 if (devpriv-> 2579 s_ModuleInfo[b_ModulNbr]. 2580 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 2581 /*************************************/ 2582 /* Test the latch register parameter */ 2583 /*************************************/ 2584 2585 if (b_LatchReg < 2) { 2586 /*********************/ 2587 /* Tatch the counter */ 2588 /*********************/ 2589 2590 outl(1 << (b_LatchReg * 4), 2591 devpriv->s_BoardInfos.ui_Address + 2592 (64 * b_ModulNbr)); 2593 } else { 2594 /**************************************************/ 2595 /* The selected latch register parameter is wrong */ 2596 /**************************************************/ 2597 2598 DPRINTK("The selected latch register parameter is wrong\n"); 2599 i_ReturnValue = -4; 2600 } 2601 } else { 2602 /****************************************/ 2603 /* Counter not initialised see function */ 2604 /* "i_APCI1710_InitCounter" */ 2605 /****************************************/ 2606 2607 DPRINTK("Counter not initialised\n"); 2608 i_ReturnValue = -3; 2609 } 2610 } else { 2611 /*************************************************/ 2612 /* The selected module number parameter is wrong */ 2613 /*************************************************/ 2614 2615 DPRINTK("The selected module number parameter is wrong\n"); 2616 i_ReturnValue = -2; 2617 } 2618 2619 return (i_ReturnValue); 2620} 2621 2622/* 2623+----------------------------------------------------------------------------+ 2624| Function Name : _INT_ i_APCI1710_SetIndexAndReferenceSource | 2625| (unsigned char_ b_BoardHandle, | 2626| unsigned char_ b_ModulNbr, | 2627| unsigned char_ b_SourceSelection) | 2628+----------------------------------------------------------------------------+ 2629| Task : Determine the hardware source for the index and the | 2630| reference logic. Per default the index logic is | 2631| connected to the difference input C and the reference | 2632| logic is connected to the 24V input E | 2633+----------------------------------------------------------------------------+ 2634| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 2635| unsigned char_ b_ModulNbr : Module number to configure | 2636| (0 to 3) | 2637| unsigned char_ b_SourceSelection : APCI1710_SOURCE_0 : | 2638| The index logic is connected | 2639| to the difference input C and| 2640| the reference logic is | 2641| connected to the 24V input E.| 2642| This is the default | 2643| configuration. | 2644| APCI1710_SOURCE_1 : | 2645| The reference logic is | 2646| connected to the difference | 2647| input C and the index logic | 2648| is connected to the 24V | 2649| input E | 2650+----------------------------------------------------------------------------+ 2651| Output Parameters : - | 2652+----------------------------------------------------------------------------+ 2653| Return Value : 0: No error | 2654| -1: The handle parameter of the board is wrong | 2655| -2: The selected module number is wrong | 2656| -3: The module is not a counter module. | 2657| -4: The source selection is wrong | 2658+----------------------------------------------------------------------------+ 2659*/ 2660 2661int i_APCI1710_SetIndexAndReferenceSource(struct comedi_device * dev, 2662 unsigned char b_ModulNbr, unsigned char b_SourceSelection) 2663{ 2664 int i_ReturnValue = 0; 2665 2666 /**************************/ 2667 /* Test the module number */ 2668 /**************************/ 2669 2670 if (b_ModulNbr < 4) { 2671 /*******************************/ 2672 /* Test if incremental counter */ 2673 /*******************************/ 2674 2675 if ((devpriv->s_BoardInfos. 2676 dw_MolduleConfiguration[b_ModulNbr] & 2677 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) { 2678 /******************************/ 2679 /* Test if firmware >= Rev1.5 */ 2680 /******************************/ 2681 2682 if ((devpriv->s_BoardInfos. 2683 dw_MolduleConfiguration[b_ModulNbr] & 2684 0xFFFF) >= 0x3135) { 2685 /*****************************/ 2686 /* Test the source selection */ 2687 /*****************************/ 2688 2689 if (b_SourceSelection == APCI1710_SOURCE_0 || 2690 b_SourceSelection == APCI1710_SOURCE_1) 2691 { 2692 /******************************************/ 2693 /* Test if invert the index and reference */ 2694 /******************************************/ 2695 2696 if (b_SourceSelection == 2697 APCI1710_SOURCE_1) { 2698 /********************************************/ 2699 /* Invert index and reference source (DQ25) */ 2700 /********************************************/ 2701 2702 devpriv-> 2703 s_ModuleInfo 2704 [b_ModulNbr]. 2705 s_SiemensCounterInfo. 2706 s_ModeRegister. 2707 s_ByteModeRegister. 2708 b_ModeRegister4 = 2709 devpriv-> 2710 s_ModuleInfo 2711 [b_ModulNbr]. 2712 s_SiemensCounterInfo. 2713 s_ModeRegister. 2714 s_ByteModeRegister. 2715 b_ModeRegister4 | 2716 APCI1710_INVERT_INDEX_RFERENCE; 2717 } else { 2718 /****************************************/ 2719 /* Set the default configuration (DQ25) */ 2720 /****************************************/ 2721 2722 devpriv-> 2723 s_ModuleInfo 2724 [b_ModulNbr]. 2725 s_SiemensCounterInfo. 2726 s_ModeRegister. 2727 s_ByteModeRegister. 2728 b_ModeRegister4 = 2729 devpriv-> 2730 s_ModuleInfo 2731 [b_ModulNbr]. 2732 s_SiemensCounterInfo. 2733 s_ModeRegister. 2734 s_ByteModeRegister. 2735 b_ModeRegister4 & 2736 APCI1710_DEFAULT_INDEX_RFERENCE; 2737 } 2738 } // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) 2739 else { 2740 /*********************************/ 2741 /* The source selection is wrong */ 2742 /*********************************/ 2743 2744 DPRINTK("The source selection is wrong\n"); 2745 i_ReturnValue = -4; 2746 } // if (b_SourceSelection == APCI1710_SOURCE_0 ||b_SourceSelection == APCI1710_SOURCE_1) 2747 } else { 2748 /**************************************/ 2749 /* The module is not a counter module */ 2750 /**************************************/ 2751 2752 DPRINTK("The module is not a counter module\n"); 2753 i_ReturnValue = -3; 2754 } 2755 } else { 2756 /**************************************/ 2757 /* The module is not a counter module */ 2758 /**************************************/ 2759 2760 DPRINTK("The module is not a counter module\n"); 2761 i_ReturnValue = -3; 2762 } 2763 } else { 2764 /***************************************/ 2765 /* The selected module number is wrong */ 2766 /***************************************/ 2767 2768 DPRINTK("The selected module number is wrong\n"); 2769 i_ReturnValue = -2; 2770 } 2771 2772 return (i_ReturnValue); 2773} 2774 2775/* 2776+----------------------------------------------------------------------------+ 2777| Function Name : _INT_ i_APCI1710_SetDigitalChlOn | 2778| (unsigned char_ b_BoardHandle, | 2779| unsigned char_ b_ModulNbr) | 2780+----------------------------------------------------------------------------+ 2781| Task : Sets the digital output H Setting an output means | 2782| setting an ouput high. | 2783+----------------------------------------------------------------------------+ 2784| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 2785| unsigned char_ b_ModulNbr : Number of the module to be | 2786| configured (0 to 3) | 2787+----------------------------------------------------------------------------+ 2788| Output Parameters : - | 2789+----------------------------------------------------------------------------+ 2790| Return Value : 0: No error | 2791| -1: The handle parameter of the board is wrong | 2792| -2: The selected module number is wrong | 2793| -3: Counter not initialised see function | 2794| "i_APCI1710_InitCounter" | 2795+----------------------------------------------------------------------------+ 2796*/ 2797 2798int i_APCI1710_SetDigitalChlOn(struct comedi_device * dev, unsigned char b_ModulNbr) 2799{ 2800 int i_ReturnValue = 0; 2801 2802 /**************************/ 2803 /* Test the module number */ 2804 /**************************/ 2805 2806 if (b_ModulNbr < 4) { 2807 /*******************************/ 2808 /* Test if counter initialised */ 2809 /*******************************/ 2810 2811 if (devpriv-> 2812 s_ModuleInfo[b_ModulNbr]. 2813 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 2814 devpriv-> 2815 s_ModuleInfo[b_ModulNbr]. 2816 s_SiemensCounterInfo. 2817 s_ModeRegister. 2818 s_ByteModeRegister. 2819 b_ModeRegister3 = devpriv-> 2820 s_ModuleInfo[b_ModulNbr]. 2821 s_SiemensCounterInfo. 2822 s_ModeRegister. 2823 s_ByteModeRegister.b_ModeRegister3 | 0x10; 2824 2825 /*********************/ 2826 /* Set the output On */ 2827 /*********************/ 2828 2829 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 2830 s_SiemensCounterInfo. 2831 s_ModeRegister. 2832 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos. 2833 ui_Address + 20 + (64 * b_ModulNbr)); 2834 } else { 2835 /****************************************/ 2836 /* Counter not initialised see function */ 2837 /* "i_APCI1710_InitCounter" */ 2838 /****************************************/ 2839 2840 DPRINTK("Counter not initialised\n"); 2841 i_ReturnValue = -3; 2842 } 2843 } else { 2844 /*************************************************/ 2845 /* The selected module number parameter is wrong */ 2846 /*************************************************/ 2847 2848 DPRINTK("The selected module number parameter is wrong\n"); 2849 i_ReturnValue = -2; 2850 } 2851 2852 return (i_ReturnValue); 2853} 2854 2855/* 2856+----------------------------------------------------------------------------+ 2857| Function Name : _INT_ i_APCI1710_SetDigitalChlOff | 2858| (unsigned char_ b_BoardHandle, | 2859| unsigned char_ b_ModulNbr) | 2860+----------------------------------------------------------------------------+ 2861| Task : Resets the digital output H. Resetting an output means | 2862| setting an ouput low. | 2863+----------------------------------------------------------------------------+ 2864| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 2865| unsigned char_ b_ModulNbr : Number of the module to be | 2866| configured (0 to 3) | 2867+----------------------------------------------------------------------------+ 2868| Output Parameters : - | 2869+----------------------------------------------------------------------------+ 2870| Return Value : 0: No error | 2871| -1: The handle parameter of the board is wrong | 2872| -2: The selected module number is wrong | 2873| -3: Counter not initialised see function | 2874| "i_APCI1710_InitCounter" | 2875+----------------------------------------------------------------------------+ 2876*/ 2877 2878int i_APCI1710_SetDigitalChlOff(struct comedi_device * dev, unsigned char b_ModulNbr) 2879{ 2880 int i_ReturnValue = 0; 2881 2882 /**************************/ 2883 /* Test the module number */ 2884 /**************************/ 2885 2886 if (b_ModulNbr < 4) { 2887 /*******************************/ 2888 /* Test if counter initialised */ 2889 /*******************************/ 2890 2891 if (devpriv-> 2892 s_ModuleInfo[b_ModulNbr]. 2893 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 2894 devpriv-> 2895 s_ModuleInfo[b_ModulNbr]. 2896 s_SiemensCounterInfo. 2897 s_ModeRegister. 2898 s_ByteModeRegister. 2899 b_ModeRegister3 = devpriv-> 2900 s_ModuleInfo[b_ModulNbr]. 2901 s_SiemensCounterInfo. 2902 s_ModeRegister. 2903 s_ByteModeRegister.b_ModeRegister3 & 0xEF; 2904 2905 /**********************/ 2906 /* Set the output Off */ 2907 /**********************/ 2908 2909 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 2910 s_SiemensCounterInfo. 2911 s_ModeRegister. 2912 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos. 2913 ui_Address + 20 + (64 * b_ModulNbr)); 2914 } else { 2915 /****************************************/ 2916 /* Counter not initialised see function */ 2917 /* "i_APCI1710_InitCounter" */ 2918 /****************************************/ 2919 2920 DPRINTK("Counter not initialised\n"); 2921 i_ReturnValue = -3; 2922 } 2923 } else { 2924 /*************************************************/ 2925 /* The selected module number parameter is wrong */ 2926 /*************************************************/ 2927 2928 DPRINTK("The selected module number parameter is wrong\n"); 2929 i_ReturnValue = -2; 2930 } 2931 2932 return (i_ReturnValue); 2933} 2934 2935/*########################################################################### */ 2936 2937 // INSN WRITE 2938/*########################################################################### */ 2939 2940/* 2941+----------------------------------------------------------------------------+ 2942| Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s, 2943struct comedi_insn *insn,unsigned int *data) | 2944+----------------------------------------------------------------------------+ 2945| Task : Enable Disable functions for INC_CPT | 2946+----------------------------------------------------------------------------+ 2947| Input Parameters : 2948+----------------------------------------------------------------------------+ 2949| Output Parameters : - | 2950+----------------------------------------------------------------------------+ 2951| Return Value : 2952+----------------------------------------------------------------------------+ 2953*/ 2954int i_APCI1710_InsnWriteINCCPT(struct comedi_device * dev, struct comedi_subdevice * s, 2955 struct comedi_insn * insn, unsigned int * data) 2956{ 2957 unsigned int ui_WriteType; 2958 int i_ReturnValue = 0; 2959 2960 ui_WriteType = CR_CHAN(insn->chanspec); 2961 devpriv->tsk_Current = current; // Save the current process task structure 2962 2963 switch (ui_WriteType) { 2964 case APCI1710_INCCPT_ENABLELATCHINTERRUPT: 2965 i_ReturnValue = i_APCI1710_EnableLatchInterrupt(dev, 2966 (unsigned char) CR_AREF(insn->chanspec)); 2967 break; 2968 2969 case APCI1710_INCCPT_DISABLELATCHINTERRUPT: 2970 i_ReturnValue = i_APCI1710_DisableLatchInterrupt(dev, 2971 (unsigned char) CR_AREF(insn->chanspec)); 2972 break; 2973 2974 case APCI1710_INCCPT_WRITE16BITCOUNTERVALUE: 2975 i_ReturnValue = i_APCI1710_Write16BitCounterValue(dev, 2976 (unsigned char) CR_AREF(insn->chanspec), 2977 (unsigned char) data[0], (unsigned int) data[1]); 2978 break; 2979 2980 case APCI1710_INCCPT_WRITE32BITCOUNTERVALUE: 2981 i_ReturnValue = i_APCI1710_Write32BitCounterValue(dev, 2982 (unsigned char) CR_AREF(insn->chanspec), (ULONG) data[0]); 2983 2984 break; 2985 2986 case APCI1710_INCCPT_ENABLEINDEX: 2987 i_APCI1710_EnableIndex(dev, (unsigned char) CR_AREF(insn->chanspec)); 2988 break; 2989 2990 case APCI1710_INCCPT_DISABLEINDEX: 2991 i_ReturnValue = i_APCI1710_DisableIndex(dev, 2992 (unsigned char) CR_AREF(insn->chanspec)); 2993 break; 2994 2995 case APCI1710_INCCPT_ENABLECOMPARELOGIC: 2996 i_ReturnValue = i_APCI1710_EnableCompareLogic(dev, 2997 (unsigned char) CR_AREF(insn->chanspec)); 2998 break; 2999 3000 case APCI1710_INCCPT_DISABLECOMPARELOGIC: 3001 i_ReturnValue = i_APCI1710_DisableCompareLogic(dev, 3002 (unsigned char) CR_AREF(insn->chanspec)); 3003 break; 3004 3005 case APCI1710_INCCPT_ENABLEFREQUENCYMEASUREMENT: 3006 i_ReturnValue = i_APCI1710_EnableFrequencyMeasurement(dev, 3007 (unsigned char) CR_AREF(insn->chanspec), (unsigned char) data[0]); 3008 break; 3009 3010 case APCI1710_INCCPT_DISABLEFREQUENCYMEASUREMENT: 3011 i_ReturnValue = i_APCI1710_DisableFrequencyMeasurement(dev, 3012 (unsigned char) CR_AREF(insn->chanspec)); 3013 break; 3014 3015 default: 3016 printk("Write Config Parameter Wrong\n"); 3017 } 3018 3019 if (i_ReturnValue >= 0) 3020 i_ReturnValue = insn->n; 3021 return (i_ReturnValue); 3022} 3023 3024/* 3025+----------------------------------------------------------------------------+ 3026| Function Name : _INT_ i_APCI1710_EnableLatchInterrupt | 3027| (unsigned char_ b_BoardHandle, | 3028| unsigned char_ b_ModulNbr) | 3029+----------------------------------------------------------------------------+ 3030| Task : Enable the latch interrupt from selected module | 3031| (b_ModulNbr). Each software or hardware latch occur a | 3032| interrupt. | 3033+----------------------------------------------------------------------------+ 3034| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3035| unsigned char_ b_ModulNbr : Module number to configure | 3036| (0 to 3) | 3037+----------------------------------------------------------------------------+ 3038| Output Parameters : - | 3039+----------------------------------------------------------------------------+ 3040| Return Value : 0: No error | 3041| -1: The handle parameter of the board is wrong | 3042| -2: No counter module found | 3043| -3: Counter not initialised see function | 3044| "i_APCI1710_InitCounter" | 3045| -4: Interrupt routine not installed see function | 3046| "i_APCI1710_SetBoardIntRoutine" | 3047+----------------------------------------------------------------------------+ 3048*/ 3049 3050int i_APCI1710_EnableLatchInterrupt(struct comedi_device * dev, unsigned char b_ModulNbr) 3051{ 3052 int i_ReturnValue = 0; 3053 3054 /**************************/ 3055 /* Test the module number */ 3056 /**************************/ 3057 3058 if (b_ModulNbr < 4) { 3059 /*******************************/ 3060 /* Test if counter initialised */ 3061 /*******************************/ 3062 3063 if (devpriv->s_ModuleInfo[b_ModulNbr]. 3064 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3065 3066 /********************/ 3067 /* Enable interrupt */ 3068 /********************/ 3069 3070 devpriv->s_ModuleInfo[b_ModulNbr]. 3071 s_SiemensCounterInfo. 3072 s_ModeRegister. 3073 s_ByteModeRegister. 3074 b_ModeRegister2 = devpriv-> 3075 s_ModuleInfo[b_ModulNbr]. 3076 s_SiemensCounterInfo. 3077 s_ModeRegister. 3078 s_ByteModeRegister. 3079 b_ModeRegister2 | APCI1710_ENABLE_LATCH_INT; 3080 3081 /***************************/ 3082 /* Write the configuration */ 3083 /***************************/ 3084 3085 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3086 s_SiemensCounterInfo. 3087 s_ModeRegister. 3088 dw_ModeRegister1_2_3_4, devpriv->s_BoardInfos. 3089 ui_Address + 20 + (64 * b_ModulNbr)); 3090 } else { 3091 /****************************************/ 3092 /* Counter not initialised see function */ 3093 /* "i_APCI1710_InitCounter" */ 3094 /****************************************/ 3095 3096 DPRINTK("Counter not initialised\n"); 3097 i_ReturnValue = -3; 3098 } 3099 } else { 3100 /*************************************************/ 3101 /* The selected module number parameter is wrong */ 3102 /*************************************************/ 3103 3104 DPRINTK("The selected module number parameter is wrong\n"); 3105 i_ReturnValue = -2; 3106 } 3107 3108 return (i_ReturnValue); 3109} 3110 3111/* 3112+----------------------------------------------------------------------------+ 3113| Function Name : _INT_ i_APCI1710_DisableLatchInterrupt | 3114| (unsigned char_ b_BoardHandle, | 3115| unsigned char_ b_ModulNbr) | 3116+----------------------------------------------------------------------------+ 3117| Task : Disable the latch interrupt from selected module | 3118| (b_ModulNbr). | 3119+----------------------------------------------------------------------------+ 3120| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3121| unsigned char_ b_ModulNbr : Module number to configure | 3122| (0 to 3) | 3123+----------------------------------------------------------------------------+ 3124| Output Parameters : - | 3125+----------------------------------------------------------------------------+ 3126| Return Value : 0: No error | 3127| -1: The handle parameter of the board is wrong | 3128| -2: No counter module found | 3129| -3: Counter not initialised see function | 3130| "i_APCI1710_InitCounter" | 3131| -4: Interrupt routine not installed see function | 3132| "i_APCI1710_SetBoardIntRoutine" | 3133+----------------------------------------------------------------------------+ 3134*/ 3135 3136int i_APCI1710_DisableLatchInterrupt(struct comedi_device * dev, unsigned char b_ModulNbr) 3137{ 3138 int i_ReturnValue = 0; 3139 3140 /**************************/ 3141 /* Test the module number */ 3142 /**************************/ 3143 3144 if (b_ModulNbr < 4) { 3145 /*******************************/ 3146 /* Test if counter initialised */ 3147 /*******************************/ 3148 3149 if (devpriv-> 3150 s_ModuleInfo[b_ModulNbr]. 3151 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3152 3153 /***************************/ 3154 /* Write the configuration */ 3155 /***************************/ 3156 3157 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3158 s_SiemensCounterInfo. 3159 s_ModeRegister. 3160 dw_ModeRegister1_2_3_4 & 3161 ((APCI1710_DISABLE_LATCH_INT << 8) | 0xFF), 3162 devpriv->s_BoardInfos.ui_Address + 20 + 3163 (64 * b_ModulNbr)); 3164 3165 mdelay(1000); 3166 3167 /*********************/ 3168 /* Disable interrupt */ 3169 /*********************/ 3170 3171 devpriv-> 3172 s_ModuleInfo[b_ModulNbr]. 3173 s_SiemensCounterInfo. 3174 s_ModeRegister. 3175 s_ByteModeRegister. 3176 b_ModeRegister2 = devpriv-> 3177 s_ModuleInfo[b_ModulNbr]. 3178 s_SiemensCounterInfo. 3179 s_ModeRegister. 3180 s_ByteModeRegister. 3181 b_ModeRegister2 & APCI1710_DISABLE_LATCH_INT; 3182 3183 } else { 3184 /****************************************/ 3185 /* Counter not initialised see function */ 3186 /* "i_APCI1710_InitCounter" */ 3187 /****************************************/ 3188 3189 DPRINTK("Counter not initialised\n"); 3190 i_ReturnValue = -3; 3191 } 3192 } else { 3193 /*************************************************/ 3194 /* The selected module number parameter is wrong */ 3195 /*************************************************/ 3196 3197 DPRINTK("The selected module number parameter is wrong\n"); 3198 i_ReturnValue = -2; 3199 } 3200 3201 return (i_ReturnValue); 3202} 3203 3204/* 3205+----------------------------------------------------------------------------+ 3206| Function Name : _INT_ i_APCI1710_Write16BitCounterValue | 3207| (unsigned char_ b_BoardHandle | 3208| unsigned char_ b_ModulNbr, | 3209| unsigned char_ b_SelectedCounter, | 3210| unsigned int_ ui_WriteValue) | 3211+----------------------------------------------------------------------------+ 3212| Task : Write a 16-Bit value (ui_WriteValue) in to the selected| 3213| 16-Bit counter (b_SelectedCounter) from selected module| 3214| (b_ModulNbr). | 3215+----------------------------------------------------------------------------+ 3216| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3217| unsigned char_ b_ModulNbr : Module number to configure | 3218| (0 to 3) | 3219| unsigned char_ b_SelectedCounter : Selected 16-Bit counter | 3220| (0 or 1) | 3221| unsigned int_ ui_WriteValue : 16-Bit write value | 3222+----------------------------------------------------------------------------+ 3223| Output Parameters : - | 3224+----------------------------------------------------------------------------+ 3225| Return Value : 0: No error | 3226| -1: The handle parameter of the board is wrong | 3227| -2: No counter module found | 3228| -3: Counter not initialised see function | 3229| "i_APCI1710_InitCounter" | 3230| -4: The selected 16-Bit counter parameter is wrong | 3231+----------------------------------------------------------------------------+ 3232*/ 3233 3234int i_APCI1710_Write16BitCounterValue(struct comedi_device * dev, 3235 unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int ui_WriteValue) 3236{ 3237 int i_ReturnValue = 0; 3238 3239 /**************************/ 3240 /* Test the module number */ 3241 /**************************/ 3242 3243 if (b_ModulNbr < 4) { 3244 /*******************************/ 3245 /* Test if counter initialised */ 3246 /*******************************/ 3247 3248 if (devpriv-> 3249 s_ModuleInfo[b_ModulNbr]. 3250 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3251 /******************************/ 3252 /* Test the counter selection */ 3253 /******************************/ 3254 3255 if (b_SelectedCounter < 2) { 3256 /*******************/ 3257 /* Write the value */ 3258 /*******************/ 3259 3260 outl((ULONG) ((ULONG) (ui_WriteValue) << (16 * 3261 b_SelectedCounter)), 3262 devpriv->s_BoardInfos.ui_Address + 8 + 3263 (b_SelectedCounter * 4) + 3264 (64 * b_ModulNbr)); 3265 } else { 3266 /**************************************************/ 3267 /* The selected 16-Bit counter parameter is wrong */ 3268 /**************************************************/ 3269 3270 DPRINTK("The selected 16-Bit counter parameter is wrong\n"); 3271 i_ReturnValue = -4; 3272 } 3273 } else { 3274 /****************************************/ 3275 /* Counter not initialised see function */ 3276 /* "i_APCI1710_InitCounter" */ 3277 /****************************************/ 3278 3279 DPRINTK("Counter not initialised\n"); 3280 i_ReturnValue = -3; 3281 } 3282 } else { 3283 /*************************************************/ 3284 /* The selected module number parameter is wrong */ 3285 /*************************************************/ 3286 3287 DPRINTK("The selected module number parameter is wrong\n"); 3288 i_ReturnValue = -2; 3289 } 3290 3291 return (i_ReturnValue); 3292} 3293 3294/* 3295+----------------------------------------------------------------------------+ 3296| Function Name : _INT_ i_APCI1710_Write32BitCounterValue | 3297| (unsigned char_ b_BoardHandle | 3298| unsigned char_ b_ModulNbr, | 3299| ULONG_ ul_WriteValue) | 3300+----------------------------------------------------------------------------+ 3301| Task : Write a 32-Bit value (ui_WriteValue) in to the selected| 3302| module (b_ModulNbr). | 3303+----------------------------------------------------------------------------+ 3304| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3305| unsigned char_ b_ModulNbr : Module number to configure | 3306| (0 to 3) | 3307| ULONG_ ul_WriteValue : 32-Bit write value | 3308+----------------------------------------------------------------------------+ 3309| Output Parameters : - | 3310+----------------------------------------------------------------------------+ 3311| Return Value : 0: No error | 3312| -1: The handle parameter of the board is wrong | 3313| -2: No counter module found | 3314| -3: Counter not initialised see function | 3315| "i_APCI1710_InitCounter" | 3316+----------------------------------------------------------------------------+ 3317*/ 3318 3319int i_APCI1710_Write32BitCounterValue(struct comedi_device * dev, 3320 unsigned char b_ModulNbr, ULONG ul_WriteValue) 3321{ 3322 int i_ReturnValue = 0; 3323 3324 /**************************/ 3325 /* Test the module number */ 3326 /**************************/ 3327 3328 if (b_ModulNbr < 4) { 3329 /*******************************/ 3330 /* Test if counter initialised */ 3331 /*******************************/ 3332 3333 if (devpriv-> 3334 s_ModuleInfo[b_ModulNbr]. 3335 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3336 /*******************/ 3337 /* Write the value */ 3338 /*******************/ 3339 3340 outl(ul_WriteValue, devpriv->s_BoardInfos. 3341 ui_Address + 4 + (64 * b_ModulNbr)); 3342 } else { 3343 /****************************************/ 3344 /* Counter not initialised see function */ 3345 /* "i_APCI1710_InitCounter" */ 3346 /****************************************/ 3347 3348 DPRINTK("Counter not initialised\n"); 3349 i_ReturnValue = -3; 3350 } 3351 } else { 3352 /*************************************************/ 3353 /* The selected module number parameter is wrong */ 3354 /*************************************************/ 3355 3356 DPRINTK("The selected module number parameter is wrong\n"); 3357 i_ReturnValue = -2; 3358 } 3359 3360 return (i_ReturnValue); 3361} 3362 3363/* 3364+----------------------------------------------------------------------------+ 3365| Function Name : _INT_ i_APCI1710_EnableIndex (unsigned char_ b_BoardHandle, | 3366| unsigned char_ b_ModulNbr) | 3367+----------------------------------------------------------------------------+ 3368| Task : Enable the INDEX actions | 3369+----------------------------------------------------------------------------+ 3370| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3371| unsigned char_ b_ModulNbr : Module number to configure | 3372| (0 to 3) | 3373+----------------------------------------------------------------------------+ 3374| Output Parameters : - | 3375+----------------------------------------------------------------------------+ 3376| Return Value : 0: No error | 3377| -1: The handle parameter of the board is wrong | 3378| -2: No counter module found | 3379| -3: Counter not initialised see function | 3380| "i_APCI1710_InitCounter" | 3381| -4: Index not initialised see function | 3382| "i_APCI1710_InitIndex" | 3383+----------------------------------------------------------------------------+ 3384*/ 3385 3386int i_APCI1710_EnableIndex(struct comedi_device * dev, unsigned char b_ModulNbr) 3387{ 3388 int i_ReturnValue = 0; 3389 ULONG ul_InterruptLatchReg; 3390 3391 /**************************/ 3392 /* Test the module number */ 3393 /**************************/ 3394 3395 if (b_ModulNbr < 4) { 3396 /*******************************/ 3397 /* Test if counter initialised */ 3398 /*******************************/ 3399 3400 if (devpriv-> 3401 s_ModuleInfo[b_ModulNbr]. 3402 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3403 /*****************************/ 3404 /* Test if index initialised */ 3405 /*****************************/ 3406 3407 if (devpriv-> 3408 s_ModuleInfo[b_ModulNbr]. 3409 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) { 3410 devpriv-> 3411 s_ModuleInfo[b_ModulNbr]. 3412 s_SiemensCounterInfo. 3413 s_ModeRegister. 3414 s_ByteModeRegister. 3415 b_ModeRegister2 = devpriv-> 3416 s_ModuleInfo[b_ModulNbr]. 3417 s_SiemensCounterInfo. 3418 s_ModeRegister. 3419 s_ByteModeRegister. 3420 b_ModeRegister2 | APCI1710_ENABLE_INDEX; 3421 3422 ul_InterruptLatchReg = 3423 inl(devpriv->s_BoardInfos.ui_Address + 3424 24 + (64 * b_ModulNbr)); 3425 3426 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3427 s_SiemensCounterInfo. 3428 s_ModeRegister. 3429 dw_ModeRegister1_2_3_4, 3430 devpriv->s_BoardInfos.ui_Address + 20 + 3431 (64 * b_ModulNbr)); 3432 } else { 3433 /*************************************************************/ 3434 /* Index not initialised see function "i_APCI1710_InitIndex" */ 3435 /*************************************************************/ 3436 3437 DPRINTK("Index not initialised \n"); 3438 i_ReturnValue = -4; 3439 } 3440 } else { 3441 /****************************************/ 3442 /* Counter not initialised see function */ 3443 /* "i_APCI1710_InitCounter" */ 3444 /****************************************/ 3445 3446 DPRINTK("Counter not initialised\n"); 3447 i_ReturnValue = -3; 3448 } 3449 } else { 3450 /*************************************************/ 3451 /* The selected module number parameter is wrong */ 3452 /*************************************************/ 3453 3454 DPRINTK("The selected module number parameter is wrong\n"); 3455 i_ReturnValue = -2; 3456 } 3457 3458 return (i_ReturnValue); 3459} 3460 3461/* 3462+----------------------------------------------------------------------------+ 3463| Function Name : _INT_ i_APCI1710_DisableIndex (unsigned char_ b_BoardHandle, | 3464| unsigned char_ b_ModulNbr) | 3465+----------------------------------------------------------------------------+ 3466| Task : Disable the INDEX actions | 3467+----------------------------------------------------------------------------+ 3468| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3469| unsigned char_ b_ModulNbr : Module number to configure | 3470| (0 to 3) | 3471+----------------------------------------------------------------------------+ 3472| Output Parameters : - | 3473+----------------------------------------------------------------------------+ 3474| Return Value : 0: No error | 3475| -1: The handle parameter of the board is wrong | 3476| -2: No counter module found | 3477| -3: Counter not initialised see function | 3478| "i_APCI1710_InitCounter" | 3479| -4: Index not initialised see function | 3480| "i_APCI1710_InitIndex" | 3481+----------------------------------------------------------------------------+ 3482*/ 3483 3484int i_APCI1710_DisableIndex(struct comedi_device * dev, unsigned char b_ModulNbr) 3485{ 3486 int i_ReturnValue = 0; 3487 3488 /**************************/ 3489 /* Test the module number */ 3490 /**************************/ 3491 3492 if (b_ModulNbr < 4) { 3493 /*******************************/ 3494 /* Test if counter initialised */ 3495 /*******************************/ 3496 3497 if (devpriv-> 3498 s_ModuleInfo[b_ModulNbr]. 3499 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3500 /*****************************/ 3501 /* Test if index initialised */ 3502 /*****************************/ 3503 3504 if (devpriv-> 3505 s_ModuleInfo[b_ModulNbr]. 3506 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) { 3507 devpriv-> 3508 s_ModuleInfo[b_ModulNbr]. 3509 s_SiemensCounterInfo. 3510 s_ModeRegister. 3511 s_ByteModeRegister. 3512 b_ModeRegister2 = devpriv-> 3513 s_ModuleInfo[b_ModulNbr]. 3514 s_SiemensCounterInfo. 3515 s_ModeRegister. 3516 s_ByteModeRegister. 3517 b_ModeRegister2 & 3518 APCI1710_DISABLE_INDEX; 3519 3520 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3521 s_SiemensCounterInfo. 3522 s_ModeRegister. 3523 dw_ModeRegister1_2_3_4, 3524 devpriv->s_BoardInfos.ui_Address + 20 + 3525 (64 * b_ModulNbr)); 3526 } else { 3527 /*************************************************************/ 3528 /* Index not initialised see function "i_APCI1710_InitIndex" */ 3529 /*************************************************************/ 3530 3531 DPRINTK("Index not initialised \n"); 3532 i_ReturnValue = -4; 3533 } 3534 } else { 3535 /****************************************/ 3536 /* Counter not initialised see function */ 3537 /* "i_APCI1710_InitCounter" */ 3538 /****************************************/ 3539 3540 DPRINTK("Counter not initialised\n"); 3541 i_ReturnValue = -3; 3542 } 3543 } else { 3544 /*************************************************/ 3545 /* The selected module number parameter is wrong */ 3546 /*************************************************/ 3547 3548 DPRINTK("The selected module number parameter is wrong\n"); 3549 i_ReturnValue = -2; 3550 } 3551 3552 return (i_ReturnValue); 3553} 3554 3555/* 3556+----------------------------------------------------------------------------+ 3557| Function Name : _INT_ i_APCI1710_EnableCompareLogic | 3558| (unsigned char_ b_BoardHandle, | 3559| unsigned char_ b_ModulNbr) | 3560+----------------------------------------------------------------------------+ 3561| Task : Enable the 32-Bit compare logic. At that moment that | 3562| the incremental counter arrive to the compare value a | 3563| interrupt is generated. | 3564+----------------------------------------------------------------------------+ 3565| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3566| unsigned char_ b_ModulNbr : Module number to configure | 3567| (0 to 3) | 3568+----------------------------------------------------------------------------+ 3569| Output Parameters : - 3570+----------------------------------------------------------------------------+ 3571| Return Value : 0: No error | 3572| -1: The handle parameter of the board is wrong | 3573| -2: No counter module found | 3574| -3: Counter not initialised see function | 3575| "i_APCI1710_InitCounter" | 3576| -4: Compare logic not initialised. | 3577| See function "i_APCI1710_InitCompareLogic" | 3578| -5: Interrupt function not initialised. | 3579| See function "i_APCI1710_SetBoardIntRoutineX" | 3580+----------------------------------------------------------------------------+ 3581*/ 3582 3583int i_APCI1710_EnableCompareLogic(struct comedi_device * dev, unsigned char b_ModulNbr) 3584{ 3585 int i_ReturnValue = 0; 3586 3587 /**************************/ 3588 /* Test the module number */ 3589 /**************************/ 3590 3591 if (b_ModulNbr < 4) { 3592 /*******************************/ 3593 /* Test if counter initialised */ 3594 /*******************************/ 3595 3596 if (devpriv-> 3597 s_ModuleInfo[b_ModulNbr]. 3598 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3599 /*************************************/ 3600 /* Test if compare logic initialised */ 3601 /*************************************/ 3602 3603 if (devpriv-> 3604 s_ModuleInfo[b_ModulNbr]. 3605 s_SiemensCounterInfo. 3606 s_InitFlag.b_CompareLogicInit == 1) { 3607 devpriv-> 3608 s_ModuleInfo[b_ModulNbr]. 3609 s_SiemensCounterInfo. 3610 s_ModeRegister. 3611 s_ByteModeRegister. 3612 b_ModeRegister3 = devpriv-> 3613 s_ModuleInfo[b_ModulNbr]. 3614 s_SiemensCounterInfo. 3615 s_ModeRegister. 3616 s_ByteModeRegister. 3617 b_ModeRegister3 | 3618 APCI1710_ENABLE_COMPARE_INT; 3619 3620 /***************************/ 3621 /* Write the configuration */ 3622 /***************************/ 3623 3624 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3625 s_SiemensCounterInfo. 3626 s_ModeRegister. 3627 dw_ModeRegister1_2_3_4, 3628 devpriv->s_BoardInfos.ui_Address + 20 + 3629 (64 * b_ModulNbr)); 3630 } else { 3631 /*********************************/ 3632 /* Compare logic not initialised */ 3633 /*********************************/ 3634 3635 DPRINTK("Compare logic not initialised\n"); 3636 i_ReturnValue = -4; 3637 } 3638 } else { 3639 /****************************************/ 3640 /* Counter not initialised see function */ 3641 /* "i_APCI1710_InitCounter" */ 3642 /****************************************/ 3643 3644 DPRINTK("Counter not initialised\n"); 3645 i_ReturnValue = -3; 3646 } 3647 } else { 3648 /*************************************************/ 3649 /* The selected module number parameter is wrong */ 3650 /*************************************************/ 3651 3652 DPRINTK("The selected module number parameter is wrong\n"); 3653 i_ReturnValue = -2; 3654 } 3655 3656 return (i_ReturnValue); 3657} 3658 3659/* 3660+----------------------------------------------------------------------------+ 3661| Function Name : _INT_ i_APCI1710_DisableCompareLogic | 3662| (unsigned char_ b_BoardHandle, | 3663| unsigned char_ b_ModulNbr) | 3664+----------------------------------------------------------------------------+ 3665| Task : Disable the 32-Bit compare logic. 3666+----------------------------------------------------------------------------+ 3667| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3668| unsigned char_ b_ModulNbr : Module number to configure | 3669| (0 to 3) | 3670+----------------------------------------------------------------------------+ 3671| Output Parameters : - 3672+----------------------------------------------------------------------------+ 3673| Return Value : 0: No error | 3674| -1: The handle parameter of the board is wrong | 3675| -2: No counter module found | 3676| -3: Counter not initialised see function | 3677| "i_APCI1710_InitCounter" | 3678| -4: Compare logic not initialised. | 3679| See function "i_APCI1710_InitCompareLogic" | 3680+----------------------------------------------------------------------------+ 3681*/ 3682 3683int i_APCI1710_DisableCompareLogic(struct comedi_device * dev, unsigned char b_ModulNbr) 3684{ 3685 int i_ReturnValue = 0; 3686 3687 /**************************/ 3688 /* Test the module number */ 3689 /**************************/ 3690 3691 if (b_ModulNbr < 4) { 3692 /*******************************/ 3693 /* Test if counter initialised */ 3694 /*******************************/ 3695 3696 if (devpriv-> 3697 s_ModuleInfo[b_ModulNbr]. 3698 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3699 /*************************************/ 3700 /* Test if compare logic initialised */ 3701 /*************************************/ 3702 3703 if (devpriv-> 3704 s_ModuleInfo[b_ModulNbr]. 3705 s_SiemensCounterInfo. 3706 s_InitFlag.b_CompareLogicInit == 1) { 3707 devpriv-> 3708 s_ModuleInfo[b_ModulNbr]. 3709 s_SiemensCounterInfo. 3710 s_ModeRegister. 3711 s_ByteModeRegister. 3712 b_ModeRegister3 = devpriv-> 3713 s_ModuleInfo[b_ModulNbr]. 3714 s_SiemensCounterInfo. 3715 s_ModeRegister. 3716 s_ByteModeRegister. 3717 b_ModeRegister3 & 3718 APCI1710_DISABLE_COMPARE_INT; 3719 3720 /***************************/ 3721 /* Write the configuration */ 3722 /***************************/ 3723 3724 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3725 s_SiemensCounterInfo. 3726 s_ModeRegister. 3727 dw_ModeRegister1_2_3_4, 3728 devpriv->s_BoardInfos.ui_Address + 20 + 3729 (64 * b_ModulNbr)); 3730 } else { 3731 /*********************************/ 3732 /* Compare logic not initialised */ 3733 /*********************************/ 3734 3735 DPRINTK("Compare logic not initialised\n"); 3736 i_ReturnValue = -4; 3737 } 3738 } else { 3739 /****************************************/ 3740 /* Counter not initialised see function */ 3741 /* "i_APCI1710_InitCounter" */ 3742 /****************************************/ 3743 3744 DPRINTK("Counter not initialised\n"); 3745 i_ReturnValue = -3; 3746 } 3747 } else { 3748 /*************************************************/ 3749 /* The selected module number parameter is wrong */ 3750 /*************************************************/ 3751 3752 DPRINTK("The selected module number parameter is wrong\n"); 3753 i_ReturnValue = -2; 3754 } 3755 3756 return (i_ReturnValue); 3757} 3758 3759 /* 3760 +----------------------------------------------------------------------------+ 3761 | Function Name : _INT_ i_APCI1710_EnableFrequencyMeasurement | 3762 | (unsigned char_ b_BoardHandle, | 3763 | unsigned char_ b_ModulNbr, | 3764 | unsigned char_ b_InterruptEnable) | 3765 +----------------------------------------------------------------------------+ 3766 | Task : Enables the frequency measurement function | 3767 +----------------------------------------------------------------------------+ 3768 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3769 | unsigned char_ b_ModulNbr : Number of the module to be | 3770 | configured (0 to 3) | 3771 | unsigned char_ b_InterruptEnable: Enable or disable the | 3772 | interrupt. | 3773 | APCI1710_ENABLE: | 3774 | Enable the interrupt | 3775 | APCI1710_DISABLE: | 3776 | Disable the interrupt | 3777 +----------------------------------------------------------------------------+ 3778 | Output Parameters : - | 3779 +----------------------------------------------------------------------------+ 3780 | Return Value : 0: No error | 3781 | -1: The handle parameter of the board is wrong | 3782 | -2: The selected module number is wrong | 3783 | -3: Counter not initialised see function | 3784 | "i_APCI1710_InitCounter" | 3785 | -4: Frequency measurement logic not initialised. | 3786 | See function "i_APCI1710_InitFrequencyMeasurement" | 3787 | -5: Interrupt parameter is wrong | 3788 | -6: Interrupt function not initialised. | 3789 +----------------------------------------------------------------------------+ 3790 */ 3791 3792int i_APCI1710_EnableFrequencyMeasurement(struct comedi_device * dev, 3793 unsigned char b_ModulNbr, unsigned char b_InterruptEnable) 3794{ 3795 int i_ReturnValue = 0; 3796 3797 /**************************/ 3798 /* Test the module number */ 3799 /**************************/ 3800 3801 if (b_ModulNbr < 4) { 3802 /*******************************/ 3803 /* Test if counter initialised */ 3804 /*******************************/ 3805 3806 if (devpriv-> 3807 s_ModuleInfo[b_ModulNbr]. 3808 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3809 /********************************************/ 3810 /* Test if frequency mesurement initialised */ 3811 /********************************************/ 3812 3813 if (devpriv-> 3814 s_ModuleInfo[b_ModulNbr]. 3815 s_SiemensCounterInfo. 3816 s_InitFlag.b_FrequencyMeasurementInit == 1) { 3817 /***************************/ 3818 /* Test the interrupt mode */ 3819 /***************************/ 3820 3821 if ((b_InterruptEnable == APCI1710_DISABLE) || 3822 (b_InterruptEnable == APCI1710_ENABLE)) 3823 { 3824 3825 /************************************/ 3826 /* Enable the frequency measurement */ 3827 /************************************/ 3828 3829 devpriv-> 3830 s_ModuleInfo[b_ModulNbr]. 3831 s_SiemensCounterInfo. 3832 s_ModeRegister. 3833 s_ByteModeRegister. 3834 b_ModeRegister3 = devpriv-> 3835 s_ModuleInfo[b_ModulNbr]. 3836 s_SiemensCounterInfo. 3837 s_ModeRegister. 3838 s_ByteModeRegister. 3839 b_ModeRegister3 | 3840 APCI1710_ENABLE_FREQUENCY; 3841 3842 /*********************************************/ 3843 /* Disable or enable the frequency interrupt */ 3844 /*********************************************/ 3845 3846 devpriv-> 3847 s_ModuleInfo[b_ModulNbr]. 3848 s_SiemensCounterInfo. 3849 s_ModeRegister. 3850 s_ByteModeRegister. 3851 b_ModeRegister3 = (devpriv-> 3852 s_ModuleInfo[b_ModulNbr]. 3853 s_SiemensCounterInfo. 3854 s_ModeRegister. 3855 s_ByteModeRegister. 3856 b_ModeRegister3 & 3857 APCI1710_DISABLE_FREQUENCY_INT) 3858 | (b_InterruptEnable << 3); 3859 3860 /***************************/ 3861 /* Write the configuration */ 3862 /***************************/ 3863 3864 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3865 s_SiemensCounterInfo. 3866 s_ModeRegister. 3867 dw_ModeRegister1_2_3_4, 3868 devpriv->s_BoardInfos. 3869 ui_Address + 20 + 3870 (64 * b_ModulNbr)); 3871 3872 devpriv-> 3873 s_ModuleInfo[b_ModulNbr]. 3874 s_SiemensCounterInfo. 3875 s_InitFlag. 3876 b_FrequencyMeasurementEnable = 3877 1; 3878 } else { 3879 /********************************/ 3880 /* Interrupt parameter is wrong */ 3881 /********************************/ 3882 3883 DPRINTK("Interrupt parameter is wrong\n"); 3884 i_ReturnValue = -5; 3885 } 3886 } else { 3887 /***********************************************/ 3888 /* Frequency measurement logic not initialised */ 3889 /***********************************************/ 3890 3891 DPRINTK("Frequency measurement logic not initialised\n"); 3892 i_ReturnValue = -4; 3893 } 3894 } else { 3895 /****************************************/ 3896 /* Counter not initialised see function */ 3897 /* "i_APCI1710_InitCounter" */ 3898 /****************************************/ 3899 3900 DPRINTK("Counter not initialised\n"); 3901 i_ReturnValue = -3; 3902 } 3903 } else { 3904 /*************************************************/ 3905 /* The selected module number parameter is wrong */ 3906 /*************************************************/ 3907 3908 DPRINTK("The selected module number parameter is wrong\n"); 3909 i_ReturnValue = -2; 3910 } 3911 3912 return (i_ReturnValue); 3913} 3914 3915 /* 3916 +----------------------------------------------------------------------------+ 3917 | Function Name : _INT_ i_APCI1710_DisableFrequencyMeasurement | 3918 | (unsigned char_ b_BoardHandle, | 3919 | unsigned char_ b_ModulNbr) | 3920 +----------------------------------------------------------------------------+ 3921 | Task : Disables the frequency measurement function | 3922 +----------------------------------------------------------------------------+ 3923 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 3924 | unsigned char_ b_ModulNbr : Number of the module to be | 3925 | configured (0 to 3) | 3926 +----------------------------------------------------------------------------+ 3927 | Output Parameters : - | 3928 +----------------------------------------------------------------------------+ 3929 | Return Value : 0: No error | 3930 | -1: The handle parameter of the board is wrong | 3931 | -2: The selected module number is wrong | 3932 | -3: Counter not initialised see function | 3933 | "i_APCI1710_InitCounter" | 3934 | -4: Frequency measurement logic not initialised. | 3935 | See function "i_APCI1710_InitFrequencyMeasurement" | 3936 +----------------------------------------------------------------------------+ 3937 */ 3938 3939int i_APCI1710_DisableFrequencyMeasurement(struct comedi_device * dev, unsigned char b_ModulNbr) 3940{ 3941 int i_ReturnValue = 0; 3942 3943 /**************************/ 3944 /* Test the module number */ 3945 /**************************/ 3946 3947 if (b_ModulNbr < 4) { 3948 /*******************************/ 3949 /* Test if counter initialised */ 3950 /*******************************/ 3951 3952 if (devpriv-> 3953 s_ModuleInfo[b_ModulNbr]. 3954 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 3955 /********************************************/ 3956 /* Test if frequency mesurement initialised */ 3957 /********************************************/ 3958 3959 if (devpriv-> 3960 s_ModuleInfo[b_ModulNbr]. 3961 s_SiemensCounterInfo. 3962 s_InitFlag.b_FrequencyMeasurementInit == 1) { 3963 /*************************************/ 3964 /* Disable the frequency measurement */ 3965 /*************************************/ 3966 3967 devpriv-> 3968 s_ModuleInfo[b_ModulNbr]. 3969 s_SiemensCounterInfo. 3970 s_ModeRegister. 3971 s_ByteModeRegister. 3972 b_ModeRegister3 = devpriv-> 3973 s_ModuleInfo[b_ModulNbr]. 3974 s_SiemensCounterInfo. 3975 s_ModeRegister. 3976 s_ByteModeRegister. 3977 b_ModeRegister3 & 3978 APCI1710_DISABLE_FREQUENCY 3979 // Begin CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared 3980 & APCI1710_DISABLE_FREQUENCY_INT; 3981 // End CG 29/06/01 CG 1100/0231 -> 0701/0232 Frequence measure IRQ must be cleared 3982 3983 /***************************/ 3984 /* Write the configuration */ 3985 /***************************/ 3986 3987 outl(devpriv->s_ModuleInfo[b_ModulNbr]. 3988 s_SiemensCounterInfo. 3989 s_ModeRegister. 3990 dw_ModeRegister1_2_3_4, 3991 devpriv->s_BoardInfos.ui_Address + 20 + 3992 (64 * b_ModulNbr)); 3993 3994 /*************************************/ 3995 /* Disable the frequency measurement */ 3996 /*************************************/ 3997 3998 devpriv-> 3999 s_ModuleInfo[b_ModulNbr]. 4000 s_SiemensCounterInfo. 4001 s_InitFlag. 4002 b_FrequencyMeasurementEnable = 0; 4003 } else { 4004 /***********************************************/ 4005 /* Frequency measurement logic not initialised */ 4006 /***********************************************/ 4007 4008 DPRINTK("Frequency measurement logic not initialised\n"); 4009 i_ReturnValue = -4; 4010 } 4011 } else { 4012 /****************************************/ 4013 /* Counter not initialised see function */ 4014 /* "i_APCI1710_InitCounter" */ 4015 /****************************************/ 4016 4017 DPRINTK("Counter not initialised\n"); 4018 i_ReturnValue = -3; 4019 } 4020 } else { 4021 /*************************************************/ 4022 /* The selected module number parameter is wrong */ 4023 /*************************************************/ 4024 4025 DPRINTK("The selected module number parameter is wrong\n"); 4026 i_ReturnValue = -2; 4027 } 4028 4029 return (i_ReturnValue); 4030} 4031 4032/*########################################################################### */ 4033 4034 // INSN READ 4035 4036/*########################################################################### */ 4037 4038/* 4039+----------------------------------------------------------------------------+ 4040| Function Name :INT i_APCI1710_InsnWriteINCCPT(struct comedi_device *dev,struct comedi_subdevice *s, 4041struct comedi_insn *insn,unsigned int *data) | 4042+----------------------------------------------------------------------------+ 4043| Task : Read and Get functions for INC_CPT | 4044+----------------------------------------------------------------------------+ 4045| Input Parameters : 4046+----------------------------------------------------------------------------+ 4047| Output Parameters : - | 4048+----------------------------------------------------------------------------+ 4049| Return Value : 4050+----------------------------------------------------------------------------+ 4051*/ 4052int i_APCI1710_InsnReadINCCPT(struct comedi_device * dev, struct comedi_subdevice * s, 4053 struct comedi_insn * insn, unsigned int * data) 4054{ 4055 unsigned int ui_ReadType; 4056 int i_ReturnValue = 0; 4057 4058 ui_ReadType = CR_CHAN(insn->chanspec); 4059 4060 devpriv->tsk_Current = current; // Save the current process task structure 4061 switch (ui_ReadType) { 4062 case APCI1710_INCCPT_READLATCHREGISTERSTATUS: 4063 i_ReturnValue = i_APCI1710_ReadLatchRegisterStatus(dev, 4064 (unsigned char) CR_AREF(insn->chanspec), 4065 (unsigned char) CR_RANGE(insn->chanspec), (unsigned char *) & data[0]); 4066 break; 4067 4068 case APCI1710_INCCPT_READLATCHREGISTERVALUE: 4069 i_ReturnValue = i_APCI1710_ReadLatchRegisterValue(dev, 4070 (unsigned char) CR_AREF(insn->chanspec), 4071 (unsigned char) CR_RANGE(insn->chanspec), (PULONG) & data[0]); 4072 printk("Latch Register Value %d\n", data[0]); 4073 break; 4074 4075 case APCI1710_INCCPT_READ16BITCOUNTERVALUE: 4076 i_ReturnValue = i_APCI1710_Read16BitCounterValue(dev, 4077 (unsigned char) CR_AREF(insn->chanspec), 4078 (unsigned char) CR_RANGE(insn->chanspec), (unsigned int *) & data[0]); 4079 break; 4080 4081 case APCI1710_INCCPT_READ32BITCOUNTERVALUE: 4082 i_ReturnValue = i_APCI1710_Read32BitCounterValue(dev, 4083 (unsigned char) CR_AREF(insn->chanspec), (PULONG) & data[0]); 4084 break; 4085 4086 case APCI1710_INCCPT_GETINDEXSTATUS: 4087 i_ReturnValue = i_APCI1710_GetIndexStatus(dev, 4088 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]); 4089 break; 4090 4091 case APCI1710_INCCPT_GETREFERENCESTATUS: 4092 i_ReturnValue = i_APCI1710_GetReferenceStatus(dev, 4093 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]); 4094 break; 4095 4096 case APCI1710_INCCPT_GETUASSTATUS: 4097 i_ReturnValue = i_APCI1710_GetUASStatus(dev, 4098 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]); 4099 break; 4100 4101 case APCI1710_INCCPT_GETCBSTATUS: 4102 i_ReturnValue = i_APCI1710_GetCBStatus(dev, 4103 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]); 4104 break; 4105 4106 case APCI1710_INCCPT_GET16BITCBSTATUS: 4107 i_ReturnValue = i_APCI1710_Get16BitCBStatus(dev, 4108 (unsigned char) CR_AREF(insn->chanspec), 4109 (unsigned char *) & data[0], (unsigned char *) & data[1]); 4110 break; 4111 4112 case APCI1710_INCCPT_GETUDSTATUS: 4113 i_ReturnValue = i_APCI1710_GetUDStatus(dev, 4114 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]); 4115 4116 break; 4117 4118 case APCI1710_INCCPT_GETINTERRUPTUDLATCHEDSTATUS: 4119 i_ReturnValue = i_APCI1710_GetInterruptUDLatchedStatus(dev, 4120 (unsigned char) CR_AREF(insn->chanspec), (unsigned char *) & data[0]); 4121 break; 4122 4123 case APCI1710_INCCPT_READFREQUENCYMEASUREMENT: 4124 i_ReturnValue = i_APCI1710_ReadFrequencyMeasurement(dev, 4125 (unsigned char) CR_AREF(insn->chanspec), 4126 (unsigned char *) & data[0], 4127 (unsigned char *) & data[1], (PULONG) & data[2]); 4128 break; 4129 4130 case APCI1710_INCCPT_READINTERRUPT: 4131 data[0] = devpriv->s_InterruptParameters. 4132 s_FIFOInterruptParameters[devpriv-> 4133 s_InterruptParameters.ui_Read].b_OldModuleMask; 4134 data[1] = devpriv->s_InterruptParameters. 4135 s_FIFOInterruptParameters[devpriv-> 4136 s_InterruptParameters.ui_Read].ul_OldInterruptMask; 4137 data[2] = devpriv->s_InterruptParameters. 4138 s_FIFOInterruptParameters[devpriv-> 4139 s_InterruptParameters.ui_Read].ul_OldCounterLatchValue; 4140 4141 /**************************/ 4142 /* Increment the read FIFO */ 4143 /***************************/ 4144 4145 devpriv-> 4146 s_InterruptParameters. 4147 ui_Read = (devpriv->s_InterruptParameters. 4148 ui_Read + 1) % APCI1710_SAVE_INTERRUPT; 4149 4150 break; 4151 4152 default: 4153 printk("ReadType Parameter wrong\n"); 4154 } 4155 4156 if (i_ReturnValue >= 0) 4157 i_ReturnValue = insn->n; 4158 return (i_ReturnValue); 4159 4160} 4161 4162/* 4163+----------------------------------------------------------------------------+ 4164| Function Name : _INT_ i_APCI1710_ReadLatchRegisterStatus | 4165| (unsigned char_ b_BoardHandle, | 4166| unsigned char_ b_ModulNbr, | 4167| unsigned char_ b_LatchReg, | 4168| unsigned char *_ pb_LatchStatus) | 4169+----------------------------------------------------------------------------+ 4170| Task : Read the latch register status from selected module | 4171| (b_ModulNbr) and selected latch register (b_LatchReg). | 4172+----------------------------------------------------------------------------+ 4173| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4174| unsigned char_ b_ModulNbr : Module number to configure | 4175| (0 to 3) | 4176| unsigned char_ b_LatchReg : Selected latch register | 4177| 0 : for the first latch register | 4178| 1 : for the second latch register | 4179+----------------------------------------------------------------------------+ 4180| Output Parameters : unsigned char *_ pb_LatchStatus : Latch register status. | 4181| 0 : No latch occur | 4182| 1 : A software latch occur | 4183| 2 : A hardware latch occur | 4184| 3 : A software and hardware | 4185| latch occur | 4186+----------------------------------------------------------------------------+ 4187| Return Value : 0: No error | 4188| -1: The handle parameter of the board is wrong | 4189| -2: No counter module found | 4190| -3: Counter not initialised see function | 4191| "i_APCI1710_InitCounter" | 4192| -4: The selected latch register parameter is wrong | 4193+----------------------------------------------------------------------------+ 4194*/ 4195 4196int i_APCI1710_ReadLatchRegisterStatus(struct comedi_device * dev, 4197 unsigned char b_ModulNbr, unsigned char b_LatchReg, unsigned char * pb_LatchStatus) 4198{ 4199 int i_ReturnValue = 0; 4200 DWORD dw_LatchReg; 4201 4202 /**************************/ 4203 /* Test the module number */ 4204 /**************************/ 4205 4206 if (b_ModulNbr < 4) { 4207 /*******************************/ 4208 /* Test if counter initialised */ 4209 /*******************************/ 4210 4211 if (devpriv-> 4212 s_ModuleInfo[b_ModulNbr]. 4213 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4214 /*************************************/ 4215 /* Test the latch register parameter */ 4216 /*************************************/ 4217 4218 if (b_LatchReg < 2) { 4219 dw_LatchReg = inl(devpriv->s_BoardInfos. 4220 ui_Address + (64 * b_ModulNbr)); 4221 4222 *pb_LatchStatus = 4223 (unsigned char) ((dw_LatchReg >> (b_LatchReg * 4224 4)) & 0x3); 4225 } else { 4226 /**************************************************/ 4227 /* The selected latch register parameter is wrong */ 4228 /**************************************************/ 4229 4230 DPRINTK("The selected latch register parameter is wrong\n"); 4231 i_ReturnValue = -4; 4232 } 4233 } else { 4234 /****************************************/ 4235 /* Counter not initialised see function */ 4236 /* "i_APCI1710_InitCounter" */ 4237 /****************************************/ 4238 4239 DPRINTK("Counter not initialised\n"); 4240 i_ReturnValue = -3; 4241 } 4242 } else { 4243 /*************************************************/ 4244 /* The selected module number parameter is wrong */ 4245 /*************************************************/ 4246 4247 DPRINTK("The selected module number parameter is wrong\n"); 4248 i_ReturnValue = -2; 4249 } 4250 4251 return (i_ReturnValue); 4252} 4253 4254/* 4255+----------------------------------------------------------------------------+ 4256| Function Name : _INT_ i_APCI1710_ReadLatchRegisterValue | 4257| (unsigned char_ b_BoardHandle,| 4258| unsigned char_ b_ModulNbr, | 4259| unsigned char_ b_LatchReg, | 4260| PULONG_ pul_LatchValue) | 4261+----------------------------------------------------------------------------+ 4262| Task : Read the latch register value from selected module | 4263| (b_ModulNbr) and selected latch register (b_LatchReg). | 4264+----------------------------------------------------------------------------+ 4265| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4266| unsigned char_ b_ModulNbr : Module number to configure | 4267| (0 to 3) | 4268| unsigned char_ b_LatchReg : Selected latch register | 4269| 0 : for the first latch register | 4270| 1 : for the second latch register | 4271+----------------------------------------------------------------------------+ 4272| Output Parameters : PULONG_ pul_LatchValue : Latch register value | 4273+----------------------------------------------------------------------------+ 4274| Return Value : 0: No error | 4275| -1: The handle parameter of the board is wrong | 4276| -2: No counter module found | 4277| -3: Counter not initialised see function | 4278| "i_APCI1710_InitCounter" | 4279| -4: The selected latch register parameter is wrong | 4280+----------------------------------------------------------------------------+ 4281*/ 4282 4283int i_APCI1710_ReadLatchRegisterValue(struct comedi_device * dev, 4284 unsigned char b_ModulNbr, unsigned char b_LatchReg, PULONG pul_LatchValue) 4285{ 4286 int i_ReturnValue = 0; 4287 4288 /**************************/ 4289 /* Test the module number */ 4290 /**************************/ 4291 4292 if (b_ModulNbr < 4) { 4293 /*******************************/ 4294 /* Test if counter initialised */ 4295 /*******************************/ 4296 4297 if (devpriv-> 4298 s_ModuleInfo[b_ModulNbr]. 4299 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4300 /*************************************/ 4301 /* Test the latch register parameter */ 4302 /*************************************/ 4303 4304 if (b_LatchReg < 2) { 4305 *pul_LatchValue = inl(devpriv->s_BoardInfos. 4306 ui_Address + ((b_LatchReg + 1) * 4) + 4307 (64 * b_ModulNbr)); 4308 4309 } else { 4310 /**************************************************/ 4311 /* The selected latch register parameter is wrong */ 4312 /**************************************************/ 4313 4314 DPRINTK("The selected latch register parameter is wrong\n"); 4315 i_ReturnValue = -4; 4316 } 4317 } else { 4318 /****************************************/ 4319 /* Counter not initialised see function */ 4320 /* "i_APCI1710_InitCounter" */ 4321 /****************************************/ 4322 4323 DPRINTK("Counter not initialised\n"); 4324 i_ReturnValue = -3; 4325 } 4326 } else { 4327 /*************************************************/ 4328 /* The selected module number parameter is wrong */ 4329 /*************************************************/ 4330 4331 DPRINTK("The selected module number parameter is wrong\n"); 4332 i_ReturnValue = -2; 4333 } 4334 4335 return (i_ReturnValue); 4336} 4337 4338/* 4339+----------------------------------------------------------------------------+ 4340| Function Name : _INT_ i_APCI1710_Read16BitCounterValue | 4341| (unsigned char_ b_BoardHandle, | 4342| unsigned char_ b_ModulNbr, | 4343| unsigned char_ b_SelectedCounter, | 4344| unsigned int *_ pui_CounterValue) | 4345+----------------------------------------------------------------------------+ 4346| Task : Latch the selected 16-Bit counter (b_SelectedCounter) | 4347| from selected module (b_ModulNbr) in to the first | 4348| latch register and return the latched value. | 4349+----------------------------------------------------------------------------+ 4350| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4351| unsigned char_ b_ModulNbr : Module number to configure | 4352| (0 to 3) | 4353| unsigned char_ b_SelectedCounter : Selected 16-Bit counter | 4354| (0 or 1) | 4355+----------------------------------------------------------------------------+ 4356| Output Parameters : unsigned int *_ pui_CounterValue : 16-Bit counter value | 4357+----------------------------------------------------------------------------+ 4358| Return Value : 0: No error | 4359| -1: The handle parameter of the board is wrong | 4360| -2: No counter module found | 4361| -3: Counter not initialised see function | 4362| "i_APCI1710_InitCounter" | 4363| -4: The selected 16-Bit counter parameter is wrong | 4364+----------------------------------------------------------------------------+ 4365*/ 4366 4367int i_APCI1710_Read16BitCounterValue(struct comedi_device * dev, 4368 unsigned char b_ModulNbr, unsigned char b_SelectedCounter, unsigned int * pui_CounterValue) 4369{ 4370 int i_ReturnValue = 0; 4371 DWORD dw_LathchValue = 0; 4372 4373 /**************************/ 4374 /* Test the module number */ 4375 /**************************/ 4376 4377 if (b_ModulNbr < 4) { 4378 /*******************************/ 4379 /* Test if counter initialised */ 4380 /*******************************/ 4381 4382 if (devpriv-> 4383 s_ModuleInfo[b_ModulNbr]. 4384 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4385 /******************************/ 4386 /* Test the counter selection */ 4387 /******************************/ 4388 4389 if (b_SelectedCounter < 2) { 4390 /*********************/ 4391 /* Latch the counter */ 4392 /*********************/ 4393 4394 outl(1, devpriv->s_BoardInfos. 4395 ui_Address + (64 * b_ModulNbr)); 4396 4397 /************************/ 4398 /* Read the latch value */ 4399 /************************/ 4400 4401 dw_LathchValue = inl(devpriv->s_BoardInfos. 4402 ui_Address + 4 + (64 * b_ModulNbr)); 4403 4404 *pui_CounterValue = 4405 (unsigned int) ((dw_LathchValue >> (16 * 4406 b_SelectedCounter)) & 4407 0xFFFFU); 4408 } else { 4409 /**************************************************/ 4410 /* The selected 16-Bit counter parameter is wrong */ 4411 /**************************************************/ 4412 4413 DPRINTK("The selected 16-Bit counter parameter is wrong\n"); 4414 i_ReturnValue = -4; 4415 } 4416 } else { 4417 /****************************************/ 4418 /* Counter not initialised see function */ 4419 /* "i_APCI1710_InitCounter" */ 4420 /****************************************/ 4421 4422 DPRINTK("Counter not initialised\n"); 4423 i_ReturnValue = -3; 4424 } 4425 } else { 4426 /*************************************************/ 4427 /* The selected module number parameter is wrong */ 4428 /*************************************************/ 4429 4430 DPRINTK("The selected module number parameter is wrong\n"); 4431 i_ReturnValue = -2; 4432 } 4433 4434 return (i_ReturnValue); 4435} 4436 4437/* 4438+----------------------------------------------------------------------------+ 4439| Function Name : _INT_ i_APCI1710_Read32BitCounterValue | 4440| (unsigned char_ b_BoardHandle, | 4441| unsigned char_ b_ModulNbr, | 4442| PULONG_ pul_CounterValue) | 4443+----------------------------------------------------------------------------+ 4444| Task : Latch the 32-Bit counter from selected module | 4445| (b_ModulNbr) in to the first latch register and return | 4446| the latched value. | 4447+----------------------------------------------------------------------------+ 4448| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4449| unsigned char_ b_ModulNbr : Module number to configure | 4450| (0 to 3) | 4451+----------------------------------------------------------------------------+ 4452| Output Parameters : PULONG_ pul_CounterValue : 32-Bit counter value | 4453+----------------------------------------------------------------------------+ 4454| Return Value : 0: No error | 4455| -1: The handle parameter of the board is wrong | 4456| -2: No counter module found | 4457| -3: Counter not initialised see function | 4458| "i_APCI1710_InitCounter" | 4459+----------------------------------------------------------------------------+ 4460*/ 4461 4462int i_APCI1710_Read32BitCounterValue(struct comedi_device * dev, 4463 unsigned char b_ModulNbr, PULONG pul_CounterValue) 4464{ 4465 int i_ReturnValue = 0; 4466 4467 /**************************/ 4468 /* Test the module number */ 4469 /**************************/ 4470 4471 if (b_ModulNbr < 4) { 4472 /*******************************/ 4473 /* Test if counter initialised */ 4474 /*******************************/ 4475 4476 if (devpriv-> 4477 s_ModuleInfo[b_ModulNbr]. 4478 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4479 /*********************/ 4480 /* Tatch the counter */ 4481 /*********************/ 4482 4483 outl(1, devpriv->s_BoardInfos. 4484 ui_Address + (64 * b_ModulNbr)); 4485 4486 /************************/ 4487 /* Read the latch value */ 4488 /************************/ 4489 4490 *pul_CounterValue = inl(devpriv->s_BoardInfos. 4491 ui_Address + 4 + (64 * b_ModulNbr)); 4492 } else { 4493 /****************************************/ 4494 /* Counter not initialised see function */ 4495 /* "i_APCI1710_InitCounter" */ 4496 /****************************************/ 4497 4498 DPRINTK("Counter not initialised\n"); 4499 i_ReturnValue = -3; 4500 } 4501 } else { 4502 /*************************************************/ 4503 /* The selected module number parameter is wrong */ 4504 /*************************************************/ 4505 4506 DPRINTK("The selected module number parameter is wrong\n"); 4507 i_ReturnValue = -2; 4508 } 4509 4510 return (i_ReturnValue); 4511} 4512 4513/* 4514+----------------------------------------------------------------------------+ 4515| Function Name : _INT_ i_APCI1710_GetIndexStatus (unsigned char_ b_BoardHandle,| 4516| unsigned char_ b_ModulNbr, | 4517| unsigned char *_ pb_IndexStatus)| 4518+----------------------------------------------------------------------------+ 4519| Task : Return the index status | 4520+----------------------------------------------------------------------------+ 4521| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4522| unsigned char_ b_ModulNbr : Module number to configure | 4523| (0 to 3) | 4524+----------------------------------------------------------------------------+ 4525| Output Parameters : unsigned char *_ pb_IndexStatus : 0 : No INDEX occur | 4526| 1 : A INDEX occur | 4527+----------------------------------------------------------------------------+ 4528| Return Value : 0: No error | 4529| -1: The handle parameter of the board is wrong | 4530| -2: No counter module found | 4531| -3: Counter not initialised see function | 4532| "i_APCI1710_InitCounter" | 4533| -4: Index not initialised see function | 4534| "i_APCI1710_InitIndex" | 4535+----------------------------------------------------------------------------+ 4536*/ 4537 4538int i_APCI1710_GetIndexStatus(struct comedi_device * dev, 4539 unsigned char b_ModulNbr, unsigned char * pb_IndexStatus) 4540{ 4541 int i_ReturnValue = 0; 4542 DWORD dw_StatusReg = 0; 4543 4544 /**************************/ 4545 /* Test the module number */ 4546 /**************************/ 4547 4548 if (b_ModulNbr < 4) { 4549 /*******************************/ 4550 /* Test if counter initialised */ 4551 /*******************************/ 4552 4553 if (devpriv-> 4554 s_ModuleInfo[b_ModulNbr]. 4555 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4556 /*****************************/ 4557 /* Test if index initialised */ 4558 /*****************************/ 4559 4560 if (devpriv-> 4561 s_ModuleInfo[b_ModulNbr]. 4562 s_SiemensCounterInfo.s_InitFlag.b_IndexInit) { 4563 dw_StatusReg = inl(devpriv->s_BoardInfos. 4564 ui_Address + 12 + (64 * b_ModulNbr)); 4565 4566 *pb_IndexStatus = (unsigned char) (dw_StatusReg & 1); 4567 } else { 4568 /*************************************************************/ 4569 /* Index not initialised see function "i_APCI1710_InitIndex" */ 4570 /*************************************************************/ 4571 4572 DPRINTK("Index not initialised\n"); 4573 i_ReturnValue = -4; 4574 } 4575 } else { 4576 /****************************************/ 4577 /* Counter not initialised see function */ 4578 /* "i_APCI1710_InitCounter" */ 4579 /****************************************/ 4580 4581 DPRINTK("Counter not initialised\n"); 4582 i_ReturnValue = -3; 4583 } 4584 } else { 4585 /*************************************************/ 4586 /* The selected module number parameter is wrong */ 4587 /*************************************************/ 4588 4589 DPRINTK("The selected module number parameter is wrong\n"); 4590 i_ReturnValue = -2; 4591 } 4592 4593 return (i_ReturnValue); 4594} 4595 4596/* 4597+----------------------------------------------------------------------------+ 4598| Function Name : _INT_ i_APCI1710_GetReferenceStatus | 4599| (unsigned char_ b_BoardHandle, | 4600| unsigned char_ b_ModulNbr, | 4601| unsigned char *_ pb_ReferenceStatus) | 4602+----------------------------------------------------------------------------+ 4603| Task : Return the reference status | 4604+----------------------------------------------------------------------------+ 4605| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4606| unsigned char_ b_ModulNbr : Module number to configure | 4607| (0 to 3) | 4608+----------------------------------------------------------------------------+ 4609| Output Parameters : unsigned char *_ pb_ReferenceStatus : 0 : No REFERENCE occur | 4610| 1 : A REFERENCE occur | 4611+----------------------------------------------------------------------------+ 4612| Return Value : 0: No error | 4613| -1: The handle parameter of the board is wrong | 4614| -2: No counter module found | 4615| -3: Counter not initialised see function | 4616| "i_APCI1710_InitCounter" | 4617| -4: Reference not initialised see function | 4618| "i_APCI1710_InitReference" | 4619+----------------------------------------------------------------------------+ 4620*/ 4621 4622int i_APCI1710_GetReferenceStatus(struct comedi_device * dev, 4623 unsigned char b_ModulNbr, unsigned char * pb_ReferenceStatus) 4624{ 4625 int i_ReturnValue = 0; 4626 DWORD dw_StatusReg = 0; 4627 4628 /**************************/ 4629 /* Test the module number */ 4630 /**************************/ 4631 4632 if (b_ModulNbr < 4) { 4633 /*******************************/ 4634 /* Test if counter initialised */ 4635 /*******************************/ 4636 4637 if (devpriv-> 4638 s_ModuleInfo[b_ModulNbr]. 4639 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4640 /*********************************/ 4641 /* Test if reference initialised */ 4642 /*********************************/ 4643 4644 if (devpriv-> 4645 s_ModuleInfo[b_ModulNbr]. 4646 s_SiemensCounterInfo. 4647 s_InitFlag.b_ReferenceInit) { 4648 dw_StatusReg = inl(devpriv->s_BoardInfos. 4649 ui_Address + 24 + (64 * b_ModulNbr)); 4650 4651 *pb_ReferenceStatus = 4652 (unsigned char) (~dw_StatusReg & 1); 4653 } else { 4654 /*********************************************************************/ 4655 /* Reference not initialised see function "i_APCI1710_InitReference" */ 4656 /*********************************************************************/ 4657 4658 DPRINTK("Reference not initialised\n"); 4659 i_ReturnValue = -4; 4660 } 4661 } else { 4662 /****************************************/ 4663 /* Counter not initialised see function */ 4664 /* "i_APCI1710_InitCounter" */ 4665 /****************************************/ 4666 4667 DPRINTK("Counter not initialised\n"); 4668 i_ReturnValue = -3; 4669 } 4670 } else { 4671 /*************************************************/ 4672 /* The selected module number parameter is wrong */ 4673 /*************************************************/ 4674 4675 DPRINTK("The selected module number parameter is wrong\n"); 4676 i_ReturnValue = -2; 4677 } 4678 4679 return (i_ReturnValue); 4680} 4681 4682/* 4683+----------------------------------------------------------------------------+ 4684| Function Name : _INT_ i_APCI1710_GetUASStatus | 4685| (unsigned char_ b_BoardHandle, | 4686| unsigned char_ b_ModulNbr, | 4687| unsigned char *_ pb_UASStatus) | 4688+----------------------------------------------------------------------------+ 4689| Task : Return the error signal (UAS) status | 4690+----------------------------------------------------------------------------+ 4691| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4692| unsigned char_ b_ModulNbr : Module number to configure | 4693| (0 to 3) | 4694+----------------------------------------------------------------------------+ 4695| Output Parameters : unsigned char *_ pb_UASStatus : 0 : UAS is low "0" | 4696| 1 : UAS is high "1" | 4697+----------------------------------------------------------------------------+ 4698| Return Value : 0: No error | 4699| -1: The handle parameter of the board is wrong | 4700| -2: No counter module found | 4701| -3: Counter not initialised see function | 4702| "i_APCI1710_InitCounter" | 4703+----------------------------------------------------------------------------+ 4704*/ 4705 4706int i_APCI1710_GetUASStatus(struct comedi_device * dev, 4707 unsigned char b_ModulNbr, unsigned char * pb_UASStatus) 4708{ 4709 int i_ReturnValue = 0; 4710 DWORD dw_StatusReg = 0; 4711 4712 /**************************/ 4713 /* Test the module number */ 4714 /**************************/ 4715 4716 if (b_ModulNbr < 4) { 4717 /*******************************/ 4718 /* Test if counter initialised */ 4719 /*******************************/ 4720 4721 if (devpriv-> 4722 s_ModuleInfo[b_ModulNbr]. 4723 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4724 dw_StatusReg = inl(devpriv->s_BoardInfos. 4725 ui_Address + 24 + (64 * b_ModulNbr)); 4726 4727 *pb_UASStatus = (unsigned char) ((dw_StatusReg >> 1) & 1); 4728 } else { 4729 /****************************************/ 4730 /* Counter not initialised see function */ 4731 /* "i_APCI1710_InitCounter" */ 4732 /****************************************/ 4733 4734 DPRINTK("Counter not initialised\n"); 4735 i_ReturnValue = -3; 4736 } 4737 } else { 4738 /*************************************************/ 4739 /* The selected module number parameter is wrong */ 4740 /*************************************************/ 4741 4742 DPRINTK("The selected module number parameter is wrong\n"); 4743 i_ReturnValue = -2; 4744 4745 } 4746 4747 return (i_ReturnValue); 4748} 4749 4750/* 4751+----------------------------------------------------------------------------+ 4752| Function Name : _INT_ i_APCI1710_GetCBStatus | 4753| (unsigned char_ b_BoardHandle, | 4754| unsigned char_ b_ModulNbr, | 4755| unsigned char *_ pb_CBStatus) | 4756+----------------------------------------------------------------------------+ 4757| Task : Return the counter overflow status | 4758+----------------------------------------------------------------------------+ 4759| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4760| unsigned char_ b_ModulNbr : Module number to configure | 4761| (0 to 3) | 4762+----------------------------------------------------------------------------+ 4763| Output Parameters : unsigned char *_ pb_CBStatus : 0 : Counter no overflow | 4764| 1 : Counter overflow | 4765+----------------------------------------------------------------------------+ 4766| Return Value : 0: No error | 4767| -1: The handle parameter of the board is wrong | 4768| -2: No counter module found | 4769| -3: Counter not initialised see function | 4770| "i_APCI1710_InitCounter" | 4771+----------------------------------------------------------------------------+ 4772*/ 4773 4774int i_APCI1710_GetCBStatus(struct comedi_device * dev, 4775 unsigned char b_ModulNbr, unsigned char * pb_CBStatus) 4776{ 4777 int i_ReturnValue = 0; 4778 DWORD dw_StatusReg = 0; 4779 4780 /**************************/ 4781 /* Test the module number */ 4782 /**************************/ 4783 4784 if (b_ModulNbr < 4) { 4785 /*******************************/ 4786 /* Test if counter initialised */ 4787 /*******************************/ 4788 4789 if (devpriv-> 4790 s_ModuleInfo[b_ModulNbr]. 4791 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4792 dw_StatusReg = inl(devpriv->s_BoardInfos. 4793 ui_Address + 16 + (64 * b_ModulNbr)); 4794 4795 *pb_CBStatus = (unsigned char) (dw_StatusReg & 1); 4796 4797 } else { 4798 /****************************************/ 4799 /* Counter not initialised see function */ 4800 /* "i_APCI1710_InitCounter" */ 4801 /****************************************/ 4802 4803 DPRINTK("Counter not initialised\n"); 4804 i_ReturnValue = -3; 4805 } 4806 } else { 4807 /*************************************************/ 4808 /* The selected module number parameter is wrong */ 4809 /*************************************************/ 4810 4811 DPRINTK("The selected module number parameter is wrong\n"); 4812 i_ReturnValue = -2; 4813 } 4814 4815 return (i_ReturnValue); 4816} 4817 4818/* 4819+----------------------------------------------------------------------------+ 4820| Function Name : _INT_ i_APCI1710_Get16BitCBStatus | 4821| (unsigned char_ b_BoardHandle, | 4822| unsigned char_ b_ModulNbr, | 4823| unsigned char *_ pb_CBStatusCounter0, | 4824| unsigned char *_ pb_CBStatusCounter1) | 4825+----------------------------------------------------------------------------+ 4826| Task : Returns the counter overflow (counter initialised to | 4827| 2*16-bit) status from selected incremental counter | 4828| module | 4829+----------------------------------------------------------------------------+ 4830| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4831| unsigned char_ b_ModulNbr : Module number to configure | 4832| (0 to 3) | 4833+----------------------------------------------------------------------------+ 4834| Output Parameters : unsigned char *_ pb_CBStatusCounter0 : 0 : No overflow occur for | 4835| the first 16-bit | 4836| counter | 4837| 1 : Overflow occur for the| 4838| first 16-bit counter | 4839| unsigned char *_ pb_CBStatusCounter1 : 0 : No overflow occur for | 4840| the second 16-bit | 4841| counter | 4842| 1 : Overflow occur for the| 4843| second 16-bit counter | 4844+----------------------------------------------------------------------------+ 4845| Return Value : 0: No error | 4846| -1: The handle parameter of the board is wrong | 4847| -2: No counter module found | 4848| -3: Counter not initialised see function | 4849| "i_APCI1710_InitCounter" | 4850| -4: Counter not initialised to 2*16-bit mode. | 4851| See function "i_APCI1710_InitCounter" | 4852| -5: Firmware revision error | 4853+----------------------------------------------------------------------------+ 4854*/ 4855 4856int i_APCI1710_Get16BitCBStatus(struct comedi_device * dev, 4857 unsigned char b_ModulNbr, unsigned char * pb_CBStatusCounter0, unsigned char * pb_CBStatusCounter1) 4858{ 4859 int i_ReturnValue = 0; 4860 DWORD dw_StatusReg = 0; 4861 4862 /**************************/ 4863 /* Test the module number */ 4864 /**************************/ 4865 4866 if (b_ModulNbr < 4) { 4867 /*******************************/ 4868 /* Test if counter initialised */ 4869 /*******************************/ 4870 4871 if (devpriv-> 4872 s_ModuleInfo[b_ModulNbr]. 4873 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4874 /*************************/ 4875 /* Test if 2*16-Bit mode */ 4876 /*************************/ 4877 4878 if ((devpriv->s_ModuleInfo[b_ModulNbr]. 4879 s_SiemensCounterInfo. 4880 s_ModeRegister. 4881 s_ByteModeRegister. 4882 b_ModeRegister1 & 0x10) == 0x10) { 4883 /*****************************/ 4884 /* Test the Firmware version */ 4885 /*****************************/ 4886 4887 if ((devpriv->s_BoardInfos. 4888 dw_MolduleConfiguration 4889 [b_ModulNbr] & 0xFFFF) >= 4890 0x3136) { 4891 dw_StatusReg = 4892 inl(devpriv->s_BoardInfos. 4893 ui_Address + 16 + 4894 (64 * b_ModulNbr)); 4895 4896 *pb_CBStatusCounter1 = 4897 (unsigned char) ((dw_StatusReg >> 0) & 4898 1); 4899 *pb_CBStatusCounter0 = 4900 (unsigned char) ((dw_StatusReg >> 1) & 4901 1); 4902 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) 4903 else { 4904 /****************************/ 4905 /* Firmware revision error */ 4906 /****************************/ 4907 4908 i_ReturnValue = -5; 4909 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_BoardInfos.dw_MolduleConfiguration [b_ModulNbr] & 0xFFFF) >= 0x3136) 4910 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) 4911 else { 4912 /********************************************/ 4913 /* Counter not initialised to 2*16-bit mode */ 4914 /* "i_APCI1710_InitCounter" */ 4915 /********************************************/ 4916 4917 DPRINTK("Counter not initialised\n"); 4918 i_ReturnValue = -4; 4919 } // if ((ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & 0x10) == 0x10) 4920 } // if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) 4921 else { 4922 /****************************************/ 4923 /* Counter not initialised see function */ 4924 /* "i_APCI1710_InitCounter" */ 4925 /****************************************/ 4926 4927 DPRINTK("Counter not initialised\n"); 4928 i_ReturnValue = -3; 4929 } // if (ps_APCI1710Variable->s_Board [b_BoardHandle].s_ModuleInfo [b_ModulNbr].s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) 4930 } // if (b_ModulNbr < 4) 4931 else { 4932 /*************************************************/ 4933 /* The selected module number parameter is wrong */ 4934 /*************************************************/ 4935 4936 DPRINTK("The selected module number parameter is wrong\n"); 4937 i_ReturnValue = -2; 4938 } // if (b_ModulNbr < 4) 4939 4940 return (i_ReturnValue); 4941} 4942 4943/* 4944+----------------------------------------------------------------------------+ 4945| Function Name : _INT_ i_APCI1710_GetUDStatus | 4946| (unsigned char_ b_BoardHandle, | 4947| unsigned char_ b_ModulNbr, | 4948| unsigned char *_ pb_UDStatus) | 4949+----------------------------------------------------------------------------+ 4950| Task : Return the counter progress status | 4951+----------------------------------------------------------------------------+ 4952| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 4953| unsigned char_ b_ModulNbr : Module number to configure | 4954| (0 to 3) | 4955+----------------------------------------------------------------------------+ 4956| Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the | 4957| selected mode down | 4958| 1 : Counter progress in the | 4959| selected mode up | 4960+----------------------------------------------------------------------------+ 4961| Return Value : 0: No error | 4962| -1: The handle parameter of the board is wrong | 4963| -2: No counter module found | 4964| -3: Counter not initialised see function | 4965| "i_APCI1710_InitCounter" | 4966+----------------------------------------------------------------------------+ 4967*/ 4968 4969int i_APCI1710_GetUDStatus(struct comedi_device * dev, 4970 unsigned char b_ModulNbr, unsigned char * pb_UDStatus) 4971{ 4972 int i_ReturnValue = 0; 4973 DWORD dw_StatusReg = 0; 4974 4975 /**************************/ 4976 /* Test the module number */ 4977 /**************************/ 4978 4979 if (b_ModulNbr < 4) { 4980 /*******************************/ 4981 /* Test if counter initialised */ 4982 /*******************************/ 4983 4984 if (devpriv-> 4985 s_ModuleInfo[b_ModulNbr]. 4986 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 4987 dw_StatusReg = inl(devpriv->s_BoardInfos. 4988 ui_Address + 24 + (64 * b_ModulNbr)); 4989 4990 *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 2) & 1); 4991 4992 } else { 4993 /****************************************/ 4994 /* Counter not initialised see function */ 4995 /* "i_APCI1710_InitCounter" */ 4996 /****************************************/ 4997 4998 DPRINTK("Counter not initialised\n"); 4999 i_ReturnValue = -3; 5000 } 5001 } else { 5002 /*************************************************/ 5003 /* The selected module number parameter is wrong */ 5004 /*************************************************/ 5005 5006 DPRINTK("The selected module number parameter is wrong\n"); 5007 i_ReturnValue = -2; 5008 } 5009 5010 return (i_ReturnValue); 5011} 5012 5013/* 5014+----------------------------------------------------------------------------+ 5015| Function Name : _INT_ i_APCI1710_GetInterruptUDLatchedStatus | 5016| (unsigned char_ b_BoardHandle, | 5017| unsigned char_ b_ModulNbr, | 5018| unsigned char *_ pb_UDStatus) | 5019+----------------------------------------------------------------------------+ 5020| Task : Return the counter progress latched status after a | 5021| index interrupt occur. | 5022+----------------------------------------------------------------------------+ 5023| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 5024| unsigned char_ b_ModulNbr : Module number to configure | 5025| (0 to 3) | 5026+----------------------------------------------------------------------------+ 5027| Output Parameters : unsigned char *_ pb_UDStatus : 0 : Counter progress in the | 5028| selected mode down | 5029| 1 : Counter progress in the | 5030| selected mode up | 5031| 2 : No index interrupt occur | 5032+----------------------------------------------------------------------------+ 5033| Return Value : 0: No error | 5034| -1: The handle parameter of the board is wrong | 5035| -2: No counter module found | 5036| -3: Counter not initialised see function | 5037| "i_APCI1710_InitCounter" | 5038| -4: Interrupt function not initialised. | 5039| See function "i_APCI1710_SetBoardIntRoutineX" | 5040+----------------------------------------------------------------------------+ 5041*/ 5042 5043int i_APCI1710_GetInterruptUDLatchedStatus(struct comedi_device * dev, 5044 unsigned char b_ModulNbr, unsigned char * pb_UDStatus) 5045{ 5046 int i_ReturnValue = 0; 5047 DWORD dw_StatusReg = 0; 5048 5049 /**************************/ 5050 /* Test the module number */ 5051 /**************************/ 5052 5053 if (b_ModulNbr < 4) { 5054 /*******************************/ 5055 /* Test if counter initialised */ 5056 /*******************************/ 5057 5058 if (devpriv-> 5059 s_ModuleInfo[b_ModulNbr]. 5060 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 5061 /*********************************/ 5062 /* Test if index interrupt occur */ 5063 /*********************************/ 5064 5065 if (devpriv-> 5066 s_ModuleInfo[b_ModulNbr]. 5067 s_SiemensCounterInfo. 5068 s_InitFlag.b_IndexInterruptOccur == 1) { 5069 devpriv-> 5070 s_ModuleInfo[b_ModulNbr]. 5071 s_SiemensCounterInfo. 5072 s_InitFlag.b_IndexInterruptOccur = 0; 5073 5074 dw_StatusReg = inl(devpriv->s_BoardInfos. 5075 ui_Address + 12 + (64 * b_ModulNbr)); 5076 5077 *pb_UDStatus = (unsigned char) ((dw_StatusReg >> 1) & 1); 5078 } else { 5079 /****************************/ 5080 /* No index interrupt occur */ 5081 /****************************/ 5082 5083 *pb_UDStatus = 2; 5084 } 5085 } else { 5086 /****************************************/ 5087 /* Counter not initialised see function */ 5088 /* "i_APCI1710_InitCounter" */ 5089 /****************************************/ 5090 5091 DPRINTK("Counter not initialised\n"); 5092 i_ReturnValue = -3; 5093 } 5094 } else { 5095 /*************************************************/ 5096 /* The selected module number parameter is wrong */ 5097 /*************************************************/ 5098 5099 DPRINTK("The selected module number parameter is wrong\n"); 5100 i_ReturnValue = -2; 5101 } 5102 5103 return (i_ReturnValue); 5104} 5105 5106 /* 5107 +----------------------------------------------------------------------------+ 5108 | Function Name : _INT_ i_APCI1710_ReadFrequencyMeasurement | 5109 | (unsigned char_ b_BoardHandle, | 5110 | unsigned char_ b_ModulNbr, | 5111 | unsigned char *_ pb_Status, | 5112 | PULONG_ pul_ReadValue) | 5113 +----------------------------------------------------------------------------+ 5114 | Task : Returns the status (pb_Status) and the number of | 5115 | increments in the set time. | 5116 | See function " i_APCI1710_InitFrequencyMeasurement " | 5117 +----------------------------------------------------------------------------+ 5118 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 5119 | unsigned char_ b_ModulNbr : Number of the module to be | 5120 | configured (0 to 3) | 5121 +----------------------------------------------------------------------------+ 5122 | Output Parameters : unsigned char *_ pb_Status : Returns the frequency | 5123 | measurement status | 5124 | 0 : Counting cycle not | 5125 | started. | 5126 | 1 : Counting cycle started. | 5127 | 2 : Counting cycle stopped. | 5128 | The measurement cycle is | 5129 | completed. | 5130 | unsigned char *_ pb_UDStatus : 0 : Counter progress in the | 5131 | selected mode down | 5132 | 1 : Counter progress in the | 5133 | selected mode up | 5134 | PULONG_ pul_ReadValue : Return the number of | 5135 | increments in the defined | 5136 | time base. | 5137 +----------------------------------------------------------------------------+ 5138 | Return Value : 0: No error | 5139 | -1: The handle parameter of the board is wrong | 5140 | -2: The selected module number is wrong | 5141 | -3: Counter not initialised see function | 5142 | "i_APCI1710_InitCounter" | 5143 | -4: Frequency measurement logic not initialised. | 5144 | See function "i_APCI1710_InitFrequencyMeasurement" | 5145 +----------------------------------------------------------------------------+ 5146 */ 5147 5148int i_APCI1710_ReadFrequencyMeasurement(struct comedi_device * dev, 5149 unsigned char b_ModulNbr, 5150 unsigned char * pb_Status, unsigned char * pb_UDStatus, PULONG pul_ReadValue) 5151{ 5152 int i_ReturnValue = 0; 5153 unsigned int ui_16BitValue; 5154 DWORD dw_StatusReg; 5155 5156 /**************************/ 5157 /* Test the module number */ 5158 /**************************/ 5159 5160 if (b_ModulNbr < 4) { 5161 /*******************************/ 5162 /* Test if counter initialised */ 5163 /*******************************/ 5164 5165 if (devpriv-> 5166 s_ModuleInfo[b_ModulNbr]. 5167 s_SiemensCounterInfo.s_InitFlag.b_CounterInit == 1) { 5168 /********************************************/ 5169 /* Test if frequency mesurement initialised */ 5170 /********************************************/ 5171 5172 if (devpriv-> 5173 s_ModuleInfo[b_ModulNbr]. 5174 s_SiemensCounterInfo. 5175 s_InitFlag.b_FrequencyMeasurementInit == 1) { 5176 /******************/ 5177 /* Test if enable */ 5178 /******************/ 5179 5180 if (devpriv-> 5181 s_ModuleInfo[b_ModulNbr]. 5182 s_SiemensCounterInfo. 5183 s_InitFlag. 5184 b_FrequencyMeasurementEnable == 1) { 5185 /*******************/ 5186 /* Read the status */ 5187 /*******************/ 5188 5189 dw_StatusReg = 5190 inl(devpriv->s_BoardInfos. 5191 ui_Address + 32 + 5192 (64 * b_ModulNbr)); 5193 5194 /**************************/ 5195 /* Test if frequency stop */ 5196 /**************************/ 5197 5198 if (dw_StatusReg & 1) { 5199 *pb_Status = 2; 5200 *pb_UDStatus = 5201 (unsigned char) ((dw_StatusReg >> 5202 1) & 3); 5203 5204 /******************/ 5205 /* Read the value */ 5206 /******************/ 5207 5208 *pul_ReadValue = 5209 inl(devpriv-> 5210 s_BoardInfos. 5211 ui_Address + 28 + 5212 (64 * b_ModulNbr)); 5213 5214 if (*pb_UDStatus == 0) { 5215 /*************************/ 5216 /* Test the counter mode */ 5217 /*************************/ 5218 5219 if ((devpriv->s_ModuleInfo[b_ModulNbr].s_SiemensCounterInfo.s_ModeRegister.s_ByteModeRegister.b_ModeRegister1 & APCI1710_16BIT_COUNTER) == APCI1710_16BIT_COUNTER) { 5220 /****************************************/ 5221 /* Test if 16-bit counter 1 pulse occur */ 5222 /****************************************/ 5223 5224 if ((*pul_ReadValue & 0xFFFFU) != 0) { 5225 ui_16BitValue 5226 = 5227 (unsigned int) 5228 * 5229 pul_ReadValue 5230 & 5231 0xFFFFU; 5232 *pul_ReadValue 5233 = 5234 (*pul_ReadValue 5235 & 5236 0xFFFF0000UL) 5237 | 5238 (0xFFFFU 5239 - 5240 ui_16BitValue); 5241 } 5242 5243 /****************************************/ 5244 /* Test if 16-bit counter 2 pulse occur */ 5245 /****************************************/ 5246 5247 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) { 5248 ui_16BitValue 5249 = 5250 (unsigned int) 5251 ( 5252 (*pul_ReadValue 5253 >> 5254 16) 5255 & 5256 0xFFFFU); 5257 *pul_ReadValue 5258 = 5259 (*pul_ReadValue 5260 & 5261 0xFFFFUL) 5262 | 5263 ( 5264 (0xFFFFU - ui_16BitValue) << 16); 5265 } 5266 } else { 5267 if (*pul_ReadValue != 0) { 5268 *pul_ReadValue 5269 = 5270 0xFFFFFFFFUL 5271 - 5272 *pul_ReadValue; 5273 } 5274 } 5275 } else { 5276 if (*pb_UDStatus == 1) { 5277 /****************************************/ 5278 /* Test if 16-bit counter 2 pulse occur */ 5279 /****************************************/ 5280 5281 if ((*pul_ReadValue & 0xFFFF0000UL) != 0) { 5282 ui_16BitValue 5283 = 5284 (unsigned int) 5285 ( 5286 (*pul_ReadValue 5287 >> 5288 16) 5289 & 5290 0xFFFFU); 5291 *pul_ReadValue 5292 = 5293 (*pul_ReadValue 5294 & 5295 0xFFFFUL) 5296 | 5297 ( 5298 (0xFFFFU - ui_16BitValue) << 16); 5299 } 5300 } else { 5301 if (*pb_UDStatus 5302 == 2) { 5303 /****************************************/ 5304 /* Test if 16-bit counter 1 pulse occur */ 5305 /****************************************/ 5306 5307 if ((*pul_ReadValue & 0xFFFFU) != 0) { 5308 ui_16BitValue 5309 = 5310 (unsigned int) 5311 * 5312 pul_ReadValue 5313 & 5314 0xFFFFU; 5315 *pul_ReadValue 5316 = 5317 (*pul_ReadValue 5318 & 5319 0xFFFF0000UL) 5320 | 5321 (0xFFFFU 5322 - 5323 ui_16BitValue); 5324 } 5325 } 5326 } 5327 } 5328 } else { 5329 *pb_Status = 1; 5330 *pb_UDStatus = 0; 5331 } 5332 } else { 5333 *pb_Status = 0; 5334 *pb_UDStatus = 0; 5335 } 5336 } else { 5337 /***********************************************/ 5338 /* Frequency measurement logic not initialised */ 5339 /***********************************************/ 5340 5341 DPRINTK("Frequency measurement logic not initialised\n"); 5342 i_ReturnValue = -4; 5343 } 5344 } else { 5345 /****************************************/ 5346 /* Counter not initialised see function */ 5347 /* "i_APCI1710_InitCounter" */ 5348 /****************************************/ 5349 5350 DPRINTK("Counter not initialised\n"); 5351 i_ReturnValue = -3; 5352 } 5353 } else { 5354 /*************************************************/ 5355 /* The selected module number parameter is wrong */ 5356 /*************************************************/ 5357 5358 DPRINTK("The selected module number parameter is wrong\n"); 5359 i_ReturnValue = -2; 5360 } 5361 5362 return (i_ReturnValue); 5363} 5364