我们在使用linux设备树的时候,难免对一些接口函数感觉到困惑,甚至,好多接口函数不知道如何使用,只知道大概函数有哪些接口,但真正使用的时候漏洞百出,很容易出错。接下来我就以我开发imx6ull这块开发板的经验来说一说我对OF函数的理解,会对你的困惑有一定的帮助。
1.inline struct device_node *of_find_node_by_path(const char *path);
这个函数,我们经常通过设备树中根节点下的子节点名字路径来获取它的节点
一般这个函数只能查找根节点下的字节点,再往深一级的子节点查询不好使,比如下图,这是我自己创建的一个示例型设备树,这个设备树中,gpio_key1处于根节点(/gpio_key1)下,但是他的下边有很多分开的子节点,我们怎么查找呢,如下图,我们可以看到一个gpio_key1里边,有四个key子节点,我们如何分开得到这四个节点的节点信息呢?接着往下看:
2.struct device_node *of_get_next_child(const struct device_node *node struct
如果想查询下列四个按键的·节点中任意一个节点,我们就要使用of_get_next_child这个函数,他是用来查询节点的字节点,也可以查找子节点下的第N个子节点,这里比较绕,我们直接上代码这样比较好理解一些:
struct device_node *test_device_node;
struct device_node *test_device_node_child;
test_device_node = of_find_node_by_path("/gpio_key1");
test_device_node_child=of_get_next_child(test_device_node,NULL);
for(int i=0;i<4;i++)
{
test_device_node_child=of_get_next_child(test_device_node,test_device_node_child);
}
test_device_node=test_device_node_child;
printk("test_device_node name is %s\n", test_device_node->name);
我们来看,首先我声明了两个设备节点结构体指针变量,首先我通过of_find_node_by_path,这个函数来找到根节点下的gpio_key这个子节点,但是我们没有办法继续往下得到key@1---key@4子节点中的一些信息,我们上网搜索基本也没有教我们怎么查找子节点中的一些节点,特别是一些技术类文档并没有很详细的说明这个子节点中的子节点的信息如何调用。
我们继续耐心往下看,我这里使用了of_get_next_child这个函数,第一个函数传参把gpio_key1的设备节点传入,第二个函数传参一个NULL,这里我们没有什么好奇的,就是得到了gpio_key1的设备节点下的