/*
    include/comedi.h (installed as /usr/include/comedi.h)
    header file for comedi

    COMEDI - Linux Control and Measurement Device Interface
    Copyright (C) 1998-2001 David A. Schleef <ds@schleef.org>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This 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.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef _COMEDI_H
#define _COMEDI_H

#define COMEDI_MAJORVERSION	0
#define COMEDI_MINORVERSION	7
#define COMEDI_MICROVERSION	76
#define VERSION	"0.7.76"

/* comedi's major device number */
#define COMEDI_MAJOR 98

/*
   maximum number of minor devices.  This can be increased, although
   kernel structures are currently statically allocated, thus you
   don't want this to be much more than you actually use.
 */
#define COMEDI_NDEVICES 16

/* number of config options in the config structure */
#define COMEDI_NDEVCONFOPTS 32
/*length of nth chunk of firmware data*/
#define COMEDI_DEVCONF_AUX_DATA3_LENGTH		25
#define COMEDI_DEVCONF_AUX_DATA2_LENGTH		26
#define COMEDI_DEVCONF_AUX_DATA1_LENGTH		27
#define COMEDI_DEVCONF_AUX_DATA0_LENGTH		28
/* most significant 32 bits of pointer address (if needed) */
#define COMEDI_DEVCONF_AUX_DATA_HI		29
/* least significant 32 bits of pointer address */
#define COMEDI_DEVCONF_AUX_DATA_LO		30
#define COMEDI_DEVCONF_AUX_DATA_LENGTH		31	/* total data length */

/* max length of device and driver names */
#define COMEDI_NAMELEN 20

/* packs and unpacks a channel/range number */

#define CR_PACK(chan, rng, aref)					\
	((((aref)&0x3)<<24) | (((rng)&0xff)<<16) | (chan))
#define CR_PACK_FLAGS(chan, range, aref, flags)				\
	(CR_PACK(chan, range, aref) | ((flags) & CR_FLAGS_MASK))

#define CR_CHAN(a)	((a)&0xffff)
#define CR_RANGE(a)	(((a)>>16)&0xff)
#define CR_AREF(a)	(((a)>>24)&0x03)

#define CR_FLAGS_MASK	0xfc000000
#define CR_ALT_FILTER	(1<<26)
#define CR_DITHER	CR_ALT_FILTER
#define CR_DEGLITCH	CR_ALT_FILTER
#define CR_ALT_SOURCE	(1<<27)
#define CR_EDGE		(1<<30)
#define CR_INVERT	(1<<31)

#define AREF_GROUND	0x00	/* analog ref = analog ground */
#define AREF_COMMON	0x01	/* analog ref = analog common */
#define AREF_DIFF	0x02	/* analog ref = differential */
#define AREF_OTHER	0x03	/* analog ref = other (undefined) */

/* counters -- these are arbitrary values */
#define GPCT_RESET		0x0001
#define GPCT_SET_SOURCE		0x0002
#define GPCT_SET_GATE		0x0004
#define GPCT_SET_DIRECTION	0x0008
#define GPCT_SET_OPERATION	0x0010
#define GPCT_ARM		0x0020
#define GPCT_DISARM		0x0040
#define GPCT_GET_INT_CLK_FRQ	0x0080

#define GPCT_INT_CLOCK		0x0001
#define GPCT_EXT_PIN		0x0002
#define GPCT_NO_GATE		0x0004
#define GPCT_UP			0x0008
#define GPCT_DOWN		0x0010
#define GPCT_HWUD		0x0020
#define GPCT_SIMPLE_EVENT	0x0040
#define GPCT_SINGLE_PERIOD	0x0080
#define GPCT_SINGLE_PW		0x0100
#define GPCT_CONT_PULSE_OUT	0x0200
#define GPCT_SINGLE_PULSE_OUT	0x0400

/* instructions */

#define INSN_MASK_WRITE		0x8000000
#define INSN_MASK_READ		0x4000000
#define INSN_MASK_SPECIAL	0x2000000

#define INSN_READ		(0 | INSN_MASK_READ)
#define INSN_WRITE		(1 | INSN_MASK_WRITE)
#define INSN_BITS		(2 | INSN_MASK_READ|INSN_MASK_WRITE)
#define INSN_CONFIG		(3 | INSN_MASK_READ|INSN_MASK_WRITE)
#define INSN_GTOD		(4 | INSN_MASK_READ|INSN_MASK_SPECIAL)
#define INSN_WAIT		(5 | INSN_MASK_WRITE|INSN_MASK_SPECIAL)
#define INSN_INTTRIG		(6 | INSN_MASK_WRITE|INSN_MASK_SPECIAL)

/* trigger flags */
/* These flags are used in comedi_trig structures */

#define TRIG_BOGUS	0x0001	/* do the motions */
#define TRIG_DITHER	0x0002	/* enable dithering */
#define TRIG_DEGLITCH	0x0004	/* enable deglitching */
	/*#define TRIG_RT       0x0008 *//* perform op in real time */
#define TRIG_CONFIG	0x0010	/* perform configuration, not triggering */
#define TRIG_WAKE_EOS	0x0020	/* wake up on end-of-scan events */
	/*#define TRIG_WRITE    0x0040*//* write to bidirectional devices */

/* command flags */
/* These flags are used in comedi_cmd structures */

/* try to use a real-time interrupt while performing command */
#define CMDF_PRIORITY		0x00000008

#define TRIG_RT		CMDF_PRIORITY	/* compatibility definition */

#define CMDF_WRITE		0x00000040
#define TRIG_WRITE	CMDF_WRITE	/* compatibility definition */

#define CMDF_RAWDATA		0x00000080

#define COMEDI_EV_START		0x00040000
#define COMEDI_EV_SCAN_BEGIN	0x00080000
#define COMEDI_EV_CONVERT	0x00100000
#define COMEDI_EV_SCAN_END	0x00200000
#define COMEDI_EV_STOP		0x00400000

#define TRIG_ROUND_MASK		0x00030000
#define TRIG_ROUND_NEAREST	0x00000000
#define TRIG_ROUND_DOWN		0x00010000
#define TRIG_ROUND_UP		0x00020000
#define TRIG_ROUND_UP_NEXT	0x00030000

/* trigger sources */

#define TRIG_ANY	0xffffffff
#define TRIG_INVALID	0x00000000

#define TRIG_NONE	0x00000001 /* never trigger */
#define TRIG_NOW	0x00000002 /* trigger now + N ns */
#define TRIG_FOLLOW	0x00000004 /* trigger on next lower level trig */
#define TRIG_TIME	0x00000008 /* trigger at time N ns */
#define TRIG_TIMER	0x00000010 /* trigger at rate N ns */
#define TRIG_COUNT	0x00000020 /* trigger when count reaches N */
#define TRIG_EXT	0x00000040 /* trigger on external signal N */
#define TRIG_INT	0x00000080 /* trigger on comedi-internal signal N */
#define TRIG_OTHER	0x00000100 /* driver defined */

/* subdevice flags */

#define SDF_BUSY	0x0001	/* device is busy */
#define SDF_BUSY_OWNER	0x0002	/* device is busy with your job */
#define SDF_LOCKED	0x0004	/* subdevice is locked */
#define SDF_LOCK_OWNER	0x0008	/* you own lock */
#define SDF_MAXDATA	0x0010	/* maxdata depends on channel */
#define SDF_FLAGS	0x0020	/* flags depend on channel */
#define SDF_RANGETYPE	0x0040	/* range type depends on channel */
#define SDF_MODE0	0x0080	/* can do mode 0 */
#define SDF_MODE1	0x0100	/* can do mode 1 */
#define SDF_MODE2	0x0200	/* can do mode 2 */
#define SDF_MODE3	0x0400	/* can do mode 3 */
#define SDF_MODE4	0x0800	/* can do mode 4 */
#define SDF_CMD		0x1000	/* can do commands (deprecated) */
#define SDF_SOFT_CALIBRATED	0x2000 /* subdevice uses software calibration */
#define SDF_CMD_WRITE		0x4000 /* can do output commands */
#define SDF_CMD_READ		0x8000 /* can do input commands */

/* subdevice can be read (e.g. analog input) */
#define SDF_READABLE	0x00010000
/* subdevice can be written (e.g. analog output) */
#define SDF_WRITABLE	0x00020000
#define SDF_WRITEABLE	SDF_WRITABLE	/* spelling error in API */
/* subdevice does not have externally visible lines */
#define SDF_INTERNAL	0x00040000
#define SDF_GROUND	0x00100000	/* can do aref=ground */
#define SDF_COMMON	0x00200000	/* can do aref=common */
#define SDF_DIFF	0x00400000	/* can do aref=diff */
#define SDF_OTHER	0x00800000	/* can do aref=other */
#define SDF_DITHER	0x01000000	/* can do dithering */
#define SDF_DEGLITCH	0x02000000	/* can do deglitching */
#define SDF_MMAP	0x04000000	/* can do mmap() */
#define SDF_RUNNING	0x08000000	/* subdevice is acquiring data */
#define SDF_LSAMPL	0x10000000	/* subdevice uses 32-bit samples */
#define SDF_PACKED	0x20000000	/* subdevice can do packed DIO */
/* re recyle these flags for PWM */
#define SDF_PWM_COUNTER SDF_MODE0	/* PWM can automatically switch off */
#define SDF_PWM_HBRIDGE SDF_MODE1	/* PWM is signed (H-bridge) */

/* subdevice types */

	enum comedi_subdevice_type {
		COMEDI_SUBD_UNUSED,	/* unused by driver */
		COMEDI_SUBD_AI,	/* analog input */
		COMEDI_SUBD_AO,	/* analog output */
		COMEDI_SUBD_DI,	/* digital input */
		COMEDI_SUBD_DO,	/* digital output */
		COMEDI_SUBD_DIO,	/* digital input/output */
		COMEDI_SUBD_COUNTER,	/* counter */
		COMEDI_SUBD_TIMER,	/* timer */
		COMEDI_SUBD_MEMORY,	/* memory, EEPROM, DPRAM */
		COMEDI_SUBD_CALIB,	/* calibration DACs */
		COMEDI_SUBD_PROC,	/* processor, DSP */
		COMEDI_SUBD_SERIAL,	/* serial IO */
		COMEDI_SUBD_PWM	/* PWM */
	};

/* configuration instructions */

	enum configuration_ids {
		INSN_CONFIG_DIO_INPUT = 0,
		INSN_CONFIG_DIO_OUTPUT = 1,
		INSN_CONFIG_DIO_OPENDRAIN = 2,
		INSN_CONFIG_ANALOG_TRIG = 16,
/*	INSN_CONFIG_WAVEFORM = 17, */
/*	INSN_CONFIG_TRIG = 18, */
/*	INSN_CONFIG_COUNTER = 19, */
		INSN_CONFIG_ALT_SOURCE = 20,
		INSN_CONFIG_DIGITAL_TRIG = 21,
		INSN_CONFIG_BLOCK_SIZE = 22,
		INSN_CONFIG_TIMER_1 = 23,
		INSN_CONFIG_FILTER = 24,
		INSN_CONFIG_CHANGE_NOTIFY = 25,

		 /*ALPHA*/ INSN_CONFIG_SERIAL_CLOCK = 26,
		INSN_CONFIG_BIDIRECTIONAL_DATA = 27,
		INSN_CONFIG_DIO_QUERY = 28,
		INSN_CONFIG_PWM_OUTPUT = 29,
		INSN_CONFIG_GET_PWM_OUTPUT = 30,
		INSN_CONFIG_ARM = 31,
		INSN_CONFIG_DISARM = 32,
		INSN_CONFIG_GET_COUNTER_STATUS = 33,
		INSN_CONFIG_RESET = 34,
		/* Use CTR as single pulsegenerator */
		INSN_CONFIG_GPCT_SINGLE_PULSE_GENERATOR = 1001,
		/* Use CTR as pulsetraingenerator */
		INSN_CONFIG_GPCT_PULSE_TRAIN_GENERATOR = 1002,
		/* Use the counter as encoder */
		INSN_CONFIG_GPCT_QUADRATURE_ENCODER = 1003,
		INSN_CONFIG_SET_GATE_SRC = 2001,	/* Set gate source */
		INSN_CONFIG_GET_GATE_SRC = 2002,	/* Get gate source */
		/* Set master clock source */
		INSN_CONFIG_SET_CLOCK_SRC = 2003,
		INSN_CONFIG_GET_CLOCK_SRC = 2004, /* Get master clock source */
		INSN_CONFIG_SET_OTHER_SRC = 2005, /* Set other source */
		/* INSN_CONFIG_GET_OTHER_SRC = 2006,*//* Get other source */
		/* Get size in bytes of subdevice's on-board fifos used during
		 * streaming input/output */
		INSN_CONFIG_GET_HARDWARE_BUFFER_SIZE = 2006,
		INSN_CONFIG_SET_COUNTER_MODE = 4097,
		/* INSN_CONFIG_8254_SET_MODE is deprecated */
		INSN_CONFIG_8254_SET_MODE = INSN_CONFIG_SET_COUNTER_MODE,
		INSN_CONFIG_8254_READ_STATUS = 4098,
		INSN_CONFIG_SET_ROUTING = 4099,
		INSN_CONFIG_GET_ROUTING = 4109,
/* PWM */
		INSN_CONFIG_PWM_SET_PERIOD = 5000,	/* sets frequency */
		INSN_CONFIG_PWM_GET_PERIOD = 5001,	/* gets frequency */
		INSN_CONFIG_GET_PWM_STATUS = 5002,	/* is it running? */
		/* sets H bridge: duty cycle and sign bit for a relay at the
		 * same time */
		INSN_CONFIG_PWM_SET_H_BRIDGE = 5003,
		/* gets H bridge data: duty cycle and the sign bit */
		INSN_CONFIG_PWM_GET_H_BRIDGE = 5004
	};

	enum comedi_io_direction {
		COMEDI_INPUT = 0,
		COMEDI_OUTPUT = 1,
		COMEDI_OPENDRAIN = 2
	};

	enum comedi_support_level {
		COMEDI_UNKNOWN_SUPPORT = 0,
		COMEDI_SUPPORTED,
		COMEDI_UNSUPPORTED
	};

/* ioctls */

#define CIO 'd'
#define COMEDI_DEVCONFIG _IOW(CIO, 0, struct comedi_devconfig)
#define COMEDI_DEVINFO _IOR(CIO, 1, struct comedi_devinfo)
#define COMEDI_SUBDINFO _IOR(CIO, 2, struct comedi_subdinfo)
#define COMEDI_CHANINFO _IOR(CIO, 3, struct comedi_chaninfo)
#define COMEDI_TRIG _IOWR(CIO, 4, comedi_trig)
#define COMEDI_LOCK _IO(CIO, 5)
#define COMEDI_UNLOCK _IO(CIO, 6)
#define COMEDI_CANCEL _IO(CIO, 7)
#define COMEDI_RANGEINFO _IOR(CIO, 8, struct comedi_rangeinfo)
#define COMEDI_CMD _IOR(CIO, 9, struct comedi_cmd)
#define COMEDI_CMDTEST _IOR(CIO, 10, struct comedi_cmd)
#define COMEDI_INSNLIST _IOR(CIO, 11, struct comedi_insnlist)
#define COMEDI_INSN _IOR(CIO, 12, struct comedi_insn)
#define COMEDI_BUFCONFIG _IOR(CIO, 13, struct comedi_bufconfig)
#define COMEDI_BUFINFO _IOWR(CIO, 14, struct comedi_bufinfo)
#define COMEDI_POLL _IO(CIO, 15)

/* structures */

	struct comedi_trig {
		unsigned int subdev;	/* subdevice */
		unsigned int mode;	/* mode */
		unsigned int flags;
		unsigned int n_chan;	/* number of channels */
		unsigned int *chanlist;	/* channel/range list */
		short *data;	/* data list, size depends on subd flags */
		unsigned int n;	/* number of scans */
		unsigned int trigsrc;
		unsigned int trigvar;
		unsigned int trigvar1;
		unsigned int data_len;
		unsigned int unused[3];
	};

	struct comedi_insn {
		unsigned int insn;
		unsigned int n;
		unsigned int __user *data;
		unsigned int subdev;
		unsigned int chanspec;
		unsigned int unused[3];
	};

	struct comedi_insnlist {
		unsigned int n_insns;
		struct comedi_insn __user *insns;
	};

	struct comedi_cmd {
		unsigned int subdev;
		unsigned int flags;

		unsigned int start_src;
		unsigned int start_arg;

		unsigned int scan_begin_src;
		unsigned int scan_begin_arg;

		unsigned int convert_src;
		unsigned int convert_arg;

		unsigned int scan_end_src;
		unsigned int scan_end_arg;

		unsigned int stop_src;
		unsigned int stop_arg;

		unsigned int __user *chanlist;	/* channel/range list */
		unsigned int chanlist_len;

		short __user *data; /* data list, size depends on subd flags */
		unsigned int data_len;
	};

	struct comedi_chaninfo {
		unsigned int subdev;
		unsigned int __user *maxdata_list;
		unsigned int __user *flaglist;
		unsigned int __user *rangelist;
		unsigned int unused[4];
	};

	struct comedi_rangeinfo {
		unsigned int range_type;
		void __user *range_ptr;
	};

	struct comedi_krange {
		int min;	/* fixed point, multiply by 1e-6 */
		int max;	/* fixed point, multiply by 1e-6 */
		unsigned int flags;
	};

	struct comedi_subdinfo {
		unsigned int type;
		unsigned int n_chan;
		unsigned int subd_flags;
		unsigned int timer_type;
		unsigned int len_chanlist;
		unsigned int maxdata;
		unsigned int flags;	/* channel flags */
		unsigned int range_type;	/* lookup in kernel */
		unsigned int settling_time_0;
		/* see support_level enum for values */
		unsigned insn_bits_support;
		unsigned int unused[8];
	};

	struct comedi_devinfo {
		unsigned int version_code;
		unsigned int n_subdevs;
		char driver_name[COMEDI_NAMELEN];
		char board_name[COMEDI_NAMELEN];
		int read_subdevice;
		int write_subdevice;
		int unused[30];
	};

	struct comedi_devconfig {
		char board_name[COMEDI_NAMELEN];
		int options[COMEDI_NDEVCONFOPTS];
	};

	struct comedi_bufconfig {
		unsigned int subdevice;
		unsigned int flags;

		unsigned int maximum_size;
		unsigned int size;

		unsigned int unused[4];
	};

	struct comedi_bufinfo {
		unsigned int subdevice;
		unsigned int bytes_read;

		unsigned int buf_write_ptr;
		unsigned int buf_read_ptr;
		unsigned int buf_write_count;
		unsigned int buf_read_count;

		unsigned int bytes_written;

		unsigned int unused[4];
	};

/* range stuff */

#define __RANGE(a, b)	((((a)&0xffff)<<16)|((b)&0xffff))

#define RANGE_OFFSET(a)		(((a)>>16)&0xffff)
#define RANGE_LENGTH(b)		((b)&0xffff)

#define RF_UNIT(flags)		((flags)&0xff)
#define RF_EXTERNAL		(1<<8)

#define UNIT_volt		0
#define UNIT_mA			1
#define UNIT_none		2

#define COMEDI_MIN_SPEED	((unsigned int)0xffffffff)

/* callback stuff */
/* only relevant to kernel modules. */

#define COMEDI_CB_EOS		1	/* end of scan */
#define COMEDI_CB_EOA		2	/* end of acquisition/output */
#define COMEDI_CB_BLOCK		4	/* data has arrived:
					 * wakes up read() / write() */
#define COMEDI_CB_EOBUF		8	/* DEPRECATED: end of buffer */
#define COMEDI_CB_ERROR		16	/* card error during acquisition */
#define COMEDI_CB_OVERFLOW	32	/* buffer overflow/underflow */

/**********************************************************/
/* everything after this line is ALPHA */
/**********************************************************/

/*
  8254 specific configuration.

  It supports two config commands:

  0 ID: INSN_CONFIG_SET_COUNTER_MODE
  1 8254 Mode
    I8254_MODE0, I8254_MODE1, ..., I8254_MODE5
    OR'ed with:
    I8254_BCD, I8254_BINARY

  0 ID: INSN_CONFIG_8254_READ_STATUS
  1 <-- Status byte returned here.
    B7 = Output
    B6 = NULL Count
    B5 - B0 Current mode.

*/

	enum i8254_mode {
		I8254_MODE0 = (0 << 1),	/* Interrupt on terminal count */
		I8254_MODE1 = (1 << 1),	/* Hardware retriggerable one-shot */
		I8254_MODE2 = (2 << 1),	/* Rate generator */
		I8254_MODE3 = (3 << 1),	/* Square wave mode */
		I8254_MODE4 = (4 << 1),	/* Software triggered strobe */
		I8254_MODE5 = (5 << 1),	/* Hardware triggered strobe
					 * (retriggerable) */
		I8254_BCD = 1,	/* use binary-coded decimal instead of binary
				 * (pretty useless) */
		I8254_BINARY = 0
	};

	static inline unsigned NI_USUAL_PFI_SELECT(unsigned pfi_channel)
	{
		if (pfi_channel < 10)
			return 0x1 + pfi_channel;
		else
			return 0xb + pfi_channel;
	}

	static inline unsigned NI_USUAL_RTSI_SELECT(unsigned rtsi_channel)
	{
		if (rtsi_channel < 7)
			return 0xb + rtsi_channel;
		else
			return 0x1b;
	}

/* mode bits for NI general-purpose counters, set with
 * INSN_CONFIG_SET_COUNTER_MODE */
#define NI_GPCT_COUNTING_MODE_SHIFT 16
#define NI_GPCT_INDEX_PHASE_BITSHIFT 20
#define NI_GPCT_COUNTING_DIRECTION_SHIFT 24
	enum ni_gpct_mode_bits {
		NI_GPCT_GATE_ON_BOTH_EDGES_BIT = 0x4,
		NI_GPCT_EDGE_GATE_MODE_MASK = 0x18,
		NI_GPCT_EDGE_GATE_STARTS_STOPS_BITS = 0x0,
		NI_GPCT_EDGE_GATE_STOPS_STARTS_BITS = 0x8,
		NI_GPCT_EDGE_GATE_STARTS_BITS = 0x10,
		NI_GPCT_EDGE_GATE_NO_STARTS_NO_STOPS_BITS = 0x18,
		NI_GPCT_STOP_MODE_MASK = 0x60,
		NI_GPCT_STOP_ON_GATE_BITS = 0x00,
		NI_GPCT_STOP_ON_GATE_OR_TC_BITS = 0x20,
		NI_GPCT_STOP_ON_GATE_OR_SECOND_TC_BITS = 0x40,
		NI_GPCT_LOAD_B_SELECT_BIT = 0x80,
		NI_GPCT_OUTPUT_MODE_MASK = 0x300,
		NI_GPCT_OUTPUT_TC_PULSE_BITS = 0x100,
		NI_GPCT_OUTPUT_TC_TOGGLE_BITS = 0x200,
		NI_GPCT_OUTPUT_TC_OR_GATE_TOGGLE_BITS = 0x300,
		NI_GPCT_HARDWARE_DISARM_MASK = 0xc00,
		NI_GPCT_NO_HARDWARE_DISARM_BITS = 0x000,
		NI_GPCT_DISARM_AT_TC_BITS = 0x400,
		NI_GPCT_DISARM_AT_GATE_BITS = 0x800,
		NI_GPCT_DISARM_AT_TC_OR_GATE_BITS = 0xc00,
		NI_GPCT_LOADING_ON_TC_BIT = 0x1000,
		NI_GPCT_LOADING_ON_GATE_BIT = 0x4000,
		NI_GPCT_COUNTING_MODE_MASK = 0x7 << NI_GPCT_COUNTING_MODE_SHIFT,
		NI_GPCT_COUNTING_MODE_NORMAL_BITS =
		    0x0 << NI_GPCT_COUNTING_MODE_SHIFT,
		NI_GPCT_COUNTING_MODE_QUADRATURE_X1_BITS =
		    0x1 << NI_GPCT_COUNTING_MODE_SHIFT,
		NI_GPCT_COUNTING_MODE_QUADRATURE_X2_BITS =
		    0x2 << NI_GPCT_COUNTING_MODE_SHIFT,
		NI_GPCT_COUNTING_MODE_QUADRATURE_X4_BITS =
		    0x3 << NI_GPCT_COUNTING_MODE_SHIFT,
		NI_GPCT_COUNTING_MODE_TWO_PULSE_BITS =
		    0x4 << NI_GPCT_COUNTING_MODE_SHIFT,
		NI_GPCT_COUNTING_MODE_SYNC_SOURCE_BITS =
		    0x6 << NI_GPCT_COUNTING_MODE_SHIFT,
		NI_GPCT_INDEX_PHASE_MASK = 0x3 << NI_GPCT_INDEX_PHASE_BITSHIFT,
		NI_GPCT_INDEX_PHASE_LOW_A_LOW_B_BITS =
		    0x0 << NI_GPCT_INDEX_PHASE_BITSHIFT,
		NI_GPCT_INDEX_PHASE_LOW_A_HIGH_B_BITS =
		    0x1 << NI_GPCT_INDEX_PHASE_BITSHIFT,
		NI_GPCT_INDEX_PHASE_HIGH_A_LOW_B_BITS =
		    0x2 << NI_GPCT_INDEX_PHASE_BITSHIFT,
		NI_GPCT_INDEX_PHASE_HIGH_A_HIGH_B_BITS =
		    0x3 << NI_GPCT_INDEX_PHASE_BITSHIFT,
		NI_GPCT_INDEX_ENABLE_BIT = 0x400000,
		NI_GPCT_COUNTING_DIRECTION_MASK =
		    0x3 << NI_GPCT_COUNTING_DIRECTION_SHIFT,
		NI_GPCT_COUNTING_DIRECTION_DOWN_BITS =
		    0x00 << NI_GPCT_COUNTING_DIRECTION_SHIFT,
		NI_GPCT_COUNTING_DIRECTION_UP_BITS =
		    0x1 << NI_GPCT_COUNTING_DIRECTION_SHIFT,
		NI_GPCT_COUNTING_DIRECTION_HW_UP_DOWN_BITS =
		    0x2 << NI_GPCT_COUNTING_DIRECTION_SHIFT,
		NI_GPCT_COUNTING_DIRECTION_HW_GATE_BITS =
		    0x3 << NI_GPCT_COUNTING_DIRECTION_SHIFT,
		NI_GPCT_RELOAD_SOURCE_MASK = 0xc000000,
		NI_GPCT_RELOAD_SOURCE_FIXED_BITS = 0x0,
		NI_GPCT_RELOAD_SOURCE_SWITCHING_BITS = 0x4000000,
		NI_GPCT_RELOAD_SOURCE_GATE_SELECT_BITS = 0x8000000,
		NI_GPCT_OR_GATE_BIT = 0x10000000,
		NI_GPCT_INVERT_OUTPUT_BIT = 0x20000000
	};

/* Bits for setting a clock source with
 * INSN_CONFIG_SET_CLOCK_SRC when using NI general-purpose counters. */
	enum ni_gpct_clock_source_bits {
		NI_GPCT_CLOCK_SRC_SELECT_MASK = 0x3f,
		NI_GPCT_TIMEBASE_1_CLOCK_SRC_BITS = 0x0,
		NI_GPCT_TIMEBASE_2_CLOCK_SRC_BITS = 0x1,
		NI_GPCT_TIMEBASE_3_CLOCK_SRC_BITS = 0x2,
		NI_GPCT_LOGIC_LOW_CLOCK_SRC_BITS = 0x3,
		NI_GPCT_NEXT_GATE_CLOCK_SRC_BITS = 0x4,
		NI_GPCT_NEXT_TC_CLOCK_SRC_BITS = 0x5,
		/* NI 660x-specific */
		NI_GPCT_SOURCE_PIN_i_CLOCK_SRC_BITS = 0x6,
		NI_GPCT_PXI10_CLOCK_SRC_BITS = 0x7,
		NI_GPCT_PXI_STAR_TRIGGER_CLOCK_SRC_BITS = 0x8,
		NI_GPCT_ANALOG_TRIGGER_OUT_CLOCK_SRC_BITS = 0x9,
		NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK = 0x30000000,
		NI_GPCT_NO_PRESCALE_CLOCK_SRC_BITS = 0x0,
		/* divide source by 2 */
		NI_GPCT_PRESCALE_X2_CLOCK_SRC_BITS = 0x10000000,
		/* divide source by 8 */
		NI_GPCT_PRESCALE_X8_CLOCK_SRC_BITS = 0x20000000,
		NI_GPCT_INVERT_CLOCK_SRC_BIT = 0x80000000
	};
	static inline unsigned NI_GPCT_SOURCE_PIN_CLOCK_SRC_BITS(unsigned n)
	{
		/* NI 660x-specific */
		return 0x10 + n;
	}
	static inline unsigned NI_GPCT_RTSI_CLOCK_SRC_BITS(unsigned n)
	{
		return 0x18 + n;
	}
	static inline unsigned NI_GPCT_PFI_CLOCK_SRC_BITS(unsigned n)
	{
		/* no pfi on NI 660x */
		return 0x20 + n;
	}

/* Possibilities for setting a gate source with
INSN_CONFIG_SET_GATE_SRC when using NI general-purpose counters.
May be bitwise-or'd with CR_EDGE or CR_INVERT. */
	enum ni_gpct_gate_select {
		/* m-series gates */
		NI_GPCT_TIMESTAMP_MUX_GATE_SELECT = 0x0,
		NI_GPCT_AI_START2_GATE_SELECT = 0x12,
		NI_GPCT_PXI_STAR_TRIGGER_GATE_SELECT = 0x13,
		NI_GPCT_NEXT_OUT_GATE_SELECT = 0x14,
		NI_GPCT_AI_START1_GATE_SELECT = 0x1c,
		NI_GPCT_NEXT_SOURCE_GATE_SELECT = 0x1d,
		NI_GPCT_ANALOG_TRIGGER_OUT_GATE_SELECT = 0x1e,
		NI_GPCT_LOGIC_LOW_GATE_SELECT = 0x1f,
		/* more gates for 660x */
		NI_GPCT_SOURCE_PIN_i_GATE_SELECT = 0x100,
		NI_GPCT_GATE_PIN_i_GATE_SELECT = 0x101,
		/* more gates for 660x "second gate" */
		NI_GPCT_UP_DOWN_PIN_i_GATE_SELECT = 0x201,
		NI_GPCT_SELECTED_GATE_GATE_SELECT = 0x21e,
		/* m-series "second gate" sources are unknown,
		 * we should add them here with an offset of 0x300 when
		 * known. */
		NI_GPCT_DISABLED_GATE_SELECT = 0x8000,
	};
	static inline unsigned NI_GPCT_GATE_PIN_GATE_SELECT(unsigned n)
	{
		return 0x102 + n;
	}
	static inline unsigned NI_GPCT_RTSI_GATE_SELECT(unsigned n)
	{
		return NI_USUAL_RTSI_SELECT(n);
	}
	static inline unsigned NI_GPCT_PFI_GATE_SELECT(unsigned n)
	{
		return NI_USUAL_PFI_SELECT(n);
	}
	static inline unsigned NI_GPCT_UP_DOWN_PIN_GATE_SELECT(unsigned n)
	{
		return 0x202 + n;
	}

/* Possibilities for setting a source with
INSN_CONFIG_SET_OTHER_SRC when using NI general-purpose counters. */
	enum ni_gpct_other_index {
		NI_GPCT_SOURCE_ENCODER_A,
		NI_GPCT_SOURCE_ENCODER_B,
		NI_GPCT_SOURCE_ENCODER_Z
	};
	enum ni_gpct_other_select {
		/* m-series gates */
		/* Still unknown, probably only need NI_GPCT_PFI_OTHER_SELECT */
		NI_GPCT_DISABLED_OTHER_SELECT = 0x8000,
	};
	static inline unsigned NI_GPCT_PFI_OTHER_SELECT(unsigned n)
	{
		return NI_USUAL_PFI_SELECT(n);
	}

/* start sources for ni general-purpose counters for use with
INSN_CONFIG_ARM */
	enum ni_gpct_arm_source {
		NI_GPCT_ARM_IMMEDIATE = 0x0,
		NI_GPCT_ARM_PAIRED_IMMEDIATE = 0x1, /* Start both the counter
						     * and the adjacent paired
						     * counter simultaneously */
		/* NI doesn't document bits for selecting hardware arm triggers.
		 * If the NI_GPCT_ARM_UNKNOWN bit is set, we will pass the least
		 * significant bits (3 bits for 660x or 5 bits for m-series)
		 * through to the hardware.  This will at least allow someone to
		 * figure out what the bits do later. */
		NI_GPCT_ARM_UNKNOWN = 0x1000,
	};

/* digital filtering options for ni 660x for use with INSN_CONFIG_FILTER. */
	enum ni_gpct_filter_select {
		NI_GPCT_FILTER_OFF = 0x0,
		NI_GPCT_FILTER_TIMEBASE_3_SYNC = 0x1,
		NI_GPCT_FILTER_100x_TIMEBASE_1 = 0x2,
		NI_GPCT_FILTER_20x_TIMEBASE_1 = 0x3,
		NI_GPCT_FILTER_10x_TIMEBASE_1 = 0x4,
		NI_GPCT_FILTER_2x_TIMEBASE_1 = 0x5,
		NI_GPCT_FILTER_2x_TIMEBASE_3 = 0x6
	};

/* PFI digital filtering options for ni m-series for use with
 * INSN_CONFIG_FILTER. */
	enum ni_pfi_filter_select {
		NI_PFI_FILTER_OFF = 0x0,
		NI_PFI_FILTER_125ns = 0x1,
		NI_PFI_FILTER_6425ns = 0x2,
		NI_PFI_FILTER_2550us = 0x3
	};

/* master clock sources for ni mio boards and INSN_CONFIG_SET_CLOCK_SRC */
	enum ni_mio_clock_source {
		NI_MIO_INTERNAL_CLOCK = 0,
		NI_MIO_RTSI_CLOCK = 1,	/* doesn't work for m-series, use
					   NI_MIO_PLL_RTSI_CLOCK() */
		/* the NI_MIO_PLL_* sources are m-series only */
		NI_MIO_PLL_PXI_STAR_TRIGGER_CLOCK = 2,
		NI_MIO_PLL_PXI10_CLOCK = 3,
		NI_MIO_PLL_RTSI0_CLOCK = 4
	};
	static inline unsigned NI_MIO_PLL_RTSI_CLOCK(unsigned rtsi_channel)
	{
		return NI_MIO_PLL_RTSI0_CLOCK + rtsi_channel;
	}

/* Signals which can be routed to an NI RTSI pin with INSN_CONFIG_SET_ROUTING.
 The numbers assigned are not arbitrary, they correspond to the bits required
 to program the board. */
	enum ni_rtsi_routing {
		NI_RTSI_OUTPUT_ADR_START1 = 0,
		NI_RTSI_OUTPUT_ADR_START2 = 1,
		NI_RTSI_OUTPUT_SCLKG = 2,
		NI_RTSI_OUTPUT_DACUPDN = 3,
		NI_RTSI_OUTPUT_DA_START1 = 4,
		NI_RTSI_OUTPUT_G_SRC0 = 5,
		NI_RTSI_OUTPUT_G_GATE0 = 6,
		NI_RTSI_OUTPUT_RGOUT0 = 7,
		NI_RTSI_OUTPUT_RTSI_BRD_0 = 8,
		NI_RTSI_OUTPUT_RTSI_OSC = 12	/* pre-m-series always have RTSI
						 * clock on line 7 */
	};
	static inline unsigned NI_RTSI_OUTPUT_RTSI_BRD(unsigned n)
	{
		return NI_RTSI_OUTPUT_RTSI_BRD_0 + n;
	}

/* Signals which can be routed to an NI PFI pin on an m-series board with
 * INSN_CONFIG_SET_ROUTING.  These numbers are also returned by
 * INSN_CONFIG_GET_ROUTING on pre-m-series boards, even though their routing
 * cannot be changed.  The numbers assigned are not arbitrary, they correspond
 * to the bits required to program the board. */
	enum ni_pfi_routing {
		NI_PFI_OUTPUT_PFI_DEFAULT = 0,
		NI_PFI_OUTPUT_AI_START1 = 1,
		NI_PFI_OUTPUT_AI_START2 = 2,
		NI_PFI_OUTPUT_AI_CONVERT = 3,
		NI_PFI_OUTPUT_G_SRC1 = 4,
		NI_PFI_OUTPUT_G_GATE1 = 5,
		NI_PFI_OUTPUT_AO_UPDATE_N = 6,
		NI_PFI_OUTPUT_AO_START1 = 7,
		NI_PFI_OUTPUT_AI_START_PULSE = 8,
		NI_PFI_OUTPUT_G_SRC0 = 9,
		NI_PFI_OUTPUT_G_GATE0 = 10,
		NI_PFI_OUTPUT_EXT_STROBE = 11,
		NI_PFI_OUTPUT_AI_EXT_MUX_CLK = 12,
		NI_PFI_OUTPUT_GOUT0 = 13,
		NI_PFI_OUTPUT_GOUT1 = 14,
		NI_PFI_OUTPUT_FREQ_OUT = 15,
		NI_PFI_OUTPUT_PFI_DO = 16,
		NI_PFI_OUTPUT_I_ATRIG = 17,
		NI_PFI_OUTPUT_RTSI0 = 18,
		NI_PFI_OUTPUT_PXI_STAR_TRIGGER_IN = 26,
		NI_PFI_OUTPUT_SCXI_TRIG1 = 27,
		NI_PFI_OUTPUT_DIO_CHANGE_DETECT_RTSI = 28,
		NI_PFI_OUTPUT_CDI_SAMPLE = 29,
		NI_PFI_OUTPUT_CDO_UPDATE = 30
	};
	static inline unsigned NI_PFI_OUTPUT_RTSI(unsigned rtsi_channel)
	{
		return NI_PFI_OUTPUT_RTSI0 + rtsi_channel;
	}

/* Signals which can be routed to output on a NI PFI pin on a 660x board
 with INSN_CONFIG_SET_ROUTING.  The numbers assigned are
 not arbitrary, they correspond to the bits required
 to program the board.  Lines 0 to 7 can only be set to
 NI_660X_PFI_OUTPUT_DIO.  Lines 32 to 39 can only be set to
 NI_660X_PFI_OUTPUT_COUNTER. */
	enum ni_660x_pfi_routing {
		NI_660X_PFI_OUTPUT_COUNTER = 1,	/* counter */
		NI_660X_PFI_OUTPUT_DIO = 2,	/* static digital output */
	};

/* NI External Trigger lines.  These values are not arbitrary, but are related
 * to the bits required to program the board (offset by 1 for historical
 * reasons). */
	static inline unsigned NI_EXT_PFI(unsigned pfi_channel)
	{
		return NI_USUAL_PFI_SELECT(pfi_channel) - 1;
	}
	static inline unsigned NI_EXT_RTSI(unsigned rtsi_channel)
	{
		return NI_USUAL_RTSI_SELECT(rtsi_channel) - 1;
	}

/* status bits for INSN_CONFIG_GET_COUNTER_STATUS */
	enum comedi_counter_status_flags {
		COMEDI_COUNTER_ARMED = 0x1,
		COMEDI_COUNTER_COUNTING = 0x2,
		COMEDI_COUNTER_TERMINAL_COUNT = 0x4,
	};

/* Clock sources for CDIO subdevice on NI m-series boards.  Used as the
 * scan_begin_arg for a comedi_command. These sources may also be bitwise-or'd
 * with CR_INVERT to change polarity. */
	enum ni_m_series_cdio_scan_begin_src {
		NI_CDIO_SCAN_BEGIN_SRC_GROUND = 0,
		NI_CDIO_SCAN_BEGIN_SRC_AI_START = 18,
		NI_CDIO_SCAN_BEGIN_SRC_AI_CONVERT = 19,
		NI_CDIO_SCAN_BEGIN_SRC_PXI_STAR_TRIGGER = 20,
		NI_CDIO_SCAN_BEGIN_SRC_G0_OUT = 28,
		NI_CDIO_SCAN_BEGIN_SRC_G1_OUT = 29,
		NI_CDIO_SCAN_BEGIN_SRC_ANALOG_TRIGGER = 30,
		NI_CDIO_SCAN_BEGIN_SRC_AO_UPDATE = 31,
		NI_CDIO_SCAN_BEGIN_SRC_FREQ_OUT = 32,
		NI_CDIO_SCAN_BEGIN_SRC_DIO_CHANGE_DETECT_IRQ = 33
	};
	static inline unsigned NI_CDIO_SCAN_BEGIN_SRC_PFI(unsigned pfi_channel)
	{
		return NI_USUAL_PFI_SELECT(pfi_channel);
	}
	static inline unsigned
		NI_CDIO_SCAN_BEGIN_SRC_RTSI(unsigned rtsi_channel)
	{
		return NI_USUAL_RTSI_SELECT(rtsi_channel);
	}

/* scan_begin_src for scan_begin_arg==TRIG_EXT with analog output command on NI
 * boards.  These scan begin sources can also be bitwise-or'd with CR_INVERT to
 * change polarity. */
	static inline unsigned NI_AO_SCAN_BEGIN_SRC_PFI(unsigned pfi_channel)
	{
		return NI_USUAL_PFI_SELECT(pfi_channel);
	}
	static inline unsigned NI_AO_SCAN_BEGIN_SRC_RTSI(unsigned rtsi_channel)
	{
		return NI_USUAL_RTSI_SELECT(rtsi_channel);
	}

/* Bits for setting a clock source with
 * INSN_CONFIG_SET_CLOCK_SRC when using NI frequency output subdevice. */
	enum ni_freq_out_clock_source_bits {
		NI_FREQ_OUT_TIMEBASE_1_DIV_2_CLOCK_SRC,	/* 10 MHz */
		NI_FREQ_OUT_TIMEBASE_2_CLOCK_SRC	/* 100 KHz */
	};

/* Values for setting a clock source with INSN_CONFIG_SET_CLOCK_SRC for
 * 8254 counter subdevices on Amplicon DIO boards (amplc_dio200 driver). */
	enum amplc_dio_clock_source {
		AMPLC_DIO_CLK_CLKN,	/* per channel external clock
					   input/output pin (pin is only an
					   input when clock source set to this
					   value, otherwise it is an output) */
		AMPLC_DIO_CLK_10MHZ,	/* 10 MHz internal clock */
		AMPLC_DIO_CLK_1MHZ,	/* 1 MHz internal clock */
		AMPLC_DIO_CLK_100KHZ,	/* 100 kHz internal clock */
		AMPLC_DIO_CLK_10KHZ,	/* 10 kHz internal clock */
		AMPLC_DIO_CLK_1KHZ,	/* 1 kHz internal clock */
		AMPLC_DIO_CLK_OUTNM1,	/* output of preceding counter channel
					   (for channel 0, preceding counter
					   channel is channel 2 on preceding
					   counter subdevice, for first counter
					   subdevice, preceding counter
					   subdevice is the last counter
					   subdevice) */
		AMPLC_DIO_CLK_EXT	/* per chip external input pin */
	};

/* Values for setting a gate source with INSN_CONFIG_SET_GATE_SRC for
 * 8254 counter subdevices on Amplicon DIO boards (amplc_dio200 driver). */
	enum amplc_dio_gate_source {
		AMPLC_DIO_GAT_VCC,	/* internal high logic level */
		AMPLC_DIO_GAT_GND,	/* internal low logic level */
		AMPLC_DIO_GAT_GATN,	/* per channel external gate input */
		AMPLC_DIO_GAT_NOUTNM2,	/* negated output of counter channel
					   minus 2 (for channels 0 or 1,
					   channel minus 2 is channel 1 or 2 on
					   the preceding counter subdevice, for
					   the first counter subdevice the
					   preceding counter subdevice is the
					   last counter subdevice) */
		AMPLC_DIO_GAT_RESERVED4,
		AMPLC_DIO_GAT_RESERVED5,
		AMPLC_DIO_GAT_RESERVED6,
		AMPLC_DIO_GAT_RESERVED7
	};

#endif /* _COMEDI_H */
