各种“挤牙膏式” 优化android 功耗

本文详细介绍了Android设备功耗优化的多个层面,包括底电流调试、待机电流优化、场景功耗项的优化以及Modem功耗优化。在底电流调试中,涉及校准硬件参数、关闭不必要的组件和服务、移除外设和驱动等。待机电流优化则通过adb log、wakelock分析等方法减少不必要的CPU活动。场景功耗优化关注屏幕、CPU/GPU的DVFS策略、应用CPU占用率以及游戏和相机场景。最后,针对Modem功耗,提出QCN烧写、PA功耗分析、网络协议问题排查等解决方案。
摘要由CSDN通过智能技术生成

1、底电流调试(Rock Bottom Current Optimization)

底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来相关平台的Current Consumption Data文档或者release note。
每个平台的底电流都不一样,一般情况下的底电流参考数据上限是:
512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA

另,DDR多一个G,底电流一般会多高0.5mA,因为待机时DDR内存都维持电源保持容性。

下面操作没有步骤顺序性!只是相关点!

1.1 校准硬件参数

保证RF的PA、Antenna switch、Tuner、APT、GPIO工作在正常状态。
另,高通平台板子先要烧写QCN后modem才能休眠。

1.2 排除无关影响

开启飞行模式、关闭GPS、关闭自动旋转屏幕、关闭自动亮度调节、关闭其他特效效果设置。

  • 开启飞行模式,可以基本避免蓝牙、wifi、NFC、网络、FM等的一般影响;
  • 关闭GPS,可以基本排除开启GPS对底电流的影响;
  • 关闭自动旋转屏幕,可以基本排除sensor的影响;
  • 关闭自动亮度调节,可以基本排除距离感应到的影响;
  • 关闭其他特效效果设置,如指纹识别、黑屏手势、智能体感、手势隔空操作。。。。。。

1.3 使用perf_defconfig

修改device/qcom/<TARGET>/AndroidBoard.mk。如果KERNEL_DEFCONFIG := <TARGET>_defconfig,那么改成KERNEL_DEFCONFIG := <TARGET>-perf_defconfig

同时,kernel代码改用/kernel/arch/arm/configs/-perf_defconfig

<TARGET>是平台名称或者项目名称

1.4 移除debugging APKs

/system/app/Logkit.apk
/system/app/com.qualcomm.qlogcat.apk
/system/xbin/qlogd

1.5 把应用尽量删除

在设置–>应用,禁用正在运行的应用

1.6 去掉CPU占用高的进程

adb shell
top

查看CPU占用,去掉在休眠模式下CPU占用大于0的进程。kill掉该进程,若kill不掉则rm掉相关应用。对于占用CPU高的kwork,需要查找驱动原因。

1.7 手动移除所有可以移除的外设

手机连上安捷伦电源,手机开机,然后让手机进入待机状态。手动移除TP、LCM、前camera、后camera、sensor、SD卡、SIM卡等可以手动移除的外围器件,同时观察并记录底电流变化。

直接移除WLAN芯片可能会导致开不了机,所以在移除WLAN之前,先对软件做如下处理:

# mount -o rw,remount -t vfat /dev/block/bootdevice/by-name/modem 
# cd /firmware/image 
# rm wcnss.* 
# reboot 

或者

# lsmod
# rmmod WLAN

移除其他可以移除的芯片(sensor、NFC。。。)

1.8 移除驱动模块

在/kernel/arch/arm/configs/-perf_defconfig中把sensor、TP、LCM、camera等的驱动模块移除;
或者在对应驱动的Makefile里面,移除驱动代码,然后编译bootimage,烧入手机观察底电流变化

1.9 配置不用的GPIO

将不用的GPIO置为输入、拉低;配置成SPI、I2C的GPIO,若不用,置为悬空。
在boot_images/core/systemdrivers/tlmm/config/platform/TLMMChipset.xml,修改GPIO配置。该处配置GPIO的初始状态,驱动有可能会修改GPIO。
对比项目原理图与平台参考原理图,项目原理图中多出的NC GPIO要处理掉。

1.10 检查power相关的NV items

需要跟CE确认。一般如下:

1027 = 0
1895 = 0
1892 = 0
1962 = 0
4679 = 16
4201 = 0
3851 = 0
3852 = 6
7157 = 1
69745 rxd_enable = 0
WCDMA NV:
NV3581 = 0
NV3852 = 6

1.11 排查GPIO、LDO、总线

对比项目原理图与平台参考原理图,排查硬件不一样的GPIO、LDO、总线配置。
量测各GPIO、LDO、I2C在休眠时候的电压,需用万用表准确测量。
休眠时各路I2C GPIO的电压是多少v,用万用表准确测量。
如果条件允许,测量所有LDO在休眠前和休眠后的准确电压。

对于LDO,调试方法如下:

(1)adb shell关闭LDO

如关闭L3:

cd /sys/kernel/debug/regulator/8916_l3/
echo 0 > enable
(2)LDO太多设备用到,不适合用adb shell来关。可以这样调试:
cat /sys/kernel/debug/regulator/8916_l6/consumers 
shell@msm8916_32:/sys/kernel/debug/regulator/8916_l6 $ cat consumers 
Device-Supply EN Min_uV Max_uV load_uA 
0-000c-vio Y 1800000 1800000 0 
0-0068-vi2c N 1800000 1800000 0 
5-0038-vcc_i2c Y 1800000 1800000 0 
1a98000.qcom,mdss_dsi-vddio N 1800000 1800000 100 
1a98300.qcom,mdss_dsi_pll-vddio N 1800000 1800000 100 
8916_l6 N 0 0 0 

这样就可以看到是哪些设备请求了LDO6。然后 找到对应的代码,在休眠时关掉LDO,唤醒时再打开。

0-000c: 挂在I2C0上地址为0xc 
5-0038: 挂在I2C0上地址为0x38 

查看这两个设备的驱动代码是否有执行regulator_enable。

(3)通过寄存器地址关闭LDO

如LDO6的地址是0x14546,则关闭方法是:

# cd /sys/kernel/debug/spmi/spmi-0 
# echo 0x14546 > address 
# echo 1 > count 
# cat data 可以读寄存器 
# echo 0x00 > data 关LDO6
(4)关闭MPP

在休眠前关闭MPP1、MPP2、MPP3、MPP4 。

如PM8916的寄存器地址分别是0xA046、0xA146、0xA246、0xA346

在关闭前先cat data以查看原来的值。

GPIO状态读取的方法如下:

(1)GPIO dump

为了得到休眠时的GPIO状态,增加下面的打印(最新平台dump gpio代码有差异,具体请提case):

rpm_proc/core/power/sleep/src/lpr_definition_uber.c

#include "tlmm_hwio.h" 

void deep_sleep_enter(void) 
{
    
uint64 sleep_duration; 
... 

SWEVENT(SLEEP_DEEP_SLEEP_ENTER_COMPLETE, sleep_mode.deep_sleep_mode, sleep_duration); 

// For test 
{
    

int num; 
int i=11;/*LCM_I2C_SCL, GPIO_11*/ 
volatile uint32 cfg ,inout, val; 

num = 122; //8916 only. Need modify for 8974/8x10/8x26 etc. 

cfg = *(volatile uint32*)HWIO_TLMM_GPIO_CFGn_ADDR(i); //(0x61000000 + i * 0x1000) 
inout = *(volatile uint32*)HWIO_TLMM_GPIO_IN_OUTn_ADDR(i);//(0x61000004 + i * 0x1000) 
val = ((cfg << 16)&0xffff0000) | (inout&0xffff); 
SWEVENT(SLEEP_GPIO_DUMP, i, val); 

} 

mpm_sw_done(sleep_mode.deep_sleep_mode, sleep_duration); 

} while(FALSE); 

} 

增加for test下面这一段代码。

然后再修改:

rpm_proc\core\power\sleep\build\SConscript

if 'USES_QDSS_SWE' in env: 
QDSS_IMG = ['QDSS_EN_IMG'] 
events = [['SLEEP_DEEP_SLEEP_ENTER=320','deep sleep enter. (sleep mode: %d) (count: %d)']
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值