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专栏

作者:帅得不敢出门

相关推荐
海水冷却21 小时前
Android 群组聊天怎么实现:基于 ZIM 的完整落地指南(附可运行 Demo)
android
三少爷的鞋1 天前
现代 Android 架构指南:不要再主动设计 Callback 接口
android
TimeFine1 天前
AI 编码工作流的设计
android·ai编程
骑着蜗牛撵大象3271 天前
C++20 协程 × 屏障:手写一个 co_await 版 Barrier,让等待不再钉死线程
android·c++20·协程·并发编程·co_await·屏障同步
山东孙燕姿1 天前
设备台账重构:从一张表到三层模型
android·java·网络·低代码·重构·rxjava
蒸鱼Yuzheng1 天前
移动端 CPU 调度分析:线程亲和性、大小核迁移与卡顿
android·perfetto·性能分析·线程优化·cpu调度
booboosui1 天前
安卓唤醒词:12 维 MFCC 加 DTW,阈值 1.8
android
传奇开心果1 天前
Compose Multiplatform 共享边界实战:架构契约、互操作同步与可回退设计
android·kotlin
事圆则缓1 天前
从开机到首帧:Android 系统与应用启动流程源码分析
android
AI吃大瓜1 天前
指针压力表读数4:Android实现指针压力表读数(可实时检测)
android·指针读数·指针压力表·压力表·压力表读数