设备描文件指定一个名为devicetree的结构来描述系统硬件。 引导程序将devicetree加载到客户端程序的内存中,并将指向 devicetree的指针传递给客户端。
devicetree是一种树数据结构,节点描述系统中的设备。 每个节点都有描述所表示设备特性的属性/值对。 每个节点都 有一个父节点,除了根节点。
一个符合设备描述文件devicetree描述了系统中不一定能由客户端程序动态检测的设备信息。例如,PCI的体系结构使客户端能够探测和检测附加设备,因此可能不需要描述PCI设备的devicetree节点。然而,如果无法通过探测检测到PCI主机桥设备,则需要设备节点来描述系统中的PCI主机桥设备。
以下显示了一个简单的devicetree的示例,它几乎完全足以启动一个简单的操作系统,其中描述了平台类型CPU内存以及单个 UART。 设备节点显示的属性和值显示在每个节点的内部。
01.设备树简介 - 图1

设备树组成

设备树包含DTC、DTS/DTSI 和DTB。

  • DTS: dts文件是对Device Tree的描述,放置在内核的/arch/arm/boot/dts目录。一个*.dts文件对应一个ARM的machine。dts文件描述了一个板子的硬件资源。以前写在mach-xxx文件中的内容被转成了dts文件。
  • DTSI: 由于一个SOC可能有多个不同的电路板,而每个电路板拥有一个.dts。这些dts势必会存在许多共同部分,为了减少代码的冗余,设备树将这些共同部分提炼保存在.dtsi文件中,供不同的dts共同使用。
  • DTC: DTC为编译工具,它可以将.dts文件编译成.dtb文件。
  • DTB: DTC编译*.dts生成的二进制文件(.dtb),bootloader在引导内核时,会预先读取.dtb到内存,进而由内核解析。

    设备树文件的格式

    1. /dts-v1/;
    2. [memory reservations]
    3. / {
    4. [property definitions]
    5. [child nodes]
    6. };
  • /dts-v1/标识: 将文件标识为DTS版本1,没有此标记的dts文件将被dtc视为过时的版本0。

  • [memory reservations]:定义了devicetreeblob的内存保留表的条目。它们有这样的形式/memreserve/ <address> <length>。其中<address><length>是64位C语言样式整数。

    设备树绑定文档

    设备树是用来描述板子上的设备信息的,不同的设备其信息不同,反映到设备树中就是属性不同。那么我们在设备树中添加一个硬件对应的节点的时候从哪里查阅相关的说明呢?在Linux 内核源码中有详细的.txt 文档描述了如何添加节点,这些.txt 文档叫做绑定文档,路径为:Linux 源码目录/Documentation/devicetree/bindings
    01.设备树简介 - 图2
    比如我们现在要想在I.MX6ULL这颗SOCI2C下添加一个节点,那么就可以查看Documentation/devicetree/bindings/i2c/i2c-imx.txt,此文档详细的描述了I.MX系列的SOC如何在设备树中添加I2C设备节点,文档内容如下所示: ```
  • Freescale Inter IC (I2C) and High Speed Inter IC (HS-I2C) for i.MX Required properties:
  • compatible :
    • “fsl,imx1-i2c” for I2C compatible with the one integrated on i.MX1 SoC
    • “fsl,imx21-i2c” for I2C compatible with the one integrated on i.MX21 SoC
    • “fsl,vf610-i2c” for I2C compatible with the one integrated on Vybrid vf610 SoC
  • reg : Should contain I2C/HS-I2C registers location and length
  • interrupts : Should contain I2C/HS-I2C interrupt
  • clocks : Should contain the I2C/HS-I2C clock specifier Optional properties:
  • clock-frequency : Constains desired I2C/HS-I2C bus clock frequency in Hz. The absence of the propoerty indicates the default frequency 100 kHz.
  • dmas: A list of two dma specifiers, one for each entry in dma-names.
  • dma-names: should contain “tx” and “rx”. Examples: i2c@83fc4000 { / I2C2 on i.MX51 / compatible = “fsl,imx51-i2c”, “fsl,imx21-i2c”; reg = <0x83fc4000 0x4000>; interrupts = <63>; }; i2c@70038000 { / HS-I2C on i.MX51 / compatible = “fsl,imx51-i2c”, “fsl,imx21-i2c”; reg = <0x70038000 0x4000>; interrupts = <64>; clock-frequency = <400000>; }; i2c0: i2c@40066000 { / i2c0 on vf610 / compatible = “fsl,vf610-i2c”; reg = <0x40066000 0x1000>; interrupts =<0 71 0x04>; dmas = <&edma0 0 50>,<&edma0 0 51>; dma-names = “rx”,”tx”; }; ```