问题标签 [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 投票
1 回答
554 浏览

linux-kernel - 控制 dma_pool_alloc 给出什么样的 DMA 地址

我有一个带有两种 RAM 的 ARM 平台。有一些 SDRAM 和内部 SRAM。平台上的 USB 控制器只需要位于内部 SRAM 上的 DMA 地址。目前,我正在使用一个通用驱动程序,它通过调用dma_pool_alloc.

有没有办法告诉内核只提供内部 SRAM 而不是 SDRAM 上的 USB 驱动程序 DMA 地址?

0 投票
1 回答
2233 浏览

intel - dma_map_single 和 dma_map_page

我想做多个帧的 dma 来发送一个大帧(巨型)。我能够发送正常帧(大小为 1500)。我需要对 dma 有一些疑问。

  1. dma_map_single() 相对于其他 api 的真正优势是什么。我们可以用 dma_map_page 做所有事情,对吧?

  2. 假设我们需要在驱动程序中传输一个大帧(jumbo),并且我已经将该帧存储在多个缓冲区中。这些缓冲区在物理内存或虚拟内存中不连续。但是这些缓冲区位于内核空间中。我们如何将它作为一帧发送。我们应该使用 scatter-gather dma 吗?这可能与其他 dma_api 吗?

0 投票
1 回答
321 浏览

c - 写入硬件控制器寄存器和 DMA 如何在 ARM 拱形机器上工作?

调用此函数时:

  1. 地址是绝对地址还是通过 MMU?
  2. DMA - 写入地址是否由 MMU 转换?
  3. 为什么这里没有提到系统中的寄存器地址?
0 投票
1 回答
691 浏览

linux-kernel - 未设置 VM_GROWSDOWN 标志导致的 get_user_pages -EFAULT 错误

我将继续我的 FGPA 驱动程序的工作

现在我正在添加 OpenCL 支持。所以我有以下测试。它只是添加 NUM_OF_EXEC 次相同缓冲区的写入和读取请求,然后等待完成。

每个写入/读取请求在驱动程序中序列化并作为 DMA 事务顺序执行。DMA相关代码可以在这里查看。

因此驱动程序接受一个事务,执行它(rsp_setup_dma 和 fpga_push_data_to_device),等待来自 FPGA 的中断(fpga_int_handler),释放资源(fpga_finish_dma_write)并开始一个新的。当 NUM_OF_EXEC 等于 1 时,似乎一切正常,但如果我增加它,就会出现问题。在某些时候 get_user_pages(在 rsp_setup_dma)返回 -EFAULT。调试内核时,我发现分配的 vma 没有设置 VM_GROWSDOWN 标志(在 mmap.c 中的 find_extend_vma 处)。但是在这一点上我卡住了,因为我不确定我理解为什么需要这个标志,我也不知道为什么没有设置它。为什么 get_user_pages 会因上述症状而失败?我该如何调试呢?

0 投票
1 回答
293 浏览

memory-management - 写入大文件可防止大块 DMA 分配

我正在使用带有运行 linux (3.0.35) 的基于 ARM 的处理器的板。主板有 1GB RAM,并连接到快速 SSD HD 和 5MP 摄像头。

我的目标是捕获高分辨率图像并将其直接写入磁盘。

一切顺利,直到我尝试保存一个很长的视频(超过 1GB 的数据),

保存大文件后,我似乎无法重新加载相机驱动程序 - 它无法为流分配足够大的 DMA 内存块(调用 dma_alloc_coherent() 时)。

我将其缩小到 Linux 启动的场景(当大部分内存可用时),然后我将随机数据写入一个大文件(>1GB),当我尝试加载相机驱动程序时它失败了。

对于我的问题-

当我打开一个文件进行写入,写入大量数据并关闭文件时,用于将数据写入HD的内存不应该被释放吗?

我可以理解为什么在 HD 访问期间内存会变得碎片化,但是当对 HD 的事务完成时 - 为什么内存仍然如此碎片化以至于我无法分配 15MB 的连续 RAM?

谢谢

0 投票
1 回答
1395 浏览

linux - 使用 device_create 为 dma_alloc_coherent 创建结构设备

我想为我的 char 驱动程序在 DMAble 内存上实现 mmap 方法。起初我想用 DMA API 来实现它,然后是 PCI 设备。

dma_alloc_coherent 的第一个参数是指向结构设备的指针。对于 ISA 或 EISA,它可以为 NULL,但我需要支持 DMA 的有效设备。以下代码应该可以正常工作,但分配失败。

为什么 dma_supported 返回 1 而 is_dma_capable_returns 0?我应该如何创建我的设备来支持 dma_alloc_coherent?

0 投票
1 回答
3348 浏览

linux - LINUX——用于数据传输的DMA——从SPI读取——tx到usart——RPi

DMA 的实际工作原理是我所知道的理论;-- http://en.wikipedia.org/wiki/Direct_memory_access

但是在编程中我们要如何管理呢?

我正在使用 RPI 并期待使用 DMA 实现以下操作。
假设我想使用 SPI 从 SD 卡读取数据 ---- TX 读取数据 --- 到 USART。

我是否必须编写数据传输例程并将它们提供给 dma 或者它是由 DMA tx 和 rx 通道处理的?

什么Linux内部用于它?

一些专家可以告诉在这方面要遵循哪些步骤。我是 DMA Programming.lin 的新手

0 投票
1 回答
5247 浏览

linux - Linux DMA 操作 - 如何启动传输

我已经阅读了 Linux 设备驱动程序LDD3、DMA-API.txt、DMA-HOWTO.txt 还查看了驱动程序/dma/dmatest.c 但我无法弄清楚您是如何启动 dma 传输的。所有关于映射内存的讨论,但没有关于如何启动事务的讨论。PCI 示例驱动程序具有传输功能,但它使用“特定”DMA 操作,我试图找出一个更通用/可移植的实现,它不依赖于硬件

我正在尝试制作类似的东西

  1. dma_map_single()
  2. 启动读/写事务
  3. 中断事务已完成,使用处理程序或 wait_event_freezable_timeout
  4. dma_unmap_single()

我只是读/写我映射的内存吗?如何注册回调处理程序?

编辑:为了提供更多细节,我正在一个 ARM 平台上工作。

0 投票
1 回答
441 浏览

dma - 使用 DMA 接收数据

我有一个简单的理论问题。我知道的 DMA 通常有半满或全中断。如果我想使用 DMA 从外围设备传输数据,我如何确保获得所有数据,因为数据可能不在 dma 传输边界。

例如,串行端口可能发送 5 个字节,我会获取并中断前 4 个组合在一起(假设 dma 大小为 4),但第 5 个则没有。人们通常使用什么方法来解决这样的问题。

0 投票
0 回答
1199 浏览

linux - DMA 引擎 API 与 DMA API

有人可以简要解释一下两者的用法和区别吗?

注意:我已阅读 linux 文档