1). 简介
设备树(Device Tree)是一种用来描绘体系硬件的数据结构,一些硬件设备设计机制便是可被体系发现的(如PCI Express或许USB总线),而有一些则不是(尤其是内存映射外设)。关于后一种状况,不同于X86架构体系选用BIOS和操作体系交流硬件拓扑信息,ARM Linux一般状况是将硬件设备描绘硬编码到体系内核(Linux Kernel)中,但由于ARM嵌入式设备的多样和离散性,即便如此也不能确保掩盖到一切设备,并且长久以来给ARM Linux内核代码保护造成了很大担负;根据这种状况,设备树的概念就被提出,将ARM SOC和板卡硬件渠道描绘信息从内核独立出来成为设备树文件,经过bootloader传递给内核来辨认当时渠道设备并加载相应的资源和驱动,这样就把ARM嵌入式Linux 内核一致起来,更好的利于内核保护,而关于广泛的ARM嵌入式设备体系保护和搬迁也更便利和有效率。
设备树机制从Linux 内核3.2 版别左右开端选用,其不只能够界说ARM SoC内部内存映射外设,还能够界说整个板卡,下面就以Toradex Colibri VF61计算机模块调配Colibri Eva Board为例来展现设备树的具体运用,其他关于设备树的更深化介绍,请参阅这儿。
2). 设备树文件阐明
Toradex ARM计算机模块工业产品级Embedded Linux源代码下载及编译攻略请见这儿,其间设备树文件坐落Kernel 源代码 arch/arm/boot/dts/ 目录下。
产品系列 |
SoC |
Image 版别 |
SoC 等级 |
模块等级 |
Eva Board等级 |
Colibri VF50 |
NXP/Freescale Vybrid |
V2.3Beta5 onwards |
vf500.dtsi |
vf500-colibri.dtsi |
vf500-colibri-eval-v3.dts |
Colibri VF61 |
NXP/Freescale Vybrid |
V2.3Beta5 onwards |
vf610.dtsi |
vf610-colibri.dtsi |
vf610-colibri-eval-v3.dts |
Colibri iMX6DL/S |
NXP/Freescale i.MX6 |
all compatible |
imx6q.dtsi |
imx6qdl-colibri.dtsi |
imx6dl-colibri-eval-v3.dts |
Apalis iMX6Q/D |
NXP/Freescale i.MX6 |
V2.3Beta3 onwards |
imx6q.dtsi |
imx6qdl-apalis.dtsi |
imx6q-apalis-eval.dts |
设备树一般由多等级的多个设备树文件构成,一个设备树文件(dts 和dtsi)能够包括其他一个可包括设备树文件(dtsi),如一个板卡级设备树文件(dts)一般会包括其所运用的SoC等级的设备树文件(dtsi)。如上图所示,为了支撑Toradex产品,界说了三个等级的设备树文件:载板等级,模块根本以及SoC等级,这些差异也体现在了设备树文件的命名上面。
载板等级的设备树文件(如vf610-colibri-eval-v3.dts)界说自Colibri Eva Board载板,但根据Colibri模块的规范界说,相同也兼容于其他Colibri载板(如Iris载板);不过假如用户针对自己运用定制了载板,则需要对应定制化设备树文件以便使能非默许界说功用设备(如第二个网口)或许封闭一些无用的设备。
设备树文件(dts)最终要被编译成设备树二进制文件(dtb)以供Linux 内核发动加载所运用,所需的编译器也都集成在Linux源文件里边能够直接调用,从后边的示例能够看到具体的编译办法。
设备树文件的根本单元是node,一个设备树文件只能有一个root node (/),其他node依照parent/child node以树状结构散布,每个node里边包括一些property/value来描绘该node特性,如下面是一个UART 设备的描绘;其他低等级设备树文件的界说能够在更高等级的设备树文件中从头界说或许更改,最终生成的二进制文件以最终一次界说为准,因而咱们定制化设备树文件时分一般只定制修正最高等级的载板级设备树文件即可;更具体的关于设备树文件语法的阐明请见这儿。
3). 定制设备树文件
本文以Colibri VF61计算机模块和Eva board载板为例,定制设备树文件以使能GPIO和CAN bus。Colibri Vybird系列产品设备树文件的架构如下图所示:
a). 创立新的载板等级设备树文件,这儿为了便利直接仿制vf610-colibri-eval-v3.dts
—————————————————————————————-
$ cp arch/arm/boot/dts/vf610-colibri-eval-v3.dts arch/arm/boot/dts/vf610-colibri-my-carrier.dts
—————————————————————————————-
b). 修正设备树文件vf610-colibri-my-carrier.dts,将默许装备为PWM设备管脚装备为GPIO
—————————————————————————————-
$ vi vf610-colibri-my-carrier.dts
——————-
//增加下面内容于设备树文件中
c). 装备编译环境并编译新的设备树文件
./ 装置穿插编译Tool Chain,请从这儿下载
—————————————————————————————-
$ tar xvf gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz
$ ln -s gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf gcc-linaro
—————————————————————————————-
./ 装备环境变量
—————————————————————————————-
$ export ARCH=arm
$ export PATH=~/gcc-linaro/bin/:$PATH
$ export CROSS_COMPILE=arm-linux-gnueabihf-
—————————————————————————————-
./ 修正arch/arm/boot/dts/Makefile文件, 刺进”vf610-colibri-my-carrier.dtb”
—————————————————————————————-
dtb-$(CONFIG_SOC_VF610) += \
vf500-colibri-eval-v3.dtb \
vf610-colibri-eval-v3.dtb \
vf610-colibri-my-carrier.dtb \
vf500-colibri-dual-eth.dtb \
vf610-colibri-dual-eth.dtb \
vf610-cosmic.dtb \
vf610-twr.dtb
—————————————————————————————-
./ 编译设备树文件,源代码根目录linux-toradex下,生成的文件能够在arch/arm/boot/dts/下找到
—————————————————————————————-
$ make colibri_vf_defconfig
$ make dtbs
—————————————————————————————-
4). 布置新的设备树文件并测验
a). 将新的设备树文件”vf610-colibri-my-carrier.dtb”放置到方针板Colibri VF61 Linux体系 /boot目录下
b). 如下修正方针板 uboot环境变量
—————————————————————————————-
$ setenv fdt_board my-carrier
$ saveenv
—————————————————————————————-
c). 重启后则体系加载新的设备树文件
下面两个截图分别是更改前和更改后运用Toradex供给的GPIOConfig东西对PWM对应管脚进行检查,能够看到由本来的PWM特点变成了GPIO,修正成功后则能够依照这儿的阐明直接调用GPIO运用。
d). 关于CAN,Colibri VF61支撑两个CAN接口,CAN0和CAN1,在设备树中使能CAN设备示例如下
./ 修正vf610-colibri-my-carrier.dts,增加下面内容
./ 和上述办法相同从头编译设备树文件后布置,然后就能够在体系中调用CAN了,更具体的阐明能够参阅这儿。