Device tree是一种机器可读且描述硬件设备的数据结构。它通常用于嵌入式系统,尤其是用于Linux驱动程序。Device tree的目的是允许在不修改内核源代码的情况下向内核提供有关系统硬件的信息。
透过device tree,硬件设备如处理器、杂项控制器 (如PCI,USB、I2C、SPI、GPIO等)、内存、中断、时钟等均可被描述。它通过描述每个设备所拥有的寄存器、中断和其他属性,来说明这些硬件的详细信息。
使用device tree在更改硬件或运行不同的操作系统版本的时候,维护内核和驱动程序之间的接口映射关系。由于内核编译时硬件信息必须已知,通过使用device tree,内核可独立于具体平台地构建,甚至在运行时动态地加载,而在将来的系统支持中只需添加新的device tree即可。
Device tree主要作用有:
Device Tree的结构分为三层:根节点、中间层节点、叶节点。每个设备节点都有一个设备名标识符,该标识符是一个文本字符串,并且需要全局唯一。在device tree中,英文单词只出现在设备名标识符、属性名和属性值之间的分隔符中,而不出现在其他位置。例如,“gpio-controller@48032000”中,gpio-controller既是一个设备名标识符,也是一个属性名。
在device tree中,每个设备节点(non-root)必须包含以下基本属性:
设备树的生成需要在硬件平台的部分文件中添加所需的属性、节点信息,并使用dtc(device tree compiler)编译成设备树二进制文件(.dtb)。在Linux系统启动时,bootloader将此设备树提供给内核,内核解析它以获取硬件信息并相应地初始化设备和驱动程序。
设备树的使用主要有三种方式: