#define DMM32AT_CLKCT2 0xb6 /* mode3 counter 2 - write high and low byte */ /* DMM32AT_DIOCONF 0x0f */ #define DMM32AT_DIENABLE 0x80 #define DMM32AT_DIRA 0x10 #define DMM32AT_DIRB 0x02 #define DMM32AT_DIRCL 0x01 #define DMM32AT_DIRCH 0x08 /* board AI ranges in comedi structure */ static const struct comedi_lrange dmm32at_airanges = { 4, { UNI_RANGE(10), UNI_RANGE(5), BIP_RANGE(10), BIP_RANGE(5), } }; /* register values for above ranges */ static const unsigned char dmm32at_rangebits[] = { DMM32AT_RANGE_U10, DMM32AT_RANGE_U5, DMM32AT_RANGE_B10, DMM32AT_RANGE_B5, }; /* only one of these ranges is valid, as set by a jumper on the * board. The application should only use the range set by the jumper */
#define PCL812_MODE 11 #define PCL812_CNTENABLE 10 #define PCL812_SOFTTRIG 12 #define PCL812_DO_LO 13 #define PCL812_DO_HI 14 #define PCL812_DRDY 0x10 /* =0 data ready */ #define ACL8216_STATUS 8 /* 5. bit signalize data ready */ #define ACL8216_DRDY 0x20 /* =0 data ready */ #define MAX_CHANLIST_LEN 256 /* length of scan list */ static const struct comedi_lrange range_pcl812pg_ai = { 5, { BIP_RANGE(5), BIP_RANGE(2.5), BIP_RANGE(1.25), BIP_RANGE(0.625), BIP_RANGE(0.3125), } }; static const struct comedi_lrange range_pcl812pg2_ai = { 5, { BIP_RANGE(10), BIP_RANGE(5), BIP_RANGE(2.5), BIP_RANGE(1.25), BIP_RANGE(0.625), } };
#define II20K_AI_DELAY_MSB_REG 0x17 #define II20K_AI_CHAN_ADV_REG 0x18 #define II20K_AI_CHAN_RESET_REG 0x19 #define II20K_AI_START_TRIG_REG 0x1a #define II20K_AI_COUNT_RESET_REG 0x1b #define II20K_AI_CHANLIST_REG 0x80 #define II20K_AI_CHANLIST_ONBOARD_ONLY (1 << 5) #define II20K_AI_CHANLIST_GAIN(x) (((x) & 0x3) << 3) #define II20K_AI_CHANLIST_MUX_ENA (1 << 2) #define II20K_AI_CHANLIST_CHAN(x) (((x) & 0x3) << 0) #define II20K_AI_CHANLIST_LEN 0x80 /* the AO range is set by jumpers on the 20006M module */ static const struct comedi_lrange ii20k_ao_ranges = { 3, { BIP_RANGE(5), /* Chan 0 - W1/W3 in Chan 1 - W2/W4 in */ UNI_RANGE(10), /* Chan 0 - W1/W3 out Chan 1 - W2/W4 in */ BIP_RANGE(10) /* Chan 0 - W1/W3 in Chan 1 - W2/W4 out */ } }; static const struct comedi_lrange ii20k_ai_ranges = { 4, { BIP_RANGE(5), /* gain 1 */ BIP_RANGE(0.5), /* gain 10 */ BIP_RANGE(0.05), /* gain 100 */ BIP_RANGE(0.025) /* gain 200 */ }, }; struct ii20k_ao_private {
/* type of interrupt handler */ #define INT_TYPE_AI1_INT 1 #define INT_TYPE_AI1_DMA 2 #define INT_TYPE_AI1_FIFO 3 #define INT_TYPE_AI3_INT 4 #define INT_TYPE_AI3_DMA 5 #define INT_TYPE_AI3_FIFO 6 #ifdef PCL818_MODE13_AO #define INT_TYPE_AO1_INT 7 #define INT_TYPE_AO3_INT 8 #endif #define MAGIC_DMA_WORD 0x5a5a static const struct comedi_lrange range_pcl818h_ai = { 9, { BIP_RANGE(5), BIP_RANGE(2.5), BIP_RANGE(1.25), BIP_RANGE(0.625), UNI_RANGE(10), UNI_RANGE(5), UNI_RANGE(2.5), UNI_RANGE(1.25), BIP_RANGE(10), } }; static const struct comedi_lrange range_pcl818hg_ai = { 10, { BIP_RANGE(5), BIP_RANGE(0.5), BIP_RANGE(0.05),
#define NUMOFOUTBUFFERSFULL 5 /* Number of in-URBs which receive the data: min=5 */ /* must have more buffers due to buggy USB ctr */ #define NUMOFINBUFFERSHIGH 10 /* Number of out-URBs which send the data: min=5 */ /* must have more buffers due to buggy USB ctr */ #define NUMOFOUTBUFFERSHIGH 10 /* number of retries to get the right dux command */ #define RETRIES 10 static const struct comedi_lrange range_usbdux_ai_range = { 4, { BIP_RANGE(4.096), BIP_RANGE(4.096 / 2), UNI_RANGE(4.096), UNI_RANGE(4.096 / 2) } }; static const struct comedi_lrange range_usbdux_ao_range = { 2, { BIP_RANGE(4.096), UNI_RANGE(4.096) } }; struct usbdux_private { /* actual number of in-buffers */
#include <linux/module.h> #include "../comedidev.h" static const struct comedi_lrange range_dt2811_pgh_ai_5_unipolar = { 4, { UNI_RANGE(5), UNI_RANGE(2.5), UNI_RANGE(1.25), UNI_RANGE(0.625) } }; static const struct comedi_lrange range_dt2811_pgh_ai_2_5_bipolar = { 4, { BIP_RANGE(2.5), BIP_RANGE(1.25), BIP_RANGE(0.625), BIP_RANGE(0.3125) } }; static const struct comedi_lrange range_dt2811_pgh_ai_5_bipolar = { 4, { BIP_RANGE(5), BIP_RANGE(2.5), BIP_RANGE(1.25), BIP_RANGE(0.625) } };
/* number of retries to get the right dux command */ #define RETRIES 10 /* bulk transfer commands to usbduxsigma */ #define USBBUXSIGMA_AD_CMD 0 #define USBDUXSIGMA_DA_CMD 1 #define USBDUXSIGMA_DIO_CFG_CMD 2 #define USBDUXSIGMA_DIO_BITS_CMD 3 #define USBDUXSIGMA_SINGLE_AD_CMD 4 #define USBDUXSIGMA_PWM_ON_CMD 7 #define USBDUXSIGMA_PWM_OFF_CMD 8 static const struct comedi_lrange usbduxsigma_ai_range = { 1, { BIP_RANGE(2.5 * 0x800000 / 0x780000 / 2.0) } }; struct usbduxsigma_private { /* actual number of in-buffers */ int n_ai_urbs; /* actual number of out-buffers */ int n_ao_urbs; /* ISO-transfer handling: buffers */ struct urb **ai_urbs; struct urb **ao_urbs; /* pwm-transfer handling */ struct urb *pwm_urb; /* PWM period */ unsigned int pwm_period;
#define EEPROM_DIGITALOUTPUT 1 #define EEPROM_ANALOGINPUT 2 #define EEPROM_ANALOGOUTPUT 3 #define EEPROM_TIMER 4 #define EEPROM_WATCHDOG 5 #define EEPROM_TIMER_WATCHDOG_COUNTER 10 struct apci3501_private { int i_IobaseAmcc; struct task_struct *tsk_Current; unsigned char b_TimerSelectMode; }; static struct comedi_lrange apci3501_ao_range = { 2, { BIP_RANGE(10), UNI_RANGE(10) } }; static int apci3501_wait_for_dac(struct comedi_device *dev) { unsigned int status; do { status = inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG); } while (!(status & APCI3501_AO_STATUS_READY)); return 0; }
#define DAQBOARD2000_SECRProgPinLo 0x8000767e #define DAQBOARD2000_SECRLocalBusHi 0xc000767e #define DAQBOARD2000_SECRLocalBusLo 0x8000767e #define DAQBOARD2000_SECRReloadHi 0xa000767e #define DAQBOARD2000_SECRReloadLo 0x8000767e /* SECR status bits */ #define DAQBOARD2000_EEPROM_PRESENT 0x10000000 /* CPLD status bits */ #define DAQBOARD2000_CPLD_INIT 0x0002 #define DAQBOARD2000_CPLD_DONE 0x0004 static const struct comedi_lrange range_daqboard2000_ai = { 13, { BIP_RANGE(10), BIP_RANGE(5), BIP_RANGE(2.5), BIP_RANGE(1.25), BIP_RANGE(0.625), BIP_RANGE(0.3125), BIP_RANGE(0.156), UNI_RANGE(10), UNI_RANGE(5), UNI_RANGE(2.5), UNI_RANGE(1.25), UNI_RANGE(0.625), UNI_RANGE(0.3125) } };
#define DMA_TRANSFER_BITS (\ /* descriptors in PCI memory*/ PLX_DESC_IN_PCI_BIT \ /* interrupt at end of block */ | PLX_INTR_TERM_COUNT \ /* from board to PCI */ | PLX_XFER_LOCAL_TO_PCI) /* * Comedi specific stuff */ /* * The board has 3 input modes and the gains of 1,2,4,...32 (, 64, 128) */ static const struct comedi_lrange rtd_ai_7520_range = { 18, { /* +-5V input range gain steps */ BIP_RANGE(5.0), BIP_RANGE(5.0 / 2), BIP_RANGE(5.0 / 4), BIP_RANGE(5.0 / 8), BIP_RANGE(5.0 / 16), BIP_RANGE(5.0 / 32), /* +-10V input range gain steps */ BIP_RANGE(10.0), BIP_RANGE(10.0 / 2), BIP_RANGE(10.0 / 4), BIP_RANGE(10.0 / 8), BIP_RANGE(10.0 / 16), BIP_RANGE(10.0 / 32), /* +10V input range gain steps */ UNI_RANGE(10.0), UNI_RANGE(10.0 / 2),
#include <linux/module.h> #include <linux/pci.h> #include <linux/interrupt.h> #include "../comedidev.h" #include "comedi_fc.h" #define CONV_UNIT_NS (1 << 0) #define CONV_UNIT_US (1 << 1) #define CONV_UNIT_MS (1 << 2) static const struct comedi_lrange apci3xxx_ai_range = { 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) } }; static const struct comedi_lrange apci3xxx_ao_range = { 2, { BIP_RANGE(10), UNI_RANGE(10) }
#include "../comedidev.h" #include <linux/delay.h> #include <linux/ioport.h> #define FL512_SIZE 16 /* the size of the used memory */ struct fl512_private { short ao_readback[2]; }; #define devpriv ((struct fl512_private *) dev->private) static const struct comedi_lrange range_fl512 = { 4, { BIP_RANGE(0.5), BIP_RANGE(1), BIP_RANGE(5), BIP_RANGE(10), UNI_RANGE(1), UNI_RANGE(5), UNI_RANGE(10), } }; /* * fl512_ai_insn : this is the analog input function */ static int fl512_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
#define RTI800_DMA_ENAB 0x08 #define RTI800_INTR_TC 0x04 #define RTI800_INTR_EC 0x02 #define RTI800_INTR_OVRN 0x01 #define Am9513_8BITBUS #define Am9513_output_control(a) outb(a, dev->iobase+RTI800_9513A_CNTRL) #define Am9513_output_data(a) outb(a, dev->iobase+RTI800_9513A_DATA) #define Am9513_input_data() inb(dev->iobase+RTI800_9513A_DATA) #define Am9513_input_status() inb(dev->iobase+RTI800_9513A_STATUS) #include "am9513.h" static const struct comedi_lrange range_rti800_ai_10_bipolar = { 4, { BIP_RANGE (10), BIP_RANGE (1), BIP_RANGE (0.1), BIP_RANGE (0.02) } }; static const struct comedi_lrange range_rti800_ai_5_bipolar = { 4, { BIP_RANGE (5), BIP_RANGE (0.5), BIP_RANGE
/* * max number of 1/30MHz delay steps */ #define MAX_SAMPLING_PERIOD 500 /* * number of received packets to ignore before we start handing data * over to comedi, it's quad buffering and we have to ignore 4 packets */ #define PACKETS_TO_IGNORE 4 /* * comedi constants */ static const struct comedi_lrange range_usbduxfast_ai_range = { 2, {BIP_RANGE(0.75), BIP_RANGE(0.5)} }; /* * private structure of one subdevice * * this is the structure which holds all the data of this driver * one sub device just now: A/D */ struct usbduxfast_private { struct urb *urb; /* BULK-transfer handling: urb */ uint8_t *duxbuf; int8_t *inbuf; short int ai_cmd_running; /* asynchronous command is running */ short int ai_continous; /* continous acquisition */ long int ai_sample_count; /* number of samples to acquire */
for these boards. Data Translation originally wanted an NDA for the documentation for the 3k series. However, if you ask nicely, they might send you the docs without one, also. */ #include <linux/module.h> #include <linux/delay.h> #include <linux/interrupt.h> #include "../comedi_pci.h" static const struct comedi_lrange range_dt3000_ai = { 4, { BIP_RANGE(10), BIP_RANGE(5), BIP_RANGE(2.5), BIP_RANGE(1.25) } }; static const struct comedi_lrange range_dt3000_ai_pgl = { 4, { BIP_RANGE(10), BIP_RANGE(1), BIP_RANGE(0.1), BIP_RANGE(0.02) } };
/* number of retries to get the right dux command */ #define RETRIES 10 /* bulk transfer commands to usbduxsigma */ #define USBBUXSIGMA_AD_CMD 0 #define USBDUXSIGMA_DA_CMD 1 #define USBDUXSIGMA_DIO_CFG_CMD 2 #define USBDUXSIGMA_DIO_BITS_CMD 3 #define USBDUXSIGMA_SINGLE_AD_CMD 4 #define USBDUXSIGMA_PWM_ON_CMD 7 #define USBDUXSIGMA_PWM_OFF_CMD 8 static const struct comedi_lrange usbduxsigma_ai_range = { 1, { BIP_RANGE(2.65 / 2.0) } }; struct usbduxsigma_private { /* actual number of in-buffers */ int n_ai_urbs; /* actual number of out-buffers */ int n_ao_urbs; /* ISO-transfer handling: buffers */ struct urb **ai_urbs; struct urb **ao_urbs; /* pwm-transfer handling */ struct urb *pwm_urb; /* PWM period */ unsigned int pwm_period;
#define INTE 0x80 #define DAS16M1_QUEUE_ADDR 6 #define DAS16M1_QUEUE_DATA 7 #define Q_CHAN(x) ((x) & 0x7) #define Q_RANGE(x) (((x) & 0xf) << 4) #define UNIPOLAR 0x40 #define DAS16M1_8254_FIRST 0x8 #define DAS16M1_8254_FIRST_CNTRL 0xb #define TOTAL_CLEAR 0x30 #define DAS16M1_8254_SECOND 0xc #define DAS16M1_82C55 0x400 #define DAS16M1_8254_THIRD 0x404 static const struct comedi_lrange range_das16m1 = { 9, { BIP_RANGE(5), BIP_RANGE(2.5), BIP_RANGE(1.25), BIP_RANGE(0.625), UNI_RANGE(10), UNI_RANGE(5), UNI_RANGE(2.5), UNI_RANGE(1.25), BIP_RANGE(10) } }; struct das16m1_private_struct { unsigned int control_state; unsigned int adc_count; /* number of samples completed */ /* initial value in lower half of hardware conversion counter,
#define ADQ12B_OUTBR 0x04 #define ADQ12B_ADLOW 0x08 #define ADQ12B_ADHIG 0x09 #define ADQ12B_CONT0 0x0c #define ADQ12B_CONT1 0x0d #define ADQ12B_CONT2 0x0e #define ADQ12B_COWORD 0x0f /* mask of the bit at STINR to check end of conversion */ #define ADQ12B_EOC 0x20 #define TIMEOUT 20 /* available ranges through the PGA gains */ static const struct comedi_lrange range_adq12b_ai_bipolar = { 4, { BIP_RANGE(5), BIP_RANGE(2), BIP_RANGE(1), BIP_RANGE(0.5) } }; static const struct comedi_lrange range_adq12b_ai_unipolar = { 4, { UNI_RANGE(5), UNI_RANGE(2), UNI_RANGE(1), UNI_RANGE (0.5) } };