2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩67頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  南 京 工 程 學(xué) 院</p><p>  畢業(yè)設(shè)計(jì)說明書(論文)</p><p>  作 者: 劉武春 學(xué) 號(hào): 202090631 </p><p>  院 系: 計(jì)算機(jī)工程學(xué)院 </p><p>  專 業(yè): 電子信息

2、科學(xué)與技術(shù) </p><p>  題 目: 基于ARM的視頻監(jiān)控系統(tǒng) </p><p>  指導(dǎo)者: 陳敏聰 講師 </p><p>  評(píng)閱者: 韓磊  講師 </p><p>  2013年5月 南 京</p&g

3、t;<p>  畢業(yè)設(shè)計(jì)說明書(論文)中文摘要</p><p>  畢業(yè)設(shè)計(jì)說明書(論文)外文摘要</p><p><b>  目  錄</b></p><p><b>  前 言1</b></p><p>  第一章 嵌入式系統(tǒng)硬件說明4</p><p&g

4、t;  1.1 視頻監(jiān)控系統(tǒng)結(jié)構(gòu)說明4</p><p>  1.2 ARM簡介7</p><p>  1.3 S3C2440簡介8</p><p>  第二章 嵌入式系統(tǒng)軟件平臺(tái)10</p><p>  2.1 Linux操作系統(tǒng)簡介10</p><p>  2.2開發(fā)環(huán)境的搭建13</p>

5、<p>  2.3 SDL庫的移植15</p><p>  第三章 USB設(shè)備驅(qū)動(dòng)程序介紹錯(cuò)誤!未定義書簽。</p><p>  3.1 USB驅(qū)動(dòng)開發(fā)18</p><p>  3.2 攝像頭驅(qū)動(dòng)開發(fā)21</p><p>  第四章 圖像采集的實(shí)現(xiàn)23</p><p>  4.1 V4L編程2

6、3</p><p>  4.2 圖像保存為視頻31</p><p>  第五章 視頻傳輸?shù)膶?shí)現(xiàn)36</p><p>  5.1 TCP/IP介紹36</p><p>  5.2 網(wǎng)絡(luò)編程39</p><p>  第六章 程序運(yùn)行錯(cuò)誤!未定義書簽。</p><p>  6.1 執(zhí)行

7、程序46</p><p><b>  第七章 總結(jié)48</b></p><p>  7.1 論文總結(jié)48</p><p>  7.2 感想和收獲49</p><p><b>  致謝50</b></p><p><b>  參考文獻(xiàn)51</b>

8、;</p><p>  附錄:英文技術(shù)資料翻譯52</p><p><b>  前 言</b></p><p>  視頻監(jiān)控系統(tǒng)的發(fā)展和現(xiàn)狀</p><p>  當(dāng)今社會(huì)是信息與科技高速發(fā)展的時(shí)代,獲得信息的方便可以使我們更好的創(chuàng)造出大的利益,而人們獲取信息的最直接的就是通過眼睛。在人們感官接受的各種各樣的信息中約有

9、79%是來自視覺。圖像是對(duì)客觀事物形象和生動(dòng)的描述,是最直觀表達(dá)方式,是人們最重要的信息載體。隨著科學(xué)與技術(shù)的迅速發(fā)展和人民生活水平的提高,視頻監(jiān)控系統(tǒng)以其直觀、方便和信息內(nèi)容豐富等特點(diǎn),越來越受到人們的青睞,并已廣泛應(yīng)用于各行各業(yè)。</p><p>  視頻監(jiān)控系統(tǒng)發(fā)展至今只有短短二十多年時(shí)間,從最早模擬監(jiān)控到前幾年的數(shù)字監(jiān)控再到現(xiàn)在的無人遠(yuǎn)程視頻監(jiān)控,發(fā)生了翻天覆地變化。隨著IP技術(shù)逐步統(tǒng)一的今天,我們開始重

10、新認(rèn)識(shí)視頻監(jiān)控系統(tǒng)的發(fā)展過程。從技術(shù)角度來看,視頻監(jiān)控系統(tǒng)分為模擬性的視頻監(jiān)控系統(tǒng)(CCTV),數(shù)字性視頻監(jiān)控系統(tǒng)(DVR),完全基于IP技術(shù)的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)(IPVS)。</p><p>  基于ARM的視頻監(jiān)控系統(tǒng)有如下的特點(diǎn):</p><p>  (1)可控區(qū)域范圍廣。監(jiān)控設(shè)備可以直接接入到網(wǎng)絡(luò),不受線纜長度的限制,同時(shí)網(wǎng)絡(luò)是全球性的,布滿所有角落,打破了傳統(tǒng)地域的限制,擴(kuò)展了可控

11、區(qū)域。</p><p> ?。?)系統(tǒng)具有很強(qiáng)的擴(kuò)展的能力。用IP地址來標(biāo)識(shí)設(shè)備,增加設(shè)備只是把IP地址進(jìn)行擴(kuò)充。</p><p> ?。?)可以組成布滿全球的監(jiān)控網(wǎng)絡(luò)。采用基于ARM的視頻監(jiān)控系統(tǒng),與傳統(tǒng)的監(jiān)控方式有很大的不同,由于基于ARM的視頻監(jiān)控設(shè)備的輸出完成了模擬到數(shù)字的轉(zhuǎn)換,而且壓縮了轉(zhuǎn)換結(jié)果。通過全球統(tǒng)一的網(wǎng)絡(luò)協(xié)議在互聯(lián)網(wǎng)上進(jìn)行有效傳輸。</p><p&g

12、t; ?。?)該系統(tǒng)性能穩(wěn)定性高,不需要專業(yè)人士管理?;贏RM的視頻監(jiān)控設(shè)備實(shí)際上是以計(jì)算機(jī)技術(shù)為核心,采用linux多任務(wù)的操作系統(tǒng),由于視頻采集功能和數(shù)據(jù)處理功能都集成到一個(gè)體積很小的設(shè)備內(nèi),直接連入局域網(wǎng)或者廣域網(wǎng),即插即看,系統(tǒng)的穩(wěn)定性和實(shí)時(shí)性,以及可靠性都得到大大的提高,也不需要專人管理,非常適合于不需要專人看守的環(huán)境。</p><p>  所以,加強(qiáng)對(duì)基于ARM的視頻監(jiān)控系統(tǒng)的研究對(duì)我國視頻監(jiān)控行業(yè)

13、的發(fā)展有著非凡的意義。</p><p><b>  選題背景與意義</b></p><p>  隨著技術(shù)的不斷創(chuàng)新和人們需求的不斷發(fā)展,人們對(duì)視頻監(jiān)控系統(tǒng)的性能提出了更高的需求??偟膩碚f,主要體現(xiàn)在以下幾個(gè)方面:視頻監(jiān)控的全方位、視頻監(jiān)控的智能化、音頻和視頻壓縮的高效率和高質(zhì)量、本地存儲(chǔ)和網(wǎng)絡(luò)傳輸。視頻監(jiān)控系統(tǒng)在時(shí)空布局上可以做到全時(shí)段、全方位、全天候;在防范控制上能

14、夠做到直觀動(dòng)態(tài)、實(shí)時(shí)精準(zhǔn);在信息管理上能夠做到連網(wǎng)傳輸、信息共享和大量存儲(chǔ);在實(shí)戰(zhàn)應(yīng)用上能夠做到智能分析自動(dòng)對(duì)比、自動(dòng)報(bào)弊。這些優(yōu)勢(shì)是傳統(tǒng)的手段所不具備的,建立以視頻監(jiān)控系統(tǒng)為核心的技術(shù)防控體系,完善其運(yùn)行和管理機(jī)制,將技防人防和物防等手段有機(jī)結(jié)合起來,將在最大程度上彌補(bǔ)人防、物防體系的不足。為了滿足這些要求,本系統(tǒng)設(shè)計(jì)的視頻監(jiān)控功能主要包括視頻傳輸功能、圖像采集功能這兩部分,主要是通過視頻采集的應(yīng)用程序來實(shí)現(xiàn)的。</p>

15、<p>  本文的研究內(nèi)容和章節(jié)結(jié)構(gòu)</p><p>  針對(duì)視頻監(jiān)控系統(tǒng)中的關(guān)鍵性的技術(shù)進(jìn)行分析,本文將重點(diǎn)研究以下的內(nèi)容:</p><p>  嵌入式開發(fā)環(huán)境的搭建</p><p>  在Linux操作系統(tǒng)下安裝arm-linux-gcc的交叉編譯器,可以編譯出可在ARM開發(fā)板上運(yùn)行的可執(zhí)行文件,這樣就可以在ARM微處理器上運(yùn)行嵌入式操作系統(tǒng)上的程序

16、,方便系統(tǒng)功能的進(jìn)一步擴(kuò)展和升級(jí)。Linux操作系統(tǒng)是開源性的操作系統(tǒng),自身擁有的TCP/IP協(xié)議有強(qiáng)大的網(wǎng)絡(luò)功能,可以方便用戶進(jìn)行網(wǎng)絡(luò)編程。</p><p><b>  SDL庫的移植</b></p><p>  SDL是一套自由的跨平臺(tái)的多媒體開發(fā)包,使用C語言寫成。適用于游戲、游戲SDK、演示軟件、模擬器、 MPEG播放器和其他應(yīng)用軟件。是為數(shù)不多的商業(yè)游戲開發(fā)

17、公司使用的免費(fèi)軟件庫之一。它提供跨平臺(tái)的二維幀緩沖區(qū)圖形和音頻服務(wù),它支持 Linux、Win32 和 BeOS。也不同程度地支持其它平臺(tái)。</p><p>  SDL提供了數(shù)種控制圖像、聲音、輸出入的函數(shù),讓開發(fā)者只要用相同或是相似的代碼就可以開發(fā)出跨多個(gè)平臺(tái)的應(yīng)用軟件。</p><p><b>  圖像的采集讀取</b></p><p> 

18、 通過攝像頭獲取圖片數(shù)據(jù)后,放入到緩沖區(qū),可以通過直接讀?。╮ead)和內(nèi)存映射(mmap)兩種不同的方法來讀取到圖片幀的數(shù)據(jù)。這里的圖像采集可以依靠函數(shù)ioctl()來實(shí)現(xiàn),主要的兩個(gè)控制命令是VIDIOCAMCAPTURE(獲取視頻圖像),VIDIOSYNC(判斷是圖像是否截取成功)等。</p><p><b>  視頻數(shù)據(jù)的網(wǎng)絡(luò)傳輸</b></p><p>  

19、嵌入式Linux操作系統(tǒng)具有非常完整的TCP/IP協(xié)議棧,因此,可以通過Socket編程建立一個(gè)基于TCP/IP的視頻監(jiān)控服務(wù)器,為視頻數(shù)據(jù)的傳輸和網(wǎng)絡(luò)數(shù)據(jù)信息的收發(fā)提供網(wǎng)絡(luò)服務(wù),遠(yuǎn)程的客戶端可以通過接收視頻數(shù)據(jù)來實(shí)施對(duì)現(xiàn)場的視頻監(jiān)控。</p><p>  第一章 嵌入式系統(tǒng)硬件說明</p><p>  1.1 視頻監(jiān)控系統(tǒng)結(jié)構(gòu)說明</p><p>  系統(tǒng)硬件結(jié)

20、構(gòu)框圖如圖1-1。</p><p>  圖1-1 基于ARM的視頻監(jiān)控系統(tǒng)結(jié)構(gòu)框圖</p><p>  系統(tǒng)主芯片采用ARM9處理器S3C2440,它是16/32位RISC嵌入式微處理器,主要面向高性能、低功耗、高集成度的手持設(shè)備的應(yīng)用。它內(nèi)部硬件資源豐富,比如LCD控制器、Cache高速緩存、時(shí)鐘和電源管理、5個(gè)定時(shí)器、4通道的DMA、9個(gè)UART、8通道10位AD轉(zhuǎn)換電路、USB主/從

21、接口及12S音頻接口等。</p><p>  Flash采用的是NOR Flash,它有專門的控制接口與CPU 相連,數(shù)據(jù)總線為8-bit ,但這并不意味著讀寫數(shù)據(jù)會(huì)很慢。本系統(tǒng)中啟動(dòng)代碼、內(nèi)核代碼及根文件系統(tǒng)都存放于NAND Flash。在Flash管理方面。根文件系統(tǒng)采用最新的YAFFS文件系統(tǒng).是一種可讀寫的文件系統(tǒng)。因此,用戶可以通過根文件系統(tǒng)來共享。RAM是2片外接32M共64M的SDARM。一般稱之為

22、內(nèi)存,它們并接在一起形成 32-bit 的總線數(shù)據(jù)寬度,這樣可以增加訪問的速度。這樣可以快速的運(yùn)行Linux系統(tǒng)以及其網(wǎng)絡(luò)應(yīng)用。</p><p>  網(wǎng)絡(luò)控制芯片則是用的Cirrus公司研發(fā)的控制器,通信速率可以達(dá)到10M/s.通過它就可以實(shí)現(xiàn)以太網(wǎng)的數(shù)據(jù)鏈路層和物理層。由于該控制器的接口是ISA,那么與微處理器相連是輕而易舉的。</p><p>  該課題的攝像頭則是采用ZC301型號(hào)的

23、攝像頭,ZC301是中星微電子設(shè)計(jì)的第一塊PC攝像頭微處理器,ZC301擁有無與倫比的功能。該攝像頭利用USB1.1的端口來與PC主機(jī)進(jìn)行溝通,同時(shí)攝像頭內(nèi)建的圖象處理功能非常強(qiáng)大,包括圖像的信號(hào)處理功能(ISP),圖像數(shù)據(jù)的壓縮以及圖像數(shù)據(jù)的傳輸?shù)鹊裙δ?。ZC301是通過小巧的28-PIN LQFP來封裝的,甚至不需要外接DRAM來支持。擁有強(qiáng)大的內(nèi)置圖象處理功能和JPEG譯碼功能是這款攝像頭最出色的地方,只有這樣才可以為用戶拍攝出清

24、晰的圖像。</p><p>  下面為幾個(gè)主要部分的電路:</p><p> ?。?)USB部分的電路圖如圖1-2。</p><p>  圖1-2 USB部分的電路圖</p><p>  (2)網(wǎng)絡(luò)部分的電路圖如圖1-3。</p><p>  圖1-3 網(wǎng)絡(luò)部分的電路圖</p><p> ?。?

25、)電源部分的電路圖如圖1-4。</p><p>  圖1-4 電源部分的電路圖</p><p>  (4)復(fù)位電路的電路圖如圖1-5。</p><p><b>  圖</b></p><p>  圖1-5 復(fù)位電路的電路圖</p><p><b>  1.2 ARM簡介</b>

26、;</p><p>  ARM(Advanced RISC Machines),既是一個(gè)公司的名字,也是對(duì)一類微處理器的通稱,還可以是一種嵌入式技術(shù)的名字。</p><p>  1991年ARM公司成立于英國劍橋,主要是出售芯片設(shè)計(jì)技術(shù)授權(quán)。目前,采用ARM核的微處理器,即通常所說的ARM處理器,現(xiàn)在已遍及工業(yè)控制、消費(fèi)類的電子產(chǎn)品、通信系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)、無線系統(tǒng)等各類產(chǎn)品市場,基于ARM技

27、術(shù)的微處理器應(yīng)用約占據(jù)了32位RISC微處理器75%以上的市場份額,ARM技術(shù)正在逐步進(jìn)入到日常生活的方方面面。 </p><p>  ARM公司是專門從事基于RISC技術(shù)芯片設(shè)計(jì)開發(fā)的公司,作為知識(shí)產(chǎn)品供應(yīng)商,ARM公司本身不從事芯片生產(chǎn),而是轉(zhuǎn)讓他的設(shè)計(jì)許可權(quán)由合作公司生產(chǎn)各具特色的芯片,世界各大半導(dǎo)體生產(chǎn)商從ARM公司購買其設(shè)計(jì)的ARM微處理器核,然后根據(jù)各自不同的應(yīng)用領(lǐng)域,加入適當(dāng)?shù)耐鈬娐罚瑥亩纬勺约?/p>

28、的ARM微處理器芯片。目前,全世界有幾十家大的半導(dǎo)體公司都使用ARM公司的授權(quán),因此既使得ARM技術(shù)獲得更多的第三方工具、制造、軟件的支持,又使整個(gè)系統(tǒng)成本降低,使產(chǎn)品更容易進(jìn)入市場被消費(fèi)者所接受,更具競爭力。</p><p>  ARM公司設(shè)計(jì)了許多處理器,可以根據(jù)他們使用內(nèi)核的不同劃分為不同的系列。系列劃分是根據(jù)ARM7、ARM9、ARM10、ARM11內(nèi)核的來定的。后綴數(shù)字7、9、10、11表示不同的內(nèi)核版

29、本的設(shè)計(jì)。數(shù)字升序說明性能、復(fù)雜度的提高。ARM8開發(fā)出來以后很快就被取代了??梢娖涓滤俣榷嗫?。 </p><p>  在每個(gè)系列中,存儲(chǔ)器管理、Cache以及TCM處理器擴(kuò)展有各種不同的變化。ARM繼續(xù)在可用的產(chǎn)品系列做進(jìn)一步研發(fā)。 </p><p>  本課題使用的是ARM9處理器,ARM9系列微處理器具有以下特點(diǎn): </p><p>  1) 5級(jí)流水線;

30、</p><p>  2) 體系結(jié)構(gòu)為哈佛體系結(jié)構(gòu);</p><p>  3) 支持32位ARM指令集和16位Thumb指令集;</p><p>  4) 支持32位的AMBA總線接口;</p><p>  5) 全性能的MMU,支持Windows CE、Linux、Palm 、OS等多種主流嵌入式操作系統(tǒng);</p>&

31、lt;p>  6) MPU支持實(shí)時(shí)操作系統(tǒng);</p><p>  7) 支持?jǐn)?shù)據(jù)Cache和指令Cache,具有更高的指令和數(shù)據(jù)處理能力。</p><p>  ARM9系列的微處理器大部分是被用在無線方面的設(shè)備、家居安防系統(tǒng)、儀器和儀表、高性能的打印機(jī)、智能電話、數(shù)字照相機(jī)和數(shù)字?jǐn)z像機(jī)等領(lǐng)域。ARM9系列主要有ARM920T、ARM922T和ARM940T三種類型的微處理器,以適

32、用于不同的場合。</p><p>  1.3 S3C2440簡介</p><p>  S3C2440是SAMSUNG生產(chǎn)的,是精簡指令集,該處理器是目前市場上銷量最高的處理器之一。該處理器是一款用途非常廣泛的芯片,其內(nèi)部集成了微處理器和一些常用的外圍設(shè)備,具有較高的性價(jià)比。 </p><p>  S3C2440的頻率是400MHz,其ARM920T核組成部分是ARM

33、9TDMI、存儲(chǔ)管理單元(MMU)以及高速緩存。其中,MMU是內(nèi)存管理單元,獨(dú)立的16KB地址和16KB數(shù)據(jù)組成告訴緩存。ARM920T內(nèi)部有兩個(gè)協(xié)處理器:CP14和CP15。CP14的功能是用來調(diào)試和控制的,CP15的有2個(gè)功能,其一是用于存儲(chǔ)系統(tǒng)的控制,其二是用來測(cè)試控制的。 </p><p>  S3C2440的片內(nèi)資源非常豐富,主要包括:</p><p>  1) 內(nèi)核的供電系數(shù)

34、是1.2V,存儲(chǔ)器的供電的電壓是1.8V/2.5V/3.3V,外部I/O的供電電壓為3.3V,擁有I-Cache和D-Cache/MMU微處理器; </p><p>  2) LCD控制器;</p><p>  3) 外部存儲(chǔ)控制器; </p><p>  4) 四通道的DMA,并擁有外部的請(qǐng)求引腳;</p><p>  5) 三通道

35、的串口; </p><p>  6) 一通道IIS-BUS;</p><p>  7) 二通道SPI;</p><p>  8) 兼容SD主接口的協(xié)議以及MMC卡的協(xié)議;</p><p>  9) 四通道的定時(shí)器和一通道的內(nèi)部定時(shí)器;</p><p>  10) 二個(gè)端口的USB主機(jī)/一個(gè)端口USB的設(shè)備;&l

36、t;/p><p>  11) 八通道10比特ADC以及觸摸屏的接口;</p><p>  12) 130個(gè)通用I/O口和24個(gè)外部中斷源; </p><p>  13) 相機(jī)的接口;</p><p>  14) 具有PLL片上時(shí)鐘發(fā)生器。</p><p>  S3C2440的體系結(jié)構(gòu)如下:</p><p

37、>  S3C2440處理器為移動(dòng)終端設(shè)備以及嵌入式工業(yè)控制提供一些集成系統(tǒng)的解決方案,包括: </p><p>  1)精簡指令集的體系結(jié)構(gòu);</p><p>  2)MMU用于支持各種不同的系統(tǒng);</p><p>  3)指令高速存儲(chǔ)緩存器(I-Cache)和數(shù)據(jù)高速存儲(chǔ)緩沖器(D-Cache); </p><p>  4)采用ARM

38、920T 的CPU內(nèi)核;</p><p>  5)內(nèi)部高級(jí)微控制總線(AMBA)的體系結(jié)構(gòu)(AMBA2.0,AHB/APB);</p><p>  6)支持高速總線模式與異步總線模式。</p><p>  第二章 嵌入式系統(tǒng)軟件平臺(tái)</p><p>  2.1 Linux操作系統(tǒng)簡介</p><p>  Linux是

39、一種遵循POSIX標(biāo)準(zhǔn)(POSIX是一套由IEEE即電氣和電子工程學(xué)會(huì)所制定的操作系統(tǒng)界面標(biāo)準(zhǔn))的開放源代碼的操作系統(tǒng),與UNIX的風(fēng)格非常相像,同時(shí)具有SystemV和BSD的擴(kuò)展特性,但是Linux系統(tǒng)的核心代碼已經(jīng)全部重新編寫。它的版權(quán)所有者是芬蘭人Linus Torvalds和一些自由軟件開發(fā)者,遵循GPL規(guī)范(GNU General Public License)。Linux的出現(xiàn),打破了長久以來傳統(tǒng)商業(yè)操作系統(tǒng)的技術(shù)壟斷,為

40、計(jì)算機(jī)技術(shù)的發(fā)展做出了巨大貢獻(xiàn)。</p><p>  2.1.1 Linux 系統(tǒng)的起源</p><p>  說到Linux的歷史,不得不先說一下Minix,它是一個(gè)由荷蘭教授Andy Tanenbaum編寫的免費(fèi)且開放源代碼的微型UNIX操作系統(tǒng),是Linux出現(xiàn)前最受歡迎的免費(fèi)操作系統(tǒng)。而Linux開發(fā)者——當(dāng)時(shí)芬蘭赫爾辛基大學(xué)的學(xué)生Linus Torvalds正是受了Minux系統(tǒng)的

41、啟發(fā),希望能夠編寫出一個(gè)比Minix更好的操作系統(tǒng)。因此,他在Minix的基礎(chǔ)上開發(fā)出了0.0.1版本的Linux系統(tǒng)。經(jīng)過改良后于1991年10月5日完成了0.0.2版本的Linux。[1]</p><p>  Linux的出現(xiàn),引起了來自世界各地用戶的關(guān)注,越來越多的開發(fā)人員通過Internet加入了Linux的內(nèi)核開發(fā)行列,而Linux也隨著在Internet上的傳播而得到了快速的發(fā)展。1994年3月,在L

42、inux社區(qū)的自由開發(fā)人員協(xié)同努力下,Linus完成并發(fā)布了具有里程碑意義的Linux 1.0.0版本。該版本的Linux已經(jīng)是一個(gè)功能完備的操作系統(tǒng),穩(wěn)定高效而且只需要占用很少的硬件資源,即使在只有很低配置的80386機(jī)器上都能很好地運(yùn)行。</p><p>  2.1.2 Linux 內(nèi)核版本</p><p>  在Linux中,它的核心部分被稱為“內(nèi)核”,負(fù)責(zé)控制硬件設(shè)備、文件系統(tǒng)、進(jìn)

43、程調(diào)度及其他工作。Linux內(nèi)核一直都是由Linus領(lǐng)導(dǎo)下的開發(fā)小組負(fù)責(zé)開發(fā)和規(guī)范的,其第一個(gè)公開版本就是1991年10月5日由Linus發(fā)布的0.0.2版本。兩個(gè)月后,也就是在1991年12月,Linus發(fā)布了第一個(gè)可以不用依賴Minix就能使用的獨(dú)立內(nèi)核——0.11版本。其后內(nèi)核繼續(xù)不斷地發(fā)展和完善,陸續(xù)發(fā)行了0.12和0.95版本,并在1994年3月完成了具有里程碑意義的1.0.0版本內(nèi)核。從此,Linux內(nèi)核的發(fā)展進(jìn)入了新的篇章

44、。[1]</p><p>  從1.0.0版本開始,Linux內(nèi)核開始使用兩種方式來標(biāo)準(zhǔn)其版本號(hào),即測(cè)試版本和穩(wěn)定版本。其版本格式由主版本號(hào).次版本號(hào).修正版本號(hào)3部分組成。其中,主版本號(hào)表示有重大的改動(dòng),次版本號(hào)表示有功能性的改動(dòng),修正版本號(hào)表示有BUG的改動(dòng),從次版本號(hào)可以區(qū)分內(nèi)核是測(cè)試版本還是穩(wěn)定版本。</p><p>  如果次版本號(hào)是偶數(shù),則表示是穩(wěn)定版本,用戶可以放心使用;如果

45、次版本號(hào)是奇數(shù),則表示是測(cè)試版本,這些版本的內(nèi)核通常被加入了一些新的功能,而這些功能可能是不穩(wěn)定的。例如,2.6.24是一個(gè)穩(wěn)定版本,2.5.64則是一個(gè)測(cè)試版本。</p><p>  2.1.3 Linux的優(yōu)勢(shì)</p><p><b>  1)免費(fèi)傳播</b></p><p>  Linux操作系統(tǒng)的產(chǎn)生初衷就是要開發(fā)一款免費(fèi)的操作系統(tǒng)來自

46、由的傳播,因而其自出現(xiàn)以來一直鼓勵(lì)免費(fèi)使用,任何人都可以免費(fèi)從網(wǎng)上下載并修改源代碼。不同的版本的Linux互相兼容,而且相關(guān)的軟件也可以免費(fèi)獲得。</p><p><b>  2)高度的穩(wěn)定性</b></p><p>  Linux系統(tǒng)具有極高的穩(wěn)定性,因而采用Linux的電腦越來越多,根據(jù)2008年的TOP500超級(jí)電腦列表,現(xiàn)時(shí)世界上最快速的超級(jí)電腦使用Linux

47、作為其操作系統(tǒng)。而在列表的500套系統(tǒng)里面,采用Linux為操作系統(tǒng)的,占了439組(即87.8%)。許多獨(dú)立的機(jī)構(gòu)根據(jù)針對(duì)Linux的windows做了大量的測(cè)評(píng),基本上所有的測(cè)試都顯示Linux的性能要優(yōu)于windows。</p><p>  Linux繼承了UNIX的優(yōu)良特性,可以連續(xù)運(yùn)行數(shù)年而無需重啟,而且Linux基本不會(huì)被病毒感染。系統(tǒng)的穩(wěn)定性主要取決于系統(tǒng)設(shè)計(jì)的結(jié)構(gòu),Linux這種超強(qiáng)的免疫力歸功于

48、Linux具有科學(xué)穩(wěn)定的架構(gòu)。Linux基本上不會(huì)崩潰,系統(tǒng)內(nèi)沒有像windows那樣眾多的漏洞。著也歸功于Linux的開源特性,一旦發(fā)現(xiàn)漏洞就會(huì)有人及時(shí)給與修復(fù)。此外,Linux采取了許多安全技術(shù)措施,設(shè)置了不同的權(quán)限,為網(wǎng)絡(luò)用戶提供必要的安全保障。</p><p>  3)Linux具有很高的性能</p><p>  Linux能夠在實(shí)現(xiàn)系統(tǒng)資源的低占有率和高性能運(yùn)算。Linux系統(tǒng)由

49、內(nèi)核和上層應(yīng)用程序共同組成的,當(dāng)Linux啟動(dòng)時(shí),內(nèi)核會(huì)調(diào)入內(nèi)存的,然后會(huì)一直存放在里面直到斷電重啟。內(nèi)核是用來為操作系統(tǒng)的運(yùn)行來合理分配資源的。通常情況下,內(nèi)核會(huì)被盡量設(shè)計(jì)的很小,在安裝時(shí),用戶可以根據(jù)需要僅安裝需要的一些應(yīng)用程序,甚至我們可以僅僅安裝內(nèi)核。</p><p>  4)Linux具有現(xiàn)代操作系統(tǒng)的多種特征</p><p>  現(xiàn)在操作系統(tǒng)最重要的特點(diǎn)就是程序的并發(fā)執(zhí)行和資源

50、共享。Linux作為一個(gè)多用戶、多任務(wù)的操作系統(tǒng),以進(jìn)程為資源分配的基本單元進(jìn)行資源的配置。程序的并發(fā)執(zhí)行是以資源共享為前提的,Linux提供多種方式來進(jìn)行進(jìn)程間通訊。</p><p>  2.1.4 Linux的發(fā)展前景</p><p>  現(xiàn)在的工業(yè)已經(jīng)在現(xiàn)實(shí)上形成了以微軟和Intel組成的工業(yè)聯(lián)盟的壟斷,即WinTel。Windows操作系統(tǒng)在全球已經(jīng)得到了普遍的使用,其壟斷地位無人

51、能夠撼動(dòng),但是這種局面嚴(yán)重影響了行業(yè)的發(fā)展,因此無數(shù)的軟件開發(fā)者力圖打破這種行業(yè)壟斷。毫無疑問,Linux是這些人夢(mèng)寐以求的。</p><p>  因?yàn)長inux是免費(fèi)的、開源的,因此利用Linux研發(fā)的所有產(chǎn)品具有明顯的價(jià)格優(yōu)勢(shì),而在目前發(fā)展火熱的嵌入式領(lǐng)域里,linux的這種優(yōu)勢(shì)是無人能及的。由于嵌入式里對(duì)成本的限制,那么操作系統(tǒng)等一系列軟件面臨著更苛刻的要求,Linux的穩(wěn)定性是嵌入式領(lǐng)域開發(fā)最為重要的一項(xiàng)

52、指標(biāo)。</p><p>  由于微軟的產(chǎn)品存在很大的安全隱患,其影響著人們和國家的信息安全。為此,對(duì)Linux的研發(fā)也是對(duì)國家信息安全與利益的保護(hù)。隨著信息化的不斷發(fā)展,網(wǎng)絡(luò)成為人們生活最重要的一部分,而越來越囂張的病毒、木馬等問題嚴(yán)重影響了人們的日常生活,Linux強(qiáng)大的穩(wěn)定性可以使我們免受這些問題的干擾。總的來說,Linux會(huì)越來越受到開發(fā)者的熱愛。</p><p>  2.2 開發(fā)環(huán)

53、境的搭建</p><p>  開發(fā)環(huán)境的搭建不僅要實(shí)現(xiàn)宿主機(jī)上的編譯,還要能在宿主上實(shí)現(xiàn)交叉編譯,能都生成一個(gè)可執(zhí)行的二進(jìn)制文件用于開發(fā)板上運(yùn)行,所以開發(fā)環(huán)境能否合理搭建,直接影響到最后代碼的編譯結(jié)果。</p><p>  2.2.1 交叉編譯器的安裝</p><p>  通常嵌入式系統(tǒng)的軟件編譯和執(zhí)行是在不同的兩個(gè)平臺(tái)上進(jìn)行的。編譯時(shí)在宿主機(jī),執(zhí)行是在目標(biāo)機(jī),即嵌

54、入式平臺(tái)上。一般是在宿主機(jī)上通過跨平臺(tái)交叉編譯器把源文件編譯成在開發(fā)平臺(tái)上可以運(yùn)行的目標(biāo)文件,在通過串口,或者網(wǎng)絡(luò)下載到目標(biāo)平臺(tái)上的存儲(chǔ)介質(zhì)里,然后通過目標(biāo)平臺(tái)來執(zhí)行軟件。下面來介紹宿主機(jī)上的交叉編譯器的安裝。</p><p>  1) 下載arm-linux-gcc-4.3.2.tar到臨時(shí)的目錄下; </p><p>  2)打開終端運(yùn)行#tar -zxvf arm-linux-gc

55、c-4.3.2.tar。解壓后文件會(huì)生成一個(gè)/usr/local文件夾,進(jìn)入此文件夾將名字為arm的文件夾拷貝到/usr/local/arm下。那么交叉編譯的程序都集中在/usr/local/arm/4.3.2/bin。</p><p>  3)修改PATH,運(yùn)行命令#vim /etc/bash.bashrc在最后加上:</p><p>  export PATH=$PATH:/usr/l

56、ocal/arm/4.3.2/bin</p><p>  4)執(zhí)行命令#source /root/.bashrc使環(huán)境變量生效。</p><p>  5)檢查新的PATH:# echo $PATH</p><p>  顯示的內(nèi)容中有/usr/local/arm/bin,說明已將交叉編譯器的路徑加入PATH。至此,交叉編譯所需要的環(huán)境安裝完成了??梢酝ㄟ^命令:arm-

57、linux-gcc –v來查看交叉編譯器能否正常工作。</p><p>  2.2.2 NFS服務(wù)端的建立</p><p>  為了通過網(wǎng)絡(luò)實(shí)現(xiàn)共享目錄,便于開發(fā)板與宿主機(jī)之間的文件傳輸,就要構(gòu)造NFS服務(wù)端,然后通過mount命令進(jìn)行共享目錄的操作,實(shí)現(xiàn)宿主機(jī)與目標(biāo)機(jī)直接的文件的傳輸。便于調(diào)試程序。NFS是網(wǎng)絡(luò)文件系統(tǒng)(Network File System)的簡稱,是組成分布式計(jì)算系統(tǒng)

58、的重要部分,可以實(shí)現(xiàn)在不同的網(wǎng)絡(luò)上共享遠(yuǎn)程文件系統(tǒng)。網(wǎng)絡(luò)文件系統(tǒng)是有Sun公司研發(fā)的,是當(dāng)前文件系統(tǒng)的標(biāo)準(zhǔn)(RFC1Array04,RFC1813)。網(wǎng)絡(luò)文件系統(tǒng)最大的功能就是讓不同的操作系統(tǒng)通過網(wǎng)絡(luò)來共享計(jì)算機(jī)的數(shù)據(jù)。</p><p>  NFS服務(wù)端通過讀取/etc/exports文件中的配置信息來共享具體哪個(gè)目錄。/etc/exports文件中NFS的配置信息的格式如下:</p><p&

59、gt;  【共享目錄】【主機(jī)名或者IP】【參數(shù)1,參數(shù)2…】</p><p>  其中,主機(jī)名或者IP允許訪問共享目錄的客戶機(jī)或者客戶機(jī)IP。如果允許任意名稱或IP的客戶機(jī)共享目錄,則該選項(xiàng)可以用符號(hào)*來。常見的參數(shù)如下所示:</p><p><b>  rw : 可讀寫。</b></p><p><b>  ro : 只讀。<

60、/b></p><p>  no_root_squash : 客戶端使用NFS共享目錄的權(quán)限。</p><p>  sync : 數(shù)據(jù)同步寫入ARM和硬盤。</p><p>  async : 數(shù)據(jù)暫時(shí)寫入ARM,不寫入硬盤。</p><p>  在本課題中,/etc/export文件內(nèi)容如下所示:</p><p&g

61、t;  /home/nfsroot/rootfs 192.168.1.140 .*(rw,sync,no_root_squash)</p><p>  因?yàn)镹FS支持很多功能,每個(gè)功能都會(huì)使用一些端口來傳輸數(shù)據(jù),因此NFS沒有把功能和對(duì)應(yīng)的端口固定起來,而是隨機(jī)使用空閑的端口。但是,客戶端需要知道服務(wù)端的具體端口才能夠進(jìn)行訪問,因此在使用NFS服務(wù)前需要啟動(dòng)遠(yuǎn)程調(diào)用(RPC)服務(wù)。RPC的主要功能就是制定每個(gè)N

62、FS功能所對(duì)應(yīng)的端口號(hào),并反饋給客戶端。</p><p>  NFS服務(wù)端在啟動(dòng)時(shí)會(huì)隨機(jī)選取數(shù)個(gè)端口,并向RPC注冊(cè),因此RPC會(huì)知道每個(gè)端口對(duì)應(yīng)的NFS功能,然后RPC會(huì)固定使用端口111來監(jiān)聽客戶端的請(qǐng)求,并把端口號(hào)反饋給客戶端。所以在啟動(dòng)NFS服務(wù)前,必須先啟動(dòng)RPC服務(wù),否則NFS無法向RPC注冊(cè)。</p><p>  RPC服務(wù)和NFS服務(wù)分別通過命令“service portm

63、ap start”和“service nfs start”啟動(dòng)。</p><p>  [root@localhost~]#service portmap start</p><p>  [root@localhost~]#service nfs start</p><p>  使用“service nfs status”可以查看NFS的運(yùn)行情況。這樣NFS的服務(wù)端就

64、建立成功了。</p><p>  2.2.3燒寫內(nèi)核鏡像zImage</p><p> ?。?)內(nèi)核版本為linux-2.6.29,通過make編譯該內(nèi)核,會(huì)生成zImage</p><p> ?。?)將開放板和主機(jī)連好,打開超級(jí)終端</p><p> ?。?)通過supervivi來燒寫zImage</p><p>

65、  2.3 SDL庫的移植</p><p>  SDL是一個(gè)自由的跨平臺(tái)的多媒體開發(fā)包,適用于 游戲、游戲SDK、演示軟件、模擬器、 MPEG播放器和其他應(yīng)用軟件。是為數(shù)不多的商業(yè)游戲開發(fā)公司使用的免費(fèi)軟件庫之一。它提供跨平臺(tái)的二維幀緩沖區(qū)圖形和音頻服務(wù),它支持 Linux等多種操作系統(tǒng)。除了豐富的服務(wù),還包括線程以及不同于字節(jié)存儲(chǔ)次序的宏定義和一些 CD 音頻,除此以外還提供了簡單的 接口,該接口允許用戶盡可能

66、接近本機(jī)的硬件設(shè)備。使用 SDL 有很多優(yōu)點(diǎn),最突出的還是穩(wěn)定靈活。</p><p><b>  穩(wěn)定</b></p><p>  如果SDL本身并不向接口提供一定的支持,那么研發(fā)人員就不能很好的使用它了。使用了SDL,研發(fā)人員就可以修正錯(cuò)誤并增強(qiáng)了SDL的功能,也就是增強(qiáng)了接口的健壯性。大家都知道內(nèi)核的開發(fā)是分步進(jìn)行的,SDL 的開發(fā)和內(nèi)核開發(fā)一樣也是分步來做的。&

67、lt;/p><p><b>  靈活</b></p><p>  只要移植到 SDL,并確定一些數(shù)據(jù)假設(shè),那么根本不必改動(dòng)代碼,演示就可以在Win32、BeOS和Linux 控制臺(tái)上運(yùn)行了。盡管代碼完完全全是跨平臺(tái)的,但不會(huì)把研發(fā)人員和底層真正的分開。SDL本身提供了SDL_GetWMInfo()函數(shù),該函數(shù)方便開發(fā)者訪問底層驅(qū)動(dòng)的程序。</p><p

68、>  2.3.1在PC機(jī)上安裝SDL開發(fā)環(huán)境</p><p>  和Linux下其他的軟件庫一樣,SDL同樣具有很強(qiáng)的移植性!我們所要做的就是在PC機(jī)上編寫應(yīng)用程序,調(diào)試通了以后就可以交叉編譯移植到ARM板子上。下載SDL-1.2.13 (stable),然后進(jìn)行安裝,由于后面的交叉編譯的是`tar.xx`源碼包,所以建議在PC機(jī)上使用`tar.xx`包進(jìn)行安裝。</p><p> 

69、 安裝前請(qǐng)先查看是否安裝有SDL,如果有請(qǐng)先卸載,如果你的系統(tǒng)使用的是`rpm軟件安裝包管理器`可以使用下面的命令進(jìn)行查看:</p><p>  # rpm -qa |grep SDL </p><p>  如果使用`dpkg軟件包管理器`,可以使用</p><p>  # dpkg -s SDL </p><p><b>  下一

70、步開始安裝:</b></p><p><b>  # cd /tmp</b></p><p>  # tar -zxf SDL-1.2.13.tar.gz</p><p>  # cd SDL-1.2.13</p><p>  #. /configure --help </p><p>

71、;  使用上面這條命令用來查看`configure`選項(xiàng)信息,然后在這些選項(xiàng)中篩選必要的選項(xiàng)。</p><p>  如果沒有錯(cuò)誤,執(zhí)行:</p><p><b>  # make </b></p><p>  # make install </p><p>  那么PC 機(jī)上SDL安裝完成。</p><

72、;p>  2.3.2交叉編譯SDL庫移植到開發(fā)板</p><p>  由于ARM板的資源有限,不可能把所有的選項(xiàng)都開啟,因此我們需要根據(jù)實(shí)際情況進(jìn)行選擇,下面的選項(xiàng)一般可以滿足我們的要求:</p><p>  # ./configure --prefix=/home/nfsroot/rootfs/SDL CC=arm-linux-gcc --host=arm-linux --targ

73、et=linux --disable-debug --disable-cdrom --disable-esd --disable-arts --disable-arts-shared --disable-diskaudio --disable-nas --disable-esd-shared --disable-mintaudio --disable-nasm --disable-video-x11 --disable-video-dg

74、a --disable-dga --disable-video-ps2gs --disable-video-xbios --disable-video-gem --disable-video-opengl --disable-directx --disable-stdio-redirect --disable-osmesa-shared 2>&1 | tee conf_log</p><p>  如

75、果沒有報(bào)錯(cuò)就可以進(jìn)行編譯:</p><p><b>  # make </b></p><p>  如果報(bào)錯(cuò)的話就需要根據(jù)出錯(cuò)信息調(diào)整一下`configure`的選項(xiàng)參數(shù)后編譯(參數(shù)調(diào)整后沒有必要`make clean`,直接`make` 就行了,make工具會(huì)智能的探尋哪些目標(biāo)需要編譯)。如果沒有錯(cuò)誤就可以`make install`了。</p>&

76、lt;p>  # make install在安裝的過程中,注意安裝的路徑,可以通過查看配置文件獲得安裝路徑或者修改路徑。</p><p>  第三章 USB設(shè)備驅(qū)動(dòng)程序介紹</p><p>  在本課題中由于使用的是中星微ZC301USB攝像頭,在Linux系統(tǒng)中有一個(gè)萬能驅(qū)動(dòng)完全能夠?qū)崿F(xiàn)這種型號(hào)攝像頭的驅(qū)動(dòng),因此在這里課題就省去了編寫驅(qū)動(dòng)程序的過程,這里我簡單介紹一下USB驅(qū)動(dòng)和

77、USB攝像頭驅(qū)動(dòng)開發(fā)。</p><p>  3.1 USB驅(qū)動(dòng)開發(fā)</p><p>  USB是英文Universal Serial Bus的縮寫,中文稱為“通用串行總線”。USB是一個(gè)總線協(xié)議標(biāo)準(zhǔn),最初由Intel、NEC、Compaq、DEC、IBM、Microsoft等公司聯(lián)合制定的。到目前為止USB共有1.0、1.1和2.0三個(gè)標(biāo)準(zhǔn),主要區(qū)別是傳輸速率不同,體系結(jié)構(gòu)也有一定的差別。

78、</p><p>  USB的設(shè)計(jì)目標(biāo)是對(duì)現(xiàn)有的PC機(jī)體系進(jìn)行擴(kuò)充,但是目前不僅是PC機(jī),許多的嵌入式系統(tǒng)都開始支持USB總線和接口標(biāo)準(zhǔn)。USB設(shè)計(jì)主要遵循下面幾個(gè)原則:易于擴(kuò)充外部設(shè)備;靈活的傳輸協(xié)議;設(shè)備兼容性好;接口統(tǒng)一。</p><p>  USB接口標(biāo)準(zhǔn)具有下面幾個(gè)方面的特色:</p><p><b>  1)易用性</b></

79、p><p><b>  2) 應(yīng)用廣泛</b></p><p><b>  3) 健壯性</b></p><p>  USB設(shè)計(jì)分類如表3-1所示:</p><p>  Linux下完整的USB驅(qū)動(dòng)程序必須包括3個(gè)模塊:USB core,USB 主控制器驅(qū)動(dòng),USB設(shè)備驅(qū)動(dòng)。其中: </p>

80、<p>  Linux 內(nèi)核封裝了支持USB主控制器以及USB設(shè)備驅(qū)動(dòng)的接口,設(shè)備硬件通過數(shù)據(jù)結(jié)構(gòu)、函數(shù)來抽象化,使得Linux操作系統(tǒng)訪問USB設(shè)備就像訪問一般文件一樣簡單,這樣就實(shí)現(xiàn)了與硬件無關(guān)。也就是說:“設(shè)備即是文件”。</p><p>  USB HC(Host Controller)作用是負(fù)責(zé)主機(jī)端對(duì)USB的數(shù)據(jù)進(jìn)行分工,對(duì)下面是注冊(cè)相關(guān)功能和一些數(shù)據(jù)結(jié)構(gòu);對(duì)上面是提供了必要的設(shè)備驅(qū)動(dòng)與

81、USB的內(nèi)核數(shù)據(jù)傳輸?shù)耐ǖ?。USB上的數(shù)據(jù)傳輸是通過URB(USB Request Block)數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的,在每次的數(shù)據(jù)傳輸過程中,設(shè)備驅(qū)動(dòng)就會(huì)自動(dòng)建立URB,然后提交給USB HC,USB HC就會(huì)完成與設(shè)備端的URB交互過程。</p><p>  Linux操作系統(tǒng)中所有的USB傳輸都是通過URB實(shí)現(xiàn)的。為了提高傳輸速度,可以增大URB的緩沖區(qū),那么就可以減少每個(gè)USB握手信息所占的比重,有效數(shù)據(jù)傳輸速

82、度會(huì)得到提高。由于受限于總線的帶寬和具體USB設(shè)備的芯片,單單擴(kuò)大URB的緩沖區(qū)并不能很好地解決問題。USB每次數(shù)據(jù)傳輸都要建立URB、發(fā)出、回收、數(shù)據(jù)整理等階段,這些時(shí)間并不會(huì)產(chǎn)生有效的數(shù)據(jù)。因此我們可以創(chuàng)建兩個(gè)不同的URB,在我們等待一個(gè)URB被回收的同時(shí),也就是當(dāng)信息被傳感器采集的時(shí)候,初始化另外一個(gè)URB,并在回收第一個(gè)URB后立刻將第二個(gè)URB發(fā)出,這樣兩個(gè)不同的URB可以交替的使用了,這樣可以減少了額外的時(shí)間。URB處理工作

83、流程如圖3-1-1所示。</p><p>  圖3-1-1為URB處理工作流程圖</p><p>  這個(gè)過程我們需要注意兩點(diǎn):首先我們處理再次初始化的代碼需要的時(shí)間不宜太長,如果時(shí)間確實(shí)來不及的話,在完成的例程我們可以用標(biāo)識(shí)來解決,例如“數(shù)據(jù)采集好”語句,可以由應(yīng)用程序的ioctl()函數(shù)來做查詢,并做出相應(yīng)的處理,其次CPU很有可能會(huì)在完成例程的這個(gè)過程中停留較長時(shí)間,這樣系統(tǒng)的負(fù)擔(dān)就

84、會(huì)比較大了,可以在open()函數(shù)中我們可以初始化兩個(gè)URB然后將其發(fā)出,這樣就可以減輕系統(tǒng)的一些負(fù)擔(dān)了。</p><p>  使用Linux操作系統(tǒng)下進(jìn)行驅(qū)動(dòng)開發(fā)的一般步驟如下:</p><p><b>  注冊(cè)設(shè)備</b></p><p>  在操作系統(tǒng)啟動(dòng)的時(shí)候或者在模塊加載時(shí),我們需要將設(shè)備的重要數(shù)據(jù)注冊(cè)到內(nèi)核的設(shè)備數(shù)組中,并確定該設(shè)備

85、的主設(shè)備號(hào)和次設(shè)備號(hào)。在Linux操作系統(tǒng)中,字符設(shè)備是通過調(diào)用register_chrdev()函數(shù)來向系統(tǒng)注冊(cè)設(shè)備驅(qū)動(dòng)的,register_chrdev()函數(shù)定義如下:</p><p>  int register_chrdev(unsigned int major,const char *name,struct file_operations fops)</p><p>  該定義

86、中的參數(shù)major是向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果major為0,則系統(tǒng)為該驅(qū)動(dòng)程序動(dòng)態(tài)分配一個(gè)臨時(shí)的主設(shè)備號(hào),參數(shù)name 是設(shè)備名;參數(shù)fops 是調(diào)用入口函數(shù)的說明,fops是一個(gè)結(jié)構(gòu)體,如果函數(shù)返回0則表示注冊(cè)成功,如果函數(shù)返回-INVAL表示我們申請(qǐng)的主設(shè)備號(hào)是非法飛,返回-EBUSY表示申請(qǐng)的主設(shè)備號(hào)正在被其他的設(shè)備驅(qū)動(dòng)程序使用。</p><p><b>  定義操作集</b><

87、;/p><p>  隨著內(nèi)核不斷增加新的功能,file_operations結(jié)構(gòu)體已逐漸變得越來越大,但是大多數(shù)的驅(qū)動(dòng)程序只是利用了其中的一部分。對(duì)于字符設(shè)備來說,要提供的主要入口有:open ()、release ()、read ()、write ()、ioctl ()、llseek()、poll()等。</p><p>  file_operations這個(gè)結(jié)構(gòu)的每一個(gè)成員函數(shù)對(duì)應(yīng)著一個(gè)系

88、統(tǒng)調(diào)用,在用戶的程序中利用系統(tǒng)的調(diào)用來對(duì)設(shè)備文件進(jìn)行操作時(shí),系統(tǒng)通過設(shè)備的主設(shè)備號(hào)會(huì)找到相應(yīng)的驅(qū)動(dòng)程序,然后會(huì)讀取這個(gè)數(shù)據(jù)結(jié)構(gòu)所對(duì)應(yīng)的函數(shù)指針,最后會(huì)把控制權(quán)交給函數(shù)。</p><p><b>  卸載模塊</b></p><p>  與模塊初始化函數(shù)對(duì)應(yīng)的就是模塊卸載函數(shù),需要調(diào)用register_chrdev()的"反函數(shù)" unregiste

89、r_chrdev(),它在fs/devices.c文件中的定義如下:</p><p>  int unregister_chrdev(unsigned int major,const char *name)</p><p>  3.2 攝像頭驅(qū)動(dòng)開發(fā)</p><p>  攝像頭屬于視頻設(shè)備,在Linux內(nèi)核中,Video for Linux(簡稱V4L)是關(guān)于視頻

90、設(shè)備的驅(qū)動(dòng)標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)為應(yīng)用程序定義了一系列的接口函數(shù),驅(qū)動(dòng)和內(nèi)核以及應(yīng)用程序都是依靠這個(gè)標(biāo)準(zhǔn)來進(jìn)行通信的。目前的V4L包涵了音頻流和視頻流的捕捉與處理等一系列的內(nèi)容,V4L也支持USB攝像頭。</p><p>  因此,USB攝像頭的驅(qū)動(dòng)程序與linux內(nèi)核所封裝的驅(qū)動(dòng)是有關(guān)聯(lián)的。即先在驅(qū)動(dòng)程序中聲明一個(gè)video_device的結(jié)構(gòu),并為其指定文件操作函數(shù)指針,然后向系統(tǒng)注冊(cè)該結(jié)果。在上層應(yīng)用程序發(fā)出操作文

91、件的命令時(shí),內(nèi)核根據(jù)文件操作的函數(shù)指針調(diào)用相關(guān)的函數(shù),同時(shí)將該結(jié)構(gòu)作為參數(shù)傳給它們。這樣,驅(qū)動(dòng)和內(nèi)核之間的通信就完成了。</p><p><b>  例如:</b></p><p>  video_device spca50xx_template = {……} ;//用來掛接驅(qū)動(dòng)。</p><p>  file_operations spca5

92、0xx _fops = {……} ;//驅(qū)動(dòng)的文件操作函數(shù)指針。</p><p>  video_device *vdev = video_devdata(file);//從文件指針中提取出video_device結(jié)構(gòu)。</p><p>  在video_device結(jié)構(gòu)中,指針priv是私有的,其作用是保留一塊內(nèi)存。而這塊內(nèi)存中,保存了本驅(qū)動(dòng)和本設(shè)備相關(guān)的初始化的一些信息。關(guān)于申請(qǐng)這塊內(nèi)

93、存以及初始化等工作都是在USB的驅(qū)動(dòng)函數(shù)probe()中完成的。這樣,驅(qū)動(dòng)函數(shù)將控制權(quán)還給系統(tǒng)后,因?yàn)閮?nèi)核會(huì)保留內(nèi)存的,那么驅(qū)動(dòng)會(huì)保留著自己的信息。這點(diǎn)和Windows中WDM驅(qū)動(dòng)非常相似。最后在卸載函數(shù)中,開發(fā)者必須全部釋放各塊內(nèi)存。</p><p>  Linux內(nèi)核是根據(jù)不同的設(shè)備號(hào)來操作不同的設(shè)備文件的,在內(nèi)核中攝像頭所對(duì)應(yīng)的設(shè)備文件名為/dev/video0,主設(shè)備號(hào)是81,次設(shè)備號(hào)是根據(jù)攝像頭個(gè)數(shù)來確

94、定的,本次課題中僅有一個(gè)攝像頭,所以我們通過mknod /dev/video0 c 81 0 來創(chuàng)建節(jié)點(diǎn)。USB攝像頭驅(qū)動(dòng)實(shí)現(xiàn)原理如圖3-2-1。</p><p>  圖3-2-1 攝像頭驅(qū)動(dòng)實(shí)現(xiàn)原理</p><p>  USB信息傳輸?shù)念愋涂梢苑譃槌煽刂?、中斷、?shí)時(shí)、成塊四種不同的類型:其中控制是用于設(shè)備的“配置”與控制;中斷是用于主機(jī)對(duì)USB設(shè)備周期性的查詢;實(shí)時(shí)是用與音視頻信號(hào)的傳輸

95、;成塊是用于當(dāng)信息量非常大,而且沒有很強(qiáng)的時(shí)間要求,但是必須可靠傳遞的應(yīng)用。對(duì)于本課題的攝像頭而言,我們采用的是實(shí)時(shí)傳輸。USB設(shè)備端給我們提供了通信的端口(port),那么可以先建立起通信的管道,然后進(jìn)行數(shù)據(jù)的傳輸。在攝像頭初始化的階段,主機(jī)是和端口號(hào)為0的端口進(jìn)行通信的,同時(shí)驅(qū)動(dòng)程序會(huì)判斷設(shè)備的型號(hào)以及所有端口的信息,然后會(huì)進(jìn)入到傳輸數(shù)據(jù)的過程,主機(jī)會(huì)和實(shí)時(shí)的輸入端建立起通信的管道,那么這樣就可以實(shí)時(shí)的回傳圖像數(shù)據(jù)。</p&g

96、t;<p>  第四章 圖像采集的實(shí)現(xiàn)</p><p>  開始已經(jīng)提到過,電視卡使用的是video for linux驅(qū)動(dòng),簡稱v4l,實(shí)際上,現(xiàn)在已經(jīng)有了video for linux two驅(qū)動(dòng) ,即v4l2.它解決了v4l中存在的一些問題,并且提高了硬件性能。但是,目前來說,v4l2仍然沒有集成到linux的內(nèi)核中,要使用v4l2的話,只有去下載v4l2補(bǔ)丁了,本課題中所涉及的內(nèi)容只針對(duì)v4

97、l設(shè)備而言。</p><p><b>  4.1 V4L編程</b></p><p>  Video4Linux是目前市場上最常見的電視捕獲卡以及USB攝像頭,其提供了統(tǒng)一的編程接口。同時(shí)V4L提供了無線電的通信以及文字電視和廣播解碼的數(shù)據(jù)接口。下面主要是針對(duì)USB 攝像頭的設(shè)備文件來進(jìn)行關(guān)于視頻圖像的采集方面的相關(guān)程序設(shè)計(jì)。</p><p>

98、  V4L編程的一般流程為:</p><p><b>  1)打開設(shè)備;</b></p><p><b>  2)讀取信息;</b></p><p>  3)更改設(shè)置(如果必要);</p><p>  4)進(jìn)行視頻圖像的采集有兩種方法:</p><p> ?。?)內(nèi)存映射(m

99、map) (2)直接從設(shè)備讀?。╮ead)</p><p>  5)處理采集到視頻;</p><p><b>  6)關(guān)閉設(shè)備。</b></p><p>  4.1.1 V4L編程中主要定義的數(shù)據(jù)結(jié)構(gòu)及使用函數(shù)</p><p><b>  定義的數(shù)據(jù)結(jié)構(gòu):</b></p><p&

100、gt;  struct _v4l_struct </p><p><b>  { </b></p><p>  int fd; </p><p>  struct video_capability capability; </p><p>  struct video_buffer buffer; &

101、lt;/p><p>  struct video_window window; </p><p>  struct video_channel channel[8]; </p><p>  struct video_picture picture; </p><p>  struct video_mmap mmap; </p

102、><p>  struct video_mbuf mbuf; </p><p>  unsigned char *map; </p><p><b>  };</b></p><p>  typedef struct _v4l_struct v4l_device; </p><p>  vi

103、deo_capability </p><p>  包含設(shè)備的最基本的信息(設(shè)備名、分辨率、信號(hào)源等等)。</p><p>  name[32] 設(shè)備名稱 。</p><p><b>  maxwidth </b></p><p>  maxheight </p><p><b>

104、  minwidth </b></p><p>  minheight </p><p>  channels 信號(hào)源的信息 。</p><p>  Type 是否可以capture ,彩色或是黑白,能否裁剪等等。值如VID_TYPE_CAPTURE等。</p><p>  (2)video_picture 采集到的

105、圖像屬性。</p><p>  Brightness 0~65535 亮度。</p><p><b>  hue 色調(diào)。</b></p><p>  contrast 對(duì)比度。</p><p>  whiteness 色度。</p><p>  depth 8 16 24 32深度。&

106、lt;/p><p>  palette VIDEO_PALETTE_RGB24 | VIDEO_PALETTE_RGB565| </p><p>  VIDEO_PALETTE_JPEG| VIDEO_PALETTE_RGB32</p><p> ?。?)video_channel信號(hào)源的一些屬性。</p><p>  Channel 信號(hào)源

107、的編號(hào) 。</p><p><b>  name </b></p><p><b>  tuners </b></p><p>  Type VIDEO_TYPE_TV | IDEO_TYPE_CAMERA </p><p>  Norm 制式 PAL|NSTC|SECAM|AUTO

108、</p><p> ?。?)video_window 攝像頭的窗口的參數(shù) 。</p><p>  x x坐標(biāo)。 </p><p>  Y y坐標(biāo)。 </p><p>  width 捕獲圖像的寬.。</p><p>  height 捕獲圖像的高.。</p>

109、<p>  chromakey </p><p>  flags 捕獲的標(biāo)識(shí)。 </p><p>  clips 裁剪矩形的列表。</p><p>  clipcount 裁剪矩形的數(shù)目。</p><p> ?。?)video_mbuf mmap映射幀的信息 </p><p&g

110、t;  size 每幀大小。</p><p>  Frames 所支持幀數(shù)的最大數(shù)目。</p><p>  Offsets 每幀的偏移量。</p><p> ?。?)video_mmap 用于mmap內(nèi)存映射</p><p>  4.1.2 V4L編程中攝像頭的I/O控制</p><p>&l

111、t;b> ?。?)打開攝像頭</b></p><p>  在Linux中視頻設(shè)備看作設(shè)備文件,通過open函數(shù)來實(shí)現(xiàn),該函數(shù)的功能是以用指定方式來打開設(shè)備的。open()函數(shù)為:</p><p>  int open(dev,O_RDWR)</p><p>  第一個(gè)為設(shè)備的文件名,對(duì)于本課題則使用的是/dev/video0,第二個(gè)則表示打開的類

112、型。</p><p>  首先需要檢查參數(shù)dev是否為空,然后使用open()函數(shù)以只讀方式來打開攝像頭的設(shè)備,并且得到文件描述符。判斷得到的文件描述符是否為-1,如果是則說明打開設(shè)備時(shí)出錯(cuò)。</p><p>  int v4l_open(char *dev, v4l_device *vd) </p><p><b>  { </b>&l

113、t;/p><p>  if (!dev) {</p><p>  printf(“NO device file, ERROR opening V4L interface”);</p><p>  return -1; </p><p><b>  }</b></p><p>  if ((vd -&g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論