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

(83) 2024-07-15 08:01:01

需求:

产品工作在低温环境,电池输出电流较小,期望工作启动峰值电流小于 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.          
  22.     public void wirteValue(String path,String value) {
  23.         BufferedWriter bw = null;
  24.         try {
  25.             bw = new BufferedWriter(new FileWriter(new File(path)));
  26.             bw.write(value);
  27.         } catch (IOException e) {
  28.             e.printStackTrace();
  29.         }finally{
  30.             if (bw!=null) {
  31.                 try {
  32.                     bw.close();
  33.                 } catch (IOException e) {
  34.                     e.printStackTrace();
  35.                 }
  36.             }
  37.         }
  38.     }
  39. }

更多详细资料,可到 MTK新移科技技术论坛 - Powered by Discuz!  

 

 

 

 

THE END

发表回复