Subject: XADC

From: [email-masked] (Lars-Peter Clausen)
Date: Thu, 05 Jun 2014 10:26:19 +0200

On 06/04/2014 04:27 PM, S?ren Brinkmann wrote:
> Hi Lars, Peter,
>
> On Wed, 2014-06-04 at 09:27AM +0200, Lars-Peter Clausen wrote:
>> On 06/04/2014 08:47 AM, Peter Meerwald wrote:
>>> Hello,
>>>
>>>> I recently found that you developed a driver for XADC and I thought I
>>>> enable it (see patch below). But it seems something is not working
>>>> correctly. The values I tested don't seem to be right and also fixed.
>>>> I.e. they don't change over time or across boards:
>>>>
>>>>    # cat in_temp0_scale
>>>>    123.040771484
>>>>    # cat in_voltage0_vccint_scale
>>>>    0.732421875
>>>>    # cat in_voltage0_vccint_raw
>>>>    1384
>>>>    # cat in_voltage1_vccaux_s[ 1203.660637] random: nonblocking pool is initialized
>>>>    # cat in_voltage1_vccaux_scale
>>>>    0.732421875
>>>>    # cat in_voltage3_vccpint_scale
>>>>    0.732421875
>>>
>>> the _scale values are supposed to be constant; their purpose is to scale a
>>> measurement so that the result is in a given unit
>>>
>>> e.g. in_temp0_scale scales in_temp0_raw so that the result
>>> (in_temp0_raw * in_temp0_scale) in milli Celsius
>>>
>>> in_voltage0_vccint_raw * in_voltage0_vccint_scale is supposed to give
>>> milli Volts
>>>
>>> so in_voltage0_vccint_raw should vary accross time / boards (and voltage
>>> hopefully :), but not the _scales
>>
>> Yep, as Peter said scale and offset will be constant, raw should
>> change though, e.g. both voltage and temperature should a slight
>> jitter if you repeatedly read them. If not something is broken. We
>> had the driver in our images for Zynq board for a while now and so
>> far it worked fine. I think Mrinal and Radhey from Xilinx also
>> tested the driver.
>
> Okay, thanks for the answers. Since the _scale value was the only one
> close to a Celsius or Fahrenheit value I thought that would be the
> final temperature. Anyway, the raw values do show some jitter. So far,
> so good, but the math doesn't add up I think:
>
>   # cat in_temp0_raw in_temp0_scale
>   2559
>   123.040771484
>
> multiplying those values gives
> 2559 * 123.040771484 = 304156.787108
>
> Even if that is mC, that would mean my chip is at 304 degrees C. I'm pretty
> sure my chip's not on fire :)
> (I have the feeling I just did another beginner's mistake here though).
> A 10x error might be in there somewhere. 30 degrees sounds realistic.

There is also a in_temp0_offset attribute which needs to be added to 
in_temp0_raw

temperature = (in_temp0_raw + in_temp0_offset) * in_temp0_scale.

In your case that is: (2559 - 2219) * 123.040771484 = 41833.86

>
> I didn't test all voltages, but those look better.
>
> Also, is there a way to directly obtain a reading in a reasonable scale?
> This approach needs to read two sysfs files, one of those even giving a
> float.

No.

- Lars