获取设备树中的gpio信息,存储到led_table数组
时间: 2023-06-11 13:06:18 浏览: 93
假设你的设备树中有以下节点表示 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 表示成功。
阅读全文