1. 程式人生 > >MTK 驅動開發(36)---低功耗基礎知識

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

這個訊號有沒有關閉;而SPM對這個訊號的輸出以及子系統的訊號輸入,都會記錄在SPM的暫存器裡面,這個就是我們通過log排查的依據

 程式碼路徑:

/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是完全不一樣的。

背景知識---SODI

SODI跟deep idle類似,是SPM的另外一種工作模式

SODI:Screen ODeep 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(右)

*重點關注波形的形狀,電流下降的數值不同平臺不一樣