一,Battery框架结构图
从上图分析,驱动中由2部分实现,一个是电池电量模块,另外一个是电池充电模块。最后有power supply统一管理。
1.1 Battery代码框架:
从这个图中知道,充电算法有2部分,一个是线性充电,由pmic实现,另外一个是快充充电,由外部IC实现。
1.2 oam_run()软件库伦流程图:
从上图可知,
1,ADC读取电池电压Vbat。
2,通过Vbat查找zcv表,获取电池内置R-bat。
3,做电池内置补偿,几Vbat + I*R_bat。
4,根据补偿后的Vbat查找zcv表获取百分比%。
5,最后计算电量百分比s%=100-D%。
以下是电池电池曲线相关:
1.3 MTK电池电量算法
1、SOC_BY_AUXADC:通过模数转换硬件获得电池电压,由电压来换算电量,误差大;
2、SOC_BY_SW_FG:通过库伦积分算法获得电量,其中电流由软件计算获得(MTK平台常用的电池电量算法);
3、SOC_BY_HW_FG:通过库仑积分算法获得电量,其中电流由硬件的模数转换获得;
4、SOC_BY_SW_FG与SOC_BY_HW_FG的区别在于放电电量的获取方式,一个由软件计算获得,一个由硬件模数转换获得。
二、库仑积分算法:
开机时测量电池的开路电压,由开路电压换算出电池电量,放电过程中对放电电流积分,开机时电池电量减去放电电量就是剩余电池电量;
三、SOC_BY_SW_FG相关定义
1、OCV:电池开路电压,即电池断开负载时测得的电压;
2、VBAT:电池闭路电压,即电池有负载时测得的电压;
3、r:电池内阻;
4、I:电池放电电流 (I = (OCV - VBAT)/r);
5、DOD:放电深度,100-DOD即为电池容量;
6、温度:电池特性受温度影响,一般用一个热敏电阻来测量温度;
7、ZCV:Zero current Voltage,一般指zcv表格,也是开路电压的意思;
8、VC:闭路电压;
9、CAR:库仑计;
10、Cmax/Qmax:电池容量。
二,thermal高温充电机制
MTK平台的thermal机制是一种高温保护主板机制。主要用于手机在充电过程中,温度太高对手机主板造成损坏。
thermal主要由thermal配置文件和thermal的驱动代码进行控制。
2.1 通过查询手机里的thermal机制,可以知道:
/proc/driver/thermal # cat tzbts
[mtkts_bts_read] trip_0_temp=100000,trip_1_temp=90000,trip_2_temp=61000,trip_3_temp=50000,trip_4_temp=46000
trip_5_temp=42000,trip_6_temp=65000,trip_7_temp=60000,trip_8_temp=55000,trip_9_temp=50000,
g_THERMAL_TRIP_0=0,g_THERMAL_TRIP_1=0,g_THERMAL_TRIP_2=0,g_THERMAL_TRIP_3=0,
g_THERMAL_TRIP_4=0,g_THERMAL_TRIP_5=0,g_THERMAL_TRIP_6=0,g_THERMAL_TRIP_7=0,
g_THERMAL_TRIP_8=0,g_THERMAL_TRIP_9=0,
cooldev0=mtktsAP-sysrst,cooldev1=mtk-cl-shutdown00,cooldev2=mtk-cl-cam00,cooldev3=abcct_lcmoff,cooldev4=mtk-cl-adp-fps,
cooldev5=abcct,cooldev6=no-cooler,cooldev7=no-cooler,cooldev8=no-cooler,cooldev9=no-cooler,time_ms=1000
trip_5_temp=42000,而对应的cooldev5=abcct。可以知道采用的是theraml中的abcct机制。
查看proc/driver/theraml/中clbcct内容:
/proc/driver/thermal # cat clbcct
65535
klog 0
curr_limit 65535
mtk-cl-bcct00 550 mA, state 0
mtk-cl-bcct01 350 mA, state 0
mtk-cl-bcct02 150 mA, state 0
查看proc/driver/thermal/中clabcct内容:
/proc/driver/thermal # cat clabcct
3000 44000 1000 200000 5 3000 0
abcct_cur_bat_chr_curr_limit 3000
abcct_cur_chr_input_curr_limit -1
abcct_pep30_cur_input_curr_limit 0
abcct_target_temp 44000
abcct_kp 1000
abcct_ki 200000
abcct_kd 5
abcct_max_bat_chr_curr_limit 3000
abcct_min_bat_chr_curr_limit 0
abcct_input_current_limit_on 0
abcct_HW_thermal_solution 3000
abcct_min_chr_input_curr_limit 0
abcct_times_of_ts_polling_interval 1
abcct_pep30_max_input_curr_limit 0
abcct_pep30_min_input_curr_limit 0
可以知道,手机中两个机制都存在。
使用mtk提供的工具Thermal_Config_tool_exe_v2.0.1813.0去查看android/device/mediatek/mt6739/目录下的thermal.conf和thermal.eng.conf文件。
在第一个窗口中查询到如下内容:
可以看到在mtktsAP中使用的是abcct,触发温度是42度。
在第二个窗口中查询到如下内容:
可以看到bcct是使能的。
可以看到abcct也是使能的。
也就是说,在这个项目中,thermal中bcct与abcct都是使能的,但是mtktsAP中使用的是abcct才是我们需要的。
这样我们在bcct中将其disable,将abcct中设置最小的充电电流,可以将target temp修改小一点,这样触发降电流就更快,发热就会更少。
2.2 具体的代码,可以阅读mtk的android代码。
其中上述的chrlmt_set_limit_handler函数是在代码drivers/misc/mediatek/theraml/common/coolers/mtk_cooler_bcct_v1.c 文件中打印出来的,可以知道是在以下代码中:
通过log中的打印,可以看到chrlmt_set_limit_handler打印的log数据中一直都是都是循环从3000降到0.
从一个充电温度高电流降到0的bug开始讲解:
<6>[34586.470707] (2)[16839:3ATHREAD]GC5025_camera_sensor[feature_control] feature_id = 3084
<4>[34586.553323] (1)[22062:kworker/u8:3][Thermal/TC/bcct]chrlmt_set_limit c14b4178 -1 200 0
<4>[34586.553424] (2)[7858:kworker/u9:0][Thermal/TC/bcct]chrlmt_set_limit_handler -1 200
<5>[34586.553435] (2)[7858:kworker/u9:0]charger_manager_set_input_current_limit: dev:mtk-cooler-bcct idx:0 en:-1
<5>[34586.553446] (2)[7858:kworker/u9:0]force:0 thermal:450000 setting:450000 type:4 usb_unlimited:0 usbif:0 usbsm:0
<5>[34586.553507] (2)[7858:kworker/u9:0]charger_manager_set_charging_current_limit: dev:mtk-cooler-bcct idx:0 en:200000
<5>[34586.553515] (2)[7858:kworker/u9:0]force:0 thermal:200000 setting:200000 type:4 usb_unlimited:0 usbif:0 usbsm:0
<6>[34586.557046] (0)[16846:AFthread]GC5025_camera_sensor[feature_control] feature_id = 3063
<6>[34586.570734] (0)[16839:3ATHREAD]GC5025_camera_sensor[feature_control] feature_id = 3084
<4>[34586.592981] -(1)[243:charger_thread]mt6357_get_auxadc_value: 8 callbacks suppressed
<5>[34586.592995] (1)[243:charger_thread][mt6357_get_auxadc_value] ch_idx = 0, channel = 0, reg_val = 0x596d, adc_result = 3772
<5>[34586.593021] (1)[243:charger_thread]force:0 thermal:200000 setting:200000 type:4 usb_unlimited:0 usbif:0 usbsm:0
<6>[34586.593169] (1)[243:charger_thread]ICHG = 200mA, CV = 4350mV, CHG_EN = 1
从这个上面可以得到是由于在充电时,开启了相机,导致主板温度达到45℃,触发了thermal机制,开始降低充电电流,以达到降低主板温度的目的。
三,thermal.conf温度参数修改的方法
thermal.conf设计CPU、PMIC、BATTERY等的温度参数,其路径一般在device/目录下,但是这是个加密文件,直接打开的话就是一堆看不懂的字符,需要使用对应的工具来解密,即thermal_config_tool。
1、把需要解密的conf文件放在thermal_config_tool的decrypt文件夹下,然后在conf后缀的后面加上.mtc的后缀。
2、双击decrypt文件夹中的decrypt_all_config.bat,这时会生成一个txt的文件,即解密后的文件。
3、按需修改解密后的txt文件。
4、在CMD命令下使用thermal_config_tool下的encrypt.exe把修改好的txt文件重新生成conf文件,如下:
encrypt.exe *.conf.txt thermal.conf