2016-02-05 21 views
1

我閱讀了關於dma API的自述文件,但仍不明白應該如何使用它。 據說dma_alloc_coherent負責分配緩衝區,它是否也可以重定位到事務? (我在ivtvfb.c司機見例如fb_write,使用dma_alloc_coherent的完成,如果它的交易實際上是負責)如何在內核中執行單個dma事務?

  1. 但是如何觸發DMA事務開始?
  2. 完成後是否有回調?

回答

2

什麼是DMA傳輸?

DMA是硬件機制,它允許外圍組件,而無需涉及該系統處理器直接傳輸它們的I/O數據,並從主存儲器中。使用這種機制可以大大提高進出設備的吞吐量,因爲主CPU不需要大量的計算開銷。

...使用dma_alloc_coherent()就好像它實際上負責交易一樣。

相反,dma_alloc_coherent()簡單地創建一個緩衝區,則可以接受的DMA控制器即保留在主存儲器中的區域(通常是連續的),可以在CPU和DMA控制器之間共享。

例如,要執行DMA寫入,CPU可以填充此緩衝區並指示DMA控制器將其寫入設備,一旦完成,調用回調函數(以通知SW上運行的SW中央處理器)。

與此同時,當DMA控制器並行處理到外部設備的數據傳輸時,CPU可以繼續執行不依賴於正在同時傳輸的數據的其他不相關任務。

類似地,以執行DMA讀入中,CPU只是簡單地傳遞通過調用dma_allocate_coherent()給DMA控制器獲得的緩衝器,並指示它執行讀取。隨後,DMA控制器讀取所述外部設備,並開始填充提供緩衝並調用回調函數一旦緩衝器被填充(半填充的作爲構造一定的時間間隔。)

延伸閱讀:
Chapter 15 of LDD3 - "mmap and DMA"
Article on DMA APIs in the Linux kernel


一般來說,這取決於在DMA控制器上。 即DMA控制器驅動程序提供的API。

dma-engine是由幾個DMA提供商所使用的Linux內核的標準框架。

相關:What is DMA mapping and DMA engine in context of linux kernel?


dma-engine情況:

有它完成時的回調?

填充從dmaengine_prep_slave_sg()

獲得如何觸發DMA事務開始在描述符回調指針?

使用dma_async_issue_pending()並傳遞初始化的描述符。


欲瞭解更多詳細信息,請參閱dma-engine client documentation

+0

謝謝!我還沒有檢查過dma-engine framewaork,但首先嚐試瞭解本地內核API,例如我在ivtvfb.c代碼中看到,在fb_write中它們使用dma_alloc_coherent(),就好像該函數從pc到設備進行復制一樣。 dma_alloc_coherent是否也執行了交易? – ransh

相關問題