Commit 12d984ed authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: addi_apci_3120: remove unipolar range from analog outputs

The analog outputs of the APCI-3120 have a 14-bit bipolar range and use straight
binary values (0x0000 = -10V to 0x3fff = +10V) to set the outputs. This driver
tries to fake a unipolar range by munging the comedi data values to only output
0V to +10V signals (0x0000 to 0x1fff values are munged to 0x2000 - 0x3fff).

This causes problems with the comedilib API functions that convert between comedi
values and physical values. It's also possible for the user to pass a data value
that would get munged and actually change the wrong channel.

Fix this by change the subdevice range_table to range_bipolar10 and remove the
munging in apci3120_ao_insn_write().
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 99940229
...@@ -214,16 +214,6 @@ static const struct comedi_lrange range_apci3120_ai = { ...@@ -214,16 +214,6 @@ static const struct comedi_lrange range_apci3120_ai = {
} }
}; };
/* ANALOG OUTPUT RANGE */
static const struct comedi_lrange range_apci3120_ao = {
2, {
BIP_RANGE(10),
UNI_RANGE(10)
}
};
/* FUNCTION DEFINITIONS */
static int apci3120_ai_insn_config(struct comedi_device *dev, static int apci3120_ai_insn_config(struct comedi_device *dev,
struct comedi_subdevice *s, struct comedi_subdevice *s,
struct comedi_insn *insn, struct comedi_insn *insn,
...@@ -1954,29 +1944,12 @@ static int apci3120_ao_insn_write(struct comedi_device *dev, ...@@ -1954,29 +1944,12 @@ static int apci3120_ao_insn_write(struct comedi_device *dev,
unsigned int *data) unsigned int *data)
{ {
struct apci3120_private *devpriv = dev->private; struct apci3120_private *devpriv = dev->private;
unsigned int ui_Range, ui_Channel; unsigned int ui_Channel;
unsigned short us_TmpValue; unsigned short us_TmpValue;
ui_Range = CR_RANGE(insn->chanspec);
ui_Channel = CR_CHAN(insn->chanspec); ui_Channel = CR_CHAN(insn->chanspec);
if (ui_Range) { /* if 1 then unipolar */ data[0] = ((((ui_Channel & 0x03) << 14) & 0xC000) | data[0]);
if (data[0] != 0)
data[0] =
((((ui_Channel & 0x03) << 14) & 0xC000) | (1 <<
13) | (data[0] + 8191));
else
data[0] =
((((ui_Channel & 0x03) << 14) & 0xC000) | (1 <<
13) | 8192);
} else { /* if 0 then bipolar */
data[0] =
((((ui_Channel & 0x03) << 14) & 0xC000) | (0 << 13) |
data[0]);
}
do { /* Waiting of DA_READY BIT */ do { /* Waiting of DA_READY BIT */
us_TmpValue = us_TmpValue =
......
...@@ -181,7 +181,7 @@ static int apci3120_auto_attach(struct comedi_device *dev, ...@@ -181,7 +181,7 @@ static int apci3120_auto_attach(struct comedi_device *dev,
s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON; s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
s->n_chan = 8; s->n_chan = 8;
s->maxdata = 0x3fff; s->maxdata = 0x3fff;
s->range_table = &range_apci3120_ao; s->range_table = &range_bipolar10;
s->insn_write = apci3120_ao_insn_write; s->insn_write = apci3120_ao_insn_write;
} else { } else {
s->type = COMEDI_SUBD_UNUSED; s->type = COMEDI_SUBD_UNUSED;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment