#!/bin/bash # NEEDS BASH! won't run on busybox, sorry # v1.2 (c) 2009 2011-10-20 DocScrutinizer # # this script decodes the smartbattery BQ27000 Coulomb-Counter # v1.2 tries to deal with sysfs path changes on OM kernels, and supports N900 directly if [ x$BASH_VERSION = x ]; then echo "no bash detected, aborting" exit 5 fi #set -v -x set -ehu pv() { # print value, in: byte(s)-hex NN [NN], out: dezimal 5 digits unsigned 0..65535 local i local v while [ $# -gt 0 ]; do v=$(( $1 )) i=$(( (i * 0x100) + 0x${dmp[$v]} )) shift done printf %5d "$i" } printdetail() { echo " RAM Registers" echo " 0x00: 0x${dmp[0]}" " CTRL Device Control Register R/W" echo " 0x01: 0x${dmp[1]}" " MODE Device Mode Register R/W" echo "0x03 - 0x02: `pv 0x03 0x02`" " AR At-Rate High - Low Byte (user writes here) 3.57 µV (1) R/W" echo "0x05 - 0x04: `pv 0x05 0x04`" "ARTTE At-Rate Time-to-Empty High - Low Byte Minutes R" echo "0x07 - 0x06: `pv 0x07 0x06`" " TEMP Reported Temperature High - Low Byte 0.25 °K R" local milliC=$(( `pv 0x07 0x06` * 250 - 273150)) local C=$(( milliC / 1000 )) local Cdecimals=$(( milliC - ( C * 1000 ) )) local F=$(( ( milliC * 18 + 320000 ) / 10000 )) echo " /4 - 273.15 = ${C}.${Cdecimals}°C, ${F}°F" echo "0x09 - 0x08: `pv 0x09 0x08`" " VOLT Reported Voltage High - Low Byte mV R" echo " 0x0A: 0x${dmp[0x0A]}" "FLAGS Status Flags R" echo " $(( (0x${dmp[0x0A]} & 2#10000000)?1:0 )) CHGS Charge State flag. A 1 in the CHGS indicates a charge current (VSRP > VSRN). Charging." echo " $(( (0x${dmp[0x0A]} & 2#01000000)?1:0 )) NOACT No Activity flag. A 1 indicates that the voltage across RS is ~0. Neither charge nor discharge." echo " $(( (0x${dmp[0x0A]} & 2#00100000)?1:0 )) IMIN Li-ion taper current detection flag. A 1 indicates that the charge ... is considered finished." echo " $(( (0x${dmp[0x0A]} & 2#00010000)?1:0 )) CI Capacity Inaccurate flag. A 1 indicates no valid learning cycle." echo " $(( (0x${dmp[0x0A]} & 2#00001000)?1:0 )) CALIP Offset Calibration-In-Progress flag." echo " $(( (0x${dmp[0x0A]} & 2#00000100)?1:0 )) VDQ Valid Discharge flag. Learning cycle in progress." echo " $(( (0x${dmp[0x0A]} & 2#00000010)?1:0 )) EDV1 First End-of-Discharge-Voltage flag. A 1 indicates that voltage < EDV1" echo " $(( (0x${dmp[0x0A]} & 2#00000001)?1:0 )) EDVF Final End-of-Discharge-Voltage flag. A 1 indicates that the battery has discharged to the empty capacity threshold." echo " 0x0B: `pv 0x0B`" " RSOC Relative State-of-Charge % R" echo "0x0D - 0x0C: `pv 0x0D 0x0C`" " NAC Nominal Available Capacity High - Low Byte 3.57 µVh (1) R" echo " *3.57 / 20 = " $(( `pv 0x0D 0x0C` * 179 / 1000)) "mAh" echo "0x0F - 0x0E: `pv 0x0F 0x0E`" " CACD Discharge Compensated NAC High - Low Byte 3.57 µVh (1) R" echo " *3.57 / 20 = " $(( `pv 0x0F 0x0E` * 179 / 1000)) "mAh" echo "0x11 - 0x10: `pv 0x11 0x10`" " CACT Temperature Compensated CACD High - Low Byte 3.57 µVh (1) R" echo " *3.57 / 20 = " $(( `pv 0x11 0x10` * 179 / 1000)) "mAh" echo "0x13 - 0x12: `pv 0x13 0x12`" " LMD Last Measured Discharge High - Low Byte 3.57 µVh (1) R" echo " *3.57 / 20 = " $(( `pv 0x13 0x12` * 179 / 1000)) "mAh" echo "0x15 - 0x14: `pv 0x15 0x14`" " AI Average Current High - Low Byte 3.57 µV (1) R" echo " *3.57 / 20 = " $(( `pv 0x15 0x14` * 179 / 1000)) "mA " echo "0x17 - 0x16: `pv 0x17 0x16`" " TTE Time-to-Empty High - Low Byte Minutes R" echo "0x19 - 0x18: `pv 0x19 0x18`" " TTF Time-to-Full High - Low Byte Minutes R" echo "0x1B - 0x1A: `pv 0x1B 0x1A`" " SI Standby Current High - Low Byte 3.57 µV (1) R" echo " *3.57 / 20 = " $(( `pv 0x1B 0x1A` * 179 / 1000)) "mA " echo "0x1D - 0x1C: `pv 0x1D 0x1C`" " STTE Standby Time-to-Empty High - Low Byte Minutes R" echo "0x1F - 0x1E: `pv 0x1F 0x1E`" " MLI Max Load Current High - Low Byte 3.57 µV (1) R" echo " *3.57 / 20 = " $(( `pv 0x1F 0x1E` * 179 / 1000)) "mA " echo "0x21 - 0x20: `pv 0x21 0x20`" "MLTTE Max Load Time-to-Empty High - Low Byte Minutes R" echo "0x23 - 0x22: `pv 0x23 0x22`" " SAE Available Energy High - Low Byte 29.2 µV2h (2) R" echo " *29.2 / 20 = " $(( `pv 0x23 0x22` * 146 / 100)) "mWh " echo "0x25 - 0x24: `pv 0x25 0x24`" " AP Average Power High - Low Byte 29.2 µV2 (2) R" echo " *29.2 / 20 = " $(( `pv 0x25 0x24` * 146 / 100)) "mW " echo "0x27 - 0x26: `pv 0x27 0x26`" " TTECP Time-to-Empty At Constant Power High-Low Byte Minutes R" echo "0x29 - 0x28: `pv 0x29 0x28`" " CYCL Cycle Count Since Learning Cycle High-Low Byte Cycles R" echo "0x2B - 0x2A: `pv 0x2B 0x2A`" " CYCT Cycle Count Total High - Low Byte Cycles R" echo " 0x2C: `pv 0x2C`" " CSOC Compensated State-of-Charge % R" echo } # printstatic() { echo "EEPROM Registers" echo "0x2D - 0x6D - RESERVED R" echo " 0x6E: `pv 0x6E`" "EE_EN EEPROM Program Enable R/W" echo "0x6F - 0x75 - RESERVED R" echo " 0x76: `pv 0x76`" " ILMD Initial Last Measured Discharge High Byte 914 µVh (1) R/W" echo " *0x100 * 3.57 / 20 = " $(( `pv 0x76 0x00` * 179 / 1000)) "mAh fabcoded cell capacity" echo " 0x77: `pv 0x77`" "SEDVF Scaled EDVF Threshold R/W" echo " +0x100)*8 = " $(( (`pv 0x77` + 0x100) * 8)) "mV (@ 0%)" echo " 0x78: `pv 0x78`" "SEDV1 Scaled EDV1 Threshold R/W" echo " +0x100)*8 = " $(( (`pv 0x78` + 0x100) * 8)) "mV (@ 6.25%)" echo " 0x79: `pv 0x79`" " ISLC Initial Standby Load Current 7.14 µV (1) R/W" echo " *7.14 / 20 = " $(( `pv 0x79` * 714 / 2000)) "mA " echo " 0x7A: `pv 0x7A`" "DMFSD Digital Magnitude Filter and Self-Discharge Rate Constants R/W" echo " 0x7B: `pv 0x7B`" "TAPER Aging Estimate Enable, Charge Termin. Taper I 228 µV (1) R/W" echo " 0x7C: `pv 0x7C`" "PKCFG Pack Configuration Values R/W" echo " 0x7D: `pv 0x7D`" " IMLC Initial Max Load Current, OR, ID#3 457 µV (1) R/W" echo " 0x7E: `pv 0x7E`" "DCOMP Discharge Rate Compensation Constants, OR, ID#2 R/W" echo " 0x7F: `pv 0x7F`" "TCOMP Temperature Compensation Constants, OR, ID#1 R/W" echo echo "(1) Divide by Rs in milliohms to convert µV to mA or µVh to mAh. " echo "(2) Divide by Rs in milliohms to convert µV2 to mW or µV2h to mWh." echo "Rs=20mOhm" } #main dmppath=`find /sys/devices/ -path '*/hdq/*' -name dump` if [ x$dmppath != x ]; then dmpcmd="cat ${1:-${dmppath}}| tr -s '\n ' ' '" else dmpcmd="i2cdump -y 2 0x55 b|tail -n +2|cut -d ' ' -f 2-17" fi declare -a dmp #dmp=(`cat ${1:-/sys/devices/platform/s3c24xx_pwm.0/hdq.0/hdq/dump}| tr -s '\n ' ' '`) dmp=(`eval $dmpcmd`) printdetail printstatic