摘 要:以TMS320DM642芯片為例,介紹了一種基于DSP/BIOS類/微型驅(qū)動模型編寫視頻驅(qū)動程序的方法。在類/微型驅(qū)動模型中,通過將驅(qū)動模型分為與硬件無關(guān)和與硬件相關(guān)的兩層,使驅(qū)動程序的編寫更為簡化。應(yīng)用程序通過調(diào)用類驅(qū)動的函數(shù)來間接調(diào)用微驅(qū)動函數(shù),進而達到控制外部設(shè)備的目的。與傳統(tǒng)的軟件開發(fā)相比較,基于兩層的驅(qū)動模型提高驅(qū)動程序的開發(fā)效率,增加了代碼的兼容性和可移植性。
關(guān)鍵詞:TMS320DM642;DSP/BIOS;類/微型驅(qū)動模型;GIO;幀視頻模塊
中圖分類號:TP391 文獻標識碼:B 文章編號:1004373X(2008)1517404
Development of Video Port Driver Based on DSP/BIOS Device Driver Model
YAN Xinzhong,LIU Zhe
(School of Electronic Information and Automation,Tianjin University of Science Technology,Tianjin,300222,China)
Abstract:This paper takes TMS320DM642 DSP for example and introduces a method of programming the device driver,which based on DSP/BIOS Class/Mini driver model.The Class/Mini driver model is divided into two layers.One is device-independent layer and the other is device-specific layer.This architecture makes it easier to program the device driver.The application uses class driver API to call the mini driver function indirectly in order to control the peripheral device.Compared with the traditional software development,the driver development based on the two-layer device driver model improves efficiency and increases compatibility and portability.
Keywords:TMS320DM642;DSP/BIOS;class/mini driver model;GIO;frame video model
通過給外部設(shè)備編寫驅(qū)動程序是一種有效的控制外設(shè)的方法。隨著DSP的應(yīng)用越來越廣泛,DSP實時系統(tǒng)的日趨復(fù)雜及新技術(shù)的出現(xiàn),DSP處理器所連接的外部設(shè)備也是種類繁多,各不相同,而每一個外設(shè)都需要一個特定的驅(qū)動程序來支持外設(shè)的正常工作,這就要為每一個外設(shè)編寫驅(qū)動程序,這是一項十分繁雜的工作。如何能夠使系統(tǒng)開發(fā)人員從這些編寫繁雜的驅(qū)動程序工作中解脫出來,進而能夠?qū)P耐度氲綉?yīng)用程序的開發(fā)中呢?TI公司提出了基于DSP/BIOS的設(shè)備驅(qū)動模型,該模型分為兩層:類驅(qū)動即與硬件不相關(guān)的層和微型驅(qū)動即與硬件相關(guān)的層。使用這種結(jié)構(gòu),應(yīng)用程序只需調(diào)用類驅(qū)動的API函數(shù),通過類驅(qū)動使用微型驅(qū)動,用微型驅(qū)動來控制外設(shè)。這種結(jié)構(gòu),將驅(qū)動程序合理分層,使得驅(qū)動程序模塊化,可移植性、復(fù)用性大大增強,縮短了驅(qū)動程序的開發(fā)時間。
1 DSP/BIOS設(shè)備驅(qū)動模型
1.1 類/微型驅(qū)動模型
DSP/BIOS是TI公司所設(shè)計開發(fā)的一個尺寸可裁剪的實時多任務(wù)操作系統(tǒng)內(nèi)核,通過使用DSP/BIOS提供的豐富的內(nèi)核服務(wù),開發(fā)者能快速地創(chuàng)建滿足實時性能要求的精細復(fù)雜的多任務(wù)應(yīng)用程序。為了使開發(fā)設(shè)備驅(qū)動更加簡單方便,提出了DSP/BIOS Device Driver Kit,定義了標準的設(shè)備驅(qū)動模型,一種將設(shè)備驅(qū)動分為與硬件無關(guān)和與硬件相關(guān)的雙層結(jié)構(gòu),這樣就使開發(fā)驅(qū)動程序不像以前那樣復(fù)雜了,為開發(fā)者提供了便利。這兩層結(jié)構(gòu)稱為“類/微型驅(qū)動模型”[1],它們每一層都有各自通用的接口,所以相似設(shè)備驅(qū)動程序的主要部分可以復(fù)用,驅(qū)動代碼的移植成為可能,使開發(fā)驅(qū)動的過程大大簡化。
與硬件無關(guān)的層稱為類驅(qū)動(Class Driver),它處在應(yīng)用程序與微型驅(qū)動之間,提供對多線程I/O請求的串行化和同步,并且維護設(shè)備數(shù)據(jù)緩沖區(qū),向上提供API接口供應(yīng)用程序調(diào)用,向下通過適配層與微型驅(qū)動相連,實現(xiàn)API接口函數(shù)到微型驅(qū)動層的映射。
與硬件相關(guān)的層稱為微型驅(qū)動(Mini-driver),它處在類驅(qū)動與芯片支持庫(Chip Support Library)之間,對于類驅(qū)動的接口是統(tǒng)一的,即每一個微型驅(qū)動都為類驅(qū)動和DSP/BIOS設(shè)備驅(qū)動管理提供了標準接口。微型驅(qū)動采用芯片支持庫(CSL)管理外圍設(shè)備的寄存器、內(nèi)存和中斷資源[2]。但由于硬件是千差萬別的,所以微型驅(qū)動對底層硬件的操作是根據(jù)硬件的不同而不同的。對于完成同樣功能的不同外設(shè),只需稍加修改微型驅(qū)動,而不需重新編寫驅(qū)動程序,就可以實現(xiàn)驅(qū)動程序的移植與復(fù)用,使驅(qū)動程序的開發(fā)過程大大簡化。類/微型驅(qū)動模型結(jié)構(gòu)如圖1所示。
1.2 類驅(qū)動
通過將應(yīng)用軟件,驅(qū)動程序分層之后,可以看到,位于頂層的應(yīng)用程序并不直接與微型驅(qū)動產(chǎn)生聯(lián)系,而是通過類驅(qū)動與微型驅(qū)動連接。每一種類驅(qū)動向上層應(yīng)用程序提供一個API接口,并且與微型驅(qū)動接口進行通信。
DSP/BIOS定義了三種類驅(qū)動:流輸入輸出模塊(SIO),管道管理模塊(PIP),通用輸入輸出模塊(GIO)。其中,SIO和PIP分別需要使用適配器DIO和PIO來與微型驅(qū)動進行通信。SIO/DIO是基于流的I/O模型,使用異步方式來操作I/O,對于數(shù)據(jù)的讀寫、處理可以同時進行。PIP/PIO是基于管道的I/O模型,每個管道維護著一個被劃分為多個大小相同的幀的緩沖區(qū)。GIO類驅(qū)動采用基于流的同步I/O數(shù)據(jù)傳輸模式,適合大流量數(shù)據(jù)的傳輸,更適合文件系統(tǒng)。與SIO/DIO和PIP/PIO不同,GIO包含內(nèi)置的IOM(I/O Manager輸入輸出管理)適配層,可以直接與微型驅(qū)動進行通信。
GIO模塊與其他兩個模塊相比,有一個很重要的特性,就是可以擴展API函數(shù)支持新的應(yīng)用領(lǐng)域,這樣就實現(xiàn)了對GIO類驅(qū)動的擴展。這種可擴展API的特性正好可以用在視頻驅(qū)動開發(fā)方面。例如這種擴展可以滿足視頻設(shè)備存儲區(qū)的需要。另外,在提供了視頻驅(qū)動和應(yīng)用程序之間的視頻數(shù)據(jù)同步機制之后,這種擴展也能夠允許使用一個單獨的調(diào)用來“交換”視頻緩沖區(qū)。這種交換緩沖區(qū)的機制對于實時視頻信號的采集與顯示是十分重要的。所以,在視頻驅(qū)動中,我們采用通用輸入輸出模塊GIO。應(yīng)用程序可以直接地調(diào)用GIO API函數(shù)和IOM微型驅(qū)動程序進行交互,這些GIO API就可以看作是類驅(qū)動。GIO類驅(qū)動接口如圖
2所示。
GIOcreate會為一個特定的IOM通道實例創(chuàng)建一個GIO對象,這是類驅(qū)動使用微型驅(qū)動的第一步,首先創(chuàng)建對象及IOM通道,然后在此通道上進行數(shù)據(jù)傳輸工作。其結(jié)構(gòu)體類型為GIOObj:
Typedef struct GIOObj{
IOMFxn *fxns;//指向IOM函數(shù)表fxn
Uns mode;//通道的使用模式 IOMINPUT IOM
OUTPUT IOMINOUT三種模式
Uns timeout;//模塊調(diào)用所用時間
IOMPacket syncPacket;//只用于同步操作的IOMPacket
QUEObj freeList;//用于異步操作,存放在類與微型驅(qū)動
之間使用的任何IOMPacket
Ptr syncObj;//同步對象的隱性指針
Ptr mdChan;//微型驅(qū)動通道對象指針
}GIOObj,*GIOHandle;
1.3 微型驅(qū)動
微型驅(qū)動主要通過一些函數(shù)來完成對外部設(shè)備的直接控制。只要微型驅(qū)動創(chuàng)建了規(guī)定的函數(shù),應(yīng)用程序就可以方便地通過DIO適配模塊、PIO適配模塊或(和)GIO類驅(qū)動調(diào)用[2]。
例如:GIOcreate被調(diào)用時,會運行mdCreateChan來創(chuàng)建一個通道。
這些微型驅(qū)動函數(shù)包括:mdBindDev/mdUBindDev(綁定/刪除通道函數(shù)):在程序建立接口時調(diào)用,完成設(shè)備的初始化硬件設(shè)備/在程序結(jié)束時調(diào)用,卸載設(shè)備。mdCreateChan/mdDeleteChan(創(chuàng)建/刪除通道):需要在應(yīng)用程序與設(shè)備實例之間創(chuàng)建一個邏輯通信通道,用于交換驅(qū)動數(shù)據(jù)。應(yīng)用程序可創(chuàng)建一個或多個邏輯通道,微型驅(qū)動用通道對象來代表這些通道。這兩個函數(shù)就是用來分配和釋放通道對象。mdSubmitChan(遞交I/O請求):該函數(shù)處理傳遞給它的IOMPacket結(jié)構(gòu)體中的命令代碼(cmd),根據(jù)命令代碼,完成相應(yīng)的處理或返回錯誤代碼。ISR(服務(wù)設(shè)備中斷并完成I/O操作):IOM微型驅(qū)動在中斷的ISR中將以處理完的IOMPacket請求出隊,啟動下一次傳輸或服務(wù)請求,調(diào)用類驅(qū)動的回調(diào)函數(shù)與應(yīng)用程序進行同步,并返回出隊的IOMPacket。mdControlChan(控制設(shè)備):用來操作外部設(shè)備。
這些微型驅(qū)動的函數(shù)入口放在接口表(IOMFxns)中,供適配模塊或GIO類驅(qū)動調(diào)用。
2 TMS320DM642視頻驅(qū)動
下面以TMS320DM642芯片為例,介紹有關(guān)TMS320DM642視頻采集與顯示的驅(qū)動程序的開發(fā)。通過編寫驅(qū)動程序,完成視頻信號的實時采集與顯示功能。TMS320DM642是TI公司推出的一款專門用于視頻/圖像處理的定點數(shù)字信號處理器,它基于C64x內(nèi)核,帶有3個可配置的視頻端口,與視頻采集芯片直接相連,無需外加邏輯電路或FIFO緩存,只需編寫相關(guān)解編碼芯片的驅(qū)動程序,就可以完成視頻信號的采集與顯示。在這里使用的解碼、編碼芯片分別為PHILIPS SAA7115和SAA7105。
2.1 視頻類驅(qū)動
在視頻驅(qū)動程序結(jié)構(gòu)中,為了最大程度地提高視頻驅(qū)動代碼的復(fù)用性和通用性,將類驅(qū)動又劃分為兩層結(jié)構(gòu)[3],其中上層為FVID模型,它是在DSP/BIOS GIO類驅(qū)動之上的簡單封裝,下層是GIO類驅(qū)動程序。GIO類驅(qū)動提供獨立的、一般的API函數(shù)集并且為微型驅(qū)動提供廣泛的服務(wù),而上層的FVID模型向上層的視頻采集、顯示結(jié)構(gòu)提供定制的API函數(shù)。
在視頻驅(qū)動中,主要是通過調(diào)用FVID模塊函數(shù)來完成類驅(qū)動代碼的編寫工作。FVID主要有以下幾個API函數(shù):FVIDcreate:分配并初始化通道對象;FVIDcontrol:向微型驅(qū)動發(fā)送控制命令;FVIDalloc:向應(yīng)用程序分配視頻端口緩沖區(qū);FVIDexchange:交換緩沖區(qū);FVIDfree:釋放緩沖區(qū);FVIDdelete:刪除通道對象。
在配備視頻接口的設(shè)備驅(qū)動時,至少指定它要開設(shè)3個以上的視頻緩沖區(qū)(FVID模型中,默認分配3個緩沖區(qū))[4],幀緩沖區(qū)通過FVIDalloc(),F(xiàn)VIDfree(),F(xiàn)VIDexchange()三個函數(shù)在應(yīng)用程序與驅(qū)動之間交換。
2.2 視頻微型驅(qū)動
視頻微型驅(qū)動也分為兩層結(jié)構(gòu)[3],上層為通用視頻端口層部分,下層為指定編解碼芯片微驅(qū)動層部分,它們通過外部設(shè)備控制接口(External Device Control,EDC)實現(xiàn)對外圍芯片的操作。這種微驅(qū)動結(jié)構(gòu)的好處是,當使用不同的芯片時,只需修改指定編解碼芯片微驅(qū)動那一部分,不需將整個微驅(qū)動重新編寫,使得驅(qū)動的復(fù)用性大大增強。
視頻驅(qū)動程序模型如圖3所示。
2.3 TMS320DM642視頻驅(qū)動設(shè)計步驟
2.3.1 注冊微型驅(qū)動
由于應(yīng)用程序、類驅(qū)動最終都是要通過微型驅(qū)動的函數(shù)來完成對外部設(shè)備的直接控制,所以驅(qū)動程序設(shè)計的第一步就是要在DSP/BIOS Config中的Input/Output->Device Drivers->User-Defined Devices項目添加設(shè)備并注冊微驅(qū)動,進行屬性的設(shè)置[5],并指明IOMFxns函數(shù)表地址和設(shè)備參數(shù)地址,如圖4所示。
DSP/BIOS會在內(nèi)部維護一個“設(shè)備表”,其中包含User-Defined Devices對象進行配置的設(shè)備實例。
2.3.2 編寫類驅(qū)動代碼
FVID函數(shù)會在設(shè)備表中查找已注冊的微驅(qū)動,并調(diào)用微驅(qū)動函數(shù)完成對外部設(shè)備的操作控制。
通常,首先利用FVIDcreate函數(shù)完成分配并初始化通道對象,返回值為設(shè)備實例句柄,這個句柄用于后續(xù)其他FVID函數(shù)調(diào)用這個已經(jīng)創(chuàng)建的通道。然后調(diào)用FVIDcontrol函數(shù)向微型驅(qū)動發(fā)送控制命令,如配置編解碼器,發(fā)送開始采集或顯示圖像的控制命令。然后利用FVIDalloc分配緩沖區(qū),接著應(yīng)用程序?qū)⒕彌_區(qū)的數(shù)據(jù)進行復(fù)制的搬移工作,當應(yīng)用程序完成對緩沖區(qū)數(shù)據(jù)的采集后,調(diào)用FVIDexchange來交換緩沖區(qū),保證視頻數(shù)據(jù)能夠?qū)崟r地、源源不斷地供應(yīng)用程序使用。
過程的流程圖如圖5所示。
下面是簡單的視頻采集顯示驅(qū)動的部分實現(xiàn)代碼:
FVIDHandle disChan;//定義顯示句柄
FVIDHandle capChan;//定義采集句柄
capChan = FVIDcreate(\"/VP0CAPTURE/A/0\",
IOMINPUT,status,(Ptr)EVMDM642vCapParamsChan,NULL);//創(chuàng)建采集通道
disChan = FVIDcreate(\"/VP2DISPLAY\",
IOMOUTPUT,status,(Ptr)EVMDM642vDisParamsChan,NULL);//創(chuàng)建顯示通道
FVIDcontrol(disChan,VPORTCMDEDCBASE + EDCCONFIG,
(Ptr)EVMDM642vDisParamsSAA7105);
//配置編碼芯片
FVIDcontrol(capChan,VPORTCMDEDCBASE + EDCCONFIG,(Ptr)EVMDM642vCapParamsSAA7115);//配置解碼芯片
FVIDcontrol(disChan,VPORTCMDSTART,NULL);//開始顯示圖像命令
FVIDcontrol(capChan,VPORTCMDSTART,NULL);//開始采集圖像命令
FVIDalloc(disChan,disFrameBuf); //分配顯示緩沖區(qū)
FVIDalloc(capChan,capFrameBuf); //分配采集緩沖區(qū)
while(1){
for(i = 0;i < numLines;i ++) {
DATcopy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
disFrameBuf->frame.iFrm.y1 + i * disLinePitch,
numPixels);
DATcopy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1),
numPixels>>1);
DATcopy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1),
numPixels>>1);
} //應(yīng)用程序完成將采集緩沖區(qū)的數(shù)據(jù)復(fù)制到顯示緩沖區(qū)
DATwait(DATXFRIDWAITALL);
//等待數(shù)據(jù)傳輸結(jié)束
FVIDexchange(capChan,capFrameBuf);
//交換采集緩沖區(qū)
FVIDexchange(disChan,disFrameBuf);
//交換顯示緩沖區(qū)
}
3 結(jié) 語
本文介紹了基于TI公司的類/微型驅(qū)動模型進行視頻驅(qū)動設(shè)計的原理及主要方法,利用這兩層的驅(qū)動模型不僅簡化了驅(qū)動程序的編寫過程,縮短了開發(fā)時間,而且使代碼的復(fù)用性和可移植性大大提高,稍加改動相應(yīng)的底層接口就可以用于其他的DSP系統(tǒng)中,真正使視頻驅(qū)動的開發(fā)過程得到簡化。
參 考 文 獻
[1]Texas Instrument.DSP/BIOS Driver Developer′s Guide,Literature Number: SPRU616,2002.
[2]陳彬,魏丹,鄧德祥,等.C64x系列DSP/BIOS中設(shè)備驅(qū)動程序的設(shè)計[J].電子技術(shù)應(yīng)用,2004,30(11):67-70,73.
[3]Texas Instrument.The TMS320DM642 Video Port Mini-Driver,Literature Number: SPRA918A,2003.
[4]臧博,吳裕斌,曹丹華.基于GIO/FVID的DSP視頻處理驅(qū)動程序[J].單片機與嵌入式系統(tǒng)應(yīng)用,2006(8):27-29,42.
[5]胡濤,劉穎娟.用類/微驅(qū)動模型開發(fā)DSP視頻驅(qū)動程序[J].單片機與嵌入式系統(tǒng)應(yīng)用,2007(5):15-17.
作者簡介 嚴新忠 男,1965年出生,副教授。主要研究方向為信息處理與通信技術(shù)。
劉 喆 男,1983年出生,工學(xué)碩士。主要研究方向為信息處理與通信技術(shù)。