Linux 设备树 devicetree(DTS)入门
内容提要
ARM devicetree是为了解决ARM Linux中冗余代码和缺乏引导标准的问题而引入的。它通过使用描述性的数据结构替代将硬件设备配置信息硬编码到内核代码中的方式。DTS描述了设备树的结点和属性,包括CPU、内存、定时器和外设连接等信息。DTS文件可以转换为dtb文件,内核通过解析dtb文件来初始化设备平台。DTS文件中的node节点可以通过compatible属性匹配驱动代码。DTS文件还支持include方式和默认变量配置。
延伸解读
设备树如何改变ARM Linux的硬件描述方式
文章指出,过去ARM Linux将硬件配置硬编码在内核中,导致代码冗余且难以移植。设备树将硬件拓扑和资源信息从内核代码中剥离,改由引导加载程序传递一个描述性的数据结构。这一转变使板级特定代码被移除,内核只需解析dtb即可初始化设备,提高了代码复用性和可维护性。
compatible属性:驱动匹配与设备初始化的关键
DTS中每个节点的compatible属性是驱动匹配的核心。内核初始化设备驱动时,会根据compatible字符串决定是否执行对应的probe函数。如果匹配不到,设备就不会初始化。这种机制允许在编译内核后,仍能通过DTS选配启动哪些硬件,避免启动不必要的功能,尤其适合需要精简的嵌入式设备。
reg和interrupts数值的具体含义与解析
reg和interrupts中的数值并非随意填写,而是有严格定义。例如,#interrupt-cells = <3>表示中断由三部分组成:中断类型(0为SPI,1为PPI)、中断号和触发方式(1上升沿、2下降沿、4高电平、8低电平)。#address-cells和#size-cells则决定reg中地址和长度的编码位数,如64位地址需用两个32位单元表示。理解这些编码规则是正确配置DTS的基础。
DTS的复用与调试:include和文档查阅
DTS支持通过include方式复用节点描述,可将通用配置放在dtsi文件中,再在具体dts中引入,减少重复。当遇到不熟悉的节点属性时,可根据compatible字符串在Documentation/devicetree/目录下查找说明,若仍不清楚则需查阅驱动代码。这种从文档到代码的排查路径,是解决DTS配置问题的常用方法。
Q&A
什么是ARM设备树(devicetree)?
ARM设备树是一种描述性的数据结构,用于替代将硬件设备配置信息硬编码到内核代码中的方式,主要用于ARM Linux系统。
DTS文件和DTB文件有什么区别?
DTS文件是设备树源文件,包含设备的描述信息,而DTB文件是经过编译的二进制格式,内核通过解析DTB文件来初始化设备。
如何将DTS文件转换为DTB文件?
可以使用dtc工具进行转换,命令为:dtc -I dts -O dtb test.dts -o test.dtb。
DTS文件中的compatible属性有什么作用?
compatible属性用于匹配驱动代码,内核在初始化设备驱动时根据该属性决定是否加载相应的驱动。
DTS文件支持哪些设备配置?
DTS文件支持多种设备配置,包括CPU、内存、定时器和外设等信息。
DTS文件中的节点和属性是如何组织的?
DTS文件由一系列命名的节点和属性组成,属性是成对的name和value,节点可以包含子节点。