Android 功耗(4)---MTK平台待机功耗分析流程( 二 )


4、camera电流和拍摄场景及camera相关设置有关 , 对比测试时请尽量保持相同拍摄场景以及相同配置 。
5、preview电流异常需要抓CPU信息 , 请参考FAQ04008 , 需要同时提供mobile log
3.功耗问题分析流程目前我们分析的功耗问题主要是待机低电流或者待机平均电流问题 。
造成待机底电流偏大原因基本可以分为3类: 各个外设模块休眠漏电或未休眠 , GPIO/subsys/pll/clock口漏电 , wakelock导致无法休眠 , modem无法休眠
关闭飞行模式测试待机底电流 , 排除是否modem未休眠 , 首先确定是AP 还是modem 。
modem暂无系统的分析方法 。
下面是AP的分析流程
3.1 外设模块分析方法外设模块分析主要还是靠硬件上一一移除 , 然后查看移除哪个模块后底电流有降下来 , 然后确定到时哪个模块漏电 .如休眠时将TP camera LCD 逐一移除来确定排查 。
找到模块后再取分析代码来解决 。
3.2 GPIO/SUBSYS/PLL/CLOCK分析方法AP suspend状态下 , 会因为GPIO配置不当 , subsys/pll/clock没关 , 或者其他的原因造成26M没关 , 而导致底电流升高;
这种情况 , 可以从kernel log中找到一些端倪 , 以确定进一步分析的方向
【3.2.1】查找没有关闭的SUBSYS/CLOCK/PLL[6589/6582/6592/6595/6795] 查找关键字“PWR_STATUS” , [7:0]对应每个bit对应一个subsys 如果bit为1 , 代表这个子系统没关
echo 1 > /sys/module/mt_sleep/parameters/slp_ck26m_onecho 1 > /sys/module/mt_sleep/parameters/slp_dump_regs每个bit的定义可以看mt_spm_mtcmos.c
比如:#define MD1_PWR_STA_MASK (0x1 << 0)
[6732/6752/6735/6753] 查找关键字“slp_check_pm_mtcmos_pll” 如果有子系统没关 , 下一行可以看到类似下面的信息: [Power/clkmgr] SYS_AUD: on
然后再往下看 , 就是各子系统的dump信息 , 以aud子系统为例 , 找到SYS_AUD对应的部分 , 详细解释如下: cnt不等于0表示这个clock没关 后面每一个括号内(可能有多个)是这个clock的其中一个user的信息 “audio”是使用clock的user的名字 , 代码里传入的参数 “15”表示open clock的次数 ,“14”表示close clock的次数 , 两者不一样的话说明“audio”这个user使用这个clock有问题
[06][CG_AUDIO]* [02]state=1, cnt=1 (AUDIO,15,14) [08]state=0, cnt=0 (AUDIO,8,8) [09]state=0, cnt=0 (AUDIO,8,8) [18]state=0, cnt=0 (AUDIO,8,8) [19]state=0, cnt=0 (AUDIO,8,8)【3.2.2】查看GPIO的状态默认是关闭的 , 需要用下面的命令打开
echo 1 > /sys/module/mt_sleep/parameters/slp_dump_gpio然后在kernel log里就可以看到类似下面的信息: PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [IES]
对一下正常更异常的情况就会有帮助
重点关注[mode][DIR][PULL_SEL] , 其他栏位的状态即使改变很多情况下也是正常的
有些平台本身这块代码是注释掉的 , 需要更改代码才可以 , 搜索slp_dump_gpio可以找到相关代码
【3.2.3】查看26M CLOCK是否关闭搜索关键字“debug_flag” , 跟wake up by在同一行 ,bit[3:2]可以显示26M有没有关闭过 ,
如果bit[3:2]=0b’11 , 说明sleep时26M正常关闭;
如果bit[3:2]=0b’00 , 说明sleep时26M一直没关;

  • 如果发生这种case , 需要case by case去看
  • 另外 , 如果前面是wake up by GPU , 请忽略这行log信息(deepdile状态 , 不是suspend状态)
3.3 WAKELOCK 分析Kernel或者system持有wakelock会导致系统无法进入深度休眠 , 直接导致待机底电流偏高
【STEP1-找KERNEL层和USER层的WAKELOCK】
使用命令 , 查看kernel或者上层的wakelock
cat /proc/wakelock dumpsys power`相关weaklock都会被打印出来
【STEP2-找USER层的WAKESOURCE】
中间层申请的weaklock不会再上面显示 , 必须使用命令去查看weaksource的脚本去抓取这两种信息 , 脚本源码如下:
#!/system/bin/shecho "Start monitor power..." > /sdcard/power.txtwhile echo "====================================================================================" >> /sdcard/power.txtdodate >> /sdcard/power.txtecho "**********dumpsys power**********" >> /sdcard/power.txtdumpsys power | cat >> /sdcard/power.txtecho "" >> /sdcard/power.txtecho "**********cat /sys/kernel/debug/wakeup_sources**********" >> /sdcard/power.txtcat /sys/kernel/debug/wakeup_sources >> /sdcard/power.txtecho "" >> /sdcard/power.txtsleep 10done4.FAQ[FAQ09542][POWER]待机电流问题 , 如何查找WAKELOCK
【使用说明】
(1) 以下是列出的整个按键唤醒的log关键点 , 每条都有粗体字说明其含义以及该注意的关键字;
(2) 红色的是kernel log , 其他都是main log;
(3) 一条一条依次检查 , 直到如果发现某条log找不到 , 那问题就出在这个地方;