多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Android Framework关闭软件低电关机功能测试PMIC低电保护

Android Framework关闭软件低电关机功能测试PMIC低电保护 文章目录低电关机分类屏蔽 Android 低电自动关机kernel屏蔽低电关机低电关机几种条件修改方法mtk_low_battery_throttling.cAndroid相关专栏MTK安卓平台为了测试PMIC的低电保护功能需要从代码上禁用软件的低电关机功能。低电关机分类AndroidkernelPMIC屏蔽 Android 低电自动关机就是把BatteryService.java 中shutdownIfNoPowerLocked这个函数实现注释掉修改方法如下图实际修改方法diff--git a/frameworks/base/services/core/java/com/android/server/BatteryService.java b/frameworks/base/services/core/java/com/android/server/BatteryService.java index e647cb94ba..cc80f0e847100755---a/frameworks/base/services/core/java/com/android/server/BatteryService.javab/frameworks/base/services/core/java/com/android/server/BatteryService.java -382,23382,8publicfinalclassBatteryServiceextendsSystemService{}privatevoidshutdownIfNoPowerLocked(){-// shut down gracefully if our battery is critically low and we are not powered.-// wait until the system has booted before attempting to display the shutdown dialog.-if(shouldShutdownLocked()){-mHandler.post(newRunnable(){-Override-publicvoidrun(){-if(mActivityManagerInternal.isSystemReady()){-IntentintentnewIntent(Intent.ACTION_REQUEST_SHUTDOWN);-intent.putExtra(Intent.EXTRA_KEY_CONFIRM,false);-intent.putExtra(Intent.EXTRA_REASON,-PowerManager.SHUTDOWN_LOW_BATTERY);-intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);-mContext.startActivityAsUser(intent,UserHandle.CURRENT);-}-}-});-}// UVLO laboratory test only: bypass Android low-battery shutdown.// Restore before production use. Overtemperature shutdown remains active.}保留旁边的 shutdownIfOverTempLocked()。否则即便 Kernel 不关机Android 仍可能根据 CRITICAL 容量状态或 0% 请求关机。privatevoidshutdownIfOverTempLocked(){// 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.batteryTemperaturemShutdownBatteryTemperature){mHandler.post(newRunnable(){Overridepublicvoidrun(){if(mActivityManagerInternal.isSystemReady()){IntentintentnewIntent(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);}}});}}kernel屏蔽低电关机低电关机几种条件低压、SOC0、UISOC 和 DLPT 关机条件代码上要屏蔽这几种soc电量算法估算的 SOC。soc zero shutdown 不是算法 SOC 一到 0 就立即关机。 代码还会等待显示电量到 0并检查计时。如果显示电量尚未到 0、算法 SOC 又恢复大于 0会取消该状态。ui_soc对外显示的百分比两者可能因显示平滑等处理而不同。uisoc one percent shutdown 不是显示 1% 就关机。 名字指的是低电量跟踪条件真正执行关机时仍要求 ui_soc0。其 40 秒计时从条件建立开始不一定是“显示 0% 后再等完整 40 秒”充电且算法 SOC 大于 0 时该状态可以被取消。DLPT 是 Dynamic Load Power Throttling动态负载功率限制。 它关注的是电池当前还能不能承受系统负载。例如电池老化、低温或内阻增大时静态电压尚可但负载一增大就明显跌压。DLPT 根据电池供电能力估算可承受电流先限制负载供电能力不足时再提出关机条件。修改方法修改kernel中set_shutdown_cond函数处于低电情况时直接返回不处理如下图具体代码修改diff--git a/kernel-4.19/drivers/power/supply/mtk_battery.c b/kernel-4.19/drivers/power/supply/mtk_battery.c index545a613bab..881597382c100755---a/kernel-4.19/drivers/power/supply/mtk_battery.cb/kernel-4.19/drivers/power/supply/mtk_battery.c -2621,62621,15intset_shutdown_cond(structmtk_battery*gm,intshutdown_cond)structshutdown_condition*sds;intenable_lbat_shutdown;/* UVLO laboratory test only: bypass battery-level shutdown conditions. * Restore before production use. Keep overtemperature protection active. */if(shutdown_condLOW_BAT_VOLT||shutdown_condSOC_ZERO_PERCENT||shutdown_condUISOC_ONE_PERCENT||shutdown_condDLPT_SHUTDOWN)return0;#ifdefSHUTDOWN_CONDITION_LOW_BAT_VOLTenable_lbat_shutdown1;#else不要直接删除所有 kernel_power_off()否则会连过温等路径一起影响。代码中虽有 shutdown_condition_enable 调试节点写 1 会屏蔽这里所有新关机条件但它还会影响 OVERHEAT 入口且不清除已经建立的状态因此不如上述定向修改明确。mtk_low_battery_throttling.ckernel-4.19/drivers/misc/mediatek/power_throttling/mtk_low_battery_throttling.c其中硬编码了三个 PMIC LBAT 阈值#definePOWER_INT0_VOLT3400#definePOWER_INT1_VOLT3250#definePOWER_INT2_VOLT3100触发逻辑是3.4 VLOW_BATTERY_LEVEL_0开始低电保护回调3.25 VLOW_BATTERY_LEVEL_1进一步限制功耗3.10 VLOW_BATTERY_LEVEL_2直接执行kernel_power_off();把这里的kernel_power_off函数屏蔽掉。voidexec_low_battery_callback(unsignedintthd){|inti0;|if(g_low_battery_stop1){||pr_info([%s] g_low_battery_stop%d\n|||,__func__,g_low_battery_stop);|}else{||switch(thd){||casePOWER_INT0_VOLT:|||g_low_battery_levelLOW_BATTERY_LEVEL_0;||break;||casePOWER_INT1_VOLT:|||g_low_battery_levelLOW_BATTERY_LEVEL_1;|||break;||casePOWER_INT2_VOLT:|||g_low_battery_levelLOW_BATTERY_LEVEL_2;|||//kernel_power_off();注释这行|||break;||default:|||pr_notice([%s] wrong threshold%d\n,__func__,thd);|||return;||}||for(i0;iARRAY_SIZE(lbcb_tb);i){|||if(lbcb_tb[i].lbcb)||||lbcb_tb[i].lbcb(g_low_battery_level);||}||pr_info([%s] low_battery_level%d\n,__func__,|||g_low_battery_level);|}}这样修改后重新编译烧录固件然后让设备进入低电状态观察PMIC的低电保护是否正常工作。Android相关专栏Android Framework专栏链接Android专栏作者:帅得不敢出门
返回列表