【问题标题】:How to make PCI device initiate a DMA operation?如何让 PCI 设备发起 DMA 操作?
【发布时间】:2014-03-05 12:18:36
【问题描述】:

我需要找到一种在我的命令下轻松触发 DMA 操作的方法,以方便硬件调试。是否可以通过直接写入其寄存器来在我的 Linux 中的现有 PCI 设备(例如声卡或网卡)上初始化 DMA read?还是我必须编写一个自定义驱动程序并通过insmod 调用它?

【问题讨论】:

    标签: linux linux-kernel driver pci


    【解决方案1】:

    没有启动 DMA 操作的标准方法。通常,您需要在主机上准备一个 DMA 缓冲区,并在您的设备上设置 DMA 寄存器,加载 DMA 地址、大小等。

    但是,对于 PCI 设备的 DMA 寄存器没有单一的标准。 您需要找到您的 PCI 设备的规范文档。在该规范中,查找 DMA 章节(这也称为 PCI“主访问”,而不是“目标访问”)。

    你会在那里找到: - 如果支持分散-聚集或连续 DMA。 - 如何设置 DMA 寄存器,其中之一通常称为 DMA CSR - “DMA 命令/状态寄存器”。 - 如果设备支持复杂的 DMA 布局(一个或多个环形缓冲区、DMA 描述符链等)

    不过好在很多 PCI 设备都支持 0-size DMA。 它不会进行任何内存访问,而只会触发“DMA完成”中断。这对您来说是一个非常方便的起点。

    【讨论】:

    • 是的,似乎没有办法,只能为此编写 PCI 驱动程序。但问题是我实际上没有额外的 PCI 设备。我不知道是否可以使用任何现有的 PCI 卡?我可以只使用rmmod 原始驱动程序和insmod 我的驱动程序吗?
    • 如果另一个模块是可加载模块,您可以对其进行 rmmod,即不编译为内核的一部分,而是作为独立的可加载模块。如果您在“lsmod”中看到该模块,则可以将其卸载。
    猜你喜欢
    • 2015-02-12
    • 2021-10-22
    • 2020-02-27
    • 2020-05-02
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多