DeviceTree 内核 API¶
核心函数¶
-
struct device_node *of_find_all_nodes(struct device_node *prev)¶
获取全局列表中的下一个节点
参数
struct device_node *prev前一个节点,若开始迭代则为 NULL;将对其调用
of_node_put()
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
bool of_machine_compatible_match(const char *const *compats)¶
针对 compatible 数组测试设备树的根节点
参数
const char *const *compats以 NULL 结尾的 compatible 字符串数组,用于在根节点的 compatible 属性中查找。
描述
如果根节点的 compatible 属性中包含任何给定的 compatible 值,则返回 true。
-
int of_machine_read_compatible(const char **compatible, unsigned int index)¶
获取该机器的 compatible 字符串
参数
const char **compatible存储 compatible 字符串地址的地址
unsigned int index列表中的 compatible 条目的索引
返回
成功时返回 0,失败时返回负错误码。
-
int of_machine_read_model(const char **model)¶
获取该机器的 model 字符串
参数
const char **model存储 model 字符串地址的地址
返回
成功时返回 0,失败时返回负错误码。
-
const struct of_device_id *of_machine_get_match(const struct of_device_id *matches)¶
针对 of_device_id 数组测试设备树的根节点
参数
const struct of_device_id *matches以 NULL 结尾的 of_device_id 匹配结构体数组,用于在其中进行搜索
描述
返回匹配的条目,若无则返回 NULL
-
const void *of_machine_get_match_data(const struct of_device_id *matches)¶
判断设备树根节点是否具有匹配的 of_match 结构
参数
const struct of_device_id *matches以 NULL 结尾的 of_device_id 匹配结构体数组,用于在其中进行搜索
描述
返回与匹配条目关联的数据,若无则返回 NULL
-
bool of_device_is_available(const struct device_node *device)¶
检查设备是否可用
参数
const struct device_node *device要检查可用性的节点
返回
如果 status 属性不存在,或者设置为 “okay” 或 “ok”,则返回 true,否则返回 false
-
bool of_device_is_big_endian(const struct device_node *device)¶
检查设备是否具有大端(BE)寄存器
参数
const struct device_node *device要检查字节序的节点
返回
如果设备具有 “big-endian” 属性,或者内核是针对大端(BE)编译的且设备具有 “native-endian” 属性,则返回 true。否则返回 false。
描述
如果
of_device_is_big_endian()== true,调用者名义上应使用 ioread32be/iowrite32be,否则使用 readl/writel。
-
struct device_node *of_get_parent(const struct device_node *node)¶
获取节点的父节点(如果有)
-
struct device_node *of_get_next_parent(struct device_node *node)¶
迭代到节点的父节点
参数
struct device_node *node要获取其父节点的节点
描述
这与 of_get_parent() 类似,不同之处在于它会减少所传入节点的引用计数,使其适用于迭代某个节点的所有父节点。
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
struct device_node *of_get_next_child(const struct device_node *node, struct device_node *prev)¶
迭代节点的子节点
参数
const struct device_node *node父节点
struct device_node *prev父节点的上一个子节点,或者传入 NULL 以获取第一个子节点
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。当 prev 是最后一个子节点时返回 NULL。递减 prev 的引用计数。
-
struct device_node *of_get_next_child_with_prefix(const struct device_node *node, struct device_node *prev, const char *prefix)¶
寻找下一个带前缀的子节点
参数
const struct device_node *node父节点
struct device_node *prev父节点的上一个子节点,或者传入 NULL 以获取第一个子节点
const char *prefix节点名称应具有的前缀
描述
该函数与 of_get_next_child() 类似,不同之处在于它会自动跳过名称不具有给定前缀的任何节点。
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
struct device_node *of_get_next_available_child(const struct device_node *node, struct device_node *prev)¶
寻找下一个可用的子节点
参数
const struct device_node *node父节点
struct device_node *prev父节点的上一个子节点,或者传入 NULL 以获取第一个子节点
描述
该函数与 of_get_next_child() 类似,不同之处在于它会自动跳过任何被禁用的节点(即 status = “disabled”)。
-
struct device_node *of_get_next_reserved_child(const struct device_node *node, struct device_node *prev)¶
寻找下一个保留的子节点
参数
const struct device_node *node父节点
struct device_node *prev父节点的上一个子节点,或者传入 NULL 以获取第一个子节点
描述
该函数与 of_get_next_child() 类似,不同之处在于它会自动跳过任何被禁用的节点(即 status = “disabled”)。
-
struct device_node *of_get_next_cpu_node(struct device_node *prev)¶
迭代 CPU 节点
参数
struct device_node *prevcpus 节点的上一个子节点,或者传入 NULL 以获取第一个子节点
描述
将跳过不可用的 CPU(即 status 属性被设置为 “fail” 或 “fail-...” 的 CPU)。
返回
一个引用计数递增的 CPU 节点指针,在使用完毕后对其使用 of_node_put()。当 prev 是最后一个子节点时返回 NULL。递减 prev 的引用计数。
-
struct device_node *of_get_compatible_child(const struct device_node *parent, const char *compatible)¶
寻找兼容的子节点
参数
const struct device_node *parent父节点
const char *compatiblecompatible 字符串
描述
查找其 compatible 属性包含给定 compatible 字符串的子节点。
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put();若未找到则返回 NULL。
-
struct device_node *of_get_child_by_name(const struct device_node *node, const char *name)¶
根据给定的父节点按名称查找子节点
参数
const struct device_node *node父节点
const char *name要寻找的子节点名称。
描述
该函数寻找与给定匹配名称相对应的子节点
返回
如果找到,则返回一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。如果未找到节点,则返回 NULL。
-
struct device_node *of_get_available_child_by_name(const struct device_node *node, const char *name)¶
根据给定的父节点按名称查找可用的子节点
参数
const struct device_node *node父节点
const char *name要寻找的子节点名称。
描述
该函数寻找与给定匹配名称相对应的子节点,并检查该设备的可用性。
返回
如果找到,则返回一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。如果未找到节点,则返回 NULL。
-
struct device_node *of_find_node_opts_by_path(const char *path, const char **opts)¶
查找与完整 OF 路径匹配的节点
参数
const char *path可以是用于匹配的完整路径,或者若路径不以 '/' 开头,则是 /aliases 节点的某个属性名(即别名)。在别名的情况下,将返回与该别名对应的值相匹配的节点。
const char **opts用于存储选项字符串起始位置的指针地址,该选项字符串通过 ':' 分隔符附加在路径末尾。
描述
- 有效路径
/foo/bar 完整路径
foo 有效别名
foo/bar 有效别名 + 相对路径
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
struct device_node *of_find_node_by_name(struct device_node *from, const char *name)¶
通过节点的 “name” 属性查找节点
参数
struct device_node *from开始搜索的起始节点,或传入 NULL;传入的节点本身不会被搜索,仅会搜索其后的节点。通常情况下,您应该传入上一次调用返回的节点。将会对 from 调用
of_node_put()。const char *name用于匹配的名称字符串
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
struct device_node *of_find_node_by_type(struct device_node *from, const char *type)¶
通过节点的 “device_type” 属性查找节点
参数
struct device_node *from开始搜索的起始节点,或传入 NULL 以搜索整个设备树。传入的节点本身不会被搜索,仅会搜索其后的节点;通常情况下,您应该传入上一次调用返回的节点。系统会自动为您对 from 调用
of_node_put()。const char *type用于匹配的类型字符串
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
struct device_node *of_find_compatible_node(struct device_node *from, const char *type, const char *compatible)¶
根据类型以及其 “compatible” 属性中的某个 token 查找节点
参数
struct device_node *from开始搜索的起始节点,或传入 NULL;传入的节点本身不会被搜索,仅会搜索其后的节点;通常情况下,您应该传入上一次调用返回的节点。将会对其调用
of_node_put()const char *type用于匹配 “device_type” 的类型字符串,或传入 NULL 以忽略
const char *compatible用于与设备 “compatible” 列表中的某个 token 匹配的字符串。
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
struct device_node *of_find_node_with_property(struct device_node *from, const char *prop_name)¶
查找具有给定名称属性的节点。
参数
struct device_node *from开始搜索的起始节点,或传入 NULL;传入的节点本身不会被搜索,仅会搜索其后的节点;通常情况下,您应该传入上一次调用返回的节点。将会对其调用
of_node_put()const char *prop_name要寻找的属性名称。
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
const struct of_device_id *of_match_node(const struct of_device_id *matches, const struct device_node *node)¶
判断 device_node 是否具有匹配的 of_match 结构
参数
const struct of_device_id *matches用于在其中进行搜索的设备匹配结构体数组
const struct device_node *node用于与之进行匹配的设备节点
描述
设备匹配所使用的底层实用函数。
-
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)¶
基于 of_device_id 匹配表查找节点。
参数
struct device_node *from开始搜索的起始节点,或传入 NULL;传入的节点本身不会被搜索,仅会搜索其后的节点;通常情况下,您应该传入上一次调用返回的节点。将会对其调用
of_node_put()const struct of_device_id *matches用于在其中进行搜索的设备匹配结构体数组
const struct of_device_id **match更新为指向已匹配的匹配条目
返回
一个引用计数递增的节点指针,在使用完毕后对其使用 of_node_put()。
-
int of_alias_from_compatible(const struct device_node *node, char *alias, int len)¶
根据 compatible 为设备节点查找合适的别名
参数
const struct device_node *node指向设备树节点的指针
char *alias指向将要拷贝别名值的缓冲区的指针
int len别名值的长度
描述
基于 compatible 属性的值,该例程将尝试为特定的设备树节点选择一个合适的别名值。它通过从 compatible 列表属性的第一个条目中剥离制造商前缀(由 ',' 分隔)来实现这一点。
注意
仅对 compatible 的 “产品(product)” 端进行匹配是 I2C 和 SPI 的历史遗留做法。请不要添加任何新的调用者。
返回
该例程成功时返回 0,失败时返回 <0。
-
struct device_node *of_find_node_by_phandle(phandle handle)¶
根据给定的 phandle 查找节点
-
int of_parse_phandle_with_args_map(const struct device_node *np, const char *list_name, const char *stem_name, int index, struct of_phandle_args *out_args)¶
在列表中查找 phandle 所指向的节点并对其进行重映射
参数
const struct device_node *np指向包含列表的设备树节点的指针
const char *list_name包含列表的属性名称
const char *stem_name指定 phandle 参数数量的属性名称的词干(stem)
int index要解析出来的 phandle 的索引
struct of_phandle_args *out_args指向输出参数结构体的可选指针(将被填充)
描述
该函数在解析 phandle 列表及其参数时非常有用。成功时返回 0 并填充 out_args,出错时返回相应的错误码(errno)。该函数与 of_parse_phandle_with_args() 的区别在于,如果 phandle 指向的节点具有 <stem_name>-map 属性,此 API 会对该 phandle 进行重映射。
调用者负责对返回的 out_args->np 指针调用 of_node_put()。
示例
phandle1: node1 {
#list-cells = <2>;
};
phandle2: node2 {
#list-cells = <1>;
};
phandle3: node3 {
#list-cells = <1>;
list-map = <0 &phandle2 3>,
<1 &phandle2 2>,
<2 &phandle1 5 1>;
list-map-mask = <0x3>;
};
node4 {
list = <&phandle1 1 2 &phandle3 0>;
};
若要获取 node2 节点的 device_node,您可以这样调用:of_parse_phandle_with_args(node4, “list”, “list”, 1, args);
-
int of_count_phandle_with_args(const struct device_node *np, const char *list_name, const char *cells_name)¶
查找属性中引用的 phandle 数量
参数
const struct device_node *np指向包含列表的设备树节点的指针
const char *list_name包含列表的属性名称
const char *cells_name指定 phandle 参数数量的属性名称
返回
属性中 phandle + 参数元组的数量。将 phandle 列表及可变参数编码到单个属性中是一种典型模式。参数的数量由 phandle 目标节点中的一个属性来编码。例如,gpios 属性将包含一个 GPIO 说明符列表,每个说明符由一个 phandle 和 1 个或多个参数组成。参数的数量由该 phandle 指向的节点中的 #gpio-cells 属性决定。
-
int of_add_property(struct device_node *np, struct property *prop)¶
向节点添加属性
参数
struct device_node *np调用者的设备节点
struct property *prop要添加的属性
-
int of_remove_property(struct device_node *np, struct property *prop)¶
从节点中移除属性。
参数
struct device_node *np调用者的设备节点
struct property *prop要移除的属性
描述
注意,我们实际上并没有移除它,因为我们已经通过 get-property 分发了无数个指向该数据的指针。相反,我们只是将该属性移动到 “dead properties” 列表中,这样它就不会再被找到了。
-
int of_alias_get_id(const struct device_node *np, const char *stem)¶
获取给定 device_node 的别名 ID
参数
const struct device_node *np指向给定 device_node 的指针
const char *stem给定 device_node 的别名词干(stem)
描述
该函数遍历查找表以获取给定 device_node 和别名词干的别名 ID。
返回
如果找到,则返回别名 ID。
-
int of_alias_get_highest_id(const char *stem)¶
获取给定词干的最大别名 ID
参数
const char *stem要检查的别名词干
描述
该函数遍历查找表以获取给定别名词干的最大别名 ID。如果找到,它将返回该别名 ID。
-
bool of_console_check(const struct device_node *dn, char *name, int index)¶
测试并为设备树(DT)设置配置控制台
参数
const struct device_node *dn指向设备节点的指针
char *name首选控制台使用的名称(不带索引),例如 “ttyS”
int index首选控制台使用的索引。
描述
检查给定的设备节点是否与 /chosen 节点中的 stdout-path 属性匹配。如果匹配,则将其注册为首选控制台。
返回
如果控制台设置成功,则返回 TRUE。否则返回 FALSE。
-
int of_map_id(const struct device_node *np, u32 id, const char *map_name, const char *cells_name, const char *map_mask_name, struct device_node *const *filter_np, struct of_phandle_args *arg)¶
通过下游映射翻译一个 ID。
参数
const struct device_node *np根复合体(root complex)设备节点。
u32 id要映射的设备 ID。
const char *map_name要使用的映射的属性名称。
const char *cells_name目标说明符单元(cells)的属性名称。
const char *map_mask_name可选的、要使用的掩码属性名称。
struct device_node * const *filter_np指向可选过滤节点的指针,或传入 NULL 以允许绕过。如果非 NULL,则映射(map)属性必须存在(如果不存在则返回 -ENODEV)。如果
*filter_np也为非 NULL,则仅匹配以该节点为目标的条目。struct of_phandle_args *arg指向用于存放结果的
struct of_phandle_args的指针。成功时,arg->args_count 将被设置为目标节点中由 cells_name 定义的输出说明符单元数,并且 arg->args**[0..args_count-1] 将包含翻译后的输出说明符值。如果匹配到映射条目,**arg->np 将被设置为目标节点,并持有一个引用,调用者必须通过of_node_put()释放该引用。
描述
给定一个设备 ID,根据 “iommu-map” 和 “msi-map” 绑定,查找相应的由具体实现定义的平台 ID 和/或接收该 ID 上事务的目标设备。
返回
成功时返回 0,失败时返回标准错误码。
-
int of_map_iommu_id(const struct device_node *np, u32 id, struct of_phandle_args *arg)¶
使用 “iommu-map” 绑定翻译一个 ID。
参数
const struct device_node *np根复合体(root complex)设备节点。
u32 id设备的请求者 ID(例如 PCI RID/BDF 或平台流/设备 ID),用作 iommu-map 表中的查找键。
struct of_phandle_args *arg指向用于存放结果的
struct of_phandle_args的指针。成功时,arg->args_count 将被设置为输出说明符单元数,并且 arg->args**[0..args_count-1] 将包含翻译后的输出说明符值。如果匹配到映射条目,**arg->np 持有目标节点的引用,调用者必须通过of_node_put()释放该引用。
描述
围绕使用 “iommu-map”、“#iommu-cells” 和 “iommu-map-mask” 的 of_map_id() 的便利封装。
返回
成功时返回 0,失败时返回标准错误码。
-
int of_map_msi_id(const struct device_node *np, u32 id, struct device_node *const *filter_np, struct of_phandle_args *arg)¶
使用 “msi-map” 绑定翻译一个 ID。
参数
const struct device_node *np根复合体(root complex)设备节点。
u32 id设备的请求者 ID(例如 PCI RID/BDF 或平台流/设备 ID),用作 msi-map 表中的查找键。
struct device_node * const *filter_np指向可选过滤节点的指针,或传入 NULL 以允许绕过。如果非 NULL,则映射(map)属性必须存在(如果不存在则返回 -ENODEV)。如果
*filter_np也为非 NULL,则仅匹配以该节点为目标的条目。struct of_phandle_args *arg指向用于存放结果的
struct of_phandle_args的指针。成功时,arg->args_count 将被设置为输出说明符单元数,并且 arg->args**[0..args_count-1] 将包含翻译后的输出说明符值。如果匹配到映射条目,**arg->np 持有目标节点的引用,调用者必须通过of_node_put()释放该引用。
描述
围绕使用 “msi-map”、“#msi-cells” 和 “msi-map-mask” 的 of_map_id() 的便利封装。
返回
成功时返回 0,失败时返回标准错误码。
-
void of_node_init(struct device_node *node)¶
初始化一个设备树节点
参数
struct device_node *node指向由
kzalloc()创建的设备节点的指针
描述
返回时,device_node 的引用计数被设置为 1。使用完毕后对 node 调用 of_node_put() 以释放为其分配的内存。如果该节点不是动态节点,其内存将不会被释放。是否释放内存的决定将由 node->release() 做出,即 of_node_release()。
-
bool of_machine_is_compatible(const char *compat)¶
针对给定的 compatible 值测试设备树的根节点
参数
const char *compat要在根节点的 compatible 属性中寻找的 compatible 字符串。
返回
如果根节点的 compatible 属性中包含给定值,则返回 true。
-
struct device_node *of_parse_phandle(const struct device_node *np, const char *phandle_name, int index)¶
将 phandle 属性解析为 device_node 指针
参数
const struct device_node *np指向持有 phandle 属性的设备节点的指针
const char *phandle_name持有 phandle 值的属性名称
int index对于持有 phandle 表的属性,这是该表中的索引
返回
引用计数递增后的 device_node 指针。使用完毕后对其调用 of_node_put()。
-
int of_parse_phandle_with_args(const struct device_node *np, const char *list_name, const char *cells_name, int index, struct of_phandle_args *out_args)¶
在列表中查找 phandle 所指向的节点
参数
const struct device_node *np指向包含列表的设备树节点的指针
const char *list_name包含列表的属性名称
const char *cells_name指定 phandle 参数数量的属性名称
int index要解析出来的 phandle 的索引
struct of_phandle_args *out_args指向输出参数结构体的可选指针(将被填充)
描述
该函数在解析 phandle 列表及其参数时非常有用。成功时返回 0 并填充 out_args,出错时返回相应的错误码(errno)。
调用者负责对返回的 out_args->np 指针调用 of_node_put()。
示例
phandle1: node1 {
#list-cells = <2>;
};
phandle2: node2 {
#list-cells = <1>;
};
node3 {
list = <&phandle1 1 2 &phandle2 3>;
};
若要获取 node2 节点的 device_node,您可以这样调用:of_parse_phandle_with_args(node3, “list”, “#list-cells”, 1, args);
-
int of_parse_phandle_with_fixed_args(const struct device_node *np, const char *list_name, int cell_count, int index, struct of_phandle_args *out_args)¶
在列表中查找 phandle 所指向的节点
参数
const struct device_node *np指向包含列表的设备树节点的指针
const char *list_name包含列表的属性名称
int cell_countphandle 后面的参数单元(cells)数量
int index要解析出来的 phandle 的索引
struct of_phandle_args *out_args指向输出参数结构体的可选指针(将被填充)
描述
该函数在解析 phandle 列表及其参数时非常有用。成功时返回 0 并填充 out_args,出错时返回相应的错误码(errno)。
调用者负责对返回的 out_args->np 指针调用 of_node_put()。
示例
phandle1: node1 {
};
phandle2: node2 {
};
node3 {
list = <&phandle1 0 2 &phandle2 2 3>;
};
若要获取 node2 节点的 device_node,您可以这样调用:of_parse_phandle_with_fixed_args(node3, “list”, 2, 1, args);
-
int of_parse_phandle_with_optional_args(const struct device_node *np, const char *list_name, const char *cells_name, int index, struct of_phandle_args *out_args)¶
在列表中查找 phandle 所指向的节点
参数
const struct device_node *np指向包含列表的设备树节点的指针
const char *list_name包含列表的属性名称
const char *cells_name指定 phandle 参数数量的属性名称
int index要解析出来的 phandle 的索引
struct of_phandle_args *out_args指向输出参数结构体的可选指针(将被填充)
描述
与 of_parse_phandle_with_args() 相同,不同之处在于如果未找到 cells_name 属性,则假定 cell_count 为 0。
这在以下情况非常有用:如果您有一个以前没有参数且因此没有 '#*-cells' 属性的 phandle,但现在在保留向后兼容性的同时被迁移为拥有参数。
-
bool of_phandle_args_equal(const struct of_phandle_args *a1, const struct of_phandle_args *a2)¶
比较两个 of_phandle_args
参数
const struct of_phandle_args *a1要比较的第一个 of_phandle_args
const struct of_phandle_args *a2要比较的第二个 of_phandle_args
返回
如果 a1 和 a2 相同(相同的节点指针、相同的 phandle 参数)则返回 true,否则返回 false。
-
int of_property_count_u8_elems(const struct device_node *np, const char *propname)¶
计算属性中 u8 元素的数量
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
描述
在设备节点中搜索属性并计算其中 u8 元素的数量。
返回
成功时返回元素数量,如果属性不存在或其长度不是 u8 的倍数,则返回 -EINVAL,如果属性没有值,则返回 -ENODATA。
-
int of_property_count_u16_elems(const struct device_node *np, const char *propname)¶
计算属性中 u16 元素的数量
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
描述
在设备节点中搜索属性并计算其中 u16 元素的数量。
返回
成功时返回元素数量,如果属性不存在或其长度不是 u16 的倍数,则返回 -EINVAL,如果属性没有值,则返回 -ENODATA。
-
int of_property_count_u32_elems(const struct device_node *np, const char *propname)¶
计算属性中 u32 元素的数量
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
描述
在设备节点中搜索属性并计算其中 u32 元素的数量。
返回
成功时返回元素数量,如果属性不存在或其长度不是 u32 的倍数,则返回 -EINVAL,如果属性没有值,则返回 -ENODATA。
-
int of_property_count_u64_elems(const struct device_node *np, const char *propname)¶
计算属性中 u64 元素的数量
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
描述
在设备节点中搜索属性并计算其中 u64 元素的数量。
返回
成功时返回元素数量,如果属性不存在或其长度不是 u64 的倍数,则返回 -EINVAL,如果属性没有值,则返回 -ENODATA。
-
int of_property_read_string_array(const struct device_node *np, const char *propname, const char **out_strs, size_t sz)¶
从包含多个字符串的属性中读取字符串数组。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
const char **out_strs输出的字符串指针数组。
size_t sz要读取的数组元素数量。
描述
在设备树节点中搜索属性,并检索该属性中以 null 结尾的字符串值列表(指向数据的指针,而不是副本)。
返回
如果 out_strs 为 NULL,则返回属性中字符串的数量。
-
int of_property_count_strings(const struct device_node *np, const char *propname)¶
从包含多个字符串的属性中查找并返回字符串的数量。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
描述
在设备树节点中搜索属性并检索其中包含的以 null 结尾的字符串的数量。
返回
成功时返回字符串数量,如果属性不存在则返回 -EINVAL,如果属性没有值则返回 -ENODATA,如果在属性数据长度内字符串不以 null 结尾,则返回 -EILSEQ。
-
int of_property_read_string_index(const struct device_node *np, const char *propname, int index, const char **output)¶
从包含多个字符串的属性中查找并读取字符串。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
int index字符串在字符串列表中的索引
const char **output指向以 null 结尾的返回字符串的指针,仅当返回值为 0 时才会被修改。
描述
在设备树节点中搜索属性,并在该属性包含的字符串列表中检索一个以 null 结尾的字符串值(指向数据的指针,而不是副本)。
仅当能够解码出有效字符串时,才会修改 out_string 指针。
返回
成功时返回 0,如果属性不存在则返回 -EINVAL,如果属性没有值则返回 -ENODATA,如果在属性数据长度内字符串不以 null 结尾,则返回 -EILSEQ。
-
bool of_property_present(const struct device_node *np, const char *propname)¶
测试节点中是否存在某个属性
参数
const struct device_node *np要在其中搜索属性的设备节点。
const char *propname要搜索的属性名称。
描述
测试设备节点中是否存在某个属性。
返回
如果属性存在则返回 true,否则返回 false。
-
int of_property_read_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz)¶
在一属性中查找并读取 u8 数组。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u8 *out_values指向返回值的指针,仅在返回值为 0 时被修改。
size_t sz要读取的数组元素数量
描述
在设备节点中搜索属性,并从中读取 8 位值。
- 数组的 dts 条目应当类似于
property = /bits/ 8 <0x50 0x60 0x70>;
仅在能够解码出有效的 u8 值时,才会修改 out_values。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_u16_array(const struct device_node *np, const char *propname, u16 *out_values, size_t sz)¶
在一属性中查找并读取 u16 数组。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u16 *out_values指向返回值的指针,仅在返回值为 0 时被修改。
size_t sz要读取的数组元素数量
描述
在设备节点中搜索属性,并从中读取 16 位值。
- 数组的 dts 条目应当类似于
property = /bits/ 16 <0x5000 0x6000 0x7000>;
仅在能够解码出有效的 u16 值时,才会修改 out_values。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz)¶
在一属性中查找并读取 32 位整数数组。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u32 *out_values指向返回值的指针,仅在返回值为 0 时被修改。
size_t sz要读取的数组元素数量
描述
在设备节点中搜索属性,并从中读取 32 位值。
仅在能够解码出有效的 u32 值时,才会修改 out_values。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_u64_array(const struct device_node *np, const char *propname, u64 *out_values, size_t sz)¶
在一属性中查找并读取 64 位整数数组。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u64 *out_values指向返回值的指针,仅在返回值为 0 时被修改。
size_t sz要读取的数组元素数量
描述
在设备节点中搜索属性,并从中读取 64 位值。
仅在能够解码出有效的 u64 值时,才会修改 out_values。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
struct of_changeset_entry¶
保存变更集(changeset)条目
定义:
struct of_changeset_entry {
struct list_head node;
unsigned long action;
struct device_node *np;
struct property *prop;
struct property *old_prop;
};
成员
node用于日志列表的 list_head
action通知器动作
np指向受影响设备节点的指针
prop指向受影响属性的指针
old_prop保存指向原始属性的指针
描述
变更集期间对设备树的每次修改都保存在 of_changeset_entry 结构体列表中。这样我们就可以从部分应用中恢复,或者撤销该变更集
-
struct of_changeset¶
变更集追踪器结构体
定义:
struct of_changeset {
struct list_head entries;
};
成员
entries用于变更集条目的 list_head
描述
变更集是向活动树应用批量更改的一种便利方式。如果发生错误,更改将被回滚。变更集在首次应用后依然存在,如果使用后没有被销毁,可以通过一次调用来撤销。
-
bool of_device_is_system_power_controller(const struct device_node *np)¶
判断 device_node 是否包含 system-power-controller
参数
const struct device_node *np指向给定 device_node 的指针
返回
如果存在则为 true,否则为 false
-
bool of_have_populated_dt(void)¶
设备树(DT)是否已由引导加载程序(bootloader)填充
参数
void无参数
返回
如果 DTB 已由引导加载程序填充且该 DTB 不是内置的空 DTB,则返回 True。否则返回 False。
-
bool of_property_read_bool(const struct device_node *np, const char *propname)¶
查找属性
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
描述
在设备节点中搜索布尔属性。不推荐在非布尔属性类型上使用。
返回
如果属性存在则返回 true,否则返回 false。
-
bool of_graph_is_present(const struct device_node *node)¶
检查图(graph)是否存在
参数
const struct device_node *node指向包含图端口的 device_node 的指针
返回
如果 node 具有 port 或 ports(含有端口)子节点,则为 True,否则为 false。
-
int of_property_count_elems_of_size(const struct device_node *np, const char *propname, int elem_size)¶
计算属性中元素的数量
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
int elem_size单个元素的大小
描述
在设备节点中搜索属性,并计算其中大小为 elem_size 的元素数量。
返回
成功时返回元素数量;若属性不存在或其长度不是 elem_size 的整数倍,则返回 -EINVAL;若属性没有值,则返回 -ENODATA。
-
int of_property_read_u8_index(const struct device_node *np, const char *propname, u32 index, u8 *out_value)¶
在多值属性中查找并读取一个 u8 值。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u32 index值列表中 u8 的索引
u8 *out_value指向返回值的指针,仅在无错误时修改。
描述
在设备节点中搜索属性,并从中读取第 n 个 8 位值。
仅在能够解码出有效的 u8 值时,才会修改 out_value。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_u16_index(const struct device_node *np, const char *propname, u32 index, u16 *out_value)¶
在多值属性中查找并读取一个 u16 值。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u32 index值列表中 u16 的索引
u16 *out_value指向返回值的指针,仅在无错误时修改。
描述
在设备节点中搜索属性,并从中读取第 n 个 16 位值。
仅在能够解码出有效的 u16 值时,才会修改 out_value。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value)¶
在多值属性中查找并读取一个 u32 值。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u32 index值列表中 u32 的索引
u32 *out_value指向返回值的指针,仅在无错误时修改。
描述
在设备节点中搜索属性,并从中读取第 n 个 32 位值。
仅在能够解码出有效的 u32 值时,才会修改 out_value。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_u64_index(const struct device_node *np, const char *propname, u32 index, u64 *out_value)¶
在多值属性中查找并读取一个 u64 值。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u32 index值列表中 u64 的索引
u64 *out_value指向返回值的指针,仅在无错误时修改。
描述
在设备节点中搜索属性,并从中读取第 n 个 64 位值。
仅在能够解码出有效的 u64 值时,才会修改 out_value。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_variable_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz_min, size_t sz_max)¶
在属性中查找并读取 u8 数组,并对最小和最大数组大小进行限制。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u8 *out_values指向找到的值的指针。
size_t sz_min要读取的最小数组元素数量
size_t sz_max要读取的最大数组元素数量,如果为零,则 dts 条目中的元素数量没有上限,但只会读取 sz_min 个元素。
描述
在设备节点中搜索属性,并从中读取 8 位值。
- 数组的 dts 条目应当类似于
property = /bits/ 8 <0x50 0x60 0x70>;
仅在能够解码出有效的 u8 值时,才会修改 out_values。
返回
成功时返回读取的元素数量,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据小于 sz_min 或大于 sz_max 则返回 -EOVERFLOW。
-
int of_property_read_variable_u16_array(const struct device_node *np, const char *propname, u16 *out_values, size_t sz_min, size_t sz_max)¶
在属性中查找并读取 u16 数组,并对最小和最大数组大小进行限制。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u16 *out_values指向找到的值的指针。
size_t sz_min要读取的最小数组元素数量
size_t sz_max要读取的最大数组元素数量,如果为零,则 dts 条目中的元素数量没有上限,但只会读取 sz_min 个元素。
描述
在设备节点中搜索属性,并从中读取 16 位值。
- 数组的 dts 条目应当类似于
property = /bits/ 16 <0x5000 0x6000 0x7000>;
仅在能够解码出有效的 u16 值时,才会修改 out_values。
返回
成功时返回读取的元素数量,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据小于 sz_min 或大于 sz_max 则返回 -EOVERFLOW。
-
int of_property_read_variable_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz_min, size_t sz_max)¶
在属性中查找并读取 32 位整数数组,并对最小和最大数组大小进行限制。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u32 *out_values指向返回找到的值的指针。
size_t sz_min要读取的最小数组元素数量
size_t sz_max要读取的最大数组元素数量,如果为零,则 dts 条目中的元素数量没有上限,但只会读取 sz_min 个元素。
描述
在设备节点中搜索属性,并从中读取 32 位值。
仅在能够解码出有效的 u32 值时,才会修改 out_values。
返回
成功时返回读取的元素数量,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据小于 sz_min 或大于 sz_max 则返回 -EOVERFLOW。
-
int of_property_read_u64(const struct device_node *np, const char *propname, u64 *out_value)¶
在属性中查找并读取 64 位整数
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u64 *out_value指向返回值的指针,仅在返回值为 0 时被修改。
描述
在设备节点中搜索属性,并从中读取 64 位值。
仅在能够解码出有效的 u64 值时,才会修改 out_value。
返回
成功时返回 0,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据不够大则返回 -EOVERFLOW。
-
int of_property_read_variable_u64_array(const struct device_node *np, const char *propname, u64 *out_values, size_t sz_min, size_t sz_max)¶
在属性中查找并读取 64 位整数数组,并对最小和最大数组大小进行限制。
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
u64 *out_values指向找到的值的指针。
size_t sz_min要读取的最小数组元素数量
size_t sz_max要读取的最大数组元素数量,如果为零,则 dts 条目中的元素数量没有上限,但只会读取 sz_min 个元素。
描述
在设备节点中搜索属性,并从中读取 64 位值。
仅在能够解码出有效的 u64 值时,才会修改 out_values。
返回
成功时返回读取的元素数量,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若属性数据小于 sz_min 或大于 sz_max 则返回 -EOVERFLOW。
-
int of_property_read_string(const struct device_node *np, const char *propname, const char **out_string)¶
在属性中查找并读取字符串
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
const char **out_string指向以 null 结尾的返回字符串的指针,仅当返回值为 0 时才会被修改。
描述
在设备树节点中搜索属性并检索以空字符结尾的字符串值(指向数据的指针,而不是副本)。
请注意,空字符串 “” 的长度为 1,因此 -ENODATA 不能解释为空字符串。
仅当能够解码出有效字符串时,才会修改 out_string 指针。
返回
成功时返回 0,如果属性不存在则返回 -EINVAL,如果属性没有值则返回 -ENODATA,如果在属性数据长度内字符串不以 null 结尾,则返回 -EILSEQ。
-
int of_property_match_string(const struct device_node *np, const char *propname, const char *string)¶
在列表中查找字符串并返回索引
参数
const struct device_node *np指向包含字符串列表属性的节点的指针
const char *propname字符串列表属性名
const char *string指向要在字符串列表中搜索的字符串的指针
描述
在设备节点属性(即字符串列表)中精确搜索匹配的字符串。
返回
成功时返回该字符串首次出现的索引,若属性不存在则返回 -EINVAL,若属性没有值则返回 -ENODATA,若在属性数据长度内字符串不以空字符结尾则返回 -EILSEQ。
-
int of_property_read_string_helper(const struct device_node *np, const char *propname, const char **out_strs, size_t sz, int skip)¶
解析字符串属性的实用助手函数
参数
const struct device_node *np要从中读取属性值的设备节点。
const char *propname要搜索的属性名称。
const char **out_strs输出的字符串指针数组。
size_t sz要读取的数组元素数量。
int skip列表开头要跳过的字符串数量。
描述
不要直接调用此函数。它是 of_property_read_string*() 系列函数的实用助手函数。
-
int of_graph_parse_endpoint(const struct device_node *node, struct of_endpoint *endpoint)¶
解析通用的端点(endpoint)节点属性
参数
const struct device_node *node指向端点 device_node 的指针
struct of_endpoint *endpoint指向 OF 端点数据结构的指针
描述
调用者应当持有对 node 的引用。
-
struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id)¶
获取与给定 id 匹配的端口
参数
struct device_node *parent指向父设备节点的指针
u32 id端口的 id
返回
一个“port”节点指针(其引用计数已增加)。调用者在使用完毕后必须对其使用 of_node_put()。
-
struct device_node *of_graph_get_next_port(const struct device_node *parent, struct device_node *prev)¶
获取下一个端口节点。
参数
const struct device_node *parent指向父设备节点或父 ports 节点的指针
struct device_node *prev上一个端口节点,或传入 NULL 以获取第一个
描述
无论设备节点是否含有 ports 节点,父设备节点都可以用作 parent。其工作方式与 ports**0** 节点相同。
返回
一个“port”节点指针(其引用计数已增加)。传入的 prev 节点的引用计数将递减。
-
struct device_node *of_graph_get_next_port_endpoint(const struct device_node *port, struct device_node *prev)¶
获取端口中的下一个端点(endpoint)节点。如果已到达端口末尾,则返回 NULL。
参数
const struct device_node *port指向目标端口节点的指针
struct device_node *prev上一个端点节点, or NULL to get first
返回
一个“endpoint”节点指针(其引用计数已增加)。传入的 prev 节点的引用计数将递减。
-
struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, struct device_node *prev)¶
获取下一个端点节点
参数
const struct device_node *parent指向父设备节点的指针
struct device_node *prev上一个端点节点, or NULL to get first
返回
一个“endpoint”节点指针(其引用计数已增加)。传入的 prev 节点的引用计数将递减。
-
struct device_node *of_graph_get_endpoint_by_regs(const struct device_node *parent, int port_reg, int reg)¶
获取特定标识符的端点节点
参数
const struct device_node *parent指向父设备节点的指针
int port_reg父端口节点的标识符(reg 属性的值)
int reg端点节点的标识符(reg 属性的值)
返回
一个“endpoint”节点指针,该节点由 reg 标识,同时是 port_reg 标识的端口节点的子节点。当 reg 和 port_reg 为 -1 时将被忽略。完成后对该指针使用 of_node_put()。
-
struct device_node *of_graph_get_remote_endpoint(const struct device_node *node)¶
获取远端端点节点
参数
const struct device_node *node指向本地端点 device_node 的指针
返回
与链接到 node 的远端端点节点相关联的远端端点节点。完成后对其使用 of_node_put()。
-
struct device_node *of_graph_get_port_parent(struct device_node *node)¶
获取端口的父节点
-
struct device_node *of_graph_get_remote_port_parent(const struct device_node *node)¶
获取远端端口的父节点
参数
const struct device_node *node指向本地端点 device_node 的指针
返回
与链接到 node 的远端端点节点相关联的远端设备节点。完成后对其使用 of_node_put()。
-
struct device_node *of_graph_get_remote_port(const struct device_node *node)¶
获取远端端口节点
参数
const struct device_node *node指向本地端点 device_node 的指针
返回
与链接到 node 的远端端点节点相关联的远端端口节点。完成后对其使用 of_node_put()。
-
unsigned int of_graph_get_endpoint_count(const struct device_node *np)¶
获取设备节点中端点的数量
参数
const struct device_node *np包含端口和端点的父设备节点
返回
该设备节点的端点数量
-
unsigned int of_graph_get_port_count(struct device_node *np)¶
获取设备或 ports 节点中的端口数量
参数
struct device_node *np指向设备或 ports 节点的指针
返回
该设备或 ports 节点的端口数量
-
struct device_node *of_graph_get_remote_node(const struct device_node *node, u32 port, u32 endpoint)¶
获取给定端口/端点的远端父 device_node
参数
const struct device_node *node指向包含图端口/端点的父 device_node 的指针
u32 port父端口节点的标识符(reg 属性的值)
u32 endpoint端点节点的标识符(reg 属性的值)
返回
与链接到 node 的远端端点节点相关联的远端设备节点。完成后对其使用 of_node_put()。
-
struct of_endpoint¶
OF 图端点数据结构
定义:
struct of_endpoint {
unsigned int port;
unsigned int id;
const struct device_node *local_node;
};
成员
port该端点所属端口的标识符(reg 属性的值)
id该端点的标识符(reg 属性的值)
local_node指向该端点 device_node 的指针
-
for_each_endpoint_of_node¶
for_each_endpoint_of_node (parent, child)
遍历设备节点中的每个端点
参数
parent包含端口和端点的父设备节点
child指向当前端点节点的循环变量
描述
当提前退出循环时,必须手动调用 of_node_put(child)。
-
for_each_of_graph_port¶
for_each_of_graph_port (parent, child)
遍历设备或 ports 节点中的每个端口
参数
parent包含端口的父设备或 ports 节点
child指向当前端口节点的循环变量
描述
当提前退出循环并继续使用 child 时,你需要使用 return_ptr(child) 或 no_free_ptr(child) 以免为其调用 __free()。
-
for_each_of_graph_port_endpoint¶
for_each_of_graph_port_endpoint (parent, child)
遍历端口节点中的每个端点
参数
parent父端口节点
child指向当前端点节点的循环变量
描述
当提前退出循环并继续使用 child 时,你需要使用 return_ptr(child) 或 no_free_ptr(child) 以免为其调用 __free()。
-
const __be32 *of_translate_dma_region(struct device_node *dev, const __be32 *prop, phys_addr_t *start, size_t *length)¶
转换设备树地址和大小元组
参数
struct device_node *dev要进行转换的设备树节点
const __be32 *prop指向单元(cells)数组的指针
phys_addr_t *startDMA 范围起点的返回值
size_t *lengthDMA 范围长度的返回值
描述
返回指向紧跟在转换后的 DMA 区域后面的单元的指针。
-
int of_property_read_reg(struct device_node *np, int idx, u64 *addr, u64 *size)¶
在不转换的情况下检索指定的 “reg” 条目索引
参数
struct device_node *np要从中检索 “reg” 的设备树节点
int idx要读取的 “reg” 条目索引
u64 *addr未转换地址的返回值
u64 *size条目大小的返回值
描述
若未找到 “reg”,则返回 -EINVAL。成功时返回 0,并填充 addr 和 size 的值。
-
bool of_dma_is_coherent(struct device_node *np)¶
检查设备是否是一致的(coherent)
参数
struct device_node *np设备节点
描述
如果在设备树(DT)中为该设备找到了 “dma-coherent” 属性,或者在当前平台上 OF 设备的 DMA 默认是一致的且未为该设备找到 “dma-noncoherent” 属性,则返回 true。
-
int of_address_to_resource(struct device_node *dev, int index, struct resource *r)¶
转换设备树地址并将其作为资源返回
参数
struct device_node *dev调用者的设备节点
int index数组中的索引
struct resource *r指向资源数组的指针
描述
如果该范围无法转换为资源,则返回 -EINVAL。
请注意,如果你的地址是 PIO 地址,且物理地址无法在内部通过 pci_address_to_pio() 转换为 IO 令牌,则转换将失败。这通常是因为调用过早,或者它无法与任何主机桥(host bridge)IO 空间相匹配
-
void __iomem *of_iomap(struct device_node *np, int index)¶
映射给定 device_node 的内存映射 IO
参数
struct device_node *np其 io 范围将被映射的设备
int indexio 范围的索引
描述
返回指向映射后内存的指针
-
unsigned int irq_of_parse_and_map(struct device_node *dev, int index)¶
解析中断并将其映射到 Linux 虚拟中断(virq)空间
参数
struct device_node *dev要映射其中断的设备的设备节点
int index要映射的中断索引
描述
此函数是一个包装函数,它链式调用了 of_irq_parse_one() 和 irq_create_of_mapping(),以便调用者使用
-
struct device_node *of_irq_find_parent(struct device_node *child)¶
给定一个设备节点,查找其中断父节点
参数
struct device_node *child指向设备节点的指针
返回
指向中断父节点的指针(其引用计数已增加),如果无法确定中断父节点,则返回 NULL。
-
int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)¶
底层中断树解析
参数
const __be32 *addrbe32 格式的地址说明符(设备 “reg” 属性的起点)
struct of_phandle_args *out_irq由该函数更新的 of_phandle_args 结构体
描述
此函数是底层的中断树遍历函数。它可以用于通过合成的 reg 和 interrupts 属性进行部分遍历,例如在父节点不存在设备节点时解析 PCI 中断。它将中断说明符结构体作为输入,遍历树以查找任何 interrupt-map 属性,转换每个 map 的说明符,然后返回转换后的 map。
返回
成功时返回 0,错误时返回负数
注意
成功时,节点 out_irq->np 的引用计数将增加 1。
-
int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_args *out_irq)¶
解析设备的中断
参数
struct device_node *device要解析其中断的设备
int index要解析的中断索引
struct of_phandle_args *out_irq由该函数填充的 of_phandle_args 结构体
描述
该函数通过遍历中断树来解析节点的中断,查找该中断连接到哪个中断控制器节点,并返回可用于获取 Linux IRQ 号的中断说明符。
注意
成功时,节点 out_irq->np 的引用计数将增加 1。
-
int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)¶
解码节点的 IRQ 并将其作为资源返回
参数
struct device_node *dev指向设备树节点的指针
int indexIRQ 的从零开始的索引
struct resource *r指向用于返回结果的资源结构体的指针。
-
int of_irq_get(struct device_node *dev, int index)¶
解码节点的 IRQ 并将其作为 Linux IRQ 号返回
参数
struct device_node *dev指向设备树节点的指针
int indexIRQ 的从零开始的索引
返回
成功时返回 Linux IRQ 号;若 IRQ 映射失败则返回 0;若 IRQ 域尚未创建则返回 -EPROBE_DEFER;在发生任何其他故障时返回错误码。
-
int of_irq_get_byname(struct device_node *dev, const char *name)¶
解码节点的 IRQ 并将其作为 Linux IRQ 号返回
参数
struct device_node *dev指向设备树节点的指针
const char *nameIRQ 名称
返回
成功时返回 Linux IRQ 号;若 IRQ 映射失败则返回 0;若 IRQ 域尚未创建则返回 -EPROBE_DEFER;在发生任何其他故障时返回错误码。
-
int of_irq_count(struct device_node *dev)¶
计算节点使用的 IRQ 数量
参数
struct device_node *dev指向设备树节点的指针
-
int of_irq_to_resource_table(struct device_node *dev, struct resource *res, int nr_irqs)¶
用节点的 IRQ 信息填充资源表
参数
struct device_node *dev指向设备树节点的指针
struct resource *res要填充的资源数组
int nr_irqsIRQ 的数量(也是 res 元素数量的上限)
返回
填充表的实际大小(最多为 nr_irqs)。
-
u32 of_msi_xlate(struct device *dev, struct device_node **msi_np, u32 id_in)¶
映射 MSI ID并查找相关的 MSI 控制器节点
参数
struct device *dev要对其进行映射的设备。
struct device_node **msi_np指向目标 MSI 控制器节点的指针,若调用者仅需要转换后的 ID 而不需要接收控制器节点,则可为 NULL。若非 NULL 且指向非 NULL 节点,则仅匹配以该节点为目标的条目。若非 NULL 且指向 NULL,它将接收第一个匹配的目标节点,并持有其引用。
u32 id_in设备 ID。
描述
向上遍历设备层级,寻找具有 “msi-map” 或 “msi-parent” 属性的设备。如果找到,将该映射应用于 id_in。
返回
映射后的 MSI ID。
-
struct irq_domain *of_msi_get_domain(struct device *dev, const struct device_node *np, enum irq_domain_bus_token token)¶
使用 msi-parent 查找相关的 MSI 域
参数
struct device *dev请求该域的设备
const struct device_node *npdev 的设备节点
enum irq_domain_bus_token token该域的总线类型
描述
解析 msi-parent 属性并返回对应的 MSI 域。
返回
该设备的 MSI 域(失败时为 NULL)。
参数
struct device *dev要与 MSI irq 域关联的设备结构体
const struct device_node *np该设备的设备节点
-
void *of_fdt_unflatten_tree(const unsigned long *blob, struct device_node *dad, struct device_node **mynodes)¶
从扁平二进制对象(flat blob)创建 device_node 树
参数
const unsigned long *blob扁平设备树二进制对象(flat blob)
struct device_node *dad父设备节点
struct device_node **mynodes通过调用创建的设备树
描述
反扁平化(unflatten)由固件传递的设备树,创建由 struct device_node 组成的树。它还会填充节点的 “name” 和 “type” 指针,以便可以使用常规的设备树遍历函数。
返回
失败时返回 NULL,成功时返回包含反扁平化后设备树的内存块。
驱动模型函数¶
-
int of_driver_match_device(struct device *dev, const struct device_driver *drv)¶
判断驱动程序的 of_match_table 是否与设备匹配。
参数
struct device *dev用于进行匹配的设备结构体
const struct device_driver *drv要测试的 device_driver 结构体
-
const struct of_device_id *of_match_device(const struct of_device_id *matches, const struct device *dev)¶
判断一个
struct device是否与 of_device_id 列表匹配
参数
const struct of_device_id *matches要在其中搜索的 of_device_id 匹配结构体数组
const struct device *dev要进行匹配的 OF 设备结构体
描述
由驱动程序用于检查系统中存在的 platform_device 是否在其支持的设备列表中。
-
int of_dma_configure_id(struct device *dev, struct device_node *np, bool force_dma, const u32 *id)¶
设置 DMA 配置
参数
struct device *dev应用 DMA 配置的设备
struct device_node *np指向具有 DMA 配置的 OF 节点的指针
bool force_dma即使固件没有显式描述 DMA 能力,设备是否仍由
of_dma_configure()进行设置。const u32 *id可选的常量指针值输入 id
描述
尝试从设备树(DT)获取设备的 DMA 配置并进行相应更新。
如果平台代码需要使用其自己特殊的 DMA 配置,可以使用平台总线通知链(notifier)并处理 BUS_NOTIFY_ADD_DEVICE 事件来修复 DMA 配置。
参数
struct device *dev调用设备
char *strModalias 字符串
ssize_t lenstr 的大小
参数
const struct device *dev要显示其 uevent 信息的设备
struct kobj_uevent_env *env要填充的内核对象用户空间事件引用
参数
struct device *dev指向链接到设备树节点的设备结构的指针
描述
该例程首先尝试使用转换后的总线地址来派生唯一名称。如果无法派生,则会从父节点中附加名称,直到可以派生出唯一名称。
-
struct of_dev_auxdata¶
设备名称和 platform_data 的查找表条目
定义:
struct of_dev_auxdata {
char *compatible;
resource_size_t phys_addr;
char *name;
void *platform_data;
};
成员
compatible要与节点匹配的节点的 compatible 值
phys_addr要与节点匹配的寄存器的起始地址
name为匹配节点分配的名称
platform_data为匹配节点分配的 platform_data
描述
此查找表允许 of_platform_populate() 的调用者在从设备树创建设备时覆盖设备的名称。该表应以空条目结尾。它还允许设置 platform_data 指针。
此功能的原因是,某些 Linux 基础设施使用设备名称来查找特定设备,但 Linux 特定的名称并未编码到设备树中,因此内核需要提供特定值。
注意
在将平台转换为使用设备树(DT)时,使用 auxdata 查找表应被视为最后手段。通常,自动生成的设备名称并不重要,驱动程序应该从设备节点获取数据,而不是从匿名的 platform_data 指针。
-
struct platform_device *of_find_device_by_node(struct device_node *np)¶
查找与节点关联的 platform_device
参数
struct device_node *np指向设备树节点的指针
描述
获取对嵌入式 struct device 的引用,使用后需要释放。
返回
platform_device 指针,如果未找到则为 NULL
-
struct platform_device *of_device_alloc(struct device_node *np, const char *bus_id, struct device *parent)¶
分配并初始化一个 of_device
参数
struct device_node *np要分配给设备的设备节点
const char *bus_id要分配给设备的名称。可以为 NULL 以使用默认名称。
struct device *parent父设备。
-
struct platform_device *of_platform_device_create(struct device_node *np, const char *bus_id, struct device *parent)¶
分配、初始化并注册一个 of_device
参数
struct device_node *np指向要为其创建设备的节点的指针
const char *bus_id要分配给设备的名称
struct device *parentLinux 设备模型的父设备。
返回
指向已创建平台设备的指针,如果设备未注册则为 NULL。不可用的设备将不会被注册。
-
int of_platform_bus_probe(struct device_node *root, const struct of_device_id *matches, struct device *parent)¶
在设备树中探测平台总线
参数
struct device_node *root要探测的第一层级的父节点,如果为树的根节点则为 NULL
const struct of_device_id *matches总线节点的匹配表
struct device *parent用于挂载设备的父设备,顶级设备则为 NULL
描述
请注意,除非指定的根节点本身与总线列表匹配且不为 NULL,否则所提供根节点的子节点不会被实例化为设备。
-
int of_platform_populate(struct device_node *root, const struct of_device_id *matches, const struct of_dev_auxdata *lookup, struct device *parent)¶
从设备树数据填充 platform_device
参数
struct device_node *root要探测的第一层级的父节点,如果为树的根节点则为 NULL
const struct of_device_id *matches匹配表,为 NULL 则使用默认表
const struct of_dev_auxdata *lookup用于将 id 和 platform_data 与设备节点进行匹配的 auxdata 表
struct device *parent用于挂载设备的父设备,顶级设备则为 NULL
描述
类似于 of_platform_bus_probe(),该函数遍历设备树并根据节点创建设备。两者的不同之处在于它遵循了现代约定,即要求所有设备节点都具有“compatible”属性,并且它适用于创建作为根节点子节点的设备(of_platform_bus_probe 将仅创建由 matches 参数选择的根节点的子节点)。
新开发板的支持应当使用此函数,而不是 of_platform_bus_probe()。
返回
成功时返回 0,失败时返回 < 0。
参数
struct device *parent其子设备将被删除的设备
描述
作为 of_platform_populate() 的补充,该函数删除给定设备的子设备(并递归地删除其子设备的子设备),这些子设备是从其各自的设备树节点中创建出来的(并且仅删除这些设备,保留其他设备(例如手动创建的设备)不受损坏)。
参数
struct device *dev请求从设备树数据进行填充的设备
描述
类似于 of_platform_populate(),但在设备从总线解绑时会自动调用 of_platform_depopulate()。
返回
成功时返回 0,失败时返回 < 0。
参数
struct device *dev请求从设备树数据中进行反填充的设备
描述
作为 devm_of_platform_populate() 的补充,该函数删除给定设备的子设备(并递归地删除其子设备的子设备),这些子设备是从其各自的设备树节点中创建出来的(并且仅删除这些设备,保留其他设备(例如手动创建的设备)不受损坏)。
Overlay 和动态设备树(DT)函数¶
-
int of_resolve_phandles(struct device_node *overlay)¶
根据活动树(live tree)重定位并解析 overlay
参数
struct device_node *overlay指向要重定位和解析的设备树 overlay 的指针
描述
将 overlay 中本地 phandle 的值修改(重定位)到与活动展开设备树不冲突的范围。更新对 overlay 中本地 phandle 的引用。更新(解析)overlay 中引用活动展开设备树的 phandle 引用。
活动树中的 phandle 值在 1 到 live_tree_max_phandle() 的范围内。overlay 中的 phandle 值范围也从 1 开始。调整 overlay 中的 phandle 值使其从 live_tree_max_phandle() + 1 开始。将对 phandle 的引用更新为调整后的 phandle 值。
overlay 中“__fixups__”节点中每个属性的名称与活动树中符号(标签)的名称匹配。“__fixups__”节点中每个属性的值是 overlay 中需要更新以包含与活动树中该符号对应的 phandle 引用的属性值列表。使用活动树中的 phandle 值更新 overlay 中的引用。
overlay 必须是未附加(detached)的。
解析并将 overlay 应用于活动展开设备树的过程必须受到某种机制的保护,以确保多个 overlay 以单线程方式进行处理,从而不会将 phandle 重定位到重叠的范围。实施该机制的办法尚未实现。
返回
成功时返回 0,出错时返回负的错误值。
-
struct device_node *of_node_get(struct device_node *node)¶
增加节点的引用计数(refcount)
参数
struct device_node *node要增加引用计数的节点,支持传入 NULL 以简化调用者的编写
返回
增加了引用计数的节点。
-
void of_node_put(struct device_node *node)¶
减少节点的引用计数
参数
struct device_node *node要减少引用计数的节点,支持传入 NULL 以简化调用者的编写
-
int of_detach_node(struct device_node *np)¶
从设备树中“拔出(unplug)”一个节点。
参数
struct device_node *np指向调用者设备节点的指针
-
struct device_node *of_changeset_create_node(struct of_changeset *ocs, struct device_node *parent, const char *full_name)¶
动态创建一个设备节点并将其附加到给定的变更集(changeset)。
参数
struct of_changeset *ocs指向变更集的指针
struct device_node *parent指向父设备节点的指针
const char *full_name节点全名
返回
指向已创建设备节点的指针,如果出错则为 NULL。
-
void of_changeset_init(struct of_changeset *ocs)¶
初始化一个要使用的变更集
参数
struct of_changeset *ocs变更集指针
描述
初始化一个变更集结构
-
void of_changeset_destroy(struct of_changeset *ocs)¶
销毁一个变更集
参数
struct of_changeset *ocs变更集指针
描述
销毁一个变更集。请注意,如果一个变更集已被应用,它对设备树所做的更改将无法还原。
-
int of_changeset_apply(struct of_changeset *ocs)¶
应用一个变更集
参数
struct of_changeset *ocs变更集指针
描述
将变更集应用到活动树。成功时,在此应用活动树状态更改的所有副作用,例如设备的创建/销毁以及 sysfs 属性和目录的创建等副作用。
返回
成功时返回 0,出错时返回负的错误值。出错时,部分应用的更改将被还原。
-
int of_changeset_revert(struct of_changeset *ocs)¶
撤销已应用的变更集
参数
struct of_changeset *ocs变更集指针
描述
撤销变更集,将树的状态恢复为应用前的状态。任何副作用(例如设备的创建/销毁以及 sysfs 属性和目录的删除)都会被应用。
返回
成功时返回 0,出错时返回负的错误值。
-
int of_changeset_action(struct of_changeset *ocs, unsigned long action, struct device_node *np, struct property *prop)¶
在变更集列表的尾部添加一个动作(action)
参数
struct of_changeset *ocs变更集指针
unsigned long action要执行的动作
struct device_node *np指向设备节点的指针
struct property *prop指向属性的指针
描述
动作可以为以下之一:+ OF_RECONFIG_ATTACH_NODE + OF_RECONFIG_DETACH_NODE, + OF_RECONFIG_ADD_PROPERTY + OF_RECONFIG_REMOVE_PROPERTY, + OF_RECONFIG_UPDATE_PROPERTY
返回
成功时返回 0,出错时返回负的错误值。
-
int of_changeset_add_prop_string(struct of_changeset *ocs, struct device_node *np, const char *prop_name, const char *str)¶
向变更集添加字符串属性
参数
struct of_changeset *ocs变更集指针
struct device_node *np设备节点指针
const char *prop_name要添加的属性名称
const char *str指向以空字符结尾的字符串的指针
描述
创建一个字符串属性并将其添加到变更集中。
返回
成功时返回 0,出错时返回负的错误值。
-
int of_changeset_add_prop_string_array(struct of_changeset *ocs, struct device_node *np, const char *prop_name, const char *const *str_array, size_t sz)¶
向变更集添加字符串列表属性
参数
struct of_changeset *ocs变更集指针
struct device_node *np设备节点指针
const char *prop_name要添加的属性名称
const char * const *str_array指向以空字符结尾的字符串数组的指针
size_t sz字符串数组元素的数量
描述
创建一个字符串列表属性并将其添加到变更集中。
返回
成功时返回 0,出错时返回负的错误值。
-
int of_changeset_add_prop_u32_array(struct of_changeset *ocs, struct device_node *np, const char *prop_name, const u32 *array, size_t sz)¶
向变更集添加 32 位整数属性
参数
struct of_changeset *ocs变更集指针
struct device_node *np设备节点指针
const char *prop_name要添加的属性名称
const u32 *array指向 32 位整数数组的指针
size_t sz数组元素的数量
描述
创建一个 32 位整数属性并将其添加到变更集中。
返回
成功时返回 0,出错时返回负的错误值。
-
int of_changeset_add_prop_bool(struct of_changeset *ocs, struct device_node *np, const char *prop_name)¶
向变更集添加布尔属性(即没有任何值的属性)。
参数
struct of_changeset *ocs变更集指针
struct device_node *np设备节点指针
const char *prop_name要添加的属性名称
描述
创建一个布尔属性并将其添加到变更集中。
返回
成功时返回 0,出错时返回负的错误值。
-
int of_changeset_update_prop_string(struct of_changeset *ocs, struct device_node *np, const char *prop_name, const char *str)¶
向变更集添加字符串属性更新
参数
struct of_changeset *ocs变更集指针
struct device_node *np设备节点指针
const char *prop_name要更新的属性名称
const char *str指向以空字符结尾的字符串的指针
描述
创建要更新的字符串属性并将其添加到变更集中。
返回
成功时返回 0,出错时返回负的错误值。
-
int of_overlay_notifier_register(struct notifier_block *nb)¶
为 overlay 操作注册通知链
参数
struct notifier_block *nb要注册的通知链块(notifier block)
描述
注册设备树节点上 overlay 操作的通知。所报告的动作由 of_reconfig_change 定义。此外,通知链回调函数还会接收一个指向受影响设备树节点的指针。
请注意,通知链回调函数在收到相应节点后,不应将指向设备树节点或其内容的指针保存到超过 OF_OVERLAY_POST_REMOVE 的生命周期之外。
-
int of_overlay_notifier_unregister(struct notifier_block *nb)¶
注销 overlay 操作的通知链
参数
struct notifier_block *nb要注销的通知链块
-
int of_overlay_fdt_apply(const void *overlay_fdt, u32 overlay_fdt_size, int *ret_ovcs_id, const struct device_node *base)¶
创建并应用一个 overlay 变更集
参数
const void *overlay_fdt指向 overlay FDT 的指针
u32 overlay_fdt_sizeoverlay_fdt 中的字节数
int *ret_ovcs_id用于返回创建的变更集 ID 的指针
const struct device_node *base用于应用 overlay 的目标节点的指针
描述
创建并应用一个 overlay 变更集。
有关重要行为信息,请参阅 of_overlay_apply()。
如果返回错误,该变更集可能会被部分应用。如果 OF_OVERLAY_POST_APPLY 通知链返回错误,这种情况尤其可能发生。在这种情况下,调用者应使用 *ret_ovcs_id 中的值调用 of_overlay_remove()。
返回
成功时返回 0,或者返回负的错误号。*ret_ovcs_id 设置为 overlay 变更集 ID 的值,该值可以传递给 of_overlay_remove() 以删除 overlay。
-
int of_overlay_remove(int *ovcs_id)¶
还原并释放一个 overlay 变更集
参数
int *ovcs_id指向 overlay 变更集 ID 的指针
描述
如果允许,则删除一个 overlay。ovcs_id 此前由 of_overlay_fdt_apply() 返回。
如果在尝试还原 overlay 变更集时发生错误,则会尝试重新应用已还原的任何变更集条目。如果在重新应用时发生错误,则设备树的状态将无法确定,并且随后任何应用或删除 overlay 变更集的尝试都将被拒绝。
- 如果错误来自以下情况,则非零返回值将不会还原变更集:
参数检查
overlay 变更集 pre-remove 通知链
overlay 变更集条目还原
如果 overlay 变更集 pre-remove 通知链返回错误,则不会再调用后续的 overlay 变更集 pre-remove 通知链。
如果一个以上的通知链返回错误,则返回最后发生的通知链错误。
- 如果错误来自以下情况,则非零返回值将会还原变更集:
overlay 变更集条目通知链
overlay 变更集 post-remove 通知链
如果 overlay 变更集 post-remove 通知链返回错误,则不会再调用后续的 overlay 变更集 post-remove 通知链。
返回
成功时返回 0,或者返回负的错误号。在还原变更集后,*ovcs_id 会被设置为 0,即使随后发生错误也是如此。
-
int of_overlay_remove_all(void)¶
还原并释放所有 overlay 变更集
参数
void无参数
描述
按正确的顺序从系统中删除所有 overlay。
返回
成功时返回 0,或返回负的错误号