巫 莉,于鴻洋,張 萍
(電子科技大學(xué) 電子工程學(xué)院,四川 成都 611731)
Linux是一套自由軟件,用戶可以無償?shù)氐玫狡湓创a和大量的應(yīng)用程序,并可以任意修改和補(bǔ)充[1],這樣使得開發(fā)者可以更方便地開發(fā)機(jī)頂盒的功能,但是由于Linux本身各種軟件的復(fù)雜的依賴性以及缺乏穩(wěn)定完善的維護(hù),Linux的開發(fā)不像Windows那么方便容易[2]。
通用串行總線(USB)具有易于使用、速度快、可靠性強(qiáng)、成本低等優(yōu)點(diǎn)[3],在市場(chǎng)上已經(jīng)廣泛普及。USB攝像頭的視頻播放也越來越受歡迎。筆者首先介紹了采用的STi7109芯片的機(jī)頂盒的硬件及軟件系統(tǒng),然后闡述了在Linux上搭建USB攝像頭視頻數(shù)據(jù)采集平臺(tái)的過程,同時(shí)也使讀者對(duì)在Linux上怎樣進(jìn)行軟件開發(fā)有更深的認(rèn)識(shí)。
本設(shè)計(jì)采用STMicrotronics公司最新的增強(qiáng)型高清多標(biāo)準(zhǔn)視音頻解碼芯片STi7109作為主芯片。STi7109在一個(gè)芯片上集成了2個(gè)頻率為266 MHz的ST231CPU以及 VC-1,MPEG-2和 H.264視音頻解碼器,PAL/NTSC/SECAM編碼器,1個(gè)16 kbyte的I-Cache和1個(gè)32 kbyte的D-Cache,傳輸過濾解擾、解復(fù)用模塊,顯示和圖形引擎功能模塊。STi7109擁有16個(gè)級(jí)別的中斷控制器,定義了6個(gè)可擴(kuò)展的8位可編程輸入/輸出端口(GPIO)。除MPEG-2外,該系統(tǒng)芯片解決方案還支持高清H.264/MPEG-4 AVC,以及MPEG-4 P2標(biāo)清標(biāo)準(zhǔn)。其強(qiáng)大的視頻解碼能力為視頻播放系統(tǒng)的實(shí)現(xiàn)提供了硬件條件。
STi7109開發(fā)板包含1個(gè)USB接口,支持USB2.0協(xié)議,支持高速USB設(shè)備。STi7109數(shù)字機(jī)頂盒硬件平臺(tái)如圖1所示。
圖1 STi7109數(shù)字機(jī)頂盒硬件平臺(tái)
數(shù)字信號(hào)流(包括公開的和加密的)通過纜線傳輸?shù)礁哳l頭,通過芯片STb0468b處的QAM/QPSK解調(diào)處理,傳輸?shù)絊Ti7109集成芯片進(jìn)行解復(fù)用和PES流分組解析,從而產(chǎn)生對(duì)應(yīng)的視頻信號(hào)和音頻信號(hào)。
STi7109的USB攝像頭視頻數(shù)據(jù)采集平臺(tái)從軟件的角度看,主要分為5個(gè)層次:Bootloader,Linux內(nèi)核,文件系統(tǒng),加載驅(qū)動(dòng)模塊和應(yīng)用軟件。STi7109平臺(tái)上的軟件系統(tǒng)如圖2所示。
圖2 STi7109平臺(tái)上的軟件系統(tǒng)
由于USB攝像頭根據(jù)攝像頭芯片的不同驅(qū)動(dòng)也不同,在Linux內(nèi)核上很少帶有或幾乎沒有USB攝像頭的驅(qū)動(dòng),需要自己開發(fā)安裝。在開源項(xiàng)目中,spca5xx驅(qū)動(dòng)以及后來的gspca驅(qū)動(dòng)涵蓋了大部分主流的攝像頭驅(qū)動(dòng),但是也無法包含各種品牌的所有型號(hào)的攝像頭。因此需要在熟悉USB攝像頭驅(qū)動(dòng)的情況下對(duì)驅(qū)動(dòng)進(jìn)行修改,并按照Linux上的特殊要求來完成對(duì)USB攝像頭的安裝。
下面介紹在Linux下怎樣移植、安裝USB攝像頭驅(qū)動(dòng),并使其適用于自己的USB攝像頭。
1)下載開源項(xiàng)目的USB攝像頭驅(qū)動(dòng)
筆者首先在CSDN下載頻道上下載“gspcav120071224.tar.gz”。其次在 Linux 上的下載命令為“wget-c http∶//mxhaard.free.fr/spca50x/Download/gspca120071224.tar.gz”。最后解壓驅(qū)動(dòng)壓縮包“tar zxvf gspca120071224.tar.gz”。
2)使USB攝像頭驅(qū)動(dòng)適合自己的攝像頭
USB攝像頭驅(qū)動(dòng)直接相關(guān)的是USB攝像頭芯片型號(hào)。在Windows下右鍵點(diǎn)擊“我的電腦”-“管理”-“設(shè)備管理器”-“圖像處理設(shè)備”選擇攝像頭設(shè)備雙擊,在“詳細(xì)信息”一欄可以看到USB攝像頭的UID和VID,也可以通過Linux下lsusb命令進(jìn)行查看。筆者采用的是ID 0ac8∶307b的攝像頭。通過分析USB攝像頭驅(qū)動(dòng)源代碼判斷是否適合自己的攝像頭芯片。
進(jìn)入 “gspca120071224”文件夾,其中最核心的是gspca_core.c文件以及gspca.h頭文件。gspca_core.c包括設(shè)備注冊(cè)、注銷和各種操作方法集。gspca.h的主要內(nèi)容有:(1)定義所支持的Vendor ID號(hào);(2)對(duì)支持的DSP橋接控制芯片型號(hào)進(jìn)行編號(hào);(3)對(duì)支持的CMOS/CCD圖像傳感器型號(hào)進(jìn)行編號(hào)。另外,還定義了圖像格式相關(guān)的常量和數(shù)據(jù)結(jié)構(gòu)(如色彩空間、調(diào)色板、圖像分辨力等),幀數(shù)據(jù)結(jié)構(gòu),攝像頭操作方法集等。
Conexant,EtomsSonix,PixArt,Vimicro 和 Sunplus 等文件夾中定義了各傳感器相關(guān)的頭文件。decoder文件夾中包含了對(duì)各種圖像格式進(jìn)行編解碼的源代碼。
通過查看gspca_core.c和gspca.h兩個(gè)文件,發(fā)現(xiàn)使用的USB攝像頭的Vendor ID,DSP芯片和image sensor已包含在其中。如果不在其中,則要定義DSP和sensor芯片的相應(yīng)頭文件,并在gspca.h中添加相應(yīng)的設(shè)備信息,還要把攝像頭加入到 gspca_core.c的攝像頭設(shè)備列表中。
3)安裝USB攝像頭驅(qū)動(dòng)于Linux系統(tǒng)
Linux下對(duì)于硬件驅(qū)動(dòng),可以將驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)內(nèi)核中,也可以將它作為模塊在使用時(shí)再加載[4]。每塊可以在運(yùn)行時(shí)添加到內(nèi)核的代碼,被稱為一個(gè)模塊。Linux內(nèi)核提供了對(duì)許多模塊類型的支持,每個(gè)模塊由目標(biāo)代碼組成[5]。
由于Linux中攝像頭驅(qū)動(dòng)必須要有(Video For Linux,V4L)的支持,V4L是Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動(dòng),它為針對(duì)視頻設(shè)備的應(yīng)用程序編程提供一系列接口函數(shù),因此必須先加載V4L相關(guān)的videodev.ko模塊。USB設(shè)備也需要USB主控制器驅(qū)動(dòng),由于STi7109嵌入式系統(tǒng)提供了OHCI/EHCI的主控制器驅(qū)動(dòng)模塊,因此不需要另外加載。
在gspca驅(qū)動(dòng)程序文件夾內(nèi)包含了自動(dòng)化編譯的Makefile文件以及安裝加載模塊的腳本文件gspca_build,通過運(yùn)行“./gspca_build”,即可完成對(duì)gspca驅(qū)動(dòng)的安裝,也可以根據(jù)自己的需要對(duì)Makefile和gspca_build進(jìn)行修改。
安裝USB攝像頭驅(qū)動(dòng)并在機(jī)頂盒上插上USB攝像頭后,通過運(yùn)行命令“l(fā)smod|grep videodev”,看到videodev已經(jīng)安裝,運(yùn)行命令“l(fā)s/dev|grep video”,看到“/dev”文件夾下有了video和video0兩個(gè)文件,說明已經(jīng)識(shí)別到了USB攝像頭設(shè)備。
GTK(GIMP Toolkit)是一套跨多種平臺(tái)的圖形工具包,目前已發(fā)展為一個(gè)功能強(qiáng)大、設(shè)計(jì)靈活的通用圖形庫,成為L(zhǎng)inux下開發(fā)圖形界面應(yīng)用程序的主流開發(fā)工具之一。由于GTK+簡(jiǎn)單易用,擁有強(qiáng)大的功能和豐富的API,而且作為一個(gè)開放的自由軟件,在Linux下已經(jīng)發(fā)展得比較成熟,因此在Linux系統(tǒng)下可以使用GTK+庫方便地對(duì)機(jī)頂盒的GUI進(jìn)行開發(fā)。
由于Linux下各種源碼具有很復(fù)雜的依賴性,因此首先需清楚安裝GTK+所需要的條件。所需的源碼包包括:GNU make工具,GNU gettext軟件包(當(dāng)系統(tǒng)上沒有g(shù)ettext()函數(shù)的時(shí)候需要),GNU libiconv 庫(當(dāng)系統(tǒng)上沒有 iconv()函數(shù)的時(shí)候需要),fontconfig 庫,F(xiàn)reeType 庫,libpng庫,jpegsrc庫,tiff庫,pkg-config工具,GLib 庫,ATK庫,Cairo庫,Pango庫和 GTK+庫。
其中很多源碼包在比較新的Linux版本系統(tǒng)都會(huì)自帶。筆者主要安裝了5個(gè)源碼包,即GLib,ATK,CAIRO,PANGO和GTK。上面5個(gè)源碼包由于其依賴性必須按從前到后的順序依次安裝。在Linux上進(jìn)行源碼安裝很容易找不到需要的某個(gè)包或文件,編譯出錯(cuò)。需要對(duì)Linux的系統(tǒng)原理有比較熟悉的認(rèn)識(shí),并且要仔細(xì)閱讀README,install等文件,了解安裝過程。
下面總結(jié)幾個(gè)關(guān)系到能否成功編譯的因素:1)默認(rèn)情況下,編譯器只會(huì)使用/lib和/usr/lib這兩個(gè)目錄下的庫文件。如果安裝了某些庫,沒有指定搜索路徑,編譯就會(huì)出錯(cuò)。此時(shí)可在“./configure”命令時(shí)指定“--prefix=/usr”,這樣庫文件就安裝到了“/usr/lib”下,或是通過設(shè)置LD_LIBRARY_PATH 路徑,添加“/usr/local/lib”路徑,即沒有指定安裝路徑時(shí)的庫的安裝位置,或者保存在“/etc/ld.so.conf”文件中,因?yàn)椤?etc/ld.so.conf”文件記錄了編譯時(shí)使用的動(dòng)態(tài)鏈接庫的路徑。2)改動(dòng)庫文件后一定要運(yùn)行一下“l(fā)dconfig”命令,它的作用就是將“/etc/ld.so.conf”列出的路徑下的庫文件緩存到“/etc/ld.so.cache”以供使用。不然即使庫文件就在“/usr/lib”下,也是不會(huì)被使用的。3)設(shè)定正確的 PKG_CONFIG_PATH?!皃kg-config”是一個(gè)向configure程序提供軟件和庫的版本、路徑等系統(tǒng)信息的程序,這些信息只在編譯時(shí)使用。以GLib為例,如果將glib-2.x.x裝到了“/usr/local/”下,那么glib-2.0.pc就會(huì)在“/usr/local/lib/pkgconfig”下,需要將這個(gè)路徑添加到PKG_CONFIG_PATH下面,另外還需要將“l(fā)ib/pkgconfig”目錄下不需要的glib-2.0.pc刪除掉,以確保configure找到正確的glib-2.0.pc,以免提示錯(cuò)誤信息。
安裝時(shí)可以把指令統(tǒng)一為:./configure--prefix=/usr&&make&&make install。其中&&表示當(dāng)前一條命令正常結(jié)束,后面的命令才會(huì)執(zhí)行。這個(gè)辦法既節(jié)省時(shí)間,又可防止出錯(cuò)。運(yùn)行完之后可以運(yùn)行命令“echo$?”,表示檢查上一條命令的退出狀態(tài),返回0表示程序正常退出,返回非0表示錯(cuò)誤退出。注意到上面說的幾個(gè)因素,每次安裝完后運(yùn)行一次ldconfig,安裝過程中一般都會(huì)經(jīng)過多次配置等改動(dòng)。
安裝了GTK+庫之后,就可以利用GTK+庫提供的圖形界面的API進(jìn)行應(yīng)用程序開發(fā)。筆者參考了camorama及spaview等Linux上的USB攝像頭數(shù)據(jù)采集的應(yīng)用程序。具體過程為在利用V4L提供的API獲取到USB攝像頭的視頻圖像數(shù)據(jù)后,再利用GTK+中的GDKPIXBUF庫中的API函數(shù)來顯示獲取到的圖像。GDKPIXBUF庫是專門用于圖像處理的,它支持多種圖像格式(如TIFF,JPEG,PNG,GIF等)和動(dòng)畫。通過 GTK+的應(yīng)用程序,在窗口中可查看到USB攝像頭的視頻圖像。
介紹了STi7109芯片為主芯片的機(jī)頂盒硬件平臺(tái)及軟件系統(tǒng),介紹了安裝配置USB攝像頭驅(qū)動(dòng),利用GTK+庫編寫應(yīng)用程序,搭建USB攝像頭視頻數(shù)據(jù)采集平臺(tái)的整個(gè)過程。
本文主要在于過程方法的介紹,對(duì)于進(jìn)一步功能的開發(fā),如怎樣用GTK+庫來實(shí)現(xiàn)遙控器的控制等還有待進(jìn)一步研究。主要?jiǎng)?chuàng)新點(diǎn)為使讀者對(duì)怎樣在Linux上進(jìn)行機(jī)頂盒的開發(fā)有了更明確的認(rèn)識(shí),如對(duì)Linux上USB攝像頭驅(qū)動(dòng)開發(fā)、特殊的源碼包聯(lián)系性以及編譯原理等都有了更深的理解。同時(shí)采用具有發(fā)展?jié)摿Φ腉TK+庫來編寫圖形界面應(yīng)用程序使圖像采集過程更加人性化。該過程的方法也適用于其他嵌入式Linux的開發(fā),具有很好的借鑒價(jià)值。
[1]王俊偉,吳俊海.Linux標(biāo)準(zhǔn)教程[M].北京:清華大學(xué)出版社,2006.
[2]胡宏平.基于數(shù)字電視機(jī)頂盒的嵌入式Linux操作系統(tǒng)的設(shè)計(jì)[J].電視技術(shù),2005(8):52-54.
[3]AXELSON J.USB大全[M].陳逸,譯.北京:中國電力出版社,2001.
[4]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008.
[5]CORBET J,RUBINI A,KROAH H G.Linux設(shè)備驅(qū)動(dòng)程序[M].3版.魏永明,耿岳,鐘書毅,譯.北京:中國電力出版社,2005.