溫控daemon(四)載入配置檔案

2021-08-20 11:35:08 字數 4544 閱讀 3358

這篇部落格我們主要分析thermal-engine中如何載入配置檔案,包括**中和配置檔案。這裡主要分析下thermal和ss演算法的配置。

載入配置,在main函式中主要涉及如下**。

init_settings(&thermal_settings);

pid_init_data(&thermal_settings);//pid演算法我們平台disable後續分析

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);//後續分析

virtual_sensors_init(&thermal_settings, config_file);//這裡主要是通過settings_info中的type為virtual的,建立virtual sensor

# ifdef enable_old_parser

load_config(&thermal_settings, config_file);//不涉及

# else

load_config(&thermal_settings, config_file, load_all_flag);//載入配置檔案

# endif

init_settings函式主要是做下初始化。

void init_settings(struct thermal_setting_t *settings)

thermal_monitor_init_data函式**如下,主要是根據平台的型別載入**中的thermal演算法的配置。

void thermal_monitor_init_data(struct thermal_setting_t *setting)

else

break;

}break;

......

default:

msg("%s: uknown bear family device", __func__);

break;

} for (i = 0; i < arr_size; i++)

}

我們先來看下therm_get_msm_id函式,先是從/sys/devices/soc0/soc_id或者/sys/devices/system/soc/soc0/id節點中讀取soc_id,然後再從msm_soc_table中找到msm_id

enum therm_msm_id therm_get_msm_id(void)

for (idx = 0; idx < array_size(msm_soc_table); idx++)

} if (!msm_id)

msg("unknown target identified with soc id %d\n", soc_id);

msm_id_init = 1;

} return msm_id;

}

soc_id為如下

msm_soc_table表如下,soc_id是245對應的msm_id是8909

static struct therm_msm_soc_type msm_soc_table = ,

......

,

therm_get_pmic_model讀取/sys/devices/soc0/pmic_model或者/sys/devices/system/soc/soc0/pmic_model節點的值為65549,然後通過pmic_type_table得到是therm_pmic_pm8909

enum therm_pmic_model therm_get_pmic_model(void)

; get_soc_info(buf, sysfs_pmic_model,

sysfs_pmic_model_deprecated);

pmic_id = atoi(buf);

for (idx = 0; idx < array_size(pmic_type_table); idx++)

} if (!pmic)

msg("unknown pmic identified with pmic id %d\n",

pmic_id);

pmic_id_init = 1;

} return pmic;

}

最後再通過therm_get_hw_platform_subtype函式得到平台型別,讀取/sys/devices/soc0/platform_subtype_id或者/sys/devices/system/soc/soc0/platform_subtype_id節點,這裡是是1,因此最後cfg = tm_cfgs_8909

enum therm_hw_platform_subtype therm_get_hw_platform_subtype(void)

return subtype;

}

我們來看下tm_cfgs_8909,這裡列了部分典型的後面我們再溫度到達條件再結合配置一起看。

static struct setting_info tm_cfgs_8909 =

, }

},}, ......

, .actions[1] = ,

.actions[2] = ,

.actions[3] = ,

.actions[4] = ,

.actions[5] = ,

.actions[6] = ,

},.t[1] = ,

.actions[1] = ,

.actions[2] = ,

.actions[3] = ,

.actions[4] = ,

.actions[5] = ,

.actions[6] = ,}},

},};

下面我們來看ss演算法,ss_init_data函式如下

case therm_msm_8909:

switch (therm_get_hw_platform()) else

break;

default:

cfg = ss_cfgs_8909;

arr_size = array_size(ss_cfgs_8909);

break;

}break;

therm_get_hw_platform是獲取/sys/devices/soc0/hw_platform或者/sys/devices/system/soc/soc0/hw_platform節點這裡mtp,最後是cfg=  s_cfgs_8909。

enum therm_hw_platform therm_get_hw_platform(void)

} hw_platform_init = 1;

} return platform;

}

我們來看下ss演算法,後續結合溫度一起分析。

static struct setting_info ss_cfgs_8909 =

, },

, },

, },

, },

};

load_config函式是載入配置,主要載入各個sensor、device、和檔案中的演算法配置。

int load_config(struct thermal_setting_t *settings, const char *pfname, int flag)

if (load_sensors() || load_devices() || load_fields())

parse_file(settings, flag);//解析演算法配置檔案

validate_config(settings);// 驗證配置檔案是否有效

error_handler:

if (sensor_info_arr)

free(sensor_info_arr);

if (device_info_arr)

free(device_info_arr);

if (configfile)

fclose(configfile);

if (fields)

free(fields);

fields = null;

sensor_info_arr = null;

device_info_arr = null;

configfile = null;

return ret_val;

}

載入配置檔案

1.載入配置檔案 建立properties物件 properties pro newproperties 載入配置檔案,轉為乙個集合 classloader classloader reflecttest.class getclassloader 獲取類載入器 inputstream resourc...

Spring配置檔案載入外部配置檔案

有時,應用程式可能需要從不同的位置 例如 檔案系統 classpath或者url 讀取外部資源 例如 文字檔案 xml檔案 屬性檔案或或者影象檔案 通常,為了從不同位置載入資源,需要和不同的api打交道。spring的資源載入器提供了乙個統一的getresource 方法,使用這個方法可以通過資源路...

Python載入配置檔案

l 1.json 載入config.json檔案為無序字典base path sys.path 0 config path os.path.join base path,devices config defget ip type key with open config path config.js...