暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pcie(四)- Linux PCI 驱动程序

囧囧妹 2022-08-10
251

点击上方蓝字【囧囧妹】一起学习,一起成长!

一,如何手动查找pcie设备

PCI 驱动程序可以不使用 pci_register_driver() 接口来搜索 PCI 设备。PCI 设备由多个驱动程序控制的主要原因是因为一个 PCI 设备实现了几种不同的硬件服务。例如组合串行/并行端口/软盘控制器。

可以使用以下结构执行手动搜索。
按供应商和设备 ID 搜索:

    struct pci_dev *dev = NULL;
    while (dev = pci_get_device(VENDOR_ID, DEVICE_ID, dev))
    configure_device(dev);
    按类 ID 搜索(以类似方式迭代):
      pci_get_class(CLASS_ID, dev)
      按供应商/设备和子系统供应商/设备 ID 搜索:
        pci_get_subsys(VENDOR_ID,DEVICE_ID, SUBSYS_VENDOR_ID, SUBSYS_DEVICE_ID, dev).
        可以使用常量 PCI_ANY_ID 作为 VENDOR_ID 或 DEVICE_ID 的通配符替换。例如,这允许搜索来自特定供应商的任何设备。
        这些功能是热插拔安全的。它们增加返回的 pci_dev 上的引用计数,最终必须(可能在模块卸载时)通过调用来减少这些设备上的引用计数pci_dev_put()。


        二,设备初始化步骤

        如前所述,大多数 PCI 驱动程序需要以下步骤来进行设备初始化:

        • 启用设备

        • 请求 MMIO/IOP 资源

        • 设置 DMA 掩码大小(对于相干 DMA 和流式 DMA)

        • 分配和初始化共享控制数据 (pci_allocate_coherent())

        • 访问设备配置空间(如果需要)

        • 注册 IRQ 处理程序 ( request_irq()
          )

        • 初始化非PCI(即芯片的LAN/SCSI/etc部分)

        • 启用 DMA/处理引擎。

        驱动程序可以随时访问 PCI 配置空间寄存器。


        下一节我们来看看每一步都具体做些什么。



        觉得不错,点击“分享”,“赞”,“在看”传播给更多热爱嵌入式的小伙伴吧!
        文章转载自囧囧妹,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论