设备树的概念:
设备树(Device Tree:DT)是用来描述设备信息的一种树形结构。设备树文件在linux内核启动的时候传递到内核被内核解析。设备树中每一个设备节点中的信息构成了一个属性链表,如果驱动想要使用这个设备信息,只需要在这个属性链表中获取即可 。
设备树其实是一个文件,这个文件包含很多的节点,这些节点是专用来描述设备的信息,包括CPU的信息,GPIO的信息等。信息里面包括很多的属性。属性中包括各种值 value,这些 value 是传递给内核使用的。内核可以解析出这些文件信息,然后给程序员使用。
设备树文件格式
***.dts //设备树的源码文件
***.dtsi //设备树源码文件的补充文件(头文件)
|
|
DTC //设备树编译工具 make dtbs
|
|
***.dtb//设备树的 二进制文件
1.设备树从根节点开始描述:/{};
2.node1和node2是根节点的子节点
3.设备树文件中的注释和c文件中一样
4.设备树中每一句话的结束都要以;结尾
5.设备树中节点的属性是一个个的键值对
如何向内核中添加自己的设备节点?
vi 内核源码顶层目录/arch/arm/boot/dts/stm32mp157a-fsmp1a.dts
//自定义设备树
mynode@0x12345678{
compatible = "hqyj,mynode";
astring="hello 22111";
uint =<0xaabbccdd 0x11223344>;
binarry=[00 0c 29 7b f9 be];
mixed ="hello",[11 22],<0x12345678>;
};
如何在驱动中获取到设备树节点信息?
(1)设备树节点结构体
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;//兄弟节点地址
};
(2)属性结构体
struct property {
char *name;//键名
int length;//值的长度
void *value;//值
struct property *next;//指向下一个属性节点的指针
};
(3)获取设备数节点相关API
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
功能:通过节点名字获取设备树节点信息
参数:
from:当前节点父节点,填写NULL,表示默认从根节点开始查找
name:设备树节点名 "mynode"
返回值: 成功返回目标设备树节点结构体指针,失败返回NULL
struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compat);
功能:根据设备树节点在compatible的值来获取设备树节点西悉尼
参数:
from:当前节点父节点,填写NULL,表示默认从根节点开始查找
type:设备类型,填NULL
compat:compatible的值
返回值: 成功返回目标设备树节点结构体指针,失败返回NULL
struct device_node *of_find_node_by_path(const char *path)
功能:根据设备树节点路径来获取设备树节点信息
参数:
path:指定的设备树节点路径 "/mynode@0x12345678"
返回值: 成功返回目标设备树节点结构体指针,失败返回NULL
********实现大小端转换的函数************
__u32 __be32_to_cpup(const __be32 *p)
功能:将32数据大端转小端
__be32 __cpu_to_be32p(const __u32 *p)
32位数小端转大端
(4)获取属性结构体相关API
struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp);
功能:根据设备节点信息结构体解析出指定键名的属性信息
参数:
np:设备树节点指针
name:键名
lenp:解析到的值的长度
返回值:成功返回目标属性结构体指针,失败返回NULL