在Linux设备驱动模型中,platform_devicedevice 和 pci_device 是三个关键数据结构,它们之间存在层级关系和不同用途。以下是它们的区别与联系:


1. struct device (基础设备)

  • 定位:所有设备的基类,位于设备模型的最顶层(定义在include/linux/device.h)。

  • 功能

    • 提供设备的通用属性(如名称、ID、电源管理、父子关系等)。

    • 实现设备模型的核心功能(如sysfs接口、设备生命周期管理等)。

  • 特点

    • 不涉及具体总线或硬件细节,是一个抽象结构。

    • 其他具体设备(如PCI、Platform设备)均继承device(通过结构体嵌入)。


2. struct platform_device (平台设备)

  • 定位:用于描述不依赖于传统总线(如PCI、USB)的SoC外设或嵌入式设备(如GPIO、I2C控制器等)。

  • device的关系

    • 内嵌一个struct device成员(通过.dev字段),继承其通用属性。

    • 扩展了平台设备特有的资源(如内存地址、IRQ等)。

  • 关键字段

    struct platform_device {
        const char *name;       // 设备名称
        int id;                // 实例ID
        struct device dev;      // 内嵌的基类设备
        struct resource *resource; // 设备资源(内存、IRQ等)
        // ...
    };
  • 使用场景

    • 非枚举设备(如直接焊接在板上的设备)。

    • 通过platform_bus_type虚拟总线与platform_driver匹配。


3. struct pci_dev (PCI设备)

  • 定位:描述PCI总线上的设备(如网卡、显卡等)。

  • device的关系

    • 内嵌一个struct device成员(通过.dev字段),继承通用属性。

    • 扩展了PCI特有的配置(如BAR空间、Vendor/Device ID等)。

  • 关键字段

    struct pci_dev {
        // ...
        struct device dev;    // 内嵌的基类设备
        unsigned short vendor; // 厂商ID
        unsigned short device; // 设备ID
        struct resource resource[PCI_NUM_RESOURCES]; // PCI资源
        // ...
    };
  • 使用场景

    • 通过PCI总线枚举的硬件设备。

    • 由PCI子系统自动探测并管理。


三者的关系总结

特性 device platform_device pci_dev
层级 基类 派生类(虚拟总线设备) 派生类(PCI总线设备)
总线依赖 虚拟平台总线(platform_bus PCI总线
典型用途 所有设备的公共属性 SoC外设、嵌入式设备 PCI接口硬件
资源管理 通用属性(名称、电源等) 内存/IRQ资源(resource PCI配置空间、BAR资源
匹配方式 名称或设备树兼容字符串 Vendor/Device ID

代码结构示例

// 继承关系示意
struct device { /* 通用字段 */ };

struct platform_device {
    struct device dev; // 内嵌device
    // 平台特有字段
};

struct pci_dev {
    struct device dev; // 内嵌device
    // PCI特有字段
};

关键区别

  1. 总线类型

    • pci_dev依赖PCI总线,由硬件枚举。

    • platform_device用于无总线或虚拟总线设备,通常需手动注册。

  2. 资源分配

    • PCI设备资源由BIOS/固件分配(如BAR空间)。

    • 平台设备资源常通过设备树或硬编码指定。

  3. 驱动匹配

    • PCI驱动通过Vendor/Device ID匹配。

    • 平台驱动通过名称或设备树兼容性匹配。

理解这些结构有助于编写不同总线类型的驱动,并合理管理设备资源。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐