2

我正在为 dma 编写一个 linux 设备驱动程序,在浏览 LXR 中的 dma 驱动程序源时,我遇到了函数 dma_cap_zero 和 dma_cap_set 以及整个家族 dma_cap_* 。这些功能是什么?还有一个名为 dma_transaction_type 的结构

enum dma_transaction_type {
         DMA_MEMCPY,
          DMA_XOR,
          DMA_PQ,
          DMA_XOR_VAL,
         DMA_PQ_VAL,
          DMA_MEMSET,
         DMA_INTERRUPT,
          DMA_SG,
          DMA_PRIVATE,
          DMA_ASYNC_TX,
          DMA_SLAVE,
          DMA_CYCLIC,
          DMA_INTERLEAVE,
  /* last transaction type for creation of the capabilities mask */
          DMA_TX_TYPE_END,
  };

枚举类型代表什么?

4

1 回答 1

1

这些函数实际上是预处理器宏函数,被从属 DMA 设备用来配置和请求 DMA 通道。

以下是使用它们的示例:

dma_cap_mask_t mask;

dma_cap_zero(mask);
dma_cap_set(DMA_MEMCPY,mask);
dma_chan1 = dma_request_channel(mask,0,NULL);

此代码来自http://ecourse.wikidot.com/dmatest

首先,在dmaengine.h, ~line 233dma_cap_mask_t中定义了数据类型。它是一种位域,其中的位指示 DMA 通道能够进行哪种传输。

在上面的代码片段中,出现在链接代码的__init例程中,掩码被声明为特殊dma_cap_mask_t数据类型。然后dma_cap_zero()调用该函数并将掩码传递给它。

我相信dma_cap_zero只是将能力掩码归零。它在dmaengine.h, ~line 733中定义。该函数返回 void,我认为正在将位域归零。不过,我并不完全确定,因为内核代码是一大堆宏魔法,有时我很难破译。

在掩码归零或以某种方式由 初始化后dma_cap_zero,必须设置通道的功能。该dma_cap_set函数实现了这一点。它采用请求通道类型并根据执行该类型事务所需的功能设置掩码。如果您对枚举的使用方式感到困惑,请查看此页面以简单查看枚举。在这种情况下,枚举中的值似乎用于描述不同类型的 DMA 事务,每个事务都需要一组不同的“功能”。该dma_set_cap函数根据指定事务类型所需的功能设置功能掩码。

一旦为您要执行的 DMA 事务类型正确设置了掩码,您就可以请求 DMA 通道。

其他 dma_cap* 宏用于对 DMA 掩码执行其他类型的操作,而无需真正了解幕后发生的事情。这些类型的宏在内核代码中无处不在,用于更多仅 DMA 的操作。它们允许设备驱动程序在内核中完成工作,而不必担心内核是如何做到的。

于 2014-09-23T20:19:14.900 回答