基于GIO/FVID的F2812DSP的視頻處理系統
3.1 設備驅動程序模型的選擇
如上文介紹,常用的驅動程序模型包括3類:PIO、SIO和GIO。比較這3種模型可以知道:PIO支持更底層的通信,適合設計比較簡單的外設驅動程序。例如在TI公司的6X11DSK板上實現的音頻采集和回放,一般都是基于PIO模型的。而SIO模型具有很好的緩沖器分配回收機制,比較適合描述視頻設備,但是SIO的很多功能在本系統中使用不到,而且GIO模型設計的目的就是針對特殊硬件的新型設備,所以最終考慮使用GIO設備驅動模型。
TI公司最初設計的GIO模型其實是有缺陷的,主要在數據緩沖區管理的問題上,應用程序在取得緩沖區進行數據處理之后,卻無法將緩沖區返回設備驅動程序。于是TI公司在推出DM6北這一款主要用于視頻處理的DSP芯片的同時,對GIO模型進行了改進,提出了專門針對視頻設備的FVID模型。FVID模型是建立在GIO模型之上的,以FVID_alloc、FVID_exchangc、FVID_free函數對GIO模型中的GIO_submit函數進行封裝,解決了GIO模型中驅動程序不能回收緩沖區的問題。
此外FVID模型還專門設計了FVID_frame結構。此結構中包含了常用的視頻信號的信息,如行數、列數、YUV結構、場頻等,很適合描述視頻數據幀。但FVID主要是針對DM64X系統設計的,DM64X的很多功能在F2812 DSP上都不具備。所以本設計針對F2812 DSP視頻處理系統,對FVID模型進行了一定的簡化,保留類驅動程序,而重寫了迷你驅動層程序。

3.2 視頻處理程序運行流程
在設計完成的視頻驅動程序基礎上,開發一個典型的視頻處理應用程序,其運行流程如圖3所示。首先使用FVID_create函數建立GIO_capture和GIO_play兩個視頻通道.再以GIO_capture通道的FVID_control函數發出cmd_start,采集到1幀視頻數據。應用程序以GIO_capture通道的FVID_alloc函數向驅動程序申請采集到的數據幀,進行處理后再以FVID_exchange函數將修改后的數據幀返回驅動程序,最后再調用GI0_play通道的FVID_control函數發出cmd_display命令將數據幀輸出。由圖3可以看到,應用程序調用的這些FVID_XXX接口函數會自動由類驅動程序層層向下映射,到達迷你驅動層程序;而迷你層程序可以直接操縱底層硬件設備,來完成整個視頻的采集、處理和顯示的過程。

3.3 迷你驅動程序的設計
迷你層驅動程序足整個設計的重點所在,下面詳細介紹其實現方法。迷你層驅動程序主要由表1所列的幾個函數組成。
對各個函數的具體實現如下:
①mdBindDev函數。在應用程序建立設備接口(如FVID_create函數)時被調用,完成對外部設備的初始化。而與其對應的是md_UBindDev函數,使用nadUBindDev函數會使設備處于無效狀態,不能再使用。
②mdCreateChan函數。使用此函數為應用程序和驅動程序建立通信通道,同時為每個通道申請緩沖區。在TI公司發 布的FVID模型中,為每個通道都分配了3個緩沖區,輪流與外部設備交換數據,每個緩沖區對應1幀視頻數據,這樣的設計在DM642這樣可以外擴大容量SDRAM的系統中是完全可行的。但是對于本系統,F2812DSP外部只擴展了512K×16位的SRAM,既要做視頻輸入的幀緩存,義要存放一部分程序,這樣存儲空間就不夠了。所以本設計中進行了簡化,對視頻輸入設備采用兩緩沖區輪轉的機制,如圖4(a)所示。而對于視頻輸出設備,以AL422 FIFO作為硬件幀緩存,而不在SRAM中再為其分配緩沖區。與mdCreateChan對應的是md-DeleteChan函數,用于刪除設備通道,釋放緩沖區資源。
③mdSubmitChan函數。負責管理緩沖區。分別接受應用程序發出的FVID_ALLOC、FVID_EXCHANGE、FVID_FREE三個命令并進行處理。其中FVID_ALLOC命令對應圖4中(a)到(b)的過程,應用程序從兩個緩沖區中取出最新的一幀視顴數據,塒其中的數據做處理,而只剩下一個緩沖區用來接受外部設備輸入的數據。FVID_EXCHANGE對應圖4中(b)到(c)的過程,應用程序處理完1幀數據,將這1幀數據返回驅動程序,準備用來顯示,同時再讀入新的l幀數據進行處理。FVID_FREE對應圖4中(c)到(a)的過程,應用程序將處理完的數據幀返回驅動程序,而不再向驅動程序申請新的數據幀。以上3個命令足針對視頻輸入接口GIO_capture而言的,而對于輸出設備接口GIO_play,在SRAM中沒有分配緩沖區,所以其nldSubmitChan函數內部設為空函數。

④mdControlChan函數。用來操作外部視頻設備,完成對視頻數據的采集和輸出。對于GIO_capture和GIO_play這兩個設備接口的mdControlChan函數接受的命令是不同的:
視頻輸入GIO_capture接口的mdControlCham函數只接受cmd_start命令,完成1幀視頻數據的采集;而視頻輸出GIO_play接口的mdControlChan函數只接受cmd_display命令.完成視頻信號的輸出。
評論