Linux设备树
设备树的产生是为了解决内核源码的arch/arm目录下代码混乱和臃肿的问题(过去每个厂商出个板子就要提供外设硬件和平台硬件信息,这些信息以.c和.h文件的形式呈现)。在使用设备树之后,就使得每个硬件平台的硬件资源仅需要一个设备树文件来描述了,而不用在内核源码的arch/arm下以.c 或 .h 文件来定义。Linux内核则在启动过程中,通过解析设备树中的硬件资源来初始化某个具体的平台。
DTS、DTB、DTC三者的关系
DTS是设备树源码文件;
DTB是DTS编译后得到的二进制文件;
DTC则是将 .dts 文件编译成 .dtb 文件的编译工具。
编译DTS文件
在内核源码的 arch/arm/boot/dts/ 目录下的 Makefile 文件中添加 DTS 文件的信息,即将文件名添加进去,添加位置如下图。(先确定SOC的类型,我的是IMX6ULL,再写入板子的名字,名字是自定义的)
然后回到内核源码根目录,执行如下命令进行编译
make dtbs
或者
make all
设备树的头文件
设备树可以用 .h 文件作为头文件,并且它也有另一种头文件,即 .dtsi 文件,并且都是用 #include 来引用的。
一般 .dtsi 文件用于描述 SOC 的内部外设信息。
示例:在 imx6ull-alientek-emmc.dts 文件中就引用了如下两个头文件。
在 imx6ull.dtsi 文件中的描述内容(简化后只留下树节点)如下:
#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"
#include "skeleton.dtsi"
/ {
aliases {};
cpus
{
cpu0: cpu@0 {};
};
intc: interrupt-controller@00a01000 {};
clocks
{
ckil: clock@0 {};
osc: clock@1 {};
ipp_di0: clock@2 {};
ipp_di1: clock@3 {};
};
soc
{
busfreq {};
pmu {};
ocrams: sram@00900000 {};
ocrams_ddr: sram@00904000 {};
ocram: sram@00905000 {};
dma_apbh: dma-apbh@01804000 {};
gpmi: gpmi-nand@01806000{};
aips1: aips-bus@02000000
{
spba-bus@02000000
{
spdif: spdif@02004000 {};
ecspi1: ecspi@02008000 {};
ecspi2: ecspi@0200c000 {};
ecspi3: ecspi@02010000 {};
ecspi4: ecspi@02014000 {};
uart7: serial@02018000 {};
uart1: serial@02020000 {};
esai: esai@02024000 {};
sai1: sai@02028000 {};
sai2: sai@0202c000 {};
sai3: sai@02030000 {};
asrc: asrc@02034