4,468
社区成员
发帖
与我相关
我的任务
分享在设备树中,有没有节点的名称带‘/’字符的,如果没有,以下内核源代码的623行是在判断什么?为什么要在这个加这个判断?
609 int __init of_scan_flat_dt(int (*it)(unsigned long node,
610 const char *uname, int depth,
611 void *data),
612 void *data)
613 {
614 const void *blob = initial_boot_params;
615 const char *pathp;
616 int offset, rc = 0, depth = -1;
617
618 for (offset = fdt_next_node(blob, -1, &depth);
619 offset >= 0 && depth >= 0 && !rc;
620 offset = fdt_next_node(blob, offset, &depth)) {
621
622 pathp = fdt_get_name(blob, offset, NULL);
623 if (*pathp == '/')
624 pathp = kbasename(pathp);
625 rc = it(offset, pathp, depth, data); //early_init_dt_scan_chosen() // data = boot_command_line
626 }
627 return rc;
628 }
device tree里的名字,跟文件系统中的路径是一个道理。
比如
/soc {
controllerA {
device1:device@1 {
prop x;
};
};
};
/soc/controllerA/device@1 {
prop y;
};
是说,从设备树根/开始,有个soc节点,该节点下又有一个controllerA节点,controllerA下又有一个device@1节点。
实际上,最终,device@1的真实名字是/soc/controllerA/device@1。
只是在controllerA这个节点中书写时,device1名字里不带/ ,表示相对路径,相对于controllerA的。
之后,在其它地方再想修改device@1的属性,需用到它的匿名(软链接),即device1,然后用 &device1 的方式表示这个device!@1。
但是,如果没有起匿名呢?
也可以用绝对路径,如上述代码中,直接使用/soc/controllerA/device@1,跟 &device1 是一回事。