Linux 设备树(二) dtc dts/dtsi dtb的关系

在学习设备树之前,我们先来了解一下跟设备树相关的三个对象,分别是dtc、dts/dtsi、dtb。
dtc:用来编译设备树的工具
dts:设备树描述文件
dtsi:设备树头文件
dtb:编译后的二进制文件

  • dtc设备树编译工具
    dtc是用来编译设备树的工具,就像gcc可以用来编译C语言一样,设备树源文件也需要编译器来对它进行编译,而这个编译器就是dtc。
    dtc工具的源代码在内核根目录下的/scripts/dtc文件夹中,在对应的Makefile中可以看到内核将跟dtc有关的文件都进行编译,最后生成一个可执行程序。
# scripts/dtc makefile

hostprogs-y	:= dtc
always		:= $(hostprogs-y)

dtc-objs	:= dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
		   srcpos.o checks.o util.o
dtc-objs	+= dtc-lexer.lex.o dtc-parser.tab.o

# Source files need to get at the userspace version of libfdt_env.h to compile

HOSTCFLAGS_DTC := -I$(src) -I$(src)/libfdt

HOSTCFLAGS_checks.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_data.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_dtc.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_flattree.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_fstree.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_livetree.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_srcpos.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_treesource.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_util.o := $(HOSTCFLAGS_DTC)

HOSTCFLAGS_dtc-lexer.lex.o := $(HOSTCFLAGS_DTC)
HOSTCFLAGS_dtc-parser.tab.o := $(HOSTCFLAGS_DTC)

# dependencies on generated files need to be listed explicitly
$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h

# generated files need to be cleaned explicitly
clean-files	:= dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h

我们可以在命令行中输入"make dtbs"就可以对设备树文件进行编译
Linux 设备树(二) dtc dts/dtsi dtb的关系_第1张图片
编译后的设备文件后缀为xxx.dtb

  • dts/dtsi:设备树源文件

dts是设备树的源文件,驱动开发者需要在dts文件中构造描述板级的设备树,其位置一般位于内核根目录下的/arch/arm/boot/dts(以arm架构为例)。dts编写好之后会用dtc来进行编译,最后会生成dtb二进制文件。

dtsi:设备树头文件
设备树就像C语言,同样可以进行头文件包含。开发者通常会把同一个品牌芯片的共同点提取出来,将相同的代码写成一个头文件供其他文件包含。包含dtsi文件跟C语言的头文件包含用法一样,也是include"xxx.dtsi"
Linux 设备树(二) dtc dts/dtsi dtb的关系_第2张图片

  • dtb:设备树二进制文件
    dtb是由dts/dtsi被编译后生成的二进制文件,dtb文件是可以被内核解析的文件,所以dtb文件会被烧到系统中,由uboot指定dtb的地址供内核去读取。

下图是dtc、dts/dtsi和dtb的关系
Linux 设备树(二) dtc dts/dtsi dtb的关系_第3张图片
dts和dtsi源文件会经过dtc编译器编译成dtb二进制文件,dtb文件最后会被放到系统中被内核解析。

你可能感兴趣的:(linux)