WinCE平台上的DMA

2021-05-26 08:40:45 字數 2552 閱讀 1495

ceddk提供了dma的相關函式,在ceddk/ddk_dma/ddk_dma.c中定義。最有用的就兩個函式,halallocatecommonbuffer(..)和halfreecommonbuffer(..)分別用於為dma申請和釋放記憶體。

(1)首先介紹一下會用到的dma介面卡結構,在ceddk.h中定義,如下:

typedef struct _dma_adapter_object_

dma_adapter_object, *pdma_adapter_object;

(2)dma記憶體分配函式:

pvoid halallocatecommonbuffer(pdma_adapter_object dmaadapter, ulong length, pphysical_address logicaladdress, boolean cacheenabled)

dmaadapter:        dma介面卡結構指標

length:                 要分配的記憶體的大小

cacheenabled:     是否使用cache

實際上該函式通過呼叫allocphysmem函式來分配一段實體地址連續的記憶體,這段記憶體預設是64kb位元組對齊的,dma操作的物理記憶體必須是連續的。該函式呼叫成功以後,返回值是虛擬位址,可以在驅動中訪問其中的內容,函式的第三個引數返回記憶體的實體地址,可以賦值給dma控制器來完成dma操作。

(3)dma記憶體釋放函式:

void halfreecommonbuffer(pdma_adapter_object dmaadapter, ulong length, physical_address logicaladdress, pvoid virtualaddress, boolean cacheenabled)

dmaadapter:        dma介面卡結構指標

length:                 記憶體的大小

cacheenabled:      是否使用cache

該函式通過呼叫freephysmem函式來完成記憶體的釋放,所以在使用該函式的時候,只有函式的第四個引數是必須的,也就是記憶體的虛擬位址,其他的都可以忽略。

(4)下面給個使用上面兩個函式的例子:

dma_adapter_object dmaadapter;

//初始化dma介面卡

dmaadapter.objectsize = sizeof(dmaadapter);

dmaadapter.inte***cetype = internal;

dmaadapter.busnumber = 0;

//分配dma記憶體

m_pdmabuf = (pbyte)halallocatecommonbuffer( &dmaadapter, 256 * 1024, &m_pdmabufphys, false );

//將實體地址賦值給dma控制器

vm_pdmareg->dst = (int)m_pdmabufphys.lowpart;

//釋放dma記憶體

if( m_pdmabuf != null )

在ddk_dma.c中,還可以看到其他很多dma相關的操作函式。這些dma函式是用來操作dma裝置的,通過createfile來開啟dma裝置,然後呼叫deviceiocontrol函式來訪問dma裝置。dma裝置驅動在/wince600/public/common/oak/drivers/dma下面,該dma驅動以流裝置驅動的形式實現。

一般來說,dma驅動會配合其他裝置驅動來完成資料傳輸,所以很少會被單獨作為乙個裝置來使用,大多數情況我們開發裝置驅動時需要用到dma的時候,會用到上面兩個函式來申請和釋放記憶體。

(5)音訊驅動中的dma

以s3c2440a為例,它的dma控制器沒有內建的dma儲存區域,所以驅動程式必須在記憶體內為音訊裝置分配dma緩衝區。緩衝區設定是否合理非常關鍵,緩衝區太小容易造成緩衝區溢位,而要填充大的緩衝區,cpu就要一次處理大量的資料,容易造成延遲。

新的音訊資料在cpu的控制下先寫到dma緩衝區a中,此時dma控制器正在從dma緩衝區b中遷移音訊資料到iis匯流排。當緩衝區b的資料全部傳輸完成之後,dma控制器產生int_dma2中斷,該中斷通知cpu開始往緩衝區b中寫新的音訊資料,與此同時dma控制器從緩衝區a中遷移資料到iis匯流排。這樣交替迴圈,由於cpu和dma控制器沒有同時處理同一塊緩衝區,就減少了資源訪問的衝突,並且能夠最大程度上提高音訊處理的實時性。

放音的協作過程:

b,dma音訊資料傳輸,dma控制器得到匯流排的控制權後,通知iis控制器dma應答,這時開始進入dma資料傳輸,dma控制器從輸出緩衝區a中取出cpu填充的音訊資料到iis控制器的傳送fifo,當前的dma傳輸結束,也即2048個位元組的音訊資料已通過iis匯流排傳送到音訊編解碼器。

c,dma中斷,dma傳輸結束後dma控制器向cpu發出int_dma2中斷,表示輸出緩衝區a的資料已經被遷移到音訊編解碼器,這時cpu(這之前cpu往輸出緩衝區b寫入音訊資料)轉而向輸出緩衝區a寫入音訊資料,而dma控制器同時從輸出緩衝區b中遷移資料到傳送的fifo。cpu和dma控制器如此交替訪問緩衝區,實現音訊資料的快速傳輸。

錄音時dma的操作類似。

參考原文:

參考原文:

6410平台上配置WIN CE的DDR引數

win ce系統中配置ddr引數主要有以下幾個檔案,當然ddr的時序引數就不贅述,此處敘述主要是大小和位址引數。1,檔案memparam mddr.inc中 dmc1 mem cfg memory configuration register dmc1 mem cfg2 memory configu...

iPhone平台上的json framework

當我們在開發iphone應用程式時,必然會對cocoa touch的平台功能感到不足,在接下來的幾篇文章中,筆者將介紹一些在cocoa上熱門的第三方函式庫,還請多多指教!在所有的第三方函式庫中,最有名且被廣泛使用的不外乎便是json framework了,就連iphone os本身也有用到這個函式庫...

Windows 平台上的 InnoDB

出錯詳解 e lamp mysql bin mysqld max nt standalone console innodb error you must set the log group home dir in my.cnf the innodb same as log arch dir.0204...