hwdrv_apci16xx.c revision 790c55415aa31f4c732729f94d2c3a54f7d3bfc2
1/**
2@verbatim
3
4Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
5
6        ADDI-DATA GmbH
7        Dieselstrasse 3
8        D-77833 Ottersweier
9        Tel: +19(0)7223/9493-0
10        Fax: +49(0)7223/9493-92
11        http://www.addi-data-com
12        info@addi-data.com
13
14This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20You shoud also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25
26  +-----------------------------------------------------------------------+
27  | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
28  +-----------------------------------------------------------------------+
29  | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
30  | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
31  +-----------------------------------------------------------------------+
32  | Project     : API 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|                          (comedi_device    *dev,                           |
62|                           comedi_subdevice *s,                             |
63|                           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    = (BYTE) data[0];                        |
73|                     b_Port0Mode   = (BYTE) data[1];                        |
74|                     b_Port1Mode   = (BYTE) data[2];                        |
75|                     b_Port2Mode   = (BYTE) data[3];                        |
76|                     b_Port3Mode   = (BYTE) 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(comedi_device * dev,
94	comedi_subdevice * s, comedi_insn * insn, unsigned int * data)
95{
96	INT i_ReturnValue = insn->n;
97	BYTE b_Command = 0;
98	BYTE b_Cpt = 0;
99	BYTE b_NumberOfPort =
100		(BYTE) (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 = (BYTE) 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				&& ((BYTE) (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				&& ((BYTE) (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|                          (comedi_device    *dev,                           |
255|                           comedi_subdevice *s,                             |
256|                           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	  = (BYTE) data[0];                          |
270|                                                                            |
271|              APCI16XX_TTL_READPORT                                         |
272|                    b_SelectedPort= CR_RANGE(insn->chanspec);               |
273|                    b_ReadType	  = (BYTE) 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(comedi_device * dev,
287	comedi_subdevice * s, comedi_insn * insn, unsigned int * data)
288{
289	INT i_ReturnValue = insn->n;
290	BYTE b_Command = 0;
291	BYTE b_NumberOfPort =
292		(BYTE) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);
293	BYTE b_SelectedPort = CR_RANGE(insn->chanspec);
294	BYTE b_InputChannel = CR_CHAN(insn->chanspec);
295	BYTE *pb_Status;
296	DWORD 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 = (BYTE) 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 = (PBYTE) & 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 = (BYTE) 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|                          (comedi_device    *dev,                           |
415|                           comedi_subdevice *s,                             |
416|                           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(comedi_device * dev,
434	comedi_subdevice * s, comedi_insn * insn, unsigned int * data)
435{
436	BYTE b_Command = (BYTE) CR_AREF(insn->chanspec);
437	INT i_ReturnValue = insn->n;
438	BYTE b_Cpt = 0;
439	BYTE 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			(BYTE) (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|                          (comedi_device    *dev,                           |
540|                           comedi_subdevice *s,                             |
541|                           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      = (BYTE) data[0];                        |
555|                                                                            |
556|              APCI16XX_TTL_WRITEPORT_ON | APCI16XX_TTL_WRITEPORT_OFF        |
557|                    b_SelectedPort = CR_RANGE(insn->chanspec);              |
558|                    b_Command      = (BYTE) 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(comedi_device * dev,
574	comedi_subdevice * s, comedi_insn * insn, unsigned int * data)
575{
576	INT i_ReturnValue = insn->n;
577	BYTE b_Command = 0;
578	BYTE b_NumberOfPort =
579		(BYTE) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);
580	BYTE b_SelectedPort = CR_RANGE(insn->chanspec);
581	BYTE b_OutputChannel = CR_CHAN(insn->chanspec);
582	DWORD 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 = (BYTE) 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(comedi_device *dev)               |                                                         +----------------------------------------------------------------------------+
767| Task              :resets all the registers                                |
768+----------------------------------------------------------------------------+
769| Input Parameters  : comedi_device *dev                                     |
770+----------------------------------------------------------------------------+
771| Output Parameters : -                                                      |
772+----------------------------------------------------------------------------+
773| Return Value      : -                                                      |
774+----------------------------------------------------------------------------+
775*/
776
777int i_APCI16XX_Reset(comedi_device * dev)
778{
779	return 0;
780}
781