1c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/**
2c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH@verbatim
3c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
4c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbHCopyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
5c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
6356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	ADDI-DATA GmbH
7356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	Dieselstrasse 3
8356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	D-77833 Ottersweier
9356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	Tel: +19(0)7223/9493-0
10356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	Fax: +49(0)7223/9493-92
1125417922694e60f04cd4dc8448ada9236f18c532Justin P. Mattock	http://www.addi-data.com
12356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	info@addi-data.com
13c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
14c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbHThis 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.
15c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
16c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbHThis 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.
17c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
18c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbHYou 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
19c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2039cfb97b0d89a99c8e50782b17e65114b89c2e59Adam BuchbinderYou should also find the complete GPL in the COPYING file accompanying this source code.
21c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
22c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH@endverbatim
23c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
24c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
25c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
26c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
27c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
28c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
29c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
30c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
31c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-------------------------------+---------------------------------------+
32c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Project     : APCI-1516       | Compiler   : GCC                      |
33c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Module name : hwdrv_apci1516.c| Version    : 2.96                     |
34c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-------------------------------+---------------------------------------+
35c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Project manager: Eric Stolz   | Date       :  02/12/2002              |
36c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-------------------------------+---------------------------------------+
376cd5a9a35c3de4ed28b55212698fe69c328e4206Uwe Kleine-König  | Description :   Hardware Layer Access For APCI-1516                   |
38c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
39c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |                             UPDATES                                   |
40c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +----------+-----------+------------------------------------------------+
41c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |   Date   |   Author  |          Description of updates                |
42c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +----------+-----------+------------------------------------------------+
43c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |          |           |                                                |
44c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |          |           |                                                |
45c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |          |           |                                                |
46c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +----------+-----------+------------------------------------------------+
47c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
48c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
49c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
50c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
51c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                               Included files                               |
52c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
53c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
54c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH#include "hwdrv_apci1516.h"
55c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
56c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
57c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
58c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function   Name   : int i_APCI1516_Read1DigitalInput                       |
5934c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|			  (struct comedi_device *dev,struct comedi_subdevice *s,               |
6090035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                      struct comedi_insn *insn,unsigned int *data)                     |
61c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
62c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Return the status of the digital input                 |
63c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
6471b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev      : Driver handle                |
6534c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|		       struct comedi_subdevice *s,   :pointer to subdevice structure
66356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                       struct comedi_insn *insn      :pointer to insn structure     |
67790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data          : Data Pointer to read status  |
68c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
69c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
70c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
71c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : TRUE  : No error occur                                 |
72c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|		            : FALSE : Error occur. Return the error          |
73c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
74c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
75c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
76da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_Read1DigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
77da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
78c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
79117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_TmpValue = 0;
80117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Channel;
81c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_Channel = CR_CHAN(insn->chanspec);
82dc8af06898c4326cee1739e2bc100bed2b601721Roel Kluin	if (ui_Channel <= 7) {
83117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton		ui_TmpValue = (unsigned int) inw(devpriv->iobase + APCI1516_DIGITAL_IP);
842696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*   since only 1 channel reqd  to bring it to last bit it is rotated */
852696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/*   8 +(chan - 1) times then ANDed with 1 for last bit. */
86c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		*data = (ui_TmpValue >> ui_Channel) & 0x1;
872696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* if(ui_Channel >= 0 && ui_Channel <=7) */
88c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	else {
892696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/* comedi_error(dev," \n chan spec wrong\n"); */
902696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		return -EINVAL;	/*  "sorry channel spec wrong " */
912696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* else if(ui_Channel >= 0 && ui_Channel <=7) */
92c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
93c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
94c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
95c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
96c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
97c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
98c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function   Name   : int i_APCI1516_ReadMoreDigitalInput                    |
9934c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|			  (struct comedi_device *dev,struct comedi_subdevice *s,               |
10090035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn,unsigned int *data)                      |
101c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
102c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Return the status of the Requested digital inputs      |
103c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
10471b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev      : Driver handle                |
10534c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                      struct comedi_subdevice *s,   :pointer to subdevice structure
106356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                       struct comedi_insn *insn      :pointer to insn structure     |
107790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                      unsigned int *data         : Data Pointer to read status  |
108c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
109c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
110c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
111c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : TRUE  : No error occur                                 |
112c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|		            : FALSE : Error occur. Return the error          |
113c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
114c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
115c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
116c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
117da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_ReadMoreDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
118da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
119c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
120c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
121117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_PortValue = data[0];
122117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Mask = 0;
123117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_NoOfChannels;
124c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
125c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_NoOfChannels = CR_CHAN(insn->chanspec);
126c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
127117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	*data = (unsigned int) inw(devpriv->iobase + APCI1516_DIGITAL_IP);
128c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	switch (ui_NoOfChannels) {
129c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 2:
130c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Mask = 3;
131c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		*data = (*data >> (2 * ui_PortValue)) & ui_Mask;
132c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
133c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 4:
134c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Mask = 15;
135c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		*data = (*data >> (4 * ui_PortValue)) & ui_Mask;
136c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
137c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 7:
138c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
139c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
140c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	default:
141c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\nWrong parameters\n");
1422696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		return -EINVAL;	/*  "sorry channel spec wrong " */
143c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
1442696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* switch(ui_NoOfChannels) */
145c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
146c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
147c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
148c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
149c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
150c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
15171b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function   Name   : int i_APCI1516_ConfigDigitalOutput (struct comedi_device *dev,
152356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                    struct comedi_subdevice *s struct comedi_insn *insn,unsigned int *data)    |
153c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|				                                                     |
154c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
155c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Configures The Digital Output Subdevice.               |
156c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
15771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev : Driver handle                     |
158790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data         : Data Pointer contains         |
159c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                          configuration parameters as below |
16034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                      struct comedi_subdevice *s,   :pointer to subdevice structure
161356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                      struct comedi_insn *insn      :pointer to insn structure                                                           |
162c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|					  data[0]  :1:Memory on                          |
163c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|					            0:Memory off                         |
164c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|										                             |
165c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|																	 |
166c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
167c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
168c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
169c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : TRUE  : No error occur                                 |
170c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|		            : FALSE : Error occur. Return the error          |
171c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
172c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
173c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
174da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_ConfigDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
175da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
176c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
177c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_OutputMemoryStatus = data[0];
178c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
179c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
180c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
181c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
182c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
183c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function   Name   : int i_APCI1516_WriteDigitalOutput                      |
18490035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|			(struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
185356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                     unsigned int *data)                                         |
186c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
187c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Writes port value  To the selected port                |
188c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
18971b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev      : Driver handle                |
19034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s,   :pointer to subdevice structure
191356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                     struct comedi_insn *insn      :pointer to insn structure      |
192790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                    unsigned int *data           : Data Pointer to read status  |
193c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
194c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
195c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
196c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : TRUE  : No error occur                                 |
197c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|		            : FALSE : Error occur. Return the error          |
198c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
199c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
200c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
201c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
202da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_WriteDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
203da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
204c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
205117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Temp, ui_Temp1;
2062696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	unsigned int ui_NoOfChannel = CR_CHAN(insn->chanspec);	/*  get the channel */
207c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
208c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	printk("EL311003 : @=%x\n", devpriv->iobase + APCI1516_DIGITAL_OP);
209c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
210c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (devpriv->b_OutputMemoryStatus) {
211c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Temp = inw(devpriv->iobase + APCI1516_DIGITAL_OP);
212c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2132696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* if(devpriv->b_OutputMemoryStatus ) */
214c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	else {
215c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Temp = 0;
2162696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* if(devpriv->b_OutputMemoryStatus ) */
217c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (data[3] == 0) {
218c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (data[1] == 0) {
219c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			data[0] = (data[0] << ui_NoOfChannel) | ui_Temp;
220c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(data[0], devpriv->iobase + APCI1516_DIGITAL_OP);
221c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
222c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			printk("EL311003 : d=%d @=%x\n", data[0],
223c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI1516_DIGITAL_OP);
224c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2252696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		}		/* if(data[1]==0) */
226c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		else {
227c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (data[1] == 1) {
228c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				switch (ui_NoOfChannel) {
229c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
230c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				case 2:
231c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					data[0] =
232c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						(data[0] << (2 *
233c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							data[2])) | ui_Temp;
234c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					break;
235c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
236c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				case 4:
237c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					data[0] =
238c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						(data[0] << (4 *
239c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							data[2])) | ui_Temp;
240c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					break;
241c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
242c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				case 7:
243c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					data[0] = data[0] | ui_Temp;
244c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					break;
245c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
246c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				default:
247c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					comedi_error(dev, " chan spec wrong");
2482696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton					return -EINVAL;	/*  "sorry channel spec wrong " */
249c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2502696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton				}	/* switch(ui_NoOfChannels) */
251c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
252c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				outw(data[0],
253c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->iobase + APCI1516_DIGITAL_OP);
254c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
255c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				printk("EL311003 : d=%d @=%x\n", data[0],
256c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->iobase + APCI1516_DIGITAL_OP);
2572696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton			}	/*  if(data[1]==1) */
258c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			else {
259c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				printk("\nSpecified channel not supported\n");
2602696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton			}	/* else if(data[1]==1) */
2612696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		}		/* elseif(data[1]==0) */
2622696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* if(data[3]==0) */
263c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	else {
264c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (data[3] == 1) {
265c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (data[1] == 0) {
266c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				data[0] = ~data[0] & 0x1;
267c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				ui_Temp1 = 1;
268c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				ui_Temp1 = ui_Temp1 << ui_NoOfChannel;
269c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				ui_Temp = ui_Temp | ui_Temp1;
270c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				data[0] = (data[0] << ui_NoOfChannel) ^ 0xff;
271c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				data[0] = data[0] & ui_Temp;
272c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				outw(data[0],
273c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->iobase + APCI1516_DIGITAL_OP);
274c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
275c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				printk("EL311003 : d=%d @=%x\n", data[0],
276c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->iobase + APCI1516_DIGITAL_OP);
277c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2782696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton			}	/* if(data[1]==0) */
279c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			else {
280c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				if (data[1] == 1) {
281c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					switch (ui_NoOfChannel) {
282c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
283c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					case 2:
284c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						data[0] = ~data[0] & 0x3;
285c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						ui_Temp1 = 3;
286c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						ui_Temp1 =
287c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							ui_Temp1 << 2 * data[2];
288c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						ui_Temp = ui_Temp | ui_Temp1;
289c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						data[0] =
290c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							((data[0] << (2 *
291c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH									data
292c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH									[2])) ^
293c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							0xff) & ui_Temp;
294c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						break;
295c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
296c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					case 4:
297c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						data[0] = ~data[0] & 0xf;
298c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						ui_Temp1 = 15;
299c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						ui_Temp1 =
300c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							ui_Temp1 << 4 * data[2];
301c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						ui_Temp = ui_Temp | ui_Temp1;
302c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						data[0] =
303c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							((data[0] << (4 *
304c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH									data
305c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH									[2])) ^
306c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							0xff) & ui_Temp;
307c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						break;
308c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
309c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					case 7:
310c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						break;
311c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
312c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					default:
313c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						comedi_error(dev,
314c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH							" chan spec wrong");
3152696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton						return -EINVAL;	/*  "sorry channel spec wrong " */
316c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3172696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton					}	/* switch(ui_NoOfChannels) */
318c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
319c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					outw(data[0],
320c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						devpriv->iobase +
321c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						APCI1516_DIGITAL_OP);
322c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
323c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					printk("EL311003 : d=%d @=%x\n",
324c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						data[0],
325c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						devpriv->iobase +
326c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						APCI1516_DIGITAL_OP);
3272696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton				}	/*  if(data[1]==1) */
328c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				else {
329c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					printk("\nSpecified channel not supported\n");
3302696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton				}	/* else if(data[1]==1) */
3312696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton			}	/* elseif(data[1]==0) */
3322696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		}		/* if(data[3]==1); */
333c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		else {
334c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			printk("\nSpecified functionality does not exist\n");
335c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			return -EINVAL;
3362696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		}		/* if else data[3]==1) */
3372696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* if else data[3]==0) */
338859171ca92f2865453b4b2e17bf679c67044a833Joe Perches	return (insn->n);
339c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
340c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
341c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
342c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
343c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function   Name   : int i_APCI1516_ReadDigitalOutput                       |
34490035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|			(struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
345356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                    unsigned int *data) 	                                     |
346c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
347c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Read  value  of the selected channel or port           |
348c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
34971b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev      : Driver handle                |
35034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s,   :pointer to subdevice structure
351356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                     struct comedi_insn *insn      :pointer to insn structure      |
352790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data          : Data Pointer to read status  |
353c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
354c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
355c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
356c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : TRUE  : No error occur                                 |
357c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|		            : FALSE : Error occur. Return the error          |
358c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
359c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
360c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
361c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
362da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_ReadDigitalOutput(struct comedi_device *dev, struct comedi_subdevice *s,
363da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
364c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
365c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
366117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Temp;
3672696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	unsigned int ui_NoOfChannel = CR_CHAN(insn->chanspec);	/*  get the channel */
368c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_Temp = data[0];
369c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	*data = inw(devpriv->iobase + APCI1516_DIGITAL_OP_RW);
370c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (ui_Temp == 0) {
371c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		*data = (*data >> ui_NoOfChannel) & 0x1;
3722696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* if(ui_Temp==0) */
373c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	else {
374c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (ui_Temp == 1) {
375c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			switch (ui_NoOfChannel) {
376c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
377c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			case 2:
378c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				*data = (*data >> (2 * data[1])) & 3;
379c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				break;
380c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
381c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			case 4:
382c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				*data = (*data >> (4 * data[1])) & 15;
383c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				break;
384c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
385c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			case 7:
386c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				break;
387c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
388c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			default:
389c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				comedi_error(dev, " chan spec wrong");
3902696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton				return -EINVAL;	/*  "sorry channel spec wrong " */
391c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3922696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton			}	/* switch(ui_NoOfChannels) */
3932696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		}		/* if(ui_Temp==1) */
394c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		else {
395c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			printk("\nSpecified channel not supported \n");
3962696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		}		/* elseif(ui_Temp==1) */
3972696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* elseif(ui_Temp==0) */
398c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
399c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
400c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
401c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
402c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
40371b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function   Name   : int i_APCI1516_ConfigWatchdog(struct comedi_device *dev,
404356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                      struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)  |
405c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|				                                                     |
406c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
407c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Configures The Watchdog                                |
408c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
40971b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  :   struct comedi_device *dev      : Driver handle              |
41034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s,   :pointer to subdevice structure
411356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                      struct comedi_insn *insn      :pointer to insn structure      |
412790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data          : Data Pointer to read status                                                     |
413c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
414c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
415c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
416c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : TRUE  : No error occur                                 |
417c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|		            : FALSE : Error occur. Return the error          |
418c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
419c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
420c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
421c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
422da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_ConfigWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
423da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
424c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
425c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (data[0] == 0) {
4262696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/* Disable the watchdog */
427c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(0x0,
428c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon +
429c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI1516_WATCHDOG_ENABLEDISABLE);
4302696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		/* Loading the Reload value */
431c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(data[1],
432c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon +
433c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI1516_WATCHDOG_RELOAD_VALUE);
434c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[1] = data[1] >> 16;
435c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(data[1],
436c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon +
437c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI1516_WATCHDOG_RELOAD_VALUE + 2);
4382696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* if(data[0]==0) */
439c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	else {
440c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\nThe input parameters are wrong\n");
441c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
4422696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/* elseif(data[0]==0) */
443c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
444c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
445c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
446c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
447c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH /*
448c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    +----------------------------------------------------------------------------+
449c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    | Function   Name   : int i_APCI1516_StartStopWriteWatchdog                  |
45034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton    |                           (struct comedi_device *dev,struct comedi_subdevice *s,
45190035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton    struct comedi_insn *insn,unsigned int *data);                      |
452c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    +----------------------------------------------------------------------------+
453c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    | Task              : Start / Stop The Watchdog                              |
454c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    +----------------------------------------------------------------------------+
45571b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton    | Input Parameters  : struct comedi_device *dev      : Driver handle                |
45634c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton    |                     struct comedi_subdevice *s,   :pointer to subdevice structure
45790035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton    struct comedi_insn *insn      :pointer to insn structure      |
458790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton    |                     unsigned int *data          : Data Pointer to read status  |
459c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    +----------------------------------------------------------------------------+
460c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    | Output Parameters :       --                                                                                                       |
461c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    +----------------------------------------------------------------------------+
462c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    | Return Value      : TRUE  : No error occur                                 |
463c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    |                       : FALSE : Error occur. Return the error          |
464c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    |                                                                            |
465c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH    +----------------------------------------------------------------------------+
466c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  */
467c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
468da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_StartStopWriteWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
469da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
470c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
471c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	switch (data[0]) {
4722696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	case 0:		/* stop the watchdog */
4732696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton		outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_ENABLEDISABLE);	/* disable the watchdog */
474c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
4752696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	case 1:		/* start the watchdog */
476c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(0x0001,
477c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon +
478c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI1516_WATCHDOG_ENABLEDISABLE);
479c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
4802696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	case 2:		/* Software trigger */
481c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(0x0201,
482c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon +
483c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI1516_WATCHDOG_ENABLEDISABLE);
484c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
485c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	default:
486c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\nSpecified functionality does not exist\n");
487c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
4882696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	}			/*  switch(data[0]) */
489c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
490c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
491c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
492c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
493c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
494c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function   Name   : int i_APCI1516_ReadWatchdog                            |
49590035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|			(struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
496790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton                    unsigned int *data); 	                                     |
497c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
498c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Read The Watchdog                                      |
499c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
50071b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  :   struct comedi_device *dev      : Driver handle              |
50134c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s,   :pointer to subdevice structure
50290035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton                      struct comedi_insn *insn      :pointer to insn structure      |
503790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data          : Data Pointer to read status  |
504c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
505c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
506c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
507c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : TRUE  : No error occur                                 |
508c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|		            : FALSE : Error occur. Return the error          |
509c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
510c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
511c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
512c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
513da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_ReadWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
514da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
515c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
516c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	data[0] = inw(devpriv->i_IobaseAddon + APCI1516_WATCHDOG_STATUS) & 0x1;
517c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
518c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
519c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
520c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
521c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
52271b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function   Name   : int i_APCI1516_Reset(struct comedi_device *dev)               |                                                                                                          |
523c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
524c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              :resets all the registers                                |
525c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
52671b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev
527c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
528c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Output Parameters :	--													 |
529c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
530c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :                                                        |
531c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			                                                         |
532c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
533c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
534c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
535da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI1516_Reset(struct comedi_device *dev)
536c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
5372696fb57e6af653dd8b4df41b16754579f42fc78Bill Pemberton	outw(0x0, devpriv->iobase + APCI1516_DIGITAL_OP);	/* RESETS THE DIGITAL OUTPUTS */
538c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_ENABLEDISABLE);
539c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_RELOAD_VALUE);
540c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(0x0, devpriv->i_IobaseAddon + APCI1516_WATCHDOG_RELOAD_VALUE + 2);
541c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
542c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
543