2026-10-27 12:35:41
Device Tree(DTS)常用解析函数主要用于从设备树中提取硬件配置信息,涵盖属性读取、节点查找、资源映射等核心功能。以下是详细分类说明:
一、从device_node中获取属性值整型数组读取
of_property_read_u8_array/u16_array/u32_array读取指定属性(propname)的8/16/32位整型数组,存储到out_values,sz为数组长度。示例:读取GPIO引脚列表。
of_property_read_u32_index读取属性数组中第index个32位值到out_value。
of_property_read_u64读取64位整型属性值(如时间戳)。
字符串属性读取
of_property_read_string读取字符串属性值(如设备型号)到out_string。
of_property_read_string_index读取字符串数组中第index个字符串(如多语言支持)。
of_property_count_strings统计字符串属性值的数量(如配置参数列表长度)。
布尔与属性存在性检查
of_property_read_bool检查属性是否存在(如status = "disabled"),存在返回true。
of_find_property/of_get_property返回属性结构体指针或属性值地址,lenp存储属性长度。
中断(IRQ)处理
irq_of_parse_and_map解析设备树中第index个IRQ号并映射到内核虚拟IRQ。
of_irq_to_resource填充IRQ资源结构体(如起始地址、标志位)。
of_irq_count统计设备节点的IRQ数量(如多中断控制器支持)。
节点层级操作
of_get_parent获取当前节点的父节点(如SoC根节点)。
of_device_is_compatible检查节点compatible属性是否匹配指定字符串(如驱动匹配)。
全局链表查找
of_find_node_by_path通过绝对路径(如/soc/gpio@12340000)查找节点。
of_find_node_by_name/type按名称或类型查找节点(如所有uart设备)。
of_find_compatible_node按compatible属性查找节点(如匹配"vendor,soc-name")。
of_find_node_with_property查找包含特定属性的节点(如所有带reg属性的设备)。
of_find_node_by_phandle通过phandle引用查找节点(如跨设备引用)。
内存区域映射
of_iomap直接映射设备内存区域(如寄存器地址空间),index指定reg属性中的段索引。
of_address_to_resource将reg属性转换为资源结构体(如PCI BAR空间)。
设备树根节点操作
of_get_flat_dt_root获取DTB(Device Tree Blob)根节点(通常返回0,用于早期初始化)。
of_alias_get_id获取节点的别名ID(如gpio0对应ID 0)。
设备创建与初始化
of_device_alloc根据设备树节点创建platform_device结构体(如自定义设备驱动)。
of_platform_populate遍历所有节点并生成platform_device(自动化驱动绑定)。
of_find_device_by_node通过设备树节点查找对应的platform_device(如调试时定位设备)。
总线与驱动匹配
of_platform_bus_probe将节点挂载到of_platform_bus_type总线(不立即匹配驱动)。
of_match_node匹配设备树节点与驱动的compatible列表(如ARM SoC驱动加载)。
引用计数管理
of_node_get/of_node_put增加/减少设备树节点的引用计数(防止提前释放)。
早期初始化支持
部分函数(如of_get_flat_dt_root)用于U-Boot或内核早期阶段解析DTB。
应用场景示例:
这些函数构成了Linux内核与Device Tree交互的基础,确保硬件配置动态解析而无需硬编码。