hwdrv_APCI1710.c revision af02b584bc0e1f46cf1477ad54ae18ec3842b6f4
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 should 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 : APCI-1710 | Compiler : GCC | 32 | Module name : hwdrv_apci1710.c| Version : 2.96 | 33 +-------------------------------+---------------------------------------+ 34 | Project manager: Eric Stolz | Date : 02/12/2002 | 35 +-------------------------------+---------------------------------------+ 36 | Description : Hardware Layer Access For APCI-1710 | 37 +-----------------------------------------------------------------------+ 38 | UPDATES | 39 +----------+-----------+------------------------------------------------+ 40 | Date | Author | Description of updates | 41 +----------+-----------+------------------------------------------------+ 42 | | | | 43 | | | | 44 | | | | 45 +----------+-----------+------------------------------------------------+ 46*/ 47#include "hwdrv_APCI1710.h" 48#include "APCI1710_Inp_cpt.c" 49 50#include "APCI1710_Ssi.c" 51#include "APCI1710_Tor.c" 52#include "APCI1710_Ttl.c" 53#include "APCI1710_Dig_io.c" 54#include "APCI1710_82x54.c" 55#include "APCI1710_Chrono.c" 56#include "APCI1710_Pwm.c" 57#include "APCI1710_INCCPT.c" 58 59void i_ADDI_AttachPCI1710(struct comedi_device *dev) 60{ 61 struct comedi_subdevice *s; 62 int ret = 0; 63 int n_subdevices = 9; 64 65 /* Update-0.7.57->0.7.68dev->n_subdevices = 9; */ 66 ret = alloc_subdevices(dev, n_subdevices); 67 if (ret < 0) 68 return; 69 70 /* Allocate and Initialise Timer Subdevice Structures */ 71 s = dev->subdevices + 0; 72 73 s->type = COMEDI_SUBD_TIMER; 74 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 75 s->n_chan = 3; 76 s->maxdata = 0; 77 s->len_chanlist = 3; 78 s->range_table = &range_digital; 79 s->insn_write = i_APCI1710_InsnWriteEnableDisableTimer; 80 s->insn_read = i_APCI1710_InsnReadAllTimerValue; 81 s->insn_config = i_APCI1710_InsnConfigInitTimer; 82 s->insn_bits = i_APCI1710_InsnBitsTimer; 83 84 /* Allocate and Initialise DIO Subdevice Structures */ 85 s = dev->subdevices + 1; 86 87 s->type = COMEDI_SUBD_DIO; 88 s->subdev_flags = 89 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 90 s->n_chan = 7; 91 s->maxdata = 1; 92 s->len_chanlist = 7; 93 s->range_table = &range_digital; 94 s->insn_config = i_APCI1710_InsnConfigDigitalIO; 95 s->insn_read = i_APCI1710_InsnReadDigitalIOChlValue; 96 s->insn_bits = i_APCI1710_InsnBitsDigitalIOPortOnOff; 97 s->insn_write = i_APCI1710_InsnWriteDigitalIOChlOnOff; 98 99 /* Allocate and Initialise Chrono Subdevice Structures */ 100 s = dev->subdevices + 2; 101 102 s->type = COMEDI_SUBD_CHRONO; 103 s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; 104 s->n_chan = 4; 105 s->maxdata = 0; 106 s->len_chanlist = 4; 107 s->range_table = &range_digital; 108 s->insn_write = i_APCI1710_InsnWriteEnableDisableChrono; 109 s->insn_read = i_APCI1710_InsnReadChrono; 110 s->insn_config = i_APCI1710_InsnConfigInitChrono; 111 s->insn_bits = i_APCI1710_InsnBitsChronoDigitalIO; 112 113 /* Allocate and Initialise PWM Subdevice Structures */ 114 s = dev->subdevices + 3; 115 s->type = COMEDI_SUBD_PWM; 116 s->subdev_flags = 117 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 118 s->n_chan = 3; 119 s->maxdata = 1; 120 s->len_chanlist = 3; 121 s->range_table = &range_digital; 122 s->io_bits = 0; /* all bits input */ 123 s->insn_config = i_APCI1710_InsnConfigPWM; 124 s->insn_read = i_APCI1710_InsnReadGetPWMStatus; 125 s->insn_write = i_APCI1710_InsnWritePWM; 126 s->insn_bits = i_APCI1710_InsnBitsReadPWMInterrupt; 127 128 /* Allocate and Initialise TTLIO Subdevice Structures */ 129 s = dev->subdevices + 4; 130 s->type = COMEDI_SUBD_TTLIO; 131 s->subdev_flags = 132 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 133 s->n_chan = 8; 134 s->maxdata = 1; 135 s->len_chanlist = 8; 136 s->range_table = &range_apci1710_ttl; /* to pass arguments in range */ 137 s->insn_config = i_APCI1710_InsnConfigInitTTLIO; 138 s->insn_bits = i_APCI1710_InsnBitsReadTTLIO; 139 s->insn_write = i_APCI1710_InsnWriteSetTTLIOChlOnOff; 140 s->insn_read = i_APCI1710_InsnReadTTLIOAllPortValue; 141 142 /* Allocate and Initialise TOR Subdevice Structures */ 143 s = dev->subdevices + 5; 144 s->type = COMEDI_SUBD_TOR; 145 s->subdev_flags = 146 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 147 s->n_chan = 8; 148 s->maxdata = 1; 149 s->len_chanlist = 8; 150 s->range_table = &range_digital; 151 s->io_bits = 0; /* all bits input */ 152 s->insn_config = i_APCI1710_InsnConfigInitTorCounter; 153 s->insn_read = i_APCI1710_InsnReadGetTorCounterInitialisation; 154 s->insn_write = i_APCI1710_InsnWriteEnableDisableTorCounter; 155 s->insn_bits = i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue; 156 157 /* Allocate and Initialise SSI Subdevice Structures */ 158 s = dev->subdevices + 6; 159 s->type = COMEDI_SUBD_SSI; 160 s->subdev_flags = 161 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 162 s->n_chan = 4; 163 s->maxdata = 1; 164 s->len_chanlist = 4; 165 s->range_table = &range_apci1710_ssi; 166 s->insn_config = i_APCI1710_InsnConfigInitSSI; 167 s->insn_read = i_APCI1710_InsnReadSSIValue; 168 s->insn_bits = i_APCI1710_InsnBitsSSIDigitalIO; 169 170 /* Allocate and Initialise PULSEENCODER Subdevice Structures */ 171 s = dev->subdevices + 7; 172 s->type = COMEDI_SUBD_PULSEENCODER; 173 s->subdev_flags = 174 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 175 s->n_chan = 4; 176 s->maxdata = 1; 177 s->len_chanlist = 4; 178 s->range_table = &range_digital; 179 s->insn_config = i_APCI1710_InsnConfigInitPulseEncoder; 180 s->insn_write = i_APCI1710_InsnWriteEnableDisablePulseEncoder; 181 s->insn_bits = i_APCI1710_InsnBitsReadWritePulseEncoder; 182 s->insn_read = i_APCI1710_InsnReadInterruptPulseEncoder; 183 184 /* Allocate and Initialise INCREMENTALCOUNTER Subdevice Structures */ 185 s = dev->subdevices + 8; 186 s->type = COMEDI_SUBD_INCREMENTALCOUNTER; 187 s->subdev_flags = 188 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON; 189 s->n_chan = 500; 190 s->maxdata = 1; 191 s->len_chanlist = 500; 192 s->range_table = &range_apci1710_inccpt; 193 s->insn_config = i_APCI1710_InsnConfigINCCPT; 194 s->insn_write = i_APCI1710_InsnWriteINCCPT; 195 s->insn_read = i_APCI1710_InsnReadINCCPT; 196 s->insn_bits = i_APCI1710_InsnBitsINCCPT; 197} 198 199int i_APCI1710_Reset(struct comedi_device *dev); 200void v_APCI1710_Interrupt(int irq, void *d); 201/* for 1710 */ 202 203int i_APCI1710_Reset(struct comedi_device *dev) 204{ 205 int ret; 206 unsigned int dw_Dummy; 207 208 /*********************************/ 209 /* Read all module configuration */ 210 /*********************************/ 211 ret = inl(devpriv->s_BoardInfos.ui_Address + 60); 212 devpriv->s_BoardInfos.dw_MolduleConfiguration[0] = ret; 213 214 ret = inl(devpriv->s_BoardInfos.ui_Address + 124); 215 devpriv->s_BoardInfos.dw_MolduleConfiguration[1] = ret; 216 217 ret = inl(devpriv->s_BoardInfos.ui_Address + 188); 218 devpriv->s_BoardInfos.dw_MolduleConfiguration[2] = ret; 219 220 ret = inl(devpriv->s_BoardInfos.ui_Address + 252); 221 devpriv->s_BoardInfos.dw_MolduleConfiguration[3] = ret; 222 223 /* outl(0x80808082,devpriv->s_BoardInfos.ui_Address+0x60); */ 224 outl(0x83838383, devpriv->s_BoardInfos.ui_Address + 0x60); 225 226 devpriv->s_BoardInfos.b_BoardVersion = 1; 227 228 /* Enable the interrupt for the controller */ 229 dw_Dummy = inl(devpriv->s_BoardInfos.ui_Address + 0x38); 230 outl(dw_Dummy | 0x2000, devpriv->s_BoardInfos.ui_Address + 0x38); 231 232 return 0; 233} 234 235/* 236+----------------------------------------------------------------------------+ 237| Function's Name : __void__ v_APCI1710_InterruptFunction | 238| (unsigned char b_Interrupt, __CPPARGS) | 239+----------------------------------------------------------------------------+ 240| Task : APCI-1710 interrupt function | 241+----------------------------------------------------------------------------+ 242| Input Parameters : unsigned char b_Interrupt : Interrupt number | 243+----------------------------------------------------------------------------+ 244| Output Parameters : - | 245+----------------------------------------------------------------------------+ 246| Return Value : 0 : OK | 247| -1 : Error | 248+----------------------------------------------------------------------------+ 249*/ 250 251void v_APCI1710_Interrupt(int irq, void *d) 252{ 253 struct comedi_device *dev = d; 254 unsigned char b_ModuleCpt = 0; 255 unsigned char b_InterruptFlag = 0; 256 unsigned char b_PWMCpt = 0; 257 unsigned char b_TorCounterCpt = 0; 258 unsigned char b_PulseIncoderCpt = 0; 259 unsigned int ui_16BitValue; 260 unsigned int ul_InterruptLatchReg = 0; 261 unsigned int ul_LatchRegisterValue = 0; 262 unsigned int ul_82X54InterruptStatus; 263 unsigned int ul_StatusRegister; 264 265 union str_ModuleInfo *ps_ModuleInfo; 266 267 printk("APCI1710 Interrupt\n"); 268 for (b_ModuleCpt = 0; b_ModuleCpt < 4; b_ModuleCpt++, ps_ModuleInfo++) { 269 270 /**************************/ 271 /* 1199/0225 to 0100/0226 */ 272 /**************************/ 273 ps_ModuleInfo = &devpriv->s_ModuleInfo[b_ModuleCpt]; 274 275 /***********************/ 276 /* Test if 82X54 timer */ 277 /***********************/ 278 279 if ((devpriv->s_BoardInfos. 280 dw_MolduleConfiguration[b_ModuleCpt] & 281 0xFFFF0000UL) == APCI1710_82X54_TIMER) { 282 283 /* printk("TIMER Interrupt Occurred\n"); */ 284 ul_82X54InterruptStatus = inl(devpriv->s_BoardInfos. 285 ui_Address + 12 + (64 * b_ModuleCpt)); 286 287 /***************************/ 288 /* Test if interrupt occur */ 289 /***************************/ 290 291 if ((ul_82X54InterruptStatus & ps_ModuleInfo-> 292 s_82X54ModuleInfo. 293 b_InterruptMask) != 0) { 294 devpriv-> 295 s_InterruptParameters. 296 s_FIFOInterruptParameters[devpriv-> 297 s_InterruptParameters. 298 ui_Write]. 299 ul_OldInterruptMask = 300 (ul_82X54InterruptStatus & 301 ps_ModuleInfo->s_82X54ModuleInfo. 302 b_InterruptMask) << 4; 303 304 devpriv-> 305 s_InterruptParameters. 306 s_FIFOInterruptParameters[devpriv-> 307 s_InterruptParameters. 308 ui_Write]. 309 b_OldModuleMask = 1 << b_ModuleCpt; 310 311 devpriv-> 312 s_InterruptParameters. 313 s_FIFOInterruptParameters[devpriv-> 314 s_InterruptParameters. 315 ui_Write].ul_OldCounterLatchValue = 0; 316 317 devpriv-> 318 s_InterruptParameters. 319 ul_InterruptOccur++; 320 321 /****************************/ 322 /* Increment the write FIFO */ 323 /****************************/ 324 325 devpriv-> 326 s_InterruptParameters. 327 ui_Write = (devpriv-> 328 s_InterruptParameters. 329 ui_Write + 1) % APCI1710_SAVE_INTERRUPT; 330 331 b_InterruptFlag = 1; 332 333 /**********************/ 334 /* Call user function */ 335 /**********************/ 336 /* Send a signal to from kernel to user space */ 337 send_sig(SIGIO, devpriv->tsk_Current, 0); 338 339 } /* if ((ul_82X54InterruptStatus & 0x7) != 0) */ 340 } /* 82X54 timer */ 341 342 /***************************/ 343 /* Test if increm. counter */ 344 /***************************/ 345 346 if ((devpriv->s_BoardInfos. 347 dw_MolduleConfiguration[b_ModuleCpt] & 348 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) { 349 350 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos. 351 ui_Address + (64 * b_ModuleCpt)); 352 353 /*********************/ 354 /* Test if interrupt */ 355 /*********************/ 356 357 if ((ul_InterruptLatchReg & 0x22) && (ps_ModuleInfo-> 358 s_SiemensCounterInfo. 359 s_ModeRegister. 360 s_ByteModeRegister. 361 b_ModeRegister2 & 0x80)) { 362 /************************************/ 363 /* Test if strobe latch I interrupt */ 364 /************************************/ 365 366 if (ul_InterruptLatchReg & 2) { 367 ul_LatchRegisterValue = 368 inl(devpriv->s_BoardInfos. 369 ui_Address + 4 + 370 (64 * b_ModuleCpt)); 371 372 devpriv-> 373 s_InterruptParameters. 374 s_FIFOInterruptParameters 375 [devpriv->s_InterruptParameters. 376 ui_Write].ul_OldInterruptMask = 377 1UL; 378 379 devpriv-> 380 s_InterruptParameters. 381 s_FIFOInterruptParameters 382 [devpriv->s_InterruptParameters. 383 ui_Write].b_OldModuleMask = 384 1 << b_ModuleCpt; 385 386 devpriv-> 387 s_InterruptParameters. 388 s_FIFOInterruptParameters 389 [devpriv->s_InterruptParameters. 390 ui_Write]. 391 ul_OldCounterLatchValue = 392 ul_LatchRegisterValue; 393 394 devpriv-> 395 s_InterruptParameters. 396 ul_InterruptOccur++; 397 398 /****************************/ 399 /* 0899/0224 to 1199/0225 */ 400 /****************************/ 401 /* Increment the write FIFO */ 402 /****************************/ 403 404 devpriv-> 405 s_InterruptParameters. 406 ui_Write = (devpriv-> 407 s_InterruptParameters. 408 ui_Write + 409 1) % APCI1710_SAVE_INTERRUPT; 410 411 b_InterruptFlag = 1; 412 413 /**********************/ 414 /* Call user function */ 415 /**********************/ 416 /* Send a signal to from kernel to user space */ 417 send_sig(SIGIO, devpriv->tsk_Current, 418 0); 419 420 } 421 422 /*************************************/ 423 /* Test if strobe latch II interrupt */ 424 /*************************************/ 425 426 if (ul_InterruptLatchReg & 0x20) { 427 428 ul_LatchRegisterValue = 429 inl(devpriv->s_BoardInfos. 430 ui_Address + 8 + 431 (64 * b_ModuleCpt)); 432 433 devpriv-> 434 s_InterruptParameters. 435 s_FIFOInterruptParameters 436 [devpriv->s_InterruptParameters. 437 ui_Write].ul_OldInterruptMask = 438 2UL; 439 440 devpriv-> 441 s_InterruptParameters. 442 s_FIFOInterruptParameters 443 [devpriv->s_InterruptParameters. 444 ui_Write].b_OldModuleMask = 445 1 << b_ModuleCpt; 446 447 devpriv-> 448 s_InterruptParameters. 449 s_FIFOInterruptParameters 450 [devpriv->s_InterruptParameters. 451 ui_Write]. 452 ul_OldCounterLatchValue = 453 ul_LatchRegisterValue; 454 455 devpriv-> 456 s_InterruptParameters. 457 ul_InterruptOccur++; 458 459 /****************************/ 460 /* 0899/0224 to 1199/0225 */ 461 /****************************/ 462 /* Increment the write FIFO */ 463 /****************************/ 464 465 devpriv-> 466 s_InterruptParameters. 467 ui_Write = (devpriv-> 468 s_InterruptParameters. 469 ui_Write + 470 1) % APCI1710_SAVE_INTERRUPT; 471 472 b_InterruptFlag = 1; 473 474 /**********************/ 475 /* Call user function */ 476 /**********************/ 477 /* Send a signal to from kernel to user space */ 478 send_sig(SIGIO, devpriv->tsk_Current, 479 0); 480 481 } 482 } 483 484 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos. 485 ui_Address + 24 + (64 * b_ModuleCpt)); 486 487 /***************************/ 488 /* Test if index interrupt */ 489 /***************************/ 490 491 if (ul_InterruptLatchReg & 0x8) { 492 ps_ModuleInfo-> 493 s_SiemensCounterInfo. 494 s_InitFlag.b_IndexInterruptOccur = 1; 495 496 if (ps_ModuleInfo-> 497 s_SiemensCounterInfo. 498 s_ModeRegister. 499 s_ByteModeRegister. 500 b_ModeRegister2 & 501 APCI1710_INDEX_AUTO_MODE) { 502 503 outl(ps_ModuleInfo-> 504 s_SiemensCounterInfo. 505 s_ModeRegister. 506 dw_ModeRegister1_2_3_4, 507 devpriv->s_BoardInfos. 508 ui_Address + 20 + 509 (64 * b_ModuleCpt)); 510 } 511 512 /*****************************/ 513 /* Test if interrupt enabled */ 514 /*****************************/ 515 516 if ((ps_ModuleInfo-> 517 s_SiemensCounterInfo. 518 s_ModeRegister. 519 s_ByteModeRegister. 520 b_ModeRegister3 & 521 APCI1710_ENABLE_INDEX_INT) == 522 APCI1710_ENABLE_INDEX_INT) { 523 devpriv->s_InterruptParameters. 524 s_FIFOInterruptParameters 525 [devpriv->s_InterruptParameters. 526 ui_Write].ul_OldInterruptMask = 527 4UL; 528 529 devpriv-> 530 s_InterruptParameters. 531 s_FIFOInterruptParameters 532 [devpriv->s_InterruptParameters. 533 ui_Write].b_OldModuleMask = 534 1 << b_ModuleCpt; 535 536 devpriv-> 537 s_InterruptParameters. 538 s_FIFOInterruptParameters 539 [devpriv->s_InterruptParameters. 540 ui_Write]. 541 ul_OldCounterLatchValue = 542 ul_LatchRegisterValue; 543 544 devpriv-> 545 s_InterruptParameters. 546 ul_InterruptOccur++; 547 548 /****************************/ 549 /* 0899/0224 to 1199/0225 */ 550 /****************************/ 551 /* Increment the write FIFO */ 552 /****************************/ 553 554 devpriv-> 555 s_InterruptParameters. 556 ui_Write = (devpriv-> 557 s_InterruptParameters. 558 ui_Write + 559 1) % APCI1710_SAVE_INTERRUPT; 560 561 b_InterruptFlag = 1; 562 563 /**********************/ 564 /* Call user function */ 565 /**********************/ 566 /* Send a signal to from kernel to user space */ 567 send_sig(SIGIO, devpriv->tsk_Current, 568 0); 569 570 } 571 } 572 573 /*****************************/ 574 /* Test if compare interrupt */ 575 /*****************************/ 576 577 if (ul_InterruptLatchReg & 0x10) { 578 /*****************************/ 579 /* Test if interrupt enabled */ 580 /*****************************/ 581 582 if ((ps_ModuleInfo-> 583 s_SiemensCounterInfo. 584 s_ModeRegister. 585 s_ByteModeRegister. 586 b_ModeRegister3 & 587 APCI1710_ENABLE_COMPARE_INT) == 588 APCI1710_ENABLE_COMPARE_INT) { 589 devpriv->s_InterruptParameters. 590 s_FIFOInterruptParameters 591 [devpriv->s_InterruptParameters. 592 ui_Write].ul_OldInterruptMask = 593 8UL; 594 595 devpriv-> 596 s_InterruptParameters. 597 s_FIFOInterruptParameters 598 [devpriv->s_InterruptParameters. 599 ui_Write].b_OldModuleMask = 600 1 << b_ModuleCpt; 601 602 devpriv-> 603 s_InterruptParameters. 604 s_FIFOInterruptParameters 605 [devpriv->s_InterruptParameters. 606 ui_Write]. 607 ul_OldCounterLatchValue = 608 ul_LatchRegisterValue; 609 610 devpriv-> 611 s_InterruptParameters. 612 ul_InterruptOccur++; 613 614 /****************************/ 615 /* 0899/0224 to 1199/0225 */ 616 /****************************/ 617 /* Increment the write FIFO */ 618 /****************************/ 619 620 devpriv-> 621 s_InterruptParameters. 622 ui_Write = (devpriv-> 623 s_InterruptParameters. 624 ui_Write + 625 1) % APCI1710_SAVE_INTERRUPT; 626 627 b_InterruptFlag = 1; 628 629 /**********************/ 630 /* Call user function */ 631 /**********************/ 632 /* Send a signal to from kernel to user space */ 633 send_sig(SIGIO, devpriv->tsk_Current, 634 0); 635 636 } 637 } 638 639 /*******************************************/ 640 /* Test if frequency measurement interrupt */ 641 /*******************************************/ 642 643 if (ul_InterruptLatchReg & 0x20) { 644 /*******************/ 645 /* Read the status */ 646 /*******************/ 647 648 ul_StatusRegister = inl(devpriv->s_BoardInfos. 649 ui_Address + 32 + (64 * b_ModuleCpt)); 650 651 /******************/ 652 /* Read the value */ 653 /******************/ 654 655 ul_LatchRegisterValue = 656 inl(devpriv->s_BoardInfos.ui_Address + 657 28 + (64 * b_ModuleCpt)); 658 659 switch ((ul_StatusRegister >> 1) & 3) { 660 case 0: 661 /*************************/ 662 /* Test the counter mode */ 663 /*************************/ 664 665 if ((devpriv->s_ModuleInfo[b_ModuleCpt]. 666 s_SiemensCounterInfo. 667 s_ModeRegister. 668 s_ByteModeRegister. 669 b_ModeRegister1 & 670 APCI1710_16BIT_COUNTER) 671 == APCI1710_16BIT_COUNTER) { 672 /****************************************/ 673 /* Test if 16-bit counter 1 pulse occur */ 674 /****************************************/ 675 676 if ((ul_LatchRegisterValue & 677 0xFFFFU) != 0) { 678 ui_16BitValue = 679 (unsigned int) 680 ul_LatchRegisterValue 681 & 0xFFFFU; 682 ul_LatchRegisterValue = 683 (ul_LatchRegisterValue 684 & 0xFFFF0000UL) 685 | (0xFFFFU - 686 ui_16BitValue); 687 } 688 689 /****************************************/ 690 /* Test if 16-bit counter 2 pulse occur */ 691 /****************************************/ 692 693 if ((ul_LatchRegisterValue & 694 0xFFFF0000UL) != 695 0) { 696 ui_16BitValue = 697 (unsigned int) ( 698 (ul_LatchRegisterValue 699 >> 16) & 700 0xFFFFU); 701 ul_LatchRegisterValue = 702 (ul_LatchRegisterValue 703 & 0xFFFFUL) | 704 ((0xFFFFU - 705 ui_16BitValue) 706 << 16); 707 } 708 } else { 709 if (ul_LatchRegisterValue != 0) { 710 ul_LatchRegisterValue = 711 0xFFFFFFFFUL - 712 ul_LatchRegisterValue; 713 } 714 } 715 break; 716 717 case 1: 718 /****************************************/ 719 /* Test if 16-bit counter 2 pulse occur */ 720 /****************************************/ 721 722 if ((ul_LatchRegisterValue & 723 0xFFFF0000UL) != 0) { 724 ui_16BitValue = 725 (unsigned int) ( 726 (ul_LatchRegisterValue 727 >> 16) & 728 0xFFFFU); 729 ul_LatchRegisterValue = 730 (ul_LatchRegisterValue & 731 0xFFFFUL) | ((0xFFFFU - 732 ui_16BitValue) 733 << 16); 734 } 735 break; 736 737 case 2: 738 /****************************************/ 739 /* Test if 16-bit counter 1 pulse occur */ 740 /****************************************/ 741 742 if ((ul_LatchRegisterValue & 0xFFFFU) != 743 0) { 744 ui_16BitValue = 745 (unsigned int) 746 ul_LatchRegisterValue & 747 0xFFFFU; 748 ul_LatchRegisterValue = 749 (ul_LatchRegisterValue & 750 0xFFFF0000UL) | (0xFFFFU 751 - ui_16BitValue); 752 } 753 break; 754 } 755 756 devpriv-> 757 s_InterruptParameters. 758 s_FIFOInterruptParameters[devpriv-> 759 s_InterruptParameters. 760 ui_Write]. 761 ul_OldInterruptMask = 0x10000UL; 762 763 devpriv-> 764 s_InterruptParameters. 765 s_FIFOInterruptParameters[devpriv-> 766 s_InterruptParameters. 767 ui_Write]. 768 b_OldModuleMask = 1 << b_ModuleCpt; 769 770 devpriv-> 771 s_InterruptParameters. 772 s_FIFOInterruptParameters[devpriv-> 773 s_InterruptParameters. 774 ui_Write]. 775 ul_OldCounterLatchValue = 776 ul_LatchRegisterValue; 777 778 devpriv-> 779 s_InterruptParameters. 780 ul_InterruptOccur++; 781 782 /****************************/ 783 /* 0899/0224 to 1199/0225 */ 784 /****************************/ 785 /* Increment the write FIFO */ 786 /****************************/ 787 788 devpriv-> 789 s_InterruptParameters. 790 ui_Write = (devpriv-> 791 s_InterruptParameters. 792 ui_Write + 1) % APCI1710_SAVE_INTERRUPT; 793 794 b_InterruptFlag = 1; 795 796 /**********************/ 797 /* Call user function */ 798 /**********************/ 799 /* Send a signal to from kernel to user space */ 800 send_sig(SIGIO, devpriv->tsk_Current, 0); 801 802 } 803 } /* Incremental counter */ 804 805 /***************/ 806 /* Test if CDA */ 807 /***************/ 808 809 if ((devpriv->s_BoardInfos. 810 dw_MolduleConfiguration[b_ModuleCpt] & 811 0xFFFF0000UL) == APCI1710_CDA) { 812 /******************************************/ 813 /* Test if CDA enable and functionality 0 */ 814 /******************************************/ 815 816 if ((devpriv->s_ModuleInfo[b_ModuleCpt]. 817 s_CDAModuleInfo. 818 b_CDAEnable == APCI1710_ENABLE) 819 && (devpriv->s_ModuleInfo[b_ModuleCpt]. 820 s_CDAModuleInfo.b_FctSelection == 0)) { 821 /****************************/ 822 /* Get the interrupt status */ 823 /****************************/ 824 825 ul_StatusRegister = inl(devpriv->s_BoardInfos. 826 ui_Address + 16 + (64 * b_ModuleCpt)); 827 /***************************/ 828 /* Test if interrupt occur */ 829 /***************************/ 830 831 if (ul_StatusRegister & 1) { 832 devpriv-> 833 s_InterruptParameters. 834 s_FIFOInterruptParameters 835 [devpriv->s_InterruptParameters. 836 ui_Write].ul_OldInterruptMask = 837 0x80000UL; 838 839 devpriv-> 840 s_InterruptParameters. 841 s_FIFOInterruptParameters 842 [devpriv->s_InterruptParameters. 843 ui_Write].b_OldModuleMask = 844 1 << b_ModuleCpt; 845 846 devpriv-> 847 s_InterruptParameters. 848 s_FIFOInterruptParameters 849 [devpriv->s_InterruptParameters. 850 ui_Write]. 851 ul_OldCounterLatchValue = 0; 852 853 devpriv-> 854 s_InterruptParameters. 855 ul_InterruptOccur++; 856 857 /****************************/ 858 /* Increment the write FIFO */ 859 /****************************/ 860 861 devpriv-> 862 s_InterruptParameters. 863 ui_Write = (devpriv-> 864 s_InterruptParameters. 865 ui_Write + 866 1) % APCI1710_SAVE_INTERRUPT; 867 868 b_InterruptFlag = 1; 869 870 /**********************/ 871 /* Call user function */ 872 /**********************/ 873 874 /* Send a signal to from kernel to user space */ 875 send_sig(SIGIO, devpriv->tsk_Current, 876 0); 877 878 } /* if (ul_StatusRegister & 1) */ 879 880 } 881 } /* CDA */ 882 883 /***********************/ 884 /* Test if PWM counter */ 885 /***********************/ 886 887 if ((devpriv->s_BoardInfos. 888 dw_MolduleConfiguration[b_ModuleCpt] & 889 0xFFFF0000UL) == APCI1710_PWM) { 890 for (b_PWMCpt = 0; b_PWMCpt < 2; b_PWMCpt++) { 891 /*************************************/ 892 /* Test if PWM interrupt initialised */ 893 /*************************************/ 894 895 if (devpriv-> 896 s_ModuleInfo[b_ModuleCpt]. 897 s_PWMModuleInfo. 898 s_PWMInfo[b_PWMCpt]. 899 b_InterruptEnable == APCI1710_ENABLE) { 900 /*****************************/ 901 /* Read the interrupt status */ 902 /*****************************/ 903 904 ul_StatusRegister = 905 inl(devpriv->s_BoardInfos. 906 ui_Address + 16 + 907 (20 * b_PWMCpt) + 908 (64 * b_ModuleCpt)); 909 910 /***************************/ 911 /* Test if interrupt occur */ 912 /***************************/ 913 914 if (ul_StatusRegister & 0x1) { 915 devpriv-> 916 s_InterruptParameters. 917 s_FIFOInterruptParameters 918 [devpriv-> 919 s_InterruptParameters. 920 ui_Write]. 921 ul_OldInterruptMask = 922 0x4000UL << b_PWMCpt; 923 924 devpriv-> 925 s_InterruptParameters. 926 s_FIFOInterruptParameters 927 [devpriv-> 928 s_InterruptParameters. 929 ui_Write]. 930 b_OldModuleMask = 931 1 << b_ModuleCpt; 932 933 devpriv-> 934 s_InterruptParameters. 935 ul_InterruptOccur++; 936 937 /****************************/ 938 /* Increment the write FIFO */ 939 /****************************/ 940 941 devpriv-> 942 s_InterruptParameters. 943 ui_Write = (devpriv-> 944 s_InterruptParameters. 945 ui_Write + 946 1) % 947 APCI1710_SAVE_INTERRUPT; 948 949 b_InterruptFlag = 1; 950 951 /**********************/ 952 /* Call user function */ 953 /**********************/ 954 /* Send a signal to from kernel to user space */ 955 send_sig(SIGIO, 956 devpriv->tsk_Current, 957 0); 958 959 } /* if (ul_StatusRegister & 0x1) */ 960 } /* if (APCI1710_ENABLE) */ 961 } /* for (b_PWMCpt == 0; b_PWMCpt < 0; b_PWMCpt ++) */ 962 } /* PWM counter */ 963 964 /***********************/ 965 /* Test if tor counter */ 966 /***********************/ 967 968 if ((devpriv->s_BoardInfos. 969 dw_MolduleConfiguration[b_ModuleCpt] & 970 0xFFFF0000UL) == APCI1710_TOR_COUNTER) { 971 for (b_TorCounterCpt = 0; b_TorCounterCpt < 2; 972 b_TorCounterCpt++) { 973 /*************************************/ 974 /* Test if tor interrupt initialised */ 975 /*************************************/ 976 977 if (devpriv-> 978 s_ModuleInfo[b_ModuleCpt]. 979 s_TorCounterModuleInfo. 980 s_TorCounterInfo[b_TorCounterCpt]. 981 b_InterruptEnable == APCI1710_ENABLE) { 982 /*****************************/ 983 /* Read the interrupt status */ 984 /*****************************/ 985 986 ul_StatusRegister = 987 inl(devpriv->s_BoardInfos. 988 ui_Address + 12 + 989 (16 * b_TorCounterCpt) + 990 (64 * b_ModuleCpt)); 991 992 /***************************/ 993 /* Test if interrupt occur */ 994 /***************************/ 995 996 if (ul_StatusRegister & 0x1) { 997 /******************************/ 998 /* Read the tor counter value */ 999 /******************************/ 1000 1001 ul_LatchRegisterValue = 1002 inl(devpriv-> 1003 s_BoardInfos. 1004 ui_Address + 0 + 1005 (16 * b_TorCounterCpt) + 1006 (64 * b_ModuleCpt)); 1007 1008 devpriv-> 1009 s_InterruptParameters. 1010 s_FIFOInterruptParameters 1011 [devpriv-> 1012 s_InterruptParameters. 1013 ui_Write]. 1014 ul_OldInterruptMask = 1015 0x1000UL << 1016 b_TorCounterCpt; 1017 1018 devpriv-> 1019 s_InterruptParameters. 1020 s_FIFOInterruptParameters 1021 [devpriv-> 1022 s_InterruptParameters. 1023 ui_Write]. 1024 b_OldModuleMask = 1025 1 << b_ModuleCpt; 1026 1027 devpriv-> 1028 s_InterruptParameters. 1029 s_FIFOInterruptParameters 1030 [devpriv-> 1031 s_InterruptParameters. 1032 ui_Write]. 1033 ul_OldCounterLatchValue 1034 = ul_LatchRegisterValue; 1035 1036 devpriv-> 1037 s_InterruptParameters. 1038 ul_InterruptOccur++; 1039 1040 /****************************/ 1041 /* Increment the write FIFO */ 1042 /****************************/ 1043 1044 devpriv-> 1045 s_InterruptParameters. 1046 ui_Write = (devpriv-> 1047 s_InterruptParameters. 1048 ui_Write + 1049 1) % 1050 APCI1710_SAVE_INTERRUPT; 1051 1052 b_InterruptFlag = 1; 1053 1054 /**********************/ 1055 /* Call user function */ 1056 /**********************/ 1057 1058 /* Send a signal to from kernel to user space */ 1059 send_sig(SIGIO, 1060 devpriv->tsk_Current, 1061 0); 1062 } /* if (ul_StatusRegister & 0x1) */ 1063 } /* if (APCI1710_ENABLE) */ 1064 } /* for (b_TorCounterCpt == 0; b_TorCounterCpt < 0; b_TorCounterCpt ++) */ 1065 } /* Tor counter */ 1066 1067 /***********************/ 1068 /* Test if chronometer */ 1069 /***********************/ 1070 1071 if ((devpriv->s_BoardInfos. 1072 dw_MolduleConfiguration[b_ModuleCpt] & 1073 0xFFFF0000UL) == APCI1710_CHRONOMETER) { 1074 1075 /* printk("APCI1710 Chrono Interrupt\n"); */ 1076 /*****************************/ 1077 /* Read the interrupt status */ 1078 /*****************************/ 1079 1080 ul_InterruptLatchReg = inl(devpriv->s_BoardInfos. 1081 ui_Address + 12 + (64 * b_ModuleCpt)); 1082 1083 /***************************/ 1084 /* Test if interrupt occur */ 1085 /***************************/ 1086 1087 if ((ul_InterruptLatchReg & 0x8) == 0x8) { 1088 /****************************/ 1089 /* Clear the interrupt flag */ 1090 /****************************/ 1091 1092 outl(0, devpriv->s_BoardInfos. 1093 ui_Address + 32 + (64 * b_ModuleCpt)); 1094 1095 /***************************/ 1096 /* Test if continuous mode */ 1097 /***************************/ 1098 1099 if (ps_ModuleInfo-> 1100 s_ChronoModuleInfo. 1101 b_CycleMode == APCI1710_ENABLE) { 1102 /********************/ 1103 /* Clear the status */ 1104 /********************/ 1105 1106 outl(0, devpriv->s_BoardInfos. 1107 ui_Address + 36 + 1108 (64 * b_ModuleCpt)); 1109 } 1110 1111 /*************************/ 1112 /* Read the timing value */ 1113 /*************************/ 1114 1115 ul_LatchRegisterValue = 1116 inl(devpriv->s_BoardInfos.ui_Address + 1117 4 + (64 * b_ModuleCpt)); 1118 1119 /*****************************/ 1120 /* Test if interrupt enabled */ 1121 /*****************************/ 1122 1123 if (ps_ModuleInfo-> 1124 s_ChronoModuleInfo.b_InterruptMask) { 1125 devpriv-> 1126 s_InterruptParameters. 1127 s_FIFOInterruptParameters 1128 [devpriv->s_InterruptParameters. 1129 ui_Write].ul_OldInterruptMask = 1130 0x80; 1131 1132 devpriv-> 1133 s_InterruptParameters. 1134 s_FIFOInterruptParameters 1135 [devpriv->s_InterruptParameters. 1136 ui_Write].b_OldModuleMask = 1137 1 << b_ModuleCpt; 1138 1139 devpriv-> 1140 s_InterruptParameters. 1141 s_FIFOInterruptParameters 1142 [devpriv->s_InterruptParameters. 1143 ui_Write]. 1144 ul_OldCounterLatchValue = 1145 ul_LatchRegisterValue; 1146 1147 devpriv-> 1148 s_InterruptParameters. 1149 ul_InterruptOccur++; 1150 1151 /****************************/ 1152 /* Increment the write FIFO */ 1153 /****************************/ 1154 1155 devpriv-> 1156 s_InterruptParameters. 1157 ui_Write = (devpriv-> 1158 s_InterruptParameters. 1159 ui_Write + 1160 1) % APCI1710_SAVE_INTERRUPT; 1161 1162 b_InterruptFlag = 1; 1163 1164 /**********************/ 1165 /* Call user function */ 1166 /**********************/ 1167 /* Send a signal to from kernel to user space */ 1168 send_sig(SIGIO, devpriv->tsk_Current, 1169 0); 1170 1171 } 1172 } 1173 } /* Chronometer */ 1174 1175 /*************************/ 1176 /* Test if pulse encoder */ 1177 /*************************/ 1178 1179 if ((devpriv->s_BoardInfos. 1180 dw_MolduleConfiguration[b_ModuleCpt] & 1181 0xFFFF0000UL) == APCI1710_PULSE_ENCODER) { 1182 /****************************/ 1183 /* Read the status register */ 1184 /****************************/ 1185 1186 ul_StatusRegister = inl(devpriv->s_BoardInfos. 1187 ui_Address + 20 + (64 * b_ModuleCpt)); 1188 1189 if (ul_StatusRegister & 0xF) { 1190 for (b_PulseIncoderCpt = 0; 1191 b_PulseIncoderCpt < 4; 1192 b_PulseIncoderCpt++) { 1193 /*************************************/ 1194 /* Test if pulse encoder initialised */ 1195 /*************************************/ 1196 1197 if ((ps_ModuleInfo-> 1198 s_PulseEncoderModuleInfo. 1199 s_PulseEncoderInfo 1200 [b_PulseIncoderCpt]. 1201 b_PulseEncoderInit == 1) 1202 && (((ps_ModuleInfo->s_PulseEncoderModuleInfo.dw_SetRegister >> b_PulseIncoderCpt) & 1) == 1) && (((ul_StatusRegister >> (b_PulseIncoderCpt)) & 1) == 1)) { 1203 devpriv->s_InterruptParameters. 1204 s_FIFOInterruptParameters 1205 [devpriv-> 1206 s_InterruptParameters. 1207 ui_Write]. 1208 ul_OldInterruptMask = 1209 0x100UL << 1210 b_PulseIncoderCpt; 1211 1212 devpriv-> 1213 s_InterruptParameters. 1214 s_FIFOInterruptParameters 1215 [devpriv-> 1216 s_InterruptParameters. 1217 ui_Write]. 1218 b_OldModuleMask = 1219 1 << b_ModuleCpt; 1220 1221 devpriv-> 1222 s_InterruptParameters. 1223 s_FIFOInterruptParameters 1224 [devpriv-> 1225 s_InterruptParameters. 1226 ui_Write]. 1227 ul_OldCounterLatchValue 1228 = ul_LatchRegisterValue; 1229 1230 devpriv-> 1231 s_InterruptParameters. 1232 ul_InterruptOccur++; 1233 1234 /****************************/ 1235 /* 0899/0224 to 1199/0225 */ 1236 /****************************/ 1237 /* Increment the write FIFO */ 1238 /****************************/ 1239 1240 devpriv-> 1241 s_InterruptParameters. 1242 ui_Write = (devpriv-> 1243 s_InterruptParameters. 1244 ui_Write + 1245 1) % 1246 APCI1710_SAVE_INTERRUPT; 1247 1248 b_InterruptFlag = 1; 1249 1250 /**********************/ 1251 /* Call user function */ 1252 /**********************/ 1253 /* Send a signal to from kernel to user space */ 1254 send_sig(SIGIO, 1255 devpriv->tsk_Current, 1256 0); 1257 1258 } 1259 } 1260 } 1261 } /* pulse encoder */ 1262 1263 } 1264 return; 1265 1266} 1267