设备树中根据node获取label
时间: 2023-09-01 20:10:18 浏览: 148
在设备树中,每个节点都有一个唯一的名称(node name)和一个可选的标签(label)。要获取节点的标签,可以使用如下代码:
```
#include <linux/of.h>
struct device_node *node;
const char *label;
/* 获取节点 */
node = of_find_node_by_name(NULL, "node_name");
/* 获取标签 */
label = of_get_property(node, "label", NULL);
```
其中,`of_find_node_by_name`函数用于获取指定名称的节点,第一个参数为节点的父节点,如果为`NULL`则表示从根节点开始查找;第二个参数为要查找的节点名称。
`of_get_property`函数用于获取节点的属性值,第一个参数为要获取属性的节点,第二个参数为属性的名称,第三个参数为属性值的长度指针,可以为`NULL`。如果属性不存在,则返回`NULL`。
相关问题
获取设备树中的gpio信息,存储到led_table数组
假设你的设备树中有以下节点表示 GPIO:
```
gpio {
compatible = "gpio-leds";
led1 {
label = "LED1";
gpios = <&gpio0 0>;
};
led2 {
label = "LED2";
gpios = <&gpio0 1>;
};
};
```
你可以在驱动程序中使用 `of_find_node_by_name` 函数和 `of_property_read_u32` 函数来获取这些 GPIO 的信息,并存储到 `led_table` 数组中。以下是示例代码:
```c
#include <linux/of.h>
#include <linux/of_gpio.h>
#define MAX_LEDS 2
struct led_info {
char label[32];
unsigned int gpio;
};
struct led_info led_table[MAX_LEDS];
int led_probe(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.of_node;
struct device_node *child;
int num_leds = 0;
for_each_child_of_node(np, child) {
if (of_node_name_eq(child, "led1") && num_leds < MAX_LEDS) {
if (of_property_read_string(child, "label", led_table[num_leds].label) < 0) {
dev_err(&pdev->dev, "failed to read label property\n");
return -EINVAL;
}
if (of_property_read_u32(child, "gpios", &led_table[num_leds].gpio) < 0) {
dev_err(&pdev->dev, "failed to read gpios property\n");
return -EINVAL;
}
num_leds++;
}
if (of_node_name_eq(child, "led2") && num_leds < MAX_LEDS) {
if (of_property_read_string(child, "label", led_table[num_leds].label) < 0) {
dev_err(&pdev->dev, "failed to read label property\n");
return -EINVAL;
}
if (of_property_read_u32(child, "gpios", &led_table[num_leds].gpio) < 0) {
dev_err(&pdev->dev, "failed to read gpios property\n");
return -EINVAL;
}
num_leds++;
}
}
return 0;
}
```
在以上示例代码中,我们使用 `of_find_node_by_name` 函数和 `for_each_child_of_node` 宏遍历了 `gpio` 节点的所有子节点,然后使用 `of_node_name_eq` 函数判断子节点的名称是否为 `led1` 或 `led2`。如果是,则使用 `of_property_read_string` 和 `of_property_read_u32` 函数分别读取 `label` 和 `gpios` 属性,并将它们存储到 `led_table` 数组中。最后返回 0 表示成功。
设备树获取节点的节点标签
在设备树中,每个节点都有一个唯一的节点标签(node label),用于标识该节点。在驱动程序中,我们可以通过设备树 API 获取节点的节点标签,具体方法如下:
1. 在驱动程序中包含设备树头文件 `#include <linux/of.h>`。
2. 在 `probe()` 函数中使用 `of_find_node_by_name()` 函数查找需要的节点,该函数接受一个参数,即要查找的节点的节点标签。例如,如果要查找名为 "my_node" 的节点,可以使用以下代码:
```
struct device_node *node;
node = of_find_node_by_name(NULL, "my_node");
if (!node) {
pr_err("Failed to find node\n");
return -ENODEV;
}
```
这将返回名为 "my_node" 的节点的指针,如果找不到该节点,则返回 `NULL`。
3. 一旦找到了节点,可以使用 `of_node_name()` 函数获取该节点的节点标签,例如:
```
const char *node_name;
node_name = of_node_name(node);
pr_info("Node name is %s\n", node_name);
```
这将打印出 "Node name is my_node"。
注意,节点标签必须是唯一的。如果设备树中有多个节点具有相同的节点标签,`of_find_node_by_name()` 函数将只返回第一个匹配的节点。
阅读全文
相关推荐

















