hwdrv_apci16xx.c revision 39cfb97b0d89a99c8e50782b17e65114b89c2e59
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 APCI1648 | Compiler : gcc | 33 | Module name : TTL.C | Version : 2.96 | 34 +-------------------------------+---------------------------------------+ 35 | Project manager: S. Weber | Date : 25/05/2005 | 36 +-----------------------------------------------------------------------+ 37 | Description : APCI-16XX TTL I/O module | 38 | | 39 | | 40 +-----------------------------------------------------------------------+ 41 | UPDATES | 42 +-----------------------------------------------------------------------+ 43 | Date | Author | Description of updates | 44 +----------+-----------+------------------------------------------------+ 45 |25.05.2005| S.Weber | Creation | 46 | | | | 47 +-----------------------------------------------------------------------+ 48*/ 49 50/* 51+----------------------------------------------------------------------------+ 52| Included files | 53+----------------------------------------------------------------------------+ 54*/ 55 56#include "hwdrv_apci16xx.h" 57 58/* 59+----------------------------------------------------------------------------+ 60| Function Name : int i_APCI16XX_InsnConfigInitTTLIO | 61| (struct comedi_device *dev, | 62| struct comedi_subdevice *s, | 63| struct comedi_insn *insn, | 64| unsigned int *data) | 65+----------------------------------------------------------------------------+ 66| Task APCI16XX_TTL_INIT (using defaults) : | 67| Configure the TTL I/O operating mode from all ports | 68| You must calling this function be | 69| for you call any other function witch access of TTL. | 70| APCI16XX_TTL_INITDIRECTION(user inputs for direction) | 71+----------------------------------------------------------------------------+ 72| Input Parameters : b_InitType = (unsigned char) data[0]; | 73| b_Port0Mode = (unsigned char) data[1]; | 74| b_Port1Mode = (unsigned char) data[2]; | 75| b_Port2Mode = (unsigned char) data[3]; | 76| b_Port3Mode = (unsigned char) data[4]; | 77| ........ | 78+----------------------------------------------------------------------------+ 79| Output Parameters : - | 80+----------------------------------------------------------------------------+ 81| Return Value :>0: No error | 82| -1: Port 0 mode selection is wrong | 83| -2: Port 1 mode selection is wrong | 84| -3: Port 2 mode selection is wrong | 85| -4: Port 3 mode selection is wrong | 86| -X: Port X-1 mode selection is wrong | 87| .... | 88| -100 : Config command error | 89| -101 : Data size error | 90+----------------------------------------------------------------------------+ 91*/ 92 93int i_APCI16XX_InsnConfigInitTTLIO(struct comedi_device *dev, 94 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) 95{ 96 int i_ReturnValue = insn->n; 97 unsigned char b_Command = 0; 98 unsigned char b_Cpt = 0; 99 unsigned char b_NumberOfPort = 100 (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8); 101 102 /************************/ 103 /* Test the buffer size */ 104 /************************/ 105 106 if (insn->n >= 1) { 107 /*******************/ 108 /* Get the command */ 109 /* **************** */ 110 111 b_Command = (unsigned char) data[0]; 112 113 /********************/ 114 /* Test the command */ 115 /********************/ 116 117 if ((b_Command == APCI16XX_TTL_INIT) || 118 (b_Command == APCI16XX_TTL_INITDIRECTION) || 119 (b_Command == APCI16XX_TTL_OUTPUTMEMORY)) { 120 /***************************************/ 121 /* Test the initialisation buffer size */ 122 /***************************************/ 123 124 if ((b_Command == APCI16XX_TTL_INITDIRECTION) 125 && ((unsigned char) (insn->n - 1) != b_NumberOfPort)) { 126 /*******************/ 127 /* Data size error */ 128 /*******************/ 129 130 printk("\nBuffer size error"); 131 i_ReturnValue = -101; 132 } 133 134 if ((b_Command == APCI16XX_TTL_OUTPUTMEMORY) 135 && ((unsigned char) (insn->n) != 2)) { 136 /*******************/ 137 /* Data size error */ 138 /*******************/ 139 140 printk("\nBuffer size error"); 141 i_ReturnValue = -101; 142 } 143 } else { 144 /************************/ 145 /* Config command error */ 146 /************************/ 147 148 printk("\nCommand selection error"); 149 i_ReturnValue = -100; 150 } 151 } else { 152 /*******************/ 153 /* Data size error */ 154 /*******************/ 155 156 printk("\nBuffer size error"); 157 i_ReturnValue = -101; 158 } 159 160 /**************************************************************************/ 161 /* Test if no error occur and APCI16XX_TTL_INITDIRECTION command selected */ 162 /**************************************************************************/ 163 164 if ((i_ReturnValue >= 0) && (b_Command == APCI16XX_TTL_INITDIRECTION)) { 165 memset(devpriv->ul_TTLPortConfiguration, 0, 166 sizeof(devpriv->ul_TTLPortConfiguration)); 167 168 /*************************************/ 169 /* Test the port direction selection */ 170 /*************************************/ 171 172 for (b_Cpt = 1; 173 (b_Cpt <= b_NumberOfPort) && (i_ReturnValue >= 0); 174 b_Cpt++) { 175 /**********************/ 176 /* Test the direction */ 177 /**********************/ 178 179 if ((data[b_Cpt] != 0) && (data[b_Cpt] != 0xFF)) { 180 /************************/ 181 /* Port direction error */ 182 /************************/ 183 184 printk("\nPort %d direction selection error", 185 (int) b_Cpt); 186 i_ReturnValue = -(int) b_Cpt; 187 } 188 189 /**************************/ 190 /* Save the configuration */ 191 /**************************/ 192 193 devpriv->ul_TTLPortConfiguration[(b_Cpt - 1) / 4] = 194 devpriv->ul_TTLPortConfiguration[(b_Cpt - 195 1) / 4] | (data[b_Cpt] << (8 * ((b_Cpt - 196 1) % 4))); 197 } 198 } 199 200 /**************************/ 201 /* Test if no error occur */ 202 /**************************/ 203 204 if (i_ReturnValue >= 0) { 205 /***********************************/ 206 /* Test if TTL port initilaisation */ 207 /***********************************/ 208 209 if ((b_Command == APCI16XX_TTL_INIT) 210 || (b_Command == APCI16XX_TTL_INITDIRECTION)) { 211 /******************************/ 212 /* Set all port configuration */ 213 /******************************/ 214 215 for (b_Cpt = 0; b_Cpt <= b_NumberOfPort; b_Cpt++) { 216 if ((b_Cpt % 4) == 0) { 217 /*************************/ 218 /* Set the configuration */ 219 /*************************/ 220 221 outl(devpriv-> 222 ul_TTLPortConfiguration[b_Cpt / 223 4], 224 devpriv->iobase + 32 + b_Cpt); 225 } 226 } 227 } 228 } 229 230 /************************************************/ 231 /* Test if output memory initialisation command */ 232 /************************************************/ 233 234 if (b_Command == APCI16XX_TTL_OUTPUTMEMORY) { 235 if (data[1]) { 236 devpriv->b_OutputMemoryStatus = ADDIDATA_ENABLE; 237 } else { 238 devpriv->b_OutputMemoryStatus = ADDIDATA_DISABLE; 239 } 240 } 241 242 return i_ReturnValue; 243} 244 245/* 246+----------------------------------------------------------------------------+ 247| INPUT FUNCTIONS | 248+----------------------------------------------------------------------------+ 249*/ 250 251/* 252+----------------------------------------------------------------------------+ 253| Function Name : int i_APCI16XX_InsnBitsReadTTLIO | 254| (struct comedi_device *dev, | 255| struct comedi_subdevice *s, | 256| struct comedi_insn *insn, | 257| unsigned int *data) | 258+----------------------------------------------------------------------------+ 259| Task : Read the status from selected TTL digital input | 260| (b_InputChannel) | 261+----------------------------------------------------------------------------+ 262| Task : Read the status from digital input port | 263| (b_SelectedPort) | 264+----------------------------------------------------------------------------+ 265| Input Parameters : | 266| APCI16XX_TTL_READCHANNEL | 267| b_SelectedPort= CR_RANGE(insn->chanspec); | 268| b_InputChannel= CR_CHAN(insn->chanspec); | 269| b_ReadType = (unsigned char) data[0]; | 270| | 271| APCI16XX_TTL_READPORT | 272| b_SelectedPort= CR_RANGE(insn->chanspec); | 273| b_ReadType = (unsigned char) data[0]; | 274+----------------------------------------------------------------------------+ 275| Output Parameters : data[0] 0 : Channle is not active | 276| 1 : Channle is active | 277+----------------------------------------------------------------------------+ 278| Return Value : >0 : No error | 279| -100 : Config command error | 280| -101 : Data size error | 281| -102 : The selected TTL input port is wrong | 282| -103 : The selected TTL digital input is wrong | 283+----------------------------------------------------------------------------+ 284*/ 285 286int i_APCI16XX_InsnBitsReadTTLIO(struct comedi_device *dev, 287 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) 288{ 289 int i_ReturnValue = insn->n; 290 unsigned char b_Command = 0; 291 unsigned char b_NumberOfPort = 292 (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8); 293 unsigned char b_SelectedPort = CR_RANGE(insn->chanspec); 294 unsigned char b_InputChannel = CR_CHAN(insn->chanspec); 295 unsigned char *pb_Status; 296 unsigned int dw_Status; 297 298 /************************/ 299 /* Test the buffer size */ 300 /************************/ 301 302 if (insn->n >= 1) { 303 /*******************/ 304 /* Get the command */ 305 /* **************** */ 306 307 b_Command = (unsigned char) data[0]; 308 309 /********************/ 310 /* Test the command */ 311 /********************/ 312 313 if ((b_Command == APCI16XX_TTL_READCHANNEL) 314 || (b_Command == APCI16XX_TTL_READPORT)) { 315 /**************************/ 316 /* Test the selected port */ 317 /**************************/ 318 319 if (b_SelectedPort < b_NumberOfPort) { 320 /**********************/ 321 /* Test if input port */ 322 /**********************/ 323 324 if (((devpriv->ul_TTLPortConfiguration 325 [b_SelectedPort / 326 4] >> (8 * 327 (b_SelectedPort 328 % 329 4))) & 330 0xFF) == 0) { 331 /***************************/ 332 /* Test the channel number */ 333 /***************************/ 334 335 if ((b_Command == 336 APCI16XX_TTL_READCHANNEL) 337 && (b_InputChannel > 7)) { 338 /*******************************************/ 339 /* The selected TTL digital input is wrong */ 340 /*******************************************/ 341 342 printk("\nChannel selection error"); 343 i_ReturnValue = -103; 344 } 345 } else { 346 /****************************************/ 347 /* The selected TTL input port is wrong */ 348 /****************************************/ 349 350 printk("\nPort selection error"); 351 i_ReturnValue = -102; 352 } 353 } else { 354 /****************************************/ 355 /* The selected TTL input port is wrong */ 356 /****************************************/ 357 358 printk("\nPort selection error"); 359 i_ReturnValue = -102; 360 } 361 } else { 362 /************************/ 363 /* Config command error */ 364 /************************/ 365 366 printk("\nCommand selection error"); 367 i_ReturnValue = -100; 368 } 369 } else { 370 /*******************/ 371 /* Data size error */ 372 /*******************/ 373 374 printk("\nBuffer size error"); 375 i_ReturnValue = -101; 376 } 377 378 /**************************/ 379 /* Test if no error occur */ 380 /**************************/ 381 382 if (i_ReturnValue >= 0) { 383 pb_Status = (unsigned char *) &data[0]; 384 385 /*******************************/ 386 /* Get the digital inpu status */ 387 /*******************************/ 388 389 dw_Status = 390 inl(devpriv->iobase + 8 + ((b_SelectedPort / 4) * 4)); 391 dw_Status = (dw_Status >> (8 * (b_SelectedPort % 4))) & 0xFF; 392 393 /***********************/ 394 /* Save the port value */ 395 /***********************/ 396 397 *pb_Status = (unsigned char) dw_Status; 398 399 /***************************************/ 400 /* Test if read channel status command */ 401 /***************************************/ 402 403 if (b_Command == APCI16XX_TTL_READCHANNEL) { 404 *pb_Status = (*pb_Status >> b_InputChannel) & 1; 405 } 406 } 407 408 return i_ReturnValue; 409} 410 411/* 412+----------------------------------------------------------------------------+ 413| Function Name : int i_APCI16XX_InsnReadTTLIOAllPortValue | 414| (struct comedi_device *dev, | 415| struct comedi_subdevice *s, | 416| struct comedi_insn *insn, | 417| unsigned int *data) | 418+----------------------------------------------------------------------------+ 419| Task : Read the status from all digital input ports | 420+----------------------------------------------------------------------------+ 421| Input Parameters : - | 422+----------------------------------------------------------------------------+ 423| Output Parameters : data[0] : Port 0 to 3 data | 424| data[1] : Port 4 to 7 data | 425| .... | 426+----------------------------------------------------------------------------+ 427| Return Value : 0: No error | 428| -100 : Read command error | 429| -101 : Data size error | 430+----------------------------------------------------------------------------+ 431*/ 432 433int i_APCI16XX_InsnReadTTLIOAllPortValue(struct comedi_device *dev, 434 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) 435{ 436 unsigned char b_Command = (unsigned char) CR_AREF(insn->chanspec); 437 int i_ReturnValue = insn->n; 438 unsigned char b_Cpt = 0; 439 unsigned char b_NumberOfPort = 0; 440 unsigned int *pls_ReadData = data; 441 442 /********************/ 443 /* Test the command */ 444 /********************/ 445 446 if ((b_Command == APCI16XX_TTL_READ_ALL_INPUTS) 447 || (b_Command == APCI16XX_TTL_READ_ALL_OUTPUTS)) { 448 /**********************************/ 449 /* Get the number of 32-Bit ports */ 450 /**********************************/ 451 452 b_NumberOfPort = 453 (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 32); 454 if ((b_NumberOfPort * 32) < 455 devpriv->ps_BoardInfo->i_NbrTTLChannel) { 456 b_NumberOfPort = b_NumberOfPort + 1; 457 } 458 459 /************************/ 460 /* Test the buffer size */ 461 /************************/ 462 463 if (insn->n >= b_NumberOfPort) { 464 if (b_Command == APCI16XX_TTL_READ_ALL_INPUTS) { 465 /**************************/ 466 /* Read all digital input */ 467 /**************************/ 468 469 for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) { 470 /************************/ 471 /* Read the 32-Bit port */ 472 /************************/ 473 474 pls_ReadData[b_Cpt] = 475 inl(devpriv->iobase + 8 + 476 (b_Cpt * 4)); 477 478 /**************************************/ 479 /* Mask all channels used als outputs */ 480 /**************************************/ 481 482 pls_ReadData[b_Cpt] = 483 pls_ReadData[b_Cpt] & 484 (~devpriv-> 485 ul_TTLPortConfiguration[b_Cpt]); 486 } 487 } else { 488 /****************************/ 489 /* Read all digital outputs */ 490 /****************************/ 491 492 for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) { 493 /************************/ 494 /* Read the 32-Bit port */ 495 /************************/ 496 497 pls_ReadData[b_Cpt] = 498 inl(devpriv->iobase + 20 + 499 (b_Cpt * 4)); 500 501 /**************************************/ 502 /* Mask all channels used als outputs */ 503 /**************************************/ 504 505 pls_ReadData[b_Cpt] = 506 pls_ReadData[b_Cpt] & devpriv-> 507 ul_TTLPortConfiguration[b_Cpt]; 508 } 509 } 510 } else { 511 /*******************/ 512 /* Data size error */ 513 /*******************/ 514 515 printk("\nBuffer size error"); 516 i_ReturnValue = -101; 517 } 518 } else { 519 /*****************/ 520 /* Command error */ 521 /*****************/ 522 523 printk("\nCommand selection error"); 524 i_ReturnValue = -100; 525 } 526 527 return i_ReturnValue; 528} 529 530/* 531+----------------------------------------------------------------------------+ 532| OUTPUT FUNCTIONS | 533+----------------------------------------------------------------------------+ 534*/ 535 536/* 537+----------------------------------------------------------------------------+ 538| Function Name : int i_APCI16XX_InsnBitsWriteTTLIO | 539| (struct comedi_device *dev, | 540| struct comedi_subdevice *s, | 541| struct comedi_insn *insn, | 542| unsigned int *data) | 543+----------------------------------------------------------------------------+ 544| Task : Set the state from selected TTL digital output | 545| (b_OutputChannel) | 546+----------------------------------------------------------------------------+ 547| Task : Set the state from digital output port | 548| (b_SelectedPort) | 549+----------------------------------------------------------------------------+ 550| Input Parameters : | 551| APCI16XX_TTL_WRITECHANNEL_ON | APCI16XX_TTL_WRITECHANNEL_OFF | 552| b_SelectedPort = CR_RANGE(insn->chanspec); | 553| b_OutputChannel= CR_CHAN(insn->chanspec); | 554| b_Command = (unsigned char) data[0]; | 555| | 556| APCI16XX_TTL_WRITEPORT_ON | APCI16XX_TTL_WRITEPORT_OFF | 557| b_SelectedPort = CR_RANGE(insn->chanspec); | 558| b_Command = (unsigned char) data[0]; | 559+----------------------------------------------------------------------------+ 560| Output Parameters : data[0] : TTL output port 0 to 3 data | 561| data[1] : TTL output port 4 to 7 data | 562| .... | 563+----------------------------------------------------------------------------+ 564| Return Value : >0 : No error | 565| -100 : Command error | 566| -101 : Data size error | 567| -102 : The selected TTL output port is wrong | 568| -103 : The selected TTL digital output is wrong | 569| -104 : Output memory disabled | 570+----------------------------------------------------------------------------+ 571*/ 572 573int i_APCI16XX_InsnBitsWriteTTLIO(struct comedi_device *dev, 574 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) 575{ 576 int i_ReturnValue = insn->n; 577 unsigned char b_Command = 0; 578 unsigned char b_NumberOfPort = 579 (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8); 580 unsigned char b_SelectedPort = CR_RANGE(insn->chanspec); 581 unsigned char b_OutputChannel = CR_CHAN(insn->chanspec); 582 unsigned int dw_Status = 0; 583 584 /************************/ 585 /* Test the buffer size */ 586 /************************/ 587 588 if (insn->n >= 1) { 589 /*******************/ 590 /* Get the command */ 591 /* **************** */ 592 593 b_Command = (unsigned char) data[0]; 594 595 /********************/ 596 /* Test the command */ 597 /********************/ 598 599 if ((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) || 600 (b_Command == APCI16XX_TTL_WRITEPORT_ON) || 601 (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) || 602 (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) { 603 /**************************/ 604 /* Test the selected port */ 605 /**************************/ 606 607 if (b_SelectedPort < b_NumberOfPort) { 608 /***********************/ 609 /* Test if output port */ 610 /***********************/ 611 612 if (((devpriv->ul_TTLPortConfiguration 613 [b_SelectedPort / 614 4] >> (8 * 615 (b_SelectedPort 616 % 617 4))) & 618 0xFF) == 0xFF) { 619 /***************************/ 620 /* Test the channel number */ 621 /***************************/ 622 623 if (((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) || (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF)) && (b_OutputChannel > 7)) { 624 /********************************************/ 625 /* The selected TTL digital output is wrong */ 626 /********************************************/ 627 628 printk("\nChannel selection error"); 629 i_ReturnValue = -103; 630 } 631 632 if (((b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE)) { 633 /********************************************/ 634 /* The selected TTL digital output is wrong */ 635 /********************************************/ 636 637 printk("\nOutput memory disabled"); 638 i_ReturnValue = -104; 639 } 640 641 /************************/ 642 /* Test the buffer size */ 643 /************************/ 644 645 if (((b_Command == APCI16XX_TTL_WRITEPORT_ON) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (insn->n < 2)) { 646 /*******************/ 647 /* Data size error */ 648 /*******************/ 649 650 printk("\nBuffer size error"); 651 i_ReturnValue = -101; 652 } 653 } else { 654 /*****************************************/ 655 /* The selected TTL output port is wrong */ 656 /*****************************************/ 657 658 printk("\nPort selection error %lX", 659 (unsigned long)devpriv-> 660 ul_TTLPortConfiguration[0]); 661 i_ReturnValue = -102; 662 } 663 } else { 664 /****************************************/ 665 /* The selected TTL output port is wrong */ 666 /****************************************/ 667 668 printk("\nPort selection error %d %d", 669 b_SelectedPort, b_NumberOfPort); 670 i_ReturnValue = -102; 671 } 672 } else { 673 /************************/ 674 /* Config command error */ 675 /************************/ 676 677 printk("\nCommand selection error"); 678 i_ReturnValue = -100; 679 } 680 } else { 681 /*******************/ 682 /* Data size error */ 683 /*******************/ 684 685 printk("\nBuffer size error"); 686 i_ReturnValue = -101; 687 } 688 689 /**************************/ 690 /* Test if no error occur */ 691 /**************************/ 692 693 if (i_ReturnValue >= 0) { 694 /********************************/ 695 /* Get the digital output state */ 696 /********************************/ 697 698 dw_Status = 699 inl(devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4)); 700 701 /**********************************/ 702 /* Test if output memory not used */ 703 /**********************************/ 704 705 if (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE) { 706 /*********************************/ 707 /* Clear the selected port value */ 708 /*********************************/ 709 710 dw_Status = 711 dw_Status & (0xFFFFFFFFUL - 712 (0xFFUL << (8 * (b_SelectedPort % 4)))); 713 } 714 715 /******************************/ 716 /* Test if setting channel ON */ 717 /******************************/ 718 719 if (b_Command == APCI16XX_TTL_WRITECHANNEL_ON) { 720 dw_Status = 721 dw_Status | (1UL << ((8 * (b_SelectedPort % 722 4)) + b_OutputChannel)); 723 } 724 725 /***************************/ 726 /* Test if setting port ON */ 727 /***************************/ 728 729 if (b_Command == APCI16XX_TTL_WRITEPORT_ON) { 730 dw_Status = 731 dw_Status | ((data[1] & 0xFF) << (8 * 732 (b_SelectedPort % 4))); 733 } 734 735 /*******************************/ 736 /* Test if setting channel OFF */ 737 /*******************************/ 738 739 if (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) { 740 dw_Status = 741 dw_Status & (0xFFFFFFFFUL - 742 (1UL << ((8 * (b_SelectedPort % 4)) + 743 b_OutputChannel))); 744 } 745 746 /****************************/ 747 /* Test if setting port OFF */ 748 /****************************/ 749 750 if (b_Command == APCI16XX_TTL_WRITEPORT_OFF) { 751 dw_Status = 752 dw_Status & (0xFFFFFFFFUL - 753 ((data[1] & 0xFF) << (8 * (b_SelectedPort % 754 4)))); 755 } 756 757 outl(dw_Status, 758 devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4)); 759 } 760 761 return i_ReturnValue; 762} 763 764/* 765+----------------------------------------------------------------------------+ 766| Function Name : int i_APCI2200_Reset(struct comedi_device *dev) | +----------------------------------------------------------------------------+ 767| Task :resets all the registers | 768+----------------------------------------------------------------------------+ 769| Input Parameters : struct comedi_device *dev | 770+----------------------------------------------------------------------------+ 771| Output Parameters : - | 772+----------------------------------------------------------------------------+ 773| Return Value : - | 774+----------------------------------------------------------------------------+ 775*/ 776 777int i_APCI16XX_Reset(struct comedi_device *dev) 778{ 779 return 0; 780} 781