Linux Thermal 框架解析

2021-08-20 20:55:15 字數 3391 閱讀 5317

linux thermal 是 linux 系統下溫度控制相關的模組,主要用來控制系統執行過程中晶元產生的熱量,使晶元溫度和裝置外殼溫度維持在乙個安全、舒適的範圍。

那下面我們就來一起看看對於溫度控制這樣乙個需求,linux 核心是怎麼實現的。

要實現乙個溫度控制的需求,試想一下我們是不是最少要有獲取溫度的裝置和控制溫度的裝置這兩個最基本的東西?當然附帶的也會產生一些使用溫度控制裝置的策略。

那上面這些東西在 linux thermal 框架中怎麼體現呢?通過閱讀原始碼我們發現**中對上面的東西進行了一些抽象。

thermal 框架

上面說到 thermal zone device 是獲取溫度裝置的抽象,怎麼抽象的?終究我們還是要 rtfsc。

struct thermal_zone_device ;

struct thermal_zone_device_ops ;

通過**我們可以看到,乙個能提供溫度的裝置操作函式主要有 : 繫結函式、獲取溫度函式、獲取觸發點溫度函式。

繫結函式 : thermal core 用來繫結用的 , 這個後面會講 ;

獲取溫度函式 : 獲取裝置溫度用的,這個也好理解 , 一般 soc 內部會有溫度感測器提供溫度,有些熱敏電阻通過 adc 也算出溫度,這個函式就是取這些溫度值 ;

獲取觸發點溫度函式 : 這個是什麼用來做什麼呢 ? 這個其實是 thermal 框架裡面乙個關鍵點,因為要控制溫度,那麼什麼時候控制就需要有東西來描述,

描述什麼時候控制的東西就是觸發點,每個 thermal zone device 會定義很多觸發點,那麼每個觸發點的溫度就是通過該函式獲得;

thermal cooling device 是可以降溫裝置的抽象,能降溫的裝置比如風扇,這些好理解,但是想 cpu,gpu 這些 cooling devices 怎麼理解呢?

其實降溫可以從兩方面來理解,乙個是加快散熱,另外乙個就是降低產熱量。風扇,散熱片這些是用來加快散熱,cpu,gpu 這些 cooling devices 是通過降低產熱來降溫。

那**是怎麼將這兩個方式統一起來呢?

struct thermal_cooling_device ;

struct thermal_cooling_device_ops ;

thermal cooling device 抽象的方式是,認為所有的能降溫的裝置有很多可以單獨控制的狀態。例如,風扇有不同的風速狀態,

cpu/gpu cooling device 有不同最大執行頻率狀態,這樣當溫度高了之後通過調整這些狀態來降低溫度;

thermal governor 是降溫策略的乙個抽象 , 主要是根據溫度來選擇 thermal cooling devices 等級的方法,舉個簡單的例子,當前的溫度公升高速很快,選擇風扇3檔風,溫度公升高不快,選擇1檔風。這就是乙個 governor。

/**

* struct thermal_governor - structure that holds thermal governor information

* @name: name of the governor

* @throttle: callback called for every trip point even if temperature is

* below the trip point temperature

* @governor_list: node in thermal_governor_list (in thermal_core.c)

*/struct thermal_governor ;

很簡單,所有的策略都通過 throttle 這個函式實現,核心已經實現了一些策略,step_wise, user_space, power_allocator, bang_bang 等具體實現演算法細節就不展開;

有了獲取溫度的裝置,有了溫控控制的裝置,有了控制方法,thermal core 就負責把這些整合在一起。下面看一下整合的簡單流程。

1.註冊函式 ,thermal core 通過對外提供註冊的介面,讓 thermal zone device、thermal cooling device、thermal governor 註冊進來。

struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,

void *, struct thermal_zone_device_ops *,

const struct thermal_zone_params *, int, int);

struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,

const struct thermal_cooling_device_ops *);

int thermal_register_governor(struct thermal_governor *);

2.thermal zone/cooling device 註冊的過程中 thermal core 會呼叫繫結函式,繫結的過程最主要是乙個 cooling device 繫結到乙個 thremal_zone 的觸發點上

int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz)

if (!result)

...return result;

}

3.thermal core 使能 delayed_work 迴圈處理 , 使整個 thermal 控制流程運轉起來。

thermal 控制流程

當溫度公升高超過溫度觸發點的話,就會使能對應的 cooling device 進行降溫處理,至此 linux thermal 相關的一些基本框架就介紹完了。

關於XUtils框架細解

感謝關注xuitls的最近一段時間給予的熱心反饋,xutils近期做了很多細節優化之後,功能和api已經穩定。1.9.6主要更新內容 bitmap載入動畫有時重複出現的問題修復,載入過程優化 http模組requestcallback等優化。詳細更新記錄見 commits master xutils...

自然框架 之「解耦」初探

解耦,在以前確實做不到,但是周四和 橫刀天笑 聊了之後,發現解耦是可以實現的。其實很簡單,只要弄出來乙個 實體類 就可以搞定了。如果是簡單的情況,那麼就讓表單控制項 全權負責 了,這時候是不需要些什麼 的,點點滑鼠,打幾個字就可以了。如果是有複雜的業務邏輯,那麼就可以定義乙個實體類,然後讓表單控制項...

仿掘金框架之listview全解(二)

我先把昨天那篇 仿掘金框架之listview全解 一 中提到的,我們可以通過這個專案練習到的知識點再列舉一下 續 仿掘金框架之listview全解 一 思路 在listview的觸控事件當中,我們判斷手觸控滑動大於一定的正值或者小於一定的負值,我們分別對應進行頭尾bar的隱藏和顯示的屬性動畫!ste...