高温手机重启案例分析

2666a397cd4a013c76fdfb7761c47a6e.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、高温触发 Kernel Exception 重启问题
二、解决方案
三、提高电池温度方案

一、 高温触发 Kernel Exception 重启问题

手机 电池温度 默认60度以上高温会触发手机安全机制,让手机管家或者重启。

由温度异常导致手机重启的部分 Log 如下:

2d5f18cf53d1b0cacfc566042b9f9fe6.jpeg

高温情况下,Kernel Exception引起的重启问题

二、解决方案

此问题 需要驱动同事修改底层battery.c 文件中的一个地址,不让其写为dead,就不会重启。或者提高电池温度参数。

三、提高电池温度方案

提高电池温度的方案如下:

1.修改mtk_battery_table.h

/alps/kernel-4.4/drivers/misc/mediatek/include/mt-plat/mt6739/include/mach/mtk_battery_table.h

* ============================================================

  */

+//#define SPROCOMM_NTC //wang add

+#ifdef SPROCOMM_NTC

+#define NTC_COMP_RES 42

+#endif

+

 /* Qmax for battery  */

 #define Q_MAX_L_CURRENT 0

 #define Q_MAX_H_CURRENT 10000

@@ [-111,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/include/mt-plat/mt6739/include/mach/mtk_battery_table.h;h=7cb7b5e7e735a1907b941a6df5755c582ffca0ac;hb=7cb7b5e7e735a1907b941a6df5755c582ffca0ac#l111) [+116,8](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/include/mt-plat/mt6739/include/mach/mtk_battery_table.h;h=76ef73904571e7abf677cf9b73783b52131c467a;hb=76ef73904571e7abf677cf9b73783b52131c467a#l116) @@ int g_QMAX_SYS_VOL_T4[TOTAL_BATTERY_NUMBER] = {36000, 36010, 36020, 36030};

 #define BIF_NTC_R 16000

 #if (BAT_NTC_10 == 1)

-struct FUELGAUGE_TEMPERATURE Fg_Temperature_Table[21] = {

+#define NTC_NUM 25 //wang add 20180528

+struct FUELGAUGE_TEMPERATURE Fg_Temperature_Table[NTC_NUM] = {

                {-40, 195652},

                {-35, 148171},

                {-30, 113347},

@@ [-132,12](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/include/mt-plat/mt6739/include/mach/mtk_battery_table.h;h=7cb7b5e7e735a1907b941a6df5755c582ffca0ac;hb=7cb7b5e7e735a1907b941a6df5755c582ffca0ac#l132) [+138,17](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/include/mt-plat/mt6739/include/mach/mtk_battery_table.h;h=76ef73904571e7abf677cf9b73783b52131c467a;hb=76ef73904571e7abf677cf9b73783b52131c467a#l138) @@ struct FUELGAUGE_TEMPERATURE Fg_Temperature_Table[21] = {

                {45, 4917},

                {50, 4161},

                {55, 3535},

-               {60, 3014}

+               {60, 3014},

+               {65, 2586},

+               {70, 2228},

+               {75, 1925},

+               {80, 1669}

 };

 #endif

 #if (BAT_NTC_47 == 1)

-struct FUELGAUGE_TEMPERATURE Fg_Temperature_Table[21] = {

+#define NTC_NUM 21 //wang add 20180528

+struct FUELGAUGE_TEMPERATURE Fg_Temperature_Table[NTC_NUM] = {

                {-40, 1747920},

                {-35, 1245428},

                {-30, 898485},

2. 修改mtk_ts_battery.c

/alps/kernel-4.4/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_battery.c

@@ [-134,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_battery.c;h=f807c7272f610a9e61307eaebe0057ee0f157490;hb=f807c7272f610a9e61307eaebe0057ee0f157490#l134) [+134,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_battery.c;h=e201c1fc84ba09e04f8d53a5ca11993848df1feb;hb=e201c1fc84ba09e04f8d53a5ca11993848df1feb#l134) @@ static int bat_temp = 21234;

 /* static int battery_write_flag=0; */

-#define mtktsbattery_TEMP_CRIT 60000   /* 60.000 degree Celsius */

+#define mtktsbattery_TEMP_CRIT 80000   /* 60.000 degree Celsius */ //wang add 20180528

 #define mtktsbattery_dprintk(fmt, args...)   \

 do {                                    \

@@ [-455,8](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_battery.c;h=f807c7272f610a9e61307eaebe0057ee0f157490;hb=f807c7272f610a9e61307eaebe0057ee0f157490#l455) [+455,8](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_battery.c;h=e201c1fc84ba09e04f8d53a5ca11993848df1feb;hb=e201c1fc84ba09e04f8d53a5ca11993848df1feb#l455) @@ static int tsbat_sysrst_set_cur_state(struct thermal_cooling_device *cdev, unsig

                pr_debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

                pr_debug("*****************************************");

                pr_debug("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

-

-               *(unsigned int *)0x0 = 0xdead;  /* To trigger data abort to reset the system for thermal protection. */

+               //wang add 20180528

+               //*(unsigned int *)0x0 = 0xdead;        /* To trigger data abort to reset the system for thermal protection. */

        }

        return 0;

 }

3. 修改 mtk_battery.c

alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c

@@ [-2041,15](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=424147210393fd33fb205b40414683f5549b3cc2;hb=424147210393fd33fb205b40414683f5549b3cc2#l2041) [+2041,15](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=97a739dc0bbddd02b32c85c1c99da6006e81e746;hb=97a739dc0bbddd02b32c85c1c99da6006e81e746#l2041) @@ unsigned int TempConverBattThermistor(int temp)

        int i;

        unsigned int TBatt_R_Value = 0xffff;

-       if (temp >= Fg_Temperature_Table[20].BatteryTemp) {

-               TBatt_R_Value = Fg_Temperature_Table[20].TemperatureR;

+       if (temp >= Fg_Temperature_Table[NTC_NUM - 1].BatteryTemp) {

+               TBatt_R_Value = Fg_Temperature_Table[NTC_NUM - 1].TemperatureR;

        } else if (temp <= Fg_Temperature_Table[0].BatteryTemp) {

                TBatt_R_Value = Fg_Temperature_Table[0].TemperatureR;

        } else {

                RES1 = Fg_Temperature_Table[0].TemperatureR;

                TMP1 = Fg_Temperature_Table[0].BatteryTemp;

-               for (i = 0; i <= 20; i++) {

+               for (i = 0; i < NTC_NUM; i++) {

                        if (temp <= Fg_Temperature_Table[i].BatteryTemp) {

                                RES2 = Fg_Temperature_Table[i].TemperatureR;

                                TMP2 = Fg_Temperature_Table[i].BatteryTemp;

@@ [-2078,13](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=424147210393fd33fb205b40414683f5549b3cc2;hb=424147210393fd33fb205b40414683f5549b3cc2#l2078) [+2078,13](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=97a739dc0bbddd02b32c85c1c99da6006e81e746;hb=97a739dc0bbddd02b32c85c1c99da6006e81e746#l2078) @@ int BattThermistorConverTemp(int Res)

        if (Res >= Fg_Temperature_Table[0].TemperatureR) {

                TBatt_Value = -40;

-       } else if (Res <= Fg_Temperature_Table[20].TemperatureR) {

-               TBatt_Value = 60;

+       } else if (Res <= Fg_Temperature_Table[NTC_NUM - 1].TemperatureR) {

+               TBatt_Value = 80;

        } else {

                RES1 = Fg_Temperature_Table[0].TemperatureR;

                TMP1 = Fg_Temperature_Table[0].BatteryTemp;

-               for (i = 0; i <= 20; i++) {

+               for (i = 0; i < (NTC_NUM - 1); i++) {

                        if (Res >= Fg_Temperature_Table[i].TemperatureR) {

                                RES2 = Fg_Temperature_Table[i].TemperatureR;

                                TMP2 = Fg_Temperature_Table[i].BatteryTemp;

@@ [-2098,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=424147210393fd33fb205b40414683f5549b3cc2;hb=424147210393fd33fb205b40414683f5549b3cc2#l2098) [+2098,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=97a739dc0bbddd02b32c85c1c99da6006e81e746;hb=97a739dc0bbddd02b32c85c1c99da6006e81e746#l2098) @@ int BattThermistorConverTemp(int Res)

                TBatt_Value = (((Res - RES2) * TMP1) + ((RES1 - Res) * TMP2)) / (RES1 - RES2);

        }

-       bm_trace("[BattThermistorConverTemp] %d %d %d %d %d %d\n", RES1, RES2, Res, TMP1, TMP2, TBatt_Value);

+       bm_trace("[BattThermistorConverTemp] %d %d %d %d %d %d, wwwwwNTC_NUM = %d\n", RES1, RES2, Res, TMP1, TMP2, TBatt_Value, NTC_NUM);

        return TBatt_Value;

 }

@@ [-2334,8](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=424147210393fd33fb205b40414683f5549b3cc2;hb=424147210393fd33fb205b40414683f5549b3cc2#l2334) [+2334,8](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery.c;h=97a739dc0bbddd02b32c85c1c99da6006e81e746;hb=97a739dc0bbddd02b32c85c1c99da6006e81e746#l2334) @@ int force_get_tbat(bool update)

        bat_temperature_val = force_get_tbat_internal(update);

-       while (counts < 5 && bat_temperature_val >= 60) {

-               bm_err("[force_get_tbat]over60 count=%d, bat_temp=%d\n", counts, bat_temperature_val);

+       while (counts < 5 && bat_temperature_val >= 80) {//wang submit 20180524

+               bm_err("[force_get_tbat]over80 count=%d, bat_temp=%d\n", counts, bat_temperature_val);

                bat_temperature_val = force_get_tbat_internal(true);

                counts++;

        }

4.修改 mtk_battery_internal.h

alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery_internal.h

@@ [-34,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery_internal.h;h=6c2293cbfad5a14e479c095779d82e88d1032bcb;hb=6c2293cbfad5a14e479c095779d82e88d1032bcb#l34) [+34,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/kernel-4.4/drivers/power/mediatek/battery/mtk_battery_internal.h;h=304fc84470f8bdfdece2439cc5376b15c0b4dfba;hb=304fc84470f8bdfdece2439cc5376b15c0b4dfba#l34) @@

 #define SHUTDOWN_TIME 40

 #define AVGVBAT_ARRAY_SIZE 30

 #define INIT_VOLTAGE 3450

-#define BATTERY_SHUTDOWN_TEMPERATURE 60

+#define BATTERY_SHUTDOWN_TEMPERATURE 80

 /* ============================================================ */

 /* typedef and Struct*/

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除。同时感谢您的阅读,期待您的关注。

a1f79821e4d2dae8eec8398bea064314.jpeg

<think>嗯,用户问的是笔记本电脑经常在打游戏时重启的问题。首先,我需要考虑可能的原因。游戏通常对硬件要求较高,尤其是在图形处理和CPU使用方面。常见的原因可能有散热问题、电源不足、硬件故障或者软件冲突。 首先想到的是散热。当笔记本电脑长时间高负荷运行,比如玩游戏时,CPU和GPU温度会升高。如果散热系统有问题,比如风扇积灰或者散热片效率低下,可能导致过热,触发系统保护机制自动重启。这时候需要检查温度监控,看看是否有过热现象。 接下来是电源问题。游戏时GPU和CPU的功耗会增加,如果电源适配器功率不足或者电池老化,可能无法提供足够的电力,导致电压不稳,从而重启。特别是使用较老的适配器或者第三方充电器时,更容易出现这种情况。用户是否在玩游戏时插着电源?如果使用电池,可能电池无法持续高负荷输出,导致断电重启。 硬件方面,除了电源,内存和硬盘的问题也可能导致重启。比如内存条接触不良或者有坏道,游戏加载时频繁读取可能导致系统崩溃。另外,显卡驱动不兼容或者过时也可能引起问题,尤其是在运行新游戏时,驱动不匹配会导致系统不稳定。 软件方面,可能是系统文件损坏、游戏本身的bug或者后台程序冲突。建议检查系统日志,看看重启前有没有错误记录,比如蓝屏代码或者关键错误事件。此外,病毒或恶意软件也可能导致系统资源被大量占用,引发重启。 用户可能已经尝试过一些基本方法,比如重启电脑或者关闭其他程序,但问题依旧。需要更深入的排查步骤,比如进入安全模式测试是否还会重启,或者使用硬件诊断工具检查内存和硬盘。另外,更新驱动程序和BIOS也可能解决问题。 还要考虑用户的使用环境。如果是在高温环境下使用笔记本,或者放在柔软的表面上堵塞了散热口,都会影响散热效果。建议用户使用散热垫,并确保通风口畅通。 用户可能不太懂技术细节,所以回答时需要分步骤说明,用简单的语言解释可能的原因和解决办法。同时,要提醒用户如果自行处理不了,最好联系专业维修人员,避免自行拆机造成损坏。</think>笔记本电脑在运行游戏时频繁重启,通常由硬件过热、供电不足或系统不稳定引起。以下是逐步排查与解决方案: --- ### **一、核心原因分析** 1. **过热保护触发(最常见原因)** - **现象监测**:游戏时CPU/GPU温度超过阈值(例如$T \geq 95^\circ C$) - **计算公式**: $$ \text{散热效率} = \frac{\text{风扇转速}}{\text{芯片功耗}} \propto \text{温度控制能力} $$ - **典型案例**:风扇积灰导致实际散热效率下降$30\%$以上 2. **电源问题** - **适配器功率不足**:游戏时整机功耗$P_{total} > P_{adapter}$(例如RTX 3060需$130W$,但适配器仅$90W$) - **电池老化**:电池容量衰减至$<70\%$时可能无法稳定供电 3. **硬件/驱动故障** - **显卡驱动崩溃**:NVIDIA/AMD驱动版本与游戏兼容性差 - **内存错误**:游戏占用内存$>80\%$时触发系统保护 --- ### **二、操作步骤与解决方案** #### **第一阶段:快速诊断** 1. **监控硬件状态** - 使用工具(如HWMonitor)记录游戏时: - CPU/GPU温度(正常范围:$<85^\circ C$) - 功耗曲线(是否频繁触达适配器上限) - 示例数据: $$ \text{RTX 3060满载功耗} = 115W,\ \text{i7-11800H满载功耗}=65W $$ 2. **基础清理** - 使用压缩空气清理散热口(灰尘堆积会使进风量减少$40\%$) - 更换导热硅脂(老化硅脂使热传导效率下降$50\%$) #### **第二阶段:针对性修复** 1. **散热优化** - **强制风扇提速**:通过控制软件(如MSI Afterburner)设置风扇曲线,确保$70^\circ C$时转速$\geq 80\%$ - **物理散热**:使用笔记本支架提升底部进风空间,可降温$3-5^\circ C$ 2. **电源管理** - **禁用电池缓冲**:进入BIOS关闭`USB Power Share`等非必要功能 - **更换适配器**:选择输出功率$\geq \text{原装适配器标称值}\times 1.2$的型号 3. **系统级调试** - **驱动回滚**:卸载当前显卡驱动,安装经WHQL认证的稳定版本 - **内存测试**:运行Windows内存诊断工具或MemTest86,检测错误率: $$ \text{允许错误率} < 10^{-6} $$ #### **第三阶段:深度处理** 1. **降压锁频(进阶操作)** - 使用ThrottleStop对CPU降压$50-100mV$,可减少功耗$10-15W$ - 限制GPU最大频率至标称值的$90\%$(如RTX 3060从$1700MHz$降至$1530MHz$) 2. **系统重置** - 备份数据后执行干净安装Windows,排除软件冲突 --- ### **三、紧急应对方案** - **临时解决方案**: 降低游戏画质设置(如将分辨率从$2560\times1440$降至$1920\times1080$),可使GPU负载下降$30-40\%$ - **长期建议**: 若笔记本已使用$>3$年,考虑外接显卡坞(eGPU)分担内部GPU压力 --- ### **四、故障树分析** ```mermaid graph TD A[游戏时重启] --> B{温度是否>85°C?} A --> C{适配器功率是否足够?} A --> D{内存是否报错?} B -->|是| E[清理散热系统/更换硅脂] C -->|否| F[更换高功率适配器] D -->|是| G[更换内存条] ``` **提示**:若上述操作后问题依旧,可能存在主板供电模块损坏(如电容老化),需送专业维修点检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值