PageRenderTime 72ms CodeModel.GetById 32ms app.highlight 20ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/staging/comedi/drivers/addi-data/APCI1710_Ttl.c

https://bitbucket.org/cyanogenmod/android_kernel_asus_tf300t
C | 1038 lines | 495 code | 121 blank | 422 comment | 119 complexity | 5b563b21044bb610b3e985c0c223daa2 MD5 | raw file
Possible License(s): LGPL-2.0, AGPL-1.0, GPL-2.0
   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}