1.设备树概念:
描述硬件信息的树形结构。描述具体某一个硬件信息的被称为设备节点,每个硬件以树形结构存储,而每个硬件上的属性以链式方式存储。
dts:设备树源文件
dtsi:设备树补充文件
dtb:设备树镜像文件
DTC:设备树编译工具
2.设备树语法:
(1)命名格式:node-name@unit-address(节点名称@单位地址)
节点地址必须与节点的reg属性中指定的第一个地址匹配。根节点没有节点名称和地址,用 / 表示
mynode: mynode@04000000 //label:name@address
label表示给节点名称起的别名。因此可以使用&mynode来访问该节点。
(2)
/{ //表示设备树根节点,所有设备节点都在根节点内部定义
node1{
}
node2{
}
};
(3)键值对格式
string = " hello ";
cell = <0x1234 0xabcd>; 无符号整数
binary = [00 01 11] 二进制数
mixed = " hello" ,<0x1234 0x1122>,[00 01] 不同形式的数以 ,进行分隔
string-list ="abc","xyz" 字符串列表
(4)标准属性
compatible: ("厂商,设备名称") 客户端程序使用此字符串列表选择设备驱动程序。
reg:描述设备节点的地址
#address-cells = ; //address_cells用于描述当前子节点硬件设备地址 的无符号32整型数的个数
#size-cells = ;//size_cell 用于描述硬件地址的长度的32无符号整型数的个数
status:表示当前设备是否可用
phandle:设备树中唯一节点的数字标识
(5)基本设备节点
所有设备树文件都要包含一个根节点,且根节点下要有一个/cpu,至少有一个/memory
/memory:内存设备节点 ,描述物理内存分布
/choose: 不代表实际的设备,表示运行时系统固件选择和指定参数---跟uboot中设置bootcmd作用一样
/cpu:cpu节点
3.设备树API
//设备树节点信息结构体
#include<linux/of.h>
struct device_node {
const char *name; //设备树节点名 mynode
const char *full_name;//完整的设备树节点名 mynode@0x12345678
struct property *properties;//属性链表头节点
struct device_node *parent;//父节点地址
struct device_node *child;//子节点地址
struct device_node *sibling;//兄弟节点地址
};
//设备树属性结构体
struct property {
char *name;//键名
int length;//值的长度
void *value;//值
struct property *next;//下一个属性结构体首地址
};
(1)获取设备树节点信息
1.struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
功能:根据设备树节点的名字解析设备树节点
参数:
from:当前节点父节点首地址(不知道就填NULL,默认从设备树根节点开始解析)
name:设备树节点名字 mynode
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL
--------------------------------------------------------------------------------
2.struct device_node *of_find_node_by_path(const char *path)
功能:根据设备树节点路径解析设备树节点
参数:
path:设备树节点路径 /mynode0x12345678
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL
--------------------------------------------------------------------------------
3.struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compat);
功能:根据设备树节点中compatibe键来解析设备树节点
参数:
from:填NULL,默认从根节点开始解析
type:NULL
compat:填写要解析的设备树节点中compatible的值
返回值:成功获取到解析的设备树节点信息结构体首地址,失败返回NULL
用户机数据存储模式为小端存储,而开发板为大端存储。因此需要进行大小端转换
__u32 __be32_to_cpup(const __be32 *p)
功能:u32类型数据大端转小端
参数:转换的数据首地址
返回值:返回转换后的数值
----------------------------------------------
__be32 __cpu_to_be32p(const __u32 *p)
功能:u32类型数据小端转大端
参数:转换的数据首地址
返回值:返回转换后的数值
(2)获取设备树节点属性信息
struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp)
功能:基于解析后的设备树节点信息结构体解析指定属性键值对
参数:
np:设备树节点信息结构体指针
name:指定的键名
lenp:获取到的字节个数
返回值:成功返回属性结构体首地址,失败返回NULL