add support for new INSN_CONFIG_DIO_QUERY
authorFrank Mori Hess <fmhess@speakeasy.net>
Sun, 6 Mar 2005 17:31:08 +0000 (17:31 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Sun, 6 Mar 2005 17:31:08 +0000 (17:31 +0000)
17 files changed:
comedi/drivers/8255.c
comedi/drivers/adl_pci6208.c
comedi/drivers/cb_das16_cs.c
comedi/drivers/cb_pcidas64.c
comedi/drivers/dt3000.c
comedi/drivers/gsc_hpdi.c
comedi/drivers/me4000.c
comedi/drivers/mpc8260cpm.c
comedi/drivers/ni_660x.c
comedi/drivers/ni_670x.c
comedi/drivers/ni_at_ao.c
comedi/drivers/ni_mio_common.c
comedi/drivers/ni_pcidio.c
comedi/drivers/rtd520.c
comedi/drivers/skel.c
comedi/drivers/ssv_dnp.c
comedi/drivers/usbdux.c

index 09d69821b08be45ccbe6f9d767a5b4e062cc6259..3a8679b77ba856b6373b50c029c1ac950b3526fb 100644 (file)
@@ -184,12 +184,16 @@ static int subdev_8255_insn_config(comedi_device *dev,comedi_subdevice *s,
        }
 
        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;
        }
index 297065602f3daf0cdb6d6b91f9d718a1dda514af..2ec2518f8e7c8cac345b7b7058b3709fc4133ff1 100644 (file)
@@ -283,8 +283,6 @@ static int pci6208_ao_rinsn(comedi_device *dev,comedi_subdevice *s,
 //{
 //     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
index 5ef12f387fcb6bf263114739fb1eb9aee09449b3..c437b83622b07cec62afb1ed5b8e5f0124b7b4e3 100644 (file)
@@ -555,15 +555,24 @@ static int das16cs_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
        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;
@@ -572,7 +581,7 @@ static int das16cs_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
 
        outw(devpriv->status2,dev->iobase + 6);
 
-       return 1;
+       return insn->n;
 }
 
 static int das16cs_timer_insn_read(comedi_device *dev,comedi_subdevice *s,
index 14caf9f28603d60e6ee9d6d7f4c1ffe37dc8dc50..ba9e546d2ccdf82c4dba19ce51503f69430cef2e 100644 (file)
@@ -3537,12 +3537,15 @@ static int dio_60xx_config_insn(comedi_device *dev, comedi_subdevice *s, comedi_
 
        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;
        }
index 81a355fd6375f9ecac9f279265478b966c2439e9..ae2827d8488efc8a881c1b0c5325beeb97664f9e 100644 (file)
@@ -704,16 +704,28 @@ static int dt3k_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
 {
        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,
index d485a1f71eb0599dc9926024167879820d9b30f4..45e9f5e65db9ebcc52d86a8fdffc381dd80fb907 100644 (file)
@@ -346,18 +346,19 @@ static int dio_config_insn( 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:
index cea0e2faa9a4625fef508e435335b604e89b1bee..90deda782443376145023dfa2074b136e867c9b6 100644 (file)
@@ -1956,10 +1956,11 @@ static int me4000_dio_insn_config(
 
        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
index 2470295ac345a31dea19bac1407e0e1a5ee71014..87be848f2b39679f5c0023db6b1b8bb7c8f6116e 100644 (file)
@@ -82,8 +82,8 @@ static int mpc8260cpm_attach(comedi_device *dev,comedi_devconfig *it)
                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;
@@ -117,8 +117,6 @@ static int mpc8260cpm_dio_config(comedi_device *dev,comedi_subdevice *s,comedi_i
        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]){
@@ -126,12 +124,16 @@ static int mpc8260cpm_dio_config(comedi_device *dev,comedi_subdevice *s,comedi_i
        }
 
        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;
        }
index 77e10014c50f409241ce67574a403891ff8c36f5..a4249b4bccbc19dacec223bd28da4d64315d6570 100644 (file)
@@ -1322,31 +1322,34 @@ static int ni_660x_dio_insn_config(comedi_device *dev,
                                   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;
 }
 
 
index 11ed48d418971d2d174cd2a9dd39a91dbc97fd73..7d29bbd81543b37d1518000092ed5c0499e5c9a0 100644 (file)
@@ -277,21 +277,26 @@ static int ni_670x_dio_insn_bits(comedi_device *dev,comedi_subdevice *s,comedi_i
 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)
index 546013ea56de77f7ad0a0e3d76176ed5821e323c..5f0e57d8c4c494d9d8190c5249a127abe29e35a9 100644 (file)
@@ -378,8 +378,6 @@ static int atao_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
        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
@@ -388,12 +386,23 @@ static int atao_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
        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);
index 4bf0c1d418cf6152713df9faddd80bb74f983af7..502eaba0f234a84e7e4d55b107029ea4f5a3d139 100644 (file)
@@ -2401,14 +2401,17 @@ static int ni_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
        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;
        }
index f47b5de11d41dbc9421a719e78f020fdaa82c57f..297845b6a5df3b6daaebfa666b188bef58de9ac7 100644 (file)
@@ -622,12 +622,16 @@ static int ni_pcidio_insn_config(comedi_device *dev,comedi_subdevice *s,
 {
        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;
        }
index 1781a8056c9e1e9bc4a1bdd322d672b2fd9b4469..cc22ddd212ef423968c04ae14ed2cf298c1cd2ba 100644 (file)
@@ -2266,18 +2266,25 @@ static int rtd_dio_insn_config (
 {
     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 */
index 63141c0a4dbd9a4ae3e1aafa053bd6fa66a571b2..dda15200bcd3ea6866ee35e8e8509808e6491916 100644 (file)
@@ -561,21 +561,29 @@ static int skel_dio_insn_config(comedi_device *dev,comedi_subdevice *s,
 {
        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;
 }
 
 /*
index f1ee19f3b77cc9c2e206ec507d08aa0c51d045a3..5ca0188919e1f7ee74bca83442a5fa8b57c6a511 100644 (file)
@@ -279,8 +279,20 @@ static int dnp_dio_insn_config(
   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:      */
index 229e095e52c48ce6b6f3f045a1da8a93703deb10..c6b3897759a2773743fc207a0e620a57bfe3616b 100644 (file)
@@ -1876,21 +1876,29 @@ static int usbdux_dio_insn_config (comedi_device *dev,
                                   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;
 }