设备树(Device Tree)是一种描述硬件的数据结构,可以把嵌入式系统资源抽象成一颗树形结构,可以直观查看系统资源分布。内核可以识别这棵树,并根据它展开出Linux内核的platfrom_device等。
设备树是一种简单的节点和属性的树形结构。属性是键值对,而节点可能包括属性和子节点。画一颗电路板上CPU、总线、设备组成的树,内核根据这棵树展开出platform_device、i2c_client、spi_device等设备,并根据节点注册相关设备。
设备树由一系列node(节点)和property(属性)组成,节点本身可包含更多的子节点。属性是成对出现的name-value键值对。在device tree中主要描述如下信息:
- CPU的数量及类别
- 内存基地址和size
- 总线和桥
- 外设连接
- 中断
- GPIO
- CLOCK
Device Tree在内核的作用类似于描述出PCB上的CPU、内存、总线、设备及IRQ GPIO等组成的tree结构。然后经由bootloader传递给内核,内核再根据此设备树解析出需要的i2c、spi等设备,然后将内存、IRQ、GPIO等资源绑定到相应的设备。
当前的device tree主要应用于ARM、X86、Microblaze、PowerPC等架构中并向其他的平台进行扩展,以便在基于kernel架构下完成平台设备描述的统一化,所有的设备在平台上都以设备树的形式进行注册,而系统可以通过设备树的解析来完成相关设备的查找和。
设备树的规范可以参照 Source)就是我们经常修改的*.dts和*.dtsi文件。DTB(DeviceTree Blob)是由DTS编译成的二进制文件,用于嵌入式系统中。
设备树改变了原来用hardcode方式将HW配置信息嵌入到内核代码的方法,消除了arch/arm下大量的冗余编码。使得各个厂商可以更专注于driver开发,开发流程遵从mainline kernel的规范。