此文章介绍并列出了可以用于查找节点的 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 节点中定义的别名。