如何读取Device Tree节点的label?替代full_name返回的节点名
问题解答
你遇到的情况是因为struct device_node->full_name存储的是设备树节点的名字字段(即冒号:之后的pid@43c00000部分),而冒号前的pid_0是节点的标签(label)——这个标签是DTS中用来跨节点引用的符号,编译成DTB后,内核不会将其保留在device_node结构体里,所以直接通过full_name读不到。
读取标签的可行方法
方法1:在设备树节点中添加自定义label属性
这是最直接的解决方案,不需要修改节点名,只需在每个pid节点里添加一个自定义属性来存储你需要的标识,比如:pid_0: pid@43c00000 { label = "pid_0"; // 添加自定义label属性 clock-names = "s00_axi_aclk"; clocks = <&clkc 15>; compatible = "xlnx,pid-1.0"; reg = <0x43c00000 0x10000>; // 其他原有属性... };然后在驱动代码中使用内核提供的函数读取这个属性:
const char *label_str; if (!of_property_read_string(np, "label", &label_str)) { // 成功读取到label_str,值为"pid_0" }方法2:通过节点的reg属性或唯一标识区分
如果不想修改设备树,可以通过节点的reg地址(比如0x43c00000对应pid_0,0x43c10000对应pid_1)做映射区分,但这种方式灵活性不如方法1。
关于修改节点名的疑问
不需要将节点名改成pid0@43c00000,这样只是把节点的名字字段改成了pid0,依然无法直接获取到pid_0这个标识,完全没必要做这种修改。
内容的提问来源于stack exchange,提问作者mjkpolo
相关产品推荐
相关产品推荐

