On Thursday, October 08, 2015 3:03 AM, Ian Abbott wrote: > On 07/10/15 19:09, H Hartley Sweeten wrote: >> According the the PCI-2006M user's manual, bipolar ranges use 2's >> complement coding and unipolar ranges are straight binary. Fix >> ii20k_ao_insn_write() to use the correct coding based on the range. >> >> For aesthetics, use the comedi_offset_munge() helper to handle the >> munging of the data. >> >> Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx> >> Cc: Ian Abbott <abbotti@xxxxxxxxx> >> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> >> --- >> drivers/staging/comedi/drivers/ii_pci20kc.c | 7 ++++--- >> 1 file changed, 4 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/staging/comedi/drivers/ii_pci20kc.c b/drivers/staging/comedi/drivers/ii_pci20kc.c >> index 4d3f89c..6e2ce93 100644 >> --- a/drivers/staging/comedi/drivers/ii_pci20kc.c >> +++ b/drivers/staging/comedi/drivers/ii_pci20kc.c >> @@ -146,6 +146,7 @@ static int ii20k_ao_insn_write(struct comedi_device *dev, >> { >> void __iomem *iobase = ii20k_module_iobase(dev, s); >> unsigned int chan = CR_CHAN(insn->chanspec); >> + unsigned int range = CR_RANGE(insn->chanspec); >> int i; >> >> for (i = 0; i < insn->n; i++) { >> @@ -153,9 +154,9 @@ static int ii20k_ao_insn_write(struct comedi_device *dev, >> >> s->readback[chan] = val; >> >> - /* munge data */ >> - val += ((s->maxdata + 1) >> 1); >> - val &= s->maxdata; >> + /* munge the offset binary to 2's complement if needed */ >> + if (comedi_range_is_bipolar(s, range)) >> + val = comedi_offset_munge(s, val); >> >> writeb(val & 0xff, iobase + II20K_AO_LSB_REG(chan)); >> writeb((val >> 8) & 0xff, iobase + II20K_AO_MSB_REG(chan)); >> > > I'm not sure about that as there are discrepancies in the manual. The > one I found was at: > > https://www.uni-due.de/~hp0259/agwiki/lib/exe/fetch.php?media=anleitungen:pci-20006m.pdf I have the same manual. > In "5. Specifications" it has: > > CODE > UNIPOLAR Binary > BIPOLAR Complementary Binary > I saw this part. > But then under "D/A Codes" it has: > > OUTDATA Volts Unipolar Volts Bipolar > ------- -------------- ------------- > 32767 +Full Scale -1 LSB * > 0 +½ Full Scale 0 > -1 +½ F.S. - 1 LSB -1 LSB > -32768 0 -Full Scale > > ± 5V Range: OUTDATA = VOLTS * (65536 / 10) > ± 10V Range: OUTDATA = VOLTS * (65536 / 20) > 0 to 10V Range: OUTDATA = (VOLTS * (65536 / 10)) - 32768 Missed this part... > * I think that's a typo and should be "+Full Scale - 1 LSB". > > The table (with typo corrected) and formulae indicate that for both > unipolar and bipolar, -32768 is the lowest voltage and +32767 is the > highest voltage, so we should munge comedi sample values regardless of > range. Looks like you are probably correct. I'll fix the patch and repost the series. Thanks. Hartley _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel