1. 程式人生 > >MTK 驅動(38)---MTK 待機問題分析

MTK 驅動(38)---MTK 待機問題分析

mtk 平臺待機問題分析:

1 待機問題分類  1)無法待機: 

1. 需要確認 APK 是否有 partial_wakelock 

2. kernel 是否持有 wakeup source 不釋放. 

2)可以待機,但是喚醒頻繁. 

1. 是否有開啟資料連線,或者 wifi(網路包喚醒) 

2. 如果不是 1,一般是 alarm 或者網路註冊,modem CLDMA 的一些喚醒. 

常見的喚醒:EINT/CLDMA/PCMTIMER/CONN/CCIF 

2 抓 log 注意事項:  1.處理待機問題,需要提供 mobile log and netlog(如果有開啟資料連線或者 WIFI), 在問題沒有指向是modem 的問題前,不要開啟 modem log.  2.手機先對準網路時間,並提供測試開始跟結束的時間 以及電流波形圖(電流圖跟 1 的 mobile log 是一起執行),MTK 處理一般是使用 PowerMonitor.  方案一:log 設定成開機自啟動,並在開機後直接測試.  測試結束後:  adb shell dumpsys batterystats > battersystats.log  adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources.log  adb shell ps > ps.txt  方案二:  測試前  adb shell dumpsys batterystats > battersystats_1.log  adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources_1.log  測試後:  adb shell dumpsys batterystats > battersystats_2.log  adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources_2.log  adb shell ps > ps.txt  大部分情況下,如果是因為持鎖的問題,很容易把 sys log 前面的持鎖的 log 沖掉.所以一般建議從開機啟動後測試,測試時間不用太長.如果特殊情況,重啟後不復現,請使用方案二.

3.分析問題 3.1如何確認喚醒源 正則表示式: ([p]+) ([p]+) SPM SPM wake up by|md_settle|suspend exit

<2>[ 158.453122]<1>-(0)[95:kworker/u8:2][SPM] wake up by CONN2AP, timer_out = 10217, r13 =0x47000, debug_flag = 0x9c

 <2>[ 158.895650]<3>-(0)[95:kworker/u8:2][SPM] wake up by CONN2AP, timer_out = 80686, r13 =0x2004f208, debug_flag = 0x9f 

<2>[ 162.544639]<2>-(0)[141:kworker/u8:3][SPM] wake up by CONN2AP, timer_out = 7546, r13 =0x20047238, debug_flag = 0x9c 

<2>[ 162.983046]<2>-(0)[141:kworker/u8:3][SPM] wake up by EINT, timer_out = 113643, r13 =0x20041238, debug_flag = 0x9f 

<2>[ 163.964958]<2>-(0)[141:kworker/u8:3][SPM] wake up by CONN2AP, timer_out = 5112, r13 =0x47000, debug_flag = 0x9c 

<2>[ 169.662402]<0>-(0)[142:kworker/u8:4][SPM] wake up by CLDMA_MD, timer_out = 1452520, r13 =0x41238, debug_flag = 0x9f 

3.2.如何確認喚醒的時間點(基本上都適用) 正則表示式:kworker.*\] SPM SPM wake up by|md_settle|suspend exit,可以搜尋到具體的喚醒時間點:

 【字首不是 swapper】wake up by 是系統起來的第一句 log,時間會開始重新 running,往下第一個 PM:suspend exit 基本上就是喚醒的時間點. 

<6>[ 2971.418367]<0>-(0)[0:swapper/0][SPM] wake up by GPT, timer_out = 302, r13 = 0x20041238,debug_flag = 0x90 

<2>[ 172.168900]<0>-(0)[142:kworker/u8:4][SPM] wake up by CONN2AP, timer_out = 4561649, r13 =0x20047238, debug_flag = 0x9f 

<6>[ 172.239721]<1> (1)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:37.021819616 UTC 

<2>[ 172.612907]<1>-(0)[142:kworker/u8:4][SPM] md_settle = 99, settle = 99 

<2>[ 172.612907]<1>-(0)[142:kworker/u8:4][SPM] wake up by CONN2AP, timer_out = 19411, r13 =0x20047238, debug_flag = 0x9c 

<6>[ 172.679674]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.023614769 UTC 

<6>[ 172.948171]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.292113615 UTC 

<2>[ 176.028364]<3>-(0)[95:kworker/u8:2][SPM] md_settle = 99, settle = 99 

注意這個是 kernel 的時間,轉換到 main log 的時間:根據 mobile log 裡面 properties 的時區資訊[persist.sys.timezone].譬如[persist.sys.timezone]: [Asia/Shanghai] 即需要加上 8 個小時 

2015-12-27 03:09:37.021819616 對應的 UTC 時間為:2015-12-27 11:09:37.021819616

3.3 常用喚醒 其中一次完整的喚醒有如下的 log: 

//第一句喚醒,wake up by CONN2AP,代表被 connectivity wakeup,大部分情況是 WIFI 資料.<2>[ 172.612907]<1>-(0)[142:kworker/u8:4][SPM] wake up by CONN2AP, timer_out = 19411, r13 =0x20047238, debug_flag = 0x9c 

//喚醒的時間點: 

<6>[ 172.679674]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.023614769 UTC 

<6>[ 172.948171]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.292113615 UTC 

<6>[ 173.572666]<1> (0)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.916604538 UTC 

<6>[ 173.989622]<3> (1)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:39.333548769 UTC 

<6>[ 174.399687]<3> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:39.743622615 UTC 

//最後一句 sleep 的 log. 只有出現 md_settle 才代表真正 sleep. 

<2>[ 176.028364]<3>-(0)[95:kworker/u8:2][SPM] md_settle = 99, settle = 99 

2015-12-27 03:09:38.023614769 對應的 main log 時間為:2015-12-27 11:09:38.023614769

確認引起喚醒的問題包: 

在 main log 裡面搜尋關鍵字:Posix_connect Debug: 

可以發現對應的時間點,是豌豆莢這個應用在發包. 

【下面的 log 代表是那些 APK 在發包,有發包就有收包】 

12-27 11:05:44.279 2895 3138 D Posix : [Posix_connect Debug]Process com.lava:pushservice :80 

12-27 11:06:02.786 4715 4778 D Posix : [Posix_connect Debug]Process com.sina.weibo :443 

12-27 11:06:07.779 4715 4798 D Posix : [Posix_connect Debug]Process com.sina.weibo :443 

12-27 11:06:10.080 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4828 

12-27 11:06:15.465 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4828 

12-27 11:09:38.313 3635 3670 D Posix : [Posix_connect Debug]Processcom.wandoujia.phoenix2:update_service :44312-27 11:09:42.347 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4828 

12-27 11:09:49.055 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4829 

12-27 11:09:4 9.111 4827 4942 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :80 

12-27 11:09:51.199 3495 3570 D Posix : [Posix_connect Debug]Process com.wandoujia.phoenix2 :80 

並非每個 wake up 的時間點,都可以找到明確的 APK 在傳送包. 

參考【如何確認具體一次喚醒,是哪個 APK 引起的】

【喚醒型別為 CLDMA_MD】 

正則表示式: ([p]+) ([p]+) SPM SPM wake up by|CLDMA_MD wakeup source|md_settle|suspend exit 

確認喚醒的 channel ID: 

<2>[ 3072.796534]<2>-(0)[14284:kworker/u8:0][SPM] wake up by CLDMA_MD, timer_out = 5598687, r13= 0x20001238, debug_flag = 0x9f

 //喚醒點之後第一句 CLDMA_MD wakeup source 會打印出 channel ID. 譬如該題是 10

<5>[ 3072.810528]<2> (1)[23510:kworker/u9:0][ccci1/mcd]CLDMA_MD wakeup source:(1/10) 

<6>[ 3072.872362]<3> (1)[14284:kworker/u8:0]PM: suspend exit 2016-02-05 11:28:18.030905923 UTC 

<6>[ 3074.000405]<2> (0)[14284:kworker/u8:0]PM: suspend exit 2016-02-05 11:28:19.158954462 UTC 

<2>[ 3075.262223]<3>-(0)[14284:kworker/u8:0][SPM] md_settle = 99, settle = 99 

<2>[ 3075.262223]<3>-(0)[14284:kworker/u8:0][SPM] wake up by EINT, timer_out = 4159454, r13 =0x41000, debug_flag = 0x9f 

<6>[ 3075.341978]<3> (1)[14284:kworker/u8:0]PM: suspend exit 2016-02-05 11:30:28.031774693 UTC 

<2>[ 3075.996184]<2>-(0)[14284:kworker/u8:0][SPM] md_settle = 99, settle = 99

常用的喚醒的 channel: 

[channel 10]: 

需要搜尋 radio log 確認是什麼 AT command 喚醒了系統. 

時間點: 

2016-02-05 11:28:18.030905923 + 8h = 2016-02-05 19:28:18.030905923 

以 19:28:18 搜尋 radio log,往下搜尋,找到第一條 AT<02-05 19:28:18.032 20835 20856 D AT : AT< +CIREPI: 0

 說明喚醒的 AT command 是 AT< +CIREPI

常見的 AT command 的喚醒:參考下面【常見 AT 命令解析】

AT +ECOPS

搜網的次數 ------------> AT: CREG CGREG (一個是 CS,一個是 PS) 

網路 PDP 狀態變化的次數 ----------> AT:CGEV (PDN activate/deactivate) 

VOLTE 功能導致喚醒的次數 -----------> AT: CIREPI CIREPH CNEMS1 CIREG EIMS 

LTE 資料連線 ------------> AT: EDRBSTATE 

[channel 14]

 一般是跟 channel10 一起產生,modem 小區訊息變化,會記錄小區的資訊到 nvram.

---------------------  作者:zhangbijun1230  來源:CSDN  原文:https://blog.csdn.net/zhangbijun1230/article/details/79832115  版權宣告:本文為博主原創文章,轉載請附上博文連結!