电池电压电鱼门槛电压时关键性的循环充电log:
[114275] [check_bat_protect_status]: check VBAT=3447 mV with 3450 mV, start charging...
[114298] [BATTERY] charging current=607 charger volt=4882
[114305] [BATTERY] charging current=607 charger volt=4882
[114312] [BATTERY] charging current=607 charger volt=4882
[114320] [BATTERY] charging current=607 charger volt=4882
[114327] [BATTERY] charging current=607 charger volt=4882
[114334] [BATTERY] charging current=607 charger volt=4882
[114341] [BATTERY] charging current=607 charger volt=4882
[114348] [BATTERY] charging current=607 charger volt=4882
[114356] [BATTERY] charging current=625 charger volt=4882
[119393] [check_bat_protect_status]: check VBAT=3454 mV
充到大于门槛电压跳出循环log:
[119393] [check_bat_protect_status]: check VBAT=3454 mV with 3450 mV, stop charging...
在lk阶段的mt_battery.c文件
mt65xx_bat_init
if (bat_vol < BATTERY_LOWVOL_THRESOLD) 判断门槛电压,这个值是3450
{
if (g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && upmu_is_chr_det() == KAL_TRUE) { 关机充电启动模式,同时插了充电器
dprintf(CRITICAL, "[%s] Kernel Low Battery Power Off Charging Mode\n", __func__);
g_boot_mode = LOW_POWER_OFF_CHARGING_BOOT; 设置启动模式
check_bat_protect_status(); 检测电池保护状态
看下check_bat_protect_status函数
void check_bat_protect_status() // 检查电池是否处于保护状态
{
kal_int32 bat_val = 0;
int chr_volt;
#if !defined(SWCHR_POWER_PATH)
int current,cnt=0,i;
#endif
#if defined(SWCHR_POWER_PATH)
bat_val = get_i_sense_volt(5);
#else
bat_val = get_bat_sense_volt(5);
#endif
dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, start charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD);
while (bat_val < BATTERY_LOWVOL_THRESOLD) { // 检查电池电压是否 < 3450,如果小于就在这里循环一直充电
mtk_wdt_restart();
if (upmu_is_chr_det() == KAL_FALSE) { // 检查是否有插充电器
dprintf(CRITICAL, "[BATTERY] No Charger, Power OFF !\n");
mt6575_power_off();
while (1) {
if (fix_coverity == 1)
return;
}
}
chr_volt= get_charger_volt(1);
if (chr_volt>V_CHARGER_MAX) { // 检测充电器电压是否过压
dprintf(CRITICAL, "[BATTERY] charger voltage is too high :%d , threshold is %d !\n",chr_volt,V_CHARGER_MAX);
#if defined(SWCHR_POWER_PATH)
mt6575_power_off();
#endif
break;
}
/* pmic_set_register_value(PMIC_BATON_TDET_EN, 1); */
pmic_set_register_value(PMIC_RG_BATON_EN, 1);
if (pmic_get_register_value(PMIC_RGS_BATON_UNDET) == 1) { // 检查有没有拔出电池
dprintf(CRITICAL, "[BATTERY] No battry plug-in. Power Off.");
mt6575_power_off();
break;
}
dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, start charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD); // 循环打印
is_charging = 1;
pchr_turn_on_charging(KAL_TRUE);
#if defined(SWCHR_POWER_PATH)
thread_sleep(5000);
#else
cnt=0;
for (i=0; i<10; i++) {
current=get_charging_current(1);
chr_volt=get_charger_volt(1);
if (current<100 && chr_volt<4400) {
cnt++;
dprintf(CRITICAL, "[BATTERY] charging current=%d charger volt=%d\n\r",current,chr_volt);
} else {
dprintf(CRITICAL, "[BATTERY] charging current=%d charger volt=%d\n\r",current,chr_volt);
cnt=0;
}
}
if (cnt>=8) {
dprintf(CRITICAL, "[BATTERY] charging current and charger volt too low: %d\n",cnt);
pchr_turn_off_charging();
#ifndef NO_POWER_OFF
mt6575_power_off();
#endif
while (1) {
dprintf(CRITICAL, "If you see the log, please check with RTC power off API\n\r");
if (fix_coverity == 1)
return;
}
}
thread_sleep(5000);
#endif
#if defined(SWCHR_POWER_PATH)
bat_val = get_i_sense_volt(5);
#else
bat_val = get_bat_sense_volt(5);
#endif
dprintf(CRITICAL, "[%s]: check VBAT=%d mV \n", __FUNCTION__, bat_val);
}
mtk_wdt_restart();
dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, stop charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD); // 电压大于3.45v后跳出while循环
}
总结:当插入充电器后电池电压还是小于3.45v就会在while循环里面充电,直到电池电压大于门槛电压才会进入linux内核。