摘 要:以TMS320DM642芯片為例,介紹了一種基于DSP/BIOS類/微型驅動模型編寫視頻驅動程序的方法。在類/微型驅動模型中,通過將驅動模型分為與硬件無關和與硬件相關的兩層,使驅動程序的編寫更為簡化。應用程序通過調用類驅動的函數來間接調用微驅動函數,進而達到控制外部設備的目的。與傳統的軟件開發相比較,基于兩層的驅動模型提高驅動程序的開發效率,增加了代碼的兼容性和可移植性。
關鍵詞:TMS320DM642;DSP/BIOS;類/微型驅動模型;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
通過給外部設備編寫驅動程序是一種有效的控制外設的方法。隨著DSP的應用越來越廣泛,DSP實時系統的日趨復雜及新技術的出現,DSP處理器所連接的外部設備也是種類繁多,各不相同,而每一個外設都需要一個特定的驅動程序來支持外設的正常工作,這就要為每一個外設編寫驅動程序,這是一項十分繁雜的工作。如何能夠使系統開發人員從這些編寫繁雜的驅動程序工作中解脫出來,進而能夠專心投入到應用程序的開發中呢?TI公司提出了基于DSP/BIOS的設備驅動模型,該模型分為兩層:類驅動即與硬件不相關的層和微型驅動即與硬件相關的層。使用這種結構,應用程序只需調用類驅動的API函數,通過類驅動使用微型驅動,用微型驅動來控制外設。這種結構,將驅動程序合理分層,使得驅動程序模塊化,可移植性、復用性大大增強,縮短了驅動程序的開發時間。
1 DSP/BIOS設備驅動模型
1.1 類/微型驅動模型
DSP/BIOS是TI公司所設計開發的一個尺寸可裁剪的實時多任務操作系統內核,通過使用DSP/BIOS提供的豐富的內核服務,開發者能快速地創建滿足實時性能要求的精細復雜的多任務應用程序。為了使開發設備驅動更加簡單方便,提出了DSP/BIOS Device Driver Kit,定義了標準的設備驅動模型,一種將設備驅動分為與硬件無關和與硬件相關的雙層結構,這樣就使開發驅動程序不像以前那樣復雜了,為開發者提供了便利。這兩層結構稱為“類/微型驅動模型”[1],它們每一層都有各自通用的接口,所以相似設備驅動程序的主要部分可以復用,驅動代碼的移植成為可能,使開發驅動的過程大大簡化。
與硬件無關的層稱為類驅動(Class Driver),它處在應用程序與微型驅動之間,提供對多線程I/O請求的串行化和同步,并且維護設備數據緩沖區,向上提供API接口供應用程序調用,向下通過適配層與微型驅動相連,實現API接口函數到微型驅動層的映射。
與硬件相關的層稱為微型驅動(Mini-driver),它處在類驅動與芯片支持庫(Chip Support Library)之間,對于類驅動的接口是統一的,即每一個微型驅動都為類驅動和DSP/BIOS設備驅動管理提供了標準接口。微型驅動采用芯片支持庫(CSL)管理外圍設備的寄存器、內存和中斷資源[2]。但由于硬件是千差萬別的,所以微型驅動對底層硬件的操作是根據硬件的不同而不同的。對于完成同樣功能的不同外設,只需稍加修改微型驅動,而不需重新編寫驅動程序,就可以實現驅動程序的移植與復用,使驅動程序的開發過程大大簡化。類/微型驅動模型結構如圖1所示。

1.2 類驅動
通過將應用軟件,驅動程序分層之后,可以看到,位于頂層的應用程序并不直接與微型驅動產生聯系,而是通過類驅動與微型驅動連接。每一種類驅動向上層應用程序提供一個API接口,并且與微型驅動接口進行通信。
DSP/BIOS定義了三種類驅動:流輸入輸出模塊(SIO),管道管理模塊(PIP),通用輸入輸出模塊(GIO)。其中,SIO和PIP分別需要使用適配器DIO和PIO來與微型驅動進行通信。SIO/DIO是基于流的I/O模型,使用異步方式來操作I/O,對于數據的讀寫、處理可以同時進行。PIP/PIO是基于管道的I/O模型,每個管道維護著一個被劃分為多個大小相同的幀的緩沖區。GIO類驅動采用基于流的同步I/O數據傳輸模式,適合大流量數據的傳輸,更適合文件系統。與SIO/DIO和PIP/PIO不同,GIO包含內置的IOM(I/O Manager輸入輸出管理)適配層,可以直接與微型驅動進行通信。
GIO模塊與其他兩個模塊相比,有一個很重要的特性,就是可以擴展API函數支持新的應用領域,這樣就實現了對GIO類驅動的擴展。這種可擴展API的特性正好可以用在視頻驅動開發方面。例如這種擴展可以滿足視頻設備存儲區的需要。另外,在提供了視頻驅動和應用程序之間的視頻數據同步機制之后,這種擴展也能夠允許使用一個單獨的調用來“交換”視頻緩沖區。這種交換緩沖區的機制對于實時視頻信號的采集與顯示是十分重要的。所以,在視頻驅動中,我們采用通用輸入輸出模塊GIO。應用程序可以直接地調用GIO API函數和IOM微型驅動程序進行交互,這些GIO API就可以看作是類驅動。GIO類驅動接口如圖
2所示。
GIOcreate會為一個特定的IOM通道實例創建一個GIO對象,這是類驅動使用微型驅動的第一步,首先創建對象及IOM通道,然后在此通道上進行數據傳輸工作。其結構體類型為GIOObj:
Typedef struct GIOObj{
IOMFxn *fxns;//指向IOM函數表fxn
Uns mode;//通道的使用模式 IOMINPUT IOM
OUTPUT IOMINOUT三種模式
Uns timeout;//模塊調用所用時間
IOMPacket syncPacket;//只用于同步操作的IOMPacket
QUEObj freeList;//用于異步操作,存放在類與微型驅動
之間使用的任何IOMPacket
Ptr syncObj;//同步對象的隱性指針
Ptr mdChan;//微型驅動通道對象指針
}GIOObj,*GIOHandle;

1.3 微型驅動
微型驅動主要通過一些函數來完成對外部設備的直接控制。只要微型驅動創建了規定的函數,應用程序就可以方便地通過DIO適配模塊、PIO適配模塊或(和)GIO類驅動調用[2]。
例如:GIOcreate被調用時,會運行mdCreateChan來創建一個通道。
這些微型驅動函數包括:mdBindDev/mdUBindDev(綁定/刪除通道函數):在程序建立接口時調用,完成設備的初始化硬件設備/在程序結束時調用,卸載設備。mdCreateChan/mdDeleteChan(創建/刪除通道):需要在應用程序與設備實例之間創建一個邏輯通信通道,用于交換驅動數據。應用程序可創建一個或多個邏輯通道,微型驅動用通道對象來代表這些通道。這兩個函數就是用來分配和釋放通道對象。mdSubmitChan(遞交I/O請求):該函數處理傳遞給它的IOMPacket結構體中的命令代碼(cmd),根據命令代碼,完成相應的處理或返回錯誤代碼。ISR(服務設備中斷并完成I/O操作):IOM微型驅動在中斷的ISR中將以處理完的IOMPacket請求出隊,啟動下一次傳輸或服務請求,調用類驅動的回調函數與應用程序進行同步,并返回出隊的IOMPacket。mdControlChan(控制設備):用來操作外部設備。
這些微型驅動的函數入口放在接口表(IOMFxns)中,供適配模塊或GIO類驅動調用。
2 TMS320DM642視頻驅動
下面以TMS320DM642芯片為例,介紹有關TMS320DM642視頻采集與顯示的驅動程序的開發。通過編寫驅動程序,完成視頻信號的實時采集與顯示功能。TMS320DM642是TI公司推出的一款專門用于視頻/圖像處理的定點數字信號處理器,它基于C64x內核,帶有3個可配置的視頻端口,與視頻采集芯片直接相連,無需外加邏輯電路或FIFO緩存,只需編寫相關解編碼芯片的驅動程序,就可以完成視頻信號的采集與顯示。在這里使用的解碼、編碼芯片分別為PHILIPS SAA7115和SAA7105。
2.1 視頻類驅動
在視頻驅動程序結構中,為了最大程度地提高視頻驅動代碼的復用性和通用性,將類驅動又劃分為兩層結構[3],其中上層為FVID模型,它是在DSP/BIOS GIO類驅動之上的簡單封裝,下層是GIO類驅動程序。GIO類驅動提供獨立的、一般的API函數集并且為微型驅動提供廣泛的服務,而上層的FVID模型向上層的視頻采集、顯示結構提供定制的API函數。
在視頻驅動中,主要是通過調用FVID模塊函數來完成類驅動代碼的編寫工作。FVID主要有以下幾個API函數:FVIDcreate:分配并初始化通道對象;FVIDcontrol:向微型驅動發送控制命令;FVIDalloc:向應用程序分配視頻端口緩沖區;FVIDexchange:交換緩沖區;FVIDfree:釋放緩沖區;FVIDdelete:刪除通道對象。
在配備視頻接口的設備驅動時,至少指定它要開設3個以上的視頻緩沖區(FVID模型中,默認分配3個緩沖區)[4],幀緩沖區通過FVIDalloc(),FVIDfree(),FVIDexchange()三個函數在應用程序與驅動之間交換。
2.2 視頻微型驅動
視頻微型驅動也分為兩層結構[3],上層為通用視頻端口層部分,下層為指定編解碼芯片微驅動層部分,它們通過外部設備控制接口(External Device Control,EDC)實現對外圍芯片的操作。這種微驅動結構的好處是,當使用不同的芯片時,只需修改指定編解碼芯片微驅動那一部分,不需將整個微驅動重新編寫,使得驅動的復用性大大增強。
視頻驅動程序模型如圖3所示。
2.3 TMS320DM642視頻驅動設計步驟
2.3.1 注冊微型驅動
由于應用程序、類驅動最終都是要通過微型驅動的函數來完成對外部設備的直接控制,所以驅動程序設計的第一步就是要在DSP/BIOS Config中的Input/Output->Device Drivers->User-Defined Devices項目添加設備并注冊微驅動,進行屬性的設置[5],并指明IOMFxns函數表地址和設備參數地址,如圖4所示。

DSP/BIOS會在內部維護一個“設備表”,其中包含User-Defined Devices對象進行配置的設備實例。
2.3.2 編寫類驅動代碼
FVID函數會在設備表中查找已注冊的微驅動,并調用微驅動函數完成對外部設備的操作控制。
通常,首先利用FVIDcreate函數完成分配并初始化通道對象,返回值為設備實例句柄,這個句柄用于后續其他FVID函數調用這個已經創建的通道。然后調用FVIDcontrol函數向微型驅動發送控制命令,如配置編解碼器,發送開始采集或顯示圖像的控制命令。然后利用FVIDalloc分配緩沖區,接著應用程序將緩沖區的數據進行復制的搬移工作,當應用程序完成對緩沖區數據的采集后,調用FVIDexchange來交換緩沖區,保證視頻數據能夠實時地、源源不斷地供應用程序使用。
過程的流程圖如圖5所示。
下面是簡單的視頻采集顯示驅動的部分實現代碼:
FVIDHandle disChan;//定義顯示句柄
FVIDHandle capChan;//定義采集句柄
capChan = FVIDcreate(\"/VP0CAPTURE/A/0\",
IOMINPUT,status,(Ptr)EVMDM642vCapParamsChan,NULL);//創建采集通道
disChan = FVIDcreate(\"/VP2DISPLAY\",
IOMOUTPUT,status,(Ptr)EVMDM642vDisParamsChan,NULL);//創建顯示通道
FVIDcontrol(disChan,VPORTCMDEDCBASE + EDCCONFIG,
(Ptr)EVMDM642vDisParamsSAA7105);
//配置編碼芯片
FVIDcontrol(capChan,VPORTCMDEDCBASE + EDCCONFIG,(Ptr)EVMDM642vCapParamsSAA7115);//配置解碼芯片
FVIDcontrol(disChan,VPORTCMDSTART,NULL);//開始顯示圖像命令
FVIDcontrol(capChan,VPORTCMDSTART,NULL);//開始采集圖像命令
FVIDalloc(disChan,disFrameBuf); //分配顯示緩沖區
FVIDalloc(capChan,capFrameBuf); //分配采集緩沖區
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);
} //應用程序完成將采集緩沖區的數據復制到顯示緩沖區
DATwait(DATXFRIDWAITALL);
//等待數據傳輸結束
FVIDexchange(capChan,capFrameBuf);
//交換采集緩沖區
FVIDexchange(disChan,disFrameBuf);
//交換顯示緩沖區
}
3 結 語
本文介紹了基于TI公司的類/微型驅動模型進行視頻驅動設計的原理及主要方法,利用這兩層的驅動模型不僅簡化了驅動程序的編寫過程,縮短了開發時間,而且使代碼的復用性和可移植性大大提高,稍加改動相應的底層接口就可以用于其他的DSP系統中,真正使視頻驅動的開發過程得到簡化。

參 考 文 獻
[1]Texas Instrument.DSP/BIOS Driver Developer′s Guide,Literature Number: SPRU616,2002.
[2]陳彬,魏丹,鄧德祥,等.C64x系列DSP/BIOS中設備驅動程序的設計[J].電子技術應用,2004,30(11):67-70,73.
[3]Texas Instrument.The TMS320DM642 Video Port Mini-Driver,Literature Number: SPRA918A,2003.
[4]臧博,吳裕斌,曹丹華.基于GIO/FVID的DSP視頻處理驅動程序[J].單片機與嵌入式系統應用,2006(8):27-29,42.
[5]胡濤,劉穎娟.用類/微驅動模型開發DSP視頻驅動程序[J].單片機與嵌入式系統應用,2007(5):15-17.
作者簡介 嚴新忠 男,1965年出生,副教授。主要研究方向為信息處理與通信技術。
劉 喆 男,1983年出生,工學碩士。主要研究方向為信息處理與通信技術。