}
switch(data[0]){
- case COMEDI_INPUT:
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits&=~bits;
break;
- case COMEDI_OUTPUT:
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits|=bits;
break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
default:
return -EINVAL;
}
//{
// int chan=CR_CHAN(insn->chanspec);
-// if(insn->n!=1)return -EINVAL;
-
/* The input or output configuration of each digital line is
* configured by a special insn_config instruction. chanspec
* contains the channel to be changed, and data[0] contains the
int chan=CR_CHAN(insn->chanspec);
int bits;
- if(insn->n!=1)return -EINVAL;
-
if(chan<4)bits=0x0f;
else bits=0xf0;
- if(data[0]==COMEDI_OUTPUT){
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= bits;
- }else{
+ break;
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= bits;
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
+ default:
+ return -EINVAL;
+ break;
}
devpriv->status2 &= ~0x00c0;
outw(devpriv->status2,dev->iobase + 6);
- return 1;
+ return insn->n;
}
static int das16cs_timer_insn_read(comedi_device *dev,comedi_subdevice *s,
switch(data[0])
{
- case COMEDI_INPUT:
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~mask;
break;
- case COMEDI_OUTPUT:
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= mask;
break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & mask) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return 2;
default:
return -EINVAL;
}
{
int mask;
- if(insn->n!=1)return -EINVAL;
-
mask=(CR_CHAN(insn->chanspec)<4)?0x0f:0xf0;
- if(data[0]==COMEDI_OUTPUT)s->io_bits|=mask;
- else s->io_bits&=~mask;
-
+
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
+ s->io_bits|=mask;
+ break;
+ case INSN_CONFIG_DIO_INPUT:
+ s->io_bits&=~mask;
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1 << CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
+ default:
+ return -EINVAL;
+ break;
+ }
mask=(s->io_bits&0x01)|((s->io_bits&0x10)>>3);
dt3k_dio_config(dev,mask);
- return 1;
+ return insn->n;
}
static int dt3k_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,
{
switch( data[ 0 ] )
{
- case COMEDI_OUTPUT:
- if( insn->n != 1 ) return -EINVAL;
+ case INSN_CONFIG_DIO_OUTPUT:
priv(dev)->dio_config_output = 1;
- return 1;
+ return insn->n;
break;
- case COMEDI_INPUT:
- if( insn->n != 1 ) return -EINVAL;
+ case INSN_CONFIG_DIO_INPUT:
priv(dev)->dio_config_output = 0;
- return 1;
+ return insn->n;
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = priv(dev)->dio_config_output ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
break;
case INSN_CONFIG_BLOCK_SIZE:
- if( insn->n != 2 ) return -EINVAL;
return dio_config_block_size( dev, data );
break;
default:
CALL_PDEBUG("In me4000_dio_insn_config()\n");
-
- /* Only data[0] is valid */
- if(insn->n != 1)
- return -EINVAL;
+ if(data[0] == INSN_CONFIG_DIO_QUERY)
+ {
+ data[1] = (s->io_bits & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ }
/*
* The input or output configuration of each digital line is
s->n_chan=32;
s->maxdata=1;
s->range_table=&range_digital;
- s->insn_config = &mpc8260cpm_dio_config;
- s->insn_bits = &mpc8260cpm_dio_bits;
+ s->insn_config = mpc8260cpm_dio_config;
+ s->insn_bits = mpc8260cpm_dio_bits;
}
return 1;
unsigned int mask;
int port;
- if(insn->n!=1)return -EINVAL;
-
port = (int)s->private;
mask = 1<<CR_CHAN(insn->chanspec);
if(mask&cpm_reserved_bits[port]){
}
switch(data[0]){
- case COMEDI_OUTPUT:
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= mask;
break;
- case COMEDI_INPUT:
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~mask;
break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & mask) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
default:
return -EINVAL;
}
comedi_insn *insn,
lsampl_t *data)
{
- int chan=CR_CHAN(insn->chanspec);
-
- if(insn->n!=1)return -EINVAL;
-
- /* The input or output configuration of each digital line is
- * configured by a special insn_config instruction. chanspec
- * contains the channel to be changed, and data[0] contains the
- * value COMEDI_INPUT or COMEDI_OUTPUT. */
-
- if(data[0]==COMEDI_OUTPUT)
- {
- s->io_bits |= 1<<chan;
- }
- else
- {
- s->io_bits &= ~(1<<chan);
- }
- // No GPCT_OFFSET[chipset] offset here??
- writew(s->io_bits,dev->iobase + registerData[STCDIOControl].offset);
- /* Should we do also something with the IO configuration registers,
- see p 3-38 of register level prog. manual
- */
-
- return 1;
- return -EINVAL;
+ int chan=CR_CHAN(insn->chanspec);
+
+ /* The input or output configuration of each digital line is
+ * configured by a special insn_config instruction. chanspec
+ * contains the channel to be changed, and data[0] contains the
+ * value COMEDI_INPUT or COMEDI_OUTPUT. */
+
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
+ s->io_bits |= 1<<chan;
+ break;
+ case INSN_CONFIG_DIO_INPUT:
+ s->io_bits &= ~(1<<chan);
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ default:
+ return -EINVAL;
+ break;
+ };
+ // No GPCT_OFFSET[chipset] offset here??
+ writew(s->io_bits,dev->iobase + registerData[STCDIOControl].offset);
+ /* Should we do also something with the IO configuration registers,
+ see p 3-38 of register level prog. manual
+ */
+ return insn->n;
}
static int ni_670x_dio_insn_config(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data)
{
int chan=CR_CHAN(insn->chanspec);
-
-
- if(insn->n!=1) return -EINVAL;
- if(data[0]==COMEDI_OUTPUT)
+ switch(data[0])
{
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= 1<<chan;
- }
- else
- {
+ break;
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~(1<<chan);
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1<<chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
+ default:
+ return -EINVAL;
+ break;
}
writel(s->io_bits,dev->iobase + DIO_PORT0_DIR_OFFSET);
- return 1;
+ return insn->n;
}
static int ni_670x_find_device(comedi_device *dev,int bus,int slot)
int chan=CR_CHAN(insn->chanspec);
unsigned int mask, bit;
- if(insn->n!=1)return -EINVAL;
-
/* The input or output configuration of each digital line is
* configured by a special insn_config instruction. chanspec
* contains the channel to be changed, and data[0] contains the
mask = (chan < 4) ? 0x0f : 0xf0;
bit = (chan < 4) ? DOUTEN1 : DOUTEN2;
- if(data[0]==COMEDI_OUTPUT){
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= mask;
devpriv->cfg3 |= bit;
- }else{
+ break;
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~mask;
devpriv->cfg3 &= ~bit;
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
+ default:
+ return -EINVAL;
+ break;
}
outw(devpriv->cfg3, dev->iobase + ATAO_CFG3);
printk("ni_dio_insn_config() chan=%d io=%d\n",
CR_CHAN(insn->chanspec),data[0]);
#endif
- if(insn->n!=1)return -EINVAL;
switch(data[0]){
- case COMEDI_OUTPUT:
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= 1<<CR_CHAN(insn->chanspec);
break;
- case COMEDI_INPUT:
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~(1<<CR_CHAN(insn->chanspec));
break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
default:
return -EINVAL;
}
{
if(insn->n!=1)return -EINVAL;
switch(data[0]){
- case COMEDI_OUTPUT:
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= 1<<CR_CHAN(insn->chanspec);
break;
- case COMEDI_INPUT:
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~(1<<CR_CHAN(insn->chanspec));
break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1<<CR_CHAN(insn->chanspec))) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
default:
return -EINVAL;
}
{
int chan=CR_CHAN(insn->chanspec);
- if (insn->n!=1) return -EINVAL;
-
/* The input or output configuration of each digital line is
* configured by a special insn_config instruction. chanspec
* contains the channel to be changed, and data[0] contains the
* value COMEDI_INPUT or COMEDI_OUTPUT. */
-
- if (data[0]==COMEDI_OUTPUT) {
- s->io_bits |= 1<<chan; /* 1 means Out */
- } else {
- s->io_bits &= ~(1<<chan);
- }
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
+ s->io_bits |= 1<<chan; /* 1 means Out */
+ break;
+ case INSN_CONFIG_DIO_INPUT:
+ s->io_bits &= ~(1<<chan);
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1<<chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
+ default:
+ return -EINVAL;
+ }
DPRINTK("rtd520: port_0_direction=0x%x (1 means out)\n", s->io_bits);
/* TODO support digital match interrupts and strobes */
{
int chan=CR_CHAN(insn->chanspec);
- if(insn->n!=1)return -EINVAL;
-
/* The input or output configuration of each digital line is
* configured by a special insn_config instruction. chanspec
* contains the channel to be changed, and data[0] contains the
* value COMEDI_INPUT or COMEDI_OUTPUT. */
-
- if(data[0]==COMEDI_OUTPUT){
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= 1<<chan;
- }else{
+ break;
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~(1<<chan);
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
+ default:
+ return -EINVAL;
+ break;
}
//outw(s->io_bits,dev->iobase + SKEL_DIO_CONFIG);
- return 1;
+ return insn->n;
}
/*
u8 register_buffer;
int chan=CR_CHAN(insn->chanspec); /* reduces chanspec to lower 16 bits */
- if (insn->n != 1) return -EINVAL; /* this insn uses only data[0] */
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
+ case INSN_CONFIG_DIO_INPUT:
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (inb(CSCDR) & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ return insn->n;
+ break;
+ default:
+ return -EINVAL;
+ break;
+ }
/* Test: which port does the channel belong to? */
/* We have to pay attention with port C: this is the meaning of PCMR: */
lsampl_t *data) {
int chan=CR_CHAN(insn->chanspec);
- if (insn->n!=1) return -EINVAL;
-
/* The input or output configuration of each digital line is
* configured by a special insn_config instruction. chanspec
* contains the channel to be changed, and data[0] contains the
* value COMEDI_INPUT or COMEDI_OUTPUT. */
- if (data[0]==COMEDI_OUTPUT) {
+ switch(data[0])
+ {
+ case INSN_CONFIG_DIO_OUTPUT:
s->io_bits |= 1<<chan; /* 1 means Out */
- } else {
+ break;
+ case INSN_CONFIG_DIO_INPUT:
s->io_bits &= ~(1<<chan);
+ break;
+ case INSN_CONFIG_DIO_QUERY:
+ data[1] = (s->io_bits & (1<<chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
+ break;
+ default:
+ return -EINVAL;
+ break;
}
// we don't tell the firmware here as it would take 8 frames
// to submit the information. We do it in the insn_bits.
- return 1;
+ return insn->n;
}