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 <hswee...@visionengravers.com>
>> Cc: Ian Abbott <abbo...@mev.co.uk>
>> Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
>> ---
>>   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
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to