1. Linux Platform驱动加载机制深度解析
在Linux内核开发中,Platform驱动是最基础也是最常用的设备驱动模型之一。它主要用于描述那些直接集成在处理器芯片上的外设控制器,比如I2C、SPI、GPIO等片上系统(SoC)资源。与传统的PCI、USB等总线设备不同,这些设备没有标准的硬件探测机制,因此需要一套特殊的驱动管理框架。
1.1 Platform总线核心结构
Platform总线的核心数据结构是platform_bus_type,它在内核源码中的定义如下:
c复制struct bus_type platform_bus_type = {
.name = "platform",
.dev_groups = platform_dev_groups,
.match = platform_match,
.uevent = platform_uevent,
.dma_configure = platform_dma_configure,
.pm = &platform_dev_pm_ops,
};
EXPORT_SYMBOL_GPL(platform_bus_type);
这个结构体定义了Platform总线的基本行为:
name字段标识了总线类型为"platform"dev_groups定义了设备属性文件match函数用于匹配设备和驱动uevent处理热插拔事件dma_configure配置DMA相关参数pm指向电源管理操作集
关键点:Platform总线是一种虚拟总线,它不像PCIe等物理总线有实际的硬件信号。它的主要作用是为片上设备提供统一的驱动模型框架。
1.2 DMA配置流程详解
platform_dma_configure是Platform总线中负责DMA配置的核心函数,它的调用链如下:
code复制platform_dma_configure
of_dma_configure
of_dma_configure_id
of_dma_is_coherent
of_iommu_configure
of_iommu_configure_device
of_iommu_configure_dev_id
of_map_id
of_iommu_xlate
of_iommu_configure_dev
of_iommu_xlate
iommu_probe_device
__iommu_probe_device
iommu_group_get_for_dev
iommu_group_add_device
iommu_alloc_default_domain
__iommu_attach_device
domain->ops->attach_dev
iommu_create_device_direct_mappings
arch_setup_dma_ops
这个流程主要完成以下工作:
- 从设备树(DTS)中获取DMA相关配置
- 检查DMA一致性属性
- 配置IOMMU(如果存在)
- 设置架构相关的DMA操作
在实际开发中,如
