基于GIO/FVID的DSP視頻處理驅動程序
引言
隨著時代的發(fā)展,dsp技術在遠程監(jiān)控、可視電話、工業(yè)檢測等視頻處理領域得到了廣泛的應用,對于不同的視頻處理系統(tǒng),會使用不同的視頻設備,所以有必要為視頻設備設計驅動程序,為高層應用程序提供統(tǒng)一的接口來操作底層硬件。只要是遵行此驅動程序接口標準開發(fā)的高層應用程序,都可以在具有相同接口的不同硬件平臺上運行,具有很好的通用性和可移植性,同時高層應用程序設計人員只要會使用設備驅動程序提供的api接口,就不必了解底層硬件的具體實現,可以大大地提高整體視頻系統(tǒng)的開發(fā)效率。
對于視頻設備,ti公司提出了對應的視頻設備驅動程序模型,但這些模型主要是針對6000系列高端dsp,甚至是dm64x這樣的視頻處理專用dsp設計的,而tms320f2812(簡稱f2812)dsp這樣的低端處理器,內部存儲空間較小,且沒有dm64x那樣專用的視頻接口,本文針對這類問題,提出了對ti視頻驅動模型進行簡化和改造的方法,使視頻設備驅動程序占用盡量少的系統(tǒng)資源,來完成對視頻硬件設備的操作,這種視頻驅動模型的裁減方法,對于使用低端處理器的視頻處理系統(tǒng)具有可借鑒性。
1 基于dsp/bios的外設驅動開發(fā)模型
ti公司為開發(fā)dsp的外設驅動程序,推出了dsp/bios device drive kit[1],定義了標準的設備驅動模型,并提供了一系列的api接口,如圖1所示,外設驅動程序分為兩層:

①類驅動(class driver),類驅動程序用來為應用程序提供接口,這部分程序與設備無關,主要功能包括維護設備數據緩沖區(qū),向上提供api接口供應用層程序調用,并協(xié)調應用程序對外設操作的同步和阻塞,向下提供適配層與迷你驅動層相連,實現api接口函數到迷你驅動程序的映射,類驅動程序與硬件無關,只要外設驅動模型選定了,類驅動程序就定下來了,不需要作多少修改。
②迷你驅動(mini driver),迷你驅動程序與設備相關,所以設計迷你驅動程序是外設驅動開發(fā)中的重點,迷你驅動程序與類驅動層的接口格式是統(tǒng)一的,但迷你驅動程序對底層硬件的操作是根據硬件平臺的不同而變化的,迷你驅動接收類驅動層發(fā)出的iom_packet命令包,決定對底層硬件進行什么樣的操作。
外設驅動程序模型又可以分為以下3類[2]:
1)pip/pio模型?;跀祿艿赖膇/o模型,每個管道都在維護自己的一個緩沖區(qū)。當數據寫入緩沖區(qū),或從緩沖區(qū)取出數據時,便會激發(fā)notifyreader和notifywriter函數實現數據的同步。
2)sio/dio模型,基于數據的i/o模型,一個數據流是單向的,要么是輸入,要么是輸出,而且sio/dio模型使用異步方式來操作i/o,對于數據的讀寫、處理可以同時進行[3]。
3)gio模型,通用的i/o模型,靈活性很強,且沒有適配層、直接操作迷你驅動程序,主要用來設計新型的設備驅動模型。
2 視頻處理系統(tǒng)硬件平臺
硬件平臺如圖2所示,系統(tǒng)以ti公司的f2812 dsp作為中心處理器,以模擬攝像機進行視頻信號采集,再使用saa7111視頻解碼芯片將其轉換為bt601格式的數字視頻信號,dsp將數字視頻信號處理后,再寫入輸出幀緩存al422中,并控制視頻編碼芯片adv7177,將其轉換為模擬電視信號輸出。整個系統(tǒng)以1片cpld——ispmach
lc4128來協(xié)調各個芯片之間的時序關系。

3 視頻設備驅動程序開發(fā)
3.1 設備驅動程序模型的選擇
如上文介紹,常用的驅動程序模型包括3類:pio、sio和gio。比較這3種模型可以知道:pio支持更底層的通信,適合設計比較簡單的外設驅動程序,例如在ti公司的6x11dsk板上實現的音頻采集和回放,一般都是基于pio模型的[4],而sio模型具有很好的緩沖器分配回收機制,比較適合描述視頻設備,但是sio的很多功能在本系統(tǒng)中使用不到,而且gio模型設計的目的解決針對特殊硬件的新型設備,所以最終考慮使用gio的設備驅動模型。
ti公司最初設計的gio模型[3]其實是有缺陷的,主要在數據緩沖區(qū)管理的問題上,應用程序在取得緩沖區(qū)進行數據處理之后,卻無法將緩沖區(qū)返回設備驅動程序,于是ti公司在推出dm642這一款主要用于視頻處理的dsp芯片的同時,對gio模型進行了改進,提出了專門針對視頻設備的fvid模型[5],fvid模型是建立在gio模型之上的,以fvid_alloc、fvid_exchange、fvid_free函數對gio模型中的gio_submit函數進行封裝,解決了gio模型中驅動程序不能回收緩沖區(qū)的問題。
此外,fvid模型還專門設計了fvid_frame結構,此結構中包含了常用的視頻信號的信息,如行數、列數、yuv結構、場頻等,很適合描述視頻數據幀,但fvid主要是針對dm64x系統(tǒng)設計的,dm64x的很多功能在f2812
dsp上都不具備。所以本設計針對f2812 dsp射頻處理系統(tǒng),對fvid模型進行了一定的簡化,保留類驅動程序,而重寫了迷你驅動層程序。
3.2 視頻處理程序運行流程
在設計完成的視頻驅動程序基礎上,開發(fā)一個典型的視頻處理應用程序,其運行流程如圖3所示,首先使用fvid_create函數建立gio_capture和gio_play兩個視頻通道,再以gio_capture通道的fvid_control函數發(fā)出cmd_start,采集到1幀視頻數據,應用程序以gio_capture通道的fvid_alloc函數向驅動程序申請采集到的數據幀,進行處理后再以fvid_exchange函數將修改后的數據幀返回驅動程序,最后再調用gio_play通道的fvid_control函數發(fā)出cmd_display命令將數據幀輸出,由圖3可以看到,應用程序調用的這些fvid_xxx接口函數會自動由類驅動程序層層向下映射,到達迷你驅動層程序,而迷你層程序可以直接操縱底層硬件設備,來完成整個視頻的采集、處理和顯示的過程。

3.3 迷你驅動程序的設計
迷你層驅動程序是整個設計的重點所在,下面詳細介紹其實現方法,迷你層驅動程序主要由表1所列的幾個函數組成。

對各個函數的具體實現如下:
1)mdbindev函數。在應用程序建立設備接口(如fvid_create函數)時被調用,完成對外部設備的初始化,而與其對應的是mdubinddev函數,使用mdubinddev函數會使設備處于無效狀態(tài),不能再使用。
2)mdcreatechan函數,使用此函數為應用程序和驅動程序建立通信通道,同時為每個通道申請緩沖區(qū),在ti公司發(fā)布的fvid模型中,為每個通道都分配了3個緩沖區(qū),輪流與外部設備交換數據,每個緩沖區(qū)對應1幀視頻數據,這樣的設計在dm642這樣可以外擴大容量sdram的系統(tǒng)中是完全可行的,但是對于本系統(tǒng),f2812
dsp外部只擴展了512k×16位的sram,既要做視頻輸入的幀緩存,又要存放一部分程序,這樣存儲空間就不夠了,所以本設計中進行了簡化,對視頻輸入設備采用兩緩沖區(qū)輪轉的機制,如圖4(a)所示,而對于視頻輸出設備,以al422
fifo作為硬件幀緩存,而不在sram中再為其分配緩沖區(qū),與mdcreatechan對應的是mddeletechan函數,用于刪除設備通道,釋放緩沖區(qū)資源。

3)mdsubmitchan函數。負責管理緩沖區(qū),分別接受應用程序發(fā)出的fvid_alloc、fvid_exchange、fvid_free三個命令并進行處理,其中fvid_alloc命令對應圖4中(a)到(b)的過程,應用程序從兩個緩沖區(qū)中取出最新的一幀視頻數據,對其中的數據做處理,而只剩下一個緩沖區(qū)用來接收外部設備輸入的數據,fvid_exchange對應圖4中(b)到(c)的過程,應用程序處理完1幀數據,將這1幀數據返回驅動程序,準備用來顯示,同時再讀入新的1幀數據進行處理,fvid_free對應圖4中(c)到(a)的過程,應用程序將處理完的數據幀返回驅動程序,而不再向驅動程序申請新的數據幀。以上3個命令是針對視頻輸入接口gio_capture而言的,而對于輸出設備接口gio_play,在sram中沒有分配緩沖區(qū),所以其mdsubmitchan函數內部設為空函數。
4)mdcontrolchan函數,用來操作外部視頻設備,完成對視頻數據的采集和輸出,對于gio_capture和gio_play這兩個設備接口的mdcontrolchan函數接受的命令是不同的;
視頻輸入gio_capture接口的mdcontrolchan函數只接受cmd_start命令,完成1幀視頻數據的采集,而視頻輸出gio_play接口的mdcontrolchan函數只接受cmd_display命令,完成視頻信號的輸出。
3.4 視頻驅動模型裁剪的一般方法
ti公司設計的gio/fvid視頻設備驅動原型相對復雜,且占用較多的系統(tǒng)資源,要使其可以應用于更通用的低端處理器系統(tǒng),就必須進行改造和裁減,在改造中要注意以下幾個方面:
1)阻塞的i/o操作,ti公司的6000系列的dsp具有edma功能,傳輸數據不需要cpu的干預,而dm64x還具有專用的射頻接口,傳輸數據不會占用外部擴展總線,所以視頻數據的處理和輸入輸出是可以并行的,而低端處理器是不具備這樣功能的,視頻設備一般都是通過外部擴展總線連接的,所以對視頻設備的操作必須設計為阻塞型的i/o操作,視頻數據輸入/輸出的過程是由cpu來完成的,且要保證對視頻設備的操作不會被其他操作中斷。
2)對視頻數據緩沖區(qū)的管理,gio/fvid視頻設備驅動原型中使用的3緩沖區(qū)模型,雖然功能很完善,卻占用了太多的存儲空間,所以對于實際的視頻處理系統(tǒng)就要進行調整,該為兩緩沖區(qū)甚至是單緩沖區(qū)模型,對象具有獨立硬件緩存的輸出設備,可以考慮不再為其分配動態(tài)緩沖區(qū)。
3)對視頻設備的操作,mdcontrolchan函數主要用來操作外部視頻設備,只要保留對實際系統(tǒng)有用的操作就足夠了,而gio/fvid視頻設備驅動原型中定義的很多操作都可以省略。
4 小結
本文介紹了基于dsp/bios的外設驅動程序模型,并針對基于f2812 dsp的視頻處理系統(tǒng)這一具體的硬件平臺,重點介紹了開發(fā)gio/fvid設備驅動的流程和針對低端處理器系統(tǒng)的視頻驅動模型裁減方法,本視頻驅動程序為開發(fā)各種視頻處理應用程序(如jpeg圖像)壓縮、mpeg視頻壓縮、視頻監(jiān)控程序等)提供了有力的支持,本文介紹的設備驅動程序的開發(fā)方法,對于同類視頻處理系統(tǒng),特別是對于使用ti2000系列dsp這樣系統(tǒng)資源比較有限的視頻處理系統(tǒng),具有很好的可借鑒性。
評論