日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Thermal engine 解析

發布時間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。