1、简介
设备树是一个描述设备信息如CPU数量、外设、内存等的树型结构文件。语法类似css。
根节点:
/ {
//属性......
//一级子节点......
};
节点格式:
标号 : 节点名@地址{
//属性......
//子节点......
};
" & "的作用:
” & “表示追加。加在节点名前,表示追加该节点的内容。如追加相同属性内容则会覆盖之前内容。
&标号(节点名){
//属性......
//子节点......
};
2、特殊节点
3、常用属性
compatible 属性
compatible 属性的值是一个字符串列表,compatible 属性用于将设备和驱动绑定起来。
compatible = "manufacturer,model","manufacturer2,model2";
manufacturer 表示厂商,model 一般是模块对应的驱动名字。
#address-cells和#size-cells属性
#address-cells 和**#size-cells**用于描述子节点的地址信息。#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位),#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。
reg = <address1 length1 address2 length2 address3 length3……> //reg属性格式
如#address-cells = <1>,#size-cells = <0>,说明子节点 reg 属性中起始地址所占用的字长为 1,地址长度所占用的字长为 0。没有 length 的值,相当于设置了起始地址,而没有设置地址长度。
reg 属性
reg 属性的值一般是(address,length)对。reg 属性一般用于描述设备地址空间资源信息。
如
reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE */
0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */
0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */
0X0209C000 0X04 /* GPIO1_DR_BASE */
0X0209C004 0X04 >; /* GPIO1_GDIR_BASE */
model 属性
model 属性值是一个字符串,一般 model 属性描述设备模块信息。
model = "mpu6050-imu";
status 属性
描述设备状态,字符串类型;
可选的状态如表所示:
值 | 描述 |
---|---|
“okay” | 表明设备是可操作的。 |
“disabled” | 表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。 |
“fail” | 表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。 |
“fail-sss” | 含义和“fail”相同,后面的 sss 部分是检测到的错误内容。 |
ranges 属性
ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字
矩阵,ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度
这三部分组成:
child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址
所占用的字长。
parent-bus-address:父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物
理地址所占用的字长。
length:子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。
如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换。
4、OF函数
既然有了设备树描述的设备信息,那么就应有提取信息的函数。于是OF函数就解决这一问题的。
of_find_node_by_name
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
of_find_node_by_type 函数通过 device_type 属性查找指定的节点。
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
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,表示忽略掉 device_type 属性。
compatible:要查找的节点所对应的 compatible 属性列表。
**返回值:**找到的节点,如果为 NULL 表示查找失败
of_find_matching_node_and_match
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。
**返回值:**找到的节点,如果为 NULL 表示查找失败
of_find_node_by_path
of_find_node_by_path 函数通过路径来查找指定的节点。
inline struct device_node *of_find_node_by_path(const char *path)
path:带有全路径的节点名,可以使用节点的别名,比如“/backlight”就是 backlight 这个节点的全路径。
**返回值:**找到的节点,如果为 NULL 表示查找失败