一. 简介
前面说过,在新版本的 Linux 中,ARM 相关的驱动全部采用了设备树(也有支持老式驱动的,比较少),最新出的 CPU 其驱动开发也基本都是基于设备树。所以,掌握设备树是 Linux 驱动开发人员必 备的技能!
本文学习一下 设备树源文件 即 dts文件,以及 dts文件的组织形式。
二. dts文件(设备树源文件)以及组织形式
1. DTS、DTB 和 DTC 几个区别?
设备树源文件扩展名为.dts,但是我们在前面移植 Linux 的时候却一直在使用 .dtb 文件,那么 DTS 和 DTB 这两个文件是什么关系呢?
DTS 是设备树源码文件,DTB 是将 DTS 编译以后得到的二进制文件。将 .c 文件编译为 .o 需要用到 gcc 编译器,那么将.dts 编译为.dtb 需要什么工具呢?需要用到 DTC 工具!DTC 工具源码在 Linux 内核的 scripts/dtc 目录下。
2. 编译设备树
编译设备树文件的方法有几种。如下:
(1) 方法一:直接编译内核源码,就同时编译了设备树文件。进入 Linux内核源码,输入如下命令:
make all
“make all” 命令是编译 Linux 源码中的所有东西,包括 zImage,.ko 驱动模块以及设备树。
(2) 方法二:编译所有的设备树文件。进入 Linux内核源码的根目录下,输入如下命令编译:
make dtbs
(3) 方法三:如果只编译指定的一个设备树文件。
例如,只编译针对 imx6ull 的 EMMC开发板的设备树文件时,(假如 IMX6ULL的 EMMC开发板对应的设备树源文件为 imx6ull-alientek-emmc.dts)则运行 make imx6ull-alientek-emmc.dtb 命令来编译。输入如下命令:
make imx6ull-alientek-emmc.dtb
3. 如何确定编译哪一个 DTS 文件呢?
基于
ARM
架构的
SOC
有很多种,一种
SOC
又可以制作出很多款板子,每个板子都有一个对应的
DTS
文件,那么如何确定编译哪一个
DTS
文件呢?我们就以
I.MX6ULL
这款芯片对
应的板子为例来看一下,打开
arch/arm/boot/dts/Makefile
,有如下内容:
dtb-$(CONFIG_SOC_IMX6UL) += \
imx6ul-14x14-ddr3-arm2.dtb \
imx6ul-14x14-ddr3-arm2-emmc.dtb \
imx6ul-14x14-ddr3-arm2-flexcan2.dtb \
imx6ul-9x9-evk-btwifi.dtb \
imx6ul-9x9-evk-csi.dtb \
imx6ul-9x9-evk-ldo.dtb
dtb-$(CONFIG_SOC_IMX6ULL) += \
imx6ull-14x14-ddr3-arm2.dtb \
imx6ull-14x14-ddr3-arm2-adc.dtb \
imx6ull-14x14-ddr3-arm2-cs42888.dtb \
imx6ull-14x14-ddr3-arm2-wm8958.dtb \
imx6ull-14x14-evk.dtb \
imx6ull-14x14-evk-btwifi.dtb \
imx6ull-14x14-evk-emmc.dtb \
imx6ull-14x14-evk-gpmi-weim.dtb \
imx6ull-alientek-nand.dtb \
imx6ull-14x14-evk-usb-certi.dtb \
可以看出,当选中
I.MX6ULL
这个
SOC
以后
(CONFIG_SOC_IMX6ULL=y)
,所有使用到I.MX6ULL
这个
SOC
的板子对应的
.dts
文件都会被编译为
.dtb
。
如果我们使用
I.MX6ULL
新做
了一个板子,只需要新建一个此板子对应的
.dts
文件,然后将对应的
.dtb
文件名添加到
dtb-
$(CONFIG_SOC_IMX6ULL)
下。这样在编译设备树的时候,就会将对应的
.dts
编译为二进制的
.dtb
文件。