搜索

167

主题

248

帖子

2749

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2749
发表于 2021-10-8 23:07:09 4076 浏览 0 回复

MT8788 Android9.0 实现较低电流启动开机

本帖最后由 七个柚子多少钱 于 2021-10-12 15:25 编辑

需求:

产品工作在低温环境,电池输出电流较小,期望工作启动峰值电流小于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-initon 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:

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

路径:静态方式注册广播

  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>
复制代码
  1. 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. }
复制代码



示例2:

添加自定义服务并注册开机广播接收

在路径下frameworks/base/core/java/android/home/创建IHomeService.aidl文件

  1. frameworks/base/core/java/android/home/IHomeService.aidl
复制代码
  1. package android.home;

  2. interface IHomeService {

  3. }
复制代码
将IHomeService.aidl加入编译
  1. frameworks/base/Android.bp b/frameworks/base/Android.bp
复制代码
  1. + "core/java/android/home/IHomeService.aidl",
复制代码


在路径下frameworks/base/services/core/java/com/android/server/home/创建HomeService.java文件,在动态方式注册开机广播接收,收到广播后恢复正常cpu频率和核数
  1. frameworks/base/services/core/java/com/android/server/home/HomeService.java
复制代码
  1. package com.android.server.home;

  2. import com.android.server.IoThread;
  3. import android.content.pm.PackageManager;
  4. import android.content.Context;
  5. import android.home.IHomeService;
  6. import android.util.Log;
  7. import android.content.BroadcastReceiver;
  8. import android.content.Intent;
  9. import android.content.IntentFilter;
  10. import android.os.BatteryManager;


  11. import java.util.List;
  12. import android.app.ActivityManager;
  13. import android.app.ActivityManager.RunningTaskInfo;
  14. import java.io.BufferedReader;
  15. import java.io.BufferedWriter;
  16. import java.io.FileWriter;
  17. import java.io.IOException;
  18. import java.io.File;

  19. public class HomeService extends IHomeService.Stub {
  20.     private static final String TAG = "HomeService";
  21.     private Context mContext;

  22.     private String packagename1 = "com.android.gallery3d";
  23.     private String packagename2 = "com.mxtech.videoplayer.ad";

  24.     private String cpuPath="proc/ppm/enabled"; //多核控制开关
  25.     private String cpuHz="proc/ppm/policy/ut_fix_freq_idx";//cpu频率
  26.        private String cpuNum="/proc/ppm/policy/ut_fix_core_num";  //cpu核数
  27.     private boolean flag1=true;
  28.     private boolean flag2=true;
  29.     private boolean oldflag=false;

  30.     private int defaultlevel=35;
  31.     private CpuInfoReceiver cpuInfoReceiver;

  32.     public HomeService(Context context) {
  33.         super();
  34.         Log.d(TAG, "HomeService context");
  35.         mContext = context;

  36.         IntentFilter intentFilter = new IntentFilter();
  37.                intentFilter.addAction("android.intent.action.BOOT_COMPLETED");
  38.         cpuInfoReceiver = new CpuInfoReceiver();
  39.         context.registerReceiver(cpuInfoReceiver, intentFilter);
  40.     }


  41.     public void wirteValue(String path,String value) {
  42.         BufferedWriter bw=null;
  43.         try {
  44.             bw=new BufferedWriter(new FileWriter(new File(path)));
  45.             bw.write(value);
  46.         } catch (IOException e) {
  47.             e.printStackTrace();
  48.         }finally{
  49.             if (bw!=null) {
  50.                 try {
  51.                     bw.close();
  52.                 } catch (IOException e) {
  53.                     e.printStackTrace();
  54.                 }
  55.             }
  56.         }
  57.     }


  58.     class CpuInfoReceiver extends BroadcastReceiver {

  59.         @Override
  60.         public void onReceive(Context context, Intent intent) {
  61.                        wirteValue(cpuNum,"-1 -1");
  62.                        wirteValue(cpuHz,"-1 -1");
  63.                        wirteValue(cpuPath,"0");
  64.         }
  65.     }
  66. }
复制代码
注册系统服务
  1. frameworks/base/services/java/com/android/server/SystemServer.java
复制代码

  1. import com.android.server.home.HomeService;

  2. public final class SystemServer {
  3.                  
  4.    traceBeginAndSlog("StartHomeService");
  5.    try {
  6.                    ServiceManager.addService("ctrlcpu", new HomeService(context));
  7.    } catch (Throwable e) {
  8.                    reportWtf("starting Home Service", e);
  9.    }
  10.    traceEnd();

  11. }
复制代码
修改后编译代码:

make update-api






修改后:

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







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


登录或注册
快速回复 返回顶部 返回列表