2013-04-22 235 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的操作。它們允許設備驅動程序在內核中完成任務,而無需擔心內核如何執行它。