文章目录
- 低电关机分类
- [屏蔽 Android 低电自动关机](#屏蔽 Android 低电自动关机)
- kernel屏蔽低电关机
- Android相关专栏
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相关专栏
作者:帅得不敢出门