2013-04-22 132 views
2

我正在写一个dma的linux设备驱动程序,同时穿过LXR的dma驱动程序的源代码,我遇到了函数dma_cap_zero和dma_cap_set以及整个dma_cap_ *系列。这些功能是什么? 也有叫dma_transaction_typeLinux的dma驱动程序dma_cap_set,dma_cap_zero

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, 
    }; 

什么枚举类型代表的结构?

+0

参考linux内核[dmaengine.txt]文档(http://lxr.linux.no/linux+v3.6/Documentation/dmaengine.txt)和[async_tx.txt](http://lxr.linux 。无/ LINUX + V3.6 /文档/加密/异步-TX-api.txt) – 2013-07-25 09:24:49

回答

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 233定义的数据类型dma_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函数完成此操作。它采用请求通道类型并根据执行此类事务所需的功能设置掩码。如果您对枚举的使用方式感到困惑,请查看this page以查看枚举的简单回顾。在这种情况下,它看起来像枚举中的值用于描述不同类型的DMA事务,每个事务都需要一组不同的“功能”。 dma_set_cap函数根据指定事务类型所需的功能来设置功能掩码。

一旦掩码为要执行的DMA交易的类型正确设置,您所请求的DMA通道。

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