问题标签 [dma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
9855 浏览

c - 在 PIC32 上通过 DMA 接收 SPI 数据

我知道这个话题(DMA 和 SPI)已经在 microchip 论坛的许多线程上讨论过了,实际上我已经阅读了关键字“dma”的所有 15 页搜索结果,并阅读了所有关于 dma 和斯皮。

而且我仍然坚持我的问​​题我希望有人可以帮助我:)

这是问题所在。

我的芯片是PIC32MX775F512H。我正在尝试通过 DMA 使用 SPI 接收(仅接收)数据。由于您不能“仅”在 SPI 中接收,并且 SPI 内核只有在您写入 SPIBUF(对我来说是 SPI1ABUF)时才开始切换 SPI 时钟,我正在尝试使用 2 个 DMA 通道接收我的数据。DMA_CHANNEL1 用于发送部分。接收部分的 DMA_CHANNEL2。

我从http://www.microchip.com/forums/tm.aspx?tree=true&high=&m=562453&mpage=1#复制粘贴代码

并试图让它在没有任何运气的情况下工作。它只接收几个字节(5 或 6)。

我已将两个 dma 通道的事件启用标志设置为 DMA_EV_BLOCK_DONE,没有发生中断。

你有什么主意吗 ?

这是我正在使用的代码:

使用这两个中断处理程序:

所以我最终在这条线上永远等待:while(!DmaRxIntFlag);

我在中断向量中放置了断点,它们永远不会被调用。

这是永久等待期间几个寄存器的状态:

DMACON 0x0000C800
DMASTAT 0x00000001

我使用的是 SPI1A 端口,所以 SPI1ABUF 和 _SPI1A_RX_IRQ

DCH1SPTR 0x5
DCH1SSIZ 0x2B

DCH2DPTR 0x6
DCH2DSIZ 0x2B

DCH2CON 0x00008083
DCH2ECON 0x1B10
DCH2INT 0x00800C4
DCH2SSA 0x1F805820
DCH2DSA 0x00000620

通道 1 用于发送
通道 2 用于接收

0 投票
6 回答
41264 浏览

linux - Linux 内核设备驱动程序将设备从设备 DMA 到用户空间内存

我想尽快从启用 DMA 的 PCIe 硬件设备中获取数据到用户空间。

问:如何将“直接 I/O 到用户空间与/和/通过 DMA 传输”结合起来

  1. 通读LDD3,似乎需要执行几种不同类型的IO操作!?

    dma_alloc_coherent给了我可以传递给硬件设备的物理地址。但是需要在传输完成时进行设置get_user_pages并执行类型调用。copy_to_user这似乎是一种浪费,要求设备 DMA 进入内核内存(充当缓冲区),然后再次将其传输到用户空间。LDD3 p453:/* Only now is it safe to access the buffer, copy to user, etc. */

  2. 我理想中想要的是一些记忆:

    • 我可以在用户空间中使用(也许通过 ioctl 调用请求驱动程序来创建可 DMA 的内存/缓冲区?)
    • 我可以从中获取物理地址以传递给设备,以便所有用户空间所要做的就是对驱动程序执行读取
    • read 方法将激活 DMA 传输,阻塞等待 DMA 完成中断,然后释放用户空间读取(用户空间现在可以安全使用/读取内存)。

我是否需要用 映射的单页流映射、设置映射和用户空间缓冲区get_user_pages dma_map_page

到目前为止,我的代码设置get_user_pages在用户空间的给定地址(我称之为 Direct I/O 部分)。然后,dma_map_pageget_user_pages. 我给设备返回值dma_map_page作为 DMA 物理传输地址。

我正在使用一些内核模块作为参考:drivers_scsi_st.cdrivers-net-sh_eth.c. 我会查看 infiniband 代码,但找不到哪个是最基本的!

提前谢谢了。

0 投票
1 回答
7053 浏览

linux - Linux 内核设备驱动程序以 DMA 方式进入内核空间

LDD3 (p:453) 演示dma_map_single使用作为参数传入的缓冲区。

Q1:这个缓冲区来自什么/哪里?

kmalloc?

Q2:为什么 DMA-API-HOWTO.txt 状态我可以使用 rawkmalloc来 DMA 成?

表格http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt

L:51 如果您通过页面分配器 kmalloc() 获取内存,那么您可以使用从这些例程返回的地址对内存进行 DMA 访问。

L:74 你不能接受 kmap() 调用和 DMA 的返回。

  1. 所以我可以将返回的地址传递kmalloc给我的硬件设备吗?
  2. 还是我应该virt_to_bus先运行它?
  3. 或者我应该把它传递给dma_map_single?

Q3:DMA传输完成后,可以通过kmalloc地址读取内核驱动中的数据吗?

Q4 : 把它放到用户空间的最好方法是什么?

  1. copy_to_user?
  2. 映射 kmalloc 内存?
  3. 其他的?
0 投票
1 回答
449 浏览

linux - udp 从驱动程序发送

我有一个司机需要:

  1. 从 FPGA 接收数据
  2. DMA 数据到另一个设备 (DSP) 进行编码
  3. 通过 UDP 将编码数据发送到外部主机

最初的计划是让应用程序处理步骤 3,但在下一组数据从 FPGA 到达之前,应用程序没有及时让处理器处理数据。

有没有办法强制调度程序(来自驱动程序)运行我的应用程序?

如果不是,我认为工作队列可能是我需要使用的解决方案,但我不确定如何/在何处调用网络堆栈/驱动程序以完成来自工作队列的 UDP 传输。

有任何想法吗?

0 投票
2 回答
628 浏览

linux - 在Linux中通过PCI将视频数据传输到设备的最佳方法

我需要在 Linux 环境中通过PCIFPGA 设备之间传输视频数据。我在 FPGA 上使用第三方 PCI 主内核。到目前为止,我已经在 FPGA 上实现了一个简单的 DMA 控制器,使用连续的 PCI 写入突发将数据从FPGA 传输到 CPU。

接下来,我需要将视频数据从 CPU 传输到 FPGA。解决此问题的最佳方法是什么?

我是否应该在 FPGA 上实现一个模块,该模块通过 PCI 执行一大堆突发读取。或者有没有办法让 CPU 使用 PCI 写入突发有效地将数据写入 FPGA 的内存?

我的带宽要求在两个方向上约为 30 MB/s。

谢谢。

0 投票
2 回答
2627 浏览

linux - 如何使用 O_DIRECT 将内核空间内存(物理地址)写入文件?

我想将物理内存写入文件。内存本身不会再被触及,因此我想用它O_DIRECT来获得最佳的写入性能。

我的第一个想法是打开/dev/mem并映射内存并将所有内容写入一个文件,该文件以O_DIRECT. EFAULT写调用在 mmap 返回的内存地址上失败 ( )。如果我不使用O_DIRECT,它会导致memcpy.

下一步是编写处理内存传输的字符设备或块设备。但是如何绕过copy_to_user?目标系统是一个嵌入式 PowerPC 架构,其缺点是,将用户内存写入硬盘驱动器(使用 DMA 控制器)比从 RAM 到 RAM 的 memcpy 更快。因此我必须绕过页面缓存。

此致

弗里德里希

0 投票
2 回答
14891 浏览

linux - DMA 缓存一致性管理

[pci_]dma_sync_single_for_{cpu,device}我的问题是:当我在设备驱动程序中正确使用时,如何确定何时可以安全地禁用缓存侦听?

我正在为通过 PCI Express (DMA) 直接写入 RAM 的设备开发设备驱动程序,并且担心管理缓存一致性。我可以在启动 DMA 时设置一个控制位,以在 DMA 期间启用或禁用缓存侦听,显然为了性能,我希望尽可能禁用缓存侦听。

在我调用的中断例程中pci_dma_sync_single_for_cpu(),并且..._for_device()在适当的情况下,在切换 DMA 缓冲区时,但在 32 位 Linux 2.6.18 (RHEL 5) 上,事实证明这些命令是扩展为空的宏......这解释了为什么我的设备返回垃圾在此内核上禁用缓存侦听时!

我浏览了内核源代码的历史,似乎直到 2.6.25 只有 64 位 x86 具有用于 DMA 同步的挂钩。从 2.6.26 开始,似乎有一个通用的统一间接机制,用于include/asm-generic/dma-mapping-common.h通过 的字段进行 DMA 同步(目前在 )sync_single_for_{cpu,device}dma_map_ops但到目前为止,我还没有找到这些操作的任何定义。

0 投票
2 回答
784 浏览

linux-kernel - splice() 中的 DMA 复制

我是linux内核的新手。最近,我通过了内核 2.6.33 中的 sendfile 系统调用。以下是我的旅程顺序:

在整个序列中,我没有找到 splice 使用 DMA 副本的地方。那么 DMA 复制发生在哪里?

0 投票
2 回答
292 浏览

c - 确保内存缓存正确失效

所以我有一段代码如下所示:

有问题的缓冲区正在由硬件设备写入。在某个时刻(可能在我们开始循环之前,可能在我们开始之后),硬件将写入该位置以及缓冲区的其余部分。

我目前正在使用 __sync_synchronize 来发出内存屏障,因为我想确保编译器不会导致该内存区域的其余部分从之前的任何时间被缓存region[0] == 1

我知道我可以将整个缓冲区标记为易失性。但是,我希望能够从此函数返回一个非易失性缓冲区。

那么,有什么方法可以做 a __sync_synchronize,但只能针对我指定的内存范围。在这种情况下,内存来自[region, region + 1024)

顺便说一句,这段代码存在于用户空间中。内存缓冲区是一个固定的内存区域,我用内核模块分配了它,映射到用户空间,并告诉 FPGA 最终对它进行 DMA。这实质上是在尝试在 FPGA 上实现轮询机制来完成 DMA 传输。

0 投票
1 回答
314 浏览

memory-management - DMA 控制器是否有自己的寄存器?

我试图了解 DMA 控制器如何运作的来龙去脉。

我在看 8237 DMA 控制器。这里的一些信息有一些带有寄存器值的表。

那些是 DMA 自己的寄存器,还是 CPU 的寄存器?