ni_labpc: set up command4 register *after* command3 register
authorIan Abbott <abbotti@mev.co.uk>
Tue, 22 Jan 2013 11:33:37 +0000 (11:33 +0000)
committerIan Abbott <abbotti@mev.co.uk>
Tue, 22 Jan 2013 12:28:49 +0000 (12:28 +0000)
Tuomas <tvainikk _at_ gmail _dot_ com> reported problems getting
meaningful output from a Lab-PC+ in differential mode for AI cmds,
but AI insn reads gave correct readings.  He tracked it down to two
problems, one of which is addressed by this patch.

It seems that writing to the command3 register after writing to the
command4 register in labpc_ai_cmd() messes up the differential reference
bit setting in the command4 register.  Set up the command4 register
after the command3 register (as in labpc_ai_rinsn()) to avoid the
problem.

Thanks to Tuomas for suggesting the fix.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
comedi/drivers/ni_labpc.c

index 7fd67b9c87b44a5ecaf7a701fc3aac09a84315c0..12b8bc7acc59a525b507097cc88a6fb9c6ad50b0 100644 (file)
@@ -1179,21 +1179,6 @@ static int labpc_ai_cmd(comedi_device * dev, comedi_subdevice * s)
                devpriv->write_byte(devpriv->command1_bits,
                        dev->iobase + COMMAND1_REG);
        }
-       // setup any external triggering/pacing (command4 register)
-       devpriv->command4_bits = 0;
-       if (cmd->convert_src != TRIG_EXT)
-               devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
-       /* XXX should discard first scan when using interval scanning
-        * since manual says it is not synced with scan clock */
-       if (labpc_use_continuous_mode(cmd) == 0) {
-               devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT;
-               if (cmd->scan_begin_src == TRIG_EXT)
-                       devpriv->command4_bits |= EXT_SCAN_EN_BIT;
-       }
-       // single-ended/differential
-       if (aref == AREF_DIFF)
-               devpriv->command4_bits |= ADC_DIFF_BIT;
-       devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
 
        devpriv->write_byte(cmd->chanlist_len,
                dev->iobase + INTERVAL_COUNT_REG);
@@ -1272,6 +1257,22 @@ static int labpc_ai_cmd(comedi_device * dev, comedi_subdevice * s)
                devpriv->command3_bits &= ~ADC_FNE_INTR_EN_BIT;
        devpriv->write_byte(devpriv->command3_bits, dev->iobase + COMMAND3_REG);
 
+       // setup any external triggering/pacing (command4 register)
+       devpriv->command4_bits = 0;
+       if (cmd->convert_src != TRIG_EXT)
+               devpriv->command4_bits |= EXT_CONVERT_DISABLE_BIT;
+       /* XXX should discard first scan when using interval scanning
+        * since manual says it is not synced with scan clock */
+       if (labpc_use_continuous_mode(cmd) == 0) {
+               devpriv->command4_bits |= INTERVAL_SCAN_EN_BIT;
+               if (cmd->scan_begin_src == TRIG_EXT)
+                       devpriv->command4_bits |= EXT_SCAN_EN_BIT;
+       }
+       // single-ended/differential
+       if (aref == AREF_DIFF)
+               devpriv->command4_bits |= ADC_DIFF_BIT;
+       devpriv->write_byte(devpriv->command4_bits, dev->iobase + COMMAND4_REG);
+
        // startup aquisition
 
        // command2 reg