/** * @file * Analogy for Linux, UAPI bits * @note Copyright (C) 1997-2000 David A. Schleef * @note Copyright (C) 2008 Alexis Berlemont * * This library 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 library 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 * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _RTDM_UAPI_ANALOGY_H #define _RTDM_UAPI_ANALOGY_H /* --- Misc precompilation constant --- */ #define A4L_NAMELEN 20 #define A4L_INFINITE 0 #define A4L_NONBLOCK (-1) /* --- Common Analogy types --- */ typedef unsigned short sampl_t; typedef unsigned long lsampl_t; /* MMAP ioctl argument structure */ struct a4l_mmap_arg { unsigned int idx_subd; unsigned long size; void *ptr; }; typedef struct a4l_mmap_arg a4l_mmap_t; /* Constants related with buffer size (might be used with BUFCFG ioctl) */ #define A4L_BUF_MAXSIZE 0x1000000 #define A4L_BUF_DEFSIZE 0x10000 #define A4L_BUF_DEFMAGIC 0xffaaff55 /* BUFCFG ioctl argument structure */ struct a4l_buffer_config { /* NOTE: with the last buffer implementation, the field idx_subd became useless; the buffer are now per-context. So, the buffer size configuration is specific to an opened device. There is a little exception: we can define a default buffer size for a device. So far, a hack is used to implement the configuration of the default buffer size */ unsigned int idx_subd; unsigned long buf_size; }; typedef struct a4l_buffer_config a4l_bufcfg_t; /* BUFINFO ioctl argument structure */ struct a4l_buffer_info { unsigned int idx_subd; unsigned long buf_size; unsigned long rw_count; }; typedef struct a4l_buffer_info a4l_bufinfo_t; /* BUFCFG2 / BUFINFO2 ioctl argument structure */ struct a4l_buffer_config2 { unsigned long wake_count; unsigned long reserved[3]; }; typedef struct a4l_buffer_config2 a4l_bufcfg2_t; /* POLL ioctl argument structure */ struct a4l_poll { unsigned int idx_subd; unsigned long arg; }; typedef struct a4l_poll a4l_poll_t; /* DEVCFG ioctl argument structure */ struct a4l_link_desc { unsigned char bname_size; char *bname; unsigned int opts_size; void *opts; }; typedef struct a4l_link_desc a4l_lnkdesc_t; /* DEVINFO ioctl argument structure */ struct a4l_dev_info { char board_name[A4L_NAMELEN]; char driver_name[A4L_NAMELEN]; int nb_subd; int idx_read_subd; int idx_write_subd; }; typedef struct a4l_dev_info a4l_dvinfo_t; #define CIO 'd' #define A4L_DEVCFG _IOW(CIO,0,a4l_lnkdesc_t) #define A4L_DEVINFO _IOR(CIO,1,a4l_dvinfo_t) #define A4L_SUBDINFO _IOR(CIO,2,a4l_sbinfo_t) #define A4L_CHANINFO _IOR(CIO,3,a4l_chinfo_arg_t) #define A4L_RNGINFO _IOR(CIO,4,a4l_rnginfo_arg_t) #define A4L_CMD _IOWR(CIO,5,a4l_cmd_t) #define A4L_CANCEL _IOR(CIO,6,unsigned int) #define A4L_INSNLIST _IOR(CIO,7,unsigned int) #define A4L_INSN _IOR(CIO,8,unsigned int) #define A4L_BUFCFG _IOR(CIO,9,a4l_bufcfg_t) #define A4L_BUFINFO _IOWR(CIO,10,a4l_bufinfo_t) #define A4L_POLL _IOR(CIO,11,unsigned int) #define A4L_MMAP _IOWR(CIO,12,unsigned int) #define A4L_NBCHANINFO _IOR(CIO,13,a4l_chinfo_arg_t) #define A4L_NBRNGINFO _IOR(CIO,14,a4l_rnginfo_arg_t) /* These IOCTLs are bound to be merged with A4L_BUFCFG and A4L_BUFINFO at the next major release */ #define A4L_BUFCFG2 _IOR(CIO,15,a4l_bufcfg_t) #define A4L_BUFINFO2 _IOWR(CIO,16,a4l_bufcfg_t) /*! * @addtogroup analogy_lib_async1 * @{ */ /*! * @anchor ANALOGY_CMD_xxx @name ANALOGY_CMD_xxx * @brief Common command flags definitions * @{ */ /** * Do not execute the command, just check it */ #define A4L_CMD_SIMUL 0x1 /** * Perform data recovery / transmission in bulk mode */ #define A4L_CMD_BULK 0x2 /** * Perform a command which will write data to the device */ #define A4L_CMD_WRITE 0x4 /*! @} ANALOGY_CMD_xxx */ /*! * @anchor TRIG_xxx @name TRIG_xxx * @brief Command triggers flags definitions * @{ */ /** * Never trigger */ #define TRIG_NONE 0x00000001 /** * Trigger now + N ns */ #define TRIG_NOW 0x00000002 /** * Trigger on next lower level trig */ #define TRIG_FOLLOW 0x00000004 /** * Trigger at time N ns */ #define TRIG_TIME 0x00000008 /** * Trigger at rate N ns */ #define TRIG_TIMER 0x00000010 /** * Trigger when count reaches N */ #define TRIG_COUNT 0x00000020 /** * Trigger on external signal N */ #define TRIG_EXT 0x00000040 /** * Trigger on analogy-internal signal N */ #define TRIG_INT 0x00000080 /** * Driver defined trigger */ #define TRIG_OTHER 0x00000100 /** * Wake up on end-of-scan */ #define TRIG_WAKE_EOS 0x0020 /** * Trigger not implemented yet */ #define TRIG_ROUND_MASK 0x00030000 /** * Trigger not implemented yet */ #define TRIG_ROUND_NEAREST 0x00000000 /** * Trigger not implemented yet */ #define TRIG_ROUND_DOWN 0x00010000 /** * Trigger not implemented yet */ #define TRIG_ROUND_UP 0x00020000 /** * Trigger not implemented yet */ #define TRIG_ROUND_UP_NEXT 0x00030000 /*! @} TRIG_xxx */ /*! * @anchor CHAN_RNG_AREF @name Channel macros * @brief Specific precompilation macros and constants useful for the * channels descriptors tab located in the command structure * @{ */ /** * Channel indication macro */ #define CHAN(a) ((a) & 0xffff) /** * Range definition macro */ #define RNG(a) (((a) & 0xff) << 16) /** * Reference definition macro */ #define AREF(a) (((a) & 0x03) << 24) /** * Flags definition macro */ #define FLAGS(a) ((a) & CR_FLAGS_MASK) /** * Channel + range + reference definition macro */ #define PACK(a, b, c) (a | RNG(b) | AREF(c)) /** * Channel + range + reference + flags definition macro */ #define PACK_FLAGS(a, b, c, d) (PACK(a, b, c) | FLAGS(d)) /** * Analog reference is analog ground */ #define AREF_GROUND 0x00 /** * Analog reference is analog common */ #define AREF_COMMON 0x01 /** * Analog reference is differential */ #define AREF_DIFF 0x02 /** * Analog reference is undefined */ #define AREF_OTHER 0x03 /*! @} CHAN_RNG_AREF */ #if !defined(DOXYGEN_CPP) #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) #endif /* !DOXYGEN_CPP */ /*! * @brief Structure describing the asynchronous instruction * @see a4l_snd_command() */ struct a4l_cmd_desc { unsigned char idx_subd; /**< Subdevice to which the command will be applied. */ unsigned long flags; /**< Command flags */ /* Command trigger characteristics */ unsigned int start_src; /**< Start trigger type */ unsigned int start_arg; /**< Start trigger argument */ unsigned int scan_begin_src; /**< Scan begin trigger type */ unsigned int scan_begin_arg; /**< Scan begin trigger argument */ unsigned int convert_src; /**< Convert trigger type */ unsigned int convert_arg; /**< Convert trigger argument */ unsigned int scan_end_src; /**< Scan end trigger type */ unsigned int scan_end_arg; /**< Scan end trigger argument */ unsigned int stop_src; /**< Stop trigger type */ unsigned int stop_arg; /**< Stop trigger argument */ unsigned char nb_chan; /**< Count of channels related with the command */ unsigned int *chan_descs; /**< Tab containing channels descriptors */ /* Driver specific fields */ unsigned int valid_simul_stages; /** < cmd simulation valid stages (driver dependent) */ unsigned int data_len; /**< Driver specific buffer size */ sampl_t *data; /**< Driver specific buffer pointer */ }; typedef struct a4l_cmd_desc a4l_cmd_t; /*! @} analogy_lib_async1 */ /* --- Range section --- */ /** Constant for internal use only (must not be used by driver developer). */ #define A4L_RNG_FACTOR 1000000 /** * Volt unit range flag */ #define A4L_RNG_VOLT_UNIT 0x0 /** * MilliAmpere unit range flag */ #define A4L_RNG_MAMP_UNIT 0x1 /** * No unit range flag */ #define A4L_RNG_NO_UNIT 0x2 /** * External unit range flag */ #define A4L_RNG_EXT_UNIT 0x4 /** * Macro to retrieve the range unit from the range flags */ #define A4L_RNG_UNIT(x) (x & (A4L_RNG_VOLT_UNIT | \ A4L_RNG_MAMP_UNIT | \ A4L_RNG_NO_UNIT | \ A4L_RNG_EXT_UNIT)) /* --- Subdevice flags desc stuff --- */ /* TODO: replace ANALOGY_SUBD_AI with ANALOGY_SUBD_ANALOG and ANALOGY_SUBD_INPUT */ /* Subdevice types masks */ #define A4L_SUBD_MASK_READ 0x80000000 #define A4L_SUBD_MASK_WRITE 0x40000000 #define A4L_SUBD_MASK_SPECIAL 0x20000000 /*! * @addtogroup analogy_subdevice * @{ */ /*! * @anchor ANALOGY_SUBD_xxx @name Subdevices types * @brief Flags to define the subdevice type * @{ */ /** * Unused subdevice */ #define A4L_SUBD_UNUSED (A4L_SUBD_MASK_SPECIAL|0x1) /** * Analog input subdevice */ #define A4L_SUBD_AI (A4L_SUBD_MASK_READ|0x2) /** * Analog output subdevice */ #define A4L_SUBD_AO (A4L_SUBD_MASK_WRITE|0x4) /** * Digital input subdevice */ #define A4L_SUBD_DI (A4L_SUBD_MASK_READ|0x8) /** * Digital output subdevice */ #define A4L_SUBD_DO (A4L_SUBD_MASK_WRITE|0x10) /** * Digital input/output subdevice */ #define A4L_SUBD_DIO (A4L_SUBD_MASK_SPECIAL|0x20) /** * Counter subdevice */ #define A4L_SUBD_COUNTER (A4L_SUBD_MASK_SPECIAL|0x40) /** * Timer subdevice */ #define A4L_SUBD_TIMER (A4L_SUBD_MASK_SPECIAL|0x80) /** * Memory, EEPROM, DPRAM */ #define A4L_SUBD_MEMORY (A4L_SUBD_MASK_SPECIAL|0x100) /** * Calibration subdevice DACs */ #define A4L_SUBD_CALIB (A4L_SUBD_MASK_SPECIAL|0x200) /** * Processor, DSP */ #define A4L_SUBD_PROC (A4L_SUBD_MASK_SPECIAL|0x400) /** * Serial IO subdevice */ #define A4L_SUBD_SERIAL (A4L_SUBD_MASK_SPECIAL|0x800) /** * Mask which gathers all the types */ #define A4L_SUBD_TYPES (A4L_SUBD_UNUSED | \ A4L_SUBD_AI | \ A4L_SUBD_AO | \ A4L_SUBD_DI | \ A4L_SUBD_DO | \ A4L_SUBD_DIO | \ A4L_SUBD_COUNTER | \ A4L_SUBD_TIMER | \ A4L_SUBD_MEMORY | \ A4L_SUBD_CALIB | \ A4L_SUBD_PROC | \ A4L_SUBD_SERIAL) /*! @} ANALOGY_SUBD_xxx */ /*! * @anchor ANALOGY_SUBD_FT_xxx @name Subdevice features * @brief Flags to define the subdevice's capabilities * @{ */ /* Subdevice capabilities */ /** * The subdevice can handle command (i.e it can perform asynchronous * acquisition) */ #define A4L_SUBD_CMD 0x1000 /** * The subdevice support mmap operations (technically, any driver can * do it; however, the developer might want that his driver must be * accessed through read / write */ #define A4L_SUBD_MMAP 0x8000 /*! @} ANALOGY_SUBD_FT_xxx */ /*! * @anchor ANALOGY_SUBD_ST_xxx @name Subdevice status * @brief Flags to define the subdevice's status * @{ */ /* Subdevice status flag(s) */ /** * The subdevice is busy, a synchronous or an asynchronous acquisition * is occuring */ #define A4L_SUBD_BUSY_NR 0 #define A4L_SUBD_BUSY (1 << A4L_SUBD_BUSY_NR) /** * The subdevice is about to be cleaned in the middle of the detach * procedure */ #define A4L_SUBD_CLEAN_NR 1 #define A4L_SUBD_CLEAN (1 << A4L_SUBD_CLEAN_NR) /*! @} ANALOGY_SUBD_ST_xxx */ /* --- Subdevice related IOCTL arguments structures --- */ /* SUDBINFO IOCTL argument */ struct a4l_subd_info { unsigned long flags; unsigned long status; unsigned char nb_chan; }; typedef struct a4l_subd_info a4l_sbinfo_t; /* CHANINFO / NBCHANINFO IOCTL arguments */ struct a4l_chan_info { unsigned long chan_flags; unsigned char nb_rng; unsigned char nb_bits; }; typedef struct a4l_chan_info a4l_chinfo_t; struct a4l_chinfo_arg { unsigned int idx_subd; void *info; }; typedef struct a4l_chinfo_arg a4l_chinfo_arg_t; /* RNGINFO / NBRNGINFO IOCTL arguments */ struct a4l_rng_info { long min; long max; unsigned long flags; }; typedef struct a4l_rng_info a4l_rnginfo_t; struct a4l_rng_info_arg { unsigned int idx_subd; unsigned int idx_chan; void *info; }; typedef struct a4l_rng_info_arg a4l_rnginfo_arg_t; /*! @} */ #define A4L_INSN_MASK_READ 0x8000000 #define A4L_INSN_MASK_WRITE 0x4000000 #define A4L_INSN_MASK_SPECIAL 0x2000000 /*! * @addtogroup analogy_lib_sync1 * @{ */ /*! * @anchor ANALOGY_INSN_xxx @name Instruction type * @brief Flags to define the type of instruction * @{ */ /** * Read instruction */ #define A4L_INSN_READ (0 | A4L_INSN_MASK_READ) /** * Write instruction */ #define A4L_INSN_WRITE (1 | A4L_INSN_MASK_WRITE) /** * "Bits" instruction */ #define A4L_INSN_BITS (2 | A4L_INSN_MASK_READ | \ A4L_INSN_MASK_WRITE) /** * Configuration instruction */ #define A4L_INSN_CONFIG (3 | A4L_INSN_MASK_READ | \ A4L_INSN_MASK_WRITE) /** * Get time instruction */ #define A4L_INSN_GTOD (4 | A4L_INSN_MASK_READ | \ A4L_INSN_MASK_SPECIAL) /** * Wait instruction */ #define A4L_INSN_WAIT (5 | A4L_INSN_MASK_WRITE | \ A4L_INSN_MASK_SPECIAL) /** * Trigger instruction (to start asynchronous acquisition) */ #define A4L_INSN_INTTRIG (6 | A4L_INSN_MASK_WRITE | \ A4L_INSN_MASK_SPECIAL) /*! @} ANALOGY_INSN_xxx */ /** * Maximal wait duration */ #define A4L_INSN_WAIT_MAX 100000 /*! * @anchor INSN_CONFIG_xxx @name Configuration instruction type * @brief Values to define the type of configuration instruction * @{ */ #define A4L_INSN_CONFIG_DIO_INPUT 0 #define A4L_INSN_CONFIG_DIO_OUTPUT 1 #define A4L_INSN_CONFIG_DIO_OPENDRAIN 2 #define A4L_INSN_CONFIG_ANALOG_TRIG 16 #define A4L_INSN_CONFIG_ALT_SOURCE 20 #define A4L_INSN_CONFIG_DIGITAL_TRIG 21 #define A4L_INSN_CONFIG_BLOCK_SIZE 22 #define A4L_INSN_CONFIG_TIMER_1 23 #define A4L_INSN_CONFIG_FILTER 24 #define A4L_INSN_CONFIG_CHANGE_NOTIFY 25 #define A4L_INSN_CONFIG_SERIAL_CLOCK 26 #define A4L_INSN_CONFIG_BIDIRECTIONAL_DATA 27 #define A4L_INSN_CONFIG_DIO_QUERY 28 #define A4L_INSN_CONFIG_PWM_OUTPUT 29 #define A4L_INSN_CONFIG_GET_PWM_OUTPUT 30 #define A4L_INSN_CONFIG_ARM 31 #define A4L_INSN_CONFIG_DISARM 32 #define A4L_INSN_CONFIG_GET_COUNTER_STATUS 33 #define A4L_INSN_CONFIG_RESET 34 #define A4L_INSN_CONFIG_GPCT_SINGLE_PULSE_GENERATOR 1001 /* Use CTR as single pulsegenerator */ #define A4L_INSN_CONFIG_GPCT_PULSE_TRAIN_GENERATOR 1002 /* Use CTR as pulsetraingenerator */ #define A4L_INSN_CONFIG_GPCT_QUADRATURE_ENCODER 1003 /* Use the counter as encoder */ #define A4L_INSN_CONFIG_SET_GATE_SRC 2001 /* Set gate source */ #define A4L_INSN_CONFIG_GET_GATE_SRC 2002 /* Get gate source */ #define A4L_INSN_CONFIG_SET_CLOCK_SRC 2003 /* Set master clock source */ #define A4L_INSN_CONFIG_GET_CLOCK_SRC 2004 /* Get master clock source */ #define A4L_INSN_CONFIG_SET_OTHER_SRC 2005 /* Set other source */ #define A4L_INSN_CONFIG_SET_COUNTER_MODE 4097 #define A4L_INSN_CONFIG_SET_ROUTING 4099 #define A4L_INSN_CONFIG_GET_ROUTING 4109 /*! @} INSN_CONFIG_xxx */ /*! * @anchor ANALOGY_COUNTER_xxx @name Counter status bits * @brief Status bits for INSN_CONFIG_GET_COUNTER_STATUS * @{ */ #define A4L_COUNTER_ARMED 0x1 #define A4L_COUNTER_COUNTING 0x2 #define A4L_COUNTER_TERMINAL_COUNT 0x4 /*! @} ANALOGY_COUNTER_xxx */ /*! * @anchor ANALOGY_IO_DIRECTION @name IO direction * @brief Values to define the IO polarity * @{ */ #define A4L_INPUT 0 #define A4L_OUTPUT 1 #define A4L_OPENDRAIN 2 /*! @} ANALOGY_IO_DIRECTION */ /*! * @anchor ANALOGY_EV_xxx @name Events types * @brief Values to define the Analogy events. They might used to send * some specific events through the instruction interface. * @{ */ #define A4L_EV_START 0x00040000 #define A4L_EV_SCAN_BEGIN 0x00080000 #define A4L_EV_CONVERT 0x00100000 #define A4L_EV_SCAN_END 0x00200000 #define A4L_EV_STOP 0x00400000 /*! @} ANALOGY_EV_xxx */ /*! * @brief Structure describing the synchronous instruction * @see a4l_snd_insn() */ struct a4l_instruction { unsigned int type; /**< Instruction type */ unsigned int idx_subd; /**< Subdevice to which the instruction will be applied. */ unsigned int chan_desc; /**< Channel descriptor */ unsigned int data_size; /**< Size of the intruction data */ void *data; /**< Instruction data */ }; typedef struct a4l_instruction a4l_insn_t; /*! * @brief Structure describing the list of synchronous instructions * @see a4l_snd_insnlist() */ struct a4l_instruction_list { unsigned int count; /**< Instructions count */ a4l_insn_t *insns; /**< Tab containing the instructions pointers */ }; typedef struct a4l_instruction_list a4l_insnlst_t; /*! @} analogy_lib_sync1 */ struct a4l_calibration_subdev { a4l_sbinfo_t *info; char *name; int slen; int idx; }; struct a4l_calibration_subdev_data { int index; int channel; int range; int expansion; int nb_coeff; double *coeff; }; struct a4l_calibration_data { char *driver_name; char *board_name; int nb_ai; struct a4l_calibration_subdev_data *ai; int nb_ao; struct a4l_calibration_subdev_data *ao; }; struct a4l_polynomial { int expansion; int order; int nb_coeff; double *coeff; }; #endif /* _RTDM_UAPI_ANALOGY_H */