Menu Close

设备树中用于查找节点的 of 操作函数

此文章介绍并列出了可以用于查找节点的 of 函数。

相关参考文章:SOC 教学教案

 

设备树提供关于设备的详细信息,其可以采用各种形式,例如数字和字符串。在写驱动时,这些信息需要被提取出来。作为例子,当设备树使用 reg 属性把一个外设寄存器的地址设为 0x12345678 且把长度设为 0x100 后,我们写驱动时需要知道 reg 属性的 0x12345678 以及 0x100 数值才能初始化外设。因此 Linux 应用一系列以 “of_” 开头的函数来提取设备树节点和属性信息。这些函数都定义在 include/linux/of.h 目录下。

设备以节点的方式挂载在设备树上,因此为了获取设备的属性信息必须先获取设备节点。Linux 内核使用 include/linux/of.h 中 49 行至 69 行中定义的 device_node 结构体系描述节点。

struct device_node{
        const char *name;                     // Name of node
        const char *type;                     // Device type
        phandle phandle;
        const char *full_name;                // Full name of node
        struct fwnode_handle fwnode;

        struct property *properties;          // Properties
        struct property *deadprops;           // Removed property
        struct device_node *parent;           // Parent node
        struct device_node *child;            // Child node
        struct device_node *sibling;
        struct kobject kobj;
        unsigned long _flags;
        void *data;

#if defined(CONFIG_SPARC)
        const char *path_component_name;
        unsigned int unique_id;
        struct of_irq_controller *irq_trans;
#endif
};

总共有5个函数,其中每个都会在找到节点后返回该节点,不然将返回NULL。

 

of_find_node_by_name

这个函数通过节点名字搜寻相匹配的节点,格式如下:

struct device_node *of_find_node_by_name(struct device_node *from,
                                         const char         *name);

from 是搜索的起始节点。如果被设为 NULL,它将从根节点开始搜寻整个设备树。

name 是搜寻的节点的名字。

 

of_find_node_by_type

这个函数通过device_property属性搜寻指定的节点,格式如下:

struct device_node *of_find_node_by_type(struct device_node *from,
                                         const char         *type);

from 是搜索的起始节点。如果被设为 NULL,它将从根节点开始搜寻整个设备树。

type 是将搜寻的节点的 type 字符串,相等于 device_type 的属性值。如果设为 NULL,它将被忽略。

 

of_find_compatible_node

这个函数根据 device_type 和 compatible 属性搜索匹配的节点,格式如下。

struct device_node *of_find_compatible_node(struct device_node *from,
                                            const char         *type,
                                            const char   *compatible);

from 是搜索的起始节点。如果被设为 NULL,它将从根节点开始搜寻整个设备树。

type 是将搜寻的节点的 type 字符串,相等于 device_type 的属性值。如果设为 NULL,它将被忽略。

compatible 是与将搜寻的节点相应的属性列表。

 

of_find_matching_node_and_match

这个函数使用 of_device_id 匹配表搜寻指定的节点,格式如下:

struct device_node *of_find_matching_node_and_match(struct device_node *from,
                                          const struct of_device_id *matches,
                                          const struct of_device_id **match);

from 是搜索的起始节点。如果被设为 NULL,它将从根节点开始搜寻整个设备树。

matches 是将搜寻的 of_device_id 匹配表。

match 用于找到相对应的 of_device_id。

 

of_find_node_by_path

这个函数使用节点路径搜寻指定的节点,格式如下:

inline struct device_node *of_find_node_by_path(const char *path);

path 是全路径的节点的名字,其中可以使用 aliases 节点中定义的别名。

Posted in 教材与教案
0 0 投票数
Article Rating
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论

相关链接