Linux的dma驱动程序dma_cap_set,dma_cap_zero

我正在为一个dma编写一个linux设备驱动程序,同时在LXR中通过dma驱动程序的源代码,我遇到了dma_cap_zero和dma_cap_set函数以及dma_cap_ *的整个系列。 这些function是什么? 还有一个称为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, }; 

枚举types代表什么?

这些功能实际上是预处理宏功能,由从属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〜〜行233中定义了数据类型dma_cap_mask_t 。 这是一种位域,其中的位表示DMA通道能够传输什么样的信息。

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

我相信dma_cap_zero只是清除能力掩码。 它在dmaengine.h〜733行定义。 该函数返回无效,我认为是零位的位。 但是我并不完全确定,因为内核代码是一大堆宏魔,有时候我很难破译。

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

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

其他dma_cap *宏用于在DMA掩码上执行其他类型的操作,而不真正知道幕后发生了什么。 这些类型的宏在内核代码中处处可见,对于更多的只是DMA的操作。 它们允许设备驱动程序在内核中完成任务,而不必担心内核是如何执行的。