OpenBmc开发9:dts简介与使用

1简介

DTS即Device Tree Source 设备树源码,它是一种描述特定计算机的硬件组件的数据结构,操作系统的内核通过该文件可以知道使用和管理那些组件,包括CPU或CPU存储器、总线以及外设。设备数起源于 OpenFirmware (OF),基于SPARC的工作站和服务器派生出。当前的Devicetree规范针对较小的系统,但仍与某些服务器级系统一起使用(例如,《Power Architecture Platform参考》中描述的那些系统)。

在x86架构的个人计算机通常不使用设备树,而是依靠各种自动配置协议来发现硬件。使用设备树的系统通常将静态设备树(可能存储在ROM中)传递给操作系统,但也可以在启动的早期阶段生成设备树。例如,启动新操作系统时,Das U-Boot和kexec可以传递设备树。在具有不支持设备树的引导加载程序的系统上,可能会在操作系统中安装静态设备树。Linux内核便支持这种方法。Devicetree规范当前由一个名为devicetree.org的社区管理,该社区与Linaro和Arm相关联。

对于Linux,给定一个设备树,相同的内核可以支持更广泛的体系结构,以便于适配linux家族中的不同硬件配置,用于ARC,ARM,C6x,H8 / 300,MicroBlaze,MIPS,NDS32,Nios II,OpenRISC,PowerPC,RISC-V,SuperH和Xtensa架构Linux内核读取设备树信息。自2012年以后,在ARM上,所有新SoC都必须使用设备树。可以将其视为对以前创建用于支持(少量)不同ARM板卡(Linux和Das U-Boot)的大量fork的一种补救措施。目的是将硬件描述的重要部分从内核二进制文件中移出,并移到已编译的设备树blob中,该文件由引导加载程序移交给内核。

在Linux 2.6中,ARM架构的板级硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,比如板上的platform设备、 resource、i2c_board_info、spi_board_info以及各种硬件的platform_data,这些板级细节代码对内核来讲只不过是垃圾代码。 而采用Device Tree后,许多硬件的细节可以直接通过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。 每次正式的linux kernel 发行之后都会有两周的merge window,在这个窗口期间,kernel各个部分的维护者都会提交各自的patch, 将自己测试稳定的代码请求并入kernel main line。每到这个时候,Linus就会比较繁忙,他需要从各个内核维护者的分支上取得最新代码 并merge到自己的kernel source tree中。Tony Lindgren,内核OMAP development tree的维护者,发送了一个邮件给Linus, 请求提交OMAP平台代码修改,并给出了一些细节描述:

如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。然后通过DTC(Device Tree Compiler),将这些适合人类阅读的Device Tree source file变成机器可以处理的 Device Tree binary file(有一个很好听的名字,DTB,device tree blob)。在系统启动的时候,boot program (启动参数,例如:firmware、bootloader)可以将保存在flash中的DTB 复制到内存中(也可以通过其他方式, 例如可以通过bootloader的交互式命令加载DTB,或者firmware可以探测到device的信息,组称动态实时的DTB保存到内存中), 最后把DTB的起始地址传递给内核(例如OS kernel,bootloader或者其他特殊功能的程序)。对于一般的计算机,启动顺序是firmware->bootloader->OS,而基于ARM的Linux发行版,通常包含一个引导加载程序,该引导加载程序必须针对特定的板(例如Raspberry Pi或Hackberry A10)进行定制,一般是bootloader->OS。

2 编译工具DTC

DTC即Device Tree Compile,可以将设备树源码DTS文件编译成DTB,也可以反过来将DTB文件反编译成DTS文件。

DTC安装命令

sudo apt install device-tree-compiler

DTC编译命令

dtc -I dts/dtb -O dtb/dts –o outputfile inputfile

详细命令 

 3 dts文件

dts文件在linux-kernel/arch/arm/boot/dts文件夹下,以aspeed-bmc-opp-palmetto.dts文件为例,如下图所示。

 dts文件在linux-kernel/arch/arm/boot/dts文件夹下,以aspeed-bmc-opp-palmetto.dts文件为例,如下图所示。

4 加载dts过程

bootloader启动完成后(这里是uboot),会将DTB的地址传给内核,内核去对应的地址读取DTB文件,然后通过DTB文件加载对应的驱动并创建对应的设备文件。

5 dts修改

以aspeed-bmc-opp-palmetto.dts文件中mac0设备为例:

&mac0 表示mac0设备,该设备在在dtsi文件中有定义。

status 描述设备是否可用,这里“okay”表示启动spi设备,在dtsi中该字段值为"disabled"

use-ncsi 表示使用ncsi驱动

pinctrl-names 引脚名,一般该字段位“default”。

pinctrl-0 mac引脚,后面<&pinctrl_rmii1_default>中的“pinctrl_rmii1_default”在dtsi文件中有定义,表示使用rmii1引脚。

一般dts文件需要包含对应soc的dtsi(Device Tree Source Include)文件,在dtsi文件中会描述soc所支持的设备,如果需要使用某个设备,只需要在dts中打开对应的设备,并指定驱动,如果要使用soc中没有描述的设备,需要在dtsi中添加该设备。

dts文件中,某个设备的compatible字段后的字符串一定要正确,并确保能和驱动中的该字段相匹配。内核加载dtb后,会根据compatible后的字段匹配搜索加载对应的驱动,如果该字段错误,将导致不能加载驱动而不能创建对应的设备。

猜你喜欢

转载自blog.csdn.net/qq_34160841/article/details/107287878
DTS