首页 > 解决方案 > 为什么 ififd 的 pci linux 实现使用“platform_driver”而不是“pci_driver”?

问题描述

linux主线内核( link)的PCI-IFIFD CAN实现(drivers/net/can)使用的是platform_driver结构而不是pci_driver结构。
我在区分这两种结构时遇到了一些麻烦。因此我告诉自己:
-平台驱动程序与普通设备驱动程序
- platform_driver
- pci_driver

根据第一个来源:

与 PCI 或 USB 设备不同,I2C 设备不在硬件级别(在运行时)枚举。相反,软件必须知道(在编译时)每个 I2C 总线段上连接了哪些设备。所以 USB 和 PCI 不是平台设备

如果是这种情况,为什么 PCI ififd 实现使用 platform_driver 结构?
此外,有人如何使用 ififd 将此驱动程序用于 pci 卡?

标签: clinuxlinux-kernelcan-buspci

解决方案


您必须区分platform_driver哪个是总线(控制器)驱动程序,pci_driver哪个是 PCI 设备驱动程序(总线上的客户端)。

这是IFI CANFD 控制器的 CAN 总线驱动程序 CAN 总线驱动程序

总线控制器(适配器)注册到内核为platform_devices

PCI 驱动程序提供挂钩(回调)和结构来将 PCI 设备注册到内核 PCI 层并将其绑定到设备。

pci_register_driver()用于在表中定义的 PCI 总线上注册pci_driver现有 PCI 设备的结构,其中struct pci_device_id xxx_pci_tbl[]包含类、供应商和设备 ID,以匹配设备。

struct pci_driver xxx_driver = {
    .name           = DRV_NAME,
    .probe          = xxx_pci_probe,
    .remove         = xxx_pci_remove,
    .id_table       = xxx_pci_tbl

/文档/PCI/pci.txt


推荐阅读