Re: [PATCH] power_supply: support CHARGE_NOW in OLPC battery

From: Anton Vorontsov
Date: Thu May 08 2008 - 15:36:31 EST


On Thu, May 08, 2008 at 02:53:25PM -0400, Richard A. Smith wrote:
> Anton Vorontsov wrote:
>> On Thu, May 08, 2008 at 01:01:02PM -0400, Andres Salomon wrote:
>>> Ok, CC'ing Richard as I should've done in the first place...
>> [...]
>>>>> + case POWER_SUPPLY_PROP_CHARGE_NOW:
>>>>> + ret = olpc_ec_cmd(EC_BAT_ACR, NULL, 0, (void
>>>>> *)&ec_word, 2);
>>>>> + if (ret)
>>>>> + return ret;
>>>>> +
>>>>> + val->intval = be16_to_cpu(ec_word);
>>>> But you didn't convert it to the uAh, I think you should.
>>>
>>> We have logic in userspace that converts ACR to a useful number; for
>>> our purposes, we'd just like to read the raw ACR values.
>>
>> No. The purpose of power supply class is to report values in common
>> units. Not some random value that userspace then should guess how to
>> compute.
>
> I'm fine with that. I'll have to make my scripts do some detection on
> what kernel is running and convert or not convert but thats not too hard.
>
> I remember Dave asking me if I wanted it converted and I told him not to
> bother and just to export the raw value. I would deal with the units.
> At the time I was just trying to get some simple debugging info. Turns
> out that ACR is really useful for debugging battery problems and it
> stuck.
>
> A single ACR reading itself does not tell you anything usefull. Its a
> signed 16 bit free running coulomb counter that counts up and down based
> on how much juice goes into or out of the battery. So to extract any
> meaningful info you need 2 readings separated by some instance in time.
> The difference between the 2 tells you the relative energy you have
> consumed or added.

Cool, I believe this is exactly same thing as we have on DS2760. ACR
counts up and down. For example, if there was a current of 10 uA for
30 minutes, ACR will show 5 uAh. Additional 30 minutes with current
-10 uA will result in 0 uAh in ACR... Right?

> The units for the ACR register in the DS2765 are:

Do you have any specs for the ds2765? I'd like to see one, if
it isn't restricted matter. google:ds2765 pdf wasn't helpful...

> 6.25 uVh / Rsense
> OLPC Rsense = .015 Ohms
>
> The integer math conversion for ACR to mAh that I use in my scripts is:
>
> (ACR2 - ACR1) * 625 / 1500

Just curious.. What does the final value mean and how do you use it?
ACR is the Ah counter. You're subtracting one from another, and that
value will show you.. difference of Ah between T2 and T1..?

You'll get something useful (current) if you divide the value by T2-T1
though... ;-) But I believe OLPC can report current by itself...

>>> Perhaps CHARGE_NOW is the wrong thing to be using, if we can't get
>>> uAh and CHARGE_* requires that unit.
>>
>> I don't think that converting X * uAh or uAh / Y to uAh is impossible.
>> I'd suggest you to convert the ACR value to uAh using fractions, see
>> ds2760_battery.c. Even if the final value losing precision a bit, it is
>> still useful to do CHARGE_NOW.
>
> Is CHARGE_NOW supposed to be an absolute indication of the level of
> charge in the battery? If so then thats not ACR.

This depends. On DS2760 ACR is the only way to determine battery's
"charge" at the given time (thus the capacity in percents, since ds2760
can't report it).

It needs calibration though... ds2760_battery.c doing this: resetting the
ACR to CHARGE_FULL value when battery is in charging state with current
flow < 10 mA.

Works quite good here.

> That would be SOC% *
> battery capacity. The EC uses the relative motion of the ACR to update
> the SOC%.

Since you don't seem to use ACR as CHARGE_NOW, I think maybe we indeed
should implement PROP_ACR or better PROP_CHARGE_COUNTER? With units of
uAh... would that work?

--
Anton Vorontsov
email: cbouatmailru@xxxxxxxxx
irc://irc.freenode.net/bd2
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/