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 +-----------------------------------------------------------------------+ 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 : TTL.C | Version : 2.96 | 34 +-------------------------------+---------------------------------------+ 35 | Project manager: Eric Stolz | Date : 02/12/2002 | 36 +-----------------------------------------------------------------------+ 37 | Description : APCI-1710 TTL I/O module | 38 | | 39 | | 40 +-----------------------------------------------------------------------+ 41 | UPDATES | 42 +-----------------------------------------------------------------------+ 43 | Date | Author | Description of updates | 44 +----------+-----------+------------------------------------------------+ 45 | 13/05/98 | S. Weber | TTL digital input / output implementation | 46 |----------|-----------|------------------------------------------------| 47 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 | 48 | | | available | 49 +-----------------------------------------------------------------------+ 50 | | | | 51 | | | | 52 +-----------------------------------------------------------------------+ 53*/ 54 55/* 56+----------------------------------------------------------------------------+ 57| Included files | 58+----------------------------------------------------------------------------+ 59*/ 60 61#include "APCI1710_Ttl.h" 62 63/* 64+----------------------------------------------------------------------------+ 65| Function Name : _INT_ i_APCI1710_InitTTLIODirection | 66| (unsigned char_ b_BoardHandle, | 67| unsigned char_ b_ModulNbr, | 68| unsigned char_ b_PortAMode, | 69| unsigned char_ b_PortBMode, | 70| unsigned char_ b_PortCMode, | 71| unsigned char_ b_PortDMode) | 72+----------------------------------------------------------------------------+ 73| Task APCI1710_TTL_INIT (using defaults) : Configure the TTL I/O operating mode from selected | 74| module (b_ModulNbr). You must calling this function be| 75| for you call any other function witch access of TTL. | 76 APCI1710_TTL_INITDIRECTION(user inputs for direction) 77 78+----------------------------------------------------------------------------+ 79| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710| 80| unsigned char_ b_ModulNbr : Module number to | 81| configure (0 to 3) 82 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec); 83 b_InitType = (unsigned char) data[0]; 84 b_PortAMode = (unsigned char) data[1]; 85 b_PortBMode = (unsigned char) data[2]; 86 b_PortCMode = (unsigned char) data[3]; 87 b_PortDMode = (unsigned char) data[4];| 88+----------------------------------------------------------------------------+ 89| Output Parameters : - | 90+----------------------------------------------------------------------------+ 91| Return Value : 0: No error | 92| -1: The handle parameter of the board is wrong | 93| -2: The module parameter is wrong | 94| -3: The module is not a TTL module | 95| -4: Function not available for this version | 96| -5: Port A mode selection is wrong | 97| -6: Port B mode selection is wrong | 98| -7: Port C mode selection is wrong | 99| -8: Port D mode selection is wrong | 100+----------------------------------------------------------------------------+ 101*/ 102 103int i_APCI1710_InsnConfigInitTTLIO(struct comedi_device *dev, struct comedi_subdevice *s, 104 struct comedi_insn *insn, unsigned int *data) 105{ 106 int i_ReturnValue = 0; 107 unsigned char b_ModulNbr; 108 unsigned char b_InitType; 109 unsigned char b_PortAMode; 110 unsigned char b_PortBMode; 111 unsigned char b_PortCMode; 112 unsigned char b_PortDMode; 113 114 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec); 115 b_InitType = (unsigned char) data[0]; 116 i_ReturnValue = insn->n; 117 118 /**************************/ 119 /* Test the module number */ 120 /**************************/ 121 122 if (b_ModulNbr < 4) { 123 /**************************/ 124 /* Test if TTL I/O module */ 125 /**************************/ 126 127 if ((devpriv->s_BoardInfos. 128 dw_MolduleConfiguration[b_ModulNbr] & 129 0xFFFF0000UL) == APCI1710_TTL_IO) { 130 switch (b_InitType) { 131 case APCI1710_TTL_INIT: 132 133 devpriv->s_ModuleInfo[b_ModulNbr]. 134 s_TTLIOInfo.b_TTLInit = 1; 135 136 /***************************/ 137 /* Set TTL port A to input */ 138 /***************************/ 139 140 devpriv->s_ModuleInfo[b_ModulNbr]. 141 s_TTLIOInfo.b_PortConfiguration[0] = 0; 142 143 /***************************/ 144 /* Set TTL port B to input */ 145 /***************************/ 146 147 devpriv->s_ModuleInfo[b_ModulNbr]. 148 s_TTLIOInfo.b_PortConfiguration[1] = 0; 149 150 /***************************/ 151 /* Set TTL port C to input */ 152 /***************************/ 153 154 devpriv->s_ModuleInfo[b_ModulNbr]. 155 s_TTLIOInfo.b_PortConfiguration[2] = 0; 156 157 /****************************/ 158 /* Set TTL port D to output */ 159 /****************************/ 160 161 devpriv->s_ModuleInfo[b_ModulNbr]. 162 s_TTLIOInfo.b_PortConfiguration[3] = 1; 163 164 /*************************/ 165 /* Set the configuration */ 166 /*************************/ 167 168 outl(0x8, 169 devpriv->s_BoardInfos.ui_Address + 20 + 170 (64 * b_ModulNbr)); 171 break; 172 173 case APCI1710_TTL_INITDIRECTION: 174 175 b_PortAMode = (unsigned char) data[1]; 176 b_PortBMode = (unsigned char) data[2]; 177 b_PortCMode = (unsigned char) data[3]; 178 b_PortDMode = (unsigned char) data[4]; 179 180 /********************/ 181 /* Test the version */ 182 /********************/ 183 184 if ((devpriv->s_BoardInfos. 185 dw_MolduleConfiguration 186 [b_ModulNbr] & 0xFFFF) >= 187 0x3230) { 188 /************************/ 189 /* Test the port A mode */ 190 /************************/ 191 192 if ((b_PortAMode == 0) 193 || (b_PortAMode == 1)) { 194 /************************/ 195 /* Test the port B mode */ 196 /************************/ 197 198 if ((b_PortBMode == 0) 199 || (b_PortBMode == 1)) { 200 /************************/ 201 /* Test the port C mode */ 202 /************************/ 203 204 if ((b_PortCMode == 0) 205 || (b_PortCMode 206 == 1)) { 207 /************************/ 208 /* Test the port D mode */ 209 /************************/ 210 211 if ((b_PortDMode == 0) || (b_PortDMode == 1)) { 212 devpriv-> 213 s_ModuleInfo 214 [b_ModulNbr]. 215 s_TTLIOInfo. 216 b_TTLInit 217 = 218 1; 219 220 /***********************/ 221 /* Set TTL port A mode */ 222 /***********************/ 223 224 devpriv-> 225 s_ModuleInfo 226 [b_ModulNbr]. 227 s_TTLIOInfo. 228 b_PortConfiguration 229 [0] 230 = 231 b_PortAMode; 232 233 /***********************/ 234 /* Set TTL port B mode */ 235 /***********************/ 236 237 devpriv-> 238 s_ModuleInfo 239 [b_ModulNbr]. 240 s_TTLIOInfo. 241 b_PortConfiguration 242 [1] 243 = 244 b_PortBMode; 245 246 /***********************/ 247 /* Set TTL port C mode */ 248 /***********************/ 249 250 devpriv-> 251 s_ModuleInfo 252 [b_ModulNbr]. 253 s_TTLIOInfo. 254 b_PortConfiguration 255 [2] 256 = 257 b_PortCMode; 258 259 /***********************/ 260 /* Set TTL port D mode */ 261 /***********************/ 262 263 devpriv-> 264 s_ModuleInfo 265 [b_ModulNbr]. 266 s_TTLIOInfo. 267 b_PortConfiguration 268 [3] 269 = 270 b_PortDMode; 271 272 /*************************/ 273 /* Set the configuration */ 274 /*************************/ 275 276 outl((b_PortAMode << 0) | (b_PortBMode << 1) | (b_PortCMode << 2) | (b_PortDMode << 3), devpriv->s_BoardInfos.ui_Address + 20 + (64 * b_ModulNbr)); 277 } else { 278 /**********************************/ 279 /* Port D mode selection is wrong */ 280 /**********************************/ 281 282 DPRINTK("Port D mode selection is wrong\n"); 283 i_ReturnValue 284 = 285 -8; 286 } 287 } else { 288 /**********************************/ 289 /* Port C mode selection is wrong */ 290 /**********************************/ 291 292 DPRINTK("Port C mode selection is wrong\n"); 293 i_ReturnValue = 294 -7; 295 } 296 } else { 297 /**********************************/ 298 /* Port B mode selection is wrong */ 299 /**********************************/ 300 301 DPRINTK("Port B mode selection is wrong\n"); 302 i_ReturnValue = -6; 303 } 304 } else { 305 /**********************************/ 306 /* Port A mode selection is wrong */ 307 /**********************************/ 308 309 DPRINTK("Port A mode selection is wrong\n"); 310 i_ReturnValue = -5; 311 } 312 } else { 313 /*******************************************/ 314 /* Function not available for this version */ 315 /*******************************************/ 316 317 DPRINTK("Function not available for this version\n"); 318 i_ReturnValue = -4; 319 } 320 break; 321 322 DPRINTK("\n"); 323 default: 324 printk("Bad Config Type\n"); 325 } /* switch end */ 326 } else { 327 /**********************************/ 328 /* The module is not a TTL module */ 329 /**********************************/ 330 331 DPRINTK("The module is not a TTL module\n"); 332 i_ReturnValue = -3; 333 } 334 } else { 335 /***********************/ 336 /* Module number error */ 337 /***********************/ 338 339 DPRINTK("Module number error\n"); 340 i_ReturnValue = -2; 341 } 342 343 return i_ReturnValue; 344} 345 346/* 347+----------------------------------------------------------------------------+ 348| INPUT FUNCTIONS | 349+----------------------------------------------------------------------------+ 350*/ 351 352/* 353+----------------------------------------------------------------------------+ 354| Function Name : _INT_ i_APCI1710_ReadTTLIOChannelValue | 355| (unsigned char_ b_BoardHandle, | 356| unsigned char_ b_ModulNbr, | 357| unsigned char_ b_SelectedPort, | 358| unsigned char_ b_InputChannel, | 359| unsigned char *_ pb_ChannelStatus) | 360+----------------------------------------------------------------------------+ 361| Task : Read the status from selected TTL digital input | 362| (b_InputChannel) 363+----------------------------------------------------------------------------+ 364| Task : Read the status from digital input port | 365| (b_SelectedPort) from selected TTL module (b_ModulNbr) | 366+----------------------------------------------------------------------------+ 367 368+----------------------------------------------------------------------------+ 369| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710| 370| unsigned char_ b_ModulNbr : Module number to | 371| configure (0 to 7) | 372| unsigned char_ b_SelectedPort, : Selection from TTL I/O | 373| port (0 to 2) | 374| 0 : Port A selection | 375| 1 : Port B selection | 376| 2 : Port C selection | 377| 3 : Port D selection | 378| unsigned char_ b_InputChannel : Selection from digital | 379| input ( 0 to 2) 380APCI1710_TTL_READCHANNEL 381 b_ModulNbr = CR_AREF(insn->chanspec); 382 b_SelectedPort= CR_RANGE(insn->chanspec); 383 b_InputChannel= CR_CHAN(insn->chanspec); 384 b_ReadType = (unsigned char) data[0]; 385 386 APCI1710_TTL_READPORT| 387 b_ModulNbr = CR_AREF(insn->chanspec); 388 b_SelectedPort= CR_RANGE(insn->chanspec); 389 b_ReadType = (unsigned char) data[0]; 390 391+----------------------------------------------------------------------------+ 392| Output Parameters : data[0] 393 394 unsigned char *_ pb_ChannelStatus : Digital input channel | 395| status | 396| 0 : Channle is not active| 397| 1 : Channle is active | 398+----------------------------------------------------------------------------+ 399| Return Value : 0: No error | 400| -1: The handle parameter of the board is wrong | 401| -2: The module parameter is wrong | 402| -3: The module is not a TTL module | 403| -4: The selected TTL input port is wrong | 404| -5: The selected TTL digital input is wrong | 405| -6: TTL I/O not initialised | 406+----------------------------------------------------------------------------+ 407*/ 408 409int i_APCI1710_InsnBitsReadTTLIO(struct comedi_device *dev, struct comedi_subdevice *s, 410 struct comedi_insn *insn, unsigned int *data) 411{ 412 int i_ReturnValue = 0; 413 unsigned int dw_StatusReg; 414 unsigned char b_ModulNbr; 415 unsigned char b_SelectedPort; 416 unsigned char b_InputChannel; 417 unsigned char b_ReadType; 418 unsigned char *pb_ChannelStatus; 419 unsigned char *pb_PortValue; 420 421 i_ReturnValue = insn->n; 422 b_ReadType = (unsigned char) data[0]; 423 b_ModulNbr = CR_AREF(insn->chanspec); 424 b_SelectedPort = CR_RANGE(insn->chanspec); 425 b_InputChannel = CR_CHAN(insn->chanspec); 426 427 /**************************/ 428 /* Test the module number */ 429 /**************************/ 430 431 if (b_ModulNbr < 4) { 432 /**************************/ 433 /* Test if TTL I/O module */ 434 /**************************/ 435 436 if ((devpriv->s_BoardInfos. 437 dw_MolduleConfiguration[b_ModulNbr] & 438 0xFFFF0000UL) == APCI1710_TTL_IO) { 439 switch (b_ReadType) { 440 441 case APCI1710_TTL_READCHANNEL: 442 pb_ChannelStatus = (unsigned char *) &data[0]; 443 /********************************/ 444 /* Test the TTL I/O port number */ 445 /********************************/ 446 447 if (((b_SelectedPort <= 2) 448 && ((devpriv->s_BoardInfos. 449 dw_MolduleConfiguration 450 [b_ModulNbr] & 451 0xFFFF) == 452 0x3130)) 453 || ((b_SelectedPort <= 3) 454 && ((devpriv->s_BoardInfos. 455 dw_MolduleConfiguration 456 [b_ModulNbr] & 457 0xFFFF) >= 458 0x3230))) { 459 /******************************************/ 460 /* Test the digital imnput channel number */ 461 /******************************************/ 462 463 if (((b_InputChannel <= 7) 464 && (b_SelectedPort < 3)) 465 || ((b_InputChannel <= 1) 466 && (b_SelectedPort == 467 3))) { 468 /******************************************/ 469 /* Test if the TTL I/O module initialised */ 470 /******************************************/ 471 472 if (devpriv-> 473 s_ModuleInfo 474 [b_ModulNbr]. 475 s_TTLIOInfo.b_TTLInit == 476 1) { 477 /***********************************/ 478 /* Test if TTL port used for input */ 479 /***********************************/ 480 481 if (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) == 0x3130) || (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3230) && (devpriv->s_ModuleInfo[b_ModulNbr].s_TTLIOInfo.b_PortConfiguration[b_SelectedPort] == 0))) { 482 /**************************/ 483 /* Read all digital input */ 484 /**************************/ 485 486 dw_StatusReg = 487 inl 488 (devpriv-> 489 s_BoardInfos. 490 ui_Address 491 + 492 (64 * b_ModulNbr)); 493 494 *pb_ChannelStatus 495 = 496 (unsigned char) ( 497 (dw_StatusReg 498 >> 499 (8 * b_SelectedPort)) >> b_InputChannel) & 1; 500 } else { 501 /*******************************/ 502 /* Selected TTL I/O port error */ 503 /*******************************/ 504 505 DPRINTK("Selected TTL I/O port error\n"); 506 i_ReturnValue = 507 -4; 508 } 509 } else { 510 /***************************/ 511 /* TTL I/O not initialised */ 512 /***************************/ 513 514 DPRINTK("TTL I/O not initialised\n"); 515 i_ReturnValue = -6; 516 } 517 } else { 518 /********************************/ 519 /* Selected digital input error */ 520 /********************************/ 521 522 DPRINTK("Selected digital input error\n"); 523 i_ReturnValue = -5; 524 } 525 } else { 526 /*******************************/ 527 /* Selected TTL I/O port error */ 528 /*******************************/ 529 530 DPRINTK("Selected TTL I/O port error\n"); 531 i_ReturnValue = -4; 532 } 533 break; 534 535 case APCI1710_TTL_READPORT: 536 pb_PortValue = (unsigned char *) &data[0]; 537 /********************************/ 538 /* Test the TTL I/O port number */ 539 /********************************/ 540 541 if (((b_SelectedPort <= 2) 542 && ((devpriv->s_BoardInfos. 543 dw_MolduleConfiguration 544 [b_ModulNbr] & 545 0xFFFF) == 546 0x3130)) 547 || ((b_SelectedPort <= 3) 548 && ((devpriv->s_BoardInfos. 549 dw_MolduleConfiguration 550 [b_ModulNbr] & 551 0xFFFF) >= 552 0x3230))) { 553 /******************************************/ 554 /* Test if the TTL I/O module initialised */ 555 /******************************************/ 556 557 if (devpriv->s_ModuleInfo[b_ModulNbr]. 558 s_TTLIOInfo.b_TTLInit == 1) { 559 /***********************************/ 560 /* Test if TTL port used for input */ 561 /***********************************/ 562 563 if (((devpriv->s_BoardInfos. 564 dw_MolduleConfiguration 565 [b_ModulNbr] 566 & 567 0xFFFF) 568 == 0x3130) 569 || (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3230) && (devpriv->s_ModuleInfo[b_ModulNbr].s_TTLIOInfo.b_PortConfiguration[b_SelectedPort] == 0))) { 570 /**************************/ 571 /* Read all digital input */ 572 /**************************/ 573 574 dw_StatusReg = 575 inl(devpriv-> 576 s_BoardInfos. 577 ui_Address + 578 (64 * b_ModulNbr)); 579 580 *pb_PortValue = 581 (unsigned char) ( 582 (dw_StatusReg >> 583 (8 * b_SelectedPort)) & 0xFF); 584 } else { 585 /*******************************/ 586 /* Selected TTL I/O port error */ 587 /*******************************/ 588 589 DPRINTK("Selected TTL I/O port error\n"); 590 i_ReturnValue = -4; 591 } 592 } else { 593 /***************************/ 594 /* TTL I/O not initialised */ 595 /***************************/ 596 597 DPRINTK("TTL I/O not initialised\n"); 598 i_ReturnValue = -5; 599 } 600 } else { 601 /*******************************/ 602 /* Selected TTL I/O port error */ 603 /*******************************/ 604 605 DPRINTK("Selected TTL I/O port error\n"); 606 i_ReturnValue = -4; 607 } 608 break; 609 610 default: 611 printk("Bad ReadType\n"); 612 613 } /* End Switch */ 614 } else { 615 /**********************************/ 616 /* The module is not a TTL module */ 617 /**********************************/ 618 619 DPRINTK("The module is not a TTL module\n"); 620 i_ReturnValue = -3; 621 } 622 } else { 623 /***********************/ 624 /* Module number error */ 625 /***********************/ 626 627 DPRINTK("Module number error\n"); 628 i_ReturnValue = -2; 629 } 630 631 return i_ReturnValue; 632} 633 634/* 635+----------------------------------------------------------------------------+ 636| Function Name : int i_APCI1710_InsnReadTTLIOAllPortValue(comedi_device 637*dev,struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data) | 638+----------------------------------------------------------------------------+ 639| Task : Read the status from all digital input ports | 640| (port A, port B and port C) from selected TTL | 641| module (b_ModulNbr) | 642+----------------------------------------------------------------------------+ 643| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710| 644| unsigned char_ b_ModulNbr : Module number to | 645| configure (0 to 3) | 646+----------------------------------------------------------------------------+ 647| Output Parameters : PULONG_ pul_PortValue : Digital TTL inputs port | 648| status | 649+----------------------------------------------------------------------------+ 650| Return Value : 0: No error | 651| -1: The handle parameter of the board is wrong | 652| -2: The module parameter is wrong | 653| -3: The module is not a TTL module | 654| -4: TTL I/O not initialised | 655+----------------------------------------------------------------------------+ 656*/ 657 658int i_APCI1710_InsnReadTTLIOAllPortValue(struct comedi_device *dev, 659 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) 660{ 661 int i_ReturnValue = 0; 662 unsigned int dw_StatusReg; 663 unsigned char b_ModulNbr; 664 unsigned int *pul_PortValue; 665 666 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec); 667 i_ReturnValue = insn->n; 668 pul_PortValue = (unsigned int *) &data[0]; 669 670 /**************************/ 671 /* Test the module number */ 672 /**************************/ 673 674 if (b_ModulNbr < 4) { 675 /**************************/ 676 /* Test if TTL I/O module */ 677 /**************************/ 678 679 if ((devpriv->s_BoardInfos. 680 dw_MolduleConfiguration[b_ModulNbr] & 681 0xFFFF0000UL) == APCI1710_TTL_IO) { 682 /******************************************/ 683 /* Test if the TTL I/O module initialised */ 684 /******************************************/ 685 686 if (devpriv-> 687 s_ModuleInfo[b_ModulNbr]. 688 s_TTLIOInfo.b_TTLInit == 1) { 689 /**************************/ 690 /* Read all digital input */ 691 /**************************/ 692 693 dw_StatusReg = inl(devpriv->s_BoardInfos. 694 ui_Address + (64 * b_ModulNbr)); 695 696 /**********************/ 697 /* Test if TTL Rev1.0 */ 698 /**********************/ 699 700 if ((devpriv->s_BoardInfos. 701 dw_MolduleConfiguration 702 [b_ModulNbr] & 0xFFFF) == 703 0x3130) { 704 *pul_PortValue = 705 dw_StatusReg & 0xFFFFFFUL; 706 } else { 707 /**************************************/ 708 /* Test if port A not used for output */ 709 /**************************************/ 710 711 if (devpriv->s_ModuleInfo[b_ModulNbr]. 712 s_TTLIOInfo. 713 b_PortConfiguration[0] == 1) { 714 *pul_PortValue = 715 dw_StatusReg & 716 0x3FFFF00UL; 717 } 718 719 /**************************************/ 720 /* Test if port B not used for output */ 721 /**************************************/ 722 723 if (devpriv-> 724 s_ModuleInfo[b_ModulNbr]. 725 s_TTLIOInfo. 726 b_PortConfiguration[1] == 1) { 727 *pul_PortValue = 728 dw_StatusReg & 729 0x3FF00FFUL; 730 } 731 732 /**************************************/ 733 /* Test if port C not used for output */ 734 /**************************************/ 735 736 if (devpriv-> 737 s_ModuleInfo[b_ModulNbr]. 738 s_TTLIOInfo. 739 b_PortConfiguration[2] == 1) { 740 *pul_PortValue = 741 dw_StatusReg & 742 0x300FFFFUL; 743 } 744 745 /**************************************/ 746 /* Test if port D not used for output */ 747 /**************************************/ 748 749 if (devpriv-> 750 s_ModuleInfo[b_ModulNbr]. 751 s_TTLIOInfo. 752 b_PortConfiguration[3] == 1) { 753 *pul_PortValue = 754 dw_StatusReg & 755 0xFFFFFFUL; 756 } 757 } 758 } else { 759 /***************************/ 760 /* TTL I/O not initialised */ 761 /***************************/ 762 DPRINTK("TTL I/O not initialised\n"); 763 i_ReturnValue = -5; 764 } 765 } else { 766 /**********************************/ 767 /* The module is not a TTL module */ 768 /**********************************/ 769 DPRINTK("The module is not a TTL module\n"); 770 i_ReturnValue = -3; 771 } 772 } else { 773 /***********************/ 774 /* Module number error */ 775 /***********************/ 776 DPRINTK("Module number error\n"); 777 i_ReturnValue = -2; 778 } 779 780 return i_ReturnValue; 781} 782 783/* 784+----------------------------------------------------------------------------+ 785| OUTPUT FUNCTIONS | 786+----------------------------------------------------------------------------+ 787*/ 788 789/* 790+----------------------------------------------------------------------------+ 791| Function Name : _INT_ i_APCI1710_SetTTLIOChlOn | 792| (unsigned char_ b_BoardHandle, | 793| unsigned char_ b_ModulNbr, | 794| unsigned char_ b_OutputChannel) 795int i_APCI1710_InsnWriteSetTTLIOChlOnOff(struct comedi_device *dev,struct comedi_subdevice *s, 796 struct comedi_insn *insn,unsigned int *data) | 797+----------------------------------------------------------------------------+ 798| Task : Sets or resets the output witch has been passed with the | 799| parameter b_Channel. Setting an output means setting | 800| an ouput high. | 801+----------------------------------------------------------------------------+ 802| Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 | 803| unsigned char_ b_ModulNbr : Selected module number (0 to 3)| 804| unsigned char_ b_OutputChannel : Selection from digital output | 805| channel (0 or 1) | 806| 0 : PD0 | 807| 1 : PD1 | 808| 2 to 9 : PA | 809| 10 to 17: PB | 810| 18 to 25: PC | 811 812 b_ModulNbr = CR_AREF(insn->chanspec); 813 b_OutputChannel= CR_CHAN(insn->chanspec); 814 ui_State = data[0]; /* ON or OFF */ 815+----------------------------------------------------------------------------+ 816| Output Parameters : - | 817+----------------------------------------------------------------------------+ 818| Return Value : 0: No error | 819| -1: The handle parameter of the board is wrong | 820| -2: The module parameter is wrong | 821| -3: The module is not a TTL I/O module | 822| -4: The selected digital output is wrong | 823| -5: TTL I/O not initialised see function | 824| " i_APCI1710_InitTTLIO" 825+----------------------------------------------------------------------------+ 826*/ 827 828int i_APCI1710_InsnWriteSetTTLIOChlOnOff(struct comedi_device *dev, 829 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) 830{ 831 int i_ReturnValue = 0; 832 unsigned int dw_StatusReg = 0; 833 unsigned char b_ModulNbr; 834 unsigned char b_OutputChannel; 835 unsigned int ui_State; 836 837 i_ReturnValue = insn->n; 838 b_ModulNbr = CR_AREF(insn->chanspec); 839 b_OutputChannel = CR_CHAN(insn->chanspec); 840 ui_State = data[0]; /* ON or OFF */ 841 842 /**************************/ 843 /* Test the module number */ 844 /**************************/ 845 846 if (b_ModulNbr < 4) { 847 /**************************/ 848 /* Test if TTL I/O module */ 849 /**************************/ 850 851 if ((devpriv->s_BoardInfos. 852 dw_MolduleConfiguration[b_ModulNbr] & 853 0xFFFF0000UL) == APCI1710_TTL_IO) { 854 /******************************************/ 855 /* Test if the TTL I/O module initialised */ 856 /******************************************/ 857 858 if (devpriv->s_ModuleInfo[b_ModulNbr]. 859 s_TTLIOInfo.b_TTLInit == 1) { 860 /***********************************/ 861 /* Test the TTL I/O channel number */ 862 /***********************************/ 863 864 if (((b_OutputChannel <= 1) 865 && ((devpriv->s_BoardInfos. 866 dw_MolduleConfiguration 867 [b_ModulNbr] & 868 0xFFFF) == 869 0x3130)) 870 || ((b_OutputChannel <= 25) 871 && ((devpriv->s_BoardInfos. 872 dw_MolduleConfiguration 873 [b_ModulNbr] & 874 0xFFFF) >= 875 0x3230))) { 876 /****************************************************/ 877 /* Test if the selected channel is a output channel */ 878 /****************************************************/ 879 880 if (((b_OutputChannel <= 1) 881 && (devpriv-> 882 s_ModuleInfo 883 [b_ModulNbr]. 884 s_TTLIOInfo. 885 b_PortConfiguration 886 [3] == 1)) 887 || ((b_OutputChannel >= 2) 888 && (b_OutputChannel <= 889 9) 890 && (devpriv-> 891 s_ModuleInfo 892 [b_ModulNbr]. 893 s_TTLIOInfo. 894 b_PortConfiguration 895 [0] == 1)) 896 || ((b_OutputChannel >= 10) 897 && (b_OutputChannel <= 898 17) 899 && (devpriv-> 900 s_ModuleInfo 901 [b_ModulNbr]. 902 s_TTLIOInfo. 903 b_PortConfiguration 904 [1] == 1)) 905 || ((b_OutputChannel >= 18) 906 && (b_OutputChannel <= 907 25) 908 && (devpriv-> 909 s_ModuleInfo 910 [b_ModulNbr]. 911 s_TTLIOInfo. 912 b_PortConfiguration 913 [2] == 1))) { 914 /************************/ 915 /* Test if PD0 selected */ 916 /************************/ 917 918 if (b_OutputChannel == 0) { 919 920 outl(ui_State, 921 devpriv-> 922 s_BoardInfos. 923 ui_Address + 924 (64 * b_ModulNbr)); 925 } else { 926 /************************/ 927 /* Test if PD1 selected */ 928 /************************/ 929 930 if (b_OutputChannel == 931 1) { 932 933 outl(ui_State, 934 devpriv-> 935 s_BoardInfos. 936 ui_Address 937 + 4 + 938 (64 * b_ModulNbr)); 939 } else { 940 b_OutputChannel 941 = 942 b_OutputChannel 943 - 2; 944 945 /********************/ 946 /* Read all channel */ 947 /********************/ 948 949 dw_StatusReg = 950 inl 951 (devpriv-> 952 s_BoardInfos. 953 ui_Address 954 + 955 (64 * b_ModulNbr)); 956 if (ui_State) /* ON */ 957 { 958 dw_StatusReg 959 = 960 (dw_StatusReg 961 >> 962 ((b_OutputChannel / 8) * 8)) & 0xFF; 963 dw_StatusReg 964 = 965 dw_StatusReg 966 | 967 (1 968 << 969 (b_OutputChannel 970 % 971 8)); 972 } else /* Off */ 973 { 974 dw_StatusReg 975 = 976 (dw_StatusReg 977 >> 978 ((b_OutputChannel / 8) * 8)) & 0xFF; 979 dw_StatusReg 980 = 981 dw_StatusReg 982 & 983 (0xFF 984 - 985 (1 << (b_OutputChannel % 8))); 986 987 } 988 989 /****************************/ 990 /* Set the new output value */ 991 /****************************/ 992 993 outl(dw_StatusReg, devpriv->s_BoardInfos.ui_Address + 8 + ((b_OutputChannel / 8) * 4) + (64 * b_ModulNbr)); 994 } 995 } 996 } else { 997 /************************************/ 998 /* The selected TTL output is wrong */ 999 /************************************/ 1000 1001 DPRINTK(" The selected TTL output is wrong\n"); 1002 i_ReturnValue = -4; 1003 } 1004 } else { 1005 /************************************/ 1006 /* The selected TTL output is wrong */ 1007 /************************************/ 1008 1009 DPRINTK("The selected TTL output is wrong\n"); 1010 i_ReturnValue = -4; 1011 } 1012 } else { 1013 /***************************/ 1014 /* TTL I/O not initialised */ 1015 /***************************/ 1016 1017 DPRINTK("TTL I/O not initialised\n"); 1018 i_ReturnValue = -5; 1019 } 1020 } else { 1021 /**************************************/ 1022 /* The module is not a TTL I/O module */ 1023 /**************************************/ 1024 1025 DPRINTK("The module is not a TTL I/O module\n"); 1026 i_ReturnValue = -3; 1027 } 1028 } else { 1029 /***********************/ 1030 /* Module number error */ 1031 /***********************/ 1032 1033 DPRINTK("Module number error\n"); 1034 i_ReturnValue = -2; 1035 } 1036 1037 return i_ReturnValue; 1038} 1039