董翠英
(唐山學(xué)院 信息工程系,唐山 063000)
隨著計(jì)算機(jī)網(wǎng)絡(luò)、多媒體技術(shù)的發(fā)展和圖像處理技術(shù)的提高,視頻監(jiān)控技術(shù)得到了快速發(fā)展,被廣泛應(yīng)用到各行各業(yè),如軍事、教育、科研、娛樂(lè)、醫(yī)療、體育等[1]。針對(duì)這一點(diǎn),本文論述了如何在ARM硬件平臺(tái)上進(jìn)行嵌入式Linux內(nèi)核的編譯與移植[2],并對(duì)在Linux操作系統(tǒng)下的USB驅(qū)動(dòng)程序的開(kāi)發(fā)進(jìn)行了詳細(xì)的討論。最后,設(shè)計(jì)并實(shí)現(xiàn)了嵌入式視頻監(jiān)控系統(tǒng)軟件部分,在所建立的ARM Linux開(kāi)發(fā)平臺(tái)上實(shí)現(xiàn)了基于USB攝像頭和boa嵌入式web 服務(wù)器的視頻監(jiān)控。本文重點(diǎn)討論了USB驅(qū)動(dòng)程序和Web視頻服務(wù)器。
本系統(tǒng)使用的平臺(tái)功能框圖如圖1所示。該硬件平臺(tái)采用Samsung公司的處理器S3C2410。通過(guò)在USB接口上外接一個(gè)帶USB口的攝像頭,將采集到的視頻圖像數(shù)據(jù)放入輸入緩沖區(qū)。然后對(duì)圖像進(jìn)行處理,最后通過(guò)網(wǎng)絡(luò)接口將圖像發(fā)送到Internet上。
完整的嵌入式Linux一般包含啟動(dòng)引導(dǎo)程序、內(nèi)核、文件系統(tǒng)三個(gè)基本部分。在一個(gè)新的硬件平臺(tái)上,選用嵌入式Linux作為操作系統(tǒng)來(lái)開(kāi)發(fā)軟件,必須進(jìn)行移植。根據(jù)不同的應(yīng)用系統(tǒng)設(shè)計(jì)的需要對(duì)Linux內(nèi)核的源代碼進(jìn)行修改或者裁剪然后再重新編譯內(nèi)核。
圖1 嵌入式S3C2410的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)硬件結(jié)構(gòu)
2.1.1 嵌入式系統(tǒng)引導(dǎo)程序
本系統(tǒng)選用的bootloader是vivi,vivi有兩種工作模式,即啟動(dòng)加載模式和下載模式。當(dāng)vivi處于下載模式時(shí),它為用戶(hù)提供一個(gè)命令行接口,通過(guò)該接口能使用vivi提供的一些命令集。
2.1.2 Linux內(nèi)核的剪裁及移植
一般情況下的Linux內(nèi)核的剪裁及移植,主要是針對(duì)操作系統(tǒng)中關(guān)于具體硬件以及除去不需要的功能模塊,如一些不會(huì)用到的外設(shè)支持、驅(qū)動(dòng)程序、協(xié)議、網(wǎng)絡(luò)支持、文件格式等。Linux內(nèi)核具有很好的模塊性和伸縮性,在資源要求嚴(yán)格的情況下經(jīng)過(guò)合理的裁減可獲得明顯的效果[3]。
本系統(tǒng)的內(nèi)核版本是2.4.18,操作系統(tǒng)是嵌入式linux操作系統(tǒng),其剪裁及移植具體的配置方法是,在嵌入式內(nèi)核的/kernel目錄下輸入make menuconfig命令進(jìn)行相應(yīng)選擇。
本系統(tǒng)需要進(jìn)行視頻采集,在Multimedia devices項(xiàng)下,選擇
[*] Video For Linux
系統(tǒng)選用的視頻前端為USB攝像頭,因此需要在 USB support項(xiàng)USB Multimedia devices行下,選擇相應(yīng)的設(shè)備驅(qū)動(dòng)。嵌入式內(nèi)核一般只集成了OV511等幾種攝像頭的驅(qū)動(dòng),若硬件需要其它的驅(qū)動(dòng),則要移植、編譯驅(qū)動(dòng)程序后重新配置內(nèi)核,選擇相應(yīng)的設(shè)備驅(qū)動(dòng)。內(nèi)核配置完成后,make命令后即可生成可燒寫(xiě)的內(nèi)核zImage。
文件系統(tǒng)是基于被劃分的存儲(chǔ)設(shè)備上的邏輯單位上的一種定義文件的命名、存儲(chǔ)、組織及取出的方法。本系統(tǒng)采用的是適用于嵌入式系統(tǒng)的小文件系統(tǒng)Cramfs。
重新配置編譯內(nèi)核,開(kāi)啟系統(tǒng)板的NFS文件系統(tǒng)功能后,重新編譯內(nèi)核,下載bootloader和kernel到硬件上,完成硬件設(shè)置[2]。
啟動(dòng)Linux后,若要對(duì)某一硬件外設(shè)進(jìn)行讀寫(xiě),需要通過(guò)內(nèi)核調(diào)用該硬件的驅(qū)動(dòng)來(lái)實(shí)現(xiàn)。因此實(shí)現(xiàn)視頻數(shù)據(jù)的采集需要兩個(gè)步驟,一是編譯硬件接口的驅(qū)動(dòng)程序,二是通過(guò)內(nèi)核中提供的關(guān)于視頻采集部分的代碼編寫(xiě)視頻采集的應(yīng)用程序。
本系統(tǒng)需要對(duì)USB攝像頭進(jìn)行訪問(wèn)和控制,USB設(shè)備的驅(qū)動(dòng)需要和嵌入式內(nèi)核掛鉤。在內(nèi)核中和視頻相關(guān)的部分是Video For Linux簡(jiǎn)稱(chēng)V4L,因此USB攝像頭驅(qū)動(dòng)要符合V4L標(biāo)準(zhǔn)。在驅(qū)動(dòng)中聲明一個(gè)video_device結(jié)構(gòu),并指定文件操作函數(shù)指針數(shù)組.fops,向系統(tǒng)注冊(cè)[4]。在應(yīng)用程序發(fā)出文件操作命令的時(shí)候,內(nèi)核根據(jù)指針調(diào)用這些函數(shù),并將這些結(jié)構(gòu)作為參數(shù)傳遞,完成內(nèi)核和驅(qū)動(dòng)之間的通訊。
在USB總線標(biāo)準(zhǔn)中定義了四種傳輸方式,分別是控制、中斷、批量和等時(shí)。對(duì)于本系統(tǒng)視頻采集的實(shí)時(shí)性要求較高,攝像頭采用的是等時(shí)方式。為盡快得到圖像數(shù)據(jù),需要在URB( USB Request Block)中指定USB_ISO_ASAP標(biāo)志,使其盡快發(fā)出本URB
usb->transfer_flags=USB_ISO_ASAP
本系統(tǒng)選用的是ZC301P型芯片攝像頭,要對(duì)其驅(qū)動(dòng)進(jìn)行加載。由于Linux內(nèi)核對(duì)此類(lèi)攝像頭并不支持,所以需要自行加載驅(qū)動(dòng)模塊。由于攝像頭的廠商開(kāi)發(fā)產(chǎn)品時(shí)驅(qū)動(dòng)基本上是基于Windows平臺(tái)的,在Linux下我們只能選擇開(kāi)源的驅(qū)動(dòng)源碼,本系統(tǒng)選擇的是SPCA5XX攝像頭通用驅(qū)動(dòng),在下面的驅(qū)動(dòng)網(wǎng)址:http://mxhaard.free.fr可以下載到針對(duì)embeded環(huán)境的驅(qū)動(dòng)源碼,有專(zhuān)門(mén)的patch,具體編譯加載步驟如下:
1)下載針對(duì)2.4內(nèi)核的驅(qū)動(dòng)補(bǔ)丁[2],usb-
2.4.31 LE06.patch.tar.gz;
2)將這個(gè)patch放到內(nèi)核源代碼的/driver/usb目錄下,然后解壓、打補(bǔ)丁:
解壓:
tar-xvzf usb-2.4.31LE06.patch.tar.gz
打補(bǔ)?。簆atch-p1<usb-2.4.31.patch
3)在打完補(bǔ)丁后就會(huì)在/driver/usb目錄下產(chǎn)生Config.in.rej和Makefile.rej兩個(gè).rej文件,根據(jù)這兩個(gè).rej文件分別修改此目錄下的Makefile和Config.in文件內(nèi)容,增加此部分代碼后,在完成內(nèi)核編譯后就能生成攝像頭的驅(qū)動(dòng)模塊:spca5xx.o:
4)編譯內(nèi)核,在內(nèi)核目錄下make menuconfig,裝入原內(nèi)核配置文件,進(jìn)入主菜單操作,選擇Multimedia devices子菜單,為內(nèi)核加入V4L內(nèi)核模塊。
5)在內(nèi)核主界面下選擇USB support子菜單項(xiàng),為內(nèi)核加入U(xiǎn)SB接口的驅(qū)動(dòng)模塊。
6)在USB Multimedia devices子項(xiàng)下選擇USB SPCA5XX型攝像頭。
7)在配置完內(nèi)核后,運(yùn)行make dep->make zImage->make modules之后在內(nèi)核源碼/driver/usb/spca5xx目錄中可以生成spca5xx.o驅(qū)動(dòng)模塊,通過(guò)nfs,即可在系統(tǒng)板上加載驅(qū)動(dòng)測(cè)試,加載前需確保已加載videodev.o模塊。以上已經(jīng)把整個(gè)系統(tǒng)的硬件平臺(tái),系統(tǒng)軟件,驅(qū)動(dòng)程序部分確定下來(lái),下一步將進(jìn)行圖像采集應(yīng)用軟件的開(kāi)發(fā)。
在攝像頭驅(qū)動(dòng)成功后,要對(duì)攝像頭進(jìn)行視頻采集的操作就是要針對(duì)V4L進(jìn)行編程。使用Servfox或者Spcaserv作為攝像頭視頻采集的服務(wù)器端程序,用Spcaview作為客戶(hù)端來(lái)實(shí)現(xiàn)視頻的接收與處理。
從http://mxhaard.free.fr/Spca50x/embed
ded/Servfox下載ServfoxRl_0_0.tar.gz解壓后,會(huì)發(fā)現(xiàn)在其目錄中會(huì)有一個(gè)Makefile.arm文件,將此文件修改成 Makefile,可以用Vi打開(kāi)修改編譯器路徑等,確保無(wú)誤后make,成功后就可生成我們要用到的Servfox程序。
從http://mxhaard.free.fr/spca50x/Download/下載Spcaview,由于此軟件包依賴(lài)于libsdl,所以在安裝spcaview之前必須要安裝SDL-1.2.13。
解壓源碼包:tar -zxvf SDL-1.2.13.tar.gz
安裝源碼包:cd SDL-1.2.13,運(yùn)行 ./configure文件,編譯和安裝文件。
安裝spcaview軟件:
tar -zxvf spcaview-20061208;
cd spcaview-20061208;
make
為了方便用戶(hù)查看監(jiān)控情況,設(shè)計(jì)了一種網(wǎng)絡(luò)視頻服務(wù)器,使用戶(hù)可以更方便的借助windows IE瀏覽器來(lái)查看實(shí)時(shí)監(jiān)控情況。
隨著嵌入式技術(shù)的發(fā)展和高速寬帶網(wǎng)絡(luò)的普及,利用網(wǎng)絡(luò)實(shí)現(xiàn)遠(yuǎn)程監(jiān)控已為人們廣泛接受,用戶(hù)使用Web瀏覽器,通過(guò)以太網(wǎng)遠(yuǎn)程訪問(wèn)內(nèi)置Web服務(wù)器的監(jiān)控?cái)z像機(jī),不但可以實(shí)現(xiàn)對(duì)現(xiàn)場(chǎng)的遠(yuǎn)程視頻監(jiān)控,而且可以向監(jiān)控現(xiàn)場(chǎng)發(fā)送指令。基于B/S結(jié)構(gòu)的網(wǎng)絡(luò)視頻監(jiān)控實(shí)現(xiàn):B/S結(jié)構(gòu),即Browser/Server(瀏覽器/服務(wù)器)結(jié)構(gòu),用戶(hù)在客戶(hù)端采用瀏覽器(Browse)實(shí)現(xiàn)對(duì)Web服務(wù)器的訪問(wèn),服務(wù)器在后臺(tái)運(yùn)行程序,把結(jié)果返回給瀏覽器顯示[4]。
在系統(tǒng)中,客戶(hù)端局域網(wǎng)內(nèi)連網(wǎng)的PC,在瀏覽器地址欄內(nèi)輸入視頻服務(wù)器的IP地址,就能在網(wǎng)頁(yè)里顯示攝像頭的監(jiān)控圖像如圖2(a)所示??蛻?hù)端在上位機(jī)軟件中輸入10.10.24.2在IP地址欄,客戶(hù)端就能實(shí)現(xiàn)監(jiān)控圖像的播放如圖2(b)所示。
根據(jù)以上監(jiān)控結(jié)果,可進(jìn)一步把基于ARM的視頻監(jiān)控系統(tǒng)設(shè)計(jì)成一體的網(wǎng)絡(luò)攝像頭,可廣泛用于網(wǎng)絡(luò)資源較發(fā)達(dá)的場(chǎng)合,如智能家居中主人對(duì)家庭安全情況的檢測(cè),家長(zhǎng)對(duì)幼兒在幼兒園中情況觀察、無(wú)人值守的重點(diǎn)實(shí)驗(yàn)室、公司對(duì)員工的工作情況的檢查等等??傊?,隨著人們的人們的安全意識(shí)的增強(qiáng),視頻監(jiān)控被廣泛應(yīng)用到各行各業(yè),有著非常廣闊的市場(chǎng)前景。
圖2 監(jiān)控結(jié)果
[1] 駱云志,劉治紅.視頻監(jiān)控技術(shù)發(fā)展綜述[J].兵工自動(dòng)化,2009,28(1):1-3.
[2] 朱弘強(qiáng),朱惠強(qiáng),邵吉.基于雙絞線傳輸?shù)囊曨l監(jiān)控系統(tǒng)[J],計(jì)算機(jī)工程,2008,34(增刊):34-36.
[3] Advanced Linux Programming [M].First Edition,by Alex Samuel, Jeffrey Oldham and Mark Mitchell, 2001.
[4] 陳莉君.Linux操作系統(tǒng)內(nèi)核分析[M].北京:人民郵電出版社,2005.