APCI1710_Tor.c revision 1783fbfe023b7c2b912fbb020e01ff46985aa0ab
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 +-----------------------------------------------------------------------+ 27 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier | 28 +-----------------------------------------------------------------------+ 29 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com | 30 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com | 31 +-----------------------------------------------------------------------+ 32 | Project : API APCI1710 | Compiler : gcc | 33 | Module name : TOR.C | Version : 2.96 | 34 +-------------------------------+---------------------------------------+ 35 | Project manager: Eric Stolz | Date : 02/12/2002 | 36 +-----------------------------------------------------------------------+ 37 | Description : APCI-1710 tor counter module | 38 | | 39 | | 40 +-----------------------------------------------------------------------+ 41 | UPDATES | 42 +-----------------------------------------------------------------------+ 43 | Date | Author | Description of updates | 44 +----------+-----------+------------------------------------------------+ 45 | 27/01/99 | S. Weber | 40 MHz implementation | 46 +-----------------------------------------------------------------------+ 47 | 28/04/00 | S. Weber | Simple,double and quadruple mode implementation| 48 | | | Extern clock implementation | 49 +-----------------------------------------------------------------------+ 50 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 | 51 | | | available | 52 +-----------------------------------------------------------------------+ 53*/ 54 55/* 56+----------------------------------------------------------------------------+ 57| Included files | 58+----------------------------------------------------------------------------+ 59*/ 60 61#include "APCI1710_Tor.h" 62 63/* 64+----------------------------------------------------------------------------+ 65| Function Name : _INT_ i_APCI1710_InitTorCounter | 66| (unsigned char_ b_BoardHandle, | 67| unsigned char_ b_ModulNbr, | 68| unsigned char_ b_TorCounter, | 69| unsigned char_ b_PCIInputClock, | 70| unsigned char_ b_TimingUnit, | 71| ULONG_ ul_TimingInterval, | 72| PULONG_ pul_RealTimingInterval) | 73+----------------------------------------------------------------------------+ 74| Task : Configure the selected tor counter (b_TorCounter) | 75| from selected module (b_ModulNbr). | 76| The ul_TimingInterval and ul_TimingUnit determine the | 77| timing base for the measurement. | 78| The pul_RealTimingInterval return the real timing | 79| value. You must calling this function be for you call | 80| any other function witch access of the tor counter. | 81| | 82+----------------------------------------------------------------------------+ 83| Input Parameters : | 84| 85 CR_AREF unsigned char_ b_ModulNbr : Module number to configure | 86| (0 to 3) | 87| data[0] unsigned char_ b_TorCounter : Tor counter selection | 88| (0 or 1). | 89| data[1] unsigned char_ b_PCIInputClock : Selection from PCI bus clock| 90| - APCI1710_30MHZ : | 91| The PC have a PCI bus | 92| clock from 30 MHz | 93| - APCI1710_33MHZ : | 94| The PC have a PCI bus | 95| clock from 33 MHz | 96| - APCI1710_40MHZ | 97| The APCI-1710 have a | 98| integrated 40Mhz | 99| quartz. | 100| - APCI1710_GATE_INPUT | 101| Used the gate input for | 102| the base clock. If you | 103| have selected this option,| 104| than it is not possibl to | 105| used the gate input for | 106| enabled the acquisition | 107| data[2] unsigned char_ b_TimingUnit : Base timing unit (0 to 4) | 108| 0 : ns | 109| 1 : µs | 110| 2 : ms | 111| 3 : s | 112| 4 : mn | 113| data[3] ULONG_ ul_TimingInterval : Base timing value. | 114+----------------------------------------------------------------------------+ 115| Output Parameters : PULONG_ pul_RealTimingInterval : Real base timing | 116| data[0] value. | 117+----------------------------------------------------------------------------+ 118| Return Value : 0: No error | 119| -1: The handle parameter of the board is wrong | 120| -2: Module selection wrong | 121| -3: The module is not a tor counter module | 122| -4: Tor counter selection is wrong | 123| -5: The selected PCI input clock is wrong | 124| -6: Timing unit selection is wrong | 125| -7: Base timing selection is wrong | 126| -8: You can not used the 40MHz clock selection wich | 127| this board | 128| -9: You can not used the 40MHz clock selection wich | 129| this TOR version | 130+----------------------------------------------------------------------------+ 131*/ 132 133INT i_APCI1710_InsnConfigInitTorCounter(struct comedi_device * dev, 134 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data) 135{ 136 INT i_ReturnValue = 0; 137 ULONG ul_TimerValue = 0; 138 DWORD dw_Command; 139 double d_RealTimingInterval = 0; 140 unsigned char b_ModulNbr; 141 unsigned char b_TorCounter; 142 unsigned char b_PCIInputClock; 143 unsigned char b_TimingUnit; 144 ULONG ul_TimingInterval; 145 ULONG ul_RealTimingInterval = 0; 146 147 i_ReturnValue = insn->n; 148 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec); 149 150 b_TorCounter = (unsigned char) data[0]; 151 b_PCIInputClock = (unsigned char) data[1]; 152 b_TimingUnit = (unsigned char) data[2]; 153 ul_TimingInterval = (ULONG) data[3]; 154 printk("INPUT clock %d\n", b_PCIInputClock); 155 156 /**************************/ 157 /* Test the module number */ 158 /**************************/ 159 160 if (b_ModulNbr < 4) { 161 /***********************/ 162 /* Test if tor counter */ 163 /***********************/ 164 165 if ((devpriv->s_BoardInfos. 166 dw_MolduleConfiguration[b_ModulNbr] & 167 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { 168 /**********************************/ 169 /* Test the tor counter selection */ 170 /**********************************/ 171 172 if (b_TorCounter <= 1) { 173 /**************************/ 174 /* Test the PCI bus clock */ 175 /**************************/ 176 177 if ((b_PCIInputClock == APCI1710_30MHZ) || 178 (b_PCIInputClock == APCI1710_33MHZ) || 179 (b_PCIInputClock == APCI1710_40MHZ) || 180 (b_PCIInputClock == 181 APCI1710_GATE_INPUT)) { 182 /************************/ 183 /* Test the timing unit */ 184 /************************/ 185 186 if ((b_TimingUnit <= 4) 187 || (b_PCIInputClock == 188 APCI1710_GATE_INPUT)) { 189 /**********************************/ 190 /* Test the base timing selection */ 191 /**********************************/ 192 193 if (((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 133) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230650UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 9UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 121) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691043UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 520UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 8UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 100) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496729UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 7UL)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && (ul_TimingInterval >= 2))) { 194 /**************************/ 195 /* Test the board version */ 196 /**************************/ 197 198 if (((b_PCIInputClock == APCI1710_40MHZ) && (devpriv->s_BoardInfos.b_BoardVersion > 0)) || (b_PCIInputClock != APCI1710_40MHZ)) { 199 /************************/ 200 /* Test the TOR version */ 201 /************************/ 202 203 if (((b_PCIInputClock == APCI1710_40MHZ) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3132)) || (b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) { 204 /*********************************/ 205 /* Test if not extern clock used */ 206 /*********************************/ 207 208 if (b_PCIInputClock != APCI1710_GATE_INPUT) { 209 fpu_begin 210 (); 211 /****************************************/ 212 /* Calculate the timer 0 division fator */ 213 /****************************************/ 214 215 switch (b_TimingUnit) { 216 /******/ 217 /* ns */ 218 /******/ 219 220 case 0: 221 222 /******************/ 223 /* Timer 0 factor */ 224 /******************/ 225 226 ul_TimerValue 227 = 228 (ULONG) 229 (ul_TimingInterval 230 * 231 (0.00025 * b_PCIInputClock)); 232 233 /*******************/ 234 /* Round the value */ 235 /*******************/ 236 237 if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 238 ul_TimerValue 239 = 240 ul_TimerValue 241 + 242 1; 243 } 244 245 /*****************************/ 246 /* Calculate the real timing */ 247 /*****************************/ 248 249 ul_RealTimingInterval 250 = 251 (ULONG) 252 (ul_TimerValue 253 / 254 (0.00025 * (double)b_PCIInputClock)); 255 d_RealTimingInterval 256 = 257 (double) 258 ul_TimerValue 259 / 260 (0.00025 261 * 262 (double) 263 b_PCIInputClock); 264 265 if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) { 266 ul_RealTimingInterval 267 = 268 ul_RealTimingInterval 269 + 270 1; 271 } 272 273 ul_TimingInterval 274 = 275 ul_TimingInterval 276 - 277 1; 278 ul_TimerValue 279 = 280 ul_TimerValue 281 - 282 2; 283 284 if (b_PCIInputClock != APCI1710_40MHZ) { 285 ul_TimerValue 286 = 287 (ULONG) 288 ( 289 (double) 290 (ul_TimerValue) 291 * 292 1.007752288); 293 } 294 295 break; 296 297 /******/ 298 /* æs */ 299 /******/ 300 301 case 1: 302 303 /******************/ 304 /* Timer 0 factor */ 305 /******************/ 306 307 ul_TimerValue 308 = 309 (ULONG) 310 (ul_TimingInterval 311 * 312 (0.25 * b_PCIInputClock)); 313 314 /*******************/ 315 /* Round the value */ 316 /*******************/ 317 318 if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 319 ul_TimerValue 320 = 321 ul_TimerValue 322 + 323 1; 324 } 325 326 /*****************************/ 327 /* Calculate the real timing */ 328 /*****************************/ 329 330 ul_RealTimingInterval 331 = 332 (ULONG) 333 (ul_TimerValue 334 / 335 (0.25 * (double)b_PCIInputClock)); 336 d_RealTimingInterval 337 = 338 (double) 339 ul_TimerValue 340 / 341 ( 342 (double) 343 0.25 344 * 345 (double) 346 b_PCIInputClock); 347 348 if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) { 349 ul_RealTimingInterval 350 = 351 ul_RealTimingInterval 352 + 353 1; 354 } 355 356 ul_TimingInterval 357 = 358 ul_TimingInterval 359 - 360 1; 361 ul_TimerValue 362 = 363 ul_TimerValue 364 - 365 2; 366 367 if (b_PCIInputClock != APCI1710_40MHZ) { 368 ul_TimerValue 369 = 370 (ULONG) 371 ( 372 (double) 373 (ul_TimerValue) 374 * 375 1.007752288); 376 } 377 378 break; 379 380 /******/ 381 /* ms */ 382 /******/ 383 384 case 2: 385 386 /******************/ 387 /* Timer 0 factor */ 388 /******************/ 389 390 ul_TimerValue 391 = 392 ul_TimingInterval 393 * 394 (250.0 395 * 396 b_PCIInputClock); 397 398 /*******************/ 399 /* Round the value */ 400 /*******************/ 401 402 if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 403 ul_TimerValue 404 = 405 ul_TimerValue 406 + 407 1; 408 } 409 410 /*****************************/ 411 /* Calculate the real timing */ 412 /*****************************/ 413 414 ul_RealTimingInterval 415 = 416 (ULONG) 417 (ul_TimerValue 418 / 419 (250.0 * (double)b_PCIInputClock)); 420 d_RealTimingInterval 421 = 422 (double) 423 ul_TimerValue 424 / 425 (250.0 426 * 427 (double) 428 b_PCIInputClock); 429 430 if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) { 431 ul_RealTimingInterval 432 = 433 ul_RealTimingInterval 434 + 435 1; 436 } 437 438 ul_TimingInterval 439 = 440 ul_TimingInterval 441 - 442 1; 443 ul_TimerValue 444 = 445 ul_TimerValue 446 - 447 2; 448 449 if (b_PCIInputClock != APCI1710_40MHZ) { 450 ul_TimerValue 451 = 452 (ULONG) 453 ( 454 (double) 455 (ul_TimerValue) 456 * 457 1.007752288); 458 } 459 460 break; 461 462 /*****/ 463 /* s */ 464 /*****/ 465 466 case 3: 467 468 /******************/ 469 /* Timer 0 factor */ 470 /******************/ 471 472 ul_TimerValue 473 = 474 (ULONG) 475 (ul_TimingInterval 476 * 477 (250000.0 478 * 479 b_PCIInputClock)); 480 481 /*******************/ 482 /* Round the value */ 483 /*******************/ 484 485 if ((double)((double)ul_TimingInterval * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 486 ul_TimerValue 487 = 488 ul_TimerValue 489 + 490 1; 491 } 492 493 /*****************************/ 494 /* Calculate the real timing */ 495 /*****************************/ 496 497 ul_RealTimingInterval 498 = 499 (ULONG) 500 (ul_TimerValue 501 / 502 (250000.0 503 * 504 (double) 505 b_PCIInputClock)); 506 d_RealTimingInterval 507 = 508 (double) 509 ul_TimerValue 510 / 511 (250000.0 512 * 513 (double) 514 b_PCIInputClock); 515 516 if ((double)((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) { 517 ul_RealTimingInterval 518 = 519 ul_RealTimingInterval 520 + 521 1; 522 } 523 524 ul_TimingInterval 525 = 526 ul_TimingInterval 527 - 528 1; 529 ul_TimerValue 530 = 531 ul_TimerValue 532 - 533 2; 534 535 if (b_PCIInputClock != APCI1710_40MHZ) { 536 ul_TimerValue 537 = 538 (ULONG) 539 ( 540 (double) 541 (ul_TimerValue) 542 * 543 1.007752288); 544 } 545 546 break; 547 548 /******/ 549 /* mn */ 550 /******/ 551 552 case 4: 553 554 /******************/ 555 /* Timer 0 factor */ 556 /******************/ 557 558 ul_TimerValue 559 = 560 (ULONG) 561 ( 562 (ul_TimingInterval 563 * 564 60) 565 * 566 (250000.0 567 * 568 b_PCIInputClock)); 569 570 /*******************/ 571 /* Round the value */ 572 /*******************/ 573 574 if ((double)((double)(ul_TimingInterval * 60.0) * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) { 575 ul_TimerValue 576 = 577 ul_TimerValue 578 + 579 1; 580 } 581 582 /*****************************/ 583 /* Calculate the real timing */ 584 /*****************************/ 585 586 ul_RealTimingInterval 587 = 588 (ULONG) 589 (ul_TimerValue 590 / 591 (250000.0 592 * 593 (double) 594 b_PCIInputClock)) 595 / 596 60; 597 d_RealTimingInterval 598 = 599 ( 600 (double) 601 ul_TimerValue 602 / 603 (250000.0 604 * 605 (double) 606 b_PCIInputClock)) 607 / 608 60.0; 609 610 if ((double)(((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) / 60.0) >= (double)((double)ul_RealTimingInterval + 0.5)) { 611 ul_RealTimingInterval 612 = 613 ul_RealTimingInterval 614 + 615 1; 616 } 617 618 ul_TimingInterval 619 = 620 ul_TimingInterval 621 - 622 1; 623 ul_TimerValue 624 = 625 ul_TimerValue 626 - 627 2; 628 629 if (b_PCIInputClock != APCI1710_40MHZ) { 630 ul_TimerValue 631 = 632 (ULONG) 633 ( 634 (double) 635 (ul_TimerValue) 636 * 637 1.007752288); 638 } 639 640 break; 641 } 642 643 fpu_end(); 644 } // if (b_PCIInputClock != APCI1710_GATE_INPUT) 645 else { 646 /*************************************************************/ 647 /* 2 Clock used for the overflow and the reload from counter */ 648 /*************************************************************/ 649 650 ul_TimerValue 651 = 652 ul_TimingInterval 653 - 654 2; 655 } // if (b_PCIInputClock != APCI1710_GATE_INPUT) 656 657 /****************************/ 658 /* Save the PCI input clock */ 659 /****************************/ 660 devpriv-> 661 s_ModuleInfo 662 [b_ModulNbr]. 663 s_TorCounterModuleInfo. 664 b_PCIInputClock 665 = 666 b_PCIInputClock; 667 668 /************************/ 669 /* Save the timing unit */ 670 /************************/ 671 672 devpriv-> 673 s_ModuleInfo 674 [b_ModulNbr]. 675 s_TorCounterModuleInfo. 676 s_TorCounterInfo 677 [b_TorCounter]. 678 b_TimingUnit 679 = 680 b_TimingUnit; 681 682 /************************/ 683 /* Save the base timing */ 684 /************************/ 685 devpriv-> 686 s_ModuleInfo 687 [b_ModulNbr]. 688 s_TorCounterModuleInfo. 689 s_TorCounterInfo 690 [b_TorCounter]. 691 d_TimingInterval 692 = 693 d_RealTimingInterval; 694 695 devpriv-> 696 s_ModuleInfo 697 [b_ModulNbr]. 698 s_TorCounterModuleInfo. 699 s_TorCounterInfo 700 [b_TorCounter]. 701 ul_RealTimingInterval 702 = 703 ul_RealTimingInterval; 704 705 /*******************/ 706 /* Get the command */ 707 /*******************/ 708 709 dw_Command 710 = 711 inl 712 (devpriv-> 713 s_BoardInfos. 714 ui_Address 715 + 716 4 717 + 718 (16 * b_TorCounter) + (64 * b_ModulNbr)); 719 720 dw_Command 721 = 722 (dw_Command 723 >> 724 4) 725 & 726 0xF; 727 728 /******************/ 729 /* Test if 40 MHz */ 730 /******************/ 731 732 if (b_PCIInputClock == APCI1710_40MHZ) { 733 /****************************/ 734 /* Set the 40 MHz selection */ 735 /****************************/ 736 737 dw_Command 738 = 739 dw_Command 740 | 741 0x10; 742 } 743 744 /*****************************/ 745 /* Test if extern clock used */ 746 /*****************************/ 747 748 if (b_PCIInputClock == APCI1710_GATE_INPUT) { 749 /****************************/ 750 /* Set the 40 MHz selection */ 751 /****************************/ 752 753 dw_Command 754 = 755 dw_Command 756 | 757 0x20; 758 } 759 760 /*************************/ 761 /* Write the new command */ 762 /*************************/ 763 764 outl(dw_Command, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr)); 765 766 /*******************/ 767 /* Disable the tor */ 768 /*******************/ 769 770 outl(0, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr)); 771 /*************************/ 772 /* Set the timer 1 value */ 773 /*************************/ 774 775 outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 0 + (16 * b_TorCounter) + (64 * b_ModulNbr)); 776 777 /*********************/ 778 /* Tor counter init. */ 779 /*********************/ 780 781 devpriv-> 782 s_ModuleInfo 783 [b_ModulNbr]. 784 s_TorCounterModuleInfo. 785 s_TorCounterInfo 786 [b_TorCounter]. 787 b_TorCounterInit 788 = 789 1; 790 } else { 791 /***********************************************/ 792 /* TOR version error for 40MHz clock selection */ 793 /***********************************************/ 794 795 DPRINTK("TOR version error for 40MHz clock selection\n"); 796 i_ReturnValue 797 = 798 -9; 799 } 800 } else { 801 /**************************************************************/ 802 /* You can not used the 40MHz clock selection wich this board */ 803 /**************************************************************/ 804 805 DPRINTK("You can not used the 40MHz clock selection wich this board\n"); 806 i_ReturnValue = 807 -8; 808 } 809 } else { 810 /**********************************/ 811 /* Base timing selection is wrong */ 812 /**********************************/ 813 814 DPRINTK("Base timing selection is wrong\n"); 815 i_ReturnValue = -7; 816 } 817 } // if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) 818 else { 819 /**********************************/ 820 /* Timing unit selection is wrong */ 821 /**********************************/ 822 823 DPRINTK("Timing unit selection is wrong\n"); 824 i_ReturnValue = -6; 825 } // if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) 826 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) 827 else { 828 /*****************************************/ 829 /* The selected PCI input clock is wrong */ 830 /*****************************************/ 831 832 DPRINTK("The selected PCI input clock is wrong\n"); 833 i_ReturnValue = -5; 834 } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) 835 } // if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) 836 else { 837 /**********************************/ 838 /* Tor Counter selection is wrong */ 839 /**********************************/ 840 841 DPRINTK("Tor Counter selection is wrong\n"); 842 i_ReturnValue = -4; 843 } // if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) 844 } else { 845 /******************************************/ 846 /* The module is not a tor counter module */ 847 /******************************************/ 848 849 DPRINTK("The module is not a tor counter module\n"); 850 i_ReturnValue = -3; 851 } 852 } else { 853 /***********************/ 854 /* Module number error */ 855 /***********************/ 856 857 DPRINTK("Module number error\n"); 858 i_ReturnValue = -2; 859 } 860 data[0] = (UINT) ul_RealTimingInterval; 861 return (i_ReturnValue); 862} 863 864/* 865+----------------------------------------------------------------------------+ 866| Function Name : _INT_ i_APCI1710_EnableTorCounter | 867| (unsigned char_ b_BoardHandle, | 868| unsigned char_ b_ModulNbr, | 869| unsigned char_ b_TorCounter, | 870| unsigned char_ b_InputMode, | 871| unsigned char_ b_ExternGate, | 872| unsigned char_ b_CycleMode, | 873| unsigned char_ b_InterruptEnable) | 874+----------------------------------------------------------------------------+ 875| Task : Enable the tor counter (b_TorCounter) from selected | 876| module (b_ModulNbr). You must calling the | 877| "i_APCI1710_InitTorCounter" function be for you call | 878| this function. | 879| If you enable the tor counter interrupt, the | 880| tor counter generate a interrupt after the timing cycle| 881| See function "i_APCI1710_SetBoardIntRoutineX" and the | 882| Interrupt mask description chapter from this manual. | 883| The b_CycleMode parameter determine if you will | 884| measured a single or more cycle. | 885+----------------------------------------------------------------------------+ 886| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 887| unsigned char_ b_ModulNbr : Selected module number (0 to 3) | 888| unsigned char_ b_TorCounter : Tor counter selection (0 or 1). | 889| unsigned char_ b_InputMode : Input signal level selection | 890| 0 : Tor count each low level | 891| 1 : Tor count each high level| 892| unsigned char_ b_ExternGate : Extern gate action selection | 893| 0 : Extern gate signal not | 894| used | 895| 1 : Extern gate signal used. | 896| If you selected the | 897| single mode, each high | 898| level signal start the | 899| counter. | 900| If you selected the | 901| continuous mode, the | 902| first high level signal | 903| start the tor counter | 904| | 905| APCI1710_TOR_QUADRUPLE _MODE : | 906| In the quadruple mode, the edge| 907| analysis circuit generates a | 908| counting pulse from each edge | 909| of 2 signals which are phase | 910| shifted in relation to each | 911| other. | 912| The gate input is used for the | 913| signal B | 914| | 915| APCI1710_TOR_DOUBLE_MODE: | 916| Functions in the same way as | 917| the quadruple mode, except that| 918| only two of the four edges are | 919| analysed per period. | 920| The gate input is used for the | 921| signal B | 922| | 923| APCI1710_TOR_SIMPLE_MODE: | 924| Functions in the same way as | 925| the quadruple mode, except that| 926| only one of the four edges is | 927| analysed per period. | 928| The gate input is used for the | 929| signal B | 930| | 931| unsigned char_ b_CycleMode : Selected the tor counter | 932| acquisition mode | 933| unsigned char_ b_InterruptEnable : Enable or disable the | 934| tor counter interrupt. | 935| APCI1710_ENABLE: | 936| Enable the tor counter | 937| interrupt | 938| APCI1710_DISABLE: | 939| Disable the tor counter | 940| interrupt | 941+----------------------------------------------------------------------------+ 942| Output Parameters : - | 943+----------------------------------------------------------------------------+ 944| Return Value : 0: No error | 945| -1: The handle parameter of the board is wrong | 946| -2: Module selection wrong | 947| -3: The module is not a tor counter module | 948| -4: Tor counter selection is wrong | 949| -5: Tor counter not initialised see function | 950| "i_APCI1710_InitTorCounter" | 951| -6: Tor input signal selection is wrong | 952| -7: Extern gate signal mode is wrong | 953| -8: Tor counter acquisition mode cycle is wrong | 954| -9: Interrupt parameter is wrong | 955| -10:Interrupt function not initialised. | 956| See function "i_APCI1710_SetBoardIntRoutineX" | 957+----------------------------------------------------------------------------+ 958*/ 959/* 960+----------------------------------------------------------------------------+ 961| Function Name : _INT_ i_APCI1710_DisableTorCounter | 962| (unsigned char_ b_BoardHandle, | 963| unsigned char_ b_ModulNbr, | 964| unsigned char_ b_TorCounter) | 965+----------------------------------------------------------------------------+ 966| Task : Disable the tor counter (b_TorCounter) from selected | 967| module (b_ModulNbr). If you disable the tor counter | 968| after a start cycle occur and you restart the tor | 969| counter witch the " i_APCI1710_EnableTorCounter" | 970| function, the status register is cleared | 971+----------------------------------------------------------------------------+ 972| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 973| unsigned char_ b_ModulNbr : Selected module number (0 to 3) | 974| unsigned char_ b_TorCounter : Tor counter selection (0 or 1). | 975+----------------------------------------------------------------------------+ 976| Output Parameters : - | 977+----------------------------------------------------------------------------+ 978| Return Value : 0: No error | 979| -1: The handle parameter of the board is wrong | 980| -2: Module selection wrong | 981| -3: The module is not a tor counter module | 982| -4: Tor counter selection is wrong | 983| -5: Tor counter not initialised see function | 984| "i_APCI1710_InitTorCounter" | 985| -6: Tor counter not enabled see function | 986| "i_APCI1710_EnableTorCounter" | 987+----------------------------------------------------------------------------+ 988*/ 989 990INT i_APCI1710_InsnWriteEnableDisableTorCounter(struct comedi_device * dev, 991 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data) 992{ 993 INT i_ReturnValue = 0; 994 DWORD dw_Status; 995 DWORD dw_DummyRead; 996 DWORD dw_ConfigReg; 997 unsigned char b_ModulNbr, b_Action; 998 unsigned char b_TorCounter; 999 unsigned char b_InputMode; 1000 unsigned char b_ExternGate; 1001 unsigned char b_CycleMode; 1002 unsigned char b_InterruptEnable; 1003 1004 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec); 1005 b_Action = (unsigned char) data[0]; // enable or disable 1006 b_TorCounter = (unsigned char) data[1]; 1007 b_InputMode = (unsigned char) data[2]; 1008 b_ExternGate = (unsigned char) data[3]; 1009 b_CycleMode = (unsigned char) data[4]; 1010 b_InterruptEnable = (unsigned char) data[5]; 1011 i_ReturnValue = insn->n;; 1012 devpriv->tsk_Current = current; // Save the current process task structure 1013 /**************************/ 1014 /* Test the module number */ 1015 /**************************/ 1016 1017 if (b_ModulNbr < 4) { 1018 /***********************/ 1019 /* Test if tor counter */ 1020 /***********************/ 1021 1022 if ((devpriv->s_BoardInfos. 1023 dw_MolduleConfiguration[b_ModulNbr] & 1024 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { 1025 /**********************************/ 1026 /* Test the tor counter selection */ 1027 /**********************************/ 1028 1029 if (b_TorCounter <= 1) { 1030 switch (b_Action) // Enable or Disable 1031 { 1032 case APCI1710_ENABLE: 1033 /***********************************/ 1034 /* Test if tor counter initialised */ 1035 /***********************************/ 1036 1037 dw_Status = 1038 inl(devpriv->s_BoardInfos. 1039 ui_Address + 8 + 1040 (16 * b_TorCounter) + 1041 (64 * b_ModulNbr)); 1042 1043 if (dw_Status & 0x10) { 1044 /******************************/ 1045 /* Test the input signal mode */ 1046 /******************************/ 1047 1048 if (b_InputMode == 0 || 1049 b_InputMode == 1 || 1050 b_InputMode == 1051 APCI1710_TOR_SIMPLE_MODE 1052 || b_InputMode == 1053 APCI1710_TOR_DOUBLE_MODE 1054 || b_InputMode == 1055 APCI1710_TOR_QUADRUPLE_MODE) 1056 { 1057 /************************************/ 1058 /* Test the extern gate signal mode */ 1059 /************************************/ 1060 1061 if (b_ExternGate == 0 1062 || b_ExternGate 1063 == 1 1064 || b_InputMode > 1065 1) { 1066 /*********************************/ 1067 /* Test the cycle mode parameter */ 1068 /*********************************/ 1069 1070 if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) { 1071 /***************************/ 1072 /* Test the interrupt flag */ 1073 /***************************/ 1074 1075 if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) { 1076 1077 /***************************/ 1078 /* Save the interrupt mode */ 1079 /***************************/ 1080 1081 devpriv-> 1082 s_ModuleInfo 1083 [b_ModulNbr]. 1084 s_TorCounterModuleInfo. 1085 s_TorCounterInfo 1086 [b_TorCounter]. 1087 b_InterruptEnable 1088 = 1089 b_InterruptEnable; 1090 1091 /*******************/ 1092 /* Get the command */ 1093 /*******************/ 1094 1095 dw_ConfigReg 1096 = 1097 inl 1098 (devpriv-> 1099 s_BoardInfos. 1100 ui_Address 1101 + 1102 4 1103 + 1104 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1105 1106 dw_ConfigReg 1107 = 1108 (dw_ConfigReg 1109 >> 1110 4) 1111 & 1112 0x30; 1113 1114 /********************************/ 1115 /* Test if not direct mode used */ 1116 /********************************/ 1117 1118 if (b_InputMode > 1) { 1119 /*******************************/ 1120 /* Extern gate can not be used */ 1121 /*******************************/ 1122 1123 b_ExternGate 1124 = 1125 0; 1126 1127 /*******************************************/ 1128 /* Enable the extern gate for the Signal B */ 1129 /*******************************************/ 1130 1131 dw_ConfigReg 1132 = 1133 dw_ConfigReg 1134 | 1135 0x40; 1136 1137 /***********************/ 1138 /* Test if simple mode */ 1139 /***********************/ 1140 1141 if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) { 1142 /**************************/ 1143 /* Enable the sinple mode */ 1144 /**************************/ 1145 1146 dw_ConfigReg 1147 = 1148 dw_ConfigReg 1149 | 1150 0x780; 1151 1152 } // if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) 1153 1154 /***********************/ 1155 /* Test if double mode */ 1156 /***********************/ 1157 1158 if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) { 1159 /**************************/ 1160 /* Enable the double mode */ 1161 /**************************/ 1162 1163 dw_ConfigReg 1164 = 1165 dw_ConfigReg 1166 | 1167 0x180; 1168 1169 } // if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) 1170 1171 b_InputMode 1172 = 1173 0; 1174 } // if (b_InputMode > 1) 1175 1176 /*******************/ 1177 /* Set the command */ 1178 /*******************/ 1179 1180 dw_ConfigReg 1181 = 1182 dw_ConfigReg 1183 | 1184 b_CycleMode 1185 | 1186 (b_InterruptEnable 1187 * 1188 2) 1189 | 1190 (b_InputMode 1191 * 1192 4) 1193 | 1194 (b_ExternGate 1195 * 1196 8); 1197 1198 /*****************************/ 1199 /* Clear the status register */ 1200 /*****************************/ 1201 1202 dw_DummyRead 1203 = 1204 inl 1205 (devpriv-> 1206 s_BoardInfos. 1207 ui_Address 1208 + 1209 0 1210 + 1211 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1212 1213 /***************************************/ 1214 /* Clear the interrupt status register */ 1215 /***************************************/ 1216 1217 dw_DummyRead 1218 = 1219 inl 1220 (devpriv-> 1221 s_BoardInfos. 1222 ui_Address 1223 + 1224 12 1225 + 1226 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1227 1228 /********************/ 1229 /* Set the commando */ 1230 /********************/ 1231 1232 outl(dw_ConfigReg, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr)); 1233 1234 /****************/ 1235 /* Set the gate */ 1236 /****************/ 1237 1238 outl(1, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr)); 1239 1240 } // if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) 1241 else { 1242 /********************************/ 1243 /* Interrupt parameter is wrong */ 1244 /********************************/ 1245 1246 DPRINTK("Interrupt parameter is wrong\n"); 1247 i_ReturnValue 1248 = 1249 -9; 1250 } // if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) 1251 } // if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) 1252 else { 1253 /***********************************************/ 1254 /* Tor counter acquisition mode cycle is wrong */ 1255 /***********************************************/ 1256 1257 DPRINTK("Tor counter acquisition mode cycle is wrong\n"); 1258 i_ReturnValue 1259 = 1260 -8; 1261 } // if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) 1262 } // if (b_ExternGate >= 0 && b_ExternGate <= 1) 1263 else { 1264 /***********************************/ 1265 /* Extern gate input mode is wrong */ 1266 /***********************************/ 1267 1268 DPRINTK("Extern gate input mode is wrong\n"); 1269 i_ReturnValue = 1270 -7; 1271 } // if (b_ExternGate >= 0 && b_ExternGate <= 1) 1272 } // if (b_InputMode >= 0 && b_InputMode <= 1) 1273 else { 1274 /***************************************/ 1275 /* Tor input signal selection is wrong */ 1276 /***************************************/ 1277 1278 DPRINTK("Tor input signal selection is wrong\n"); 1279 i_ReturnValue = -6; 1280 } 1281 } else { 1282 /*******************************/ 1283 /* Tor counter not initialised */ 1284 /*******************************/ 1285 1286 DPRINTK("Tor counter not initialised\n"); 1287 i_ReturnValue = -5; 1288 } 1289 break; 1290 1291 case APCI1710_DISABLE: 1292 /***********************************/ 1293 /* Test if tor counter initialised */ 1294 /***********************************/ 1295 1296 dw_Status = inl(devpriv->s_BoardInfos. 1297 ui_Address + 8 + 1298 (16 * b_TorCounter) + 1299 (64 * b_ModulNbr)); 1300 1301 /*******************************/ 1302 /* Test if counter initialised */ 1303 /*******************************/ 1304 1305 if (dw_Status & 0x10) { 1306 /***************************/ 1307 /* Test if counter enabled */ 1308 /***************************/ 1309 1310 if (dw_Status & 0x1) { 1311 /****************************/ 1312 /* Clear the interrupt mode */ 1313 /****************************/ 1314 devpriv-> 1315 s_ModuleInfo 1316 [b_ModulNbr]. 1317 s_TorCounterModuleInfo. 1318 s_TorCounterInfo 1319 [b_TorCounter]. 1320 b_InterruptEnable 1321 = 1322 APCI1710_DISABLE; 1323 1324 /******************/ 1325 /* Clear the gate */ 1326 /******************/ 1327 1328 outl(0, devpriv-> 1329 s_BoardInfos. 1330 ui_Address + 8 + 1331 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1332 } // if (dw_Status & 0x1) 1333 else { 1334 /***************************/ 1335 /* Tor counter not enabled */ 1336 /***************************/ 1337 1338 DPRINTK("Tor counter not enabled \n"); 1339 i_ReturnValue = -6; 1340 } // if (dw_Status & 0x1) 1341 } // if (dw_Status & 0x10) 1342 else { 1343 /*******************************/ 1344 /* Tor counter not initialised */ 1345 /*******************************/ 1346 1347 DPRINTK("Tor counter not initialised\n"); 1348 i_ReturnValue = -5; 1349 } // // if (dw_Status & 0x10) 1350 1351 } // switch 1352 } // if (b_TorCounter <= 1) 1353 else { 1354 /**********************************/ 1355 /* Tor counter selection is wrong */ 1356 /**********************************/ 1357 1358 DPRINTK("Tor counter selection is wrong\n"); 1359 i_ReturnValue = -4; 1360 } // if (b_TorCounter <= 1) 1361 } else { 1362 /******************************************/ 1363 /* The module is not a tor counter module */ 1364 /******************************************/ 1365 1366 DPRINTK("The module is not a tor counter module \n"); 1367 i_ReturnValue = -3; 1368 } 1369 } else { 1370 /***********************/ 1371 /* Module number error */ 1372 /***********************/ 1373 1374 DPRINTK("Module number error \n"); 1375 i_ReturnValue = -2; 1376 } 1377 1378 return (i_ReturnValue); 1379} 1380 1381/* 1382+----------------------------------------------------------------------------+ 1383| Function Name : _INT_ i_APCI1710_GetTorCounterInitialisation | 1384| (unsigned char_ b_BoardHandle, | 1385| unsigned char_ b_ModulNbr, | 1386| unsigned char_ b_TorCounter, | 1387| unsigned char *_ pb_TimingUnit, | 1388| PULONG_ pul_TimingInterval, | 1389| unsigned char *_ pb_InputMode, | 1390| unsigned char *_ pb_ExternGate, | 1391| unsigned char *_ pb_CycleMode, | 1392| unsigned char *_ pb_Enable, | 1393| unsigned char *_ pb_InterruptEnable)| 1394+----------------------------------------------------------------------------+ 1395| Task : Enable the tor counter (b_TorCounter) from selected | 1396| module (b_ModulNbr). You must calling the | 1397| "i_APCI1710_InitTorCounter" function be for you call | 1398| this function. | 1399| If you enable the tor counter interrupt, the | 1400| tor counter generate a interrupt after the timing cycle| 1401| See function "i_APCI1710_SetBoardIntRoutineX" and the | 1402| Interrupt mask description chapter from this manual. | 1403| The b_CycleMode parameter determine if you will | 1404| measured a single or more cycle. | 1405+----------------------------------------------------------------------------+ 1406| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 1407| unsigned char_ b_ModulNbr : Selected module number (0 to 3) | 1408| unsigned char_ b_TorCounter : Tor counter selection (0 or 1) 1409 1410 b_ModulNbr = CR_AREF(insn->chanspec); 1411 b_TorCounter = CR_CHAN(insn->chanspec); 1412. | 1413+----------------------------------------------------------------------------+ 1414| Output Parameters : unsigned char *_ pb_TimingUnit : Base timing unit (0 to 4) | 1415| 0 : ns | 1416| 1 : µs | 1417| 2 : ms | 1418| 3 : s | 1419| 4 : mn | 1420| PULONG_ pul_TimingInterval : Base timing value. | 1421| unsigned char *_ pb_InputMode : Input signal level | 1422| selection | 1423| 0 : Tor count each low level | 1424| 1 : Tor count each high level| 1425| unsigned char *_ pb_ExternGate : Extern gate action | 1426| selection | 1427| 0 : Extern gate signal not | 1428| used | 1429| 1 : Extern gate signal used| 1430| unsigned char *_ pb_CycleMode : Tor counter acquisition | 1431| mode | 1432| unsigned char *_ pb_Enable : Indicate if the tor counter| 1433| is enabled or no | 1434| 0 : Tor counter disabled | 1435| 1 : Tor counter enabled | 1436| unsigned char *_ pb_InterruptEnable : Enable or disable the | 1437| tor counter interrupt. | 1438| APCI1710_ENABLE: | 1439| Enable the tor counter | 1440| interrupt | 1441| APCI1710_DISABLE: | 1442| Disable the tor counter | 1443| interrupt 1444 pb_TimingUnit = (unsigned char *) &data[0]; 1445 pul_TimingInterval = (PULONG) &data[1]; 1446 pb_InputMode = (unsigned char *) &data[2]; 1447 pb_ExternGate = (unsigned char *) &data[3]; 1448 pb_CycleMode = (unsigned char *) &data[4]; 1449 pb_Enable = (unsigned char *) &data[5]; 1450 pb_InterruptEnable = (unsigned char *) &data[6]; 1451 | 1452+----------------------------------------------------------------------------+ 1453| Return Value : 0: No error | 1454| -1: The handle parameter of the board is wrong | 1455| -2: Module selection wrong | 1456| -3: The module is not a tor counter module | 1457| -4: Tor counter selection is wrong | 1458| -5: Tor counter not initialised see function | 1459| "i_APCI1710_InitTorCounter" | 1460+----------------------------------------------------------------------------+ 1461*/ 1462 1463INT i_APCI1710_InsnReadGetTorCounterInitialisation(struct comedi_device * dev, 1464 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data) 1465{ 1466 INT i_ReturnValue = 0; 1467 DWORD dw_Status; 1468 unsigned char b_ModulNbr; 1469 unsigned char b_TorCounter; 1470 unsigned char * pb_TimingUnit; 1471 PULONG pul_TimingInterval; 1472 unsigned char * pb_InputMode; 1473 unsigned char * pb_ExternGate; 1474 unsigned char * pb_CycleMode; 1475 unsigned char * pb_Enable; 1476 unsigned char * pb_InterruptEnable; 1477 1478 i_ReturnValue = insn->n; 1479 b_ModulNbr = CR_AREF(insn->chanspec); 1480 b_TorCounter = CR_CHAN(insn->chanspec); 1481 1482 pb_TimingUnit = (unsigned char *) & data[0]; 1483 pul_TimingInterval = (PULONG) & data[1]; 1484 pb_InputMode = (unsigned char *) & data[2]; 1485 pb_ExternGate = (unsigned char *) & data[3]; 1486 pb_CycleMode = (unsigned char *) & data[4]; 1487 pb_Enable = (unsigned char *) & data[5]; 1488 pb_InterruptEnable = (unsigned char *) & data[6]; 1489 1490 /**************************/ 1491 /* Test the module number */ 1492 /**************************/ 1493 1494 if (b_ModulNbr < 4) { 1495 /***********************/ 1496 /* Test if tor counter */ 1497 /***********************/ 1498 1499 if ((devpriv->s_BoardInfos. 1500 dw_MolduleConfiguration[b_ModulNbr] & 1501 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { 1502 /**********************************/ 1503 /* Test the tor counter selection */ 1504 /**********************************/ 1505 1506 if (b_TorCounter <= 1) { 1507 1508 /***********************************/ 1509 /* Test if tor counter initialised */ 1510 /***********************************/ 1511 1512 dw_Status = inl(devpriv->s_BoardInfos. 1513 ui_Address + 8 + (16 * b_TorCounter) + 1514 (64 * b_ModulNbr)); 1515 1516 if (dw_Status & 0x10) { 1517 *pb_Enable = dw_Status & 1; 1518 1519 /********************/ 1520 /* Get the commando */ 1521 /********************/ 1522 1523 dw_Status = inl(devpriv->s_BoardInfos. 1524 ui_Address + 4 + 1525 (16 * b_TorCounter) + 1526 (64 * b_ModulNbr)); 1527 1528 *pb_CycleMode = 1529 (unsigned char) ((dw_Status >> 4) & 1); 1530 *pb_InterruptEnable = 1531 (unsigned char) ((dw_Status >> 5) & 1); 1532 1533 /******************************************************/ 1534 /* Test if extern gate used for clock or for signal B */ 1535 /******************************************************/ 1536 1537 if (dw_Status & 0x600) { 1538 /*****************************************/ 1539 /* Test if extern gate used for signal B */ 1540 /*****************************************/ 1541 1542 if (dw_Status & 0x400) { 1543 /***********************/ 1544 /* Test if simple mode */ 1545 /***********************/ 1546 1547 if ((dw_Status & 0x7800) 1548 == 0x7800) { 1549 *pb_InputMode = 1550 APCI1710_TOR_SIMPLE_MODE; 1551 } 1552 1553 /***********************/ 1554 /* Test if double mode */ 1555 /***********************/ 1556 1557 if ((dw_Status & 0x7800) 1558 == 0x1800) { 1559 *pb_InputMode = 1560 APCI1710_TOR_DOUBLE_MODE; 1561 } 1562 1563 /**************************/ 1564 /* Test if quadruple mode */ 1565 /**************************/ 1566 1567 if ((dw_Status & 0x7800) 1568 == 0x0000) { 1569 *pb_InputMode = 1570 APCI1710_TOR_QUADRUPLE_MODE; 1571 } 1572 } // if (dw_Status & 0x400) 1573 else { 1574 *pb_InputMode = 1; 1575 } // // if (dw_Status & 0x400) 1576 1577 /************************/ 1578 /* Extern gate not used */ 1579 /************************/ 1580 1581 *pb_ExternGate = 0; 1582 } // if (dw_Status & 0x600) 1583 else { 1584 *pb_InputMode = 1585 (unsigned char) ((dw_Status >> 6) 1586 & 1); 1587 *pb_ExternGate = 1588 (unsigned char) ((dw_Status >> 7) 1589 & 1); 1590 } // if (dw_Status & 0x600) 1591 1592 *pb_TimingUnit = 1593 devpriv-> 1594 s_ModuleInfo[b_ModulNbr]. 1595 s_TorCounterModuleInfo. 1596 s_TorCounterInfo[b_TorCounter]. 1597 b_TimingUnit; 1598 1599 *pul_TimingInterval = 1600 devpriv-> 1601 s_ModuleInfo[b_ModulNbr]. 1602 s_TorCounterModuleInfo. 1603 s_TorCounterInfo[b_TorCounter]. 1604 ul_RealTimingInterval; 1605 } else { 1606 /*******************************/ 1607 /* Tor counter not initialised */ 1608 /*******************************/ 1609 1610 DPRINTK("Tor counter not initialised\n"); 1611 i_ReturnValue = -5; 1612 } 1613 1614 } // if (b_TorCounter <= 1) 1615 else { 1616 /**********************************/ 1617 /* Tor counter selection is wrong */ 1618 /**********************************/ 1619 1620 DPRINTK("Tor counter selection is wrong \n"); 1621 i_ReturnValue = -4; 1622 } // if (b_TorCounter <= 1) 1623 } else { 1624 /******************************************/ 1625 /* The module is not a tor counter module */ 1626 /******************************************/ 1627 1628 DPRINTK("The module is not a tor counter module\n"); 1629 i_ReturnValue = -3; 1630 } 1631 } else { 1632 /***********************/ 1633 /* Module number error */ 1634 /***********************/ 1635 1636 DPRINTK("Module number error\n"); 1637 i_ReturnValue = -2; 1638 } 1639 1640 return (i_ReturnValue); 1641} 1642 1643/* 1644+----------------------------------------------------------------------------+ 1645| Function Name : _INT_ i_APCI1710_ReadTorCounterValue | 1646| (unsigned char_ b_BoardHandle, | 1647| unsigned char_ b_ModulNbr, | 1648| unsigned char_ b_TorCounter, | 1649| UINT_ ui_TimeOut, | 1650| unsigned char *_ pb_TorCounterStatus, | 1651| PULONG_ pul_TorCounterValue) | 1652+----------------------------------------------------------------------------+ 1653| Task case APCI1710_TOR_GETPROGRESSSTATUS: Return the tor counter 1654(b_TorCounter) status (pb_TorCounterStatus) from selected tor counter | 1655| module (b_ModulNbr). 1656 1657 case APCI1710_TOR_GETCOUNTERVALUE : 1658 Return the tor counter (b_TorCounter) status | 1659| (pb_TorCounterStatus) and the timing value | 1660| (pul_TorCounterValue) after a conting cycle stop | 1661| from selected tor counter module (b_ModulNbr). | 1662+----------------------------------------------------------------------------+ 1663| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 1664| unsigned char_ b_ModulNbr : Selected module number (0 to 3) | 1665| unsigned char_ b_TorCounter : Tor counter selection (0 or 1). 1666 b_ModulNbr = CR_AREF(insn->chanspec); 1667 b_ReadType = (unsigned char) data[0]; 1668 b_TorCounter = (unsigned char) data[1]; 1669 ui_TimeOut = (UINT) data[2]; | 1670+----------------------------------------------------------------------------+ 1671| Output Parameters : unsigned char *_ pb_TorCounterStatus : Return the tor counter | 1672| status. | 1673| 0 : Conting cycle not started| 1674| Software gate not set. | 1675| 1 : Conting cycle started. | 1676| Software gate set. | 1677| 2 : Conting cycle stopped. | 1678| The conting cycle is | 1679| terminate. | 1680| 3 : A overflow occur. You | 1681| must change the base | 1682| timing witch the | 1683| function | 1684| "i_APCI1710_InitTorCounter"| 1685| 4 : Timeeout occur | 1686| PULONG pul_TorCounterValue : Tor counter value. 1687 pb_TorCounterStatus=(unsigned char *) &data[0]; 1688 pul_TorCounterValue=(PULONG) &data[1]; | 1689+----------------------------------------------------------------------------+ 1690| Return Value : 0: No error | 1691| -1: The handle parameter of the board is wrong | 1692| -2: Module selection wrong | 1693| -3: The module is not a tor counter module | 1694| -4: Tor counter selection is wrong | 1695| -5: Tor counter not initialised see function | 1696| "i_APCI1710_InitTorCounter" | 1697| -6: Tor counter not enabled see function | 1698| "i_APCI1710_EnableTorCounter" | 1699| -7: Timeout parameter is wrong (0 to 65535) | 1700+----------------------------------------------------------------------------+ 1701*/ 1702 1703INT i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue(struct comedi_device * dev, 1704 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data) 1705{ 1706 INT i_ReturnValue = 0; 1707 DWORD dw_Status; 1708 DWORD dw_TimeOut = 0; 1709 1710 unsigned char b_ModulNbr; 1711 unsigned char b_TorCounter; 1712 unsigned char b_ReadType; 1713 UINT ui_TimeOut; 1714 unsigned char * pb_TorCounterStatus; 1715 PULONG pul_TorCounterValue; 1716 1717 i_ReturnValue = insn->n; 1718 b_ModulNbr = CR_AREF(insn->chanspec); 1719 b_ReadType = (unsigned char) data[0]; 1720 b_TorCounter = (unsigned char) data[1]; 1721 ui_TimeOut = (UINT) data[2]; 1722 pb_TorCounterStatus = (unsigned char *) & data[0]; 1723 pul_TorCounterValue = (PULONG) & data[1]; 1724 1725 /**************************/ 1726 /* Test the module number */ 1727 /**************************/ 1728 1729 if (b_ReadType == APCI1710_TOR_READINTERRUPT) { 1730 1731 data[0] = devpriv->s_InterruptParameters. 1732 s_FIFOInterruptParameters[devpriv-> 1733 s_InterruptParameters.ui_Read].b_OldModuleMask; 1734 data[1] = devpriv->s_InterruptParameters. 1735 s_FIFOInterruptParameters[devpriv-> 1736 s_InterruptParameters.ui_Read].ul_OldInterruptMask; 1737 data[2] = devpriv->s_InterruptParameters. 1738 s_FIFOInterruptParameters[devpriv-> 1739 s_InterruptParameters.ui_Read].ul_OldCounterLatchValue; 1740 1741 /**************************/ 1742 /* Increment the read FIFO */ 1743 /***************************/ 1744 1745 devpriv-> 1746 s_InterruptParameters. 1747 ui_Read = (devpriv-> 1748 s_InterruptParameters. 1749 ui_Read + 1) % APCI1710_SAVE_INTERRUPT; 1750 1751 return insn->n; 1752 } 1753 1754 if (b_ModulNbr < 4) { 1755 /***********************/ 1756 /* Test if tor counter */ 1757 /***********************/ 1758 1759 if ((devpriv->s_BoardInfos. 1760 dw_MolduleConfiguration[b_ModulNbr] & 1761 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { 1762 /**********************************/ 1763 /* Test the tor counter selection */ 1764 /**********************************/ 1765 1766 if (b_TorCounter <= 1) { 1767 /***********************************/ 1768 /* Test if tor counter initialised */ 1769 /***********************************/ 1770 1771 dw_Status = inl(devpriv->s_BoardInfos. 1772 ui_Address + 8 + (16 * b_TorCounter) + 1773 (64 * b_ModulNbr)); 1774 1775 /*******************************/ 1776 /* Test if counter initialised */ 1777 /*******************************/ 1778 1779 if (dw_Status & 0x10) { 1780 /***************************/ 1781 /* Test if counter enabled */ 1782 /***************************/ 1783 1784 if (dw_Status & 0x1) { 1785 1786 switch (b_ReadType) { 1787 1788 case APCI1710_TOR_GETPROGRESSSTATUS: 1789 /*******************/ 1790 /* Read the status */ 1791 /*******************/ 1792 1793 dw_Status = 1794 inl(devpriv-> 1795 s_BoardInfos. 1796 ui_Address + 4 + 1797 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1798 1799 dw_Status = 1800 dw_Status & 0xF; 1801 1802 /*****************/ 1803 /* Test if start */ 1804 /*****************/ 1805 1806 if (dw_Status & 1) { 1807 if (dw_Status & 1808 2) { 1809 if (dw_Status & 4) { 1810 /************************/ 1811 /* Tor counter owerflow */ 1812 /************************/ 1813 1814 *pb_TorCounterStatus 1815 = 1816 3; 1817 } else { 1818 /***********************/ 1819 /* Tor counter started */ 1820 /***********************/ 1821 1822 *pb_TorCounterStatus 1823 = 1824 2; 1825 } 1826 } else { 1827 /***********************/ 1828 /* Tor counter started */ 1829 /***********************/ 1830 1831 *pb_TorCounterStatus 1832 = 1833 1; 1834 } 1835 } else { 1836 /***************************/ 1837 /* Tor counter not started */ 1838 /***************************/ 1839 1840 *pb_TorCounterStatus 1841 = 0; 1842 } 1843 break; 1844 1845 case APCI1710_TOR_GETCOUNTERVALUE: 1846 1847 /*****************************/ 1848 /* Test the timout parameter */ 1849 /*****************************/ 1850 1851 if ((ui_TimeOut >= 0) 1852 && (ui_TimeOut 1853 <= 1854 65535UL)) 1855 { 1856 for (;;) { 1857 /*******************/ 1858 /* Read the status */ 1859 /*******************/ 1860 1861 dw_Status 1862 = 1863 inl 1864 (devpriv-> 1865 s_BoardInfos. 1866 ui_Address 1867 + 1868 4 1869 + 1870 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1871 /********************/ 1872 /* Test if overflow */ 1873 /********************/ 1874 1875 if ((dw_Status & 4) == 4) { 1876 /******************/ 1877 /* Overflow occur */ 1878 /******************/ 1879 1880 *pb_TorCounterStatus 1881 = 1882 3; 1883 1884 /******************/ 1885 /* Read the value */ 1886 /******************/ 1887 1888 *pul_TorCounterValue 1889 = 1890 inl 1891 (devpriv-> 1892 s_BoardInfos. 1893 ui_Address 1894 + 1895 0 1896 + 1897 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1898 break; 1899 } // if ((dw_Status & 4) == 4) 1900 else { 1901 /*******************************/ 1902 /* Test if measurement stopped */ 1903 /*******************************/ 1904 1905 if ((dw_Status & 2) == 2) { 1906 /***********************/ 1907 /* A stop signal occur */ 1908 /***********************/ 1909 1910 *pb_TorCounterStatus 1911 = 1912 2; 1913 1914 /******************/ 1915 /* Read the value */ 1916 /******************/ 1917 1918 *pul_TorCounterValue 1919 = 1920 inl 1921 (devpriv-> 1922 s_BoardInfos. 1923 ui_Address 1924 + 1925 0 1926 + 1927 (16 * b_TorCounter) + (64 * b_ModulNbr)); 1928 1929 break; 1930 } // if ((dw_Status & 2) == 2) 1931 else { 1932 /*******************************/ 1933 /* Test if measurement started */ 1934 /*******************************/ 1935 1936 if ((dw_Status & 1) == 1) { 1937 /************************/ 1938 /* A start signal occur */ 1939 /************************/ 1940 1941 *pb_TorCounterStatus 1942 = 1943 1; 1944 } // if ((dw_Status & 1) == 1) 1945 else { 1946 /***************************/ 1947 /* Measurement not started */ 1948 /***************************/ 1949 1950 *pb_TorCounterStatus 1951 = 1952 0; 1953 } // if ((dw_Status & 1) == 1) 1954 } // if ((dw_Status & 2) == 2) 1955 } // if ((dw_Status & 8) == 8) 1956 1957 if (dw_TimeOut == ui_TimeOut) { 1958 /*****************/ 1959 /* Timeout occur */ 1960 /*****************/ 1961 1962 break; 1963 } else { 1964 /*************************/ 1965 /* Increment the timeout */ 1966 /*************************/ 1967 1968 dw_TimeOut 1969 = 1970 dw_TimeOut 1971 + 1972 1; 1973 1974 mdelay(1000); 1975 } 1976 } // for (;;) 1977 1978 /*************************/ 1979 /* Test if timeout occur */ 1980 /*************************/ 1981 1982 if ((*pb_TorCounterStatus != 3) && (dw_TimeOut == ui_TimeOut) && (ui_TimeOut != 0)) { 1983 /*****************/ 1984 /* Timeout occur */ 1985 /*****************/ 1986 1987 *pb_TorCounterStatus 1988 = 1989 4; 1990 } 1991 } else { 1992 /******************************/ 1993 /* Timeout parameter is wrong */ 1994 /******************************/ 1995 1996 DPRINTK("Timeout parameter is wrong\n"); 1997 i_ReturnValue = 1998 -7; 1999 } 2000 break; 2001 2002 default: 2003 printk("Inputs wrong\n"); 2004 } // switch end 2005 } // if (dw_Status & 0x1) 2006 else { 2007 /***************************/ 2008 /* Tor counter not enabled */ 2009 /***************************/ 2010 2011 DPRINTK("Tor counter not enabled\n"); 2012 i_ReturnValue = -6; 2013 } // if (dw_Status & 0x1) 2014 } else { 2015 /*******************************/ 2016 /* Tor counter not initialised */ 2017 /*******************************/ 2018 2019 DPRINTK("Tor counter not initialised\n"); 2020 i_ReturnValue = -5; 2021 } 2022 } // if (b_TorCounter <= 1) 2023 else { 2024 /**********************************/ 2025 /* Tor counter selection is wrong */ 2026 /**********************************/ 2027 2028 DPRINTK("Tor counter selection is wrong\n"); 2029 i_ReturnValue = -4; 2030 } // if (b_TorCounter <= 1) 2031 } else { 2032 /******************************************/ 2033 /* The module is not a tor counter module */ 2034 /******************************************/ 2035 2036 DPRINTK("The module is not a tor counter module\n"); 2037 i_ReturnValue = -3; 2038 } 2039 } else { 2040 /***********************/ 2041 /* Module number error */ 2042 /***********************/ 2043 2044 DPRINTK("Module number error\n"); 2045 i_ReturnValue = -2; 2046 } 2047 2048 return (i_ReturnValue); 2049} 2050