以前刚刚开始打开源码的时候,发现竟然有的文件是以dts结尾的,感叹一句,就溜了。
后来才知道这个就是设备树文件,这次学习也是因为最近写一点东西需要解析这个文件的参数。我的理解这个本质上就是配置文件,去获取解析设备树得信息,来为程序使用。
为了避免这个任务途中遇到一些不可预料得问题,自己因为基础不扎实,不知道去哪里解决。于是这里来学习一下设备树文件。整个学习路线很简单:
1、设备树是什么?
2、设备树有啥用?
3、设备树怎么用?
至于那些来历啊、传闻啊,确实很有意思,但是有很多的博客和书有写,我就不重复那个部分,来重复一下知识。
1、设备树是什么?
我的理解,就是以前对于很多的冗余重复的东西进行来组件化。以前每个硬件都有自己的代码进行细节描述,但是将这些代码组件化后,你每个板子需要用什么,给你个dts树架子,你需要啥,就选啥,少啥就加啥。
就别重复整了。
同时讲内核和dts组合,那些细节代码哪儿凉快哪里待着,因为我内核是需要接触硬件的一些东西(应用包含了驱动),所以需要板子的细节,但是现在有了dts,那么那些细节代码byebye。
没dts之前–>把板子的信息放在内核的
有dts之后–>dts将硬件细节传输给内核,内核干净了
在设备树中,可描述的信息包括(原先这些信息大多被硬编码在内核中):
·CPU的数量和类别。 ·内存基地址和大小。 ·总线和桥。 ·外设连接。 ·中断控制器和中断使用情况。 ·GPIO控制器和GPIO使用情况。 ·时钟控制器和时钟使用情况。
这些信息都是一些硬件的信息,我最近要解析的就是内存地址,可惜我现在还无从下手。
它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。
这里啰嗦几点:1、dts是描述设备信息(硬件板子)的文本
2、dts不是直接用的,而是编译后给内核用的
3、dts不是直接和内核联系,而是通过bootloader将编译后的文件传输给kernel