NotePublic/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md

5.0 KiB
Raw Blame History

Device Tree

DTS 语法

Device Tree 的解析

device_node 结构体

Linux 内核中使用 device_node 结构体来描述一个节点,此结构体定义在文件 include/linux/of.h 中,定义如下:

struct device_node {
    const char *name;           /* 节点名字 */
    const char *type;           /* 设备类型 */
    phandle phandle;
    const char *full_name;      /* 节点全名 */
    struct fwnode_handle fnode;

    struct property *properties; /* 属性 */
    struct property *deadprops;  /* removes 属性 */
    struct device_node *parend;  /* 父节点 */
    struct device_node *child;   /* 子节点 */
    struct device_node *sibling;
    struct kobject kobj;
    ...
}

property 结构体

Linux 内核中使用 struct property 结构体来表示属性,定义如下:

struct property {
    char *name; //属性名字
    int length; //属性长度
    void *value; //属性值
    struct property *next;//下一个属性
    unsigned long _flags;
    unsigned int unique_id;
    struct bin_attribute attr;
}

常用 OF 函数

of_find_node_by_name 函数

函数原型:

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

说明:

通过节点名字查找指定的节点。

参数:

from开始查找的节点如果为 NULL 表示从根节点开始查找整个设备树

name要查找的节点名字

返回值:

成功则返回找到的节点,失败返回 NULL。

of_find_node_by_type 函数

函数原型:

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

说明:

通过 device_type 属性查找指定的节点。

参数:

from开始查找的节点如果为 NULL 表示从根节点开始查找整个设备树

type要查找的节点对应的字符串也就是 device_type 属性值

返回值:

成功则返回找到的节点,失败返回 NULL。

of_find_compatible_node 函数

函数原型:

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

说明:

根据 device_type 和 compatible 这两个属性查找指定的节点。

参数:

from开始查找的节点如果为 NULL 表示从根节点开始查找整个设备树

matchesof_device_id 匹配表,也就是在此匹配表里面查找节点

match找到的匹配的 of_device_id

返回值:

成功则返回找到的节点,失败返回 NULL。

of_find_node_by_path 函数

函数原型:

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

说明:

通过路径来查找指定的节点。

参数:

path带有全路径的节点名

返回值:

成功则返回找到的节点,失败返回 NULL。

of_get_parent 函数

函数原型:

struct device_node *of_get_parent(const struct device_node *node);

说明:

用于获取指定节点的父节点(如果有父节点的话)。

参数:

node子节点。

返回值:

成功则返回找到的父节点,失败返回 NULL。

of_get_next_child 函数

函数原型:

struct device_node *of_get_next_child(const struct device_node *node, struct device_node *prev);

说明:

查找谋节点的子节点。

参数:

node父节点。

prev前一个子节点也就是从哪一个子节点开始的下一个子节点如果为 NULL 表示从第一个子节点开始

返回值:

成功则返回找到的下一个子节点,失败返回 NULL。

of_find_property 函数

函数原型:

struct property *of_find_property(const struct device_node *np, const char *name, int *lenp);

说明:

通过属性名称查找指定的属性

参数:

np设备节点

name属性名字

lenp返回属性值的字节数

返回值:

成功则返回找到的属性,失败返回 NULL。

of_get_property 函数

函数原型:

const void *of_get_property(const struct device_node *np, const char *name, int *lenp)

说明:

是 of_find_property 函数的扩展,直接返回 property 的 value 属性。

参数:

np设备节点

name属性名字

lenp返回属性值的字节数

返回值:

成功则返回找到的 value失败返回 NULL。

of_property_count_elems_of_size 函数

函数原型:

int of_property_count_elems_of_size(const struct device_node *np, const char *propname int elem_size)

说明:

用于获取属性中元素的数量,比如 reg 属性值是一个数组,那么使用此函数可以获取到这个数组的大小。

参数:

np设备节点。

proname 需要统计元素数量的属性名字。

elem_size元素长度。

返回值:

得到的属性元素数量。

of_property_read_u32_index 函数

函数

函数原型:


说明:

参数:

返回值: