4.7.3 devicetree(DTS)介绍——dts常用解析函数

4.7.3 devicetree(DTS)介绍——dts常用解析函数
最新回答
蔚蓝的心

2026-10-27 12:35:41

Device Tree(DTS)常用解析函数主要用于从设备树中提取硬件配置信息,涵盖属性读取、节点查找、资源映射等核心功能。以下是详细分类说明:

一、从device_node中获取属性值
  1. 整型数组读取

    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位整型属性值(如时间戳)。

  2. 字符串属性读取

    of_property_read_string读取字符串属性值(如设备型号)到out_string。

    of_property_read_string_index读取字符串数组中第index个字符串(如多语言支持)。

    of_property_count_strings统计字符串属性值的数量(如配置参数列表长度)。

  3. 布尔与属性存在性检查

    of_property_read_bool检查属性是否存在(如status = "disabled"),存在返回true。

    of_find_property/of_get_property返回属性结构体指针或属性值地址,lenp存储属性长度。

  4. 中断(IRQ)处理

    irq_of_parse_and_map解析设备树中第index个IRQ号并映射到内核虚拟IRQ。

    of_irq_to_resource填充IRQ资源结构体(如起始地址、标志位)。

    of_irq_count统计设备节点的IRQ数量(如多中断控制器支持)。

二、节点关系与兼容性检查
  1. 节点层级操作

    of_get_parent获取当前节点的父节点(如SoC根节点)。

    of_device_is_compatible检查节点compatible属性是否匹配指定字符串(如驱动匹配)。

  2. 全局链表查找

    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引用查找节点(如跨设备引用)。

三、内存与资源映射
  1. 内存区域映射

    of_iomap直接映射设备内存区域(如寄存器地址空间),index指定reg属性中的段索引。

    of_address_to_resource将reg属性转换为资源结构体(如PCI BAR空间)。

  2. 设备树根节点操作

    of_get_flat_dt_root获取DTB(Device Tree Blob)根节点(通常返回0,用于早期初始化)。

    of_alias_get_id获取节点的别名ID(如gpio0对应ID 0)。

四、Platform设备相关
  1. 设备创建与初始化

    of_device_alloc根据设备树节点创建platform_device结构体(如自定义设备驱动)。

    of_platform_populate遍历所有节点并生成platform_device(自动化驱动绑定)。

    of_find_device_by_node通过设备树节点查找对应的platform_device(如调试时定位设备)。

  2. 总线与驱动匹配

    of_platform_bus_probe将节点挂载到of_platform_bus_type总线(不立即匹配驱动)。

    of_match_node匹配设备树节点与驱动的compatible列表(如ARM SoC驱动加载)。

五、杂项函数
  1. 引用计数管理

    of_node_get/of_node_put增加/减少设备树节点的引用计数(防止提前释放)。

  2. 早期初始化支持

    部分函数(如of_get_flat_dt_root)用于U-Boot或内核早期阶段解析DTB。

应用场景示例:

  • 驱动初始化时通过of_property_read_u32读取时钟频率。
  • 使用of_find_compatible_node查找特定SoC型号的设备。
  • 通过of_iomap映射外设寄存器到内核虚拟地址空间。

这些函数构成了Linux内核与Device Tree交互的基础,确保硬件配置动态解析而无需硬编码。