N900 Hardware Charge Meter

There is a charge meter chip in the N900, a TI BQ27200 this can be used to accurately measure the state of the battery.

Hardware

In many phones, this chip would be integrated into the battery, which has a number of benefits, from more rapid temperature sensing of potentially dangerous conditions in the battery, to being able to swap the battery, and have the swapped batteries charge accurately measured instantly.

The N900 integrates this chip onto the motherboard.

Software

It does not function properly in normal use with the stock BME as that usually turns off the phone before the threshold which would enable the charge monitor to properly learn the battery capacity.

With a replacement BME, it can learn battery capacity, and be used for useful life predictions.

It also can be used for energy profiling - see this page on power use.


There is no kernel driver in the default N900 software for this chip, a partial third party driver bq27x00_battery exists.

This third party driver has some issues - for example - the 'current_now' value it exports is not mA, but needs multiplied by (3.57/n) - where n is the sense resistor in the N900. The sense resistor seems to be between 20 and 22 mR - but no accurate measurements have been performed, and the schematic does not help with this.

Now on kernel mailinglist is series of patches which improve (report more properties about battery then BME) kernel driver bq27x00_battery. All these issues are fixed. Backported patches for N900 are here: http://talk.maemo.org/showpost.php?p=925980&postcount=674

As of now (2011-10-20) this kernel module still isn't fixed for good and introduced massive problems by either exclusively opening I2C bus so bme couldn't work anymore when started after this module got loaded, or the patch introduced with powerkernel-48 thoroughly messed up all I2C on the system, thus creating possible race conditions that may even destroy your hardware.

There's a script and acompanying I2Ctools to read out the complete info from bq27200: http://enivax.net/jk/n900/bq.tar (thanks ShadowJK) Or you can use Joerg_rw's original bq27k-detail script (needs bash, originally built for OM NEO FR: http://people.openmoko.org/joerg/battery/bq27k-detail), with this cmdline:

i2cdump -y 2 0x55 b|tail -n +2|cut -d " " -f 2-17|./bq27k-detail " "

New version available at http://people.openmoko.org/joerg/battery/bq27k-detail2 works (with bash and i2c-tools installed) without any cmdline acrobatics, on OM FR and stock N900 (no broken bq27200.ko kernel module and thus no power kernel needed. Might even fail on some powerkernel versions when that module got loaded)