说到电池,也许大家觉得没什么神秘的,确实是没什么神秘的,大家也没重视,先问大家一个问题,一般手机电池的电压是多少?一般到多少电压会关机?哈哈,是不是似懂非懂的样子,,电池分为高压电池和低压电池,低压的一般为3.7V,高压的有4.2V,4.35V,高压电池一般是平板之类的才会用到,手机大多数是低压的。关机电压就需要根据电池的规格书来通过曲线分析。电池是手机最重要的一部分,没电搞毛线啊,UI再牛逼,有什么用。。。。但是要弄清电池算法,还是比较复杂的,在搞清楚电量算法之前,先从添加一块电池说起。。。
1.首先拿到电池曲线和截止电压对应的acc,对应电池的规格书。
现在有专门测试电池的软件,充放电过程,测试一个电池的充放电过程,大概需要一个星期左右,那么测试完成后会生成两个文件,一个是截止电压对应的acc,一个是dtsi,有了这两个文件,就足够了。
1.首先拿到电池曲线和截止电压对应的acc,对应电池的规格书。
现在有专门测试电池的软件,充放电过程,测试一个电池的充放电过程,大概需要一个星期左右,那么测试完成后会生成两个文件,一个是截止电压对应的acc,一个是dtsi,有了这两个文件,就足够了。
eg:
static struct ibat_temp_acc_lut ibat_temp_acc = {
.rows = 6,
.cols = 3,
.temp = {-20,0,25},
.ibat = {2,1.5,1,0.8,0.5,0},
.cutoff_mv = 3600, //截止电压
.acc = { //对应的ibat-acc-lut
{11,1372,3002},
{17,1948,3458},
{90,2903,3752},
{180,3296,3878},
{714,3740,3962},
{3952,4008,4016},
},
}
};
上面就是截止电压为3.6V时对应的acc。
上面就是截止电压为3.6V时对应的acc。
2.按一定的规范修改电池曲线设备树。注意rbatt-sf-lut项的对应个数。若不够,在其他文件复制一个,参照上面两个文件编写一个*.dtsi文件。
3.电池曲线设备树修改好后,修改qpnp-vm-bms.c(这个文件什么用呢?下一篇再说)添加该电池,,若兼容几块电池,注意匹配的交叉、重合。
到此,电池添加就完成了。
eg:
一. kernel/arch/arm64/boot/dts/chinachip/msm8916-mtp.dtsi
/ { //GG_4v2
mtp_batterydata: qcom,battery-data {
qcom,rpull-up-kohm = <100>;
qcom,vref-batt-therm = <1800000>;
- #include "batterydata-GG-4V2-6000mah.dtsi"
+ #include "batterydata-GG-4V2-4000mah.dtsi"
+ };
+};
+
+/ { //SKS_4v2
+ mtp_batterydata_sks: qcom,battery-data-sks {
+ qcom,rpull-up-kohm = <100>;
+ qcom,vref-batt-therm = <1800000>;
+ #include "batterydata-SKS-4V2-4000mah.dtsi"
};
};
@@ -482,6 +493,7 @@
qcom,battery-data-tg = <&mtp_batterydata_tg>;
qcom,battery-data-gg = <&mtp_batterydata_gg>;
qcom,battery-data-sk = <&mtp_batterydata_sk>;
+ qcom,battery-data-sks = <&mtp_batterydata_sks>;
qcom,resume-soc = <99>;
qcom,use-reported-soc;
qcom,charger-detect-cv;
@@ -129,8 +129,8 @@
#define BATT_ID_MAX_SK_4V35 1530000
#define BATT_ID_MIN_GG_4V35 1100000
#define BATT_ID_MAX_GG_4V35 1300000
-#define BATT_ID_MIN_TG_4V35 800000
-#define BATT_ID_MAX_TG_4V35 1000000
+#define BATT_ID_MIN_SKS_4V2 800000
+#define BATT_ID_MAX_SKS_4V2 1000000
二, kernel/drivers/power/qpnp-vm-bms.c
int64_t read_battery_id_for_smb;
@@ -3554,10 +3554,10 @@ static int set_battery_data(struct qpnp_bms_chip *chip)
node = of_find_node_by_name(chip->spmi->dev.of_node,
"qcom,battery-data-gg");
pr_err("BMS 4.35V found");
- }else if (battery_id > BATT_ID_MIN_TG_4V35 && battery_id < BATT_ID_MAX_TG_4V35){
+ }else if (battery_id > BATT_ID_MIN_SKS_4V2 && battery_id < BATT_ID_MAX_SKS_4V2){
node = of_find_node_by_name(chip->spmi->dev.of_node,
- "qcom,battery-data-tg");
- pr_err("BMS 4.35V found");
+ "qcom,battery-data-sks");
+ pr_err("BMS 4.2V found");
}else if (battery_id > BATT_ID_MIN_SK_4V35 && battery_id < BATT_ID_MAX_SK_4V35){
node = of_find_node_by_name(chip->spmi->dev.of_node,
"qcom,battery-data-sk");