需求:

产品工作在低温环境,电池输出电流较小,期望工作启动峰值电流小于 1A 以下,最好在 500ma;

验证:
测试过程为电源键开机起到系统进入到安卓桌面

1. 开发板启动峰值电流约 1.2A 左右 (无显示屏)

2. 对于使用 SIM 和不使用 SIM 卡情况测试峰值电流约 1.2A 左右

3. 对于飞行模式和正常模式下开机测试峰值电流约 1.2A 左右

使用 SIM 卡正常模式启动电流记录:


解决思路:

测试的峰值电流主要发生在开机 10S 时间段,此时系统启动了 android init 程序,使用低频低核数启动系统,来减小峰值电流,在系统正常启动完后恢复正常的 CPU 频率和核数

步骤 1:

在 device/mediatek/mt6771/init.mt6771.rc 文件修改 CPU 频率和核数

  1. on early-init

  2. +       # highly freq
  3. +       write proc/ppm/enabled "1"
  4. +       write proc/ppm/policy/ut_fix_core_num "1 1"
  5. +       write proc/ppm/policy/ut_fix_freq_idx "15 15"

  6. on init

注意:

修改 CPU 频率和核数需要在 on init 之前,建议在写 on early-init 和 on init 之间即可;.rc 类似于.xml 文件,system/core/init/init.c 文件 main 函数会解析.rc 文件,on early-init、on init 等代表触发器,在特定的条件下会执行触发器后编写的命令。

格式

含义

on early-init

在初始化早期阶段触发

on init

在初始化阶段触发

on late-init

在初始化晚期阶段触发

on boot/charger

当系统启动 / 充电时触发

on property

当属性值满足条件时触发

 参考链接:Android 系统启动之 init.rc 文件解析过程


步骤 2:

在接收到系统开机广播后恢复正常的 CPU 频率和核数;在任意系统服务,系统应用源码注册开机广播接收器;

示例:

在系统设置应用代码内添加开机广播接收

路径:静态方式注册广播

  1. vendor/mediatek/proprietary/packages/apps/MtkSettings/AndroidManifest.xml

添加声明

  1. <receiver android:name="com.mediatek.settings.RestoreRotationReceiver">
  2. <intent-filter>
  3. <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
  4. +                               <action android:name="android.intent.action.BOOT_COMPLETED"/>
  5. </intent-filter>
  6. </receiver>

  • vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/mediatek/settings/RestoreRotationReceiver.java

在收到开机广播后,恢复正常的 cpu 频率和核数

  1. import java.io.BufferedReader;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.io.PrintStream;


  8. public class RestoreRotationReceiver extends BroadcastReceiver {

  9. private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";

  10. private String cpuPath="proc/ppm/enabled"; // 多核控制开关
  11. private String cpuHz="proc/ppm/policy/ut_fix_freq_idx";//cpu 频率
  12. private String cpuNum="/proc/ppm/policy/ut_fix_core_num";  //cpu 核数

  13. ​@Override​
  14. public void onReceive(Context context, Intent intent) {

  15. if (intent.getAction().equals(ACTION_BOOT)) {
  16. wirteValue(cpuNum,"-1 -1");
  17. wirteValue(cpuHz,"-1 1");
  18. wirteValue(cpuHz,"0");
  19. }
  20. }

  21. public void wirteValue(String path,String value) {
  22. BufferedWriter bw = null;
  23. try {
  24. bw = new BufferedWriter(new FileWriter(new File(path)));
  25. bw.write(value);
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }finally{
  29. if (bw!=null) {
  30. try {
  31. bw.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }
  37. }
  38. }

MTK核心板 安卓主板开发 MT8788 实现较低电流启动开机_MTK8788