Re: Why is only one int returned in iio_read_channel_processed?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 05/22/2013 05:24 PM, Guillaume Ballet wrote:
[...]
>>> Hence my need to call iio_read_channel_processed
>>> and not entrust anyone else with the conversion.
>>
>> Ah, ok, so your driver implements IIO_CHAN_INFO_PROCESSED instead of
>> IIO_CHAN_INFO_RAW. And you want to be able to specify your value with
>> sub-decimal precession, is this correct?
> 
> Absolutely.
> 
>>
>>>
>>> Could _you_ please explain what your concern with using the same format is?
>>
>> Because the definition of IIO_CHAN_INFO_PROCESSED is that the value has
>> already the proper unit and no unit conversion is necessary.
> 
> Now I see, thanks.
> 
> Getting back to the precision issue, I see that in
> iio_convert_raw_to_processed_unlocked() there is the following code:
> 
>          case IIO_VAL_INT_PLUS_MICRO:
>                  if (scale_val2 < 0)
>                          *processed = -raw64 * scale_val;
>                  else
>                          *processed = raw64 * scale_val;
>                  *processed += div_s64(raw64 * (s64)scale_val2 * scale,
>                                        1000000LL);
>                  break;
>          case IIO_VAL_INT_PLUS_NANO:
>                  if (scale_val2 < 0)
>                          *processed = -raw64 * scale_val;
>                  else
>                          *processed = raw64 * scale_val;
>                  *processed += div_s64(raw64 * (s64)scale_val2 * scale,
> 
> with processed being of type int *. So the sub-decimal precision is
> indeed lost. Is there a big issue with adapting the code to also
> handle sub-decimal precision, then?

Well it's not an issue per se, it's just that there are no in kernel users
which would be able to make use of this. The iio_convert_raw_to_processed()
function takes an additional scale parameter though which allows you to get
a value with a high precession. E.g. if you read a voltage channel with
scale set to 1000 you'll get the result in micro Volts instead of milli
Volts. The same parameter could be added to iio_read_channel_processed() and
you'd do similar calculations as in iio_convert_raw_to_processed(). Instead
of 'raw64 * scale_val' you'd just use 'val' and instead of 'raw64 *
scale_val2' you'd use 'val2'.

E.g. for IIO_VAL_INT_PLUS_MICRO:
                  if (val2 < 0)
                          *processed = -val;
                  else
                          *processed = val;
                  *processed += div_s64((s64)val2 * scale, 1000000LL);

and so on.


And I think for sysfs nodes it should already work fine, e.g. if you return
IIO_VAL_INT_PLUS_MICRO.

- Lars
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux