为什么要用设备树
如果设备树文件和驱动程序放在一起,每切换一次硬件,就需要重新修改驱动程序,例如更改下载的地址,相对会麻烦,所以渐渐采用驱动程序与设备文件分离的思路,这样硬件更换时,只需重新在内核中解析设备树文件即可。
什么是设备树
设备树(device tree)是描述硬件信息的一种树形结构,设备树文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备树节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储。
设备树的文件格式及节点的命名
DTC是编译设备树的编译工具;
***.dts 是设备树源码文件;
***.dtsi 是设备树的补充文件或者头文件;
***.dtb 是生成设备树的镜像文件;
设备树从节点开始描述 /{},每条语句结束都以;结尾,节点内的属性都是键值对,节点的命名为设备节点名@描述地址。
在驱动程序中如何获取设备树信息
获取设备树节点信息的相关API
根据设备树节点的名字解析设备树节点
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
根据设备树节点路径解析设备树节点
struct device_node *of_find_node_by_path(const char *path)
根据设备树节点中compatibe键来解析设备树节点
struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compat);
关于设备驱动中大小端转换相关API
对于u32需要注意使用__be32_to_cpup大端转小端;对于节点属性,使用节点信息结构体的首地址来获取,太过冗长,所以有对应得解析节点属性API,__be32_to_cpup,获取节点属性结构体首地址;也有一些根据属性值得类型来解析值;例如,of_property_read_u32_index,of_property_read_u32_array,of_property_read_u8_array,of_property_read_string,分别为u32,整型数组,单字节数组,字符串。