基于TMS320DM642的視頻采集驅(qū)動程序
視頻終端的核心是圖像的數(shù)字化處理模塊.基于PC機的數(shù)字視頻處理,給出了算法研究的途徑,而基于高速DSP的應(yīng)用模塊才提供了實時嵌入式視頻處理的可能.然而,基于DSP的海量視頻數(shù)據(jù)的實時處理的關(guān)鍵則是實時、合理的視頻數(shù)據(jù)采集.本文針對自行研制的基于TMS320DM642(以下簡稱DM642)DSP的視頻處理板卡,使其在C64x系列DSP的實時操作系統(tǒng)DSP/BIOS的環(huán)境下運行,實現(xiàn)基于類/微驅(qū)動模型的視頻采集驅(qū)動程序,并進(jìn)一步描述采用EDMA(增強的直接存儲器存取控制器)的數(shù)字視頻圖像信號的實時傳輸.
1 類/微驅(qū)動程序模型
在類/微驅(qū)動模型中,類驅(qū)動通常用于完成多線程I/O請求的序列化功能和同步功能,同時對設(shè)備實例進(jìn)行管理.類驅(qū)動通過每個外部設(shè)備獨有的微驅(qū)動對設(shè)備進(jìn)行操作.微驅(qū)動采用芯片支持庫[2]控制外設(shè)的寄存器、內(nèi)存和中斷資源.微驅(qū)動程序必須將特定的外部設(shè)備有效地表示給類驅(qū)動.
類驅(qū)動使用DSP/BIOS中的API函數(shù)[3]實現(xiàn)諸如同步等的系統(tǒng)服務(wù),DSP/BIOS定義了三種類驅(qū)動模塊:管道管理模塊(PIP)、流輸入輸出管理模塊(SIO)和通用輸入輸出模塊(GIO).在PIP和SIO類驅(qū)動中,調(diào)用的API函數(shù)已經(jīng)存在于DSP/BIOS的PIP和SIO模塊中了,這些API函數(shù)需將參數(shù)傳給相應(yīng)的適配模塊,才能與微驅(qū)動交換數(shù)據(jù).而在GIO類驅(qū)動中,調(diào)用的API函數(shù)則直接與微驅(qū)動通信.
2 基于DM642的視頻采集驅(qū)動
2.1硬件結(jié)構(gòu)
筆者利用TI公司的多媒體處理芯片DM642自行研制了嵌入式視頻處理板卡.卡上的主要組成模塊有視頻采集模塊、視頻處理模塊以及網(wǎng)絡(luò)發(fā)送模塊,其中視頻采集模塊主要由DSP芯片DM642[4]、視頻A/D轉(zhuǎn)換芯片SAA7115和同步動態(tài)存儲器芯片SDRAM等組成,如圖2所示.來自攝像頭的視頻信號通過SAA7115進(jìn)行數(shù)字化處理,輸出的數(shù)字視頻信號經(jīng)過視頻端口的內(nèi)部FIFO緩沖后,由DM642通過EDMA將數(shù)據(jù)傳送到片外SDRAM中,以便供視頻應(yīng)用程序使用.
主芯片DM642的處理能力達(dá)到4800MIPS,它的最大特點是芯片內(nèi)部集成了三個可配置的視頻端口[5],這些視頻端口提供了與通用視頻A/D轉(zhuǎn)換芯片的無縫接口,因而無需外加CPLD(復(fù)雜可編程邏輯器件)和FIFO就可以滿足系統(tǒng)設(shè)計的要求.SAA7115支持六路CVBS(復(fù)合可編程邏輯器件)和FIFO就可以滿足系統(tǒng)設(shè)計的要求.SA7115支持六路CVBS(復(fù)合模擬視頻輸入)或三路S-VIDEO(S端子信號)輸入,支持多種格式的數(shù)字RGB和YUV視頻信號輸出.DM642通過IIC總線控制SAA7115的內(nèi)部寄存器.
采用類/微驅(qū)動模型編寫DM642芯片視頻端口的視頻采集驅(qū)動程序,驅(qū)動必須滿足如下幾個基本功能:
·硬件中斷;
·可同時處理DM642的三個視頻端口;
·支持應(yīng)用程序配置視頻采集的參數(shù),支持獲取圖像數(shù)據(jù);
·支持場圖像采集,支持對CVBS和S-VIDEO兩種模擬信號的采集.
在視頻采集過程中,最重要的是對視頻數(shù)據(jù)進(jìn)行實時控制和有效的傳輸,因此需要使用硬件中斷,并在中斷服務(wù)程序中,根據(jù)視頻端口內(nèi)部FIFO的狀態(tài)通過EDMA完成視頻數(shù)據(jù)的讀入.
2.2視頻采集驅(qū)動程序的框架構(gòu)建
視頻采集驅(qū)動程序包括類驅(qū)動和微驅(qū)動兩個模塊,視頻采集驅(qū)動程序的結(jié)構(gòu)框架如圖3所示.
類驅(qū)動使用GIO模塊,GIO模塊的傳輸械是基于流輸入輸出模塊的同步I/O模式的,更適合文件系統(tǒng)I/O,如視頻采集的應(yīng)用.該模塊的主要API函數(shù)的描述如表1所示.
表1 GIO模塊的主要API函數(shù)
函 數(shù) | 函數(shù)描述 |
GIO_control | 設(shè)備控制操作 |
GIO_create | 創(chuàng)建GIO通道 |
GIO_delete | 取消GIO通道,釋放資源 |
GIO_submit | 向微驅(qū)動發(fā)送數(shù)據(jù)包 |
在圖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)用.
表2 微驅(qū)動的API函數(shù)
函 數(shù) | 函數(shù)描述 |
MdBidDec | 綁定通道 |
mdCreateChan/mdDeleteChan | 創(chuàng)建/刪除通道 |
mdSubmitChan | I/O請求發(fā)送 |
ISRs | 中斷服務(wù) |
mdControlChan | 硬件設(shè)備控制 |
在圖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ù)傳輸
由于DM642視頻端口的內(nèi)部FIFO提供"滿"、"半滿"、"空"三種狀態(tài),另一方法使用兩個EDMA通道進(jìn)行數(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通道分別進(jìn)行讀取FIFO和寫入SDRAM的操作,避免了EMIF時序的切換,可以保證EDMA的有效傳輸.
3.2 EDMA鏈表在場合成中的使用
在隔行掃描模式下,每幀分為兩場,兩場在時域上是分開的,但在數(shù)據(jù)處理時需要將兩場合成一幀進(jìn)行處理,因此要進(jìn)行大量的數(shù)據(jù)搬移,占用了大量的CPU時間.通過EDMA鏈表可自動實現(xiàn)場合成,不需占用額外的CPU時間.
EDMA的參數(shù)RAM存放了有關(guān)的傳輸參數(shù),這些參數(shù)用于產(chǎn)生EDMA讀寫操作所需要的地址.如圖4所示,在使用EDMA通道傳輸奇數(shù)場時,分別使用不同的EDMA參數(shù)RAM.兩組參數(shù)RAM的目的地址分別指向存儲圖像的第一行與第二行象素的首地址,并且兩組參數(shù)RAM通過鏈接地址循環(huán)相連.在EDMA通道的傳輸中,奇數(shù)場傳輸任務(wù)的結(jié)束會自動地根據(jù)當(dāng)前參數(shù)RAM的鏈接地址裝載傳輸偶數(shù)場的參數(shù)RAM,又由兩組參數(shù)RAM的目的地址可知,奇數(shù)場與偶數(shù)場分別經(jīng)EDMA通道傳輸至幀緩沖區(qū)后被隔行存儲,這樣在無需點用額外CPU時間的前提下就實現(xiàn)了場合成.
4 視頻采集驅(qū)動程序的調(diào)用實例
DSP/BIOS應(yīng)用程序通過GIO類驅(qū)動調(diào)用微驅(qū)動之前,需使用DSP/BIOS配置工具注冊微驅(qū)動,將其命名為VP_CAPTURE,并啟動GIO模塊.
在應(yīng)用程序中,GIO_create函數(shù)使用已注冊的微驅(qū)動VP_CAPTURE創(chuàng)建GIO通道,通過調(diào)用GIO_submit函數(shù)完成應(yīng)用程序?qū)σ曨l數(shù)據(jù)的采集操作.部分源代碼如下:
(1)創(chuàng)建通道
GIO_Handle capChan;
int status;
capChan=GIO_create("VP_CAPTURE"),
IOM_INPUT,status,(Ptr)DM642_vCapParams,NULL);
(2)發(fā)送獲取圖像的數(shù)據(jù)包
GIO_submit(capChan,IOM_READ,bufp,NULL,NULL);其中,DM642_vCapParams包含了視頻采集的初始化參數(shù),如圖像大小、同步方式等;bufp用于指出采集圖像的存儲地址.不同的視頻應(yīng)用程序在使用類驅(qū)動時,可以通過改變這兩個變量復(fù)用視頻設(shè)備.這樣,極大地提高了驅(qū)動程序的工作效率,對視頻外設(shè)的控制也大大簡化了.
使用類/微驅(qū)動模型開發(fā)的視頻采集驅(qū)動程序,有效地解決了圖像采集和圖像實時處理之間的關(guān)系,在幾乎不需要CPU的干涉下,利用EDMA完成了數(shù)字視頻圖像數(shù)據(jù)的高速傳輸;通過使用類驅(qū)動復(fù)用驅(qū)動程序,視頻應(yīng)用程序的開發(fā)次序獲得了極大的提高.視頻采集驅(qū)動程序現(xiàn)已在自主開發(fā)的視頻處理板上運行良好,為進(jìn)一步開發(fā)遠(yuǎn)程視頻監(jiān)控系統(tǒng)、可視電話等視頻應(yīng)用打下了堅實的基礎(chǔ).
評論