【问题标题】:Linux dma device driver dma_request_channel failsLinux dma 设备驱动程序 dma_request_channel 失败
【发布时间】:2013-07-29 21:18:45
【问题描述】:

我正在尝试编写一个与嵌入式系统上的 DMA 接口的平台驱动程序。我们正在使用 Zedboard 和 Xilinx 的 AXI DMA IP。但是,我认为我们的错误与 Linux 内核有关。

要为 DMA 获取tx/rx 通道,linux 提供了dma_request_channel 函数。该函数使用一个过滤器和一个需要匹配 DMA 的过滤器参数。此函数获取系统中所有可用 DMA 的列表,并使用过滤器将其与我们想要的匹配。但是,这似乎无法获得所有可用的 DMA,而只能获得一个。 ARM 内核带有自己的 PL330 hard IP DMA。那是它唯一看到的。

内核代码太复杂了,我被困在列表头文件here

有人能解释一下LIST_HEAD_INIT 的作用吗? C 是什么语法?

我是否需要让硬件外围设备对操作系统可见?我认为设备树可以解决这个问题,我们已将其包含在设备树中。我们也可以通过 get_platform_resources API 来获取它的基地址。

【问题讨论】:

  • 你是如何告诉 Linux DMA 子系统关于 DMA 控制器的?
  • 嗯....这是我的问题?
  • 你用的是什么内核?您在设备树中添加了什么?哪个驱动程序应该处理 DT 的那部分?
  • 我使用的是 Xilinx 的 github 存储库中的 3.9。设备树由 Xilinx 的设备树生成器从其 ISE 设计套件的 SDK 生成。话虽如此,它确实包含一个用于 AXI DMA 的节点。该驱动程序也由赛灵思提供,但我们不知道如何使用它。驱动自带测试,测试本身找不到任何通道。所以我的问题是我们需要做些什么来让操作系统识别所有可用的 DMA,或者向设备树中添加一个节点就足够了吗?
  • 我在标准内核中没有看到 Xilinx DMA 驱动程序。如果您对 Xilinx 的修改有任何疑问,您必须询问他们

标签: c linux-kernel embedded driver linux-device-driver


【解决方案1】:

Could someone explain what LIST_HEAD_INIT does? What C syntax is that?

LIST_HEAD_INIT是一个宏,它在LIST_HEAD宏中初始化struct list_head的成员。

#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \
          struct list_head name = LIST_HEAD_INIT(name) 

//Taken from scripts/kconfig/list.h    
struct list_head {
          struct list_head *next, *prev;
  };

这里 prev 和 next 都用相同的成员初始化。

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 2012-06-30
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多