设备描文件
指定一个名为devicetree
的结构来描述系统硬件。 引导程序将devicetree
加载到客户端程序的内存中,并将指向 devicetree
的指针传递给客户端。devicetree
是一种树数据结构,节点描述系统中的设备。 每个节点都有描述所表示设备特性的属性/值对。 每个节点都 有一个父节点,除了根节点。
一个符合设备描述文件
的devicetree
描述了系统中不一定能由客户端程序动态检测的设备信息。例如,PCI
的体系结构使客户端能够探测和检测附加设备,因此可能不需要描述PCI
设备的devicetree
节点。然而,如果无法通过探测检测到PCI
主机桥设备,则需要设备节点来描述系统中的PCI
主机桥设备。
以下显示了一个简单的devicetree
的示例,它几乎完全足以启动一个简单的操作系统,其中描述了平台类型
、 CPU
和内存
以及单个 UART
。 设备节点显示的属性和值显示在每个节点的内部。
设备树组成
设备树包含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
到内存,进而由内核解析。设备树文件的格式
/dts-v1/;
[memory reservations]
/ {
[property definitions]
[child nodes]
};
/dts-v1/标识
: 将文件标识为DTS版本1,没有此标记的dts
文件将被dtc
视为过时的版本0。[memory reservations]
:定义了devicetreeblob的内存保留表的条目。它们有这样的形式/memreserve/ <address> <length>
。其中<address>
和<length>
是64位C语言样式整数。设备树绑定文档
设备树是用来描述板子上的设备信息的,不同的设备其信息不同,反映到设备树中就是属性不同。那么我们在设备树中添加一个硬件对应的节点的时候从哪里查阅相关的说明呢?在Linux 内核源码中有详细的.txt 文档描述了如何添加节点,这些.txt 文档叫做绑定文档,路径为:Linux 源码目录/Documentation/devicetree/bindings
比如我们现在要想在I.MX6ULL
这颗SOC
的I2C
下添加一个节点,那么就可以查看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”; }; ```