1. 程式人生 > >EC修煉之道—Thermal

EC修煉之道—Thermal

重啟,藍屏,關機,休眠,一系列災難性的錯誤均有可能是溫度過高引起。即使是行業的領頭羊,也經常性地栽倒在這個問題上。雖說這個問題應該是Thermal工程師應該考慮的問題,但作為可以控制風扇和可以通知HOST端的EC工程師來說,也應該瞭解Thermal的一些細節,以期能夠快速準確的想出解問題的思路。

1 CPU溫度

想要控制風扇,首先要知道當前溫度。一般來說,板子上當屬CPU溫度最高,但是也有二般的情況,要依據Thermal工程師的實測來決定。EC通常可以獲得CPU溫度,環境溫度和獨顯溫度(PCH和記憶體也可獲取,)。EC要取三者中的溫度最高者,作為控制風扇轉速的依據。

1.1 SMBUS方式

溫度一般都是通過SMBUS獲取,讀取時要遵守SMBUS規範。業界EC廠商一般都會請軟體VENDOR幫他們開發basecode,然後OEM廠商直接使用base code留出的介面來作溫度讀取的功能。這些介面通常都是使用一個數組來完成。

{0, 0x98, SMB_READ_BYTE, 0x01, (BYTE *)&Therm_Info.TempCPU}

這是陣列中的一項,其結構體型別為:

typedef volatile struct _OEMSMB_DESCRIPTOR

{

   BYTE Chnl;              /* SMBusChannel. */

   BYTE ADDR;              /* SlaveAddress. */

   BYTE PRTCL;             /*protocol. */

   BYTE DevCmd;            /* DeviceCommand. */

   BYTE *pntr;          /* SMBusBuffer Pointer. */

} OEMSMB_DESCRIPTOR;

從其定義,我們可以看出上述陣列中的那個元素,其含義為:要以一個BYTE的方式讀取SMBUS0 Channel上,Slave Address為0x98,偏移(Command)為0x01的值,讀取成功後,賦值給Therm_Info.TempCPU變數。

         這種設計很巧妙:一方面,它將底層的細節封裝,大大方便了OEM EC工程師的開發;另一方面,他將程式功能細化,該段程式碼只讀CPU溫度,不牽涉風扇控制或其它一些功能。這樣如果出錯,只需要改動這個陣列元素即可。

         有很多初學EC的人,都想搞懂ECSMBUS讀取裝置的整個細節,但往往事與願違。如果有人對我說,他看懂EC SMBUS程式碼了,我就會說,我不懂這塊,你給我講講吧,結果他講的基本都會錯。個人認為,這個SMBUS和PS2功能是整個EC最難懂的地方。我不建議搞懂這塊,因為真沒啥用,只需要知道介面就可以。更不建議心血來潮換程式碼的KERNEL,因為自己寫的程式碼沒有經過嚴格的測試,並不健壯。

         雖然不需要搞懂整個ECSMBUS程式碼,但瞭解一下協議還是有必要的。網上有SMBUS2.0 SPEC,可以檢視一下。遇見問題,可以以此為依據進行除錯。

1.2 PECI方式

         PECI是INTEL釋出的繼SMBUS過後,又一個可以獲取溫度的單線制協議,這既可以傳輸資料,也可以接收資料。PECI真是神一般的東西,讓EC可以直接操縱CPU的MSR暫存器。但EC使用最多的還是讀CPU溫度。

         讀CPU溫度所用CommandFormat為:

將上述第一排Command Format的值寫入相應暫存器,然後Check狀態暫存器,如果其完成標誌位置1,我們就可以通過資料暫存器將byte 5,6讀出,然後轉換單位後,就成了溫度值。

2 降溫

2.1 風扇控制

         給平臺降溫,最直接的方式是使用風扇將熱量導到機構外部。風扇的速度控制以及轉速偵測都交由EC來處理。EC使用PWM(或者DAC)來控制風扇轉速。PWM引數有:PWM Frequency,PWM Cycle,PWM Duty Cycle。PWM Frequency要設定得足夠高,這樣可以保證風扇低速時抖動不厲害,但也不要產生刺耳的叫聲,要根據實際情況來調。

EC根據當前CPU溫度,設定風扇的佔空比,來調節風扇轉速。業界一般有兩種做法:設定固定佔空比和根據轉速調節佔空比。

2.1.1 設定固定佔空比

         根據CPU溫度範圍,設定一定級別,選擇恰當的滯回值,給該級別設定固定的CPU佔空比。當CPU溫度落到該區間內,就將PWM Duty Cycle賦上該級別的值。這樣做的缺點是:Thermal工程師設定值時,假定風扇永遠是新品,但世界萬物都逃不過歲月的侵蝕,風扇也有一天會老去,相應的佔空比也不會達到以前的轉速。這樣散熱效果會降低。最好,將最大級別的Duty Cycle設為100%,這樣即使有一天風扇老去,潛力仍然要被最大化壓榨。

2.1.2 根據轉速調節佔空比。

         在一定的溫度範圍內,設定一個固定的轉速,根據這個轉速,設定PWM佔空比,讓實際轉速和設定轉速慢慢靠近。這種調節比較精確。但準確就一定是好嗎?不一定。為了解決風扇個體間差異以及老化問題,這個固定的轉速也需要一定的轉速容差。只要在容差範圍內,都要做到可以接受。這種設定方法是在一點點地假定(改變一點佔空比,讀一下轉速值),勢必造成速度慢,如果升溫過快,轉速不能立即調上去,為了解決這個問題,只能讓其在一個較小的Timer中輪詢,這樣又會造成資源的大量佔有,會影響比Timer優先順序小的中斷。所以做的時候一定要權衡好速度,資源和容差。

2.2 CPU Throttling

         想讓CPU溫度降低,除了控制風扇轉速外,還可以降低CPU頻率,或者做Throttling動作。

         Throttling可以交給HOST端來做,也可以讓EC來做。EC偵測CPU溫度過高,就將ProcHot#拉低。CPU開始做Throttling動作,等到其溫度回到設定值以下,再將ProcHot#復原。這個動作比較簡單粗暴,但是效果很好,可以快速降溫。但是如果使用者在看高清視訊的話,會變得有點卡。