DTS文件
文件.dts是一种ASCII文本格式的设备树描述,由于其是纯文本形式的,所以十分适合开发人员阅读和修改。由于多个开发板会对应于同一款SoC,所以,可以将关于同一款SoC的DT配置提取成一个单独文件,称其为.dtsi文件。.dts和.dtsi文件类似于C语言的源文件和头文件的关系,所以.dtsi同样可以包含其他的.dtsi文件。
ARM平台下的.dts相关的文件描述,一般都放在/arch/arm/boot/dts子目录下。关于DT文件的基本语法的使用,可以参考。
DTC
DTC(Device Tree Compiler)是DTS的编译/反编译的工具,同样,其非常类似于GNU的gcc编译器。它可以将.dts源文件编译成Linux内核可以识别的二进制文件.dtb。
Ubuntu系统下,DTC默认是没有安装的,可以通过如下命令进行安装:
sudo apt-get isntall device-tree-compiler
Linux内核编译过程中,我们可以使用make dtbs命令,对于.dts文件进行编译,编译出来的.dtb文件位于/arch/arm/boot/dts子目录下。
DTC也可以将.dtb文件反编译为.dts文件(在调试.dtb存在问题,可以通过DTC将其反编译为.dts文件,那么就可以进一步的确定问题的根源)。反编译的命令如下:
`dtc -I dtb -O dts -o ***.dts ***.dtb`
DTB
.dtb文件是.dts文件经过DTC进行编译后产生的二进制文件,该二进制文件为结构化的文件,其包括文件头、文件内容等其它内容。真实情况下,我们在制作电路板的NAND系统分区时,会为DTB文件单独保留一块分区。系统启动时,BootLoader(必须具有DT处理功能)会读取DTB分区中的数据,并将其加载到内存的固定区域,Linux内核会读取该区域的DTB数据,并将其进行解析成结构化的设备配置供内核使用。
对于不支持DT的BootLoader,可以将DTB与Linux kernel的image文件绑定为一个文件,这需要再配置内核时使能CONFIG_ARM_APPENDED_DTB选项。
Bindings文件
在Linux内核的./Documentation/devicetree/bindings/目录下,每个使用到了DT的驱动都定义了dts文件的配置方式。
bindings文件详细描述了设备如何在设备树中定义节点和属性,通过参考该文件基本可以写出针对于该设备的设备树描述。例如,对于gpio-fan的配置如下:
Bindings for fan connected to GPIO lines Required properties: - compatible : "gpio-fan" - gpios: Specifies the pins that map to bits in the control value, ordered MSB-->LSB. - gpio-fan,speed-map: A mapping of possible fan RPM speeds and the control value that should be set to achieve them. This array must have the RPM values in ascending order. Optional properties: - alarm-gpios: This pin going active indicates something is wrong with the fan, and a udev event will be fired. Examples: gpio_fan { compatible = "gpio-fan"; gpios = <&gpio1 14 1 &gpio1 13 1>; gpio-fan,speed-map = <00 3000 1 6000 2>; alarm-gpios = <&gpio1 15 1>; };
设备树的绑定文档主要包括如下内容:
- 关于该模块最基本的描述
- 必需属性描述(Required properties)
- 可选属性描述(Optional properties)
- 一个实例
编写bindings文件是编写设备驱动程序的好习惯,这样非常便于开发人员快速的编写出DT描述。
#BootLoader支持 U-boot从v1.1.3开始支持设备树功能,同时在ARM内核支持设备树时,U-Boot同样实现了对于ARM平台下的设备树支持。
U-Boot可以从NAND、SD或者TFTP中提取DTB文件到特定的内存中,而后Linux内核可以从该内存中读取DTB文件。U-boot在命令行下,可以使用fdt addr配置DTB在内存中的存放位置,如:
U-Boot> fdt addr 0x81000000