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  | (C) ADDI-DATA GmbH          Dieselstrasse 3      D-77833 Ottersweier  |
27c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
28c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
29c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
30c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
31c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Project     : APCI-3120       | Compiler   : GCC                      |
32c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Module name : hwdrv_apci3120.c| Version    : 2.96                     |
33c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-------------------------------+---------------------------------------+
34c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Project manager: Eric Stolz   | Date       :  02/12/2002              |
35c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
36c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  | Description :APCI3120 Module.  Hardware abstraction Layer for APCI3120|
37c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
38c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |                             UPDATE'S                                  |
39c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +-----------------------------------------------------------------------+
40c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |   Date   |   Author  |          Description of updates                |
41c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +----------+-----------+------------------------------------------------+
42c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |          | 		 | 						  |
43c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  |          |           |						  |
44c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH  +----------+-----------+------------------------------------------------+
45c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
46c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
47c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH#include "hwdrv_apci3120.h"
48dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelministatic unsigned int ui_Temp;
49c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
501efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/* FUNCTION DEFINITIONS */
51c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
52c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
53c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
54c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                           ANALOG INPUT SUBDEVICE   		                 |
55c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
56c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
57c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
58c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
59c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
6071b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnConfigAnalogInput(struct comedi_device *dev,|
6190035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|  struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)					 |
62c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
63c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
64c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Calls card specific function  					     |
65c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
66c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
6771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
6834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
6990035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
70790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data      					         		 |
71c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
72c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
73c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
74c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
75c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
76c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
77da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnConfigAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
78da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
79c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
80117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int i;
81c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
82c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((data[0] != APCI3120_EOC_MODE) && (data[0] != APCI3120_EOS_MODE))
83c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -1;
84c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
851efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Check for Conversion time to be added ?? */
86c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_EocEosConversionTime = data[2];
87c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
88c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (data[0] == APCI3120_EOS_MODE) {
89c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
901efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Test the number of the channel */
91c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		for (i = 0; i < data[3]; i++) {
92c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
9357517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott			if (CR_CHAN(data[4 + i]) >=
9457517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott				devpriv->s_EeParameters.i_NbrAiChannel) {
95c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				printk("bad channel list\n");
96c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				return -2;
97c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
98c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
99c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
100c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_InterruptMode = APCI3120_EOS_MODE;
101c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
102dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		if (data[1])
103c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_EocEosInterrupt = APCI3120_ENABLE;
104dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		else
105c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_EocEosInterrupt = APCI3120_DISABLE;
1061efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  Copy channel list and Range List to devpriv */
107c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
108c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_AiNbrofChannels = data[3];
109dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		for (i = 0; i < devpriv->ui_AiNbrofChannels; i++)
110c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->ui_AiChannelList[i] = data[4 + i];
111c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
112dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	} else {			/*  EOC */
113c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_InterruptMode = APCI3120_EOC_MODE;
114dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		if (data[1])
115c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_EocEosInterrupt = APCI3120_ENABLE;
116dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		else
117c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_EocEosInterrupt = APCI3120_DISABLE;
118c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
119c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
120c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
121c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
122c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
123c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
124c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
12571b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnReadAnalogInput(struct comedi_device *dev,  |
12690035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|			struct comedi_subdevice *s,struct comedi_insn *insn, unsigned int *data)	 |
127c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
128c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
129c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              :  card specific function								 |
130c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|				Reads analog input in synchronous mode               |
131c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  EOC and EOS is selected as per configured              |
132c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     if no conversion time is set uses default conversion   |
133c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  time 10 microsec.					      				 |
134c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
135c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
13671b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
13734c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
13890035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
139790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data     									 |
140c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
141c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
142c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
143c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
144c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
145c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
146da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnReadAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
147da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
148c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
149a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short us_ConvertTiming, us_TmpValue, i;
1501783fbfe023b7c2b912fbb020e01ff46985aa0abBill Pemberton	unsigned char b_Tmp;
151c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi	/*  fix conversion time to 10 us */
153c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!devpriv->ui_EocEosConversionTime) {
154c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("No timer0 Value using 10 us\n");
155c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_ConvertTiming = 10;
156c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else
1571efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		us_ConvertTiming = (unsigned short) (devpriv->ui_EocEosConversionTime / 1000);	/*  nano to useconds */
158c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1591efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  this_board->i_hwdrv_InsnReadAnalogInput(dev,us_ConvertTiming,insn->n,&insn->chanspec,data,insn->unused[0]); */
160c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1611efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Clear software registers */
162c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_TimerSelectMode = 0;
163c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_ModeSelectRegister = 0;
164c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister = 0;
1651efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/* devpriv->b_DigitalOutputRegister=0; */
166c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
167dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (insn->unused[0] == 222) {	/*  second insn read */
168dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		for (i = 0; i < insn->n; i++)
169c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			data[i] = devpriv->ui_AiReadData[i];
170c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else {
1711efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		devpriv->tsk_Current = current;	/*  Save the current process task structure */
1721efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
1731efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * Testing if board have the new Quartz and calculate the time value
1741efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * to set in the timer
1751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
176c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
177c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_TmpValue =
178a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton			(unsigned short) inw(devpriv->iobase + APCI3120_RD_STATUS);
179c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1801efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* EL250804: Testing if board APCI3120 have the new Quartz or if it is an APCI3001 */
181c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if ((us_TmpValue & 0x00B0) == 0x00B0
182c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			|| !strcmp(this_board->pc_DriverName, "apci3001")) {
183c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			us_ConvertTiming = (us_ConvertTiming * 2) - 2;
184c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
185c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			us_ConvertTiming =
186c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				((us_ConvertTiming * 12926) / 10000) - 1;
187c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
188c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
189a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton		us_TmpValue = (unsigned short) devpriv->b_InterruptMode;
190c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
191c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		switch (us_TmpValue) {
192c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
193c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		case APCI3120_EOC_MODE:
194c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1951efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
1961efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * Testing the interrupt flag and set the EOC bit Clears the FIFO
1971efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
198c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			inw(devpriv->iobase + APCI3120_RESET_FIFO);
199c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2001efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  Initialize the sequence array */
201c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2021efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* if (!i_APCI3120_SetupChannelList(dev,s,1,chanlist,0))  return -EINVAL; */
203c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
204c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (!i_APCI3120_SetupChannelList(dev, s, 1,
205c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					&insn->chanspec, 0))
206c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				return -EINVAL;
207c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2081efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Initialize Timer 0 mode 4 */
209c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_TimerSelectMode =
210c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				(devpriv->
211c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_TimerSelectMode & 0xFC) |
212c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_TIMER_0_MODE_4;
213c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_TimerSelectMode,
214c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_TIMER_CRT1);
215c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2161efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  Reset the scan bit and Disables the  EOS, DMA, EOC interrupt */
217c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
218c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
219c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister & APCI3120_DISABLE_SCAN;
220c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
221c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (devpriv->b_EocEosInterrupt == APCI3120_ENABLE) {
222c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2231efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton				/* Disables the EOS,DMA and enables the EOC interrupt */
224c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_ModeSelectRegister =
225c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					(devpriv->
226c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_ModeSelectRegister &
227c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_DISABLE_EOS_INT) |
228c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_ENABLE_EOC_INT;
229c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				inw(devpriv->iobase);
230c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
231c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			} else {
232c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_ModeSelectRegister =
233c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->
234c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_ModeSelectRegister &
235c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_DISABLE_ALL_INTERRUPT_WITHOUT_TIMER;
236c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
237c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
238c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
239c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WRITE_MODE_SELECT);
240c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2411efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  Sets gate 0 */
242c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister =
243c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				(devpriv->
244c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_OutputRegister & APCI3120_CLEAR_PA_PR) |
245c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_TIMER0;
246c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(devpriv->us_OutputRegister,
247c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WR_ADDRESS);
248c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2491efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  Select Timer 0 */
250c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_Tmp = ((devpriv->
251c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_DigitalOutputRegister) & 0xF0) |
252c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_SELECT_TIMER_0_WORD;
253c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
254c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
25525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi			/* Set the conversion time */
256c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(us_ConvertTiming,
257c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_TIMER_VALUE);
258c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
259c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			us_TmpValue =
260a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton				(unsigned short) inw(dev->iobase + APCI3120_RD_STATUS);
261c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
262c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (devpriv->b_EocEosInterrupt == APCI3120_DISABLE) {
263c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
264c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				do {
2651efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton					/*  Waiting for the end of conversion */
266c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					us_TmpValue =
267c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						inw(devpriv->iobase +
268c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						APCI3120_RD_STATUS);
269c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				} while ((us_TmpValue & APCI3120_EOC) ==
270c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_EOC);
271c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2721efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton				/* Read the result in FIFO  and put it in insn data pointer */
273c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_TmpValue = inw(devpriv->iobase + 0);
274c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				*data = us_TmpValue;
275c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
276c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				inw(devpriv->iobase + APCI3120_RESET_FIFO);
277c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
278c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
279c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			break;
280c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
281c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		case APCI3120_EOS_MODE:
282c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
283c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			inw(devpriv->iobase);
2841efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  Clears the FIFO */
285c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			inw(devpriv->iobase + APCI3120_RESET_FIFO);
2861efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  clear PA PR  and disable timer 0 */
287c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
288c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister =
289c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				(devpriv->
290c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_OutputRegister & APCI3120_CLEAR_PA_PR) |
291c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_TIMER0;
292c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
293c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(devpriv->us_OutputRegister,
294c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WR_ADDRESS);
295c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
296c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (!i_APCI3120_SetupChannelList(dev, s,
297c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->ui_AiNbrofChannels,
298c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->ui_AiChannelList, 0))
299c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				return -EINVAL;
300c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3011efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Initialize Timer 0 mode 2 */
302c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_TimerSelectMode =
303c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				(devpriv->
304c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_TimerSelectMode & 0xFC) |
305c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_TIMER_0_MODE_2;
306c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_TimerSelectMode,
307c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_TIMER_CRT1);
308c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3091efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Select Timer 0 */
310c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_Tmp = ((devpriv->
311c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_DigitalOutputRegister) & 0xF0) |
312c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_SELECT_TIMER_0_WORD;
313c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
314c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
31525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi			/* Set the conversion time */
316c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(us_ConvertTiming,
317c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_TIMER_VALUE);
318c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3191efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Set the scan bit */
320c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
321c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
322c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister | APCI3120_ENABLE_SCAN;
323c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
324c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WRITE_MODE_SELECT);
325c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3261efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* If Interrupt function is loaded */
327c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (devpriv->b_EocEosInterrupt == APCI3120_ENABLE) {
3281efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton				/* Disables the EOC,DMA and enables the EOS interrupt */
329c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_ModeSelectRegister =
330c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					(devpriv->
331c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_ModeSelectRegister &
332c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_DISABLE_EOC_INT) |
333c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_ENABLE_EOS_INT;
334c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				inw(devpriv->iobase);
335c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
336c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			} else
337c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_ModeSelectRegister =
338c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->
339c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_ModeSelectRegister &
340c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_DISABLE_ALL_INTERRUPT_WITHOUT_TIMER;
341c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
342c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
343c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WRITE_MODE_SELECT);
344c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
345c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			inw(devpriv->iobase + APCI3120_RD_STATUS);
346c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3471efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Sets gate 0 */
348c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
349c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister =
350c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
351c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_OutputRegister | APCI3120_ENABLE_TIMER0;
352c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(devpriv->us_OutputRegister,
353c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WR_ADDRESS);
354c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3551efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Start conversion */
356c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(0, devpriv->iobase + APCI3120_START_CONVERSION);
357c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
35825985edcedea6396277003854657b5f3cb31a628Lucas De Marchi			/* Waiting of end of conversion if interrupt is not installed */
359c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (devpriv->b_EocEosInterrupt == APCI3120_DISABLE) {
36025985edcedea6396277003854657b5f3cb31a628Lucas De Marchi				/* Waiting the end of conversion */
361c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				do {
362c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					us_TmpValue =
363c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						inw(devpriv->iobase +
364c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH						APCI3120_RD_STATUS);
365ff89514f8d46f470ffafeda129138ce73efd4c60Bill Pemberton				} while ((us_TmpValue & APCI3120_EOS) !=
366ff89514f8d46f470ffafeda129138ce73efd4c60Bill Pemberton					 APCI3120_EOS);
367c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
368c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				for (i = 0; i < devpriv->ui_AiNbrofChannels;
369c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					i++) {
3701efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton					/* Read the result in FIFO and write them in shared memory */
371c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					us_TmpValue = inw(devpriv->iobase);
372117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton					data[i] = (unsigned int) us_TmpValue;
373c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				}
374c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
3751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton				devpriv->b_InterruptMode = APCI3120_EOC_MODE;	/*  Restore defaults. */
376c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
377c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			break;
378c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
379c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		default:
380c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			printk("inputs wrong\n");
381c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
382c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
3831efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		devpriv->ui_EocEosConversionTime = 0;	/*  re initializing the variable; */
384c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
385c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
386c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
387c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
388c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
389c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
390c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
391c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
39271b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_StopCyclicAcquisition(struct comedi_device *dev,|
39334c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton| 											     struct comedi_subdevice *s)|
394c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
395c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
396c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Stops Cyclic acquisition  						     |
397c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
398c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
39971b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
40034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
401c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
402c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
403c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :0              					                     |
404c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
405c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
406c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
407c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
408da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_StopCyclicAcquisition(struct comedi_device *dev, struct comedi_subdevice *s)
409c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
4101efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Disable A2P Fifo write and AMWEN signal */
411c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(0, devpriv->i_IobaseAddon + 4);
412c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
4131efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* Disable Bus Master ADD ON */
414c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(APCI3120_ADD_ON_AGCSTS_LOW, devpriv->i_IobaseAddon + 0);
415c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(0, devpriv->i_IobaseAddon + 2);
416c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(APCI3120_ADD_ON_AGCSTS_HIGH, devpriv->i_IobaseAddon + 0);
417c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(0, devpriv->i_IobaseAddon + 2);
418c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
4191efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* Disable BUS Master PCI */
420c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outl(0, devpriv->i_IobaseAmcc + AMCC_OP_REG_MCSR);
421c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
4221efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* outl(inl(devpriv->i_IobaseAmcc+AMCC_OP_REG_INTCSR)&(~AINT_WRITE_COMPL),
4231efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	 * devpriv->i_IobaseAmcc+AMCC_OP_REG_INTCSR);  stop amcc irqs */
4241efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
4251efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* outl(inl(devpriv->i_IobaseAmcc+AMCC_OP_REG_MCSR)&(~EN_A2P_TRANSFERS),
4261efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	 * devpriv->i_IobaseAmcc+AMCC_OP_REG_MCSR);  stop DMA */
427c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
4281efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* Disable ext trigger */
429c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	i_APCI3120_ExttrigDisable(dev);
430c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
431c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister = 0;
4321efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* stop  counters */
433c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(devpriv->
434c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_OutputRegister & APCI3120_DISABLE_TIMER0 &
435c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		APCI3120_DISABLE_TIMER1, dev->iobase + APCI3120_WR_ADDRESS);
436c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
437c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(APCI3120_DISABLE_ALL_TIMER, dev->iobase + APCI3120_WR_ADDRESS);
438c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
4391efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* DISABLE_ALL_INTERRUPT */
440c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outb(APCI3120_DISABLE_ALL_INTERRUPT,
441c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		dev->iobase + APCI3120_WRITE_MODE_SELECT);
4421efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* Flush FIFO */
443c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	inb(dev->iobase + APCI3120_RESET_FIFO);
444c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	inw(dev->iobase + APCI3120_RD_STATUS);
445c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiActualScan = 0;
446c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiActualScanPosition = 0;
447c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	s->async->cur_chan = 0;
448c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiBufferPtr = 0;
449c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_AiContinuous = 0;
450c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_DmaActualBuffer = 0;
451c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
452c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_AiCyclicAcquisition = APCI3120_DISABLE;
453c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_InterruptMode = APCI3120_EOC_MODE;
454c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_EocEosInterrupt = APCI3120_DISABLE;
455c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	i_APCI3120_Reset(dev);
456c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
457c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
458c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
459c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
460c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
46171b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_CommandTestAnalogInput(struct comedi_device *dev|
462ea6d0d4cab4f4f2d6a88f3bce4707fe92696fd3fBill Pemberton|			,struct comedi_subdevice *s,struct comedi_cmd *cmd)					 |
463c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
464c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
465c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Test validity for a command for cyclic anlog input     |
466c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                       acquisition  						     			 |
467c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
468c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
46971b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
47034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
471ea6d0d4cab4f4f2d6a88f3bce4707fe92696fd3fBill Pemberton|                     struct comedi_cmd *cmd              					         |
472c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
473c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :0              					                     |
474c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
475c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
476c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
477c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
478da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_CommandTestAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
479da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_cmd *cmd)
480c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
481c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	int err = 0;
4821efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	int tmp;		/*  divisor1,divisor2; */
483c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
4841efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  step 1: make sure trigger sources are trivially valid */
485c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
486c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	tmp = cmd->start_src;
487c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	cmd->start_src &= TRIG_NOW | TRIG_EXT;
488c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!cmd->start_src || tmp != cmd->start_src)
489c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
490c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
491c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	tmp = cmd->scan_begin_src;
492c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	cmd->scan_begin_src &= TRIG_TIMER | TRIG_FOLLOW;
493c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
494c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
495c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
496c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	tmp = cmd->convert_src;
497c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	cmd->convert_src &= TRIG_TIMER;
498c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!cmd->convert_src || tmp != cmd->convert_src)
499c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
500c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
501c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	tmp = cmd->scan_end_src;
502c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	cmd->scan_end_src &= TRIG_COUNT;
503c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
504c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
505c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
506c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	tmp = cmd->stop_src;
507c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	cmd->stop_src &= TRIG_COUNT | TRIG_NONE;
508c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!cmd->stop_src || tmp != cmd->stop_src)
509c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
510c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
511c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (err)
512c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return 1;
513c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
5141efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* step 2: make sure trigger sources are unique and mutually compatible */
515c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
516dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (cmd->start_src != TRIG_NOW && cmd->start_src != TRIG_EXT)
517c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
518c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
519c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->scan_begin_src != TRIG_TIMER &&
520c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		cmd->scan_begin_src != TRIG_FOLLOW)
521c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
522c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
523c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->convert_src != TRIG_TIMER)
524c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
525c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
526c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->scan_end_src != TRIG_COUNT) {
527c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		cmd->scan_end_src = TRIG_COUNT;
528c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
529c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
530c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
531c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->stop_src != TRIG_NONE && cmd->stop_src != TRIG_COUNT)
532c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
533c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
534c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (err)
535c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return 2;
536c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
5371efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  step 3: make sure arguments are trivially compatible */
538c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
539c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->start_arg != 0) {
540c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		cmd->start_arg = 0;
541c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
542c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
543c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
544dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (cmd->scan_begin_src == TRIG_TIMER) {	/*  Test Delay timing */
54557517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott		if (cmd->scan_begin_arg <
54657517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott				devpriv->s_EeParameters.ui_MinDelaytimeNs) {
54757517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott			cmd->scan_begin_arg =
54857517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott				devpriv->s_EeParameters.ui_MinDelaytimeNs;
549c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			err++;
550c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
551c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
552c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
553dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (cmd->convert_src == TRIG_TIMER) {	/*  Test Acquisition timing */
554c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (cmd->scan_begin_src == TRIG_TIMER) {
555c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if ((cmd->convert_arg)
556c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				&& (cmd->convert_arg <
55757517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott					devpriv->s_EeParameters.
55857517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott						ui_MinAcquisitiontimeNs)) {
55957517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott				cmd->convert_arg = devpriv->s_EeParameters.
56057517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott					ui_MinAcquisitiontimeNs;
561c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				err++;
562c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
563c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
564c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (cmd->convert_arg <
56557517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott				devpriv->s_EeParameters.ui_MinAcquisitiontimeNs
56657517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott				) {
56757517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott				cmd->convert_arg = devpriv->s_EeParameters.
56857517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott					ui_MinAcquisitiontimeNs;
569c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				err++;
570c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
571c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
572c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
573c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
574c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
575c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!cmd->chanlist_len) {
576c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		cmd->chanlist_len = 1;
577c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
578c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
579c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->chanlist_len > this_board->i_AiChannelList) {
580c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		cmd->chanlist_len = this_board->i_AiChannelList;
581c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err++;
582c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
583c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->stop_src == TRIG_COUNT) {
584c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (!cmd->stop_arg) {
585c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			cmd->stop_arg = 1;
586c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			err++;
587c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
5881efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	} else {		/*  TRIG_NONE */
589c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (cmd->stop_arg != 0) {
590c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			cmd->stop_arg = 0;
591c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			err++;
592c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
593c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
594c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
595c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (err)
596c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return 3;
597c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
5981efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  step 4: fix up any arguments */
599c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
600c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->convert_src == TRIG_TIMER) {
601c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
602c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (cmd->scan_begin_src == TRIG_TIMER &&
603c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			cmd->scan_begin_arg <
604c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			cmd->convert_arg * cmd->scan_end_arg) {
605c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			cmd->scan_begin_arg =
606c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				cmd->convert_arg * cmd->scan_end_arg;
607c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			err++;
608c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
609c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
610c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
611c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (err)
612c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return 4;
613c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
614c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
615c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
616c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
617c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
618c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
61971b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     : int i_APCI3120_CommandAnalogInput(struct comedi_device *dev,  |
62034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|												struct comedi_subdevice *s) |
621c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
622c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
623c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Does asynchronous acquisition                          |
624c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     Determines the mode 1 or 2.						     |
625c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
626c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
62771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
62834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
629c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
630c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
631c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
632c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
633c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
634c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
635c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
636da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_CommandAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s)
637c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
638ea6d0d4cab4f4f2d6a88f3bce4707fe92696fd3fBill Pemberton	struct comedi_cmd *cmd = &s->async->cmd;
639c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
6401efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* loading private structure with cmd structure inputs */
641c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiFlags = cmd->flags;
642c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiNbrofChannels = cmd->chanlist_len;
643c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiScanLength = cmd->scan_end_arg;
644c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->pui_AiChannelList = cmd->chanlist;
645c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
6461efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* UPDATE-0.7.57->0.7.68devpriv->AiData=s->async->data; */
647c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->AiData = s->async->prealloc_buf;
6481efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* UPDATE-0.7.57->0.7.68devpriv->ui_AiDataLength=s->async->data_len; */
649c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiDataLength = s->async->prealloc_bufsz;
650c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
651dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (cmd->stop_src == TRIG_COUNT)
652c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_AiNbrofScans = cmd->stop_arg;
653dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	else
654c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_AiNbrofScans = 0;
655c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
6561efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	devpriv->ui_AiTimer0 = 0;	/*  variables changed to timer0,timer1 */
657c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiTimer1 = 0;
658c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((devpriv->ui_AiNbrofScans == 0) || (devpriv->ui_AiNbrofScans == -1))
6591efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		devpriv->b_AiContinuous = 1;	/*  user want neverending analog acquisition */
6601efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  stopped using cancel */
661c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
662c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->start_src == TRIG_EXT)
663c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_ExttrigEnable = APCI3120_ENABLE;
664c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	else
665c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_ExttrigEnable = APCI3120_DISABLE;
666c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
667c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (cmd->scan_begin_src == TRIG_FOLLOW) {
6681efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  mode 1 or 3 */
669c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (cmd->convert_src == TRIG_TIMER) {
6701efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  mode 1 */
671c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
6721efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			devpriv->ui_AiTimer0 = cmd->convert_arg;	/*  timer constant in nano seconds */
6731efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* return this_board->i_hwdrv_CommandAnalogInput(1,dev,s); */
674c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			return i_APCI3120_CyclicAnalogInput(1, dev, s);
675c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
676c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
677c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
678c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((cmd->scan_begin_src == TRIG_TIMER)
679c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		&& (cmd->convert_src == TRIG_TIMER)) {
6801efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  mode 2 */
681c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_AiTimer1 = cmd->scan_begin_arg;
6821efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		devpriv->ui_AiTimer0 = cmd->convert_arg;	/*  variable changed timer2 to timer0 */
6831efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* return this_board->i_hwdrv_CommandAnalogInput(2,dev,s); */
684c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return i_APCI3120_CyclicAnalogInput(2, dev, s);
685c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
686c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return -1;
687c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
688c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
689c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
690c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
691c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function name     :  int i_APCI3120_CyclicAnalogInput(int mode,            |
69234c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|		 	   struct comedi_device * dev,struct comedi_subdevice * s)			 |
693c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
694c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : This is used for analog input cyclic acquisition       |
695c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  Performs the command operations.                       |
696c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  If DMA is configured does DMA initialization           |
697c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  otherwise does the acquisition with EOS interrupt.     |
698c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
699c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
700c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Input Parameters  : 														 |
701c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
702c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
703c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
704c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
705c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
706c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
707c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
708c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
709da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_CyclicAnalogInput(int mode, struct comedi_device *dev,
710da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_subdevice *s)
711c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
7121783fbfe023b7c2b912fbb020e01ff46985aa0abBill Pemberton	unsigned char b_Tmp;
713117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Tmp, ui_DelayTiming = 0, ui_TimerValue1 = 0, dmalen0 =
714c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		0, dmalen1 = 0, ui_TimerValue2 =
715c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		0, ui_TimerValue0, ui_ConvertTiming;
716a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short us_TmpValue;
717c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7181efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
7191efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* devpriv->b_AiCyclicAcquisition=APCI3120_ENABLE; */
7201efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
721c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
722c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/*******************/
723c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Resets the FIFO */
724c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/*******************/
725c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	inb(dev->iobase + APCI3120_RESET_FIFO);
726c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7271efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
7281efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* inw(dev->iobase+APCI3120_RD_STATUS); */
7291efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
730c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
731c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/***************************/
732c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Acquisition initialized */
733c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/***************************/
7341efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
735c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_AiCyclicAcquisition = APCI3120_ENABLE;
7361efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
737c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7381efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  clear software  registers */
739c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_TimerSelectMode = 0;
740c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister = 0;
741c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_ModeSelectRegister = 0;
7421efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* devpriv->b_DigitalOutputRegister=0; */
743c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7441efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* COMMENT JK 07.05.04: Followings calls are in i_APCI3120_StartAnalogInputAcquisition */
745c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7461efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/****************************/
74774b894e56abcb2403894b268100773f4aabe1999Bill Pemberton	/* Clear Timer Write TC int */
7481efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/****************************/
749c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outl(APCI3120_CLEAR_WRITE_TC_INT,
750c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->i_IobaseAmcc + APCI3120_AMCC_OP_REG_INTCSR);
751c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7521efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/************************************/
753c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Clears the timer status register */
7541efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/************************************/
755c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7561efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
7571efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* inw(dev->iobase+APCI3120_TIMER_STATUS_REGISTER); */
7581efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* inb(dev->iobase + APCI3120_TIMER_STATUS_REGISTER); */
7591efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
7601efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
7611efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/**************************/
762c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Disables All Timer     */
763c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Sets PR and PA to 0    */
7641efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/**************************/
765c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister = devpriv->us_OutputRegister &
766c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		APCI3120_DISABLE_TIMER0 &
767c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		APCI3120_DISABLE_TIMER1 & APCI3120_CLEAR_PA_PR;
768c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
769c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(devpriv->us_OutputRegister, dev->iobase + APCI3120_WR_ADDRESS);
770c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7711efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*******************/
772c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Resets the FIFO */
7731efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*******************/
7741efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
775c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	inb(devpriv->iobase + APCI3120_RESET_FIFO);
7761efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
777c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
778c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiActualScan = 0;
779c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiActualScanPosition = 0;
780c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	s->async->cur_chan = 0;
781c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiBufferPtr = 0;
782c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_DmaActualBuffer = 0;
783c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
7841efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  value for timer2  minus -2 has to be done .....dunno y?? */
785c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_TimerValue2 = devpriv->ui_AiNbrofScans - 2;
786c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_ConvertTiming = devpriv->ui_AiTimer0;
787c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
788c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (mode == 2)
789c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_DelayTiming = devpriv->ui_AiTimer1;
790c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
791c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH   /**********************************/
792c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Initializes the sequence array */
793c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH   /**********************************/
794c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!i_APCI3120_SetupChannelList(dev, s, devpriv->ui_AiNbrofChannels,
795c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->pui_AiChannelList, 0))
796c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
797c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
798a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	us_TmpValue = (unsigned short) inw(dev->iobase + APCI3120_RD_STATUS);
799c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*** EL241003 : add this section in comment because floats must not be used
800356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	if((us_TmpValue & 0x00B0)==0x00B0)
801c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	 {
802356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton		f_ConvertValue=(((float)ui_ConvertTiming * 0.002) - 2);
803117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton		ui_TimerValue0=(unsigned int)f_ConvertValue;
804c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (mode==2)
805c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		{
806c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			f_DelayValue     = (((float)ui_DelayTiming * 0.00002) - 2);
807117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton			ui_TimerValue1  =   (unsigned int) f_DelayValue;
808c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
809c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	 }
810356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton	else
811c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	 {
812c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		f_ConvertValue=(((float)ui_ConvertTiming * 0.0012926) - 1);
813117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton		ui_TimerValue0=(unsigned int)f_ConvertValue;
814c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (mode == 2)
815c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		{
816c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		     f_DelayValue     = (((float)ui_DelayTiming * 0.000012926) - 1);
817117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton		     ui_TimerValue1  =   (unsigned int) f_DelayValue;
818c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
819c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
820c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH***********************************************************************************************/
821c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*** EL241003 Begin : add this section to replace floats calculation by integer calculations **/
8221efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* EL250804: Testing if board APCI3120 have the new Quartz or if it is an APCI3001 */
823c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((us_TmpValue & 0x00B0) == 0x00B0
824c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		|| !strcmp(this_board->pc_DriverName, "apci3001")) {
825c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_TimerValue0 = ui_ConvertTiming * 2 - 2000;
826c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_TimerValue0 = ui_TimerValue0 / 1000;
827c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
828c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (mode == 2) {
829c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_DelayTiming = ui_DelayTiming / 1000;
830c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_TimerValue1 = ui_DelayTiming * 2 - 200;
831c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_TimerValue1 = ui_TimerValue1 / 100;
832c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
833c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else {
834c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_ConvertTiming = ui_ConvertTiming / 1000;
835c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_TimerValue0 = ui_ConvertTiming * 12926 - 10000;
836c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_TimerValue0 = ui_TimerValue0 / 10000;
837c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
838c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (mode == 2) {
839c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_DelayTiming = ui_DelayTiming / 1000;
840c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_TimerValue1 = ui_DelayTiming * 12926 - 1;
841c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_TimerValue1 = ui_TimerValue1 / 1000000;
842c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
843c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
844c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*** EL241003 End ******************************************************************************/
845c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
846dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (devpriv->b_ExttrigEnable == APCI3120_ENABLE)
8471efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		i_APCI3120_ExttrigEnable(dev);	/*  activate EXT trigger */
848c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	switch (mode) {
849c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 1:
8501efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  init timer0 in mode 2 */
851c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_TimerSelectMode =
852c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			(devpriv->
853c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_TimerSelectMode & 0xFC) | APCI3120_TIMER_0_MODE_2;
854c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_TimerSelectMode,
855c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_TIMER_CRT1);
856c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
8571efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Select Timer 0 */
858c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
859c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
860c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_0_WORD;
861c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, dev->iobase + APCI3120_TIMER_CRT0);
86225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi		/* Set the conversion time */
863a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton		outw(((unsigned short) ui_TimerValue0),
864c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_TIMER_VALUE);
865c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
866c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
867c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 2:
8681efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  init timer1 in mode 2 */
869c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_TimerSelectMode =
870c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			(devpriv->
871c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_TimerSelectMode & 0xF3) | APCI3120_TIMER_1_MODE_2;
872c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_TimerSelectMode,
873c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_TIMER_CRT1);
874c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
8751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Select Timer 1 */
876c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
877c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
878c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_1_WORD;
879c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, dev->iobase + APCI3120_TIMER_CRT0);
88025985edcedea6396277003854657b5f3cb31a628Lucas De Marchi		/* Set the conversion time */
881a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton		outw(((unsigned short) ui_TimerValue1),
882c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_TIMER_VALUE);
883c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
8841efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  init timer0 in mode 2 */
885c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_TimerSelectMode =
886c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			(devpriv->
887c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_TimerSelectMode & 0xFC) | APCI3120_TIMER_0_MODE_2;
888c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_TimerSelectMode,
889c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_TIMER_CRT1);
890c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
8911efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Select Timer 0 */
892c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
893c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
894c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_0_WORD;
895c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, dev->iobase + APCI3120_TIMER_CRT0);
896c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
89725985edcedea6396277003854657b5f3cb31a628Lucas De Marchi		/* Set the conversion time */
898a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton		outw(((unsigned short) ui_TimerValue0),
899c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_TIMER_VALUE);
900c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
901c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
902c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
9031efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*    ##########common for all modes################# */
904c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
905c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/***********************/
906c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Clears the SCAN bit */
907c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/***********************/
9081efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
9091efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
9101efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* devpriv->b_ModeSelectRegister=devpriv->b_ModeSelectRegister | APCI3120_DISABLE_SCAN; */
9111efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
912c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_ModeSelectRegister = devpriv->b_ModeSelectRegister &
913c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		APCI3120_DISABLE_SCAN;
9141efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
9151efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
916c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outb(devpriv->b_ModeSelectRegister,
917c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		dev->iobase + APCI3120_WRITE_MODE_SELECT);
918c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
9191efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  If DMA is disabled */
920c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (devpriv->us_UseDma == APCI3120_DISABLE) {
9211efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  disable EOC and enable EOS */
922c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_InterruptMode = APCI3120_EOS_MODE;
923c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_EocEosInterrupt = APCI3120_ENABLE;
924c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
925c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_ModeSelectRegister =
926c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			(devpriv->
927c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_ModeSelectRegister & APCI3120_DISABLE_EOC_INT) |
928c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_ENABLE_EOS_INT;
929c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_ModeSelectRegister,
930c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_WRITE_MODE_SELECT);
931c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
932c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (!devpriv->b_AiContinuous) {
9331efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
9341efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * configure Timer2 For counting EOS Reset gate 2 of Timer 2 to
9351efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * disable it (Set Bit D14 to 0)
9361efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
937c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister =
938c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
939c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_OutputRegister & APCI3120_DISABLE_TIMER2;
940c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(devpriv->us_OutputRegister,
941c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WR_ADDRESS);
942c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
9431efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  DISABLE TIMER intERRUPT */
944c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
945c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
946c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister &
947c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_TIMER_INT & 0xEF;
948c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
949c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WRITE_MODE_SELECT);
950c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
9511efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* (1) Init timer 2 in mode 0 and write timer value */
952c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_TimerSelectMode =
953c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				(devpriv->
954c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_TimerSelectMode & 0x0F) |
955c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_TIMER_2_MODE_0;
956c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_TimerSelectMode,
957c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_TIMER_CRT1);
958c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
9591efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Writing LOW unsigned short */
960c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_Tmp = ((devpriv->
961c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_DigitalOutputRegister) & 0xF0) |
962c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_SELECT_TIMER_2_LOW_WORD;
963c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(b_Tmp, dev->iobase + APCI3120_TIMER_CRT0);
964c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(LOWORD(ui_TimerValue2),
965c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_TIMER_VALUE);
966c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
9671efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Writing HIGH unsigned short */
968c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_Tmp = ((devpriv->
969c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_DigitalOutputRegister) & 0xF0) |
970c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_SELECT_TIMER_2_HIGH_WORD;
971c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(b_Tmp, dev->iobase + APCI3120_TIMER_CRT0);
972c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(HIWORD(ui_TimerValue2),
973c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_TIMER_VALUE);
974c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
9751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* (2) Reset FC_TIMER BIT  Clearing timer status register */
976c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			inb(dev->iobase + APCI3120_TIMER_STATUS_REGISTER);
9771efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  enable timer counter and disable watch dog */
978c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
979c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				(devpriv->
980c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister |
981c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_TIMER_COUNTER) &
982c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_WATCHDOG;
9831efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  select EOS clock input for timer 2 */
984c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
985c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
986c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister |
987c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_TIMER2_SELECT_EOS;
9881efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  Enable timer2  interrupt */
989c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
990c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
991c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister |
992c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_TIMER_INT;
993c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
994c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WRITE_MODE_SELECT);
995c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_Timer2Mode = APCI3120_COUNTER;
996c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_Timer2Interrupt = APCI3120_ENABLE;
997c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
998c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else {
9991efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* If DMA Enabled */
10001efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
10011efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
10021efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* inw(dev->iobase+0); reset EOC bit */
10031efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
1004c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_InterruptMode = APCI3120_DMA_MODE;
1005c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10061efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/************************************/
1007c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* Disables the EOC, EOS interrupt  */
10081efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/************************************/
1009c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_ModeSelectRegister = devpriv->b_ModeSelectRegister &
1010c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_DISABLE_EOC_INT & APCI3120_DISABLE_EOS_INT;
1011c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1012c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_ModeSelectRegister,
1013c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_WRITE_MODE_SELECT);
1014c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1015c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		dmalen0 = devpriv->ui_DmaBufferSize[0];
1016c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		dmalen1 = devpriv->ui_DmaBufferSize[1];
1017c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1018c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (!devpriv->b_AiContinuous) {
1019c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10201efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			if (dmalen0 > (devpriv->ui_AiNbrofScans * devpriv->ui_AiScanLength * 2)) {	/*  must we fill full first buffer? */
1021c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dmalen0 =
1022c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->ui_AiNbrofScans *
1023c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->ui_AiScanLength * 2;
10241efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			} else if (dmalen1 > (devpriv->ui_AiNbrofScans * devpriv->ui_AiScanLength * 2 - dmalen0))	/*  and must we fill full second buffer when first is once filled? */
1025c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dmalen1 =
1026c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->ui_AiNbrofScans *
1027c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->ui_AiScanLength * 2 - dmalen0;
1028c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1029c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1030c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (devpriv->ui_AiFlags & TRIG_WAKE_EOS) {
10311efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  don't we want wake up every scan? */
1032c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (dmalen0 > (devpriv->ui_AiScanLength * 2)) {
1033c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dmalen0 = devpriv->ui_AiScanLength * 2;
1034c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				if (devpriv->ui_AiScanLength & 1)
1035c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					dmalen0 += 2;
1036c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
1037c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (dmalen1 > (devpriv->ui_AiScanLength * 2)) {
1038c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dmalen1 = devpriv->ui_AiScanLength * 2;
1039c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				if (devpriv->ui_AiScanLength & 1)
1040c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					dmalen1 -= 2;
1041c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				if (dmalen1 < 4)
1042c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					dmalen1 = 4;
1043c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
10441efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		} else {	/*  isn't output buff smaller that our DMA buff? */
1045dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini			if (dmalen0 > (devpriv->ui_AiDataLength))
1046c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dmalen0 = devpriv->ui_AiDataLength;
1047dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini			if (dmalen1 > (devpriv->ui_AiDataLength))
1048c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dmalen1 = devpriv->ui_AiDataLength;
1049c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1050c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_DmaBufferUsesize[0] = dmalen0;
1051c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_DmaBufferUsesize[1] = dmalen1;
1052c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10531efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Initialize DMA */
1054c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10551efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
10561efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * Set Transfer count enable bit and A2P_fifo reset bit in AGCSTS
10571efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * register 1
10581efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1059c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Tmp = AGCSTS_TC_ENABLE | AGCSTS_RESET_A2P_FIFO;
1060c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl(ui_Tmp, devpriv->i_IobaseAmcc + AMCC_OP_REG_AGCSTS);
1061c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10621efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  changed  since 16 bit interface for add on */
1063c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/*********************/
1064c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* ENABLE BUS MASTER */
1065c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/*********************/
1066c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_AGCSTS_LOW, devpriv->i_IobaseAddon + 0);
1067c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ENABLE_TRANSFER_ADD_ON_LOW,
1068c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1069c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1070c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_AGCSTS_HIGH, devpriv->i_IobaseAddon + 0);
1071c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ENABLE_TRANSFER_ADD_ON_HIGH,
1072c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1073c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10741efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
10751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * TO VERIFIED BEGIN JK 07.05.04: Comparison between WIN32 and Linux
10761efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * driver
10771efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1078c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(0x1000, devpriv->i_IobaseAddon + 2);
10791efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
1080c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10811efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* 2 No change */
1082c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* A2P FIFO MANAGEMENT */
10831efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* A2P fifo reset & transfer control enable */
10841efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
10851efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/***********************/
10861efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* A2P FIFO MANAGEMENT */
10871efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/***********************/
1088c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl(APCI3120_A2P_FIFO_MANAGEMENT, devpriv->i_IobaseAmcc +
1089c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_AMCC_OP_MCSR);
1090c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
10911efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
10921efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * 3
10931efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * beginning address of dma buf The 32 bit address of dma buffer
10941efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * is converted into two 16 bit addresses Can done by using _attach
10951efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * and put into into an array array used may be for differnet pages
10961efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1097c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1098f69b0d6451679f1466381a46ac7ab671a7b5668cUwe Kleine-König		/*  DMA Start Address Low */
1099c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWAR_LOW, devpriv->i_IobaseAddon + 0);
1100c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw((devpriv->ul_DmaBufferHw[0] & 0xFFFF),
1101c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1102c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
11031efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*************************/
1104f69b0d6451679f1466381a46ac7ab671a7b5668cUwe Kleine-König		/* DMA Start Address High */
11051efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*************************/
1106c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWAR_HIGH, devpriv->i_IobaseAddon + 0);
1107c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw((devpriv->ul_DmaBufferHw[0] / 65536),
1108c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1109c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
11101efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
11111efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * 4
111225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * amount of bytes to be transferred set transfer count used ADDON
11131efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * MWTC register commented testing
11141efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * outl(devpriv->ui_DmaBufferUsesize[0],
11151efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * devpriv->i_IobaseAddon+AMCC_OP_REG_AMWTC);
11161efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
11171efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
11181efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/**************************/
1119c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* Nbr of acquisition LOW */
11201efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/**************************/
1121c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWTC_LOW, devpriv->i_IobaseAddon + 0);
1122c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw((devpriv->ui_DmaBufferUsesize[0] & 0xFFFF),
1123c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1124c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
11251efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/***************************/
1126c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* Nbr of acquisition HIGH */
11271efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/***************************/
1128c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWTC_HIGH, devpriv->i_IobaseAddon + 0);
1129c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw((devpriv->ui_DmaBufferUsesize[0] / 65536),
1130c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1131c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
11321efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
11331efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * 5
11341efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * To configure A2P FIFO testing outl(
11351efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * FIFO_ADVANCE_ON_BYTE_2,devpriv->i_IobaseAmcc+AMCC_OP_REG_INTCSR);
11361efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1137c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1138c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/******************/
1139c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* A2P FIFO RESET */
1140c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/******************/
11411efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
11421efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * TO VERIFY BEGIN JK 07.05.04: Comparison between WIN32 and Linux
11431efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * driver
11441efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1145c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl(0x04000000UL, devpriv->i_IobaseAmcc + AMCC_OP_REG_MCSR);
11461efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
11471efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
11481efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
11491efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * 6
11501efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * ENABLE A2P FIFO WRITE AND ENABLE AMWEN AMWEN_ENABLE |
11511efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * A2P_FIFO_WRITE_ENABLE (0x01|0x02)=0x03
11521efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1153c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
11541efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
11551efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* outw(3,devpriv->i_IobaseAddon + 4); */
11561efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
1157c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
11581efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
11591efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * 7
11601efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * initialise end of dma interrupt AINT_WRITE_COMPL =
11611efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * ENABLE_WRITE_TC_INT(ADDI)
11621efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1163c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/***************************************************/
116474b894e56abcb2403894b268100773f4aabe1999Bill Pemberton		/* A2P FIFO CONFIGURATE, END OF DMA intERRUPT INIT */
1165c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/***************************************************/
1166c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl((APCI3120_FIFO_ADVANCE_ON_BYTE_2 |
1167c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_WRITE_TC_INT),
1168c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAmcc + AMCC_OP_REG_INTCSR);
1169c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
11701efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
1171c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/******************************************/
1172c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* ENABLE A2P FIFO WRITE AND ENABLE AMWEN */
1173c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/******************************************/
1174c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(3, devpriv->i_IobaseAddon + 4);
11751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
1176c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1177c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/******************/
1178c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* A2P FIFO RESET */
1179c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/******************/
11801efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* BEGIN JK 07.05.04: Comparison between WIN32 and Linux driver */
1181c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl(0x04000000UL,
1182c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAmcc + APCI3120_AMCC_OP_MCSR);
11831efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* END JK 07.05.04: Comparison between WIN32 and Linux driver */
1184c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1185c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1186c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((devpriv->us_UseDma == APCI3120_DISABLE)
1187c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		&& !devpriv->b_AiContinuous) {
11881efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  set gate 2   to start conversion */
1189c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->us_OutputRegister =
1190c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister | APCI3120_ENABLE_TIMER2;
1191c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(devpriv->us_OutputRegister,
1192c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_WR_ADDRESS);
1193c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1194c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1195c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	switch (mode) {
1196c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 1:
11971efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  set gate 0   to start conversion */
1198c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->us_OutputRegister =
1199c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister | APCI3120_ENABLE_TIMER0;
1200c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(devpriv->us_OutputRegister,
1201c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_WR_ADDRESS);
1202c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
1203c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 2:
12041efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  set  gate 0 and gate 1 */
1205c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->us_OutputRegister =
1206c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister | APCI3120_ENABLE_TIMER1;
1207c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->us_OutputRegister =
1208c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister | APCI3120_ENABLE_TIMER0;
1209c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(devpriv->us_OutputRegister,
1210c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			dev->iobase + APCI3120_WR_ADDRESS);
1211c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
1212c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1213c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1214c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1215c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
1216c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1217c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1218c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1219c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1220c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
122174b894e56abcb2403894b268100773f4aabe1999Bill Pemberton| 			intERNAL FUNCTIONS						                 |
1222c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1223c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1224c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1225c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1226c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
122771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     : int i_APCI3120_Reset(struct comedi_device *dev)               |
1228c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1229c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
1230c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1231c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Hardware reset function   						     |
1232c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1233c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
123471b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : 	struct comedi_device *dev									 |
1235c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
1236c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
1237c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1238c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
1239c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1240c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1241c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1242c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1243da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_Reset(struct comedi_device *dev)
1244c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
1245c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	unsigned int i;
1246c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	unsigned short us_TmpValue;
1247c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1248c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_AiCyclicAcquisition = APCI3120_DISABLE;
1249c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_EocEosInterrupt = APCI3120_DISABLE;
1250c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_InterruptMode = APCI3120_EOC_MODE;
12511efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	devpriv->ui_EocEosConversionTime = 0;	/*  set eoc eos conv time to 0 */
1252c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_OutputMemoryStatus = 0;
1253c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
12541efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  variables used in timer subdevice */
1255c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_Timer2Mode = 0;
1256c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_Timer2Interrupt = 0;
12571efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	devpriv->b_ExttrigEnable = 0;	/*  Disable ext trigger */
1258c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1259c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* Disable all interrupts, watchdog for the anolog output */
1260c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_ModeSelectRegister = 0;
1261c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outb(devpriv->b_ModeSelectRegister,
1262c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		dev->iobase + APCI3120_WRITE_MODE_SELECT);
1263c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
12641efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Disables all counters, ext trigger and clears PA, PR */
1265c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister = 0;
1266c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(devpriv->us_OutputRegister, dev->iobase + APCI3120_WR_ADDRESS);
1267c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
12681efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
12691efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * Code to set the all anolog o/p channel to 0v 8191 is decimal
12701efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * value for zero(0 v)volt in bipolar mode(default)
12711efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
12721efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_1, dev->iobase + APCI3120_ANALOG_OUTPUT_1);	/* channel 1 */
12731efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_2, dev->iobase + APCI3120_ANALOG_OUTPUT_1);	/* channel 2 */
12741efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_3, dev->iobase + APCI3120_ANALOG_OUTPUT_1);	/* channel 3 */
12751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_4, dev->iobase + APCI3120_ANALOG_OUTPUT_1);	/* channel 4 */
12761efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
12771efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_5, dev->iobase + APCI3120_ANALOG_OUTPUT_2);	/* channel 5 */
12781efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_6, dev->iobase + APCI3120_ANALOG_OUTPUT_2);	/* channel 6 */
12791efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_7, dev->iobase + APCI3120_ANALOG_OUTPUT_2);	/* channel 7 */
12801efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outw(8191 | APCI3120_ANALOG_OP_CHANNEL_8, dev->iobase + APCI3120_ANALOG_OUTPUT_2);	/* channel 8 */
12811efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
12821efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*   Reset digital output to L0W */
12831efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
12841efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/* ES05  outb(0x0,dev->iobase+APCI3120_DIGITAL_OUTPUT); */
1285c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	udelay(10);
1286c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
12871efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	inw(dev->iobase + 0);	/* make a dummy read */
12881efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	inb(dev->iobase + APCI3120_RESET_FIFO);	/*  flush FIFO */
12891efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	inw(dev->iobase + APCI3120_RD_STATUS);	/*  flush A/D status register */
1290c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
12911efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* code to reset the RAM sequence */
1292c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	for (i = 0; i < 16; i++) {
12931efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		us_TmpValue = i << 8;	/* select the location */
1294c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(us_TmpValue, dev->iobase + APCI3120_SEQ_RAM_ADDRESS);
1295c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1296c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
1297c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1298c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1299c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1300c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
130171b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     : int i_APCI3120_SetupChannelList(struct comedi_device * dev,   |
130234c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice * s, int n_chan,unsigned int *chanlist|
1303c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  ,char check)											 |
1304c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
1305c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1306c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              :This function will first check channel list is ok or not|
1307c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|and then initialize the sequence RAM with the polarity, Gain,Channel number |
1308c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|If the last argument of function "check"is 1 then it only checks the channel|
1309c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|list is ok or not.												     		 |
1310c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1311c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
131271b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device * dev									 |
131334c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice * s									 |
1314c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     int n_chan                   					         |
1315c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			  unsigned int *chanlist
1316c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			  char check
1317c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1318c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
1319c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1320c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1321c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1322c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1323da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_SetupChannelList(struct comedi_device *dev, struct comedi_subdevice *s,
1324c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	int n_chan, unsigned int *chanlist, char check)
1325c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
13261efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	unsigned int i;		/* , differencial=0, bipolar=0; */
1327c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	unsigned int gain;
1328c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	unsigned short us_TmpValue;
1329c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1330c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/* correct channel and range number check itself comedi/range.c */
1331c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (n_chan < 1) {
1332c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (!check)
1333c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			comedi_error(dev, "range/channel list is empty!");
1334c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return 0;
1335c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
13361efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  All is ok, so we can setup channel/range list */
1337c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (check)
1338c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return 1;
1339c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
13401efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* Code  to set the PA and PR...Here it set PA to 0.. */
1341c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister =
1342c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->us_OutputRegister & APCI3120_CLEAR_PA_PR;
1343c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister = ((n_chan - 1) & 0xf) << 8;
1344c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(devpriv->us_OutputRegister, dev->iobase + APCI3120_WR_ADDRESS);
1345c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1346c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	for (i = 0; i < n_chan; i++) {
13471efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  store range list to card */
13481efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		us_TmpValue = CR_CHAN(chanlist[i]);	/*  get channel number; */
1349c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1350dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		if (CR_RANGE(chanlist[i]) < APCI3120_BIPOLAR_RANGES)
13511efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			us_TmpValue &= ((~APCI3120_UNIPOLAR) & 0xff);	/*  set bipolar */
1352dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		else
13531efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			us_TmpValue |= APCI3120_UNIPOLAR;	/*  enable unipolar...... */
1354c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
13551efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		gain = CR_RANGE(chanlist[i]);	/*  get gain number */
13561efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		us_TmpValue |= ((gain & 0x03) << 4);	/* <<4 for G0 and G1 bit in RAM */
13571efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		us_TmpValue |= i << 8;	/* To select the RAM LOCATION.... */
1358c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(us_TmpValue, dev->iobase + APCI3120_SEQ_RAM_ADDRESS);
1359c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1360c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\n Gain = %i",
1361c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			(((unsigned char)CR_RANGE(chanlist[i]) & 0x03) << 2));
1362c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\n Channel = %i", CR_CHAN(chanlist[i]));
1363c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\n Polarity = %i", us_TmpValue & APCI3120_UNIPOLAR);
1364c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
13651efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	return 1;		/*  we can serve this with scan logic */
1366c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1367c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1368c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1369c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
137071b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :	int i_APCI3120_ExttrigEnable(struct comedi_device * dev)    |
1371c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1372c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
1373c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1374c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : 	Enable the external trigger						     |
1375c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1376c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
137771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : 	struct comedi_device * dev									 |
1378c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
1379c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
1380c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1381c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :      0        					                         |
1382c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1383c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1384c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1385c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1386da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_ExttrigEnable(struct comedi_device *dev)
1387c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
1388c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1389c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister |= APCI3120_ENABLE_EXT_TRIGGER;
1390c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(devpriv->us_OutputRegister, dev->iobase + APCI3120_WR_ADDRESS);
1391c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
1392c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1393c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1394c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1395c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
139671b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     : 	int i_APCI3120_ExttrigDisable(struct comedi_device * dev)   |
1397c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1398c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1399c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : 	Disables the external trigger					     |
1400c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1401c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
140271b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : 	struct comedi_device * dev									 |
1403c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
1404c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
1405c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1406c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :    0          					                         |
1407c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1408c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1409c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1410c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1411da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_ExttrigDisable(struct comedi_device *dev)
1412c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
1413c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister &= ~APCI3120_ENABLE_EXT_TRIGGER;
1414c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(devpriv->us_OutputRegister, dev->iobase + APCI3120_WR_ADDRESS);
1415c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
1416c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1417c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1418c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1419c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
142074b894e56abcb2403894b268100773f4aabe1999Bill Pemberton|                    intERRUPT FUNCTIONS		    		                 |
1421c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1422c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1423c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1424c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1425c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1426c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function name     : void v_APCI3120_Interrupt(int irq, void *d) 								 |
1427c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1428c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
1429c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1430c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              :Interrupt handler for APCI3120                        	 |
1431c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			 When interrupt occurs this gets called.                 |
1432c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			 First it finds which interrupt has been generated and   |
1433c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			 handles  corresponding interrupt                        |
1434c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1435c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1436c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Input Parameters  : 	int irq 											 |
1437c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                        void *d											 |
1438c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
1439c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1440c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : void         					                         |
1441c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1442c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1443c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1444c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1445c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbHvoid v_APCI3120_Interrupt(int irq, void *d)
1446c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
144771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton	struct comedi_device *dev = d;
1448a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short int_daq;
1449c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1450c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	unsigned int int_amcc, ui_Check, i;
1451a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short us_TmpValue;
14521783fbfe023b7c2b912fbb020e01ff46985aa0abBill Pemberton	unsigned char b_DummyRead;
1453c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
145434c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton	struct comedi_subdevice *s = dev->subdevices + 0;
1455c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_Check = 1;
1456c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
14571efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	int_daq = inw(dev->iobase + APCI3120_RD_STATUS) & 0xf000;	/*  get IRQ reasons */
14581efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	int_amcc = inl(devpriv->i_IobaseAmcc + AMCC_OP_REG_INTCSR);	/*  get AMCC int register */
1459c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1460c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((!int_daq) && (!(int_amcc & ANY_S593X_INT))) {
1461bbc9a9916bc1cd997f3bf303e7930d5f3c804d37André Goddard Rosa		comedi_error(dev, "IRQ from unknown source");
1462c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return;
1463c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1464c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
14651efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	outl(int_amcc | 0x00ff0000, devpriv->i_IobaseAmcc + AMCC_OP_REG_INTCSR);	/*  shutdown IRQ reasons in AMCC */
1466c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1467c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	int_daq = (int_daq >> 12) & 0xF;
1468c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1469c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (devpriv->b_ExttrigEnable == APCI3120_ENABLE) {
14701efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Disable ext trigger */
1471c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		i_APCI3120_ExttrigDisable(dev);
1472c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_ExttrigEnable = APCI3120_DISABLE;
1473c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
14741efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* clear the timer 2 interrupt */
1475c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	inb(devpriv->i_IobaseAmcc + APCI3120_TIMER_STATUS_REGISTER);
1476c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1477c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (int_amcc & MASTER_ABORT_INT)
1478c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "AMCC IRQ - MASTER DMA ABORT!");
1479c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (int_amcc & TARGET_ABORT_INT)
1480c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "AMCC IRQ - TARGET DMA ABORT!");
1481c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
14821efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Ckeck if EOC interrupt */
1483c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (((int_daq & 0x8) == 0)
1484c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		&& (devpriv->b_InterruptMode == APCI3120_EOC_MODE)) {
1485c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (devpriv->b_EocEosInterrupt == APCI3120_ENABLE) {
1486c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
14871efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  Read the AI Value */
1488c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1489c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->ui_AiReadData[0] =
1490117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton				(unsigned int) inw(devpriv->iobase + 0);
1491c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_EocEosInterrupt = APCI3120_DISABLE;
14921efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			send_sig(SIGIO, devpriv->tsk_Current, 0);	/*  send signal to the sample */
1493c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
14941efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Disable EOC Interrupt */
1495c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
1496c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
1497c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister & APCI3120_DISABLE_EOC_INT;
1498c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
1499c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WRITE_MODE_SELECT);
1500c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1501c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1502c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1503c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15041efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Check If EOS interrupt */
1505c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((int_daq & 0x2) && (devpriv->b_InterruptMode == APCI3120_EOS_MODE)) {
1506c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1507dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		if (devpriv->b_EocEosInterrupt == APCI3120_ENABLE) {	/*  enable this in without DMA ??? */
1508c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1509c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			if (devpriv->b_AiCyclicAcquisition == APCI3120_ENABLE) {
1510c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				ui_Check = 0;
1511c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				i_APCI3120_InterruptHandleEos(dev);
1512c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->ui_AiActualScan++;
1513c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_ModeSelectRegister =
1514c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->
1515c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					b_ModeSelectRegister |
1516c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_ENABLE_EOS_INT;
1517c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				outb(devpriv->b_ModeSelectRegister,
1518c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					dev->iobase +
1519c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					APCI3120_WRITE_MODE_SELECT);
1520c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			} else {
1521c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				ui_Check = 0;
1522c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				for (i = 0; i < devpriv->ui_AiNbrofChannels;
1523c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					i++) {
1524c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					us_TmpValue = inw(devpriv->iobase + 0);
1525c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					devpriv->ui_AiReadData[i] =
1526117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton						(unsigned int) us_TmpValue;
1527c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				}
1528c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_EocEosInterrupt = APCI3120_DISABLE;
1529c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_InterruptMode = APCI3120_EOC_MODE;
1530c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15311efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton				send_sig(SIGIO, devpriv->tsk_Current, 0);	/*  send signal to the sample */
1532c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1533c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			}
1534c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1535c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
1536c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
1537c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
1538c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister & APCI3120_DISABLE_EOS_INT;
1539c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
1540c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WRITE_MODE_SELECT);
15411efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			devpriv->b_EocEosInterrupt = APCI3120_DISABLE;	/* Default settings */
1542c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_InterruptMode = APCI3120_EOC_MODE;
1543c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1544c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1545c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
15461efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* Timer2 interrupt */
1547c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (int_daq & 0x1) {
1548c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1549c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		switch (devpriv->b_Timer2Mode) {
1550c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		case APCI3120_COUNTER:
1551c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1552c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_AiCyclicAcquisition = APCI3120_DISABLE;
1553c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
1554c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
1555c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister & APCI3120_DISABLE_EOS_INT;
1556c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
1557c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WRITE_MODE_SELECT);
1558c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15591efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  stop timer 2 */
1560c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister =
1561c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
1562c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_OutputRegister & APCI3120_DISABLE_ALL_TIMER;
1563c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(devpriv->us_OutputRegister,
1564c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WR_ADDRESS);
1565c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15661efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* stop timer 0 and timer 1 */
1567c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			i_APCI3120_StopCyclicAcquisition(dev, s);
1568c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_AiCyclicAcquisition = APCI3120_DISABLE;
1569c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15701efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* UPDATE-0.7.57->0.7.68comedi_done(dev,s); */
1571c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			s->async->events |= COMEDI_CB_EOA;
1572c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			comedi_event(dev, s);
1573c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1574c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			break;
1575c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1576c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		case APCI3120_TIMER:
1577c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15781efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Send a signal to from kernel to user space */
1579c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			send_sig(SIGIO, devpriv->tsk_Current, 0);
1580c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			break;
1581c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1582c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		case APCI3120_WATCHDOG:
1583c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15841efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Send a signal to from kernel to user space */
1585c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			send_sig(SIGIO, devpriv->tsk_Current, 0);
1586c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			break;
1587c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1588c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		default:
1589c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
15901efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  disable Timer Interrupt */
1591c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1592c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
1593c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
1594c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister &
1595c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_TIMER_INT;
1596c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1597c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outb(devpriv->b_ModeSelectRegister,
1598c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WRITE_MODE_SELECT);
1599c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1600c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1601c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1602c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_DummyRead = inb(dev->iobase + APCI3120_TIMER_STATUS_REGISTER);
1603c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1604c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1605c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1606c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((int_daq & 0x4) && (devpriv->b_InterruptMode == APCI3120_DMA_MODE)) {
1607c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (devpriv->b_AiCyclicAcquisition == APCI3120_ENABLE) {
1608c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1609c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			/****************************/
161074b894e56abcb2403894b268100773f4aabe1999Bill Pemberton			/* Clear Timer Write TC int */
1611c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			/****************************/
1612c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1613c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outl(APCI3120_CLEAR_WRITE_TC_INT,
1614c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->i_IobaseAmcc +
1615c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_AMCC_OP_REG_INTCSR);
1616c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1617c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			/************************************/
1618c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			/* Clears the timer status register */
1619c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			/************************************/
1620c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			inw(dev->iobase + APCI3120_TIMER_STATUS_REGISTER);
16211efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			v_APCI3120_InterruptDma(irq, d);	/*  do some data transfer */
1622c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
1623c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			/* Stops the Timer */
1624c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(devpriv->
1625c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_OutputRegister & APCI3120_DISABLE_TIMER0 &
1626c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_TIMER1,
1627c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				dev->iobase + APCI3120_WR_ADDRESS);
1628c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1629c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1630c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1631c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1632c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return;
1633c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1634c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1635c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1636c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
163771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InterruptHandleEos(struct comedi_device *dev)   |
1638c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1639c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
1640c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1641c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : This function handles EOS interrupt.                   |
1642c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     This function copies the acquired data(from FIFO)      |
1643c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|				to Comedi buffer.		 							 |
1644c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1645c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
164671b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
1647c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
1648c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
1649c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1650c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : 0            					                         |
1651c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1652c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1653c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1654c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
16551efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
1656da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InterruptHandleEos(struct comedi_device *dev)
1657c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
1658c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	int n_chan, i;
165934c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton	struct comedi_subdevice *s = dev->subdevices + 0;
1660c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	int err = 1;
1661c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1662c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	n_chan = devpriv->ui_AiNbrofChannels;
1663c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1664c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	s->async->events = 0;
1665c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1666c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	for (i = 0; i < n_chan; i++)
1667c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		err &= comedi_buf_put(s->async, inw(dev->iobase + 0));
1668c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1669c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	s->async->events |= COMEDI_CB_EOS;
1670c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1671c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (err == 0)
1672c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		s->async->events |= COMEDI_CB_OVERFLOW;
1673c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1674c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	comedi_event(dev, s);
1675c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1676c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return 0;
1677c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1678c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1679c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1680c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1681c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function name     : void v_APCI3120_InterruptDma(int irq, void *d) 									 |
1682c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1683c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1684c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : This is a handler for the DMA interrupt                |
1685c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  This function copies the data to Comedi Buffer.        |
1686c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  For continuous DMA it reinitializes the DMA operation. |
1687c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			  For single mode DMA it stop the acquisition.           |
1688c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|													     			 |
1689c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1690c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Input Parameters  : int irq, void *d				 |
1691c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
1692c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1693c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :  void        					                         |
1694c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1695c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1696c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1697c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1698c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbHvoid v_APCI3120_InterruptDma(int irq, void *d)
1699c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
170071b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton	struct comedi_device *dev = d;
170134c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton	struct comedi_subdevice *s = dev->subdevices + 0;
1702c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	unsigned int next_dma_buf, samplesinbuf;
1703c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	unsigned long low_word, high_word, var;
1704c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1705117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Tmp;
1706c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	samplesinbuf =
1707c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_DmaBufferUsesize[devpriv->ui_DmaActualBuffer] -
1708c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		inl(devpriv->i_IobaseAmcc + AMCC_OP_REG_MWTC);
1709c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1710c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (samplesinbuf <
1711c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_DmaBufferUsesize[devpriv->ui_DmaActualBuffer]) {
1712c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "Interrupted DMA transfer!");
1713c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1714c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (samplesinbuf & 1) {
1715c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "Odd count of bytes in DMA ring!");
1716c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		i_APCI3120_StopCyclicAcquisition(dev, s);
1717c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_AiCyclicAcquisition = APCI3120_DISABLE;
1718c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1719c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return;
1720c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
17211efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	samplesinbuf = samplesinbuf >> 1;	/*  number of received samples */
1722c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (devpriv->b_DmaDoubleBuffer) {
17231efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  switch DMA buffers if is used double buffering */
1724c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		next_dma_buf = 1 - devpriv->ui_DmaActualBuffer;
1725c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1726c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Tmp = AGCSTS_TC_ENABLE | AGCSTS_RESET_A2P_FIFO;
1727c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl(ui_Tmp, devpriv->i_IobaseAddon + AMCC_OP_REG_AGCSTS);
1728c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
17291efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  changed  since 16 bit interface for add on */
1730c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_AGCSTS_LOW, devpriv->i_IobaseAddon + 0);
1731c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ENABLE_TRANSFER_ADD_ON_LOW,
1732c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1733c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_AGCSTS_HIGH, devpriv->i_IobaseAddon + 0);
17341efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		outw(APCI3120_ENABLE_TRANSFER_ADD_ON_HIGH, devpriv->i_IobaseAddon + 2);	/*  0x1000 is out putted in windows driver */
1735c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1736c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ul_DmaBufferHw[next_dma_buf];
1737c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		low_word = var & 0xffff;
1738c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ul_DmaBufferHw[next_dma_buf];
1739c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		high_word = var / 65536;
1740c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1741f69b0d6451679f1466381a46ac7ab671a7b5668cUwe Kleine-König		/* DMA Start Address Low */
1742c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWAR_LOW, devpriv->i_IobaseAddon + 0);
1743c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(low_word, devpriv->i_IobaseAddon + 2);
1744c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1745f69b0d6451679f1466381a46ac7ab671a7b5668cUwe Kleine-König		/* DMA Start Address High */
1746c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWAR_HIGH, devpriv->i_IobaseAddon + 0);
1747c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(high_word, devpriv->i_IobaseAddon + 2);
1748c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1749c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ui_DmaBufferUsesize[next_dma_buf];
1750c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		low_word = var & 0xffff;
1751c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ui_DmaBufferUsesize[next_dma_buf];
1752c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		high_word = var / 65536;
1753c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1754c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* Nbr of acquisition LOW */
1755c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWTC_LOW, devpriv->i_IobaseAddon + 0);
1756c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(low_word, devpriv->i_IobaseAddon + 2);
1757c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1758c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		/* Nbr of acquisition HIGH */
1759c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWTC_HIGH, devpriv->i_IobaseAddon + 0);
1760c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(high_word, devpriv->i_IobaseAddon + 2);
1761c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
17621efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
17631efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * To configure A2P FIFO
17641efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * ENABLE A2P FIFO WRITE AND ENABLE AMWEN
17651efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * AMWEN_ENABLE | A2P_FIFO_WRITE_ENABLE (0x01|0x02)=0x03
17661efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1767c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(3, devpriv->i_IobaseAddon + 4);
17681efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* initialise end of dma interrupt  AINT_WRITE_COMPL = ENABLE_WRITE_TC_INT(ADDI) */
1769c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl((APCI3120_FIFO_ADVANCE_ON_BYTE_2 |
1770c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_WRITE_TC_INT),
1771c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAmcc + AMCC_OP_REG_INTCSR);
1772c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1773c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1774c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (samplesinbuf) {
1775c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		v_APCI3120_InterruptDmaMoveBlock16bit(dev, s,
1776c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->ul_DmaBufferVirtual[devpriv->
1777c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				ui_DmaActualBuffer], samplesinbuf);
1778c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1779c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (!(devpriv->ui_AiFlags & TRIG_WAKE_EOS)) {
1780c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			s->async->events |= COMEDI_CB_EOS;
1781c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			comedi_event(dev, s);
1782c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1783c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1784c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!devpriv->b_AiContinuous)
1785c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (devpriv->ui_AiActualScan >= devpriv->ui_AiNbrofScans) {
17861efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  all data sampled */
1787c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			i_APCI3120_StopCyclicAcquisition(dev, s);
1788c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_AiCyclicAcquisition = APCI3120_DISABLE;
1789c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			s->async->events |= COMEDI_CB_EOA;
1790c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			comedi_event(dev, s);
1791c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			return;
1792c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
1793c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
17941efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	if (devpriv->b_DmaDoubleBuffer) {	/*  switch dma buffers */
1795c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->ui_DmaActualBuffer = 1 - devpriv->ui_DmaActualBuffer;
1796c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else {
17971efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
17981efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * restart DMA if is not used double buffering
17991efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * ADDED REINITIALISE THE DMA
18001efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1801c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Tmp = AGCSTS_TC_ENABLE | AGCSTS_RESET_A2P_FIFO;
1802c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl(ui_Tmp, devpriv->i_IobaseAddon + AMCC_OP_REG_AGCSTS);
1803c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
18041efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  changed  since 16 bit interface for add on */
1805c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_AGCSTS_LOW, devpriv->i_IobaseAddon + 0);
1806c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ENABLE_TRANSFER_ADD_ON_LOW,
1807c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAddon + 2);
1808c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_AGCSTS_HIGH, devpriv->i_IobaseAddon + 0);
18091efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		outw(APCI3120_ENABLE_TRANSFER_ADD_ON_HIGH, devpriv->i_IobaseAddon + 2);	/*  */
18101efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
18111efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * A2P FIFO MANAGEMENT
18121efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * A2P fifo reset & transfer control enable
18131efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1814c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl(APCI3120_A2P_FIFO_MANAGEMENT,
1815c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAmcc + AMCC_OP_REG_MCSR);
1816c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1817c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ul_DmaBufferHw[0];
1818c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		low_word = var & 0xffff;
1819c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ul_DmaBufferHw[0];
1820c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		high_word = var / 65536;
1821c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWAR_LOW, devpriv->i_IobaseAddon + 0);
1822c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(low_word, devpriv->i_IobaseAddon + 2);
1823c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWAR_HIGH, devpriv->i_IobaseAddon + 0);
1824c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(high_word, devpriv->i_IobaseAddon + 2);
1825c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1826c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ui_DmaBufferUsesize[0];
18271efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		low_word = var & 0xffff;	/* changed */
1828c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		var = devpriv->ui_DmaBufferUsesize[0];
1829c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		high_word = var / 65536;
1830c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWTC_LOW, devpriv->i_IobaseAddon + 0);
1831c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(low_word, devpriv->i_IobaseAddon + 2);
1832c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(APCI3120_ADD_ON_MWTC_HIGH, devpriv->i_IobaseAddon + 0);
1833c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(high_word, devpriv->i_IobaseAddon + 2);
1834c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
18351efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
18361efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * To configure A2P FIFO
18371efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * ENABLE A2P FIFO WRITE AND ENABLE AMWEN
18381efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * AMWEN_ENABLE | A2P_FIFO_WRITE_ENABLE (0x01|0x02)=0x03
18391efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1840c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(3, devpriv->i_IobaseAddon + 4);
18411efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* initialise end of dma interrupt  AINT_WRITE_COMPL = ENABLE_WRITE_TC_INT(ADDI) */
1842c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outl((APCI3120_FIFO_ADVANCE_ON_BYTE_2 |
1843c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_WRITE_TC_INT),
1844c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->i_IobaseAmcc + AMCC_OP_REG_INTCSR);
1845c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1846c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1847c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1848c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1849c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1850c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Function name     :void v_APCI3120_InterruptDmaMoveBlock16bit(comedi_device|
185134c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|*dev,struct comedi_subdevice *s,short *dma,short *data,int n)				     |
1852c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1853c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1854c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : This function copies the data from DMA buffer to the   |
1855c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|				 Comedi buffer  									 |
1856c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1857c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
185871b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
185934c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
1860790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     short *dma											 |
1861790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     short *data,int n          					         |
1862c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1863c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      : void         					                         |
1864c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1865c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1866c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1867c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1868da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonvoid v_APCI3120_InterruptDmaMoveBlock16bit(struct comedi_device *dev,
1869da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_subdevice *s, short *dma_buffer, unsigned int num_samples)
1870c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
1871c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->ui_AiActualScan +=
1872c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		(s->async->cur_chan + num_samples) / devpriv->ui_AiScanLength;
1873c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	s->async->cur_chan += num_samples;
1874c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	s->async->cur_chan %= devpriv->ui_AiScanLength;
1875c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1876790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton	cfc_write_array_to_buffer(s, dma_buffer, num_samples * sizeof(short));
1877c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
1878c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1879c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1880c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1881c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                           TIMER SUBDEVICE   		                         |
1882c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1883c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1884c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1885c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
1886c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
188771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnConfigTimer(struct comedi_device *dev,          |
188890035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|	struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data) 			     |
1889c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
1890c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1891c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              :Configure Timer 2  								     |
1892c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
1893c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
189471b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
189534c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
189690035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
1897790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data 										 |
1898c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
1899c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                      data[0]= TIMER  configure as timer                    |
1900c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|              				 = WATCHDOG configure as watchdog				 |
1901c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|       			  data[1] = Timer constant							 |
1902c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|       			  data[2] = Timer2 interrupt (1)enable or(0) disable |
1903c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
1904c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1905c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
1906c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
1907c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
1908c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
1909c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1910da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnConfigTimer(struct comedi_device *dev, struct comedi_subdevice *s,
1911da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
1912c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
1913c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1914117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Timervalue2;
1915a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short us_TmpValue;
19161783fbfe023b7c2b912fbb020e01ff46985aa0abBill Pemberton	unsigned char b_Tmp;
1917c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1918c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (!data[1])
1919c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "config:No timer constant !");
1920c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19211efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	devpriv->b_Timer2Interrupt = (unsigned char) data[2];	/*  save info whether to enable or disable interrupt */
1922c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19231efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	ui_Timervalue2 = data[1] / 1000;	/*  convert nano seconds  to u seconds */
1924c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19251efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* this_board->i_hwdrv_InsnConfigTimer(dev, ui_Timervalue2,(unsigned char)data[0]); */
1926a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	us_TmpValue = (unsigned short) inw(devpriv->iobase + APCI3120_RD_STATUS);
1927c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19281efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
19291efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * EL250804: Testing if board APCI3120 have the new Quartz or if it
19301efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * is an APCI3001 and calculate the time value to set in the timer
19311efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
1932c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((us_TmpValue & 0x00B0) == 0x00B0
1933c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		|| !strcmp(this_board->pc_DriverName, "apci3001")) {
19341efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Calculate the time value to set in the timer */
1935c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Timervalue2 = ui_Timervalue2 / 50;
1936c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else {
19371efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Calculate the time value to set in the timer */
1938c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Timervalue2 = ui_Timervalue2 / 70;
1939c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
1940c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19411efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* Reset gate 2 of Timer 2 to disable it (Set Bit D14 to 0) */
1942c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->us_OutputRegister =
1943c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->us_OutputRegister & APCI3120_DISABLE_TIMER2;
1944c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outw(devpriv->us_OutputRegister, devpriv->iobase + APCI3120_WR_ADDRESS);
1945c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19461efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Disable TIMER Interrupt */
1947c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_ModeSelectRegister =
1948c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->
1949c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_ModeSelectRegister & APCI3120_DISABLE_TIMER_INT & 0xEF;
1950c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19511efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/*  Disable Eoc and Eos Interrupts */
1952c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_ModeSelectRegister =
1953c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->
1954c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_ModeSelectRegister & APCI3120_DISABLE_EOC_INT &
1955c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		APCI3120_DISABLE_EOS_INT;
1956c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outb(devpriv->b_ModeSelectRegister,
1957c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->iobase + APCI3120_WRITE_MODE_SELECT);
1958dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (data[0] == APCI3120_TIMER) {	/* initialize timer */
19591efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* devpriv->b_ModeSelectRegister=devpriv->b_ModeSelectRegister |
19601efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		 * APCI3120_ENABLE_TIMER_INT; */
1961c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19621efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* outb(devpriv->b_ModeSelectRegister,devpriv->iobase+APCI3120_WRITE_MODE_SELECT); */
1963c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19641efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Set the Timer 2 in mode 2(Timer) */
1965c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_TimerSelectMode =
1966c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			(devpriv->
1967c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_TimerSelectMode & 0x0F) | APCI3120_TIMER_2_MODE_2;
1968c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_TimerSelectMode,
1969c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_CRT1);
1970c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19711efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
19721efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * Configure the timer 2 for writing the LOW unsigned short of timer
19731efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * is Delay value You must make a b_tmp variable with
19741efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * DigitalOutPutRegister because at Address_1+APCI3120_TIMER_CRT0
19751efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * you can set the digital output and configure the timer 2,and if
19761efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * you don't make this, digital output are erase (Set to 0)
19771efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
19781efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
19791efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Writing LOW unsigned short */
1980c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
1981c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
1982c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_LOW_WORD;
1983c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
1984c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(LOWORD(ui_Timervalue2),
1985c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_VALUE);
1986c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19871efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Writing HIGH unsigned short */
1988c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
1989c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
1990c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_HIGH_WORD;
1991c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
1992c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(HIWORD(ui_Timervalue2),
1993c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_VALUE);
19941efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  timer2 in Timer mode enabled */
1995c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_Timer2Mode = APCI3120_TIMER;
1996c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
1997dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	} else {			/*  Initialize Watch dog */
1998c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
19991efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Set the Timer 2 in mode 5(Watchdog) */
2000c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2001c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_TimerSelectMode =
2002c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			(devpriv->
2003c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_TimerSelectMode & 0x0F) | APCI3120_TIMER_2_MODE_5;
2004c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_TimerSelectMode,
2005c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_CRT1);
2006c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
20071efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
20081efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * Configure the timer 2 for writing the LOW unsigned short of timer
20091efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * is Delay value You must make a b_tmp variable with
20101efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * DigitalOutPutRegister because at Address_1+APCI3120_TIMER_CRT0
20111efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * you can set the digital output and configure the timer 2,and if
20121efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * you don't make this, digital output are erase (Set to 0)
20131efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
20141efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton
20151efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Writing LOW unsigned short */
2016c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
2017c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
2018c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_LOW_WORD;
2019c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
2020c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(LOWORD(ui_Timervalue2),
2021c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_VALUE);
2022c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
20231efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Writing HIGH unsigned short */
2024c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
2025c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
2026c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_HIGH_WORD;
2027c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
2028c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2029c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(HIWORD(ui_Timervalue2),
2030c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_VALUE);
20311efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* watchdog enabled */
2032c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_Timer2Mode = APCI3120_WATCHDOG;
2033c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2034c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2035c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2036c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2037c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2038c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2039c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2040c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2041c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
204271b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnWriteTimer(struct comedi_device *dev,           |
204390035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                    struct comedi_subdevice *s, struct comedi_insn *insn,unsigned int *data)  |
2044c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
2045c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2046c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              :    To start and stop the timer		                 |
2047c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
204871b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
204934c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
205090035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
2051790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data                                         |
2052c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                                            |
2053c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|				data[0] = 1 (start)                                  |
2054c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|				data[0] = 0 (stop )                                  |
2055c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|	 			data[0] = 2  (write new value)                       |
2056c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|	   			data[1]= new value                                   |
2057c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                                            |
2058c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|    				devpriv->b_Timer2Mode =  0 DISABLE                   |
2059c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|	                     					 1 Timer                     |
2060c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|					 					 2 Watch dog			     |
2061c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                                 					         |
2062c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2063c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
2064c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
2065c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2066c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2067c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2068da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnWriteTimer(struct comedi_device *dev, struct comedi_subdevice *s,
2069da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
2070c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
2071c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2072117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Timervalue2 = 0;
2073a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short us_TmpValue;
20741783fbfe023b7c2b912fbb020e01ff46985aa0abBill Pemberton	unsigned char b_Tmp;
2075c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2076c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((devpriv->b_Timer2Mode != APCI3120_WATCHDOG)
2077c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		&& (devpriv->b_Timer2Mode != APCI3120_TIMER)) {
2078c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "\nwrite:timer2  not configured ");
2079c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
2080c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2081c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2082dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (data[0] == 2) {	/*  write new value */
2083c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (devpriv->b_Timer2Mode != APCI3120_TIMER) {
2084c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			comedi_error(dev,
2085c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				"write :timer2  not configured  in TIMER MODE");
2086c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			return -EINVAL;
2087c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
2088c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2089c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (data[1])
2090c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_Timervalue2 = data[1];
2091c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		else
2092c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_Timervalue2 = 0;
2093c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2094c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
20951efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* this_board->i_hwdrv_InsnWriteTimer(dev,data[0],ui_Timervalue2); */
2096c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2097c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	switch (data[0]) {
2098c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case APCI3120_START:
2099c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21001efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  Reset FC_TIMER BIT */
2101c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		inb(devpriv->iobase + APCI3120_TIMER_STATUS_REGISTER);
2102dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		if (devpriv->b_Timer2Mode == APCI3120_TIMER) {	/* start timer */
21031efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Enable Timer */
2104c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
2105c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->b_ModeSelectRegister & 0x0B;
2106dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		} else {		/* start watch dog */
21071efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Enable WatchDog */
2108c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
2109c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				(devpriv->
2110c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister & 0x0B) |
2111c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_WATCHDOG;
2112c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
2113c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21141efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* enable disable interrupt */
2115c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if ((devpriv->b_Timer2Interrupt) == APCI3120_ENABLE) {
2116c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2117c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
2118c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
2119c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister |
2120c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_ENABLE_TIMER_INT;
21211efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  save the task structure to pass info to user */
2122c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->tsk_Current = current;
2123c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
2124c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2125c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
2126c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
2127c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister &
2128c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_TIMER_INT;
2129c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
2130c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_ModeSelectRegister,
2131c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_WRITE_MODE_SELECT);
2132c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2133dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini		if (devpriv->b_Timer2Mode == APCI3120_TIMER) {	/* start timer */
21341efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* For Timer mode is  Gate2 must be activated   **timer started */
2135c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister =
2136c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
2137c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				us_OutputRegister | APCI3120_ENABLE_TIMER2;
2138c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			outw(devpriv->us_OutputRegister,
2139c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->iobase + APCI3120_WR_ADDRESS);
2140c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
2141c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2142c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
2143c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2144c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case APCI3120_STOP:
2145c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (devpriv->b_Timer2Mode == APCI3120_TIMER) {
21461efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Disable timer */
2147c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
2148c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
2149c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister &
2150c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_TIMER_COUNTER;
2151c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
21521efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Disable WatchDog */
2153c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_ModeSelectRegister =
2154c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				devpriv->
2155c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_ModeSelectRegister &
2156c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_DISABLE_WATCHDOG;
2157c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
21581efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  Disable timer interrupt */
2159c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_ModeSelectRegister =
2160c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->
2161c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			b_ModeSelectRegister & APCI3120_DISABLE_TIMER_INT;
2162c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21631efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  Write above states  to register */
2164c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(devpriv->b_ModeSelectRegister,
2165c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_WRITE_MODE_SELECT);
2166c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21671efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  Reset Gate 2 */
2168c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->us_OutputRegister =
2169c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->us_OutputRegister & APCI3120_DISABLE_TIMER_INT;
2170c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(devpriv->us_OutputRegister,
2171c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_WR_ADDRESS);
2172c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21731efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  Reset FC_TIMER BIT */
2174c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		inb(devpriv->iobase + APCI3120_TIMER_STATUS_REGISTER);
2175c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21761efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Disable timer */
21771efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* devpriv->b_Timer2Mode=APCI3120_DISABLE;  */
2178c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2179c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
2180c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21811efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	case 2:		/* write new value to Timer */
2182c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (devpriv->b_Timer2Mode != APCI3120_TIMER) {
2183c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			comedi_error(dev,
2184c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				"write :timer2  not configured  in TIMER MODE");
2185c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			return -EINVAL;
2186c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
21871efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  ui_Timervalue2=data[1]; // passed as argument */
2188c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_TmpValue =
2189a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton			(unsigned short) inw(devpriv->iobase + APCI3120_RD_STATUS);
2190c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
21911efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
21921efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * EL250804: Testing if board APCI3120 have the new Quartz or if it
21931efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * is an APCI3001 and calculate the time value to set in the timer
21941efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
2195c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if ((us_TmpValue & 0x00B0) == 0x00B0
2196c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			|| !strcmp(this_board->pc_DriverName, "apci3001")) {
21971efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Calculate the time value to set in the timer */
2198c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_Timervalue2 = ui_Timervalue2 / 50;
2199c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		} else {
22001efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/* Calculate the time value to set in the timer */
2201c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ui_Timervalue2 = ui_Timervalue2 / 70;
2202c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
22031efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Writing LOW unsigned short */
2204c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
2205c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
2206c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_LOW_WORD;
2207c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
2208c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2209c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(LOWORD(ui_Timervalue2),
2210c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_VALUE);
2211c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
22121efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Writing HIGH unsigned short */
2213c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
2214c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
2215c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_HIGH_WORD;
2216c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
2217c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2218c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outw(HIWORD(ui_Timervalue2),
2219c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_TIMER_VALUE);
2220c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2221c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
2222c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	default:
22231efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		return -EINVAL;	/*  Not a valid input */
2224c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2225c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2226c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2227c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2228c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2229c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2230c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
223171b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     : int i_APCI3120_InsnReadTimer(struct comedi_device *dev,           |
223290035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|		struct comedi_subdevice *s,struct comedi_insn *insn, unsigned int *data) 		 |
2233c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
2234c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
2235c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2236c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : read the Timer value 				                 	 |
2237c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
223871b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : 	struct comedi_device *dev									 |
223934c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
224090035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
2241790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data 										 |
2242c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     														 |
2243c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2244c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :   													 |
2245c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|			for Timer:	data[0]= Timer constant						 |
2246c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|																	 |
2247c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|         		for watchdog: data[0]=0 (still running)                  |
2248c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|	               			  data[0]=1  (run down)            			 |
2249c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
2250c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2251c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2252da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnReadTimer(struct comedi_device *dev, struct comedi_subdevice *s,
2253da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
2254c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
22551783fbfe023b7c2b912fbb020e01ff46985aa0abBill Pemberton	unsigned char b_Tmp;
2256a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short us_TmpValue, us_TmpValue_2, us_StatusValue;
2257c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2258c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((devpriv->b_Timer2Mode != APCI3120_WATCHDOG)
2259c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		&& (devpriv->b_Timer2Mode != APCI3120_TIMER)) {
2260c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "\nread:timer2  not configured ");
2261c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2262c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
22631efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* this_board->i_hwdrv_InsnReadTimer(dev,data); */
2264c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (devpriv->b_Timer2Mode == APCI3120_TIMER) {
2265c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
22661efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Read the LOW unsigned short of Timer 2 register */
2267c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
2268c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
2269c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_LOW_WORD;
2270c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
2271c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2272c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_TmpValue = inw(devpriv->iobase + APCI3120_TIMER_VALUE);
2273c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
22741efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* Read the HIGH unsigned short of Timer 2 register */
2275c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		b_Tmp = ((devpriv->
2276c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				b_DigitalOutputRegister) & 0xF0) |
2277c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			APCI3120_SELECT_TIMER_2_HIGH_WORD;
2278c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		outb(b_Tmp, devpriv->iobase + APCI3120_TIMER_CRT0);
2279c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2280c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_TmpValue_2 = inw(devpriv->iobase + APCI3120_TIMER_VALUE);
2281c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
22821efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*  combining both words */
2283117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton		data[0] = (unsigned int) ((us_TmpValue) | ((us_TmpValue_2) << 16));
2284c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2285dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	} else {			/*  Read watch dog status */
2286c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2287c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_StatusValue = inw(devpriv->iobase + APCI3120_RD_STATUS);
2288c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_StatusValue =
2289c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			((us_StatusValue & APCI3120_FC_TIMER) >> 12) & 1;
2290c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (us_StatusValue == 1) {
22911efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton			/*  RESET FC_TIMER BIT */
2292c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			inb(devpriv->iobase + APCI3120_TIMER_STATUS_REGISTER);
2293c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		}
22941efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		data[0] = us_StatusValue;	/*  when data[0] = 1 then the watch dog has rundown */
2295c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2296c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2297c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2298c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2299c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2300c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2301c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                           DIGITAL INPUT SUBDEVICE   		                 |
2302c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2303c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2304c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2305c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2306c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
230771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnReadDigitalInput(struct comedi_device *dev,     |
230890035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|			struct comedi_subdevice *s, struct comedi_insn *insn,unsigned int *data)   |
2309c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
2310c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
2311c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2312c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Reads the value of the specified  Digital input channel|
2313c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
2314c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
231571b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
231634c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
231790035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
2318790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data 										 |
2319c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2320c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
2321c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
2322c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2323c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2324c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
232534c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pembertonint i_APCI3120_InsnReadDigitalInput(struct comedi_device *dev,
232634c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				    struct comedi_subdevice *s,
232790035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton				    struct comedi_insn *insn,
232834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				    unsigned int *data)
2329c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
2330117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Chan, ui_TmpValue;
2331c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
23321efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	ui_Chan = CR_CHAN(insn->chanspec);	/*  channel specified */
2333c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
23341efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* this_board->i_hwdrv_InsnReadDigitalInput(dev,ui_Chan,data); */
2335dc8af06898c4326cee1739e2bc100bed2b601721Roel Kluin	if (ui_Chan <= 3) {
2336117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton		ui_TmpValue = (unsigned int) inw(devpriv->iobase + APCI3120_RD_STATUS);
2337c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
23381efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
23391efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * since only 1 channel reqd to bring it to last bit it is rotated 8
23401efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * +(chan - 1) times then ANDed with 1 for last bit.
23411efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
2342c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		*data = (ui_TmpValue >> (ui_Chan + 8)) & 1;
23431efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/* return 0; */
2344c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else {
23451efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		/*       comedi_error(dev," chan spec wrong"); */
23461efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton		return -EINVAL;	/*  "sorry channel spec wrong " */
2347c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2348c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2349c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2350c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2351c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2352c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2353c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
235471b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnBitsDigitalInput(struct comedi_device *dev, |
235590035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|struct comedi_subdevice *s, struct comedi_insn *insn,unsigned int *data)                      |
2356c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
2357c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2358c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Reads the value of the Digital input Port i.e.4channels|
2359c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|   value is returned in data[0]											 |
2360c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
2361c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
236271b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
236334c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
236490035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
2365790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data 										 |
2366c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2367c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
2368c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
2369c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2370c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2371da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnBitsDigitalInput(struct comedi_device *dev, struct comedi_subdevice *s,
2372da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_insn *insn, unsigned int *data)
2373c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
2374117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_TmpValue;
2375117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	ui_TmpValue = (unsigned int) inw(devpriv->iobase + APCI3120_RD_STATUS);
2376c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	/*****	state of 4 channels  in the 11, 10, 9, 8   bits of status reg
2377c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			rotated right 8 times to bring them to last four bits
2378c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			ANDed with oxf for  value.
2379c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	*****/
2380c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2381c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	*data = (ui_TmpValue >> 8) & 0xf;
23821efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* this_board->i_hwdrv_InsnBitsDigitalInput(dev,data); */
2383c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2384c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2385c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2386c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2387c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2388c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                           DIGITAL OUTPUT SUBDEVICE   		                 |
2389c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2390c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2391c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2392c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
239371b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnConfigDigitalOutput(struct comedi_device    |
239490035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton| *dev,struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)				 |
2395c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                            						         |
2396c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2397c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              :Configure the output memory ON or OFF				     |
2398c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
2399c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
240071b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  :struct comedi_device *dev									 	 |
240134c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
240290035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
2403790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data 										 |
2404c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2405c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
2406c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
2407c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2408c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2409c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2410da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnConfigDigitalOutput(struct comedi_device *dev,
2411da91b2692e0939b307f9047192d2b9fe07793e7aBill Pemberton	struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
2412c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
2413c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2414c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((data[0] != 0) && (data[0] != 1)) {
2415c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev,
2416c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			"Not a valid Data !!! ,Data should be 1 or 0\n");
2417c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
2418c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2419c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (data[0]) {
2420c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_OutputMemoryStatus = APCI3120_ENABLE;
2421c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2422c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} else {
2423c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_OutputMemoryStatus = APCI3120_DISABLE;
2424c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_DigitalOutputRegister = 0;
2425c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2426dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (!devpriv->b_OutputMemoryStatus)
2427c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Temp = 0;
2428dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini				/* if(!devpriv->b_OutputMemoryStatus ) */
2429c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2430c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2431c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2432c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2433c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2434c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
243571b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnBitsDigitalOutput(struct comedi_device *dev,    |
243690035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|		struct comedi_subdevice *s, struct comedi_insn *insn,unsigned int *data) 		 |
2437c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
2438c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2439c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : write diatal output port							     |
2440c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
2441c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
244271b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
244334c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
244490035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
2445790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data 										 |
2446356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                      data[0]     Value to be written
2447356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                      data[1]    :1 Set digital o/p ON
2448356cdbcb838ebcc234a43ec81621a39231fdcb7aBill Pemberton|                      data[1]     2 Set digital o/p OFF with memory ON
2449c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2450c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
2451c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
2452c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2453c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2454c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2455da91b2692e0939b307f9047192d2b9fe07793e7aBill Pembertonint i_APCI3120_InsnBitsDigitalOutput(struct comedi_device *dev,
245634c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				     struct comedi_subdevice *s,
245790035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton				     struct comedi_insn *insn,
245834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				     unsigned int *data)
2459c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
246057517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott	if ((data[0] > devpriv->s_EeParameters.i_DoMaxdata) || (data[0] < 0)) {
2461c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2462c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev, "Data is not valid !!! \n");
2463c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
2464c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2465c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2466c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	switch (data[1]) {
2467c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 1:
2468c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = (data[0] << 4) | devpriv->b_DigitalOutputRegister;
2469c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
2470c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2471c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 2:
2472c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = data[0];
2473c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
2474c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	default:
2475c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\nThe parameter passed is in error \n");
2476c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
24771efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	}			/*  switch(data[1]) */
2478c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outb(data[0], devpriv->iobase + APCI3120_DIGITAL_OUTPUT);
2479c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2480c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_DigitalOutputRegister = data[0] & 0xF0;
2481c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2482c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2483c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2484c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2485c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2486c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2487c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2488dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini| Function name		:int i_APCI3120_InsnWriteDigitalOutput(struct comedi_device *dev,|
2489dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini|struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)	|
2490dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini|										|
2491c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2492dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini| Task			: Write digiatl output					|
2493dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini| 										|
2494c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2495dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini| Input Parameters	: struct comedi_device *dev				|
2496dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini|			struct comedi_subdevice *s			 	|
2497dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini|			struct comedi_insn *insn				|
2498dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini|			unsigned int *data					|
2499dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini			data[0]     Value to be written
2500dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini			data[1]    :1 Set digital o/p ON
2501dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini			data[1]     2 Set digital o/p OFF with memory ON
2502c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2503dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini| Return Value		:							|
2504dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini|										|
2505c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2506c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2507c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
250834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pembertonint i_APCI3120_InsnWriteDigitalOutput(struct comedi_device *dev,
250934c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				      struct comedi_subdevice *s,
251090035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton				      struct comedi_insn *insn,
251134c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				      unsigned int *data)
2512c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
2513c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2514117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Temp1;
2515c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
25161efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	unsigned int ui_NoOfChannel = CR_CHAN(insn->chanspec);	/*  get the channel */
2517c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2518c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if ((data[0] != 0) && (data[0] != 1)) {
2519c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev,
2520c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			"Not a valid Data !!! ,Data should be 1 or 0\n");
2521c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
2522c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
252357517878df4e5769885e80aba895f4e69b1ddbe9Ian Abbott	if (ui_NoOfChannel > devpriv->s_EeParameters.i_NbrDoChannel - 1) {
2524c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		comedi_error(dev,
2525c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			"This board doesn't have specified channel !!! \n");
2526c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
2527c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2528c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2529c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	switch (data[1]) {
2530c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 1:
2531c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = (data[0] << ui_NoOfChannel);
25321efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/* ES05                   data[0]=(data[0]<<4)|ui_Temp; */
2533c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = (data[0] << 4) | devpriv->b_DigitalOutputRegister;
2534c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
2535c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2536c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	case 2:
2537c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = ~data[0] & 0x1;
2538c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Temp1 = 1;
2539c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Temp1 = ui_Temp1 << ui_NoOfChannel;
2540c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		ui_Temp1 = ui_Temp1 << 4;
25411efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/* ES05                   ui_Temp=ui_Temp|ui_Temp1; */
2542c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		devpriv->b_DigitalOutputRegister =
2543c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->b_DigitalOutputRegister | ui_Temp1;
2544c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2545c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = (data[0] << ui_NoOfChannel) ^ 0xf;
2546c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = data[0] << 4;
25471efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/* ES05                   data[0]=data[0]& ui_Temp; */
2548c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] = data[0] & devpriv->b_DigitalOutputRegister;
2549c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		break;
2550c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	default:
2551c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		printk("\nThe parameter passed is in error \n");
2552c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		return -EINVAL;
25531efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	}			/*  switch(data[1]) */
2554c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	outb(data[0], devpriv->iobase + APCI3120_DIGITAL_OUTPUT);
2555c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
25561efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/* ES05        ui_Temp=data[0] & 0xf0; */
2557c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	devpriv->b_DigitalOutputRegister = data[0] & 0xf0;
2558dae0dc30be7fa21b15a9d9534589286c6c3e68a3Bill Pemberton	return insn->n;
2559c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2560c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2561c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2562c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2563c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2564c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                            ANALOG OUTPUT SUBDEVICE                         |
2565c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2566c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2567c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2568c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH/*
2569c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
257071b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Function name     :int i_APCI3120_InsnWriteAnalogOutput(struct comedi_device *dev,|
257190035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|struct comedi_subdevice *s, struct comedi_insn *insn,unsigned int *data)			             |
2572c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                                        									 |
2573c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2574c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Task              : Write  analog output   							     |
2575c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                     										                 |
2576c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
257771b5f4f11971dea972832ad63a994c7e5b45db6bBill Pemberton| Input Parameters  : struct comedi_device *dev									 |
257834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton|                     struct comedi_subdevice *s									 |
257990035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton|                     struct comedi_insn *insn                                      |
2580790c55415aa31f4c732729f94d2c3a54f7d3bfc2Bill Pemberton|                     unsigned int *data  										 |
2581c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2582c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH| Return Value      :              					                         |
2583c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH|                    													     |
2584c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH+----------------------------------------------------------------------------+
2585c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH*/
2586c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
258734c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pembertonint i_APCI3120_InsnWriteAnalogOutput(struct comedi_device *dev,
258834c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				     struct comedi_subdevice *s,
258990035c0886b256d75bced13b3b3cea5234aff136Bill Pemberton				     struct comedi_insn *insn,
259034c43922e62708d45e9660eee4b4f1fb7b4bf2c7Bill Pemberton				     unsigned int *data)
2591c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH{
2592117102b0f6e0a9ab3ea4fa9fd89b7eb4a8888fb9Bill Pemberton	unsigned int ui_Range, ui_Channel;
2593a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton	unsigned short us_TmpValue;
2594c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2595c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_Range = CR_RANGE(insn->chanspec);
2596c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	ui_Channel = CR_CHAN(insn->chanspec);
2597c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
25981efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton	/* this_board->i_hwdrv_InsnWriteAnalogOutput(dev, ui_Range, ui_Channel,data[0]); */
2599dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	if (ui_Range) {		/*  if 1 then unipolar */
2600c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2601c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		if (data[0] != 0)
2602c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			data[0] =
2603c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				((((ui_Channel & 0x03) << 14) & 0xC000) | (1 <<
2604c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					13) | (data[0] + 8191));
2605c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		else
2606c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			data[0] =
2607c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				((((ui_Channel & 0x03) << 14) & 0xC000) | (1 <<
2608c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH					13) | 8192);
2609c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2610dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	} else {			/*  if 0 then   bipolar */
2611c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		data[0] =
2612c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			((((ui_Channel & 0x03) << 14) & 0xC000) | (0 << 13) |
2613c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			data[0]);
2614c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2615c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	}
2616c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
26171efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
26185f74ea14c07fee91d3bdbaad88bff6264c6200e6Greg Kroah-Hartman * out put n values at the given channel. printk("\nwaiting for
26191efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * DA_READY BIT");
26201efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
2621dd105f08c0e9d4081629f96b09abadc0bb51e0d8Andrea Gelmini	do {			/* Waiting of DA_READY BIT */
2622c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH		us_TmpValue =
2623a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton			((unsigned short) inw(devpriv->iobase +
2624c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH				APCI3120_RD_STATUS)) & 0x0001;
2625c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	} while (us_TmpValue != 0x0001);
2626c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2627c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	if (ui_Channel <= 3)
26281efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
26291efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * for channel 0-3 out at the register 1 (wrDac1-8) data[i]
26301efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * typecasted to ushort since word write is to be done
26311efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
2632a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton		outw((unsigned short) data[0],
2633c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_ANALOG_OUTPUT_1);
2634c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	else
26351efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton/*
26361efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * for channel 4-7 out at the register 2 (wrDac5-8) data[i]
26371efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton * typecasted to ushort since word write is to be done
26381efd18f0cca7251a283625e07dbb4ec8e95a4b6bBill Pemberton */
2639a9fce7c9a3b796334916b216a618fd7586f10d76Bill Pemberton		outw((unsigned short) data[0],
2640c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH			devpriv->iobase + APCI3120_ANALOG_OUTPUT_2);
2641c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH
2642c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH	return insn->n;
2643c995fe9475e062bab6f5a45ed28cd2d3d955ef43ADDI-DATA GmbH}
2644