版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
激光掃描線的信息獲取及其傳輸學(xué)號:20100128762014屆本科生畢業(yè)論文(設(shè)計(jì))題目:激光掃描線的信息獲取及其傳輸學(xué)院(系):信息工程學(xué)院專業(yè)班級:計(jì)算機(jī)科學(xué)與技術(shù)103學(xué)生姓名:趙中濱指導(dǎo)教師:來智勇合作指師:完成日期:2014年6月1日激光掃描線的信息獲取及其傳輸摘要“活體肉牛體積測定裝置”通過線激光發(fā)射器和攝像機(jī)采集激光線在牛身上的投影,并傳送到上位機(jī)計(jì)算牛體的三維點(diǎn)云。而隨著嵌入式和數(shù)字圖像處理技術(shù)的發(fā)展,基于嵌入式的圖像采集與無線傳輸技術(shù)在生活中的應(yīng)用也越來越受到重視。本文設(shè)計(jì)了一種基于嵌入式的圖像采集與WiFi傳輸系統(tǒng)。在ARM9S2C2440嵌入式硬件平臺上移植Linux操作系統(tǒng)作為軟件開發(fā)平臺,采用USB和CMOS攝像頭模塊和無線模塊USB-WIFI,完成圖像中激光掃描線采集并以無線方式發(fā)送給個(gè)人計(jì)算機(jī),進(jìn)行接收和顯示。多次實(shí)驗(yàn)測試,結(jié)果表明,本文設(shè)計(jì)的系統(tǒng)成本較低、體積小且安裝十分容易,系統(tǒng)比較穩(wěn)定,實(shí)時(shí)性較好。關(guān)鍵字:ARM;Linux;WiFi;激光線獲取LaserscanninglineinformationacquisitionandtransmissionAbstract"Livecattlevolumemeasuringdevice"throughthelinelasertransmitterandcameracapturethelaserlineprojectionincattle,3DpointcloudandtransmittedtothePCComputingcattlebody.Alongwiththedevelopmentofembeddedsystemanddigitalimageprocessingtechnology,applicationofimageacquisitionandwirelesstransmissiontechnologyembeddedinlifehasbeenpaidmoreandmoreattentionbasedon.ThispaperintroducesadesignofembeddedimageacquisitionandtransmissionsystembasedonWiFi.IntheARM9S2C2440embeddedhardwareplatformandtransplantLinuxoperatingsystemasthesoftwaredevelopmentplatform,usingUSB+CMOScameramoduleandwirelessmoduleUSB-WIFI,completethelaserscanninglineimageacquisitionandsendsthepersonalcomputerinwirelessmode,receivinganddisplay.Severaltests,resultsshowthatthesystemdesignedinthispaper,thecostislow,thevolumeissmallandtheinstallationisveryeasy,thesystemisstable,goodreal-timeperformance.Keywords:ARM,Linux,WiFi,Laserlineaccess-33-目錄第一章 緒論 -1-1.1本課題的背景及其意義 -1-1.2嵌入式系統(tǒng)概述 -1-1.2.1嵌入式系統(tǒng)簡介 -1-1.2.2嵌入式系統(tǒng)特點(diǎn) -2-1.2.3嵌入式系統(tǒng)的構(gòu)成 -2-1.2.4嵌入式系統(tǒng)發(fā)展和前景 -3-1.3Linux和ARM的應(yīng)用 -4-1.3.1Linux的應(yīng)用 -4-1.3.2ARM的應(yīng)用 -4-第二章 系統(tǒng)硬件設(shè)計(jì) -5-2.1系統(tǒng)總的硬件設(shè)計(jì) -5-2.2微處理器引腳連線圖 -5-2.2.1電源引腳連接圖 -5-2.2.2地址線、數(shù)據(jù)線以及主要外設(shè)引腳連線圖 -6-2.3外圍電路 -6-2.3.1電源電路 -6-2.3.2復(fù)位電路 -7-2.3.4系統(tǒng)時(shí)鐘電路 -7-2.3.4存儲器接口電路 -8-2.4系統(tǒng)的主要接口電路設(shè)計(jì) -9-2.4.1串口電路 -9-2.4.2USB接口電路 -9-2.5視頻采集模塊 -9-2.6無線傳輸模塊 -9-第三章 Linux系統(tǒng)的移植 -10-3.1Linux系統(tǒng)的構(gòu)成 -10-3.3.1應(yīng)用程序 -10-3.1.2內(nèi)核 -10-3.1.3硬件的驅(qū)動 -10-3.2Linux的移植 -10-3.2.1分區(qū) -10-3.2.2燒寫u-boot -10-3.2.3燒寫內(nèi)核 -11-3.2.4燒寫根文件系統(tǒng) -11-第四章 USB驅(qū)動的設(shè)計(jì) -12-4.1USB驅(qū)動介紹 -12-4.2USB設(shè)備的配置、端點(diǎn)和接口 -12-4.3設(shè)備文件以及模塊的介紹 -12-4.4USB工作機(jī)制 -13-4.5總線表和ID設(shè)備表 -14-4.6USB攝像頭驅(qū)動 -15-4.7WiFi網(wǎng)卡驅(qū)動 -17-第五章 視頻采集設(shè)計(jì)和實(shí)現(xiàn) -18-5.1程序設(shè)計(jì) -18-5.2程序?qū)崿F(xiàn) -19-5.2.1打開設(shè)備 -19-5.2.2獲取設(shè)備信息 -19-5.2.3設(shè)置視頻采集方式 -21-5.2.4申請緩存空間 -22-5.2.5設(shè)置內(nèi)存屬性 -22-5.2.6數(shù)據(jù)采集 -23-5.2.7圖像處理 -24-第六章 視頻傳輸 -25-6.1無線網(wǎng)絡(luò)介紹 -25-6.2網(wǎng)絡(luò)編程介紹 -25-6.2.1TCP/IP協(xié)議 -25-6.2.2TCP的連接和終止 -25-6.2.3socket編程 -26-6.2.4服務(wù)端的網(wǎng)絡(luò)編程 -28-6.2.5客戶端的網(wǎng)絡(luò)編程 -28-第七章 系統(tǒng)測試 -30-第八章 總結(jié)與展望 -31-8.1結(jié)論 -31-8.2展望 -31-參考文獻(xiàn) -32-致謝 -33- 激光掃描線的信息獲取及其傳輸?shù)谝徽戮w論緒論1.1本課題的背景及其意義隨著信息技術(shù)的日新月異,人們對于設(shè)備的便攜化和小型化要求越來越高,想應(yīng)的嵌入式技術(shù)的應(yīng)用就越來越多(廖日坤2005)。尤其是在遠(yuǎn)處圖像的監(jiān)控領(lǐng)域方面,嵌入式技術(shù)解決了以往個(gè)人計(jì)算機(jī)體型巨大、價(jià)格貴和不方便擴(kuò)展等問題,這工程領(lǐng)域得到了應(yīng)用。目前國內(nèi)外的圖像采集大多數(shù)是基于計(jì)算機(jī)的,這是一中非常成熟的圖像采集技術(shù),但是有太多的局限性,傳統(tǒng)的計(jì)算機(jī)采集體型巨大、性價(jià)比高和不方便攜帶,且在某些場合不方便采集,自動化差(王苗苗2002)。數(shù)字圖像處理、嵌入式技術(shù)和信息技術(shù)的快速發(fā)展,圖像采集系統(tǒng)向著高速化、數(shù)字化和網(wǎng)絡(luò)化發(fā)展。圖像處理技術(shù)和嵌入式技術(shù)的結(jié)合拓展了圖像處理對的工程領(lǐng)域,使其在航空、銀行、無人飛機(jī)、油田等領(lǐng)域得到了飛速的發(fā)展。本文采用三星公司的S3C2440嵌入式ARM處理器,搭建了嵌入式Linux開發(fā)環(huán)境,并使用CMOS+USB攝像頭和WiFi模塊進(jìn)行開發(fā),完成攝像頭和網(wǎng)卡的驅(qū)動,設(shè)計(jì)實(shí)現(xiàn)了ARM開發(fā)板和個(gè)人PCB的WiFi通信(劉雅光2009)。最后進(jìn)行測試,驗(yàn)證其可靠性和正確性。1.2嵌入式系統(tǒng)概述1.2.1嵌入式系統(tǒng)簡介嵌入式系統(tǒng)(Embeddedsystem),也是一種計(jì)算機(jī)系統(tǒng),一種“完全嵌入受控器件內(nèi)部,實(shí)現(xiàn)特定功能的計(jì)算機(jī)系統(tǒng)”,由英國電氣工程師協(xié)會(U.K.InstitutionofElectricalEngineer)定義,嵌入式系統(tǒng)為控制、監(jiān)視或輔助設(shè)備、機(jī)器或用于工廠運(yùn)作的設(shè)備(李善勁2006)。而國內(nèi)認(rèn)為嵌入式系統(tǒng)是以應(yīng)用為中心、以計(jì)算機(jī)為基礎(chǔ),軟硬件可以剪裁,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、體積、成本、功耗等要求的專用計(jì)算機(jī)系統(tǒng)。相對于個(gè)人計(jì)算機(jī),嵌入式系統(tǒng)一般執(zhí)行的是具有特殊要求的預(yù)先定義的任務(wù)。因?yàn)榍度胧较到y(tǒng)只針對某項(xiàng)特殊的任務(wù),設(shè)計(jì)人員能夠?qū)λM(jìn)行剪裁優(yōu)化,減小尺寸大小來降低成本。嵌入式系統(tǒng)通常進(jìn)行海量生產(chǎn),因此單個(gè)的成本節(jié)約,就能夠隨著產(chǎn)量進(jìn)行成百上千的放大。由于嵌入式系統(tǒng)是面向應(yīng)用、客戶和產(chǎn)品,所以必須結(jié)合實(shí)際生產(chǎn)才具有生命力,所以說嵌入式系統(tǒng)和應(yīng)用時(shí)息息相關(guān),有很強(qiáng)的專用性,要結(jié)合實(shí)際需求進(jìn)行適當(dāng)合理的剪裁(弓雷2010)。1.2.2嵌入式系統(tǒng)特點(diǎn)從嵌入式系統(tǒng)的定義可以看出,嵌入式系統(tǒng)是軟硬件一體的,可以獨(dú)立工作的系統(tǒng)。因此嵌入式系統(tǒng)具有以下幾個(gè)特點(diǎn)(王杯2004):(1)內(nèi)核小。嵌入式系統(tǒng)一般是適用于中小型電子裝置的,系統(tǒng)資源相對有限,因此內(nèi)核比傳統(tǒng)的操作系統(tǒng)要小很多。(2)專用性強(qiáng)。嵌入式系統(tǒng)的軟硬件一般緊密集合,而其軟件一般是針對用戶的要求而設(shè)計(jì)的,一般情況下是滿足某個(gè)特定應(yīng)用的,因此嵌入式系統(tǒng)要有專用性的特點(diǎn)。(3)可剪裁性好。從嵌入式系統(tǒng)的特點(diǎn)可以看出,嵌入式的生產(chǎn)廠家,必須提供各種各樣的硬件設(shè)備,但是,這樣勢必會提高生產(chǎn)的成本,不和實(shí)際。所以,為了降低成本,同時(shí)又能滿足各個(gè)用戶的需求,嵌入式系統(tǒng)的軟硬件必須滿足可剪裁的要求,已達(dá)到滿足應(yīng)用的同時(shí)使用最精簡的設(shè)備。(4)實(shí)時(shí)性好。嵌入式系統(tǒng)廣泛應(yīng)用于數(shù)據(jù)采集、導(dǎo)彈制導(dǎo)等實(shí)時(shí)性要求嚴(yán)格的場合,對宿主對象進(jìn)行實(shí)時(shí)控制,所以嵌入式系統(tǒng)有較高的實(shí)時(shí)性要求。不過隨著嵌入式技術(shù)和應(yīng)用的發(fā)展,一些如掌上電腦等嵌入式系統(tǒng)對實(shí)時(shí)性的要求有所降低。但大于大多數(shù)的嵌入式系統(tǒng),必須滿足實(shí)時(shí)性好的特點(diǎn)。(5)可靠性高。嵌入式系統(tǒng)的應(yīng)用一般會涉及到個(gè)人安全乃至國家機(jī)密,再者一些嵌入式系統(tǒng)需要工作在一些特殊環(huán)境中,例如露天、無人場合、危險(xiǎn)性高的場合等等。所以相對于一般的系統(tǒng)而言,嵌入式系統(tǒng)的可靠性要求較高。(6)系統(tǒng)精簡。嵌入式系統(tǒng)一般不區(qū)分應(yīng)用軟件和系統(tǒng)軟件,功能和實(shí)現(xiàn)上面沒有那么復(fù)雜,這樣既降低了成本,又增加了安全性。(7)功耗低。嵌入式系統(tǒng)宿主一般是一些小型系統(tǒng),比如手機(jī)、MP3、相機(jī)等設(shè)備,而這些設(shè)備的電池容量往往很小,因此,嵌入式系統(tǒng)必須滿足低功耗的要求。而為了滿足這一點(diǎn),嵌入式系統(tǒng)的軟件一般都不在磁盤中,而是固化在單片機(jī)的存儲器或者存儲器芯片當(dāng)中。1.2.3嵌入式系統(tǒng)的構(gòu)成嵌入式系統(tǒng)一般分為軟件和硬件兩部分。硬件部分主要以嵌入式處理器為核心集成存儲器以及配套的輸入和輸入設(shè)備,軟件則是由嵌入式操作系統(tǒng)、應(yīng)用程序等組成。這些合在一起構(gòu)成嵌入式系統(tǒng)。如圖1-1所示。圖1-1嵌入式系統(tǒng)構(gòu)成硬件層主要有:嵌入式微處理器、存儲器和通用設(shè)備接口及I/O接口。(1)嵌入式微處理器:硬件層的核心,與通用的CPU不同的是它工作在特殊用戶的專用設(shè)計(jì),將許多有板卡完成的任務(wù)集成于芯片內(nèi)部,從而使系統(tǒng)體積變小,提高效率和可靠性。其體系機(jī)構(gòu)為哈弗體系或者馮諾伊曼體系,指令系統(tǒng)RISC和CISC。嵌入式微處理器超過一千多種,有三十多個(gè)體系結(jié)構(gòu),主流則是ARM、PowerPc和X86等。根據(jù)具體應(yīng)用選擇。(2)存儲器:主要是主存、輔存和Cache。嵌入式微處理器直接進(jìn)行訪問的寄存器是主存。主要存放系統(tǒng)和應(yīng)用程序及數(shù)據(jù),容量通常在256KB-1GB之間,主要分為ROM(NORFlash、EPROM、PROM)和RAM(SRAM、DRAM、SDRAM);輔存存放大量的數(shù)據(jù)和代碼,常用的有NANDFLASH和SD卡;Cache的速度近于CUP,主要是為了解決CPU和主存速度不匹配的問題,讀數(shù)據(jù)的時(shí)候,盡量從Cache中讀取,可以提到系統(tǒng)的整體性能,在嵌入式系統(tǒng)中,Cache則是集成在嵌入式微處理器當(dāng)中。(3)通用設(shè)備接口:也就是用來和外界進(jìn)行交互時(shí)的通用設(shè)備接口,主要是I/O、數(shù)模轉(zhuǎn)換和模數(shù)轉(zhuǎn)換。目前常用的I/O接口有USB接口、RS-232接口、以太網(wǎng)口、A/D、D/A等等。軟件層主要有:實(shí)時(shí)多任務(wù)操作系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)、GUI、文件系統(tǒng)。嵌入式操作系統(tǒng):應(yīng)用十分廣發(fā)的一種操作系統(tǒng)。主要是工業(yè)和國防。相對于一般的操作系統(tǒng)而言,它還有可卸裝性、強(qiáng)實(shí)時(shí)性、強(qiáng)穩(wěn)定性、代碼固化、統(tǒng)一的接口等。1.2.4嵌入式系統(tǒng)發(fā)展和前景嵌入式系統(tǒng)一共經(jīng)歷了四個(gè)階段,分別為以單片機(jī)為核心的可編程控制系統(tǒng);在嵌入式處理器基礎(chǔ)上用簡單操作系統(tǒng)的嵌入式系統(tǒng);在嵌入式處理器基礎(chǔ)上用復(fù)雜操作系統(tǒng)的嵌入式系統(tǒng);有網(wǎng)絡(luò)功能的嵌入式系統(tǒng)(韋東山2008)。以往的嵌入式系統(tǒng)多被用于軍工,而目前的嵌入式系統(tǒng)則多作為個(gè)人的通信設(shè)備。軟件方面有很多成熟系統(tǒng),硬件方面也有各式各樣的芯片,十分成熟了。在數(shù)字化、信息化的未來,嵌入式將會有更大的發(fā)展?jié)摿?。也越來越與人們的生活緊密相連,無疑嵌入式系統(tǒng)將會飛速發(fā)展,占有巨大的市場,當(dāng)然,這也是一種挑戰(zhàn),嵌入式系統(tǒng)有幾大發(fā)展趨勢:(1)嵌入式的發(fā)展必然使其軟硬件變的模糊不分,廠家提供硬件的同時(shí)會提供更加完善的開發(fā)工具和軟件包。軟件也可以用硬件形態(tài)存在,實(shí)時(shí)性更加強(qiáng)大。(2)信息網(wǎng)絡(luò)化的要求。網(wǎng)絡(luò)技術(shù)愈加成熟的今天,嵌入式產(chǎn)品肯定要和其緊密相連,互相促進(jìn)發(fā)展。嵌入式產(chǎn)品會大量提供網(wǎng)絡(luò)接口,而網(wǎng)絡(luò)上也會提供大量嵌入式產(chǎn)品的軟件。(3)更精簡的系統(tǒng)內(nèi)核。不斷改進(jìn)算法以及選用最適合的編程模型,節(jié)約資源,提高性能。1.3Linux和ARM的應(yīng)用1.3.1Linux的應(yīng)用Linux是一種類UNIX操作系統(tǒng),可以免費(fèi)使用,是一個(gè)基于POSIX和UNIX的多任務(wù)、多CUP、多用戶和多線程的操作系統(tǒng)。也是當(dāng)下最流行的開放源代碼的操作系統(tǒng)。Linux在支持個(gè)人計(jì)算機(jī)的同時(shí)也支持嵌入式,目前有近一半對的嵌入式項(xiàng)目使用的是Linux操作系統(tǒng),可見其在嵌入式系統(tǒng)中的地位。Linux因?yàn)槊赓M(fèi),源代碼可以從網(wǎng)上下載,以及Linux系統(tǒng)中的許多應(yīng)用程序免費(fèi),加上它可以滿足實(shí)時(shí)性的要求,可靠性和穩(wěn)定性高,內(nèi)核可以根據(jù)需要?jiǎng)h減,使得Linux成為開發(fā)嵌入式項(xiàng)目的首選。隨著而來的也是越來越成熟的Linux移植技術(shù)(馬炳道2011)。1.3.2ARM的應(yīng)用ARM是一家向芯片制造商提供知識產(chǎn)權(quán)的公司。由于其開發(fā)的平臺和完善的體系結(jié)構(gòu),使ARM處理器應(yīng)用非常廣泛。ARM在手持設(shè)備中占有九層份額,ARM能縮短程序開發(fā)和測試時(shí)間,降低費(fèi)用,ARM使得用戶能在多家商品中選擇,保證其競爭性。ARM處理器是位設(shè)計(jì)的同時(shí)也配備了16位指令集,ARM提供系統(tǒng)芯片、微處理器和內(nèi)核等方案。CPU增加DSP也提高了性能和靈活性,ARM的功耗很低。第二章系統(tǒng)硬件設(shè)計(jì)系統(tǒng)硬件設(shè)計(jì)2.1系統(tǒng)總的硬件設(shè)計(jì)本系統(tǒng)主要有核S3C2440、USB+CMOS圖像采集系統(tǒng)和WiFi無線傳輸模塊構(gòu)成。使用三星公司的一款內(nèi)核為ARM920T的S3C2440嵌入式處理器,USB攝像頭采集圖像傳遞給ARM處理板,ARM上在Linux環(huán)境下運(yùn)行應(yīng)用程序,通過WiFi傳輸數(shù)據(jù)。結(jié)構(gòu)框圖如圖2-1所示。圖2-1總體硬件框圖2.2微處理器引腳連線圖主要介紹電源、地址線、數(shù)據(jù)線及外設(shè)引腳圖。2.2.1電源引腳連接圖電源引腳如圖2-2所示。圖2-2S3C2440的電源引腳連線圖2.2.2地址線、數(shù)據(jù)線以及主要外設(shè)引腳連線圖地址線、數(shù)據(jù)線及外設(shè)主要引腳如圖2-3所示。圖2-3S3C2440引腳連線圖2.3外圍電路2.3.1電源電路首先看幾個(gè)電源引腳,VDDalive引腳無論在正常模式,還是休眠模式都必須工作,它給處理器復(fù)位模塊和端口寄存器提供l.2V或者1.3V電壓;VDDi是給內(nèi)部模塊提供1.2V電壓,VDDiarm為處理器內(nèi)核提供1.2V電壓;VDDOP為I/O端口提供3.3V電壓,VDDMOP為處理器存儲器端口提供3.3V電壓;VDDA_ADC為處理器內(nèi)的ADC系統(tǒng)提供3.3V電壓;VDDRTC為時(shí)鐘電路提供3.3v電壓,該電壓在系統(tǒng)掉電后仍需要維持。由此可見,在該系統(tǒng)中,需要使用3.3V和1.2V的直流穩(wěn)壓電源。為簡化系統(tǒng)電源電路設(shè)計(jì),電源5-12V寬電壓輸入,LT1765高效DC/DC降壓,標(biāo)準(zhǔn)5V電源。VDD3.3V提供給CPU的VDDMOP、VDDOP、VDDADC和VCC引腳,VDDRTC提供給主芯片S3C2440的VDD_RTC引腳,VDDalive提供給CPU的VDDi。5V直流輸入電壓經(jīng)過DC-DC轉(zhuǎn)換器可以完成5V到3.3V的轉(zhuǎn)換;得到的3.3V通過DC-DC轉(zhuǎn)換為1.2V。系統(tǒng)中RTC(實(shí)時(shí)時(shí)鐘)所需要電壓由3.3V電源和后備電源共同提供。如圖2-4所示。圖2-43.3V和1.2V電壓產(chǎn)生電路2.3.2復(fù)位電路在系統(tǒng)中,復(fù)位電路主要完成系統(tǒng)的上電復(fù)位和系統(tǒng)在運(yùn)行時(shí)用戶的按鍵復(fù)位功能。復(fù)位電路可以由簡單的RC電路構(gòu)成,也可以使用其它的相對比較復(fù)雜。如圖2-5所示。圖2-5復(fù)位電路2.3.4系統(tǒng)時(shí)鐘電路該微處理器的主時(shí)鐘由外部振蕩器提供。如圖2-6所示。圖2-6時(shí)鐘電路2.3.4存儲器接口電路系統(tǒng)中有三個(gè)外部存儲器:分別是256M的NandFlash、2M的NorFlash和64M的SDRAM。前2個(gè)是FLASH存儲器,后者是SDRAM電路。Flash閃存是非易失存儲器,可以對存儲單元塊進(jìn)行編程。任何Flash器件進(jìn)行寫入操作前都必須執(zhí)行擦除操作。因?yàn)閰f(xié)調(diào)器需要移植Linux操作系統(tǒng)、并且需要為以后的功能擴(kuò)展留有空間,所以選用的NANDFlash存儲器為K9F1208,其存儲容量為256M,數(shù)據(jù)寬度為8位,以8位(字模式)數(shù)據(jù)寬度的方式工作,僅需要3.3V電壓即可完成在系統(tǒng)的編程和擦除工作,通過對其內(nèi)部的命令寄存器寫入標(biāo)準(zhǔn)的命令序列,可對Flash進(jìn)行編程、整片擦除、按扇區(qū)擦除,以及其它操作。如圖2-7所示。圖2-7NandFlashSDRAM不具有掉電保存數(shù)據(jù)的特性,不過它的存儲速度要比Flash要快很多,而且可以進(jìn)行讀寫,因此,SRDRAM在系統(tǒng)中主要用作程序的運(yùn)行空間、數(shù)據(jù)以及堆棧區(qū)。當(dāng)系統(tǒng)啟動時(shí),CPU首先從復(fù)位地址0X00處讀取啟動代碼,在完成系統(tǒng)的初始化后,程序代碼一般應(yīng)調(diào)入SDRAM中運(yùn)行,以提高系統(tǒng)的運(yùn)行速度。同時(shí),系統(tǒng)及用戶堆棧、運(yùn)行數(shù)據(jù)也都放在SDRAM中。本設(shè)計(jì)使用的SDRAM存儲器為K4S561632N,為16位數(shù)據(jù)寬度,單片容量位32MB,系統(tǒng)選用兩片K4S561632N并聯(lián)構(gòu)成32位的SDRAM存儲器系統(tǒng),共64MB的SDRAM空間,可滿足嵌入式操作系統(tǒng)及各種相對復(fù)雜的算法的運(yùn)行要求。如圖2-8所示。圖2-8SDRAM2.4系統(tǒng)的主要接口電路設(shè)計(jì)2.4.1串口電路串行接口的設(shè)計(jì),RS232是應(yīng)用最廣泛的UART接口,可以方便的實(shí)現(xiàn)與計(jì)算機(jī)的數(shù)據(jù)通信,系統(tǒng)的電平轉(zhuǎn)換芯片采用的是MAX3232芯片,通信協(xié)議為RS-232協(xié)議。串行口的通信方式采用8位異步通信方式,波特率采用115200bps。2.4.2USB接口電路USB接口電路如圖2-10所示。圖2-10USB接口電路2.5視頻采集模塊視頻采集使用的是CMOS圖像傳感器OV7740,外加USB模塊,支持ARM開發(fā)板,像素30W,工作頻率6-27MHz,實(shí)物如圖2-11所示。圖2-11攝像頭2.6無線傳輸模塊無線傳輸使用的是WIFI無線網(wǎng)卡,插口是USB,能方便的和主機(jī)進(jìn)行通信,傳輸速率150Mbps。實(shí)物圖如圖2-12所示。圖2-12WiFi無線網(wǎng)卡 第三章Linux系統(tǒng)的移植Linux系統(tǒng)的移植3.1Linux系統(tǒng)的構(gòu)成從總體上看,Linux系統(tǒng)可以分為應(yīng)用程序和Linux內(nèi)核兩部分。3.3.1應(yīng)用程序應(yīng)用程序分為系統(tǒng)應(yīng)用程序以及用戶應(yīng)用程序,是一個(gè)軟件集合。系統(tǒng)應(yīng)用程序就是與系統(tǒng)聯(lián)系密切的程序,例如GCC編譯程序和shell等。而用戶應(yīng)用程序則是用戶為了完成自己特定的需求而編寫的程序(BauersC1995)。3.1.2內(nèi)核內(nèi)核則是一個(gè)系統(tǒng)的靈魂,它主要的任務(wù)是磁盤文件管理、內(nèi)存管理、接收和發(fā)送數(shù)據(jù)。3.1.3硬件的驅(qū)動硬件驅(qū)動是指系統(tǒng)運(yùn)行時(shí)候要管理的物理設(shè)備,例如硬盤、內(nèi)存、CPU、網(wǎng)絡(luò)硬件等等。3.2Linux的移植本系統(tǒng)使用的Linux的版本是Linux2.6.22,在ARM開發(fā)板的配套資料中,用制作好的u-boot進(jìn)行燒寫。具體分為下面四個(gè)步鄹;(1)對NANDFLASH分區(qū);(2)燒寫u-boot;(3)燒寫內(nèi)核;(4)構(gòu)成根文件系統(tǒng)(馮世奎2006)。3.2.1分區(qū)(1)鏈接好USB口,打開SecureCRT5.2,選擇norFlash,上電啟動ARM板子,進(jìn)入BIOS菜單。(2)按下F對NANDFLASH進(jìn)行分區(qū)。3.2.2燒寫u-boot(1)編譯u-boot.bin。$Tarxjfu-boot-1.1.6.tar.bz2$Cdu-boot-1.1.6$Patch–p1<../u-boot-1.1.6_jz2440.patch$make100ask24x0_config$make(2)接好USB接口,并打開DNW,如果DNW提示USB:OK,表示USB正確鏈接,然后選擇USBport,然后點(diǎn)transmit,選擇u-boot.bin,傳輸。(3)DNW自動將u-boot.bin燒寫到NandFlash下,下載完成,SecureCRT5.2會顯示下載成功。3.2.3燒寫內(nèi)核(1)編譯uImage。$tarxjflinux-.tar.bz2$cdlinux-$patch-p1<../linux-_jz2440.patch$mv../4.3寸LCD_mach-smdk2440.carch/arm/mach-s3c2440/mach-smdk2440.c//替換4.3寸源碼$cpconfig_ok.config$makeuImage(2)選擇USBport,然后點(diǎn)transmit,選擇uImage,傳輸。(3)DNW自動將uImage燒寫到NandFlash下下載完成,SecureCRT5.2會顯示下載成功。3.2.4燒寫根文件系統(tǒng)(1)制作fs_qtopia.yaffs2,本身用到mkyaffs2image工具。$sudocp/work/linux/tools/mkyaffs2image/usb/bin$sudochmod+x/usb/bin/mkyaffs2image$mkyaffs2imagefs_qtopiafs_qtopia.yaffs2(2)選擇USBport,然后點(diǎn)transmit,選擇fs_qtopia.yaffs2,傳輸。(3)DNW自動將fs_qtopia.yaffs2燒寫到NandFlash下,下載完成,SecureCRT5.2會顯示下載成功。(4)選擇Nand,重新啟動,然后進(jìn)行校正,系統(tǒng)燒寫完成。第四章USB驅(qū)動的設(shè)計(jì)USB驅(qū)動的設(shè)計(jì)4.1USB驅(qū)動介紹USB接口有主機(jī)端和設(shè)備端兩種,也就有主機(jī)端驅(qū)動以及設(shè)備端驅(qū)動(駱剛2002)。當(dāng)然,ARM算是主機(jī)端,攝像頭則是設(shè)備端。在Linux中主機(jī)驅(qū)動又包括USB主機(jī)控制器驅(qū)動和USB設(shè)備類驅(qū)動。兩類驅(qū)動各有各的作用,主機(jī)控制器的驅(qū)動是用來驅(qū)動主機(jī)控制硬件,USB設(shè)備類的驅(qū)動是控制設(shè)備自身以適當(dāng)?shù)姆绞胶椭鳈C(jī)進(jìn)行數(shù)據(jù)傳輸,例如USB攝像頭驅(qū)動、USB無線網(wǎng)卡等等。USB主機(jī)控制器是CPU和設(shè)備進(jìn)行溝通的橋梁,它實(shí)現(xiàn)了USB協(xié)議規(guī)定的操作,一般情況下,主機(jī)控制器硬件是集成在CPU中的。USB設(shè)備一般不會直接和CPU進(jìn)行通信,而是通過主機(jī)控制器。當(dāng)應(yīng)用程序運(yùn)行時(shí)先通過文件系統(tǒng)接口訪問設(shè)備類驅(qū)動程序,設(shè)備類驅(qū)動程序就會使用USB驅(qū)動的接口將數(shù)據(jù)給USB驅(qū)動,進(jìn)而通過主機(jī)控制器驅(qū)動的接口,發(fā)送數(shù)據(jù)到設(shè)備控制器,而設(shè)備控制器最終傳遞給CPU。4.2USB設(shè)備的配置、端點(diǎn)和接口區(qū)域的邊界就是端點(diǎn),計(jì)算機(jī)中端點(diǎn)也取這個(gè)概念。端點(diǎn)是USB中用來通訊的工具,兩個(gè)設(shè)備通過它來鏈接,而且端點(diǎn)是一種單向傳輸數(shù)據(jù)類似于pipe管道的存在。端點(diǎn)是需要和接口綁定在一起使用的,并且是由接口控制端點(diǎn)的。接口就是interface,每一個(gè)USB設(shè)備驅(qū)動程序都必然有interface,而且我們使用的很多器件都是和其他器件一起使用的,如果為每一個(gè)器件都去編寫一個(gè)驅(qū)動,那么十分浪費(fèi)時(shí)間資源,也是沒有必要的。所以,人們在編寫驅(qū)動的時(shí)候,往往會對多個(gè)器件當(dāng)做一個(gè)整體來進(jìn)行驅(qū)動的編寫,這樣是接口所要完成的事情。配置和設(shè)備是一對一或多對一的關(guān)系,并且配置是根據(jù)實(shí)際需要來進(jìn)行相應(yīng)的改變,這樣在某個(gè)時(shí)間點(diǎn)上,就有一個(gè)配置會起作用,進(jìn)而使得設(shè)備處于不同的狀態(tài)。另外Linux不適合處理多配置,所以一般也不采用。4.3設(shè)備文件以及模塊的介紹計(jì)算機(jī)剛發(fā)展起來的時(shí)候,開發(fā)驅(qū)動是一件非常不容易的事情,需要不斷的對內(nèi)核進(jìn)行編譯和燒寫,這樣的話效率就會非常低下(JohanThelin2007)。所以,人們引進(jìn)了模塊的概念,模塊通俗的說就是一個(gè)已經(jīng)編譯的好的程序,而且模塊是沒有main函數(shù)的,可以理解為一個(gè)函數(shù),在適當(dāng)?shù)臅r(shí)候供內(nèi)核調(diào)用,然后在內(nèi)核空間里面運(yùn)行,因?yàn)槟K提供的僅僅就是方法,內(nèi)核是一個(gè)操作系統(tǒng)的核心且有主函數(shù),而操作系統(tǒng)又是無線循環(huán)函數(shù),模塊就是作為內(nèi)核主函數(shù)調(diào)用的方法了。那么,現(xiàn)在的驅(qū)動就是作為一個(gè)模塊提供給內(nèi)核了。我們通常使用兩種方法來加載內(nèi)核,即動態(tài)加載和直接編譯。為了方便調(diào)試,一般采用動態(tài)加載的方式來運(yùn)行驅(qū)動。利用LINUX的module特性來動態(tài)加載,使用insomd命令在系統(tǒng)啟動把驅(qū)動程序(.o文件)添加上去,如果不需要,就可以使用rmmod命令來卸載。動態(tài)加載的方式一般適用于臺式機(jī)。而在嵌入式應(yīng)用中,也可以使用動態(tài)加載的方式來調(diào)試,在調(diào)試好以后再編譯到內(nèi)核里。根據(jù)行為的不同,我們把Linux的驅(qū)動分為不同的類型,一種類型是面向字符設(shè)備的,一種類型是面向塊設(shè)備的,兩者都是通過文件系統(tǒng)來控制物理設(shè)備,通過mknod工具來創(chuàng)建一個(gè)和驅(qū)動程序?qū)?yīng)的設(shè)備節(jié)點(diǎn),我們每創(chuàng)建一個(gè)新的設(shè)備驅(qū)動程序,就要為其分配一個(gè)設(shè)備號,這個(gè)設(shè)備號適合驅(qū)動程序唯一關(guān)聯(lián)的。使用mknod創(chuàng)建好設(shè)備號以后,我們就可以同過訪問設(shè)備文件來操作設(shè)備了。對于一般的設(shè)備文件而言,可以使用write、read對設(shè)備操作,Linux用戶態(tài)的操作會通過系統(tǒng)調(diào)用接口來轉(zhuǎn)換成內(nèi)核態(tài)相應(yīng)的函數(shù)操作。網(wǎng)絡(luò)設(shè)備和上述兩種設(shè)備都不同的是網(wǎng)絡(luò)設(shè)備是面向報(bào)文的,同時(shí)也具有兩者的一些特征,只不過塊設(shè)備是隨機(jī)訪問而已。Linux中每一個(gè)網(wǎng)絡(luò)設(shè)備都需要一個(gè)網(wǎng)絡(luò)接口,也就是ifconfig命令出來的eth0等等。網(wǎng)絡(luò)接口可以傳輸數(shù)據(jù),其實(shí)網(wǎng)絡(luò)驅(qū)動就是為了完成數(shù)據(jù)的發(fā)送和接收(MaekramRaydan2005)。4.4USB工作機(jī)制為了使得編寫設(shè)備驅(qū)動的整體結(jié)構(gòu)框架更加的清晰,必須理解設(shè)備、總線和Linux模型這三個(gè)最重要的概念(溫志強(qiáng)2010)。設(shè)備不是和CPU直接進(jìn)行通信的,他們之間需要通過總線來進(jìn)行連接,CPU給總線發(fā)送消息,總線就會驅(qū)動相應(yīng)的設(shè)備進(jìn)行工作,當(dāng)然,總線是通過總線和設(shè)備之間的驅(qū)動來使得設(shè)備工作的。具體的操作內(nèi)容就是驅(qū)動的內(nèi)容了。三者之間存在的關(guān)系就是Linux模型了。最重要的三個(gè)數(shù)據(jù)結(jié)構(gòu)就是總線類型(structbustype)、設(shè)備類型(structdevice)、設(shè)備驅(qū)動(structdevice_driver)。定義如下(JonathanCorbet2006):structbus_type{constchar*name;/*總線類型名稱*/structmodule*owner;/*指向模塊的指針(如果有),此模塊負(fù)責(zé)操作這個(gè)總線*/structksetsubsys;/*與該總線相關(guān)的子系統(tǒng)*/structksetdrivers;/*總線驅(qū)動程序的kset*/structksetdevices;/*掛在該總線的所有設(shè)備的kset*/structklistklist_devices;/*掛接在該總線的設(shè)備鏈表*/structklistklist_drivers;/*與該總線相關(guān)的驅(qū)動程序鏈表*/…int(*match)(structdevice*dev,structdevice_driver*dry);structbus_attribute*bus_attrs;/*總線屬性*/…};其中的函數(shù)指針match是用來匹配設(shè)備和驅(qū)動的,當(dāng)有新的設(shè)備加入或者新的驅(qū)動加載的時(shí)候,match就會被調(diào)用來確認(rèn)新加入的驅(qū)動可以匹配那些設(shè)備以及新加入的設(shè)備可以匹配那些驅(qū)動,成功的時(shí)候就會返回參數(shù)0。structdevice{…Structbus_type*bus;/*設(shè)備掛載到那類總線上*/char
bus_id[BUS_ID_SIZE];/*在總線上唯一標(biāo)識該設(shè)備的字符串;例如:PCI設(shè)備使用標(biāo)準(zhǔn)的PCIID格式,包含:域、總線、設(shè)備、功能號.*/structdevice_driver*driver;
/*管理該設(shè)備的驅(qū)動程序*/…}Structdevice_driver{…structdevice_type
*type/*設(shè)備掛載到那類總線上*/structlist_headdevices;…int(*probe)(structdevice*dev);…{前文已經(jīng)說過,現(xiàn)在的驅(qū)動一般設(shè)計(jì)的時(shí)候是支持一系列的設(shè)備,所以在device_driver中沒有設(shè)備機(jī)構(gòu)體,而是用了list_headdevices,內(nèi)核則是根據(jù)新插入的設(shè)備來穿件設(shè)備結(jié)構(gòu)體,然后在devices中添加一個(gè)device,同樣當(dāng)一個(gè)驅(qū)動加進(jìn)來的時(shí)候就會由驅(qū)動自己完成devices填充,和上文一樣match來進(jìn)行匹配(JonathanCorbet2006)。4.5總線表和ID設(shè)備表本文中使用的是USB攝像頭和USB無線網(wǎng)卡,所以就以USB為例說一下,USB的內(nèi)核首先會創(chuàng)建一個(gè)總線類型的結(jié)構(gòu)體,然后就會去掃描USB總線,如果發(fā)現(xiàn)了相應(yīng)的設(shè)備,會根據(jù)這個(gè)設(shè)備的相關(guān)信息來創(chuàng)建一個(gè)USB類型的設(shè)備結(jié)構(gòu)體,同時(shí)完成初始化以及添加到總線結(jié)構(gòu)體的設(shè)備鏈表中,到此,就初始化了設(shè)備鏈表。驅(qū)動鏈表的初始化也是同樣的過程,USB提供USB接口注冊給USB驅(qū)動,USB_register就會完成對總線結(jié)構(gòu)體中驅(qū)動鏈表的初始化,然后內(nèi)核就會實(shí)現(xiàn)驅(qū)動和設(shè)備之間的綁定,內(nèi)核還是調(diào)動match函數(shù)來進(jìn)行匹配,當(dāng)匹配成功的時(shí)候,設(shè)備就可以正常工作了。ID表中寫的就是設(shè)備在生產(chǎn)出來后,廠家信息,產(chǎn)品型號以及產(chǎn)品需要支持的協(xié)議等,這些信息是編寫驅(qū)動時(shí)候要用到的,內(nèi)核就是根據(jù)ID表中的信息和芯片內(nèi)部的信息來進(jìn)行綁定,如果某設(shè)備的信息和驅(qū)動的信息一模一樣,那么就匹配成功,綁定成功。4.6USB攝像頭驅(qū)動Linux內(nèi)核中V4l2是視頻設(shè)備的標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)定義了一系列的接口函數(shù),應(yīng)用程序和驅(qū)動等通信就是通過它來聯(lián)系的。USB攝像頭則是視頻設(shè)備,所以USB攝像頭的驅(qū)動就是按照V4l2這個(gè)標(biāo)準(zhǔn)的定義來寫的,內(nèi)核是依據(jù)設(shè)備號來操作設(shè)備文件,攝像頭在內(nèi)核中的設(shè)備號/DEV/video0(HallinanC2008),主設(shè)備號是81,次設(shè)備號是由攝像頭的數(shù)目來決定的,本文中ARM通過HUB連接了一個(gè)USB+CMOS二合一攝像頭,USB攝像頭驅(qū)動程序原理實(shí)現(xiàn)如圖4-1所示。圖4-1攝像頭驅(qū)動原理圖在驅(qū)動中要先聲明一個(gè)video_driver結(jié)構(gòu)體,然后就是編寫文件操作函數(shù)的的指針數(shù)組fops,最后注冊,這樣應(yīng)用程序在操作設(shè)備文件的時(shí)候,就會調(diào)用這些指針來運(yùn)行函數(shù),完成通信,具體的一個(gè)USB攝像頭驅(qū)動程序如下:首先創(chuàng)建一個(gè)USB_driver結(jié)構(gòu)體,這是唯一的,與設(shè)備對應(yīng),如下:staticstructi2c_drivercmos_ov7740_driver={ .driver ={ .name ="cmos_ov7740", .owner =THIS_MODULE, }, .probe =cmos_ov7740_probe, .remove =__devexit_p(cmos_ov7740_remove), .id_table =cmos_ov7740_id_table,};接下來就是設(shè)置probe,其中fops是聲明驅(qū)動文件操作函數(shù)指針,具體有可以分為下面幾個(gè)步驟:先的聲明一個(gè)video_driver,如下:staticstructvideo_devicecmos_ov7740_vdev={ .fops =&cmos_ov7740_fops, .ioctl_ops =&cmos_ov7740_ioctl_ops, .release =cmos_ov7740_release, .name ="cmos_ov7740",};然后設(shè)置.fops和iotcl_ops,如下:staticconststructv4l2_file_operationscmos_ov7740_fops={ .owner =THIS_MODULE, .open =cmos_ov7740_open, .release =cmos_ov7740_close, .unlocked_ioctl=video_ioctl2, .read =cmos_ov7740_read,};staticconststructv4l2_ioctl_opscmos_ov7740_ioctl_ops={…(共11項(xiàng))}video_register_device(&cmos_ov7740_vdev,VFL_TYPE_GRABBER,-1)為了使得芯片可以找到相應(yīng)的芯片,所以得有ID_TABIE,本文的USB驅(qū)動程序中如下定義:staticconststructi2c_device_idcmos_ov7740_id_table[]={ {"cmos_ov7740",0}, {}};/即只有攝像頭一個(gè)設(shè)備/最后就是注冊了:staticintcmos_ov7740_drv_init(void){ /*1.2.注冊*/ usb_register(&cmos_ov7740_driver); return0;}下面的是退出:staticvoidcmos_ov7740_drv_exit(void){ usb_deregister(&cmos_ov7740_driver);}通過insmod命令來加載USB驅(qū)動模塊,這個(gè)時(shí)候模塊的初始化函數(shù)調(diào)用來想內(nèi)核注冊驅(qū)動程序,當(dāng)卸載的時(shí)候就使用rmmod,模塊就會被卸載。驅(qū)動的名稱和實(shí)現(xiàn)如下面所示:module_init(cmos_ov7740_drv_init);module_exit(cmos_ov7740_drv_exit);通過使用module_init(cmos_ov7740_drv_init),其實(shí)只是僅僅通知內(nèi)核有這么一個(gè)模塊了,但是真正要得到處理就要用到probe函數(shù)了。這個(gè)函數(shù)上面介紹過,就是使得驅(qū)動和具體的設(shè)備記性匹配,成功就開始工作了。當(dāng)結(jié)束的時(shí)候,就會調(diào)用disconnect(),完成結(jié)束。倆個(gè)函數(shù)如下所示:staticint__devinitcmos_ov7740_probe(structi2c_client*client,conststructi2c_device_id*id){…}staticvoidcmos_ov7740_disconnect(structusb_interface*intf){…}USB攝像頭驅(qū)動到此就算結(jié)束了。4.7WiFi網(wǎng)卡驅(qū)動USB驅(qū)動的大多數(shù)都在內(nèi)核中實(shí)現(xiàn)了,系統(tǒng)使用的USB網(wǎng)卡就是內(nèi)核中以及編譯好的,具體和其他USB設(shè)備模塊一樣,可以參考上述攝像頭驅(qū)動,不在多述。第五章視頻采集設(shè)計(jì)和實(shí)現(xiàn)視頻采集設(shè)計(jì)和實(shí)現(xiàn)5.1程序設(shè)計(jì)本文使用的V4L2(videoforlinuxversion2的簡稱)視頻采集開發(fā)程序的規(guī)范,數(shù)據(jù)采集利用V4L2對ARM上的攝像頭進(jìn)行訪問和控制,并且捕獲攝像頭所拍下的視頻,然后再將獲得的數(shù)據(jù)封裝成幀發(fā)送到個(gè)人計(jì)算機(jī)(客戶端),具體ARM(服務(wù)器)主要配置設(shè)備獲取圖像,打開設(shè)備獲取信息并開始數(shù)據(jù)采集和緩存,最后關(guān)閉設(shè)備功能及設(shè)備。如圖5-1所示流程圖(劉步忠2009)。圖5-1數(shù)據(jù)采集流程圖其中有許多I/O操作,是通過操作V4L2中的數(shù)據(jù)的操作最終獲取圖像,幾個(gè)數(shù)據(jù)結(jié)構(gòu)如下:structv4l2_capabilitytV4l2Cap;structv4l2_fmtdesctFmtDesc;structv4l2_formattV4l2Fmt;structv4l2_requestbufferstV4l2ReqBuffs;structv4l2_buffertV4l2Buf;其中v4l2_capability是設(shè)備的基本信息,例如設(shè)備的信號源信息、設(shè)備的名稱、設(shè)備的最大和最小分辨率等等,對應(yīng)于命令VIDIOC_QUERYCAP,v4l2_fmtdesc為所支持的格式,v4l2_format幀的格式,對應(yīng)命令VIDIOC_ENUM_FMT。v4l2_requestbuffers申請幀緩沖,對應(yīng)命令VIDIOC_REQBUFS(申請BUFFER)。v4l2_buffer驅(qū)動中的一幀圖像緩存,對應(yīng)命令VIDIOC_QUERYBUF(確定每一個(gè)buffer的信息,并且利用MMAP進(jìn)行映射的幀信息)。5.2程序?qū)崿F(xiàn)5.2.1打開設(shè)備打開攝像頭,是利用OPEN函數(shù)實(shí)現(xiàn)這一操作,如圖5-2所示。startstartfd=-1fd=open(strDevName,O_RDWR)fd<0?YNerror1圖5-2打開設(shè)備圖5.2.2獲取設(shè)備信息structv4l2_capability tV4l2Capstructv4l2_format tV4L2Fmtmemset(&tV4l2Cap,0,sizeof(tV4l2Cap));memset(&tV4L2Fmt,0,sizefo(tV4L2Fmt));ioctl(iFd,VIDIOC_QUERYCAP,&tV4l2Cap)ioctl(iFd,VIDIOC_S_FMT,&tV4l2Fmt);returnerr?NerrorY1getinfo: fmt.fmt.pix.pixelformat fmt.fmt.width fmt.fmt.height2打開設(shè)備以后,就要獲取設(shè)備的信息和一些視頻采集相關(guān)的參數(shù)了,然后由得到的信息就可以進(jìn)行初步的判斷出設(shè)備的類型和接下來處理的數(shù)據(jù)的類型。這里要用到iotcl函數(shù)structv4l2_capability tV4l2Capstructv4l2_format tV4L2Fmtmemset(&tV4l2Cap,0,sizeof(tV4l2Cap));memset(&tV4L2Fmt,0,sizefo(tV4L2Fmt));ioctl(iFd,VIDIOC_QUERYCAP,&tV4l2Cap)ioctl(iFd,VIDIOC_S_FMT,&tV4l2Fmt);returnerr?NerrorY1getinfo: fmt.fmt.pix.pixelformat fmt.fmt.width fmt.fmt.height2圖5-3獲取設(shè)備信息5.2.3設(shè)置視頻采集方式設(shè)置攝像頭的采集方式,例如設(shè)置一些視頻采集格式(本文支持YUYV、MJPEG、RGB565)、圖像的寬度和高度等等。這里主要是通過對v4l2_format結(jié)構(gòu)體成員的設(shè)置來進(jìn)行的。如圖5-4所示。2structv4l2_format 2structv4l2_format tV4L2Fmtmemset(&tV4L2Fmt,0,sizefo(tV4L2Fmt));ioctl(fd,VIDIOC_S_FMT,&tV4L2Fmt)tV4L2Fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTUREtV4L2Fmt.fmt.pix.field=V4L2_FIELD_ANYtV4L2Fmt.fmt.pix.width=iLcdWidth(通過GetDispResolution獲?。﹖V4L2Fmt.fmt.pix.htight=iLcdHeigtreturnerr?errorreturn3NY圖5-4設(shè)置采集方式5.2.4申請緩存空間上面3步的工作完成以后,就解決了數(shù)據(jù)格式大小的問題了。但是采集數(shù)據(jù)還需要緩沖區(qū)隊(duì)列的方式,因?yàn)榫彺婵臻g是有內(nèi)核進(jìn)行管理的,所以使用的時(shí)候需要申請緩存空間來存放視頻數(shù)據(jù)。應(yīng)用程序通過API接口提供的方法VIDIOC_REQBUFS申請若干個(gè)視頻數(shù)據(jù)的幀緩沖區(qū),所申請幀緩沖區(qū)數(shù)量一般不少于3個(gè),每一個(gè)幀緩沖區(qū)存放一幀視頻數(shù)據(jù),這些幀緩沖區(qū)在內(nèi)核空間。通過API接口提供的VIDIOC_QUERYBUF查詢到幀緩沖區(qū)在內(nèi)核空間的長度和偏移量地址。再通過內(nèi)存映射方法(mmap),將申請到的內(nèi)核空間幀緩沖區(qū)的地址映射到用戶空間地址,這樣就可以直接處理幀緩沖區(qū)的數(shù)據(jù)。如圖5-5所示。3structv4l2_requestbufferstV4l2ReqBuffs;memset(&tV4l2ReqBuffs,0,sizeof(structv4l2_requestbuffers));ioctl(iFd,VIDIOC_REQBUFS,&tV4l2ReqBuffs)tV4l2ReqBuffs.count=NB_BUFFER3structv4l2_requestbufferstV4l2ReqBuffs;memset(&tV4l2ReqBuffs,0,sizeof(structv4l2_requestbuffers));ioctl(iFd,VIDIOC_REQBUFS,&tV4l2ReqBuffs)tV4l2ReqBuffs.count=NB_BUFFERtV4l2ReqBuffs.type=V4L2_BUF_TYPE_VIDEO_CAPTUREtV4l2ReqBuffs.memory=V4L2_MEMORY_MMAPreturnerr?errorreturn4YN5.2.5設(shè)置內(nèi)存屬性設(shè)置內(nèi)存的緩存,這里主要是是設(shè)置緩存的訪問方式,也就是選擇MMAP(內(nèi)存映射),還是read(直接讀取)。前者一般是連續(xù)視頻的采集,后者靜態(tài)圖片的采集。Read一般通過內(nèi)核來獲取數(shù)據(jù),相對于MMAP那種訪問內(nèi)存的方式要慢了許多,當(dāng)然,采用MMAP需要帶有MMU的CPU,本文用的S3C2440就符合。MMAP可以使進(jìn)程之間通過一個(gè)普通的文件實(shí)現(xiàn)內(nèi)存共享,不必進(jìn)行read和write,直接像訪問內(nèi)存一樣就可以。這樣的效率非常高,各個(gè)進(jìn)程可以及時(shí)的獲取別的進(jìn)程的最新數(shù)據(jù)。如圖5-6所示。圖5-6設(shè)置緩存5.2.6數(shù)據(jù)采集這個(gè)時(shí)候就將申請到的幀緩存放入隊(duì)列了,這樣就不用復(fù)制而是直接操作采集到的數(shù)據(jù)幀了。然后就可以開始數(shù)據(jù)的采集了,將采集的數(shù)據(jù)放入輸入隊(duì)列的第一個(gè)緩存區(qū)中,存滿后就會把該幀的緩沖區(qū)數(shù)據(jù)移到采集輸出隊(duì)列,應(yīng)用程序就會從視頻采集輸出隊(duì)列中取走數(shù)據(jù)并處理。然后將該幀重新放入輸入隊(duì)列,一直循環(huán)下去,不停的重復(fù)著上面的過程就完成了數(shù)據(jù)采集。如圖5-7所示。圖5-7采集數(shù)據(jù)放入隊(duì)列:ioctl(iFd,VIDIOC_QBUF,&tV4l2Buf)。開始采集:ioctl(ptVideoDevice->iFd,VIDIOC_STREAMON,&iType)。隊(duì)列取出:ioctl(ptVideoDevice->iFd,VIDIOC_DQBUF,&tV4l2Buf)。停止采集:ioctl(ptVideoDevice->iFd,VIDIOC_STREAMOFF,&iType)。5.2.7圖像處理數(shù)據(jù)FORMAT是V4L2_PIX_FMT_YUYV,V4L2_PIX_FMT_MJPEG等,如果不壓縮,那么他們既要占用非常大的存儲空間,而且十分不利于網(wǎng)絡(luò)傳輸,所以要對采集的圖像進(jìn)行處理,本文使用的是mjpg-streamer,它是一個(gè)很好的視頻服務(wù)器軟件,基于IP協(xié)議的網(wǎng)絡(luò)中,可以將攝像頭中的數(shù)據(jù)轉(zhuǎn)換成JPEG格式進(jìn)行傳輸,它是為ARM和CPU資源受限的嵌入式設(shè)備而寫的。具體是先將jpeg庫放入文件系統(tǒng)lib下,把mjpg-streamer放入文件系統(tǒng)bin目錄下,最后一起和文件系統(tǒng)移植到ARM中去,使用mjpg-streamer提供的接口來實(shí)現(xiàn)圖像的轉(zhuǎn)換了。第六章視頻傳輸視頻傳輸6.1無線網(wǎng)絡(luò)介紹本文要實(shí)現(xiàn)的是圖像采集和無線傳輸,所以除了要完成圖像采集外,還需要把數(shù)據(jù)通過網(wǎng)絡(luò)傳輸?shù)絺€(gè)人計(jì)算機(jī)上,因此需要實(shí)現(xiàn)網(wǎng)絡(luò)編程的客戶端和服務(wù)器端的數(shù)據(jù)通信,本系統(tǒng)是基于TCP協(xié)議來實(shí)現(xiàn)的。ARM做為服務(wù)器端實(shí)現(xiàn)圖像采集和處理,建立TCP服務(wù)器,等待客戶端鏈接,個(gè)人計(jì)算機(jī)作為客戶端鏈接服務(wù)器,鏈接成功后接受處理好的視頻數(shù)據(jù)并且顯示(劉國華2008)。在此簡單介紹一下無線網(wǎng)絡(luò)的概念,無線網(wǎng)絡(luò)比有線網(wǎng)絡(luò)發(fā)展要玩很多,現(xiàn)在也基本是只用于移動通信設(shè)備,網(wǎng)絡(luò)主要還是依賴有線。國外的無線網(wǎng)絡(luò)應(yīng)用十分廣泛,在家庭和許多工作場所都可以看見,國內(nèi)相對落后。無線網(wǎng)絡(luò)開始有許多標(biāo)準(zhǔn),不過IEEE802.11無線LAN(WiFi)成為了標(biāo)準(zhǔn)。相對于許多DSL因特網(wǎng)用戶或者寬帶線路的用戶,無線LAN的11Mb/s的數(shù)據(jù)傳輸速率完全夠用,802.11b無線LAN工作在2.4—2.485GHz的無線頻譜上,而且相對于高頻譜的802.11a,它的傳輸距離更遠(yuǎn)(葉正鑫2007)。6.2網(wǎng)絡(luò)編程介紹6.2.1TCP/IP協(xié)議網(wǎng)絡(luò)編程前,要確定進(jìn)程彼此之間進(jìn)行通信所要遵循的機(jī)制,也就是我們說的協(xié)議,網(wǎng)絡(luò)傳輸層就UDP和TCP兩種協(xié)議。它們有相同的網(wǎng)絡(luò)層,然而卻為應(yīng)用層提供不同的服務(wù),TCP面向連接而UDP面向數(shù)據(jù)報(bào),前者提供可靠的字節(jié)流服務(wù),而后者只是盡最大努力交付,即不可靠交付。本文使用的TCP協(xié)議,所以關(guān)于UDP的不多介紹,主要分析TCP/IP。TCP/IP協(xié)議雖然不是國際標(biāo)準(zhǔn),但卻成為了真正意義上的標(biāo)準(zhǔn)。TCP協(xié)議面向連接,即必須通過連接才能進(jìn)行通信,結(jié)束后斷開連接,每次發(fā)送數(shù)據(jù)都需要得到對方的確認(rèn),不然重發(fā),這樣保證可靠性。TCP傳送時(shí)是按照一個(gè)個(gè)字節(jié)傳送,每個(gè)字節(jié)都會編上一個(gè)序號,即數(shù)據(jù)有序。TCP的連接是全雙工的(Comer1998)。6.2.2TCP的連接和終止TCP的連接就是我們常說的三次握手,如圖6-1所示:圖6-1三次握手TCP的結(jié)束就是四次揮手,如圖6-2所示:圖6-2四次揮手圖中建立連接的步鄹:1、請求端的TCP向服務(wù)器的TCP發(fā)送一個(gè)請求報(bào)文段,SYN為1,起始號X;2、服務(wù)器如同意連接就回發(fā)確認(rèn),并為該TCP分配TCP緩存和變量,SYN和ACK都為1,確認(rèn)號X+1。隨機(jī)起始號Y;3、請求端向服務(wù)端發(fā)確認(rèn),并分配緩存和變量。ACK為1,序號X+1,確認(rèn)號Y+1。這樣就建立了連接。關(guān)閉連接的步鄹:1、被動方收到主動方的FIN;2、被動方返回一個(gè)確認(rèn)號是剛收到的序號+1;3、被動方發(fā)送FIN;4、主動方返回一個(gè)確認(rèn)號是剛收到的序號+1。6.2.3socket編程連接和關(guān)閉過程如上所述,下面給出一個(gè)基于TCP連接的完整的數(shù)據(jù)傳輸過程(黃維通2010),如圖6-3所示。圖6-3基于TCP數(shù)據(jù)發(fā)送過程socket其實(shí)是一個(gè)網(wǎng)絡(luò)接口,是一種特殊的I/O,還是一種文件描述符。Socket有網(wǎng)域、類型和規(guī)程三要素,網(wǎng)域就是用來指明接口是哪一種的網(wǎng)絡(luò),類型就是指選擇面向連接還是無連接的方式,本文用的TCP/IP是有鏈接,當(dāng)然,無論是何種類型,都是服務(wù)器先啟動。TCP/IP有3種類型的套接字:(1)、流式套接字(SOCK_STREAM),提供可靠的面向連接的通信流,這種套接字使用TCP協(xié)議,數(shù)據(jù)無差錯(cuò)、無重復(fù)。(2)、數(shù)據(jù)報(bào)套接字(SOCK_DGRAM),無連接、無序、不可靠且使用UDP協(xié)議。(3)、原始套接字(SOCK_RAM),對較低層如IP、ICMP的直接訪問。多用于開發(fā)協(xié)議。Intsocket(intfamily_domain,inttype,intprotcol),應(yīng)用程序使用套接字前調(diào)用此函數(shù)建立套接字,其中family_domain是這協(xié)議棧(IPV4\IPV6等),type是說套接字的類型,protocol是使用該的協(xié)議。默認(rèn)設(shè)置為0,函數(shù)返回一個(gè)套接字描述符。Intbind(intsocket,conststructsockaddr*addr,intnamelen),socket就是socket函數(shù)返回的套接字描述符,addr就是本地地址,namelen就是地址的長度了。此函數(shù)把套接字描述符和本地地址綁定。Intconnect(intfd,conststructsockaddr*S_addr,intaddrlen)和intaccept(ints),前者是建立連接,fd是指本地套接字描述符,S_addr是對方的地址指針,addlen是對方地址長度。后者是服務(wù)器端等待客戶端進(jìn)程的實(shí)際連接。Accept()調(diào)用前必須先調(diào)用listen()。Listen(),只是被服務(wù)端調(diào)用,創(chuàng)建隊(duì)列保存未處理的請求,一般隊(duì)列長度最大值為5。Read(intfd,constchar*buf,intlen,intflags)和write(intfd,char*buf,intlen,intflags),前者把參數(shù)fd所指的文件傳送Len個(gè)字節(jié)到buf所指向的內(nèi)存,flags制定傳輸控制方式。后者把buf所在內(nèi)存的Len個(gè)字節(jié)寫到fd所指的文件中。Close(sockfd),關(guān)閉套接字并釋放分配的資源,成功返回0。首先服務(wù)器啟動,通過socket建立一個(gè)套接字,然后bind()使得網(wǎng)絡(luò)地址和套接字邦定,再listen()偵聽,并且規(guī)定請求隊(duì)列的個(gè)數(shù),客戶端建立好套接字后connect()服務(wù)器,而服務(wù)器就accept(),連接建立好以后,就可以read()和write(),結(jié)束的時(shí)候就調(diào)用close()。6.2.4服務(wù)端的網(wǎng)絡(luò)編程部分代碼如下。#include<stdio>…..#include<netdb.h>#include<sys/socket.h>Intmain(intargc,char*argc[]){Intsockfd,connect_sock;Structsocket_inserver_addr;……..If((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){…EXIT(1)}While(1){/*服
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年客服工作計(jì)劃樣本(三篇)
- 2024年小學(xué)圖書室管理制度范例(二篇)
- 2024年學(xué)校宿管部工作計(jì)劃樣本(四篇)
- 2024年小學(xué)防溺水工作計(jì)劃樣本(三篇)
- 2024年平面設(shè)計(jì)師個(gè)人工作計(jì)劃例文(三篇)
- 2024年宣傳部規(guī)章制度樣本(四篇)
- 2024年大隊(duì)輔導(dǎo)員工作職責(zé)樣本(二篇)
- 2024年工會規(guī)范化建設(shè)細(xì)則范本(三篇)
- 2024年幼兒園家長學(xué)校工作計(jì)劃范文(二篇)
- 【《奧克斯電器無形資產(chǎn)會計(jì)核算現(xiàn)狀分析》8600字】
- GB/T 15822.1-2024無損檢測磁粉檢測第1部分:總則
- 正比例函數(shù)的圖像與性質(zhì)教學(xué)反思
- 學(xué)校家委會換屆方案
- 第二節(jié)裝配式鋼筋混凝土T形梁橋PPT課件
- Yonyou U9 條碼操作手冊
- 公司領(lǐng)導(dǎo)干部調(diào)查研究制度
- 海水淡化反滲透裝置檢修維護(hù)說明書
- 連續(xù)梁合攏方案
- 異辛酸鈉合成工藝及建設(shè)項(xiàng)目
- DB42∕T 1124-2015 城市園林綠化養(yǎng)護(hù)管理質(zhì)量標(biāo)準(zhǔn)
- 西電計(jì)組課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論