04、platform 总线注册流程
一、platform 总线注册流程
内核在初始化的过程中调用 platform_bus_init()函数来初始化平台总线, 调用流程如下所示:
在Linux内核中,platform_bus_init
函数负责初始化平台总线。具体步骤如下:
- 清理旧资源 首先调用
early_platform_cleanup()
,清理之前可能残留的平台总线相关数据。 - 注册总线设备 调用
device_register(&platform_bus)
,将平台总线设备(platform_bus
)注册到系统中。如果失败,就释放资源并返回错误。 - 注册总线类型 接着调用
bus_register(&platform_bus_type)
,将平台总线的类型信息(platform_bus_type
)注册到总线子系统。如果这一步失败,就回退并注销刚才注册的设备。 - 其他配置 最后注册一个通知器
of_platform_register_reconfig_notifier()
,用于监听平台设备的重新配置事件。
关于platform_bus_type
的说明:
这是一个描述平台总线类型的结构体,关键成员含义如下:
- 名字:
name = "platform"
→ 总线名称设为"platform"。 - 设备属性组:
dev_groups
→ 定义设备的属性集合。 - 匹配函数:
match = platform_match
→ 决定设备是否与总线兼容的规则。 - 事件处理:
uevent = platform_uevent
→ 处理总线相关事件(如热插拔)。 - DMA配置:
dma_configure = platform_dma_configure
→ 配置总线上设备的DMA功能。 - 电源管理:
pm
→ 指向电源管理操作函数,管理设备的休眠、唤醒等。
总结:
这个函数的目的是将平台总线正式加入内核管理系统。它先注册设备,再注册总线类型,并设置总线的行为规则(如匹配设备、处理事件等)。如果任何一步失败,就会回退已做的操作,避免留下残余状态。
二、platform 总线注册分析
Linux内核中的platform总线是一种管理硬件设备的特殊机制。它主要用来让那些和具体硬件平台紧密绑定的设备能够被系统正确识别和初始化。
具体流程是这样的:
首先通过device_register函数注册"platform_bus"设备,这会在/sys/devices目录下创建一个名为platform的文件夹。这个文件夹就相当于所有platform设备的"家",后续所有platform类型的设备都会在这个目录下生成各自的子目录。
当需要添加具体设备时,调用platform_device_add函数。这个函数会:
- 检查传入的设备参数是否合法,如果参数为空直接报错
- 自动设置设备归属:如果设备没有指定父设备,就默认把platform_bus总线设为父设备
- 这样所有platform设备都会自然地归类到/sys/devices/platform目录下
简单来说,就像整理文件夹一样:先创建一个总文件夹"platform",然后所有相关设备都作为子文件夹存放在这个总文件夹里。这样系统就能通过目录结构清晰地管理这些硬件设备了。