活动地址:CSDN21天学习挑战赛
【Linux驱动开发】设备树详解(一)设备树基础介绍
【Linux驱动开发】设备树详解(二)设备树语法详解
【Linux驱动开发】设备树详解(三)设备树Kernel解析
个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得!
文章目录
1、Linux设备树概念
Linux内核是从V2.6开始引入设备树的概念,其起源于
OF:OpenFirmware
, 用于描述一个硬件平台的硬件资源信息,这些信息包括:CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况等等。
官方说明:
The “Open Firmware Device Tree”, or simply Device Tree (DT), is a data structure and language for describing hardware.
设备树是一种数据结构和一种用于描述硬件信息的语言。
设备树的特点:
- 实现驱动代码与设备硬件信息相分离。
- 通过被
bootloader(uboot)
和Linux
传递到内核, 内核可以从设备树中获取对应的硬件信息。 - 对于同一SOC的不同主板,只需更换设备树文件即可实现不同主板的无差异支持,而无需更换内核文件,实现了内核和不同板级硬件数据的拆分。
2、设备树的由来
明白了设备树的概念,不妨思考一下:为什么要引入设备树?
在
Linux
内核v2.6版本以前,
ARM
架构用于描述不同的硬件信息的文件都存放在
arch/arm/plat-xxx
和
arch/arm/mach-xxx
文件夹下,如下:
在这些文件内,都是通过手动定义不同的硬件设备,步骤非常繁琐
这样就导致了
Linux
内核代码中充斥着大量的垃圾代码,因为不同的板级他们的硬件信息都不相同,这些都是硬件特有的信息,对内核而言没有任何的意义,但是往往这部分代码特别的多,造成内核的冗余。
设备树的引入就是为了解决这个问题,通过引入设备树,我们可以直接通过它来传递给
Linux
,而不再需要内核中大量的垃圾代码。
3、设备树组成
整个设备树牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式,又增加了编译这个文本的工具,同时还得支持
Bootloader
解析设备树,并将信息传递给内核。
整个设备树包含
DTC(device tree compiler)
,
DTS(device tree source)
和
DTB(device tree blob)
。
- DTS(device tree source)
DTS
是一种
ASCII
文本格式的设备树描述,在
ARM Linux
中,一个
dts
文件对应一个
ARM
的设备,该文件一般放在
arch/arm/boot/dts/
目录中。
当然,我们还会看到一些
dtsi
文件,这些文件有什么用呢?
Dtsi:由于一个
SoC
可能对应多个设备(一个SoC可以对应多个产品和电路板),这些.dts文件势必须包含许多共同的部分,Linux内核为了简化,把SoC公用的部分或者多个设备共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的设备对应的.dts就包括这个.dtsi 。
- DTC(device tree compiler)
DTC
是将
.dts
编译为
.dtb
的工具,相当于gcc。
DTC
的源代码位于内核的
scripts/dtc
目录中, 在
Linux
内核使能了设备树的情况下, 编译内核的时候,工具
DTC
会被编译出来, 对应于
scripts/dtc/Makefile
中
hostprogs-y:=dtc
这一编译目标。
该工具一般在编译内核的时候,默认会自动执行编译操作,如果我们想单独编译设备树,该怎么办呢?
两条编译命令:
将dts文件编译为dtb
dtc -I dts -O dtb xxx.dtb xxx.dts
将dtb文件反编译为dts
dtc -I dtb -O dts xxx.dts xxx.dtb
- DTB(device tree blob)
dtb文件是.dts 被 DTC 编译后的二进制格式的设备树文件,它由Linux内核解析,也可以被bootloader进行解析。
通常在我们为电路板制作NAND、SD启动映像时,会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导内核的过程中,会先读取该.dtb到内存。
总之,三者关系如下:
版权归原作者 卐一十二画卐 所有, 如有侵权,请联系我们删除。