手机电池内部带有ntc电阻,该电阻随电池温度变化而变化,根据ntc的这一特性,便可推算出电池温度,从而定制化手机行为。
ntc电路如下,R6106默认不贴,把电池扣上去后,形成了一个简易的分压电路,假设电池ntc电阻为R,则BAT_TEMP_ADC的电压为1.85*R/(R+47K),BAT_TEMP_ADC的电压可以通过cpu内部的adc电路测量出来,进入反算出电阻ntc阻值R,再根据电池ntc表,推算出电池温度。
电池高温关机
mShutdownBatteryTemperature = mContext.getResources().getInteger(
com.android.internal.R.integer.config_shutdownBatteryTemperature);
private void shutdownIfOverTempLocked() {
// shut down gracefully if temperature is too high (> 68.0C by default)
// wait until the system has booted before attempting to display the
// shutdown dialog.
if (mHealthInfo.batteryTemperature > mShutdownBatteryTemperature) {
mHandler.post(new Runnable() {
@Override
public void run() {
if (mActivityManagerInternal.isSystemReady()) {
Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
intent.putExtra(Intent.EXTRA_REASON,
PowerManager.SHUTDOWN_BATTERY_THERMAL_STATE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivityAsUser(intent, UserHandle.CURRENT);
}
}
});
}
}
config.xml - OpenGrok cross reference for /frameworks/base/core/res/res/values/config.xml
<integer name="config_shutdownBatteryTemperature">680</integer>
温度过高或者过低停止充电
以展讯平台为例,高于80°c或者低于-20°c都停止充电
cm-battery-cold = <200>;
cm-battery-cold-in-minus;
cm-battery-hot = <800>;
cm-battery-temp-diff = <100>
static int cm_check_thermal_status(struct charger_manager *cm)
{
struct charger_desc *desc = cm->desc;
int temp, upper_limit, lower_limit;
int ret = 0;
ret = cm_get_battery_temperature(cm, &temp);
if (ret) {
/* FIXME:
* No information of battery temperature might
* occur hazadous result. We have to handle it
* depending on battery type.
*/
dev_err(cm->dev, "Failed to get battery temperature\n");
return 0;
}
upper_limit = desc->temp_max;
lower_limit = desc->temp_min;
if (cm->emergency_stop) {
upper_limit -= desc->temp_diff;
lower_limit += desc->temp_diff;
}
if (temp > upper_limit)
ret = CM_EVENT_BATT_OVERHEAT;
else if (temp < lower_limit)
ret = CM_EVENT_BATT_COLD;
return ret;
}
static bool _cm_monitor(struct charger_manager *cm)
{
...
temp_alrt = cm_check_thermal_status(cm);
if (temp_alrt) {
cm->emergency_stop = temp_alrt;
dev_info(cm->dev,
"Temperature is out of range normal state, stop charging\n");
if (!try_charger_enable(cm, false))
uevent_notify(cm, default_event_names[temp_alrt]);
}
...
}
mtk平台
/* battery temperature protection */
enable_min_charge_temp;
min_charge_temp = <0>;
min_charge_temp_plus_x_degree = <6>;
max_charge_temp = <55>;
max_charge_temp_minus_x_degree = <47>;
static void mtk_battery_notify_VBatTemp_check(struct mtk_charger *info)
{
#if defined(BATTERY_NOTIFY_CASE_0002_VBATTEMP)
if (info->battery_temp >= info->thermal.max_charge_temp) {
info->notify_code |= CHG_BAT_OT_STATUS;
chr_err("[BATTERY] bat_temp(%d) out of range(too high)\n",
info->battery_temp);
mtk_chgstat_notify(info);
} else {
info->notify_code &= ~CHG_BAT_OT_STATUS;
}
if (info->enable_sw_jeita == true) {
if (info->battery_temp < info->data.temp_neg_10_thres) {
info->notify_code |= CHG_BAT_LT_STATUS;
chr_err("bat_temp(%d) out of range(too low)\n",
info->battery_temp);
mtk_chgstat_notify(info);
} else {
info->notify_code &= ~CHG_BAT_LT_STATUS;
}
} else {
#ifdef BAT_LOW_TEMP_PROTECT_ENABLE
if (info->battery_temp < info->thermal.min_charge_temp) {
info->notify_code |= CHG_BAT_LT_STATUS;
chr_err("bat_temp(%d) out of range(too low)\n",
info->battery_temp);
mtk_chgstat_notify(info);
} else {
info->notify_code &= ~CHG_BAT_LT_STATUS;
}
#endif
}
#endif
}
在某些场景,需要模拟电池温度,判断修改的程序有没有生效,可通过温箱实现,但有更简单的方法,如展讯平台
每按下音量+键,电池温度自动+1度
diff --git a/bsp/kernel/kernel4.14/drivers/input/keyboard/gpio_keys.c b/bsp/kernel/kernel4.14/drivers/input/keyboard/gpio_keys.c
old mode 100644
new mode 100755
index e9f0ebf..1273a00
--- a/bsp/kernel/kernel4.14/drivers/input/keyboard/gpio_keys.c
+++ b/bsp/kernel/kernel4.14/drivers/input/keyboard/gpio_keys.c
@@ -356,7 +356,7 @@ static struct attribute *gpio_keys_attrs[] = {
static const struct attribute_group gpio_keys_attr_group = {
.attrs = gpio_keys_attrs,
};
-
+extern int g_temp;
static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata)
{
const struct gpio_keys_button *button = bdata->button;
@@ -375,6 +375,9 @@ static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata)
if (state)
input_event(input, type, button->code, button->value);
} else {
+ if((state==1)&&(*bdata->code==KEY_VOLUMEUP)){
+ g_temp+=10;
+ }
input_event(input, type, *bdata->code, state);
}
input_sync(input);
diff --git a/bsp/kernel/kernel4.14/drivers/power/supply/sc27xx_fuel_gauge.c b/bsp/kernel/kernel4.14/drivers/power/supply/sc27xx_fuel_gauge.c
old mode 100644
new mode 100755
index d491e0b..ffcb566
--- a/bsp/kernel/kernel4.14/drivers/power/supply/sc27xx_fuel_gauge.c
+++ b/bsp/kernel/kernel4.14/drivers/power/supply/sc27xx_fuel_gauge.c
@@ -869,7 +869,8 @@ static int sc27xx_fgu_get_average_temp(struct sc27xx_fgu_data *data, int temp)
return sum / (SC27XX_FGU_TEMP_BUFF_CNT - 2);
}
-
+int g_temp=400;
+EXPORT_SYMBOL(g_temp);
static int sc27xx_fgu_get_temp(struct sc27xx_fgu_data *data, int *temp)
{
int vol, ret;
@@ -914,7 +915,7 @@ static int sc27xx_fgu_get_temp(struct sc27xx_fgu_data *data, int *temp)
} else {
*temp = 200;
}
-
+ *temp = g_temp;
data->bat_temp = *temp;
return 0;
mtk平台
正规的测试方法,将手机放在温箱里,然后加热手机,观察手机的电流。
当然,如果条件不允许的话,有简易的测试方法,用家里的电吹风对电池进行加热(测试过可以家加热到55℃),然后观察输入电流或者流入电池的电流。
44462:[ 68.746270] <2>.(2)[253:charger_thread]get_battery_temperature:29
44678:[ 70.310710] <3>.(3)[253:charger_thread]get_battery_temperature:29
44889:[ 71.059904] <2>.(2)[253:charger_thread]get_battery_temperature:29
45539:[ 73.294045] <2>.(2)[253:charger_thread]get_battery_temperature:30
46071:[ 75.131074] <3>.(3)[253:charger_thread]get_battery_temperature:30
46277:[ 75.895840] <3>.(3)[253:charger_thread]get_battery_temperature:28
46601:[ 78.859037] <0>.(0)[253:charger_thread]get_battery_temperature:31
46818:[ 79.630467] <0>.(0)[253:charger_thread]get_battery_temperature:32
47034:[ 80.399087] <1>.(1)[253:charger_thread]get_battery_temperature:33
47792:[ 83.737719] <3>.(3)[253:charger_thread]get_battery_temperature:33
48011:[ 84.479219] <3>.(3)[253:charger_thread]get_battery_temperature:38
48459:[ 86.678634] <3>.(3)[253:charger_thread]get_battery_temperature:44
48698:[ 88.849918] <0>.(0)[253:charger_thread]get_battery_temperature:49
48806:[ 89.270675] <0>.(0)[253:charger_thread]get_battery_temperature:51
49059:[ 90.055831] <1>.(1)[253:charger_thread]get_battery_temperature:54
49277:[ 90.818609] <2>.(2)[253:charger_thread]get_battery_temperature:56
49334:[ 90.934960] <3>.(3)[253:charger_thread]get_battery_temperature:57
66.972233] <2>.(2)[253:charger_thread]get_battery_current:1091
44469:[ 68.808137] <2>.(2)[253:charger_thread]get_battery_current:1083
44685:[ 70.372091] <2>.(2)[253:charger_thread]get_battery_current:1079
44896:[ 71.113795] <2>.(2)[253:charger_thread]get_battery_current:1073
45548:[ 73.356770] <2>.(2)[253:charger_thread]get_battery_current:1066
46078:[ 75.195601] <3>.(3)[253:charger_thread]get_battery_current:1061
46284:[ 75.959513] <3>.(3)[253:charger_thread]get_battery_current:1056
46608:[ 78.921106] <0>.(0)[253:charger_thread]get_battery_current:1050
46825:[ 79.691069] <0>.(0)[253:charger_thread]get_battery_current:1045
47041:[ 80.463580] <2>.(2)[253:charger_thread]get_battery_current:1038
47799:[ 83.795205] <2>.(2)[253:charger_thread]get_battery_current:1033
48018:[ 84.539357] <3>.(3)[253:charger_thread]get_battery_current:1098
48464:[ 86.739107] <3>.(3)[253:charger_thread]get_battery_current:1227
48747:[ 88.909647] <0>.(0)[253:charger_thread]get_battery_current:1342
48817:[ 89.324441] <0>.(0)[253:charger_thread]get_battery_current:521
49066:[ 90.114446] <1>.(1)[253:charger_thread]get_battery_current:522
49284:[ 90.878832] <2>.(2)[253:charger_thread]get_battery_current:522
49367:[ 90.996477] <0>.(0)[253:charger_thread]get_battery_current:0
49556:[ 91.414356] <1>.(1)[253:charger_thread]get_battery_current:2
49742:[ 91.871620] <3>.(3)[253:charger_thread]get_battery_current:0
50067:[ 95.052610] <3>.(3)[253:charger_thread]get_battery_current:2
50257:[ 95.489746] <0>.(0)[253:charger_thread]get_battery_current:0
50493:[ 95.928436] <2>.(2)[253:charger_thread]get_battery_current:0
50532:[ 96.028322] <3>.(3)[253:charger_thread]get_battery_current:0
50695:[ 96.475499] <0>.(0)[253:charger_thread]get_battery_current:0
50876:[ 96.910780] <0>.(0)[253:charger_thread]get_battery_current:1
50981:[ 97.332599] <3>.(3)[253:charger_thread]get_battery_current:1040
51125:[ 97.788102] <3>.(3)[253:charger_thread]get_battery_current:1554
mtk平台在电池高温后会重启FAQ20298(userdebug版本的变现就是进入sysdump) ,相关代码