On the PCI-1720 board, bipolar analog output ranges use two's
complement data. Use comedi_offset_munge() to munge the comedi
offset binary values before writing them to the hardware.

Signed-off-by: H Hartley Sweeten <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gr...@linuxfoundation.org>
---
 drivers/staging/comedi/drivers/adv_pci1710.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c 
b/drivers/staging/comedi/drivers/adv_pci1710.c
index cb3edf9..c2c5b34 100644
--- a/drivers/staging/comedi/drivers/adv_pci1710.c
+++ b/drivers/staging/comedi/drivers/adv_pci1710.c
@@ -682,26 +682,30 @@ static int pci1720_insn_write_ao(struct comedi_device 
*dev,
                                 struct comedi_insn *insn, unsigned int *data)
 {
        struct pci1710_private *devpriv = dev->private;
+       unsigned int chan = CR_CHAN(insn->chanspec);
+       unsigned int range = CR_RANGE(insn->chanspec);
        unsigned int val;
-       int n, rangereg, chan;
+       int n, rangereg;
 
-       chan = CR_CHAN(insn->chanspec);
        rangereg = devpriv->da_ranges & (~(0x03 << (chan << 1)));
-       rangereg |= (CR_RANGE(insn->chanspec) << (chan << 1));
+       rangereg |= (range << (chan << 1));
        if (rangereg != devpriv->da_ranges) {
                outb(rangereg, dev->iobase + PCI1720_RANGE);
                devpriv->da_ranges = rangereg;
        }
-       val = devpriv->ao_data[chan];
 
        for (n = 0; n < insn->n; n++) {
                val = data[n];
+               devpriv->ao_data[chan] = val;
+
+               /* bipolar codes are two's complement values */
+               if (comedi_range_is_bipolar(s, range))
+                       val = comedi_offset_munge(s, val);
+
                outw(val, dev->iobase + PCI1720_DA0 + (chan << 1));
                outb(0, dev->iobase + PCI1720_SYNCOUT); /*  update outputs */
        }
 
-       devpriv->ao_data[chan] = val;
-
        return n;
 }
 
-- 
1.9.3

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to