设备树定义
设备树(device tree是描述硬件信息的一种树形结构,设备书文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储。
设备树文件格式
内核顶层目录下/arch/arm/boot/dts:设备树文件存放路径
单独编译设备树文件:make dtbs
***.dts//设备树源码文件
***.dtsi //设备树的补充文件或者头文件
|
|
DTC(编译设备树的编译工具)
|
|
***.dtb //编译后设备树的镜像文件
设备树的语法
/dts-v1/; //设备树的版本号
/ { // '/'表示设备树的根节点,所有的节点信息都在根节点内部定义
node1 { //node1是设备树根节点的子节点
a-string-property = "A string"; //node1节点内部的属性,键值对
a-string-list-property = "first string", "second string";
// hex is implied in byte arrays. no '0x' prefix is required
a-byte-data-property = [01 23 34 56];
child-node1 {//node1节点的子节点
first-child-property; //空属性键值对,用来起到标识作用
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 { //根节点的子节点
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
节点命名规则:[@
name指的是节点名字,是一个简单的 ASCII 字符串,长度最多为 31 个字符。通常,节点是根据它所代表的设备类型来命名的。如果节点使用地址描述设备,则包含unit-address ex:GPIO@50006000
键值对格式
属性是简单的键值对,其中值可以为空或包含任意字节流
文本字符串(以 null 结尾)用双引号表示: string-property = "a string";
“cell”是 32 位无符号整数,由尖括号分隔: cell-property = <0xbeef 123 0xabcd1234>;
二进制数据用方括号分隔: binary-property = [0x01 0x23 0x45 0x67];
不同表示形式的数据可以使用逗号连接在一起:
mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
逗号也用于创建字符串列表: string-list = "red fish", "blue fish";
注:在linux中也有一些特殊的键值对,譬如-----》compatible = "厂商,设备名字;
获取设备树节点信息的API
1.struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
功能:根据设备树节点的名字解析设备树节点
参数:
from:当前节点父节点首地址(不知道就填NULL,默认从设备树根节点开始解析)
name:设备树节点名字 mynode
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL2.struct device_node *of_find_node_by_path(const char *path)
功能:根据设备树节点路径解析设备树节点
参数:
path:设备树节点路径 /mynode0x12345678
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL3.struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compat);
功能:根据设备树节点中compatibe键来解析设备树节点
参数:
from:填NULL,默认从根节点开始解析
type:NULL
compat:填写要解析的设备树节点中compatible的值
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL4、struct property *of_find_property(const struct device_node *np,
const char *name, int *lenp)
功能:基于解析后的设备树节点信息结构体解析指定属性键值对
参数: np:设备树节点信息结构体指针 name:指定的键名
lenp:获取到的字节个数
返回值:成功返回属性结构体首地址,失败返回NULL
如果存储方式不同可用一下API进行转换
__u32 __be32_to_cpup(const __be32 *p)
功能:u32类型数据大端转小端
参数:转换的数据首地址
返回值:返回转换后的数值
__be32 __cpu_to_be32p(const __u32 *p)