/*
 * Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
 *
 *	ADDI-DATA GmbH
 *	Dieselstrasse 3
 *	D-77833 Ottersweier
 *	Tel: +19(0)7223/9493-0
 *	Fax: +49(0)7223/9493-92
 *	http://www.addi-data.com
 *	info@addi-data.com
 *
 * This 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.
 */

/* Card Specific information */
#define APCI035_BOARD_VENDOR_ID		0x15B8
#define APCI035_ADDRESS_RANGE		255

/* ANALOG INPUT RANGE */
static struct comedi_lrange range_apci035_ai = { 8, {
				       BIP_RANGE(10),
				       BIP_RANGE(5),
				       BIP_RANGE(2),
				       BIP_RANGE(1),
				       UNI_RANGE(10),
				       UNI_RANGE(5),
				       UNI_RANGE(2),
				       UNI_RANGE(1)
				       }
};

/* Timer / Watchdog Related Defines */
#define APCI035_TCW_SYNC_ENABLEDISABLE	0
#define APCI035_TCW_RELOAD_VALUE	4
#define APCI035_TCW_TIMEBASE		8
#define APCI035_TCW_PROG		12
#define APCI035_TCW_TRIG_STATUS		16
#define APCI035_TCW_IRQ			20
#define APCI035_TCW_WARN_TIMEVAL	24
#define APCI035_TCW_WARN_TIMEBASE	28

#define ADDIDATA_TIMER			0
/* #define ADDIDATA_WATCHDOG		1 */

#define APCI035_TW1                               0
#define APCI035_TW2                               32
#define APCI035_TW3                               64
#define APCI035_TW4                               96

#define APCI035_AI_OFFSET                        0
#define APCI035_TEMP                             128
#define APCI035_ALR_SEQ                          4
#define APCI035_START_STOP_INDEX                 8
#define APCI035_ALR_START_STOP                   12
#define APCI035_ALR_IRQ                          16
#define APCI035_EOS                              20
#define APCI035_CHAN_NO                          24
#define APCI035_CHAN_VAL                         28
#define APCI035_CONV_TIME_TIME_BASE	36
#define APCI035_RELOAD_CONV_TIME_VAL	32
#define APCI035_DELAY_TIME_TIME_BASE	44
#define APCI035_RELOAD_DELAY_TIME_VAL	40
#define ENABLE_EXT_TRIG			1
#define ENABLE_EXT_GATE			2
#define ENABLE_EXT_TRIG_GATE		3

#define ANALOG_INPUT			0
#define TEMPERATURE			1
#define RESISTANCE			2

#define ADDIDATA_GREATER_THAN_TEST	0
#define ADDIDATA_LESS_THAN_TEST		1

#define APCI035_MAXVOLT                         2.5

#define ADDIDATA_UNIPOLAR                        1
#define ADDIDATA_BIPOLAR                         2

/* ADDIDATA Enable Disable */
#define ADDIDATA_ENABLE				1
#define ADDIDATA_DISABLE			0

/* Hardware Layer functions for Apci035 */

/* TIMER */
/* timer value is passed as u seconds */
int i_APCI035_ConfigTimerWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
				  struct comedi_insn *insn, unsigned int *data);
int i_APCI035_StartStopWriteTimerWatchdog(struct comedi_device *dev,
					  struct comedi_subdevice *s,
					  struct comedi_insn *insn, unsigned int *data);
int i_APCI035_ReadTimerWatchdog(struct comedi_device *dev, struct comedi_subdevice *s,
				struct comedi_insn *insn, unsigned int *data);

/* Temperature Related Defines (Analog Input Subdevice) */

int i_APCI035_ConfigAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
				struct comedi_insn *insn, unsigned int *data);
int i_APCI035_ReadAnalogInput(struct comedi_device *dev, struct comedi_subdevice *s,
			      struct comedi_insn *insn, unsigned int *data);

/* Interrupt */
static void v_APCI035_Interrupt(int irq, void *d);

/* Reset functions */
int i_APCI035_Reset(struct comedi_device *dev);
