
Linux pci/pcie驱动
链路最多支持1、2、4、8、12、16和32个Lane,对应的宽度分别为1×、2×、4×、8×、12×、16×和32×。 每个Lane使用的总线频率与PCIe版本相关。 下游设备的Device Number必须为0。 Linux内核支持:内核需要配置支持PCI热插拔功能。 PCI设备支持:设备必须符合PCI Express 3.0标准,实现slot capabilities register寄存器扩展,且第7位hotplug capalbe为1。 将提供的PCI驱动注册到内核,挂载到PCI设备的链表中。 扫描PCI总线上的所有设备配置空间,如果发现设备标识信息与驱动中的id_table匹配(如rtl8139_pci_tbl): 不具备私有寄存器。 运算系统无需为其提供专门驱动,桥接操作将自动透明完成。
发布日期: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)有以下特点:
PCIe热插拔支持需要两个方面:
以下是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
完成以下工作:
- id_table用于识别设备厂商和设备类型。
- pci_device_id结构体用于设备辨别。
- 成功匹配后,驱动将挂载到对应的PCI设备上。
PCI桥用于连接多个PCI总线并实现彼此之间的通信。常见的PCI桥包括PCI-to-PCI桥和PCI-to-PCIA桥,其特点是:
以下资源可供参考: