Linux Platform驱动加载机制与DMA配置详解

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

这个流程主要完成以下工作:

  1. 从设备树(DTS)中获取DMA相关配置
  2. 检查DMA一致性属性
  3. 配置IOMMU(如果存在)
  4. 设置架构相关的DMA操作

在实际开发中,如

内容推荐

已经到底了哦
已经到底了哦