mt6735/mt8735 目前默认使用硬件电量计(SOC_BY_HW_FG)采集电池电量,现在简单描述一下这硬件电量计的工作过程。
1. 首先,系统在kernel-3.10/drivers/misc/mediatek/mach/mt6735/ap7350_tb_l1/power/cust_battery_meter.h 头文件中默认定义了 #define SOC_BY_HW_FG,使用硬件电量计的算法
文件位置kernel-3.10/drivers/power/mediatek/battery_meter.c
2. 初始化电量计
函数 fgauge_initialization 和 fgauge_algo_run_init
3. 在fgauge_construct_battery_profile_init里面根据cust_battery_meter_table.h里面的信息重构zcv表格,分50个等级,每2%一级。
4. 读取电池温度,电池容量等信息,并根据当前温度重构电池内阻表和zcv表。
5. 读取闭路电压,并用函fgauge_compensate_battery_voltage_recursion计算出开路电压,主要是做了一个电压补偿,之后用开路电压查找zcv表计算电池剩余容量。
6. 调用函数battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV,&gFG_voltage),直接从PMIC读取电池的开路电压,并计算电池剩余容量。
7. 读取rtc里面保存的电量值和从4和5里面计算出来的电量值做对比判断,选择合适的电量值作为电池的初始电量。
文件位置kernel-3.10/drivers/power/mediatek/battery_common.c
(1)函数mt_battery_charger_detect_check完成充电器是否插入的判断。
(2)函数mt_battery_GetBatteryData主要完成电池信息的获取,获取电池电压,电流和温度等信息。过程中会调用函数fgauge_algo_run,此函数输出的log信息对调试电池电量不准的问题有很大的帮助。
mt_battery_GetBatteryData()读取电池相关信息:电压、电流、充电器电压、电池温度,通过SOC = battery_meter_get_battery_percentage();来获取电池电量百分比。里面会调fgauge_algo_run()这个函数来循环获取电量值,原理上与dod0值的获取类似。
当机器用的是硬件电量计的时候,zcv计算的电量实际上在这里只是起到参考作用,并不会影响系统的电量显示和使用。如果软件zcv表格是正确的,但这里的zcv计算电量和电量计计算电量相差比较大,这时候就要考虑调节电池容量的大小,一般在放电过程中zcv计算电量比电量计计算电量大,就要适当的增加电池容量,反之则减少。电池容量设的太小,会出现电量显示1%时还能用很久的现象,太大则会出现低电量时电量下降的很快,或还没到0%就关机了。
(3)函数mt_battery_thermal_check则实现温度的监控,当电池问题高于设定温度,一般是60度时系统会强制关机。
(4)函数mt_battery_notify_check则实现温度、电压和电量等一些异常并通知android层,最终提示给用户。
(5)当有充电器插入时,系统会运行mt_battery_CheckBatteryStatus检查电池的一些状态,从而决定充电与否,里面包含了高低温,充电器电压,是否在通话状态和充电时间等检测。
(6)函数mt_battery_charging_algorithm完成充电算法。这里两种充电方式,一是PMIC充电的Liner_charging和外部充电IC的Switch_charging。一般来说Switch_charging的充电电流要比Liner_charging大。mt_battery_charging_algorithm()完成充电算法:PMIC充电的Liner_charging和外部充电IC的Switch_charging。两种充电方式的主流程其实区别不大,基本都包含了预充电,恒流充电,满电判断和二次充电。有时候会出现充满电时,电池电压偏低的情况,这时候可以适当提高充电电压或者减少充电截止电流。
(7)函数mt_battery_update_status主要实现将电池,充电等状态更新到android层,如电量,充电器是否插入等等。当电量比较低的时候battery_update里面会调用到mt_battery_0Percent_tracking_check 电池电压小于SYSTEM_OFF_VOLTAGE时,BMT_status.UI_SOC减少到0,这时android上层会接收到电量等于0的更新,并发送命令关闭机器。
(8)mt_kpoc_power_off_check()实现关机充电时对charger的检测