基于GIO/FVID的F2812DSP的視頻處理系統(tǒng)
3.1 設(shè)備驅(qū)動程序模型的選擇
如上文介紹,常用的驅(qū)動程序模型包括3類:PIO、SIO和GIO。比較這3種模型可以知道:PIO支持更底層的通信,適合設(shè)計(jì)比較簡單的外設(shè)驅(qū)動程序。例如在TI公司的6X11DSK板上實(shí)現(xiàn)的音頻采集和回放,一般都是基于PIO模型的。而SIO模型具有很好的緩沖器分配回收機(jī)制,比較適合描述視頻設(shè)備,但是SIO的很多功能在本系統(tǒng)中使用不到,而且GIO模型設(shè)計(jì)的目的就是針對特殊硬件的新型設(shè)備,所以最終考慮使用GIO設(shè)備驅(qū)動模型。
TI公司最初設(shè)計(jì)的GIO模型其實(shí)是有缺陷的,主要在數(shù)據(jù)緩沖區(qū)管理的問題上,應(yīng)用程序在取得緩沖區(qū)進(jìn)行數(shù)據(jù)處理之后,卻無法將緩沖區(qū)返回設(shè)備驅(qū)動程序。于是TI公司在推出DM6北這一款主要用于視頻處理的DSP芯片的同時,對GIO模型進(jìn)行了改進(jìn),提出了專門針對視頻設(shè)備的FVID模型。FVID模型是建立在GIO模型之上的,以FVID_alloc、FVID_exchangc、FVID_free函數(shù)對GIO模型中的GIO_submit函數(shù)進(jìn)行封裝,解決了GIO模型中驅(qū)動程序不能回收緩沖區(qū)的問題。
此外FVID模型還專門設(shè)計(jì)了FVID_frame結(jié)構(gòu)。此結(jié)構(gòu)中包含了常用的視頻信號的信息,如行數(shù)、列數(shù)、YUV結(jié)構(gòu)、場頻等,很適合描述視頻數(shù)據(jù)幀。但FVID主要是針對DM64X系統(tǒng)設(shè)計(jì)的,DM64X的很多功能在F2812 DSP上都不具備。所以本設(shè)計(jì)針對F2812 DSP視頻處理系統(tǒng),對FVID模型進(jìn)行了一定的簡化,保留類驅(qū)動程序,而重寫了迷你驅(qū)動層程序。
3.2 視頻處理程序運(yùn)行流程
在設(shè)計(jì)完成的視頻驅(qū)動程序基礎(chǔ)上,開發(fā)一個典型的視頻處理應(yīng)用程序,其運(yùn)行流程如圖3所示。首先使用FVID_create函數(shù)建立GIO_capture和GIO_play兩個視頻通道.再以GIO_capture通道的FVID_control函數(shù)發(fā)出cmd_start,采集到1幀視頻數(shù)據(jù)。應(yīng)用程序以GIO_capture通道的FVID_alloc函數(shù)向驅(qū)動程序申請采集到的數(shù)據(jù)幀,進(jìn)行處理后再以FVID_exchange函數(shù)將修改后的數(shù)據(jù)幀返回驅(qū)動程序,最后再調(diào)用GI0_play通道的FVID_control函數(shù)發(fā)出cmd_display命令將數(shù)據(jù)幀輸出。由圖3可以看到,應(yīng)用程序調(diào)用的這些FVID_XXX接口函數(shù)會自動由類驅(qū)動程序?qū)訉酉蛳掠成洌竭_(dá)迷你驅(qū)動層程序;而迷你層程序可以直接操縱底層硬件設(shè)備,來完成整個視頻的采集、處理和顯示的過程。
3.3 迷你驅(qū)動程序的設(shè)計(jì)
迷你層驅(qū)動程序足整個設(shè)計(jì)的重點(diǎn)所在,下面詳細(xì)介紹其實(shí)現(xiàn)方法。迷你層驅(qū)動程序主要由表1所列的幾個函數(shù)組成。
對各個函數(shù)的具體實(shí)現(xiàn)如下:
①mdBindDev函數(shù)。在應(yīng)用程序建立設(shè)備接口(如FVID_create函數(shù))時被調(diào)用,完成對外部設(shè)備的初始化。而與其對應(yīng)的是md_UBindDev函數(shù),使用nadUBindDev函數(shù)會使設(shè)備處于無效狀態(tài),不能再使用。
?、趍dCreateChan函數(shù)。使用此函數(shù)為應(yīng)用程序和驅(qū)動程序建立通信通道,同時為每個通道申請緩沖區(qū)。在TI公司發(fā) 布的FVID模型中,為每個通道都分配了3個緩沖區(qū),輪流與外部設(shè)備交換數(shù)據(jù),每個緩沖區(qū)對應(yīng)1幀視頻數(shù)據(jù),這樣的設(shè)計(jì)在DM642這樣可以外擴(kuò)大容量SDRAM的系統(tǒng)中是完全可行的。但是對于本系統(tǒng),F2812DSP外部只擴(kuò)展了512K×16位的SRAM,既要做視頻輸入的幀緩存,義要存放一部分程序,這樣存儲空間就不夠了。所以本設(shè)計(jì)中進(jìn)行了簡化,對視頻輸入設(shè)備采用兩緩沖區(qū)輪轉(zhuǎn)的機(jī)制,如圖4(a)所示。而對于視頻輸出設(shè)備,以AL422 FIFO作為硬件幀緩存,而不在SRAM中再為其分配緩沖區(qū)。與mdCreateChan對應(yīng)的是md-DeleteChan函數(shù),用于刪除設(shè)備通道,釋放緩沖區(qū)資源。
③mdSubmitChan函數(shù)。負(fù)責(zé)管理緩沖區(qū)。分別接受應(yīng)用程序發(fā)出的FVID_ALLOC、FVID_EXCHANGE、FVID_FREE三個命令并進(jìn)行處理。其中FVID_ALLOC命令對應(yīng)圖4中(a)到(b)的過程,應(yīng)用程序從兩個緩沖區(qū)中取出最新的一幀視顴數(shù)據(jù),塒其中的數(shù)據(jù)做處理,而只剩下一個緩沖區(qū)用來接受外部設(shè)備輸入的數(shù)據(jù)。FVID_EXCHANGE對應(yīng)圖4中(b)到(c)的過程,應(yīng)用程序處理完1幀數(shù)據(jù),將這1幀數(shù)據(jù)返回驅(qū)動程序,準(zhǔn)備用來顯示,同時再讀入新的l幀數(shù)據(jù)進(jìn)行處理。FVID_FREE對應(yīng)圖4中(c)到(a)的過程,應(yīng)用程序?qū)⑻幚硗甑臄?shù)據(jù)幀返回驅(qū)動程序,而不再向驅(qū)動程序申請新的數(shù)據(jù)幀。以上3個命令足針對視頻輸入接口GIO_capture而言的,而對于輸出設(shè)備接口GIO_play,在SRAM中沒有分配緩沖區(qū),所以其nldSubmitChan函數(shù)內(nèi)部設(shè)為空函數(shù)。
?、躮dControlChan函數(shù)。用來操作外部視頻設(shè)備,完成對視頻數(shù)據(jù)的采集和輸出。對于GIO_capture和GIO_play這兩個設(shè)備接口的mdControlChan函數(shù)接受的命令是不同的:
視頻輸入GIO_capture接口的mdControlCham函數(shù)只接受cmd_start命令,完成1幀視頻數(shù)據(jù)的采集;而視頻輸出GIO_play接口的mdControlChan函數(shù)只接受cmd_display命令.完成視頻信號的輸出。
評論