linux设备树的解释 - 总览
本文系列文章
建议参考文章Documentation/devicetree/booting-without-of.txt
linux设备树的解释 - 总览
文章从全局介绍了dt使用的整个流程,言简意赅
linux设备树的解释 - DTC编译器
文章介绍了dtc编译器及DT文件组织结构
linux设备树的解释 - DTB文件格式
文章介绍了被编译完成的dtb文件格式,要能够理解内核是怎么把dts转换成device,dtb文件格式是必须了解的
linux设备树的解释 - DT文件数据结构
文章介绍了dts文件里的数据组织结构及各个节点、属性的用途
我们知道linux设备驱动模型是由device-bus-driver组成的,在linux 2.6内核版本上,device是通过arch/arm/mach-some/目录下的board-some-evm.c文件来进行注册的,而到了3.x和4.x版本后,社区引入了设备树(device tree)来代替以前的device注册方法,下面的介绍都是用DT简称来代替设备树
DT使用流程
DT使用流程图,下文详加解释:
1.DT文件在文件夹/arch/*/boot/dts/目录下,由后缀名为dts和dtsi的文件组成,这些文件里的数据组织结构由其它文章介绍,通过dtc编译器最终把dt文件生成为dtb文件,dtb文件会被烧写在 NAND或者SD或者EMMC存储设备上,然后由u-boot传递给linux内核
2.我们知道uboot是一段引导程序,最终会引导启动linux内核,uboot会传递一些参数给内核,对于arm架构来说,ro/r1/r2寄存器上的参数为:
r0 : 0
r1 : Valid machine type number.
r2 : dtb文件在RAM中的物理地址(以前没有dtb文件时,对应的是TAGlist的物理地址).
3.dtb文件传递给内核后,内核会把dtb文件扩展为device_node结构体链表,最终这些结构体会由设备驱动来使用进行device注册,device_node结构体中一些字段对应的含义如下:
struct device_node {
const char *name;------------------name属性对应的值
const char *type;------------------device_type属性对应的值
phandle phandle;-------------------phandle属性对应的值
const char *full_name;-------------节点的全名(如:/cpus/cpu0:V1-3;cpu0:V16)
struct property *properties;------属性链表
struct property *deadprops;-------removed properties
struct device_node *parent;-------父节点
struct device_node *child;--------子节点
struct device_node *sibling;------兄弟节点
struct device_node *next;---------同type下一个节点
struct device_node *allnext;------所有节点的下一个节点
struct kobject kobj;
unsigned long _flags;
void *data;
};
dtb转换为device_node是通过函数drivers/of/fdt.c->unflatten_device_tree->unflatten_dt_node完成的;系统初始化时会初始化platform总线上的设备(有simple-bus来决定),具体操作在drivers/of/platform.c->of_platform_populate函数中,函数会把device_nonde转换为platform_device,然后加入到platform_bus的devices链表中
int of_platform_populate(struct device_node *root,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent)
更多推荐
所有评论(0)