版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于ARM的視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)摘 要本文根據(jù)家庭視頻采集系統(tǒng)的要求,提出一種基于ARM的網(wǎng)絡(luò)視頻采集方案。方案要求視頻的實(shí)時(shí)傳輸、實(shí)時(shí)監(jiān)控。本系統(tǒng)以Intel Xscale 芯片和嵌入式Linux系統(tǒng)為平臺(tái),在平臺(tái)中搭建網(wǎng)絡(luò)視頻服務(wù)器,并以它為中介,負(fù)責(zé)將USB攝像頭采集到得視頻數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)服務(wù)器中,最后發(fā)送到申請(qǐng)監(jiān)控的遠(yuǎn)程PC機(jī)中,遠(yuǎn)程PC只需在網(wǎng)頁(yè)中便能實(shí)時(shí)的看到監(jiān)控端的視頻圖像。論文首先闡述了嵌入式網(wǎng)絡(luò)視頻采集技術(shù)的發(fā)展、現(xiàn)狀和前景,然后介紹了嵌入式硬件系統(tǒng)結(jié)構(gòu)和嵌入式Linux操作系統(tǒng)的特點(diǎn),闡述了嵌入式硬件整體結(jié)構(gòu),使大家大體的完整的對(duì)系統(tǒng)硬件有詳細(xì)的了解,實(shí)際記錄了嵌入式操
2、作系統(tǒng)內(nèi)核的編譯和移植,介紹了Bootloader的基本原理和啟動(dòng)過(guò)程,實(shí)現(xiàn)了視頻采集程序的編譯和移植,研究了嵌入式一般驅(qū)動(dòng)程序的使用。隨后,本文詳細(xì)描述了視頻采集程序的整體結(jié)構(gòu)框圖和具體功能代碼塊、網(wǎng)絡(luò)通信編程技術(shù)、圖像編解碼、嵌入式視頻服。關(guān)鍵詞:ARM;嵌入式;Linux;視頻采集 可修改 歡迎下載 精品 Word目 錄摘 要I第1章 引言11.1 課題的背景和來(lái)源11.2 本文的內(nèi)容及主要工作3第2章 嵌入式ARM系統(tǒng)硬件結(jié)構(gòu)簡(jiǎn)介32.1 視頻監(jiān)控系統(tǒng)結(jié)構(gòu)簡(jiǎn)介32.2 ARM處理器簡(jiǎn)介32.3 XScale體系結(jié)構(gòu)42.4 主要硬件電路說(shuō)明7第3章 嵌入式ARM系統(tǒng)軟件結(jié)構(gòu)93.1 L
3、inux操作系統(tǒng)簡(jiǎn)介93.2 交叉編譯環(huán)境的建立103.3 嵌入式Linux操作系統(tǒng)移植113.3.1 BootLorder移植113.3.2 Linux 內(nèi)核移植123.3.3 嵌入式文件系統(tǒng)133.4 Linux下的程序調(diào)試14第4章 USB設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)154.1 設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介154.2 Linux下驅(qū)動(dòng)程序的實(shí)現(xiàn)184.3 USB攝像頭驅(qū)動(dòng)程序設(shè)計(jì)20第5章 視頻采集功能的設(shè)計(jì)235.1 基于V4L的編程245.1.1 攝像頭相關(guān)數(shù)據(jù)結(jié)構(gòu)245.1.2 攝像頭基本功能實(shí)現(xiàn)255.1.3 視頻數(shù)據(jù)采集295.2 圖像編解碼325.2.1 編解碼介紹325.2.2 系統(tǒng)壓縮技術(shù)33第
4、1章 引言1.1 課題的背景和來(lái)源二十一世紀(jì)的網(wǎng)絡(luò)化、數(shù)字化讓人們的生活每天都發(fā)生著翻天覆地的變化,獲取信息的方便和快捷可以使人們?cè)谛畔⒒慕裉祛I(lǐng)先一步創(chuàng)造出巨大的利益,而獲取信息的重要途徑就是眼睛。據(jù)統(tǒng)計(jì),人類采集信息的80%來(lái)自視覺(jué)。圖像和視頻是對(duì)客觀事物生動(dòng)、形象的描述,是一種最直觀的表現(xiàn)方式。而視頻監(jiān)控技術(shù)因?yàn)樗奖憧旖荨⑸鷦?dòng)形象、信息豐富等特點(diǎn)日益受到人們的青睞,并在各行各業(yè)得到廣泛的應(yīng)用。與此同時(shí),現(xiàn)代網(wǎng)絡(luò)和數(shù)字技術(shù)的快速發(fā)展也為視頻監(jiān)控技術(shù)的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。二十一世紀(jì),嵌入式技術(shù)、多媒體處理技術(shù)進(jìn)一步發(fā)展,為視頻監(jiān)控系統(tǒng)的發(fā)展提供了新的出路嵌入式視頻監(jiān)控系統(tǒng)。嵌入式系統(tǒng)是以
5、應(yīng)用為中心,軟硬件可以剪裁,具有高穩(wěn)定、低成本、功耗低、速度快、實(shí)時(shí)好的專用計(jì)算機(jī)系統(tǒng),它由嵌入式微處理器,配以周邊硬件設(shè)備,接口電路組成。嵌入式系統(tǒng)內(nèi)部使用嵌入式操作系統(tǒng),安裝專用的功能軟件。嵌入式技術(shù)把硬件和軟件集于一體,獨(dú)立工作。嵌入式視頻監(jiān)控系統(tǒng)比其他視頻采集系統(tǒng)在布局區(qū)域范圍上要廣泛;由于使用IP技術(shù),嵌入式視頻監(jiān)控技術(shù)比其他視頻采集系統(tǒng)更具緊密的結(jié)合度,能夠充分利用現(xiàn)代網(wǎng)絡(luò)技術(shù)的成果,并能構(gòu)成復(fù)雜的視頻監(jiān)控網(wǎng)絡(luò);性能上,嵌入式視頻采集系統(tǒng)繼承了嵌入式技術(shù)的優(yōu)點(diǎn),非常適合自動(dòng)化的環(huán)境。因此,嵌入式視頻采集技術(shù)正在我國(guó)快速的發(fā)展,積極的研究會(huì)加強(qiáng)我們?cè)谶@方面技術(shù)的學(xué)習(xí),也會(huì)為視頻監(jiān)控技
6、術(shù)的發(fā)展貢獻(xiàn)力量。1.2 本文的內(nèi)容及主要工作根據(jù)畢業(yè)設(shè)計(jì)的初衷,我們需要設(shè)計(jì)基于ARM的網(wǎng)絡(luò)視頻采集系統(tǒng)。在監(jiān)控系統(tǒng)中,視頻采集、傳輸、播放的功能不是由專門視頻處理芯片完成,而是由軟件實(shí)現(xiàn)。論文首先介紹了嵌入式ARM系統(tǒng)的硬件結(jié)構(gòu)和軟件結(jié)構(gòu),方便大家熟悉ARM和Linux系統(tǒng),包括嵌入式設(shè)備的硬件結(jié)構(gòu),邏輯框圖和Linux的基本操作、安裝方法;第二,研究了嵌入式的一些驅(qū)動(dòng)程序,主要是攝像頭驅(qū)動(dòng)程序V4L,系統(tǒng)中選用的攝像頭芯片中星微301;第三,研究了視頻監(jiān)控的具體流程和實(shí)現(xiàn)方式,讓大家在總體上對(duì)整個(gè)系統(tǒng)有一個(gè)大概的認(rèn)知。本次設(shè)計(jì)的目的只有一個(gè),就是實(shí)現(xiàn)視頻的實(shí)時(shí)監(jiān)控。圍繞它,不管是硬件結(jié)構(gòu)
7、還是軟件流程,都需要學(xué)習(xí)和研究,不斷調(diào)試,決不放棄??傊?,論文的內(nèi)容都是圍繞如何建立一個(gè)視頻采集系統(tǒng)。無(wú)論是從哪個(gè)方面,我們都是為這個(gè)目標(biāo)而努力。第2章 嵌入式ARM系統(tǒng)硬件結(jié)構(gòu)簡(jiǎn)介2.1 視頻監(jiān)控系統(tǒng)結(jié)構(gòu)簡(jiǎn)介網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)是基于嵌入式技術(shù)設(shè)計(jì)的。嵌入式并沒(méi)有統(tǒng)一的定義,但目前有一個(gè)廣泛而又被認(rèn)可的規(guī)范:將軟件產(chǎn)品固化到硬件平臺(tái)上,完成應(yīng)有的功能既是嵌入式。基于嵌入式ARM技術(shù)的視頻監(jiān)控系統(tǒng)服務(wù)器端采用攝像頭不斷的采集圖像,壓縮成視頻流,然后通過(guò)網(wǎng)絡(luò)發(fā)送到申請(qǐng)監(jiān)控的客戶端。監(jiān)控系統(tǒng)的使用者可以在遠(yuǎn)程實(shí)現(xiàn)網(wǎng)頁(yè)上的實(shí)時(shí)監(jiān)控和一些簡(jiǎn)單的功能操作。系統(tǒng)整體結(jié)構(gòu)如圖2.1所示1。圖2.1 系統(tǒng)整體結(jié)構(gòu)
8、圖該系統(tǒng)中CPU采用基于ARM的PXA270微處理器,通過(guò)在其上運(yùn)行Linux操作系統(tǒng),執(zhí)行Boa視頻服務(wù)器,接受并處理來(lái)自攝像頭的圖像信號(hào),通過(guò)以太網(wǎng)控制器發(fā)送至遠(yuǎn)端,實(shí)現(xiàn)視頻數(shù)據(jù)的遠(yuǎn)程傳輸和接受,達(dá)到視頻監(jiān)控的目的2。2.2 ARM處理器簡(jiǎn)介ARM,既是一個(gè)公司的名字,也是對(duì)一類微處理器的通稱。ARM嵌入式微處理器是全球領(lǐng)先的16/32位RISK處理器芯片知識(shí)產(chǎn)權(quán)設(shè)計(jì)供應(yīng)商ARM(AdvancedRISKMachines)公司的產(chǎn)品。ARM公司本身不直接從事芯片生產(chǎn),而是依靠轉(zhuǎn)讓設(shè)計(jì)許可,由合作公司生產(chǎn)各具特色的芯片。ARM處理器以其完整的體系結(jié)構(gòu),極小的體積、極低的功耗、極低的成本、極高
9、的性能,及時(shí)根據(jù)嵌入對(duì)象的不同進(jìn)行功能上的擴(kuò)展的優(yōu)勢(shì),在眾多種類的嵌入式微處理器中脫穎而出?;贏RM技術(shù)的微處理器應(yīng)用占據(jù)了32位RISC微處理器75%以上的市場(chǎng)份額,ARM技術(shù)正在逐步滲入到我們生活的各個(gè)方面。采用RISC架構(gòu)的ARM微處理器一般具有如下特點(diǎn):(1) 采用固定長(zhǎng)度的指令格式,指令規(guī)整、簡(jiǎn)單、基本尋址方式有23種;(2) 使用單周期指令,便于流水線操作執(zhí)行;(3) 大量使用寄存器,數(shù)據(jù)處理指令只對(duì)寄存器進(jìn)行操作,以提高指令的執(zhí)行效率;(4)所有的指令都可根據(jù)前面的執(zhí)行結(jié)果決定是否被執(zhí)行,從而提高指令的執(zhí)行效率;(5)可用加載/存儲(chǔ)指令批量傳輸數(shù)據(jù),以提高數(shù)據(jù)的傳輸效率;(6)
10、可在一條數(shù)據(jù)處理指令中同時(shí)完成邏輯處理和移位處理;(7)在循環(huán)處理中使用地址的自動(dòng)增減來(lái)提高運(yùn)行效率。目前,ARM處理器有ARM7、ARM9、ARM9E、 ARM10、ARM10E、SecurCore、StrongARM和XScale等系列。每個(gè)系列除了具有ARM體系結(jié)構(gòu)的共同特點(diǎn)以外,都有各自的特點(diǎn)和應(yīng)用領(lǐng)域。2.3 XScale體系結(jié)構(gòu)Xscale核是采用ARM V5TE架構(gòu)的處理器,是Intel公司的StrongARM的升級(jí)換代產(chǎn)品,它具有高性能、低功耗等特點(diǎn),并在流水線設(shè)計(jì)、DSP處理和指令設(shè)計(jì)中有很大改進(jìn)3。ARM的體系結(jié)構(gòu)是基于RISK的,XScale是ARM處理器的一種,所以XS
11、cale具有RISK的基本特性。而且針對(duì)嵌入式系統(tǒng),XScale構(gòu)架還引入了Pentium處理器工藝和系統(tǒng)結(jié)構(gòu)技術(shù),實(shí)現(xiàn)了Pentium微處理器體系結(jié)構(gòu)的一系列高性能技術(shù),達(dá)到了高性能、低功耗和小體積等嵌入式系統(tǒng)要求的特性。它的特點(diǎn)有:超流水線、高主頻、存儲(chǔ)體系、分支預(yù)測(cè)和指令集體系結(jié)構(gòu)。本設(shè)計(jì)采用的就是基于英特爾Xscale構(gòu)架的一種32位嵌入式處理器,它除了應(yīng)用于掌上電腦之中外,還可以應(yīng)用于智能手機(jī)、網(wǎng)絡(luò)存儲(chǔ)設(shè)備、骨干網(wǎng)路由器等電子設(shè)備。PXA27x系列處理器是英特爾當(dāng)前最新推出的嵌入式處理器。它的時(shí)鐘頻率從312到624MHz不等,并內(nèi)建64MB的堆棧型Intel StrataFlash
12、內(nèi)存。內(nèi)置了英特爾的無(wú)線MMX技術(shù),能夠顯著提升多媒體性能。OURS-PXA270-EP是一款基于INTELXSCALE PXA270處理器,針對(duì)高效嵌入式系統(tǒng)教學(xué)和實(shí)驗(yàn)科研的平臺(tái)。這款設(shè)備主要包括核心板與底版兩個(gè)部分,核心板主要集成了高速的PXA270 CPU,配套的存儲(chǔ)器,網(wǎng)卡等設(shè)備;底版主要是各種類型的接口與擴(kuò)展口。核心板(8層PCB電路)系統(tǒng)包括:CPU: INTEL PXA270(520M),支持GDB調(diào)試;SDRAM: 64M 工作在104M外頻上;FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller (LAN91C
13、111);SUPERIO: WINBOND 83977;CPLD: XILINX 95144 (117USER IO);總線驅(qū)動(dòng)器: 若干;核心板正面如圖2.2所示,核心板背面如圖2.3所示。圖2.2 核心板正面圖圖2.3 核心板背面圖底版(4層PCB電路)如圖2.4所示。包括:Ethernet: 10/100接口1個(gè)UART: 6個(gè)(包括RS232,RS485,IRDA,全功能串口)USB1.1:2個(gè)(1個(gè)host 一個(gè)device)PS2:2個(gè)(KEYBOARD&MOUSE)標(biāo)準(zhǔn)并口:1個(gè)PCMCIA: 1個(gè)IDE:1個(gè)SD/MMC: 1個(gè)SMC:1個(gè)CAMERA:1個(gè)96PIN功
14、能擴(kuò)展口:2個(gè)4X5 小鍵盤CPU_JTAG CPLD_JTAGLEDSHARP LQ080V3DG01 8寸真彩LCD640X480VGA 640X480LED 8X8點(diǎn)陣一組7段LED數(shù)碼管 4個(gè) 圖2.4 底版圖2.4 主要硬件電路說(shuō)明嵌入式設(shè)備除了以ARM芯片為主要控制單元,也有很多周邊電路和外圍設(shè)備,它們有的幫助ARM處理信號(hào)、有的負(fù)責(zé)存儲(chǔ)數(shù)據(jù)、有的進(jìn)行網(wǎng)絡(luò)連接、有的用來(lái)數(shù)據(jù)通信,這些周邊設(shè)備缺一不可,不能替代。首先介紹CPU核心總線4,總線是CPU和其他設(shè)備的橋梁。CPU是通過(guò)總線信號(hào)來(lái)控制SDRAM ,FLASH,網(wǎng)卡,SUPERIO等外部設(shè)備的,無(wú)論是低速還是高速,只要是與總線
15、相關(guān)的芯片,都要和CPU總線信號(hào)有關(guān)。其次,研究嵌入式系統(tǒng)內(nèi)存SDRAM。SDRAM是嵌入式系統(tǒng)的內(nèi)存,具有單位空間存儲(chǔ)容量大和價(jià)格便宜的優(yōu)點(diǎn),已廣泛應(yīng)用在各種嵌入式系統(tǒng)中。當(dāng)系統(tǒng)啟動(dòng)時(shí),CPU首先從復(fù)位地址0x0處讀取啟動(dòng)代碼,在完成系統(tǒng)的初始化后,程序代碼一般應(yīng)調(diào)入SDRAM中運(yùn)行,以提高系統(tǒng)的運(yùn)行速度。同時(shí),系統(tǒng)及用戶堆棧、運(yùn)行數(shù)據(jù)也都放在SDRAM中。SDRAM的存儲(chǔ)單元可以理解為一個(gè)電容,總是傾向于放電,為避免數(shù)據(jù)丟失,必須定時(shí)刷新(充電)。因此,要在系統(tǒng)中使用SDRAM,就要求微處理器具有刷新控制邏輯,或在系統(tǒng)中另外加入刷新控制邏輯電路。PXA270芯片在片內(nèi)具有獨(dú)立的SDRAM刷
16、新控制邏輯,可方便地與SDRAM接口。除了SDRAM,F(xiàn)LASH也是一種存儲(chǔ)媒介。FLASH一般具有NOR型和NAND型。NAND型FLASH單元密度高,寫入和擦除速度非???,而且一般NAND型FLASH的存儲(chǔ)容量很大。NOR型FLASH的優(yōu)點(diǎn)是芯片內(nèi)執(zhí)行命令,這樣應(yīng)用程序可以直接在FLASH內(nèi)運(yùn)行,不用進(jìn)入內(nèi)存,使得它的傳輸效率很高。嵌入式設(shè)備最大的優(yōu)點(diǎn)就是網(wǎng)絡(luò)功能強(qiáng)大,它能像PC一樣方便地連接到互聯(lián)網(wǎng)上,這些功能都是網(wǎng)絡(luò)控制器的作用。也就是Ethernet Controller,本系統(tǒng)采用SMSC公司的單芯片的網(wǎng)絡(luò)控制器,LAN91C111。它可以工作在兩種速度下,10M以太網(wǎng)或者100M
17、以太網(wǎng)。LAN91C111的工作流程是,驅(qū)動(dòng)程序?qū)⒁l(fā)送的數(shù)據(jù)包按指定格式寫入芯片并啟動(dòng)發(fā)送命令,LAN91C111會(huì)自動(dòng)把數(shù)據(jù)包轉(zhuǎn)換成物理幀格式在物理信道上傳輸;反之芯片收到物理信號(hào)后自動(dòng)將其還原成數(shù)據(jù),并按指定格式存放在芯片RAM中以便主機(jī)程序取用。就是LAN91C111完成數(shù)據(jù)包和電信號(hào)之間的相互轉(zhuǎn)換。最后,說(shuō)明一下串口電路,在嵌入式視頻監(jiān)控系統(tǒng)中,串口起到了很重要地作用,嵌入式系統(tǒng)啟動(dòng)的信息都可以通過(guò)串口傳到PC上,極大地方便了系統(tǒng)的移植和軟件的調(diào)試。大多數(shù)情況下,嵌入式CPU的串口0會(huì)作為CPU的一個(gè)終端,為用戶與CPU交互提供基本的輸出輸入信息。當(dāng)CPU運(yùn)行BOOT代碼時(shí),通常只有
18、這個(gè)終端 ;運(yùn)行LINUX內(nèi)核時(shí),如果有LCD顯示,串口0與LCD終端會(huì)同時(shí)有效。串口0終端的交互方式是命令行的模式,在BOOT階段,支持簡(jiǎn)單的BOOT命令。第3章 嵌入式ARM系統(tǒng)軟件結(jié)構(gòu)3.1 Linux操作系統(tǒng)簡(jiǎn)介L(zhǎng)inux是一個(gè)類似Unix的操作系統(tǒng),它起源于芬蘭一個(gè)名為L(zhǎng)inusTorvaldS的業(yè)余愛(ài)好者,現(xiàn)已成為最流行的一款開放源代碼的操作系統(tǒng)。Linux從問(wèn)世至今,短短時(shí)間內(nèi)已發(fā)展成為一個(gè)功能強(qiáng)大、設(shè)計(jì)完善的操作系統(tǒng)。Linux系統(tǒng)不僅能夠運(yùn)行于PC平臺(tái),還在嵌入式系統(tǒng)方面大放光芒。由于Linux的源碼開放,內(nèi)核精簡(jiǎn)且性能強(qiáng)悍,不依賴于具體廠商,能廣泛適用于各種硬件設(shè)備,系統(tǒng)二
19、次開發(fā)成本極低,因此在IT業(yè)界已經(jīng)達(dá)成共識(shí),即采用嵌入式Linux作為嵌入式操作系統(tǒng)是大勢(shì)所趨5。嵌入式Linux是目前嵌入式系統(tǒng)領(lǐng)域中發(fā)展勢(shì)頭非常迅猛的系統(tǒng)。嵌入式Linux是指對(duì)Linux經(jīng)過(guò)小型化裁剪后,能夠固化在容量只有幾百K字節(jié)或幾M字節(jié)的存儲(chǔ)器芯片或單片機(jī)中,應(yīng)用于特定嵌入式場(chǎng)合的專用操作系統(tǒng)。目前正在開發(fā)的嵌入式系統(tǒng)中,49%的項(xiàng)目選擇嵌入式Linux作為操作系統(tǒng)。嵌入式Linux現(xiàn)已成為嵌入式操作系統(tǒng)的理想選擇6。目前基于嵌入式Linux的應(yīng)用已經(jīng)遍布很多領(lǐng)域,比如移動(dòng)多媒體設(shè)備、手持設(shè)備、車載導(dǎo)航系統(tǒng)、機(jī)械控制等。嵌入式Linux分為兩種類型:在沒(méi)有使用MMU的平臺(tái)上(無(wú)內(nèi)存
20、虛實(shí)地址轉(zhuǎn)換和映射)的一般為uCLinux;而在有MMU平臺(tái)上,則使用原本地嵌入式Linux版本。由于在目前的主流嵌入式ARM中大多不具有MMU,因此只用IM左右的內(nèi)核就能實(shí)現(xiàn)網(wǎng)絡(luò)功能和任務(wù)調(diào)度的Linux系統(tǒng)就可以適用于從高端服務(wù)器到嵌入式應(yīng)用的各級(jí)平臺(tái)。ARM技術(shù)和Linux成功地結(jié)合,應(yīng)用于數(shù)以千計(jì)的商業(yè)產(chǎn)品中。從便攜式消費(fèi)品、網(wǎng)絡(luò)和無(wú)線設(shè)備,到自動(dòng)化設(shè)備、醫(yī)療設(shè)備和存儲(chǔ)產(chǎn)品,這一應(yīng)用列表與日俱增。ARM和Linux的結(jié)合充分滿足了各類應(yīng)用對(duì)嵌入式平臺(tái)高性能、低功耗和低價(jià)格的要求,通過(guò)開發(fā)環(huán)境、開源社區(qū)和ARM的商業(yè)伙伴的優(yōu)勢(shì)為嵌入式開發(fā)提供了更靈活的選擇。本次設(shè)計(jì)的開發(fā)環(huán)境為redha
21、t9.0系統(tǒng),在Windows XP 下安裝虛擬機(jī),在虛擬機(jī)中安裝Linux系統(tǒng),這樣可以屏蔽底層差別,避免硬件驅(qū)動(dòng)帶來(lái)的麻煩,而且還能方便的使用串口、并口、USB接口,快速的進(jìn)入實(shí)驗(yàn)環(huán)境。圖3.1為虛擬機(jī)下Linux系統(tǒng)啟動(dòng)后的情況。 圖3.1 虛擬機(jī)下Linux操作系統(tǒng)3.2 交叉編譯環(huán)境的建立通常嵌入式系統(tǒng)的軟件編譯和執(zhí)行是在兩個(gè)不同平臺(tái)上進(jìn)行的。編譯是在宿主機(jī),一般為裝有Linux的pc;執(zhí)行是在目標(biāo)機(jī),即嵌入式系統(tǒng)的硬件平臺(tái)。一般是在宿主機(jī)上通過(guò)跨平臺(tái)交叉編譯器把源文件編譯成目標(biāo)平臺(tái)上可執(zhí)行的文件,再通過(guò)串口、并口或者網(wǎng)絡(luò)下載至目標(biāo)平臺(tái)上的FLASH或者其它存儲(chǔ)介質(zhì),然后由目標(biāo)機(jī)來(lái)運(yùn)
22、行這些軟件。這里所說(shuō)的跨平臺(tái)編譯器和一般的編譯器功能類似,都是把源代碼通過(guò)編譯器編譯成目標(biāo)文件,然后通過(guò)鏈接器、可重定位器程序和定位器把目標(biāo)文件重新定位成可執(zhí)行文件。和通用的編譯器之間最大的差別就在于跨平臺(tái)編譯器編譯出來(lái)的可執(zhí)行程序通常只能在特定CPU所屬平臺(tái)上運(yùn)行。所以一般來(lái)說(shuō)每種CPU都對(duì)應(yīng)有不同的跨平臺(tái)編譯器。本系統(tǒng)采用基于XScale的PXA270,可以使用常用的ARM-LINUX-GCC交叉編譯器。要成功構(gòu)建完整的交叉編譯環(huán)境需要在宿主機(jī)上創(chuàng)建一系列的工具包括C/C+編譯器、匯編器、鏈接器、嵌入式系統(tǒng)的標(biāo)準(zhǔn)C庫(kù)和GDB代碼級(jí)調(diào)試器。成功建立好開發(fā)環(huán)境后便可以運(yùn)用這些工具進(jìn)行嵌入式系統(tǒng)
23、開發(fā)7。3.3 嵌入式Linux操作系統(tǒng)移植3.3.1 BootLorder移植BootLoader是系統(tǒng)加電后運(yùn)行的第一段代碼。一般只是在啟動(dòng)時(shí)運(yùn)行很短的時(shí)間,然而對(duì)一個(gè)嵌入式系統(tǒng)來(lái)說(shuō),這一部分卻是整個(gè)系統(tǒng)的一個(gè)無(wú)比重要的組成部分,不可缺少。在一般嵌入式系統(tǒng)中,系統(tǒng)復(fù)位或者加電后通常從地址0x00000000處開始執(zhí)行,而這個(gè)地址一般正是存放的BootLoader啟動(dòng)代碼。通過(guò)這段程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終加載操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。BootLoader一般情況下需要包含以下幾個(gè)必備的功能 :(l)初始化處理器。
24、這個(gè)動(dòng)作都是用匯編語(yǔ)言完成的,稱為重置碼(resetcode)或者稱為bootcode,而且對(duì)于每個(gè)CPU都不一樣的,當(dāng)電源接通后就會(huì)執(zhí)行這個(gè)動(dòng)作,通常只有兩三個(gè)匯編指令,目的是將CPU的控制權(quán)轉(zhuǎn)給硬件初始化的程序。(2)初始化一些必要的硬件。這個(gè)動(dòng)作也大都由匯編語(yǔ)言來(lái)完成,主要是初始化CPU、SDRAM等,其他的硬件,例如串口,可以由c語(yǔ)言等比較高級(jí)的程序語(yǔ)言來(lái)完成后續(xù)動(dòng)作。(3)設(shè)置處理器的寄存器以及內(nèi)存,關(guān)掉所有的輸入管腳(包括中斷管腳),以防止突然有信號(hào)進(jìn)入妨礙接下來(lái)的硬件初始化動(dòng)作。然后初始化串口,以便后續(xù)運(yùn)行的程序能夠同HOST端進(jìn)行通信,便于調(diào)試。(4)從特定的位置把操作系統(tǒng)和文
25、件系統(tǒng)調(diào)入內(nèi)存,并設(shè)置一些操作系統(tǒng)所必需的參數(shù),然后把CPU控制權(quán)交給操作系統(tǒng)。有的BootLoader會(huì)先從串口或者網(wǎng)絡(luò)等其他途徑得到內(nèi)核的映像文件,然后把這些文件寫入目標(biāo)系統(tǒng)的FLASH或者其它存儲(chǔ)介質(zhì),最后再把內(nèi)核載入RAM執(zhí)行,交出控制權(quán)。一般BootLoader都包含兩種不同的操作模式:“啟動(dòng)加載”模式和“下載”模式,這種區(qū)別僅對(duì)于開發(fā)人員才有意義。從最終用戶的角度看,BootLoader的作用就是用來(lái)加載操作系統(tǒng),而并不存在所謂的啟動(dòng)加載模式與下載模式的區(qū)別。(l)啟動(dòng)加載(Bootloading)模式:這種模式也稱為“自主”(Autonomous)模式,即BootLoader從目
26、標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過(guò)程并沒(méi)有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)候,BootLoader顯然必須工作在這種模式下。(2)下載(Downloading)模式:在這種模式下,目標(biāo)機(jī)上的BootLoader將通過(guò)串口連接或者網(wǎng)絡(luò)連接等通信手段從主機(jī)(HOST)下載文件,比如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被BootL0ader保存到目標(biāo)機(jī)的RAM中,然后再被BootLoader寫到目標(biāo)機(jī)上的FLASH類固態(tài)存儲(chǔ)設(shè)備中。BootLoader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時(shí)被使用,
27、此外,以后的系統(tǒng)更新也會(huì)使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會(huì)向它的終端用戶提供一個(gè)簡(jiǎn)單的命令行接口。BootLoader的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),一般來(lái)說(shuō)啟動(dòng)過(guò)程分為兩個(gè)階段。第一階段依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在第一階段中,而且通常都用匯編語(yǔ)言來(lái)實(shí)現(xiàn),運(yùn)行效率比較高。這個(gè)階段完成的任務(wù)一般如下:( l) 硬件設(shè)備初始化(屏蔽所有的中斷、關(guān)閉處理器內(nèi)部的指令/數(shù)據(jù)cache);(2) 為第二階段準(zhǔn)備RA.M空間;(3) 復(fù)制BootLoader的第二階段代碼到RAM空間中;(4) 設(shè)置好堆棧并跳轉(zhuǎn)到第二階段的C
28、程序入口點(diǎn)。第二階段則通常用C語(yǔ)言來(lái)實(shí)現(xiàn),這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。這個(gè)階段主要任務(wù)有:( l)初始化本階段要使用的硬件設(shè)備;(2)檢測(cè)系統(tǒng)內(nèi)存映射;(3)將內(nèi)核映像和根文件系統(tǒng)從FLASH讀到RAM中;(4)為內(nèi)核設(shè)置啟動(dòng)參數(shù);(5)調(diào)用內(nèi)核文件運(yùn)行。本設(shè)計(jì)中的Bootloader采用Blob,Blob是Boot Loader Object的縮寫,是一款功能強(qiáng)大的Bootloader。Blob最初是由Jan-Derk Bakker和Erik Mouw兩人為一塊名為L(zhǎng)ART(Linux Advanced Radio Terminal)的開發(fā)板寫的,該板使用的
29、處理器是StrongARM SA-1100,現(xiàn)在Blob已經(jīng)被成功移植到許多基于ARM的CPU上了。本設(shè)計(jì)中的Intel Xcale就是采用Blob作為Bootloader8。3.3.2 Linux 內(nèi)核移植選用嵌入式Linux作為目標(biāo)機(jī)操作系統(tǒng),一方面由于Linux是一款免費(fèi)的操作系統(tǒng),能很好的降低成本,同時(shí)Linux的開發(fā)應(yīng)用現(xiàn)在已經(jīng)成為熱門,有大量的資源可用于學(xué)習(xí)與重復(fù)應(yīng)用,并且Linux系統(tǒng)具有良好的可移植性和可裁剪性,能自動(dòng)支持多任務(wù)管理。一般常用的GUI如QT/E,MiniGUI等都支持Linux。Linux的開發(fā)工具也都可以很方便的免費(fèi)獲得。系統(tǒng)采用的嵌入式Linux內(nèi)核為隨實(shí)驗(yàn)
30、平臺(tái)光盤中的Linux內(nèi)核,它是針對(duì)這套實(shí)驗(yàn)平臺(tái)所配置的Linux內(nèi)核,內(nèi)核版本為L(zhǎng)inux2.4.209。在實(shí)驗(yàn)過(guò)程中,只需要在這個(gè)內(nèi)核的基礎(chǔ)上進(jìn)行添加和刪減所需要和不需要的功能,編譯后就可以使用了。在編譯內(nèi)核之前,需要對(duì)內(nèi)核進(jìn)行必要的配置,通過(guò)虛擬機(jī)進(jìn)入/pxa270_linux/linux/目錄后在終端執(zhí)行make menuconfig10命令,就可以可視化的配置內(nèi)核需要的功能和要求,本次試驗(yàn),主要是針對(duì)視頻方面,選擇了對(duì)V4L的靜態(tài)加載、對(duì)spca5xx攝像頭驅(qū)動(dòng)的動(dòng)態(tài)加載,這樣就結(jié)束了對(duì)內(nèi)核的配置。編譯內(nèi)核需要?jiǎng)?chuàng)建內(nèi)核依賴關(guān)系、創(chuàng)建內(nèi)核鏡像文件和創(chuàng)建內(nèi)核模塊。首先執(zhí)行makedep命
31、令,讀取配置過(guò)程生成的配置文件,來(lái)創(chuàng)建對(duì)應(yīng)于配置的依賴關(guān)系樹,從而決定哪些需要編譯而哪些不需要;接著需要makeclean刪除前面步驟留下的文件,以避免出現(xiàn)一些錯(cuò)誤;然后便可以生成所需要的內(nèi)核文件了,用make zlmage來(lái)實(shí)現(xiàn)得到可移植的內(nèi)核。內(nèi)核文件通過(guò)并口下載線燒寫入開發(fā)板中,便可以通過(guò)BootLoader加載運(yùn)行。3.3.3 嵌入式文件系統(tǒng)嵌入式Linux操作系統(tǒng)一般采用FLASH作為存儲(chǔ)介質(zhì)。FLASH具有獨(dú)特的物理特性,所以必須使用專門的嵌入式文件系統(tǒng)。嵌入式系統(tǒng)對(duì)文件的操作是通過(guò)層次結(jié)構(gòu)實(shí)現(xiàn)的。對(duì)于用戶程序來(lái)說(shuō),文件是有結(jié)構(gòu)的文件,用戶程序通過(guò)對(duì)文件IO函數(shù)操作文件。嵌入式文件
32、系統(tǒng)是嵌入式操作系統(tǒng)的一部分,它的任務(wù)是對(duì)邏輯文件進(jìn)行管理,其工作包括提供對(duì)邏輯文件的操作(復(fù)制、刪除、修改等)接口,方便用戶操作文件和目錄。在文件系統(tǒng)內(nèi)部,根據(jù)存儲(chǔ)設(shè)備的特點(diǎn),使用不同的文件組織模式來(lái)實(shí)現(xiàn)文件的邏輯結(jié)構(gòu)。此外,文件系統(tǒng)要對(duì)管理文件的安全性負(fù)責(zé)。文件系統(tǒng)不能直接控制物理設(shè)備,它是通過(guò)FLASH驅(qū)動(dòng)實(shí)現(xiàn)控制的11。目前FLASH支持的文件系統(tǒng)技術(shù)主要有JFFS2,YAFFS2,TrueFFS,F(xiàn)TL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系統(tǒng)采用的是JFFS2文件系統(tǒng)。JFFS2文件系統(tǒng)是專門為NAND閃存設(shè)計(jì)的嵌入式文件系統(tǒng),根據(jù)NAND閃存以頁(yè)面為單位存取的特
33、點(diǎn),將文件組織成固定大小的數(shù)據(jù)段。利用NAND閃存提供的每個(gè)頁(yè)面16B的備用空間來(lái)存放ECC(ErrorCorrectionCode)和文件系統(tǒng)的組織信息、,不僅能夠?qū)崿F(xiàn)錯(cuò)誤檢測(cè)和壞塊處理,也能夠提高文件系統(tǒng)的加載速度。JFFS2采用一種多策略混合的垃圾回收算法,結(jié)合了貪心策略的高效性和隨機(jī)選擇的平均性,達(dá)到了兼顧損耗平均和系統(tǒng)開銷的目的。它是日志結(jié)構(gòu)的文件系統(tǒng),提供了損耗平衡和掉電保護(hù),可以有效地避免意外掉電對(duì)文件系統(tǒng)一致性和完整性的影響。JFFS2文件系統(tǒng)是按層次結(jié)構(gòu)設(shè)計(jì)的,分為文件系統(tǒng)管理層接口、JFFS2內(nèi)部實(shí)現(xiàn)層和NAND接口層,這樣就簡(jiǎn)化了其與系統(tǒng)的接口設(shè)計(jì),可以方便地集成到系統(tǒng)中
34、去。與YAFFS相比,它增加了一些功能,因此功能更強(qiáng)。3.4 Linux下的程序調(diào)試調(diào)試是程序開發(fā)過(guò)程中必不可少的一個(gè)重要環(huán)節(jié),通用PC機(jī)的程序調(diào)試與嵌入式操作系統(tǒng)的調(diào)試環(huán)境上有著明顯的區(qū)別,前者調(diào)試器和被調(diào)試的程序往往是運(yùn)行在同一臺(tái)機(jī)器上,是相同操作系統(tǒng)下的兩個(gè)不同的進(jìn)程,調(diào)試器通過(guò)操作系統(tǒng)專用調(diào)用接口控制被調(diào)試進(jìn)程,后者通常為遠(yuǎn)程調(diào)試,調(diào)試器一般運(yùn)行于桌面操作系統(tǒng)上,而被調(diào)試的程序則運(yùn)行在嵌入式系統(tǒng)之上,因此需要協(xié)調(diào)這兩個(gè)程序之間的通信。Linux下的調(diào)試工具非常的少,gdb是Linux下最著名的調(diào)試工具,它是GNUC自帶的調(diào)試工具,它可以使開發(fā)人員了解程序運(yùn)行的詳細(xì)細(xì)節(jié),從而消除程序的錯(cuò)
35、誤,達(dá)到調(diào)試的目的,gdb還具有遠(yuǎn)程調(diào)試功能,可以滿足嵌入式系統(tǒng)調(diào)試的要求,在調(diào)試過(guò)程中PC機(jī)也稱為宿主機(jī)和嵌入式系統(tǒng)通過(guò)串口協(xié)議或者TCP/IP協(xié)議連接起來(lái),遠(yuǎn)程主機(jī)上運(yùn)行被gdb規(guī)范斷點(diǎn)改造過(guò)的內(nèi)核,當(dāng)條件成立時(shí),斷點(diǎn)被激活,然后等待本地宿主機(jī)的連接命令,一旦連接成功,宿主機(jī)就可以向遠(yuǎn)程嵌入式系統(tǒng)發(fā)送調(diào)試命令了。在調(diào)試過(guò)程中g(shù)db通過(guò)調(diào)試stub來(lái)完成通信功能,調(diào)試stub是嵌入式操作系統(tǒng)中的一小段代碼,它提供了運(yùn)行g(shù)db的宿主機(jī)和嵌入式系統(tǒng)進(jìn)程之間交互的一個(gè)媒介。除了使用調(diào)試器外還可以直接在程序中使用printf()或printk打印函數(shù),這種方法功能比較弱,效率低下,但在內(nèi)核模塊調(diào)試時(shí)
36、這是唯一的方法。第4章 USB設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)4.1 設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介L(zhǎng)inux系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序扮演著特殊的角色。它就像一個(gè)獨(dú)立的黑盒子一樣,使某個(gè)特定的硬件可以相應(yīng)一個(gè)定義良好的內(nèi)部編程接口并且完成隱藏設(shè)備的作用。用戶只需調(diào)用一組標(biāo)準(zhǔn)化的函數(shù)完成操作,而且這些操作與特定的驅(qū)動(dòng)程序無(wú)關(guān)。驅(qū)動(dòng)程序的任務(wù)就是將這些函數(shù)映射到作用硬件的具體操作上。這樣的模塊化的驅(qū)動(dòng)程序結(jié)構(gòu)使得Linux系統(tǒng)中的驅(qū)動(dòng)程序可以獨(dú)立于內(nèi)核的其他部分,可以在需要使用的時(shí)候?qū)Ⅱ?qū)動(dòng)“插入”內(nèi)核。從系統(tǒng)運(yùn)行順序來(lái)看,硬件平臺(tái)啟動(dòng)運(yùn)行Linux后,啟用了MMU單元即內(nèi)存管理單元,在這種模式下系統(tǒng)不能直接對(duì)物理地址進(jìn)行訪問(wèn)。若要
37、對(duì)某一硬件外設(shè)進(jìn)行讀寫,需要通過(guò)內(nèi)核調(diào)用該硬件的驅(qū)動(dòng)來(lái)實(shí)現(xiàn)。上面已經(jīng)說(shuō)過(guò),驅(qū)動(dòng)程序的作用在于向應(yīng)用程序提供訪問(wèn)硬件設(shè)備的接口,驅(qū)動(dòng)程序屏蔽了硬件實(shí)現(xiàn)上的細(xì)節(jié)操作,于是應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。Linux以模塊的形式加載設(shè)備類型,通常是一個(gè)模塊對(duì)應(yīng)實(shí)現(xiàn)一個(gè)設(shè)備驅(qū)動(dòng)。模塊是內(nèi)核的一部分,它們沒(méi)有被編譯到內(nèi)核中,而是分別被編譯并鏈接成一組目標(biāo)文件??梢愿鶕?jù)用戶的需要在不需要對(duì)內(nèi)核進(jìn)行重新編譯的情況下動(dòng)態(tài)載入正在運(yùn)行的內(nèi)核,或從正在運(yùn)行的內(nèi)核中卸載。利用這種機(jī)制,內(nèi)核尺寸可以保持在最小,并具有最大的靈活性,也便于檢驗(yàn)新的內(nèi)核代碼,而不需要重新編譯內(nèi)核并重新引導(dǎo)。設(shè)備驅(qū)動(dòng)程序一般
38、需要完成以下功能:( l)對(duì)設(shè)備初始化和釋放;(2)把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);(3)讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序的請(qǐng)求數(shù)據(jù);(4)檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。在Linux操作系統(tǒng)下有兩類主要設(shè)備文件類型:塊設(shè)備、字符設(shè)備。用戶進(jìn)程正是通過(guò)設(shè)備文件來(lái)與硬件打交道。每個(gè)設(shè)備文件都有其文件屬性,表示是字符設(shè)備還是塊設(shè)備。另外每個(gè)文件都有2個(gè)設(shè)備號(hào),第一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序;第二個(gè)是從設(shè)備號(hào),標(biāo)識(shí)使用同一個(gè)設(shè)備驅(qū)動(dòng)程序的不同硬件設(shè)備。設(shè)備文件的主設(shè)備號(hào)必須與設(shè)備驅(qū)動(dòng)程序在登記時(shí)申請(qǐng)的設(shè)備號(hào)一致,否則用戶進(jìn)程將無(wú)法訪問(wèn)驅(qū)動(dòng)程序。Linux驅(qū)動(dòng)程序可以分為三個(gè)主要部分:
39、( l)自動(dòng)配置和初始化子程序,負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和能否正常工作。如果該設(shè)備正常,則對(duì)這個(gè)設(shè)備及其他必需的條件位口中斷、DMA通道)進(jìn)行申一請(qǐng)并初始化。這部分驅(qū)動(dòng)程序僅在初始化時(shí)被調(diào)用一次。(2)服務(wù)于I/O請(qǐng)求的子程序,又稱為驅(qū)動(dòng)程序的上半部分。調(diào)用這部分程序是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行時(shí),系統(tǒng)仍認(rèn)為是與進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)變成了核心態(tài),但仍具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因而可以在其中調(diào)用與進(jìn)程運(yùn)行環(huán)境相關(guān)的函數(shù)。(3)中斷服務(wù)子程序,又稱為驅(qū)動(dòng)程序的下半部分。在Linux操作系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動(dòng)程序的中斷服務(wù)
40、子程序,而是由Linux系統(tǒng)來(lái)接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以在任何一個(gè)進(jìn)程運(yùn)行時(shí)產(chǎn)生,因而在中斷服務(wù)子程序被調(diào)用時(shí),不能依賴于任何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動(dòng)程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序時(shí),都帶有一個(gè)或多個(gè)參數(shù),以唯一標(biāo)識(shí)請(qǐng)求服務(wù)的設(shè)備。在系統(tǒng)內(nèi)部,I/O設(shè)備的存取通過(guò)設(shè)備驅(qū)動(dòng)程序提供的一組固定的入口點(diǎn)來(lái)進(jìn)行,這組入口點(diǎn)在驅(qū)動(dòng)程序初始化時(shí)向系統(tǒng)進(jìn)行登記,以便在系統(tǒng)適當(dāng)?shù)臅r(shí)候調(diào)用。一般來(lái)說(shuō),字符型設(shè)備驅(qū)動(dòng)程序能夠提供如下幾個(gè)入口點(diǎn):(1)open入口點(diǎn):打開設(shè)備準(zhǔn)備I/O操作,對(duì)字符特別設(shè)備進(jìn)行打開操作
41、,都會(huì)調(diào)用設(shè)備的open入口點(diǎn)。open子程序必須對(duì)將要進(jìn)行的I/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時(shí)刻只能有一個(gè)程序訪問(wèn)此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備的狀態(tài)。(2)close入口點(diǎn):關(guān)閉一個(gè)設(shè)備,當(dāng)最后一次使用設(shè)備結(jié)束后,調(diào)用dose子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。(3)read入口點(diǎn):讀取設(shè)備,對(duì)于有緩沖區(qū)的I/0操作,一般從緩沖區(qū)里讀取設(shè)備數(shù)據(jù)。(4)write入口點(diǎn):向設(shè)備寫數(shù)據(jù),對(duì)于有緩沖區(qū)的I/O操作,一般向緩沖區(qū)里寫入數(shù)據(jù)。(5)ioctl入口點(diǎn):執(zhí)行讀寫之外的操作。USB(Universal Serial Bus)即“
42、通用串行外部總線”,用途廣泛,可以外接硬盤、鍵盤、鼠標(biāo)、打印機(jī)等多種設(shè)備,USB能夠使用盡可能少的接口支持盡可能多的外設(shè),尤為適合在嵌入式設(shè)備中使用,是嵌入式接口標(biāo)準(zhǔn)的一個(gè)很好的選擇。USB總線規(guī)范有1.1版和2.0版。USB1.1支持兩種傳輸速率:低速1.5Mbit/s、全速12Mbit/s,這樣的速率完全滿足鼠標(biāo)、鍵盤、CD-ROM等設(shè)備,但是在嵌入式視頻監(jiān)控系統(tǒng)中,這樣的速度還是很慢。所以,USB2.0提供了一種更好的傳輸速率:高速,它可以達(dá)到480Mbit/s。USB2.0向下兼容USB1.1,可以將遵循USB1.1規(guī)范的設(shè)備連接到USB2.0控制器上,也可以把USB2.0的設(shè)備鏈接到
43、USB1.1控制器上。USB總線的硬件拓?fù)浣Y(jié)構(gòu)12如圖4.1所示。圖4.1 USB總線硬件拓?fù)鋱DUSB主機(jī)控制器通過(guò)根集線器與其他USB設(shè)備相連。集線器也屬于USB設(shè)備,通過(guò)它可以在一個(gè)USB接口上擴(kuò)展出多個(gè)接口。除根集線器外,最多可以層疊5個(gè)集線器,每條USB電纜的最大長(zhǎng)度是5m,所以USB總線的最大距離為30m。一條USB總線上可以外接127個(gè)設(shè)備,包括根集線器和其他集線器。整個(gè)結(jié)構(gòu)圖是一個(gè)星狀結(jié)構(gòu),一條USB總線上所有設(shè)備共享一條通往主機(jī)的數(shù)據(jù)通道,同一時(shí)刻只能有一個(gè)設(shè)備與主機(jī)通信。通過(guò)USB主機(jī)控制器來(lái)管理外接的USB設(shè)備,USB主機(jī)控制器共分3種:UHCI、OHCI和EHCI。在配置
44、Linux內(nèi)核的時(shí)候,看到的“HCD”字樣表示“Host Controller Drivers”,即主機(jī)控制器驅(qū)動(dòng)程序。USB驅(qū)動(dòng)程序分為兩類:USB主機(jī)控制器驅(qū)動(dòng)程序(Host Controller Drivers)、USB設(shè)備驅(qū)動(dòng)程序(USB device drivers)。它們?cè)趦?nèi)核中的層次如圖4.2所示。圖4.2 USB驅(qū)動(dòng)程序?qū)哟谓Y(jié)構(gòu)在試驗(yàn)中,教學(xué)平臺(tái)上的Linux嵌入式內(nèi)核已經(jīng)配置了USB主機(jī)控制器驅(qū)動(dòng)程序,只需要添加需要的USB設(shè)備驅(qū)動(dòng)程序,就能實(shí)現(xiàn)USB設(shè)備的正常使用。4.2 Linux下驅(qū)動(dòng)程序的實(shí)現(xiàn)Linux操作系統(tǒng)下對(duì)硬件設(shè)備進(jìn)行驅(qū)動(dòng)開發(fā)的一般步驟如下:(l)注冊(cè)設(shè)備在系
45、統(tǒng)啟動(dòng)時(shí)或者在模塊加載的時(shí)候需要將設(shè)備和重要的數(shù)據(jù)結(jié)構(gòu)登記到內(nèi)核的設(shè)備數(shù)組中,并確定該設(shè)備的主次設(shè)備號(hào)。在Linux系統(tǒng)中,對(duì)于字符設(shè)備一般通過(guò)調(diào)用register_chrdev向系統(tǒng)注冊(cè)設(shè)備驅(qū)動(dòng)程序,register_chrdev在fs/deviees.c文件中的定義如下:int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定義中的major是設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果major為O,則系統(tǒng)為該驅(qū)動(dòng)程序動(dòng)態(tài)的分配一個(gè)主設(shè)備號(hào),不過(guò)此設(shè)備號(hào)是臨時(shí)的;name是設(shè)備名:f
46、ops是各個(gè)調(diào)用入口點(diǎn)的說(shuō)明。函數(shù)返回O表示注冊(cè)成功,返回-INVAL表示申請(qǐng)的主設(shè)備號(hào)非法,返回-EBUSY表示申請(qǐng)的主設(shè)備號(hào)正在被其它設(shè)備驅(qū)動(dòng)程序使用。以后對(duì)設(shè)備驅(qū)動(dòng)程序的file_operations的操作都可以通過(guò)該主設(shè)備號(hào)的索引來(lái)完成。register_chrdev函數(shù)操作成功后,設(shè)備名便出現(xiàn)在/proc/devices文件目錄中,使用命令cat/proc/devices可以查看設(shè)備的工作狀態(tài)。(2)定義操作集驅(qū)動(dòng)程序中要通過(guò)一系列函數(shù)完成對(duì)設(shè)備的不同操作,這些操作在面向?qū)ο缶幊绦g(shù)語(yǔ)中也稱為方法,該操作集通過(guò)數(shù)據(jù)結(jié)構(gòu)file_operations實(shí)現(xiàn)。內(nèi)核內(nèi)部通過(guò)file結(jié)構(gòu)識(shí)別設(shè)備
47、,通過(guò)file_operations數(shù)據(jù)結(jié)構(gòu)提供的文件系統(tǒng)的入口點(diǎn)函數(shù)訪問(wèn)設(shè)備。file_operations定義在<linux/fs.h>中的函數(shù)指針表: struct file_operations struct module*owner; loff_t (*llseek) (struct file*, loff_t, int); ssize_t (*read) (struct file*, size_t, loff_t*); ssize_t (*write) (struct file*, const char*, size_t, loff_t*); int (*readdir
48、) (struct file*, void*, filldir_t*); unsigned int (*poll) (struct file*, struct poll_table_struct*); int (*ioctl) (struct inode*, struct file*, unsigned int, unsigned long); int (*mmap) (struct file*, struct vm_area_struct*); int (*open) (struct inode*, struct file*); int (*flush) (struct file*); in
49、t (*release) (struct inode*, struct file*); int (*fsync) (struct file*, struct dentry*, int datasync);int (*fsyne) (int, struct file*, int); int (*lock) (struct file*,int, struct file_lock*); ssize_t (*readv) (struct file*, const struct iovec*, unsigned long, loff_t*); ssize_t (*writev) (struct file
50、*, const struct iovec*, unsigned long, loff_t*); ssize_t (*sendpage) (struct file*, struct page*, int, size_t, loff_t*, int); unsigned long (*get_unmapped_area) (struct file*, unsigned long, unsigned long, unsigned long, unsigned long);這個(gè)結(jié)構(gòu)的每一個(gè)成員的名字對(duì)應(yīng)一個(gè)系統(tǒng)調(diào)用,在用戶程序利用系統(tǒng)調(diào)用對(duì)設(shè)備文件進(jìn)行諸如讀/寫操作時(shí),系統(tǒng)調(diào)用會(huì)通過(guò)設(shè)備文件的主設(shè)備
51、號(hào)找到相應(yīng)的驅(qū)動(dòng)程序,然后讀取這個(gè)數(shù)據(jù)結(jié)構(gòu)的相應(yīng)函數(shù)指針,把控制權(quán)交給該函數(shù)。對(duì)于具體的設(shè)備驅(qū)動(dòng)并不需要實(shí)現(xiàn)結(jié)構(gòu)中所有的例程,只要完成設(shè)備功能就可以了。例如對(duì)于一個(gè)常見(jiàn)的字符設(shè)備驅(qū)動(dòng)來(lái)說(shuō),可能只有操作open(),write(),read(),ioctl()和close(),當(dāng)用戶程序通過(guò)系統(tǒng)調(diào)用訪問(wèn)設(shè)備時(shí),最終要通過(guò)這些操作集來(lái)完成。(3)卸載模塊當(dāng)不再需要使用一個(gè)模塊或設(shè)備時(shí),需要將其從內(nèi)核中卸載下來(lái),這時(shí)會(huì)動(dòng)態(tài)調(diào)用模塊中的module_exit()函數(shù),并需要在該函數(shù)中調(diào)用modul_unregister_chrdev()或module_unregister_blkdev()釋放掛入內(nèi)核
52、的數(shù)據(jù)結(jié)構(gòu)同時(shí)釋放該設(shè)備號(hào)。4.3 USB攝像頭驅(qū)動(dòng)程序設(shè)計(jì)攝像頭屬于視頻設(shè)備,在Linux內(nèi)核中,VideoforLinux(簡(jiǎn)稱V4L)是關(guān)于視頻設(shè)備的驅(qū)動(dòng)標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)為應(yīng)用程序定義了一系列的接口函數(shù),內(nèi)核、驅(qū)動(dòng)和應(yīng)用程序都是依靠這個(gè)標(biāo)準(zhǔn)來(lái)進(jìn)行交流。本系統(tǒng)所使用的USB攝像頭正是基于該標(biāo)準(zhǔn)來(lái)編寫驅(qū)動(dòng)和應(yīng)用程序的。Linux內(nèi)核是依據(jù)設(shè)備號(hào)來(lái)操作設(shè)備文件的,在內(nèi)核中,攝像頭對(duì)應(yīng)的設(shè)備文件名為/dev/video0,主設(shè)備號(hào)是81,次設(shè)備號(hào)根據(jù)攝像頭數(shù)目來(lái)確定,本系統(tǒng)中僅使用一個(gè)攝像頭,所以可以通過(guò)mknod/dev/video0 c 81 0來(lái)創(chuàng)建節(jié)點(diǎn)。USB攝像頭驅(qū)動(dòng)程序?qū)崿F(xiàn)原理如圖4.
53、3所示。USB攝像頭的驅(qū)動(dòng)和通用設(shè)備的驅(qū)動(dòng)準(zhǔn)則一樣,但需要與內(nèi)核提供的視頻驅(qū)動(dòng)掛鉤。即首先在驅(qū)動(dòng)中聲明一個(gè) video_device結(jié)構(gòu),并為其指定文件操作函數(shù)指針數(shù)組fops,向系統(tǒng)注冊(cè)。在應(yīng)用程序發(fā)出文件操作的相關(guān)命令時(shí),核心根據(jù)這些指針調(diào)用相應(yīng)函數(shù),并將該結(jié)構(gòu)作為參數(shù)傳遞給它們。這樣,就完成了驅(qū)動(dòng)和核心之間的通信。例如:Static struct video_devie vdev_template=;聲明 video_deviee,指出掛接驅(qū)動(dòng)圖4.3 攝像頭驅(qū)動(dòng)實(shí)現(xiàn)框圖Static Struct file_operation spcasxx_fops= ;聲明本驅(qū)動(dòng)的文件操作函數(shù)指針S
54、truct video_device*vdev=video_devdata (file);從文件指針中提取出 video_deviee結(jié)構(gòu)在video_deviee結(jié)構(gòu)中,有一個(gè)私有指針priv,可以將它指向一塊保留內(nèi)存。在這塊內(nèi)存中,保存著本驅(qū)動(dòng)、本設(shè)備的相關(guān)初始化信息。這塊內(nèi)存的申請(qǐng)、初始化、指針指向等工作都是在USB驅(qū)動(dòng)的枚舉函數(shù)probe中完成。這樣,在枚舉函數(shù)將控制權(quán)返還給系統(tǒng)后,因?yàn)閮?nèi)核不銷毀保留內(nèi)存,所以驅(qū)動(dòng)仍然保留著自己的信息。在驅(qū)動(dòng)卸載函數(shù)中需要將申請(qǐng)的各塊內(nèi)存全部釋放。Linux系統(tǒng)中任何USB傳輸都通過(guò)URB實(shí)現(xiàn)。為提高速度,可以考慮擴(kuò)大URB的緩沖,這樣可以降低每個(gè)US
55、B事務(wù)中握手信息所占比例,提高有效數(shù)據(jù)的輸速度。但是受限于總線帶寬和具體的USB設(shè)備芯片,單純擴(kuò)大URB的緩沖不能無(wú)限制地解決問(wèn)題。USB在操作系統(tǒng)中每次傳輸都要包括URB的建立、發(fā)出、回收、數(shù)據(jù)整理等階段,這些時(shí)間不產(chǎn)生有效數(shù)據(jù)。因此可以建立兩個(gè)URB,在等待一個(gè)URB被回收時(shí),也就是圖像正在被傳感器采集時(shí),處理、初始化另一個(gè)URB,并在回收后立刻將其發(fā)出。兩個(gè)URB交替使用,大大減少了額外時(shí)間。 由于嵌入式平臺(tái)上運(yùn)行的Linux2.4.20內(nèi)核,內(nèi)部已經(jīng)集成了對(duì)USB2.0的支持,所以無(wú)需移植相應(yīng)的USB驅(qū)動(dòng)。在設(shè)計(jì)中,攝像頭芯片采用中星微的Z301系列芯片,Linux2.4內(nèi)核并不支持這
56、種芯片,所以我們通過(guò)移植芯片驅(qū)動(dòng)程序來(lái)達(dá)到目的。芯片的驅(qū)動(dòng)程序是spca5*系列,如果不重新編譯內(nèi)核的話,將驅(qū)動(dòng)程序動(dòng)態(tài)加載就可以正常使用。設(shè)計(jì)中動(dòng)態(tài)加載的命令使用insmod命令,它和modprobe命令在使用上有所不同,modprobe在加載模塊時(shí)不用指定模塊文件的絕對(duì)路徑,也不用帶模塊文件的后綴.o或.ko;而insmod需要的是模塊的所在目錄的絕對(duì)路徑,并且一定要帶有模塊文件名后綴的.o或者.ko。但是在功能上,它們所達(dá)到的效果基本相同13。第5章 視頻采集功能的設(shè)計(jì)視頻采集程序是基于V4L開發(fā)的,包括攝像頭的初始化、打開/關(guān)閉、參數(shù)設(shè)置和數(shù)據(jù)讀取等操作,視頻采集程序流程圖如圖5.1所
57、示14。圖5.1 視頻采集程序流程圖5.1 基于V4L的編程5.1.1 攝像頭相關(guān)數(shù)據(jù)結(jié)構(gòu)攝像頭的組成部分是傳感器、DSP、鏡頭、外殼、USB連線、電路板和周邊電路構(gòu)成,其中最重要的是傳感器和DSP(數(shù)字信號(hào)處理器)。本系統(tǒng)選用的攝像頭采用了CMOS傳感器和中星微301處理器。V4L15提供了一系列的接口應(yīng)用程序,可以利用這些程序?qū)崿F(xiàn)對(duì)攝像頭的調(diào)用,其中有read、open、ioctl等。V4l同時(shí)將這些函數(shù)和參數(shù)封裝成一個(gè)數(shù)據(jù)結(jié)構(gòu)vdIn。struct vdInint fd;char *videodevice ;struct video_mmap vmmap;struct video_capability videocap;int mmapsize;struct video_mbuf videombuf;struct video_picture videopict;struct video_window videowin;struct video_channel videochan;struct video_param video
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度美容美發(fā)服務(wù)個(gè)人代理合同4篇
- 二零二五年度企業(yè)債權(quán)轉(zhuǎn)讓與債務(wù)轉(zhuǎn)移合同
- 2025年度大型建筑鋼材項(xiàng)目集中采購(gòu)合同
- 2024年銷售人員業(yè)績(jī)合同2篇
- 2025年度個(gè)人二手房買賣協(xié)議書范本:二手房交易法律咨詢合同
- 2025年度內(nèi)部員工股權(quán)激勵(lì)計(jì)劃變更與股權(quán)轉(zhuǎn)讓合同
- 二零二五年度奶粉行業(yè)市場(chǎng)分析報(bào)告定制合同
- 二零二五年度培訓(xùn)中心教師教學(xué)資源共享聘用合同
- 2025年度私人旅行規(guī)劃服務(wù)合同2篇
- 2025版抹灰班組安全生產(chǎn)責(zé)任制考核合同4篇
- 基因突變和基因重組(第1課時(shí))高一下學(xué)期生物人教版(2019)必修2
- 內(nèi)科學(xué)(醫(yī)學(xué)高級(jí)):風(fēng)濕性疾病試題及答案(強(qiáng)化練習(xí))
- 音樂(lè)劇好看智慧樹知到期末考試答案2024年
- 辦公設(shè)備(電腦、一體機(jī)、投影機(jī)等)采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 查干淖爾一號(hào)井環(huán)評(píng)
- 案卷評(píng)查培訓(xùn)課件模板
- 2024年江蘇省樣卷五年級(jí)數(shù)學(xué)上冊(cè)期末試卷及答案
- 人教版初中英語(yǔ)七八九全部單詞(打印版)
- 波浪理論要點(diǎn)圖解完美版
- 金融交易數(shù)據(jù)分析與風(fēng)險(xiǎn)評(píng)估項(xiàng)目環(huán)境敏感性分析
- 牛頓環(huán)與劈尖實(shí)驗(yàn)論文
評(píng)論
0/150
提交評(píng)論