设备树linux
A. 整理了一份Linux设备树基础知识,建议收藏!
在平台设备部分有简述说明设备的两种方法:一种是通过平台设备结构体指定;另一种是利用设备树描述。本篇笔记将带你初步了解设备树的相关知识。
设备树是描述设备信息(资源)的一棵树形结构。设备树文件通常以.dts/dtsi后缀保存,即设备树源文件DTS(Device Tree Source)。这些文件与C代码相似,但必须经过编译转换为可运行的二进制文件,例如使用dtc工具将.dts文件编译生成的dtb文件,内核可以利用此文件。
引入设备树的原因在于,随着芯片技术的发展,Linux内核中包含越来越多描述设备的代码,导致内核代码变得臃肿。Linux之父Linus对此表示不满,引入设备树文件以精简冗余代码,同时编译.dts文件的过程比编译.c文件并加载驱动模块更为简便,更适合开发流程。
设备树源文件编写遵循特定规则,类似C语言的语法。包括节点格式、属性格式、一些标准属性等。节点格式以label:node-name@unit-address形式表示,其中label(可选)、node-name和unit-address分别代表标号、节点名和单元地址。属性格式通常为“name=value”,包含interrupts、clock-frequency、compatible、local-mac-address等。
标准属性如compatible表示“兼容性”,用于描述硬件兼容的驱动程序列表;model属性则更明确地定义硬件类型;status属性描述设备状态,如可用或不可用;address-cells和#size-cells属性用于描述地址和大小的位数;reg属性表示地址和大小的范围。
常见的设备树节点包括根节点、CPU节点、memory节点和chosen节点。根节点用“/”标识,CPU节点通常自动设置,memory节点由板厂配置,chosen节点用于内核参数传递。
操作设备树的函数主要由“of_”前缀的函数组成,如查找节点的of_find_node_by_name、of_find_node_by_type、of_find_compatible_node等,以及提取属性值的of_find_property、of_property_count_elems_of_size等。
通过设备树,我们可以更灵活地管理设备资源,简化内核代码结构,并提供更便捷的设备驱动匹配和参数传递方式。设备树为Linux内核提供了更为高效和模块化的设备管理解决方案。