02、platform总线模型
一、Platform总线介绍
在Linux系统中,总线就像是设备之间通信的"规则和线路"。实际存在的总线(比如I2C、SPI)是物理线路,设备通过这些线路按照固定规则交流。但有些设备(比如SoC芯片内部集成的硬件模块,或者直接挂在处理器内存上的外设)没有物理线路连接到这些总线上,它们无法用现有总线的规则管理。
因此,Linux创造了虚拟的platform总线。它就像一个软件模拟的"公共线路",专门用来统一管理这些"无家可归"的硬件设备,让它们能像普通设备一样被系统识别和驱动。简单来说,就是为了给那些无法接入物理总线的硬件提供一个管理归属地。
二、Platform总线的数据结构
2.1、platform_bus_type 总线注册
在Linux系统中,总线本身也是设备,必须先注册。设备和驱动要连接到总线上,必须先确定它们属于哪条总线。因此总线需要先完成注册,之后才能注册设备和驱动,并将它们关联到对应的总线上。
文件:driver/base/platform.c
platform_bus_type 结构体的初始化如下:
2.2、platform_device结构体
platform_device结构体是Linux系统中管理平台设备的基础数据结构,主要作用如下:
- 注册方式:
- 通过
platform_bus_init()
函数初始化平台总线 - 使用
platform_add_devices()
函数注册具体设备
- 核心功能:
- 继承自设备(device)结构体,是其子类
- 包含设备名称(name)字段,用于驱动匹配
- 定义设备所需的硬件资源(如中断号、内存地址、DMA通道等)
- 资源管理:
- 通过嵌套的resource结构体明确列出设备需要的资源
- 系统启动时会根据这些资源需求进行分配
- 这种机制能有效防止设备间资源冲突
简单来说,这个结构体就像设备的"身份证",既告诉系统"我是谁"(通过名称),又说明"我需要什么硬件资源",帮助系统合理分配资源并匹配对应的驱动程序。定义在include/linux/platform_device.h
头文件中。
2.3、platform_driver 结构体
Platform_driver除了包含driver结构体外,还额外定义了一些功能函数。这些函数的作用和driver_device结构里那些同名函数完全一样,只是把参数类型从普通设备改成了平台设备(platform_device)。简单来说,就是把原本处理通用设备的功能,改成了专门处理平台设备的版本。
platform_driver 实例化案例如下:
- probe函数:当驱动成功匹配到设备时,系统会自动执行这个函数,必须编写它。
- remove函数:当设备从系统中移除时,系统会自动执行这个函数来释放资源,必须编写它。
- device_driver是platform_driver的基础类:platform_driver继承自device_driver(device_driver是它的父类)。
此结构体使用platform_driver_register
注册