Linux dma设备驱动程序dma_request_channel失败

时间:2013-07-29 21:18:46

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

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

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

内核代码很难理解我被困在列表头文件中here

有人可以解释LIST_HEAD_INIT的作用吗? C语法是什么?

我是否需要确保操作系统可以看到硬件外围设备?我认为设备树负责这一点,我们已将其包含在设备树中。我们还可以使用get_platform_resources API获取此基址。

1 个答案:

答案 0 :(得分:0)

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

LIST_HEAD_INIT是一个宏,用于初始化struct list_head宏中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都是用同一个成员初始化的。