设备树
定义
设备树是描述硬件信息的一种树形结构,设备树文件会在内核启动后被内核解析得到对应设备的具体信息。
树形结构就自然会存在节点,硬件设备信息就存储再设备树中的节点上,即设备节点。而一个设备节点中可以存储硬件的多个不同属性,这些不同的属性是以链表的形式进行存储。
文件格式
以***.dts结尾的是设备树源码文件
以***.dtsi结尾的是设备树补充文件或头文件
设备树的编码工具是DTC
以***.dtb结尾的是设备树编译后的镜像文件
语法
设备树是由属性和节点构成的简单树形结构。其中节点又可以包含属性和子节点。
- 节点的命名规则
- <name>[@<unit-address>]
name指的是节点名,类型为ASCII字符串,长度为31个字符。后面是可选的对应地址。
- <name>[@<unit-address>]
- 属性键值对
属性为键值对类型,值可以为空或包含任意的字节流。
设备树源文件中也有一些基本数据表示形式"字符串",<无符号整数>,[二进制数据]
设备树信息解析相关函数
1. struct device_node *of_find_node_by_name(struct device_node *from,const char *name);
功能:根据设备树节点的名字解析设备树节点
参数:
from:当前节点的父节点首地址,如果填写NULL则默认从设备树的根结点开始解析
name:当前节点名字
返回值:解析成功返回设备树节点信息结构体首地址,失败返回NULL
2.struct device_node *of_find_node_by_path(const char *path)
功能:通过设备树节点路径解析设备树节点
参数:
path:设备树节点对应的路径
返回值:解析成功返回设备树节点信息结构体首地址,失败返回NULL
3.struct device_node *of_find_compatible_node(struct device_node *from, const char *type, const char *compat);
功能:根据compatible键来解析设备树节点
参数:
from:当前节点的父节点首地址,如果填写NULL则默认从设备树的根结点开始解析
type:匹配device_type,填NULL表示忽略此选项
compat:填写要解析的设备树节点中compatible的值
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL
注:由于电脑和开发板的无符号整型存储方式可能不同所以需要用__be32_to_cpup一类函数来进行格式转换
由于上述函数找到的设备树节点信息结构体中包含的属性信息可能很多,若都是用指针偏移非常不方便,因此可以用以下函数来找到具体属性键值对
struct property *of_find_property(const struct device_node *np,const char *name, int *lenp)
功能:基于解析后的设备树节点信息结构体解析指定属性键值对
参数:
np:设备树节点信息结构体指针
name:指定的键名
lenp:获取到的字节个数
返回值:成功返回属性结构体首地址,失败返回NULL