【一文秒懂】Linux设备树详解
Jan 19, 2024
本文阅读量次【一文秒懂】Linux设备树详解 # 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. ...