底電流在手機飛行模式下調試。每一個平臺的底電流數據可能不同,具體能夠參考release出來的Current Consumption Data文檔或者release note。通常狀況下的底電流參考數據上限是:node
底電流在手機飛行模式下調試。每一個平臺的底電流數據可能不同,具體能夠參考release出來的Current Consumption Data文檔或者release note。通常狀況下的底電流參考數據上限是:android
512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mAshell
保證RF的PA、Antenna switch、Tuner、APT、GPIO工做在正常狀態網絡
開啓飛行模式、關閉GPS、關閉自動旋轉屏幕、關閉自動亮度調節、關閉其餘特效效果設置app
開啓飛行模式,能夠基本避免藍牙、wifi、NFC、網絡、FM等的通常影響;ide
關閉GPS,能夠基本排除開啓GPS對底電流的影響;函數
關閉自動旋轉屏幕,能夠基本排除sensor的影響;測試
關閉自動亮度調節,能夠基本排除距離感應到的影響;優化
關閉其餘特效效果設置,如指紋識別、黑屏手勢、智能體感、手勢隔空操做。。。。。。ui
修改device/qcom//AndroidBoard.mk。若是KERNEL_DEFCONFIG := _defconfig,那麼改爲KERNEL_DEFCONFIG := -perf_defconfig
同時,kernel代碼改用/kernel/arch/arm/configs/-perf_defconfig
是平臺名稱或者項目名稱
/system/app/Logkit.apk /system/app/com.qualcomm.qlogcat.apk /system/xbin/qlogd
在設置-->應用,禁用正在運行的應用
adb shell top
查看CPU佔用,去掉在休眠模式下CPU佔用大於0的進程。kill掉該進程,若kill不掉則rm掉相關應用。對於佔用CPU高的kwork,須要查找驅動緣由。
手機連上安捷倫電源,手機開機,而後讓手機進入待機狀態。手動移除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。。。)
在kernel/arch/arm/configs/-perf_defconfig中把sensor、TP、LCM、camera等的驅動模塊移除;
或者在對應驅動的Makefile裏面,移除驅動代碼
而後編譯bootimage,燒入手機觀察底電流變化
將不用的GPIO置爲輸入、拉低;配置成SPI、I2C的GPIO,若不用,置爲懸空
在boot_images/core/systemdrivers/tlmm/config/platform/TLMMChipset.xml
,修改GPIO配置。該處配置GPIO的初始狀態,驅動有可能會修改GPIO。
對比項目原理圖與平臺參考原理圖,項目原理圖中多出的NC GPIO要處理掉。
須要跟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
對比項目原理圖與平臺參考原理圖,排查硬件不同的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
在休眠前關閉MPP一、MPP二、MPP三、MPP4
如PM8916的寄存器地址分別是0xA04六、0xA14六、0xA24六、0xA346
在關閉前先cat data以查看原來的值。
GPIO狀態讀取的方法以下:
(1)GPIO dump
爲了獲得休眠時的GPIO狀態,增長下面的打印:
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; 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)'], ['SLEEP_DEEP_SLEEP_EXIT','deep sleep exit (sleep mode: %d)'], ['SLEEP_NO_DEEP_SLEEP','bail early from deep sleep. (sleep mode: %d) (reason: %d)'], ['SLEEP_RPM_HALT_ENTER','rpm halt enter'], ['SLEEP_RPM_HALT_EXIT','rpm halt exit'], ['SLEEP_MPM_INTS','pending mpm interrupts at wakeup: (interrupt_status_1 %d), (interrupt_status_2 %d)'], ['SLEEP_DEEP_SLEEP_ENTER_COMPLETE','deep sleep exit complete (sleep mode: %d)'], ['SLEEP_DEEP_SLEEP_EXIT_COMPLETE','deep sleep exit (sleep mode: %d)'], ['SLEEP_MPM_WAKEUP_TIME','mpm wake up time (wakeup time: 0x%0.8x%0.8x)'], ['SLEEP_GPIO_DUMP','gpio [%d] configuration is %d'], ['SLEEP_EVENT_LAST=383','sleep last event placeholder']
增長SLEEP_GPIO_DUMP這一項。
編譯燒寫rpm.mbn。
讓機器休眠,進入download,抓dump,而後將以下日誌發給平臺技術支持分析。
CODERAM.bin
MSGRAM.bin
DATARAM.bin
以及新編譯出來的RPM_AAAAANAZR.elf。
在RPM可能不是很方便,也能夠用busybox來讀取寄存器,例如讀GPIO11:
Physical Address for GPIO_CFG11 = 0x100B000 root@android:/data/busybox # ./busybox devmem 0x100B000 32 ./busybox devmem 0x100B000 32 0x00000203 GPIO_PULL = "11" PULL_UP FUNC_SEL = "0000" FUNCTION GPIO DRV_STRENGTH = "000" DRV_2_MA GPIO_OE = "1" Output Enable
抓rpm dump,而後把log提供給平臺技術支持。
方法以下:
(1)ps_hold接地
在休眠狀態下,接ps_hold到地少於200mS,機器會進入緊急下載狀態,插入USB,QPST會自動獲得memory dump,而後上傳如下幾個文件:
CODERAM.bin
MSGRAM.bin
DATARAM.bin
以及RPM_AAAAANAZR.elf(必須與機器的編譯時間一致匹配的elf)
(2)改reset爲download key
發這些命令改reset爲download key:
# cd /sys/kernel/debug/spmi/spmi-0 # echo 0x844 > address # echo 4 > count # cat data 00840 -- -- -- -- 0F 07 04 00 # echo 0x00 0x00 0x01 0x00 > data # cat data 00840 -- -- -- -- 00 00 01 00 # echo 0x00 0x00 0x01 0x80 > data # cat data 00840 -- -- -- -- 00 00 01 80
而後長按下鍵,會進入download。以後抓取log方法同上。
若是進不了download,須要確認:
CONFIG_MSM_DLOAD_MODE=y
另外也有可能與nv 4399和905有關係。
檢查rpm_stats是否進入vdd min或者xo/no shutdown。使用下面的命令檢查rpm lower power mode count:
cat /sys/kernel/debug/rpm_stats
若是vmin的count是0,則代表設備歷來沒有進入vdd min;non-zero則說明設備進入過vdd_min。
RPM Mode: xosd count:0 time in last mode(msec):0 time since last mode(sec):794 actual last sleep(msec):0 RPM Mode:vmin count:11 time in last mode(msec):0 time since last mode(sec):359 actual last sleep(msec):110000
能夠dump出來完整詳細的gpio/clk/pmic信息,排除休眠時候的狀態異常。
adb logcat -v time > YearMounthDayHourMinute_logcat.txt //main log adb logcat -v time -b events > YearMounthDayHourMinute_logcat_event.txt //event log adb logcat -v time -b radio > YearMounthDayHourMinute_logcat_radio.txt //radio log adb shell dmesg > YearMounthDayHourMinute_dmesg.txt //kernel log
能夠採用功耗問題時間追蹤表來精確追蹤功耗異常。
可使用以下命令來打開指定文件的kernel log(以qpnp-adc-tm.c和qpnp-adc-common.c爲例):
adb shell mount -t debugfs none /sys/kernel/debug adb shell "echo 8 > /proc/sys/kernel/printk" adb shell "echo 'file qpnp-adc-tm.c +p' > /sys/kernel/debug/dynamic_debug/control" adb shell "echo 'file qpnp-adc-common.c +p' > /sys/kernel/debug/dynamic_debug/control" adb shell "echo 8 > /proc/sys/kernel/printk"
爲指定的函數開啓log,以qpnpint_handle_irq爲例:
adb shell "echo 'func qpnpint_handle_irq +p' > /sys/kernel/debug/dynamic_debug/control"
#logkit#調出logkit apk,能夠保存logcat、dmesg、crash、QXDM、GPU log等日誌信息到手機裏面。
經過top命令,能夠查詢到cpu佔用較高的應用。若是一個應用一直在佔用cpu,而此時並無打開該應用,那麼該應用極可能會致使待機異常。
adb shell top
「該場景下CPU使用率」是User+System+IOW+IRQ
「模塊相關的CPU佔用率」是模塊相關進程佔用CPU使用率的總和
設置-->應用-->正在運行,能夠看到正在運行的應用或者服務。禁止掉應用或者服務,觀察待機電流變化。
調試wakeup問題,可使能debug功能,而後抓取log。Log中會增長一些debug信息。
mount -t debugfs none /sys/kernel/debug echo 1 > /sys/kernel/debug/clk/debug_suspend echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask echo 4 > /sys/module/wakelock/parameters/debug_mask echo 1 > /sys/module/lpm_levels/parameters/debug_mask echo 0x16 > /sys/module/smd/parameters/debug_mask
一、wakeup_sources
kernel wakelock和userspace wakelock都有可能阻止系統睡眠。全部的wakeup_sources均保存在sys節點/sys/kernel/debug/wakeup_sources裏面。
該文件包含了以下信息:
(1)the total amount of time a wakeup source has prevented suspend
(2)the amount of time a wakelock has been active since the last activation etc. The unit of time is milliseconds.
二、active_since
active_since值能夠用來確認wakelock是否正在阻止休眠。若是該值不是零,那麼這個wakelock正在工做而且阻止休眠。
三、獲取wakeup_sources的命令
adb root 67754400 adb remount adb shell cat /sys/kernel/debug/wakeup_sources > /data/wakeup_sources.txt adb pull /data/wakeup_sources.txt
得到wakeup_sources.txt之後,經過Excel打開,active_since不爲0的項爲wakeup source。以表2爲例,msm_dwc3對應的active-since值481756>0,這意味着msm_dwc3驅動在阻止系統睡眠,下一步須要檢查msm_dwc3驅動代碼及相關log。
表格 2 Wakeup source opened in Excel
四、power:wakeup_source_activate and power:wakeup_source_deactivate events
當一個wakeup source被acquire或者release時候,power:wakeup_source_activate和power:wakeup_source_deactivate event將隨即被寫到trace buffer裏面,這樣能夠記錄wakeup source被driver使用的頻率。
開啓該功能的方法:
echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event The power:wakeup_source_activate and power:wakeup_source_deactivate events are written to the trace buffer any time a wakeup source is acquired or released and it can provide information on how often a wakeup source is being used by a driver. To enable these events, you can enable following: echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event Once the above done, the traces will be present in /sys/kernel/debug/tracing/trace.
powertop用來看CPU的運行統計以協助調試power問題。powertop的用法以下:
powertop --h Usage: powertop [OPTION...] n -d, --dump read wakeups once and print list of top offenders n -t, --time=DOUBLE default time to gather data in seconds n -r, --reset Reset PM stats data n -h, --help Show this help message n -v, --version Show version information and exit
獲取powertop log的方法:
經過USB鏈接手機到電腦
adb shell,而後執行以下命令:
sleep 10 && /data/powertop [-r] -d -t 30 > /data/powertop.log &
拔掉USB線,等待10秒後開始功耗測試
插上USB
adb pull /data/powertop.log
打開CPU freq change log:
mount -t debugfs none /sys/kernel/debug cd /sys/kernel/debug echo -n 'file acpuclock-8x60.c +p' > dynamic_debug/control echo -n 'file acpuclock-krait.c +p' > dynamic_debug/control
查看cpu freq stats:
cat /sys/devices/system/cpu/cpu0/cpufreq/stats cat /sys/devices/system/cpu/cpu1/cpufreq/stats cat /sys/devices/system/cpu/cpu2/cpufreq/stats cat /sys/devices/system/cpu/cpu3/cpufreq/stats
To lock cpu freg:
echo the same freq to following sys mode will lock cpu freq to the setting freq. /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
To enable/disable specific freq for ACPU
ACPU freq table is defined in acpu_freq_tbl_* structure of specific platform. arch/arm/mach-msm/acpuclock-.c For 8974, it is defined in arch/arm/mach-msm/acpuclock-8974.c. the first column of following table used to enable/disable freq in the row: 1:enable, 0:disable static struct acpu_level acpu_freq_tbl_2p3g_pvs0[] __initdata = { { 1, { 300000, PLL_0, 0, 0 }, L2(0), 800000, 72 }, { 0, { 345600, HFPLL, 2, 36 }, L2(1), 800000, 83 }, { 1, { 422400, HFPLL, 2, 44 }, L2(2), 800000, 101 }, { 0, { 499200, HFPLL, 2, 52 }, L2(2), 805000, 120 }, { 0, { 576000, HFPLL, 1, 30 }, L2(3), 815000, 139 }, { 1, { 652800, HFPLL, 1, 34 }, L2(3), 825000, 159 }, { 1, { 729600, HFPLL, 1, 38 }, L2(4), 835000, 180 }, { 0, { 806400, HFPLL, 1, 42 }, L2(4), 845000, 200 }, { 1, { 883200, HFPLL, 1, 46 }, L2(4), 855000, 221 }, { 1, { 960000, HFPLL, 1, 50 }, L2(9), 865000, 242 }, { 1, { 1036800, HFPLL, 1, 54 }, L2(10), 875000, 264 }, { 0, { 1113600, HFPLL, 1, 58 }, L2(10), 890000, 287 }, { 1, { 1190400, HFPLL, 1, 62 }, L2(10), 900000, 308 }, … { 1, { 1958400, HFPLL, 1, 102 }, L2(19), 1040000, 565 }, { 0, { 2035200, HFPLL, 1, 106 }, L2(19), 1055000, 596 }, { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1070000, 627 }, { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1085000, 659 }, { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1100000, 691 }, { 0, { 0 } } };
Core 0 can’t be hotplugged, Core 1/2/3 can be hotplugged,
To remove core :
echo 0 > /sys/devices/system/cpu/cpu1/online echo 0 > /sys/devices/system/cpu/cpu2/online echo 0 > /sys/devices/system/cpu/cpu3/online
To add back core:
echo 1 > /sys/devices/system/cpu/cpu1/online echo 1 > /sys/devices/system/cpu/cpu2/online echo 1 > /sys/devices/system/cpu/cpu3/online
To check scaling governor:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
To set new governor:
好比:
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Use Mpdecison daemon to start/stop/enable debug with commands below:
Start mpdecison: start mpdecision n Stop mpdecison: stop mpdecision Enable mpdecision debug : start mpdecision --debug
Following sys node can be used to enable the lower resource,
echo 2 > /sys/module/lpm_resources/enable_low_power/l2 echo 1 > /sys/module/lpm_resources/enable_low_power/pxo echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_dig echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_mem echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu1/power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu2/power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu3/power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/idle_enabled echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/suspend_enabled echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/idle_enabled echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/idle_enabled echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/idle_enabled echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/idle_enabled echo 0 to above sys node will disable related low power mode.
get android alarms and statistics: adb dumpsys alarm > alarms.txt enable android debug message in logcat: setprop persist.alarm.debug 1
Sys node /proc/timer_stats can be used to check kernel timer stastics, customer can use following command to get timer statics in specific scenario:
echo 0 > /proc/timer_stats && sleep 10 && echo 1 > /proc/timer_stats && sleep 30 && cat /proc/timer_stats > /data/timer_stats &
OEMs need to provide file /data/timer_stats to salesforce case for check.
屏幕亮度等級不一樣,功耗不一樣。亮度越低,功耗越低。調低屏幕默認背光亮度等級和屏幕最高亮度設置時候的背光亮度等級,能夠優化手機總體功耗表現。
LCD背光等級的設備節點:
/sys/class/leds/lcd-backlight/brightness
默認背光等級和最高亮度背光等級須要同時考慮到用戶體驗和功耗表現,須要一塊兒評估。
另外,調試LCD的fps幀率,也能夠優化功耗。
CPU/GPU的動態調頻調壓能夠優化手機的功耗表現。該影響是總體性的,系統性的。
CPU降頻主要經過兩種方式實現,均可以達到降頻的目標。
一、設置CPU工做在powersave模式。設置該模式後,CPU將一直工做在最低頻率(300000hz)。此時手機最省電,可是有可能會出現手機運行變卡頓。
例如:將CPU0置爲powersave模式,命令爲:
echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
例如:將CPU1置爲powersave模式,命令爲:
echo "powersave" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
ex780共有4個CPU(CPU0~CPU3),均可以這樣處理
二、限制CPU最高頻率,以限制CPU的運行頻率上限
CPU(CPU0~CPU3)能夠選擇的頻率值以下所列,即這些數值均可以用做CPU的頻率上限。選擇的頻率上限能夠根據實際場景須要來設置。在超級省電模式下,CPU工做的宗旨是:CPU工做頻率低+運行不卡,兩項都要保障。
CPU能夠選擇的頻率:
300000 422400 652800 729600 883200 960000 1036800 1190400 1267200 1497600 1574400 1728000 1958400 2265600 2457600
例如:將CPU0的頻率上限設置爲960000
echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
例如:將CPU0的頻率上限設置爲422400
echo 422400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
GPU相關調試與CPU相似,設備節點路徑/sys/devices/fdb00000.qcom,kgsl-3d0/kgsl/kgsl-3d0
應用對cpu的佔有率,若是佔有率太高,則該應用通常會致使功耗較大。
adb shell top -m 6
能夠從下面幾個方面優化:
下降屏幕背光亮度等級;
採用CPU、GPU動態調頻調壓,並調低CPU、GPU頻率下限;
採用thermal-engine.conf 。
下降camera幀率;
下降屏幕背光亮度等級;
採用CPU、GPU動態調頻調壓,並調低CPU、GPU頻率下限;
採用thermal-engine.conf 。