Linux pci/pcie驱动
发布日期:2021-05-19 20:20:01 浏览次数:29 分类:精选文章

本文共 1607 字,大约阅读时间需要 5 分钟。

PCI驱动是Linux内核中核心组件之一,主要用于管理PCI总线和PCI设备。在这个过程中,PCI总线初始化包含两个关键环节:PCI控制器的注册和PCI设备的枚举。PCI总线与其他总线的主要区别在于,其枚举机制需要遍历PCI总线树上所有可能的设备功能,记录下所有存在设备的vendor ID、设备名等信息。这类似于平台驱动的工作方式,为后续PCI设备驱动注册提供依据。

PCI名称和设备名称通常由以下组成部分确定。例如,序列号"09:00.0 0c04: 1077:2432 (rev 03)"中:

  • "09:00.0"表示bus number(合流排ID)
  • "0c04"是class ID(设备类别标识)
  • "1077"是vendor ID(厂商ID)
  • "2432"是device ID(设备ID)

这些编号共同构成一个16位的设备识别码,其中:

  • bus number占8位,最大可支持256个合流排
  • device number占5位,最大可支持32种设备
  • function number占3位,最大可支持8个功能

设备名称通常由class ID、vendor ID和device ID组合而成。例如:

  • class ID "0c04"表示"Fiber Channel controller"
  • vendor ID "1077"对应厂商"Qlogic Corp"
  • device ID "2432"对应产品名称"ISP2432-based 4Gb Fiber Channel to PCI Express HBA"

PCIe链路(PCIE表示的是PCI Express)有以下特点:

  • 链路最多支持1、2、4、8、12、16和32个Lane,对应的宽度分别为1×、2×、4×、8×、12×、16×和32×。
  • 每个Lane使用的总线频率与PCIe版本相关。
  • 下游设备的Device Number必须为0。
  • PCIe热插拔支持需要两个方面:

  • Linux内核支持:内核需要配置支持PCI热插拔功能。
  • PCI设备支持:设备必须符合PCI Express 3.0标准,实现slot capabilities register寄存器扩展,且第7位hotplug capalbe为1。
  • 以下是rtl8139设备驱动的初始化示例:

    static int __init demo_init_module(void) {
    /* 检查系统是否支持PCI总线 */
    if (!pci_present())
    return -ENODEV;
    /* 注册硬件驱动程序 */
    if (!pci_register_driver(&demo_pci_driver)) {
    pci_unregister_driver(&demo_pci_driver);
    return -ENODEV;
    }
    /* ... */
    return 0;
    }

    pci_register_driver的作用

    pci_register_driver完成以下工作:

  • 将提供的PCI驱动注册到内核,挂载到PCI设备的链表中。
  • 扫描PCI总线上的所有设备配置空间,如果发现设备标识信息与驱动中的id_table匹配(如rtl8139_pci_tbl):
    • id_table用于识别设备厂商和设备类型。
    • pci_device_id结构体用于设备辨别。
    • 成功匹配后,驱动将挂载到对应的PCI设备上。

    PCI桥用于连接多个PCI总线并实现彼此之间的通信。常见的PCI桥包括PCI-to-PCI桥和PCI-to-PCIA桥,其特点是:

  • 不具备私有寄存器。
  • 运算系统无需为其提供专门驱动,桥接操作将自动透明完成。
  • 以下资源可供参考:

    上一篇:Linux Ethernet PHY 驱动
    下一篇:RAID技术超详细讲解

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年05月14日 17时50分15秒