MTK 驅動開發(36)---低功耗基礎知識
1、sleep /suspend
suspend確切的說是MCU(ARM )的suspend,也就是cpu進入Wait for interrupt狀態(WFI);因為對整個系統來說,CPU進WFI是整個系統睡眠的先決條件,debug也是從CPU是否進入WFI開始.
從Linux的角度來說,CPU進入suspend就是SW完全不跑了,停在suspend workqueue裡面
從滅屏到CPU進入suspend的大體流程框架如下:
相關code路徑:
/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
/frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp
/system/core/libsuspend/
/kernel-3.18/kernel/power/
2. SPM
SPM以及時鐘請求訊號控制流程
因為整個系統不只是AP(MCU),還包括modem、connectivity等子系統;
CPU進入WFI後,整個系統就依靠一顆SCP:SPM來控制睡眠/喚醒的流程,它會去關注各個子系統的狀態
SPM =System Power Manager,
它掌控著cpu suspend之後系統是否能掉到最小電流的關鍵邏輯,你可以把它理解成一個投票機制,當系統的關鍵資源(memory、clock)沒有任何人使用的時候,它就會讓系統進入一個真正的深睡狀態(最小電流)只要它檢測到有任何資源請求還沒釋放,系統就無法降到底電
所以在底電問題上的debug流程中,不僅僅要看cpu有沒有suspend成功,還要看SPM的狀態是否正確
SPM裡面有一個可程式設計控制器PCM(Programmable Command Master)
CPU在進去WFI之前會把SPM的firmware寫入PCM,然後PCM就依據firmware的邏輯來控制SPM的工作
跟SPM強相關的一個東西就是系統中的時鐘請求訊號,也就是26M時鐘開關的控制邏輯;因為系統工作在最小電流的時候,SPM只依靠32K時鐘工作;因此要判斷系統是不是已經到深睡狀態,就要看26M有沒有關閉。
26M時鐘的控制邏輯概要如下圖
所以從上圖我們就可以看到, 26M有沒有關,就只要看SCLKENA
程式碼路徑:
/kernel-3.18/drivers/misc/mediatek/base/power/spm_vx/
3、Deep idle
基本概念
首先顧名思義,這是一種CPU進入空閒後的狀態,也就是在idle程序中執行的
簡單地說,Mediatek會在CPU進入空閒的情況下,再去關閉一些不必要的power domain,以達到最省電的目的,因為CPU空閒的時候,其實系統中有不少的domain也是不需要執行的,不這樣做的話,就僅僅是CPU這塊的電省下來 ,達不到省電的目的。
Mediatek的做法是在CPU在進入idle程序後,會去判斷當前系統的狀態是否滿足進入更省電狀態的條件,首先就會檢查是否能進入deep idle,因為dpidle最省電
系統進入deep idle需要滿足的條件是
單核(BY_CPU)
預設的能block deep idle的所有clock都已經關閉(BY_CLOCK)
CPU在2ms內沒有從idle task排程出去的需求(BY_TMR)
BY_VTG / BY_OTH的case很少(BY_OTH在個別平臺跟TEE(SPI指紋模組)有關)
我們可以從波形上檢查系統是否進入deep idle
下圖中電流的底部就是deep idle的狀態,在MP3播放的狀態大約20mA;
如果沒有進deep idle,這個底部會被擡高
deep idle也是由SPM來控制它的執行邏輯,跟suspend一樣, CPU在進去WFI之前會把SPM的firmware寫入PCM,這個firmware跟suspend是完全不一樣的。
4 背景知識---SODI
SODI跟deep idle類似,是SPM的另外一種工作模式
SODI:Screen On Deep Idle
SODI的進入條件跟deep idle是類似的,區別只是要檢查的clock跟deep idle不完全一樣 ,SODI對display功耗的影響相對於CMD / VDO mode是不一樣的
前面講過了CMD / VDO的差別,其實就很容易理解這一點:因為CMD mode下,CPU不用送資料出去,因此MIPI clock可以不用送,這整條clock路徑上的東西(PLL/clock)都可以關閉,而且memory跟VDO相比也可以做更多省電的action;所以SODI對CMD mode的省電效果會比VDO的效果更明顯
是否進入SODI也可以從波形上明顯地看到:
下圖示SODI enable/disable的idle mode波形比較
CMD mode:SODI on(左) vs SODI off(右)
VDO mode:SODI on(左) vs SODI off(右)
*重點關注波形的形狀,電流下降的數值不同平臺不一樣