1、底电流调试(Rock Bottom Current Optimization)
底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档或者release note。一般情况下的底电流参考数据上限是:
底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档或者release note。一般情况下的底电流参考数据上限是:
512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA
1.1 校准RF
保证RF的PA、Antenna switch、Tuner、APT、GPIO工作在正常状态
1.2 飞行模式
开启飞行模式、关闭GPS、关闭自动旋转屏幕、关闭自动亮度调节、关闭其他特效效果设置
开启飞行模式,可以基本避免蓝牙、wifi、NFC、网络、FM等的一般影响;
关闭GPS,可以基本排除开启GPS对底电流的影响;
关闭自动旋转屏幕,可以基本排除sensor的影响;
关闭自动亮度调节,可以基本排除距离感应到的影响;
关闭其他特效效果设置,如指纹识别、黑屏手势、智能体感、手势隔空操作。。。。。。
1.3 使用perf_defconfig
修改device/qcom//AndroidBoard.mk。如果KERNEL_DEFCONFIG := _defconfig,那么改成KERNEL_DEFCONFIG := -perf_defconfig
同时,kernel代码改用/kernel/arch/arm/configs/-perf_defconfig
是平台名称或者项目名称
1.4 移除debugging APKs
/system/app/Logkit.apk/system/app/com.qualcomm.qlogcat.apk/system/xbin/qlogd
1.5 把应用尽量删除
在设置-->应用,禁用正在运行的应用
1.6 去掉CPU占用高的进程
adb shelltop
查看CPU占用,去掉在休眠模式下CPU占用大于0的进程。kill掉该进程,若kill不掉则rm掉相关应用。对于占用CPU高的kwork,需要查找驱动原因。
1.7 手动移除所有可以移除的外设
手机连上安捷伦电源,手机开机,然后让手机进入待机状态。手动移除TP、LCM、前camera、后camera、sensor、SD卡、SIM卡等可以手动移除的外围器件,同时观察并记录底电流变化。
# 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 = 01895 = 01892 = 01962 = 04679 = 164201 = 03851 = 03852 = 67157 = 169745 rxd_enable = 0WCDMA NV:NV3581 = 0NV3852 = 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/consumersshell@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
在关闭前先ca