【Linux驱动开发】设备树详解(一)设备树基础介绍

活动地址:CSDN21天学习挑战赛

【Linux驱动开发】设备树详解(一)设备树基础介绍
【Linux驱动开发】设备树详解(二)设备树语法详解
【Linux驱动开发】设备树详解(三)设备树Kernel解析
 

img
个人主页:董哥聊技术
我是董哥,嵌入式领域新星创作者
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img

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的不同主板,只需更换设备树文件即可实现不同主板的无差异支持,而无需更换内核文件,实现了内核和不同板级硬件数据的拆分

设备树

扫描二维码关注公众号,回复: 14451203 查看本文章

2、设备树的由来

明白了设备树的概念,不妨思考一下:为什么要引入设备树?

Linux内核v2.6版本以前,ARM架构用于描述不同的硬件信息的文件都存放在arch/arm/plat-xxxarch/arm/mach-xxx文件夹下,如下:

image-20220802090504275

在这些文件内,都是通过手动定义不同的硬件设备,步骤非常繁琐

image-20220802091036378

这样就导致了Linux内核代码中充斥着大量的垃圾代码,因为不同的板级他们的硬件信息都不相同,这些都是硬件特有的信息,对内核而言没有任何的意义,但是往往这部分代码特别的多,造成内核的冗余。

设备树的引入就是为了解决这个问题,通过引入设备树,我们可以直接通过它来传递给Linux,而不再需要内核中大量的垃圾代码。

3、设备树组成

整个设备树牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式,又增加了编译这个文本的工具,同时还得支持Bootloader解析设备树,并将信息传递给内核。

整个设备树包含DTC(device tree compiler)DTS(device tree source)DTB(device tree blob)

image-20220802091430298

  • DTS(device tree source)

DTS是一种ASCII文本格式的设备树描述,在ARM Linux中,一个dts文件对应一个ARM的设备,该文件一般放在arch/arm/boot/dts/目录中。

image-20220802091900520

当然,我们还会看到一些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/Makefilehostprogs-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到内存。

总之,三者关系如下

image-20220802091438853

img

猜你喜欢

转载自blog.csdn.net/dong__ge/article/details/126214236
今日推荐