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

文章目录

MTK安卓平台为了测试PMIC的低电保护功能,需要从代码上禁用软件的低电关机功能。

低电关机分类

  • Android
  • kernel
  • PMIC

屏蔽 Android 低电自动关机

就是把BatteryService.java 中shutdownIfNoPowerLocked这个函数实现注释掉

修改方法如下图:

实际修改方法:

java 复制代码
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..cc80f0e847 100755
--- a/frameworks/base/services/core/java/com/android/server/BatteryService.java
+++ b/frameworks/base/services/core/java/com/android/server/BatteryService.java
@@ -382,23 +382,8 @@ public final class BatteryService extends SystemService {
     }

     private void shutdownIfNoPowerLocked() {
-        // 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(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_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% 请求关机。

java 复制代码
    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);
                    }
                }
            });
        }
    }

kernel屏蔽低电关机

低电关机几种条件

低压、SOC=0、UISOC 和 DLPT 关机条件(代码上要屏蔽这几种)

  • soc:电量算法估算的 SOC。
    soc zero shutdown 不是算法 SOC 一到 0 就立即关机。 代码还会等待显示电量到 0,并检查计时。如果显示电量尚未到 0、算法 SOC 又恢复大于 0,会取消该状态。
  • ui_soc:对外显示的百分比,两者可能因显示平滑等处理而不同。
    uisoc one percent shutdown 不是显示 1% 就关机。 名字指的是低电量跟踪条件,真正执行关机时仍要求 ui_soc=0。其 40 秒计时从条件建立开始,不一定是"显示 0% 后再等完整 40 秒";充电且算法 SOC 大于 0 时,该状态可以被取消。
  • DLPT 是 Dynamic Load Power Throttling,动态负载功率限制。 它关注的是电池当前还能不能承受系统负载。
    例如电池老化、低温或内阻增大时,静态电压尚可,但负载一增大就明显跌压。DLPT 根据电池供电能力估算可承受电流,先限制负载,供电能力不足时再提出关机条件。

修改方法

修改kernel中set_shutdown_cond函数,处于低电情况时直接返回不处理

如下图:

具体代码修改:

c 复制代码
diff --git a/kernel-4.19/drivers/power/supply/mtk_battery.c b/kernel-4.19/drivers/power/supply/mtk_battery.c
index 545a613bab..881597382c 100755
--- a/kernel-4.19/drivers/power/supply/mtk_battery.c
+++ b/kernel-4.19/drivers/power/supply/mtk_battery.c
@@ -2621,6 +2621,15 @@ int set_shutdown_cond(struct mtk_battery *gm, int shutdown_cond)
        struct shutdown_condition *sds;
        int enable_lbat_shutdown;

+       /* UVLO laboratory test only: bypass battery-level shutdown conditions.
+        * Restore before production use. Keep overtemperature protection active.
+        */
+       if (shutdown_cond == LOW_BAT_VOLT ||
+           shutdown_cond == SOC_ZERO_PERCENT ||
+           shutdown_cond == UISOC_ONE_PERCENT ||
+           shutdown_cond == DLPT_SHUTDOWN)
+               return 0;
+
 #ifdef SHUTDOWN_CONDITION_LOW_BAT_VOLT
        enable_lbat_shutdown = 1;
 #else

不要直接删除所有 kernel_power_off(),否则会连过温等路径一起影响。

代码中虽有 shutdown_condition_enable 调试节点,写 1 会屏蔽这里所有新关机条件,但它还会影响 OVERHEAT 入口,且不清除已经建立的状态,因此不如上述定向修改明确。

这样修改后,重新编译烧录固件,然后让设备进入低电状态,观察PMIC的低电保护是否正常工作。

Android相关专栏

Android Framework专栏链接

Android专栏

作者:帅得不敢出门

相关推荐
恋猫de小郭2 小时前
Flutter + EmbeddingGemma 2,谷歌发布完全端侧的 AI Edge Foresight
android·前端·flutter
墨天梦3 小时前
B16_Material主题与可访问交互
android·kotlin·交互
弯_弯3 小时前
企业知识库 RAG 落地:从 Demo 到生产,四条工程链路与参数级自查
android·java·javascript
晚风叙码5 小时前
MySQL 表的约束详解:从空属性到外键
android·数据库·mysql·adb
alexhilton15 小时前
模块化Jetpack Compose架构
android·kotlin·android jetpack
厮年断弦17 小时前
AI 辅助开发实录:一周做完一个 Android 本地音乐播放器,这些坑替你踩了
android
hai_android17 小时前
InputStage 责任链核心执行流程
android·android studio·android jetpack
mmsx20 小时前
Android 测绘计算工程化:七四参数、高程拟合与单位系统
android·kotlin
我是场1 天前
我的NPI项目之-Touch的EE特性
android·arm开发