10、device_node 转换成 platform_device
📢本篇将介绍通过设备树 device_node
转换成 platform_device
一、DTB转换规则
Linux内核会根据设备树中的节点信息创建对应的platform_device设备对象,但只有满足以下条件的节点会被转换:
根节点下的直接子节点
如果某个节点是设备树根节点的直接子节点,并且它包含compatible
属性,那么内核会直接为它创建一个platform_device。特定总线节点的子节点
当内核遇到以下类型的节点时,会检查它们的子节点:- 其自身
compatible
属性为"simple-bus"、"simple-mfd"或"isa"的节点
这些节点的子节点如果也包含compatible
属性,就会被转成platform_device。
- 其自身
排除AMBA设备
如果某个节点的compatible
属性中包含"arm"或"primecell"(通常代表ARM总线设备),则不会转成platform_device,而是会被识别为AMBA设备(通过amba_device处理)。
::: 总结
简单来说:
根节点的子节点有compatible属性 → 转platform_device
特定总线节点(如simple-bus)的子节点有compatible属性 → 转platform_device
包含"arm"或"primecell" → 跳过,转成AMBA设备
最终符合要求的platform_device设备,可以在/sys/bus/platform/devices目录下看到对应的设备文件。 :::
二、转换源码分析
device_node
转换成 platform_device
的函数调用流程图如下:
在Linux内核启动时,系统会自动执行一些初始化操作。其中有一个关键步骤是:
在内核源码的drivers/of/platform.c文件中,有一行代码: arch_initcall_sync(of_platform_default_populate_init);
这段代码的作用可以分解为两个部分:
- arch_initcall_sync的作用 这是内核提供的一个初始化函数调度器。它的任务就像一个"定时闹钟",在系统启动到特定阶段时,自动触发预设的硬件初始化操作。比如设置内存、配置CPU参数等特定于计算机架构的准备工作。
- of_platform_default_populate_init的作用 这个函数是设备树解析的核心。它的功能可以理解为:
- 自动读取设备树(Device Tree)中的硬件信息(设备树是描述硬件配置的文件)
- 根据设备树里的每个硬件描述,自动生成对应的设备对象(platform_device)
- 将这些设备对象注册到内核设备管理系统中
::: 简单流程: 设备树文件 → 解析硬件信息 → 创建设备对象 → 注册到系统 :::
这两个环节的协作过程: 当系统启动到合适阶段时,arch_initcall_sync会触发of_platform_default_populate_init执行。这个函数会自动扫描设备树里的所有硬件描述,把每个硬件条目转换成内核能识别的设备对象。这样后续的驱动程序就能自动找到对应的硬件设备,完成驱动加载和初始化。
总结来说,这行代码的作用就是:在系统启动的关键阶段,自动完成硬件设备的发现和注册,为驱动程序做好准备。