在OpenHarmony 5.0上发现hdc工具用不了,参考openharmony 关于5.0release hdc不可用问题_HDC_hahahah-Laval社区,根据相关日志找到对应源码,由于系统参数const.security.developermode.state不为true,从而hdcd服务未启动

img

// 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目录下,确实有对该参数进行一些判断处理

img

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_modebuildvariant来得到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社区合入相关内核代码

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐