高通平台底电流调节心得
Q:底电流和待机电流的概念?
A:底电流即机器完全睡眠时的最低电流;待机电流即机器在一段时间内的待机平均电流,通常需要插入SIM卡测待机电流。
Q:底电流调试方法?
A:1.首先,需要进行射频QCN文件下载并进行射频校准,因为QCN文件不下载射频不能正常工作,会引起漏电,继而引起底电流偏大。
2.射频校准后如果仍然存在较大底电流,则需要进入飞行模式测试底电流,并排除GPIO、LCD、CAMERA、SENSOR等外设问题,可把外设拆除再进行测试。
3.分析机器有无进入睡眠状态,可通过串口信息查看linux kernel有无睡眠,kernel没有进入睡眠则查看是哪个模块引起的并有针对性分析相应模块。如果kernel已经睡眠,还存在底电流偏大问题,则需要接上jtag线,并通过trace32分析,最主要的是分析系统各模块的clock有无关闭,例如:lcd的MDP_VSYNC_CLK没有关闭,则需要查看lcd模块。
4.可通过检测TCXO引脚的状态来确定modem端是否已经睡眠。
5.在modem端tlmm_bsp.c文件下比对各个GPIO有无设置错误继而引起漏电。另外,sleep_target.c文件也值得分析。
6.如果相同代码上的其它项目底电流ok的话,应该重点排查新项目新添加的模块或者GPIO口是否被更改。
7.如果以上都ok的情况下仍然存在底电流过大问题,则需要硬件协助排查问题。
小结:引起底电流过大的问题就是睡眠状态下有些资源没有被完全关闭导致漏电,这对使用电池作为电源的手机来说影响很大,底电流的调节是一个综合的过程,需要团队每个人的配合。
================================================================
最近调试了几个底电流偏高的项目,加深了对高通平台底电流的理解,记录如下,备忘。
1.当底电流偏高时,先不要急着连上JTAG线(连JTAG线很是麻烦),应该先用示波器测量TXCO脚,看modem能否睡眠。如果TXCO引脚在睡眠时为低电平,不会输出正弦波,则说明modem能睡眠,也就是说软件层能睡眠,这时候即可断定是硬件漏电引起的,应该测量各GPIO引脚看是否是正常状态。必要时需要逐个拆元器件来判断是哪个硬件引起的漏电。
2.当modem不能睡眠时则需要连接上JTAG,通过trace32工具来判断哪个clk没有关掉,定位到相应模块再有针对性地解决问题。以下是一些使用trace32工具调试时需要执行的一些命令:
Msm_pm_collapse() in msm_sleep() in pm.c/pm2.c
Clk_regime_apc_rail_off() in modem switches off the power rail to the Apps.
BP side:
sleepmod_tcxo_shutdown() // Perform TCXO shutdown
sleepmod_ok_tcxo_shutdown() //Check votes and other misc reasons not to perform TCXO shutdown.
clk_regime_tcxo_shutdown_asm() //performs the TCXO shut-down
clkrgm_linux
do ../boot_debug.cmm //执行高通给我们提供的脚本来加载modem端代码以便使用trace32工具调试modem端
d.load.elf M8X25QDOSKOLYM3070.elf /nocode /noclear //加载modem端编译出来的镜像文件,需要注意的事这个文件需要与下载到机器里的modem端软件相匹配
b.s clk_regime_apc_rail_off /o //设置断点,可以通过这个断点判断app是否睡眠
b.s sleepmod_ok_tcxo_shutdown /o //当modem运行到这个函数,说明modem准备睡眠,但不一定能睡眠,这个时候可以查看clkrgm_linux变量,可得到哪个clk没有关掉
Y.SPATH.SRD += ../../core\power\SLEEP\src\
symbol.sourcepath.setrecursedir ../your path //这个命令能将trace32中的汇编代码与本地代码相匹配
v.v gSleepInfo
v.v clkrgm_linux
================================
高通7x27a平台目前遇到几个底电流调试问题,发表以下见解
1:首先个人在调试不睡眠中遇见2次由于串口睡眠模式配置不对导致系统无法睡眠的问题,要是串口连接其他模块比如BT和modem,我们在sleep模式不可以配置成普通gpio功能,这样很容易导致睡眠时无法与设备通讯导致无法睡眠,modem有radio lock 。
2:在系统可以睡下,底电流在20mA以下但是大于2mA的情况下,很可能是设备漏电造成或者开了一些clk,特别是clk对底电流影响很大。我自己有遇见过wifi芯片gpio倒灌漏电,CTP漏电。只要发现是哪个设备漏电,解决起来应该不难。遇见过一次camera clk导致sleep底电流偏大,普通外设需要的CLK我们睡眠时应该关闭。
3:只要系统可以睡下,我们在kenel config里使用小点的配置来逐一排查哪些设备漏电,逐一检测,睡眠模式通常gpio配置成pull_in pull_down。只要发现问题就好办了。
4:关于系统不睡的调试,我们可以在kernel CMD中填入no_console_suspend来使睡眠时串口输出log,还有可以打开PM_DEBUG。具体方法有篇文章有介绍。
目前认为做的最有成就感的2件事,一是将无法睡下的手机调到可以sleep底电流到5mA,再排查出漏电问题底电流降到1.几mA,二是决解一款芯片漏电降低底电流致该方案成功上市。