1、查找喚醒源
<7>[ 129.680310] -(0)[913:system_server][name:mt_sleep&][SLP] @@@Chip_pm_enter@@@
<4>[ 129.680310] -(0)[913:system_server][name:mt_spm_internal&][SPM] wake up .........................
<7>[ 129.690364] .(0)[913:system_server][name:mt_sleep&][SLP] @@@Chip_pm_finish@@@
產生EINT的channel會記錄在EINT_STA狀態暫存器里面,這一點所有平臺都一樣;只要知道這個狀態暫存器的值就可以知道哪個channel發生了中斷;但是不同平臺的log細節會有些不同,
--->89/72/82在wakeup時,如果喚醒源是EINT,會主動列印出EINT_STA的值
--->77默認不會列印這個暫存器,需要先開啟EINT_DEBUG這個宏,才能看到EINT_STA的值
kernel log分析:
【step1 - 從kernel log中找到EINT channel id】
MT6577
[Power/Sleep] wake up by EINT (0x20)(0x4)(180689) (* 這里0x20是EINT wakesrc id,0x4是sleep ISR暫存器狀態,都不是channel id!)
EINT Module - EINT_STA = 0x400,--->bit[n] =1, channel id 就等于n
MT6589/MT6582
[SPM] wake up by EINT (0x20)(0x20)(370340)
EINT_STA:
3 --->這個值就是EINT channel id,不需要轉換
MT6572
[PCM WAKEUP NORMAL]CPU WAKE UP BY: EINT :0x10000 --->bit[n] =1, channel id 就等于n
【step2 - 過濾PMIC觸發的EINT喚醒】
pwrkey/charger/usb/這些事件發生時會有EINT產生,走的都是PMIC的EINT channel;并且89/72平臺上,rtc(比如第三方APK造成的喚醒)和其他一些中斷也會走PMIC的EINT;因此要先把PMIC EINT過濾掉,不需要去關注這個channel上的喚醒(當然rtc喚醒的話還是要分析的,只不過并不是去分析EINT喚醒源了),所幸PMIC的EINT channel id是固定的,不能修改,所以可以直接看channel id來過濾,各平臺的PMIC EINT channel如下:
MT6577 9 (EINT_STA=0x400)
MT6589 3 (EINT_STA=3)
MT6572 16(EINT_STA=0x10000)
MT6582 25(EINT_STA=25)
【step3 -從cust_eint.h中找到觸發EINT的模塊】
CUST_EINT_XXX_NUM 對應的值就是XXX模塊的EINT channel id,
如果在這個檔案中沒有找到造成喚醒的channel id的定義,說明可能沒有用DCT Tool去配置EINT,而是直接寫死在代碼里,那就嘗試搜索所有呼叫mt65xx_eint_registration的代碼,看有沒有注冊這個channel id的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/166734.html
標籤:其他
上一篇:C/C++編程筆記:給windows虛擬機裝個windows作業系統,正確教程
下一篇:Linux系統編程—管道
