具体log如下:
[ 234.684827] [3: kworker/u16:6: 2048] [DEBUG] s2mu106_get_charging_health: S2MU106_CHG_STATUS0 0x3
[ 234.690858] [3: kworker/u16:6: 2048] check_health: T = 250, bat_health(Good), T_health(Good), Charging(Charging)
[ 234.701232] [3: kworker/u16:6: 2048] check_charging_full Start
[ 234.707733] [3: kworker/u16:6: 2048] bat_monitor_work: Status(Charging), Health(Good), Cable(4), Recharging(0))
[ 234.709507] [2: healthd: 3322] healthd: battery l=75 v=4232 t=25.0 h=2 st=2 c=0 fc=100 chg=u
[ 234.710374] [1:health@2.0-serv: 3334] healthd: battery l=75 v=4232 t=25.0 h=2 st=2 c=0 fc=100 chg=u
[ 237.540214] [1: kworker/u16:6: 2048] soc_control_worker: S2MU00x battery capacity = 75, status = 1
[ 237.540428] [1: kworker/u16:6: 2048] soc_control_worker: Capacity is more than 75, stop charging
[ 237.540610] [1: kworker/u16:6: 2048] set_battery_status: current status = 1, new status = 2
[ 237.544667] [1: kworker/u16:6: 2048] set_charging_current: cable_type(4), current(500, 500, 300)
[ 237.553662] [1: kworker/u16:6: 2048] [DEBUG] s2mu106_enable_charger_switch: turn off charger
[ 237.564145] [1: kworker/u16:6: 2048] s2mcs02_chg_set_property: POWER_SUPPLY_PROP_CHARGING_ENABLED, val->intval = 1.
[ 237.572754] [1: kworker/u16:6: 2048] s2mcs02_set_charger_state: BUCK_EN(DISABLE)
[ 237.591180] [1: kworker/u16:6: 2048] s2mcs02_charger_test_read: S2MCS02 : [0x04]0xff, [0x05]0xff, [0x06]0xff, [0x07]0xea, [0x08]
[ 237.604112] [1: kworker/u16:6: 2048] s2mcs02_charger_test_read: S2MCS02 : [0x54]0xc3, [0x55]0x14, [0x56]0x80, [0x57]0x40, [0x58]
[ 237.618310] [1: kworker/u16:6: 2048] s2mcs02_charger_test_read: S2MCS02 : [0x5d]0x00, [0x5e]0x00, [0x5f]0x07, [0x60]0x42, [0x61]
[ 237.627320] [1: kworker/u16:6: 2048] [DEBUG]s2mu106_set_buck: set buck off (charger off mode)
[ 237.637326] [1: kworker/u16:6: 2048] s2mcs02_chg_set_property: POWER_SUPPLY_PROP_CHARGING_ENABLED, val->intval = 2.
[ 237.646559] [1: kworker/u16:6: 2048] s2mcs02_set_charger_state: BUCK_EN(DISABLE)
[ 237.663674] [1: kworker/u16:6: 2048] s2mcs02_charger_test_read: S2MCS02 : [0x04]0xff, [0x05]0xff, [0x06]0xff, [0x07]0xea, [0x08]
[ 237.678177] [1: kworker/u16:6: 2048] s2mcs02_charger_test_read: S2MCS02 : [0x54]0xc3, [0x55]0x14, [0x56]0x80, [0x57]0x40, [0x58]
[ 237.692710] [1: kworker/u16:6: 2048] s2mcs02_charger_test_read: S2MCS02 : [0x5d]0x00, [0x5e]0x00, [0x5f]0x07, [0x60]0x42, [0x61]
[ 244.736021] [0: kworker/u16:6: 2048] bat_monitor_work: start monitoring
[ 244.781256] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_vbat: vbat (4088)
[ 244.836726] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_avgvbat: avgvbat (4156)
[ 244.838650] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_current: current (-148)mA
[ 244.841605] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_avgcurrent: avg current (335)mA
[ 244.842690] [1: kworker/u16:6: 2048] ntc_show_batt_temp data is NULL!
[ 244.852223] [1: kworker/u16:6: 2048] s2mu106_get_temperature: temperature (258)
[ 244.860002] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_rawsoc: OTP 52(0d) 53(10), current 52(0d) 53(10), 0x1)
[ 244.873938] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_avgcurrent: avg current (335)mA
[ 244.934540] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_avgvbat: avgvbat (4154)
[ 244.936402] [2: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_vbat: vbat (4088)
[ 244.938116] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_current: current (-156)mA
[ 244.940783] [2: kworker/u16:6: 2048] s2mu106_get_comp_socr: SOCr = 0, T_SOCr = 0, I_SOCr = 0
[ 244.953359] [3: kworker/u16:6: 2048] s2mu106_temperature_compensation: diff_soc = 2, data[1] = 0x00, data[0] = 0x02
[ 244.958541] [3: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_rawsoc: current_soc (7509), compen_soc (7511), previo)
[ 244.975453] [3: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_rawsoc: UI SOC = 75, is_charging = 0, avg_vbat = 4154f
[ 245.050009] [3: kworker/u16:6: 2048] s2mu106_get_soh: original batcap = 3500, new_batcap = 3500, soh = 100
[ 245.054706] [3: kworker/u16:6: 2048] s2mu106_get_remaining_cap: fcc = 3500, remaining_cap = 2628
[ 245.054887] [3: kworker/u16:6: 2048] s2mu106_get_rawsoc: SOC_M = 7509, Chg_stat = 1, VM = 1, avbVBAT = 4154, avgCURR = 335, avgT8
[ 245.107935] [1: kworker/u16:6: 2048] [FG]s2mu106_fg_test_read: 0x04:0xd5, 0x05:0x82, 0x06:0x7c, 0x07:0x02, 0x08:0x0f, 0x09:0x30,
[ 245.131053] [1: kworker/u16:6: 2048] s2mu00x-battery s2mu00x-battery: get_battery_capacity: SOC(75), rawsoc(75), max_rawsoc(100).
[ 245.146207] [1: kworker/u16:6: 2048] s2mu106_get_soh: original batcap = 3500, new_batcap = 3500, soh = 100
[ 245.159656] [1: kworker/u16:6: 2048] s2mu106-fuelgauge 7-003b: s2mu106_get_avgcurrent: avg current (320)mA
[ 245.184871] [1: kworker/u16:6: 2048] s2mu106_test_read: 0x0a:0xff, 0x0b:0x00, 0x0c:0x9c, 0x0d:0x00, 0x0e:0x05, 0x0f:0x00, 0x10:0f
[ 245.195717] [1: kworker/u16:6: 2048] get_battery_info: battery status = 2, charger status = 3
LOG分析:查找充电停止结点处的log可以得出在75%充电截止是因为soc_contrlo_worker()停止了充电,查看源码可以看出,此处设置的电量大于75%以后充电电流就被限制在了在100MA,不足以供应系统使用,所以电池开始耗电。
[ 237.540214] [1: kworker/u16:6: 2048] soc_control_worker: S2MU00x battery capacity = 75, status = 1
[ 237.540428] [1: kworker/u16:6: 2048] soc_control_worker: Capacity is more than 75, stop charging
[ 237.540610] [1: kworker/u16:6: 2048] set_battery_status: current status = 1, new status = 2
[ 237.544667] [1: kworker/u16:6: 2048] set_charging_current: cable_type(4), current(500, 500, 300)
[ 237.553662] [1: kworker/u16:6: 2048] [DEBUG] s2mu106_enable_charger_switch: turn off charger
源码修改:注掉soc_control_worker();
--- a/drivers/power/supply/s2mu00x_battery.c
+++ b/drivers/power/supply/s2mu00x_battery.c
@@ -1717,28 +1717,38 @@ static enum alarmtimer_restart bat_monitor_alarm(
return ALARMTIMER_NORESTART;
}
+/*
static void soc_control_worker(struct work_struct *work)
{
struct s2mu00x_battery_info *battery =
container_of(work, struct s2mu00x_battery_info, soc_control.work);
pr_info("%s: S2MU00x battery capacity = %d, status = %d\n",
__func__, battery->capacity, battery->status);
if ((battery->capacity >= 75) && (battery->status == POWER_SUPPLY_STATUS_CHARGING)) {
pr_info("%s: Capacity is more than 75, stop charging\n", __func__);
set_battery_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
set_charger_mode(battery, S2MU00X_BAT_CHG_MODE_BUCK_OFF);
battery->discarging_flag = 1;
}else if ((battery->capacity < 70) && (battery->discarging_flag == 1)) {
pr_info("%s: Capacity is less than 70, recharging\n", __func__);
set_battery_status(battery, POWER_SUPPLY_STATUS_CHARGING);
}
queue_delayed_work(battery->monitor_wqueue, &battery->soc_control, 10*HZ);
}
+*/
static int s2mu00x_battery_probe(struct platform_device *pdev)
{
struct s2mu00x_battery_info *battery;
@@ -1934,8 +1944,8 @@ static int s2mu00x_battery_probe(struct platform_device *pdev)
if ((is_charging_mode == S2MU00X_POWEROFF_CHG_MODE) ||
(is_charging_mode == S2MU00X_NOR_MODE)) {
pr_info("%s: Poweroff charger mode, enable charging\n", __func__);
- INIT_DELAYED_WORK(&battery->soc_control, soc_control_worker);
- queue_delayed_work(battery->monitor_wqueue, &battery->soc_control, 5*HZ);
+ //INIT_DELAYED_WORK(&battery->soc_control, soc_control_worker);
+ //queue_delayed_work(battery->monitor_wqueue, &battery->soc_control, 5*HZ);
} else if (is_charging_mode == S2MU00X_FAC_MODE) {
pr_info("%s: Factory boot mode, stop charging\n", __func__);
set_battery_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);