linux|设备树描述

设备树描述 【linux|设备树描述】内容来自《linux设备驱动开发详解–基于linux 4.0内核》
设备树是一种描述硬件的数据结构,它起源于OpenFirmware(OF)
在linux 2.6中,ARM架构的板极硬件细节过多的被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx中,采用设备树后,许多硬件的细节可以直接通过它传递给linux,而不再需要在内核中进行大量的冗余编码
1.DTS
设备树由一系列被命名的节点(node)和属性(Property)组成,而节点本身可包含子节点。所谓属性,其实就是成对出现的名称和值。在设备树中,可描述的信息包括(原先这些信息大多被硬编码在内核中):
1.cpu的数量和类别
2.内存基地址和大小
3.总线和桥
4.外设连接
5.中断控制器和中断使用的情况
6.gpio控制器和gpio使用情况
7.时钟控制器和时钟使用情况
它基本上就是画一颗电路板上cpu、总线、设备组成的树,bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、irq等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备
2.DTC(Device Tree Compiler)
DTC是将.dts编译成.dtb的工具,DTC的源代码位于内核的scripts/dtc目录中,在linux内核使能了设备树的情况下,编译内核的时候主机工具DTC会被编译出来,对应于scripts/dtc/Makefile中"hostprogs-y := dtc" 这一hostprogs的编译目标。
当然,DTC也可以在ubuntu中单独安装,命令如下:
sudo apt-get install device-tree-compiler
在linux内核的arch/arm/boot/dts/Makefile中,描述了当某种SoC被选中后,哪些.dtb文件会被编译出来,如与VEXPRESS对应的.dtb包括:
dtb-$(CONFIG_ARCH_VEXPRESS) +=
vexpress-v2p-ca5s.dtb
vexpress-v2p-ca9.dtb
vexpress-v2p-ca15-tc1.dtb
vexpress-v2p-ca15_a7.dtb
在linux下,我们可以单独编译设备树文件。当我们在linux内核下运行make dtbs时,若我们之前选择了ARCH_VEXPRESS,上述.dtb都会由对应的.dts编译出来,因为arch/arm/Makefile 中含有一个.dtbs编译目标的项目
DTC除了可以编译.dts文件以外,其实也可以“反汇编” .dtb文件为.dts文件,其指令格式为:
./scripts/dtc/dtc -I dtb -O dts -o xxx.dts arch/arm/boot/dts/xxx.dtb
3.DTB(Device Tree Blob)
linux 内核也支持一种变通的模式,可以不把.dtb 文件单独存放,而是直接和zImage绑定在一起做成一个镜像文件,类似cat zImage xxx.dtb > zImage_with_dtb 的效果。当然内核编译的时候要使能CONFIG_ARM_APPENDED_DTB这个选项,以支持“Usb appended device tree blob to zImage”
4.绑定(Binding)
对于设备树中的节点和属性具体是如何来描述设备的硬件细节的,一般需要文档来进行讲解,文档的后缀名为 .txt,在这个.txt文件中,需要描述对应节点的兼容性、必需的属性和可选的属性
这些文档位于内核的Documentation/devicetree/bindings目录下,其下又分为很多子目录。
譬如,Documentation/devicetree/bindings/i2c/i2c-xiic.txt描述了Xilinx的I2C控制器其内容如下:
Xilinx IIC controller:
Required properties:

  • compatible : Must be “xlnx,xps-iic-2.00.a”
  • reg : IIC register location and length
  • interrupts : IIC controller unterrupt
  • #address-cells = <1>
  • #size-cells = <0>
  • clocks: Input clock specifier. Refer to common clock bindings.
Optional properties:
  • Child nodes conforming to i2c bus binding
  • clock-names: Input clock name, should be ‘pclk’.
Example:
axi_iic_0: i2c@40800000 { compatible = "xlnx,xps-iic-2.00.a"; clocks = <&clkc 15>; interrupts = < 1 2 >; reg = < 0x40800000 0x10000 >; #size-cells = <0>; #address-cells = <1>; };

基本可以看出,设备树绑定文档的主要内容包括:
关于该模块最基本的描述
必需属性(Required Properties)的描述
可选属性(Optional Properties)的描述
一个实例
linux内核下的scripts/checkpatch.pl会运行一个检查,如果有人在设备树中新添加了compatible字符串,而没有添加相应的文档进行解释,checkpatch程序会爆出警告:
UNDOCUMENTED_DT_STRINGDT compatible string xxx appears un-documented,因此程序员要养成及时写DT Bingding文档的习惯
内容来自《linux设备驱动开发详解–基于linux 4.0内核》

    推荐阅读