Thermal engine 解析
本文所在的平臺是安卓10
thermal engine是高通做的一個溫度管理守護進程。在4.9后thermal?engine不再被維護,推薦用于調試。從ktm+thermal?engine?變成?thermal?core來監控溫度。可是市面上還是有很多手機繼續沿用thermal?engine去控制溫度,而thermal?core用于保守控制。可是,仍然有很多手機會繼續使用thermal?engine作為過溫保護的工具。
目錄
本文所在的平臺是安卓10
一.thermal engine?框架
二. sensor?初始化
三. device初始化
四.?thermal_settings配置
五.?持續監控
最后,希望可以幫到大家,如果有用的就收藏一下,白嫖的就點個贊。
一.thermal engine?框架
?
sensor:傳感器,獲取溫度。
device:設備,一些調頻的設備。比如當cpu?sensor檢測到溫度過高時,會調用cpu?device降頻操作。通常就是對cpu的設備節點進行操作。(或者cpu?的cooling?device)。
thermal_setting:控溫的配置,根據soc型號獲取,或者從thermal-engine.conf獲取。如今,更多選擇后者。作用是配置溫控策略。記錄溫度閾值等。
算法:ss算法,pid算法,monitor等。
源碼位置:/vendor/qcom/proprietary/thermal-engine
二. sensor?初始化
.... sensors_init(minimum_mode);/*傳感器初始化*/ ...?如果還是ktm + thermal?engine管理模式(老kernel)會在init_sensor_alias添加好sensor。
int sensors_init(int minimum_mode) {int ret_val = 0;min_mode = minimum_mode; #ifdef ENABLE_BW_SENSORstruct sensor_info *bw_sensor_list = NULL; #endif /* ENABLE_BW_SENSOR */if (!min_mode)modem_ts_qmi_init();//ktm+thermal engine管理模式則進入init_sensor_aliasinit_sensor_alias(); parse_thermal_zones();...... }進入parse_thermal_zones
static void parse_thermal_zones(void) {DIR *tdir = NULL;struct dirent *tdirent = NULL;char name[MAX_PATH] = {0};char cwd[MAX_PATH] = {0};int cnt = 0, ret = 0;if (!getcwd(cwd, sizeof(cwd)))return;if (sensor_cnt <= 0){//如果沒有ktm,進入init_space_sensors進行注冊sensorreturn init_user_space_sensors();}ret = chdir(THERMAL_SYSFS); /* Change dir to read the entries. Doesnt workotherwise */tdir = opendir(THERMAL_SYSFS);if (!tdir || ret) {msg("%s: Unable to open %s\n", __func__, THERMAL_SYSFS);return;}while ((tdirent = readdir(tdir))) {char buf[MAX_PATH];//獲取每個sensor的數據。 ......獲取sensor的路徑:/sys/devices/virtual/thermal/
到這里為止,就知道能監聽的sensor是在哪里。那么,配置thermal-engine.conf有哪些sensor就是從這里選取了。
最后,每個sensor會創建個線程進行持續監控溫度:
pthread_create(&(sensor_mgr->monitor_thread), NULL,sensor_monitor, sensor_mgr);?
三. device初始化
設備初始化,通常就是通過修改設備節點來進行設備管控,保護有cpu,gpu,電池,背光等。
注冊一個動作與設備相關聯。比如thermal-engine.conf里面action里cpu的動作,就會與cpu設備節點關聯。
... devices_init(minimum_mode); ...?各種各樣的設備進行初始化。
cooling?devices屬于thermal?core的降頻方法,也可以操作cooling?devices。
可注冊分為:普通設備,cooling devices ,熱拔插
int devices_init(int minimum_mode) {int ret_val = 0;min_mode = minimum_mode;gpufreq_init();cpufreq_init();clusterfreq_init();thermal_ioctl_init();......./* Functions to execute post devices added to device manager */hotplug_init();vdd_dig_sw_mode_init();vdd_rstr_init();opt_curr_req_init();profile_switch_init();cpr_band_init();lcd_device_init();battery_mitigation_init();/* Add all other kernel cooling devices */cooling_devices_init();return ret_val; }普通設備注冊:
static struct tmd_generic_dev_info_t gen_dev_list[] = {{.name = "wlan",.num_of_lvls = MAX_WLAN_MITIGATION_LEVEL + 1,.action = wlan_action,},{.name = "profile_switch",.num_of_lvls = MAX_PROFILE_LEVEL + 1,.action = profile_switch_action,.min_lvl = PERF_DEFAULT_PROFILE,},{.name = BATTERY_DEV_NAME,.num_of_lvls = MAX_BATTERY_MITIGATION_LEVEL + 1,.action = battery_action,}, .............熱拔插注冊:
static struct tmd_generic_dev_info_t hotplug_dev_list[] = {{.name = "hotplug_0",.num_of_lvls = 2,.action = hotplug_action,.data = (void *)0,},{.name = "hotplug_1",.num_of_lvls = 2,.action = hotplug_action,.data = (void *)1,},{.name = "hotplug_2",.num_of_lvls = 2,.action = hotplug_action,.data = (void *)2,}, ......cooling?device注冊:
static void init_cooling_device( struct devices_manager_dev *dev) {char cdev_name[DEVICES_MAX_NAME_LEN] = {0};char path[DEVICES_MAX_PATH] = {0};char freq_buf[DEVICES_MAX_PATH] = {0};int cpu_idx = 0;dev->dev_info.cooling_dev_id = -1;if (!strncmp(dev->dev_info.name, LCD_DEV_NAME,strlen(dev->dev_info.name))) {snprintf(cdev_name, sizeof(cdev_name),LCD_COOLING_DEV_NAME);dev->dev_info.cooling_dev_id = get_cdevn(cdev_name);} else if (!strncmp(dev->dev_info.name, BATTERY_DEV_NAME,strlen(dev->dev_info.name))) {snprintf(cdev_name, sizeof(cdev_name),BATTERY_COOLING_DEV_NAME);dev->dev_info.cooling_dev_id = get_cdevn(cdev_name);}...........四.?thermal_settings配置
配置分為兩種:一個是通過soc的id來尋找各個算法的配置,另一種就是讀取thermal-engine.conf里填寫的配置。
因為thermal engine已經在內核4.9后就不在維護了,那么新的芯片是沒有soc的配置的,那就我們就通過thermal-engine.conf進行配置了。
1.soc的id尋找配置
... pid_init_data(&thermal_settings); thermal_monitor_init_data(&thermal_settings); speaker_cal_init_data(&thermal_settings); ss_init_data(&thermal_settings); tb_init_data(&thermal_settings); virtual_sensors_init_data(&thermal_settings);2.讀取thermal-engine.conf
load_config(&thermal_settings, config_file, LOAD_ALL_FLAG);五.?持續監控
在thermal_settings配置完畢后,就會里面各個配置分到不同算法,并開啟各個算法的線程去持續管控好被分配的配置。
pid_algo_init(&thermal_settings);/*pid算法配置,并開啟線程監控*/ thermal_monitor(&thermal_settings);/*monitor算法配置,并開啟線程監控*/ ss_algo_init(&thermal_settings);/*ss算法配置,并開啟線程監控*/還有speaker_cal和step_wise算法。
比如:?
該配置的ss算法的,則在?ss_algo_init函數里,就會把該配置記錄到ss的一個表里面。在開啟ss算法的線程后,就會持續讀這個配置,看是否需要執行ss算法的動作。
最后,希望可以幫到大家,如果有用的就收藏一下,白嫖的就點個贊。
總結
以上是生活随笔為你收集整理的Thermal engine 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 有一分数序列:2/1,3/2,5/3..
- 下一篇: 【网络科学导论】【复杂网络】基础知识总结
