在Linux内核设备驱动模型中,platform_driver
、platform_device
和device_driver
是三个核心结构体,它们共同支持平台设备驱动模型的实现。以下是它们的详细说明及关系分析:
1. platform_device
(平台设备)
- 作用:表示集成在SoC(如ARM芯片)上的静态设备(无独立总线),例如内置的GPIO控制器、I2C控制器等。
- 核心字段:
name
:设备名称(如"my-device"
),用于与驱动匹配。id
:设备实例编号(如0
表示第一个实例)。dev
:struct device
类型,包含设备资源(如IO内存、中断、DMA通道等)。resource
:指向设备资源的数组(通过platform_device_add_resources
注册)。
- 注册方式:通过
platform_device_register()
注册到内核,内核维护全局平台设备列表。
2. platform_driver
(平台驱动)
- 作用:为平台设备提供驱动实现,负责设备的初始化、资源分配和操作。
- 核心字段:
driver
:struct device_driver
类型,包含驱动名称、所有者(module
)及通用操作(如probe
、remove
)。probe
:设备匹配时调用的初始化函数(分配资源、注册子设备等)。remove
:设备卸载时调用的清理函数(释放资源)。shutdown
、suspend
、resume
:电源管理相关回调。
- 注册方式:通过
platform_driver_register()
注册,实际是将其driver
字段注册到内核驱动模型。
3. device_driver
(通用驱动结构)
- 作用:内核设备驱动模型的核心抽象,代表一个通用的驱动。
- 核心字段:
name
:驱动名称(如"my-driver"
),用于与设备匹配。bus
:驱动所属的总线类型(如platform_bus_type
)。probe
:设备匹配时调用的初始化函数(由具体驱动实现)。remove
:设备卸载时的清理函数。owner
:指向驱动模块的指针(用于引用计数)。
- 特点:
device_driver
是总线无关的通用驱动结构,platform_driver
通过继承它实现平台设备驱动。
三者关系
- 继承关系:
platform_driver
内部包含一个struct device_driver
成员(如driver
字段),通过组合而非继承实现扩展。- 注册
platform_driver
时,内核会将其driver
字段注册到全局驱动列表,并关联到platform_bus_type
总线。
- 设备-驱动绑定:
- 匹配规则:当
platform_device
的name
与platform_driver
的driver.name
一致时,驱动与设备绑定。 - 绑定流程:
- 驱动注册时,内核遍历平台设备列表,匹配名称。
- 匹配成功后,调用驱动的
probe
函数,传递设备的struct device
指针。 probe
函数通过platform_get_resource()
等API获取设备资源,完成初始化。
- 匹配规则:当
- 资源管理:
platform_device
通过resource
字段定义硬件资源(如IO地址、中断号)。- 驱动通过
platform_get_resource()
从struct device
中提取资源信息。
示意图
platform_driver
├── driver (struct device_driver)
│ ├── name: "my-driver"
│ ├── probe: my_probe()
│ └── remove: my_remove()
└── shutdown, suspend, resume...
platform_device
├── name: "my-device"
├── id: 0
├── resource: [IO_MEM, IRQ]
└── dev (struct device)
绑定关系:
platform_driver.driver.name == platform_device.name
总结
platform_device
:描述静态硬件设备,提供资源信息。platform_driver
:实现设备驱动逻辑,通过继承device_driver
注册到内核。device_driver
:通用驱动模型,platform_driver
在其基础上扩展平台特定逻辑。- 核心机制:通过名称匹配实现驱动与设备的自动绑定,简化无总线设备的驱动开发。