基于DSP的視頻采集驅(qū)動程序的設(shè)計
視頻采集驅(qū)動程序包括類驅(qū)動和微驅(qū)動兩個模塊,視頻采集驅(qū)動程序的結(jié)構(gòu)框架如圖3所示。
類驅(qū)動使用GIO模塊,GIO模塊的傳輸模式是基于流輸入輸出模塊的同步I/O模式的,更適合文件系統(tǒng)I/O,如視頻采集的應(yīng)用。該模塊的主要API函數(shù)的描述如表1所示。
在圖3中,應(yīng)用程序使用GIO_create函數(shù)創(chuàng)建GIO通道,并通過調(diào)用GIO_submit函數(shù)直接與微驅(qū)動的IOM交換數(shù)據(jù),完成視頻數(shù)據(jù)的采集。
應(yīng)用程序通過GIO類驅(qū)動調(diào)用微驅(qū)動的標(biāo)準(zhǔn)API函數(shù),這些標(biāo)準(zhǔn)API函數(shù)的描述如表2所示。這些規(guī)定的函數(shù)將放入微驅(qū)動的函數(shù)接口表(IOM_Fxns)中,以供應(yīng)用程序通過GIO類驅(qū)動調(diào)用。
在圖3中,微驅(qū)動的IOM接口將應(yīng)用程序獲取圖像的命令打包生成數(shù)據(jù)包,并向微驅(qū)動發(fā)送。數(shù)據(jù)包的格式如下: typedef struct IOM_Packet {
QUE_Elem link; /* 數(shù)據(jù)包隊列 */
Ptr addr; /* 數(shù)據(jù)地址 */
Uns size; /* 數(shù)據(jù)長度 */
Arg misc; /* 保留使用 */
Arg arg; /* 應(yīng)用程序 */
Uns cmd; /* 命令字段 */
Int status; /* 命令完成狀態(tài) */
} IOM_Packet;
數(shù)據(jù)包中數(shù)據(jù)長度與數(shù)據(jù)地址兩字段由應(yīng)用程序提供,分別表示獲取圖像的大小及圖像存儲目的地址。微驅(qū)動依據(jù)數(shù)據(jù)包中的命令字段,調(diào)用mdSubmitChan函數(shù)將數(shù)據(jù)包放入數(shù)據(jù)包隊列,等待中斷服務(wù)函數(shù)的處理。視頻采集中的硬件中斷由視頻端口內(nèi)部FIFO的狀態(tài)觸發(fā),中斷服務(wù)程序根據(jù)數(shù)據(jù)包中的數(shù)據(jù)地址字段,通過EDMA將視頻端口內(nèi)部FIFO中的視頻數(shù)據(jù)讀入SDRAM中的圖像存儲目的地址。依據(jù)數(shù)據(jù)包中的數(shù)據(jù)長度字段,在完成相應(yīng)大小圖像的采集后,中斷服務(wù)程序還將完成以下功能:出列數(shù)據(jù)包;設(shè)置下一次傳送或服務(wù)請求;設(shè)置數(shù)據(jù)包中的命令完成狀態(tài),并向應(yīng)用程序返回。
3 視頻采集驅(qū)動中的視頻數(shù)據(jù)傳輸
視頻端口內(nèi)部FIFO與SDRAM之間的視頻數(shù)據(jù)傳輸通常有以下幾種方法:軟件查詢、中斷和EDMA方法。軟件查詢消耗CPU的資源太大,是不可取的,中斷數(shù)據(jù)傳輸雖可節(jié)省很多CPU時間,但沒有發(fā)揮DM642的EDMA資源。EDMA[6]是在DMA基礎(chǔ)上發(fā)展起來的,用于在沒有CPU參與的情況下完成不同存儲空間之間的數(shù)據(jù)搬移。DM642提供了64個獨立的EDMA通道,通道的優(yōu)先級可編程設(shè)置,在沒有CPU參與的情況下實現(xiàn)片內(nèi)存儲器、片內(nèi)外設(shè)以及外部存儲空間之間的數(shù)據(jù)高速搬移。因此,為減輕CPU的負(fù)擔(dān),發(fā)揮DM642的強大的外部數(shù)據(jù)傳輸能力,視頻采集驅(qū)動使用EDMA完成視頻數(shù)據(jù)從FIFO到SDRAM的傳輸。
3.1 基于雙EDMA通道的視頻數(shù)據(jù)傳輸
利用EDMA將FIFO中的數(shù)據(jù)傳輸?shù)絊DRAM中有兩種方法,但是它們的性能卻差別很大。一種方法是利用EDMA將FIFO中的數(shù)據(jù)直接傳送到SDRAM中。這種方法雖然簡單且易于操作,但它沒有充分發(fā)揮SDRAM的頁讀寫的優(yōu)越性,原因在于EDMA讀取FIFO和寫入SDRAM時分為兩個不同過程來實現(xiàn),因此EMIF(外部存儲器接口)的時序不斷地在兩者之間切換,造成很大的時間浪費,所以這種傳輸效率不高。
由于DM642視頻端口的內(nèi)部FIFO提供“滿”、“半滿”、“空”三種狀態(tài),另一方法使用兩個EDMA通道進行數(shù)據(jù)傳輸。以亮度信號的傳輸為例,當(dāng)用于存儲亮度分量的內(nèi)部FIFO半滿(640字節(jié))時,觸發(fā)DM642的硬件中斷,在中斷服務(wù)程序中啟用一個EDMA通道將數(shù)據(jù)從FIFO中讀出,存放到緩沖區(qū)BUF中。傳輸完畢后,啟動另一個EDMA通道將數(shù)據(jù)從BUF中傳輸?shù)絊DRAM中。這樣,兩個EDMA通道分別進行讀取FIFO和寫入SDRAM的操作,避免了EMIF時序的切換,可以保證EDMA的有效傳輸。
評論