源码解析OpenHarmony 5.0 hdc工具不可用问题
在OpenHarmony 5.0上发现hdc工具用不了,参考openharmony 关于5.0release hdc不可用问题_HDC_hahahah-Laval社区,根据相关日志找到对应源码,由于系统参数const.security.developermode.state
不为true,从而hdcd服务未启动
// developtools/hdc/src/daemon/main.cpp
int main(int argc, const char *argv[])
{
...
#ifndef UPDATER_MODE
string developerMode;
SystemDepend::GetDevItem("const.security.developermode.state", developerMode);
if (developerMode != "true") {
WRITE_LOG(LOG_FATAL, "non developer mode, hdcd does not start");
return -1;
}
#endif
...
}
通过文章中提到的方法修改drivers/peripheral/usb/cfg/init.usb.configfs.cfg
或者在.para
文件下添加const.security.developermode.state=true
以此手动设置该参数,可以解决该问题
但是drivers目录是公共的,3568上不需要修改也可以正常使用,在device、vendor等目录下也未见3568对该参数进行修改,所以可能是因为内核上有一些不同,有一些配置没有打开
通过查找const.security.developermode.state
该参数在源码中是否有进行一些处理
经过查找,在kernel目录下,确实有对该参数进行一些判断处理
在kernel/linux/common_modules/xpm/developer/dsmm_developer.c
文件中,会在/proc
下初始化创建dsmm
目录以及developer
文件
void dsmm_developer_proc_create(void)
{
g_dsmm_dir = proc_mkdir(DSMM_DIR, NULL);
if (!g_dsmm_dir) {
xpm_log_error("[%s] proc dir create failed", DSMM_DIR);
return;
}
if(!proc_create(DSMM_DEVELOPER_FILE, S_IRUGO, g_dsmm_dir,
&dsmm_proc_fops_developer)) {
xpm_log_error("[%s] proc file create failed",
DSMM_DEVELOPER_FILE);
}
}
并且动态根据CONFIG_DSMM_DEVELOPER_ENABLE
宏、developer_mode
和buildvariant
来得到developer_state的值
int get_developer_mode_state(void)
{
uint32_t variant, status;
if (developer_state != STATE_UNINT)
return developer_state;
#ifdef CONFIG_DSMM_DEVELOPER_ENABLE
if (get_build_variant(&variant) || get_developer_status(&status)) {
xpm_log_error("get build variant or developer status failed");
developer_state = STATE_OFF;
} else {
developer_state = g_state_table[variant][status];
}
#else
developer_state = STATE_ON;
#endif
return developer_state;
}
最后将const.security.developermode.state=true/false
写入到/proc/dsmm/developer
文件
static ssize_t dsmm_read_developer_proc(struct file *file, char __user *buf,
size_t count, loff_t *pos)
{
size_t len;
uint32_t state;
char proc_developer[PROC_DEVELOPER_LEN] = {0};
state = get_developer_mode_state();
len = snprintf(proc_developer, PROC_DEVELOPER_LEN - 1,
DSMM_DEVELOPER_PARAM_NAME"=%s",
state == STATE_ON ? "true" : "false");
return simple_read_from_buffer(buf, count, pos, proc_developer, len);
}
在base/startup/init/services/init/standard/init.c
根据/proc/dsmm/developer
的值对系统参数进行初始化
static void InitLoadParamFiles(void)
{
if (InUpdaterMode() != 0) {
LoadDefaultParams("/etc/param/ohos_const", LOAD_PARAM_NORMAL);
LoadDefaultParams("/etc/param", LOAD_PARAM_ONLY_ADD);
LoadDefaultParams("/vendor/etc/param", LOAD_PARAM_ONLY_ADD);
return;
}
// Load developer mode param
LoadDefaultParams("/proc/dsmm/developer", LOAD_PARAM_NORMAL);
// Load const params, these can't be override!
LoadDefaultParams("/system/etc/param/ohos_const", LOAD_PARAM_NORMAL);
CfgFiles *files = GetCfgFiles("etc/param");
for (int i = MAX_CFG_POLICY_DIRS_CNT - 1; files && i >= 0; i--) {
if (files->paths[i]) {
LoadDefaultParams(files->paths[i], LOAD_PARAM_ONLY_ADD);
}
}
FreeCfgFiles(files);
}
综上所述,是由于缺少XPM模块或未打开相关XPM内核配置,可参考OH4.1Release运行HOS应用适配方案_Ljin-Laval社区合入相关内核代码
更多推荐
所有评论(0)