基于 PCI 的 i2c 总线

i2c bus over PCI

提问人:ozimki 提问时间:11/10/2023 最后编辑:ozimki 更新时间:11/11/2023 访问量:33

问:

我正在尝试为通过 PCI 连接的 FPGA 设备编写 arm 驱动程序。

FPGA 器件有一些 i2c 器件和 DMA,我想为它们编写 DMA 引擎驱动程序。 FPGA 设计不是我的,不同的 i2c 设备位于同一个 BAR 上。

我对如何做到这一点有点困惑。 在我看来,最好的方法是制作一个多功能 Linux 驱动程序 (MFD),它将加载驱动程序并为每个组件分配内存。 我打算添加 MFD 节点设备树(作为 pci 设备),以便我可以在其中指定当前的硬件组件以及 DMA 通道。

如果我将 pci 设备添加到设备树中,如何获取设备的 ? 以前使用 I get 指向函数中pci_dev的指针。pci_devpci_register_driver.probe

如何从函数访问pci_dev?platform_driver.probe

有没有办法自动获取它,或者需要使用 f.ex 通过供应商和设备找到它?pci_get_device

有没有人有更好的方法?

我已经在 pci 节点内创建了一个节点,但尽管存在兼容的驱动程序(作为模块),但它没有被加载:

    pcie@33800000 {
       compatible = "fsl,imx8mm-pcie\0snps,dw-pcie";
       ...
       pci@0,0 {
           compatible = "ccx-qdma";
           device-type = "pci";
       };
   };
Linux 内核 设备树 PCI

评论

1赞 0andriy 11/17/2023
是的,一个好的选择是在 Linux 内核中使用 MFD 模型。这将是您拥有的主要PCI设备驱动程序,最重要的是功能设备驱动程序的数量,这将是平台。例如,您可能会看到英特尔 LPSS 是如何完成的 (drivers/mfd/intel-lpss-pci.c):它将设备拆分为 DMA 引擎和 SPI/I2C/UART 主机控制器。

答: 暂无答案