這篇部落格我們主要分析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...