Re: [PATCH] hwmon: Driver for INA219 current and power monitor

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

 



Hi Guenter, Ira,

On Tue, 10 May 2011 19:26:47 -0700, Guenter Roeck wrote:
> On Tue, May 10, 2011 at 04:38:44PM -0400, Ira W. Snyder wrote:
> > I've been maintaining my own port of the ina209 driver. Now that the
> > "in*_lcrit" interfaces are added to the sysfs-interface, we only have
> > two disagreements:
> > 
> > 1) shunt voltage is reported in uV instead of mV
> > 
> > This avoids losing half of the precision supported by the chip. This
> > makes a big difference for my application: I need it. IMHO, the
> > sysfs-interface was short sighted.

I'm fairly certain I already explained months ago, but...

The sysfs interface was originally designed in 2005. Back then, the
lowest monitored system voltage was 3.3V, with memory voltage at 1.8V
(DDR2) and CPU core voltage in the 1.0-1.5V. Most monitoring chips were
using ADCs with a resolution of 16 mV. Using 1 mV as the base unit
seemed totally reasonable. As a matter of fact, we now see ADCs with
resolution 12 mV or 8 mV, and our 1 mV unit is still totally fine.

Your problem is that you are not monitoring a voltage. You are
monitoring a current, so requirements are totally different. And it's
not always possible to anticipate future requirements. Current
measurement was totally out of the scope of hardware monitoring
initially... And I would claim it still is, BTW. Probably the IIO
subsystem would be better suited at the need.

> > We'll see more chips in the future
> > that are sensitive enough to report in uV.
>
> mV seems to be pretty accurate for voltage measurements.
> The shunt voltage is really just a reflection of the voltage across
> the current shunt resistor and reflects a current, not a voltage.
> 
> Sure, chips can sense voltages in the uV range, but that is typically 
> not used for voltage but for current measurements. With a 0.001 Ohm
> shunt resistor, 1uV translates to 1mA. Reporting that "voltage" in mA
> makes, in my opinion, more sense than reporting it in uV and expecting
> a common library to perform a translation of a reported voltage into mA.
> 
> Having said that, Jean has a support ticket open to implement such a conversion:
> 	http://www.lm-sensors.org/ticket/2258
> If he ever gets to it, I suspect we will have to address the uV issue,
> since mV are definitely insufficient for reporting shunt resistor voltages.

Yes, I remember we discussed this lately, and I didn't have the time to
work on this so far, sorry.

I have nothing against extending the sysfs interface to support uV
voltages. But this must be done in a way which doesn't break current
installations. Arbitrarily reporting in uV instead of the standard mV
isn't an option, neither for the ina209 driver alone, nor for all
drivers.

One way to do it would be to invent a brand new set of attributes for
uV voltages. For example volt[0-*]_input, etc. This is straightforward
and won't break anything, and would be transparent for applications,
however this would incur a lot of redundancy in the sysfs interface
definition document and in libsensors. If done smartly, this may be
bearable. The user constraints would be: you need the latest version of
libsensors for ina219 support, otherwise the attributes in question
aren't visible at all.

Another way would be to create a dedicated attribute for hwmon drivers
to advertise whether they are reporting voltages in uV or mV. For
example, file "unit_in" would contain -6 when the chip reports voltages
in uV, -3 if the chip reports voltages in mV (which would be the
default for backwards compatibility.) This would require very little
work in the sysfs-interface document and in libsensors, and would be
transparent to applications. The user constraints would be: you need
the latest version of libsensors for ina219 support, otherwise the
attributes in question are improperly scaled. Whether this is better or
worse than the constraints of the first option can be discussed... It
has the problem that the incorrectness is silent, but the advantage
that it can be corrected in sensors.conf if known (with, again, the
problem that a future update of libsensors will require a fix of
sensors.conf.)

I don't have a strong opinion. I don't think the INA219 chip is popular
enough that the second option is problematic. But if we go that route,
we should implement the libsensors side immediately so that it starts
propagating to the user base.

Note, the second option would also have the benefit that we can switch
to nV or V or kV at any time if we need to support strange hardware
monitoring devices. I don't expect it, but I didn't expect that we'd
need uV either, so...

If we go for the second option, I presume we would do the same for
current and power. Just in case...

> > I'm sure this is why the power* sysfs-interface is exported in uW
> > (microwatt). Eventually, devices will be sensitive enough to provide
> > data with this very fine sensitivity.
>
> I don't know for sure, but I suspect it is simply because mV * mA = uW.

Yes, I think that was the reasoning behind it. And also a simple "play
it safe" decision, because the feature was new and we didn't really
know what to expect from devices (contrary to voltages in 2005 as we
had 7 years of experience behind us.)

But you know, maybe someday someone will need nW and yell at us because
we didn't anticipate it ;)

> > 2) current calculation is not handled on-chip, it is handled by
> > libsensors
> > 
> > This was done to sidestep the "configuration register" setup which is
> > needed for the chip. The value of this register must be computed using
> > the datasheet and your specific sense resistor value in your specific
> > circuit. By computing current in userspace using the sense voltage, we
> > sidestep the issue completely.
>
> The chips provide current as
> 	Current Register = Shunt Register * Calibration Register / 4096
> 
> so the question for me would be why it would be necessary report the raw value
> of the shunt resistor voltage in the first place and not just stick with in0
> (in mV) and curr1 (in mA). If you want to report the "raw" value, you could
> report it in mA as suggested above (ie assume a 0.001 Ohm shunt resistor).
> 
> Part of the problem here is how to provide configuration data.
> The overall expectation for chip configuration is that it should be handled
> in the BIOS, ie before Linux starts. For applications where this is
> not the case, would be to define platform data to provide the necessary
> information. Another alternative would be to use OF (see the ads1015 driver
> for an example). Using sysfs attributes for this purpose is not a good idea.

+1

> Jean had some reservations about assuming a 0.001 Ohm shunt resistor. See 
> 	http://article.gmane.org/gmane.linux.documentation/2744/
> Providing platform data to configure the chips would definitely be
> a better option. 

Well well... If it makes everyone's life easier, I would be happy to
(let you) document the 0.001 Ohm rule in D/h/sysfs-interface and
possibly sensors.conf.5.

-- 
Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors


[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux