电池ntc的功能设定

手机电池内部带有ntc电阻,该电阻随电池温度变化而变化,根据ntc的这一特性,便可推算出电池温度,从而定制化手机行为。

ntc电路如下,R6106默认不贴,把电池扣上去后,形成了一个简易的分压电路,假设电池ntc电阻为R,则BAT_TEMP_ADC的电压为1.85*R/(R+47K),BAT_TEMP_ADC的电压可以通过cpu内部的adc电路测量出来,进入反算出电阻ntc阻值R,再根据电池ntc表,推算出电池温度。

电池高温关机

BatteryService.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/BatteryService.java

        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) ,相关代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值