




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGE\*ROMANPAGE\*ROMANII題目:基于嵌入式系統(tǒng)的圖像采集系統(tǒng)一、主要內(nèi)容和基本要求式系統(tǒng)為核心的圖像采集系統(tǒng),具有一定的通用性.基本要求:設(shè)計(jì)系統(tǒng)的總體方案.設(shè)計(jì)圖像傳感器與嵌入式系統(tǒng)的接口.設(shè)計(jì)圖像采集和存儲(chǔ)的軟件.部分實(shí)驗(yàn)及調(diào)試.撰寫畢業(yè)設(shè)計(jì)論文,答辯.二、主要參考資料方彥軍.嵌入式系統(tǒng)原理與設(shè)計(jì),國防工業(yè)出版社2011.72011.7)(ElahiA.).網(wǎng)絡(luò)通信技術(shù),科學(xué)出版社,2007.12任哲.嵌入式實(shí)時(shí)操作系統(tǒng) uC/OS-II原理及應(yīng)用(第2版),北京航空航天大學(xué)出社.2009.10張綺文.解書剛.ARM嵌入式常用模塊與綜合系統(tǒng)設(shè)計(jì)實(shí)例精講(第 2版),電子工業(yè)出社.2008.102007.8三、進(jìn)度要求17周-18周:根據(jù)本課題的具體設(shè)計(jì)任務(wù),熟悉課題,收集相關(guān)資料,進(jìn)行調(diào)研和分析.19周-20周:確定總體方案.撰寫并完善開題報(bào)告,進(jìn)行開題答辯.01-04設(shè)計(jì)圖像傳感器與嵌入式系統(tǒng)的接口.05周-08周:嵌入式圖像采集系統(tǒng)的軟件設(shè)計(jì).設(shè)計(jì)圖像采集和存儲(chǔ)的軟件.09周-10周:實(shí)驗(yàn)及調(diào)試.11周-13周:總結(jié)畢業(yè)設(shè)計(jì)階段的工作,撰寫畢設(shè)論文,畢業(yè)設(shè)計(jì)答辯.指導(dǎo)教師:專業(yè)負(fù)責(zé)人/系主任:
(簽字)(簽字)PAGE\*ROMANPAGE\*ROMANVI摘 要Linux是個(gè)開源的操作系統(tǒng),由于其源代碼開源、內(nèi)核功能強(qiáng)大、安全性高、支持的硬件平臺(tái)多等特點(diǎn),linux在嵌入式系統(tǒng)和服務(wù)器上中得到了極其廣泛的應(yīng)用,Linux也是當(dāng)前最熱門的嵌入式操作系統(tǒng),嵌入式市場占有率最高 .近幾年,隨著androidlinuxlinuxlinux用到更廣泛的領(lǐng)域.將Linux內(nèi)核應(yīng)用到一個(gè)特定的嵌入式圖像采集系統(tǒng)首要的工作就是Linux移植和驅(qū)動(dòng)開發(fā).這部分工作完成后,就為上層應(yīng)用程序的開發(fā)屏蔽了硬件平臺(tái)的復(fù)雜性與多樣性,極大提高了產(chǎn)品開發(fā)的效率.FL2440平臺(tái),以完成一個(gè)嵌入式圖像采集系統(tǒng)為目標(biāo),該平臺(tái)S3C2440ALinux2.6.12版本內(nèi)核,涉及的工作主要linuxUSB客戶端編寫.畢業(yè)設(shè)計(jì)論文的主要內(nèi)容為:1linuxusblinuxlinux驅(qū)動(dòng)代碼的方法,并移植開源的gspca驅(qū)動(dòng)到內(nèi)核中.2linux(v4L)tcp/iptcp/ip的圖像傳輸程序(服務(wù)器端).3、在UbuntuLinuxPC上編寫客戶端,利用SDL顯示圖像.關(guān)鍵詞:ARM9 Linux嵌入式視頻監(jiān)控 USB驅(qū)動(dòng) V4LAbstractLinuxisanopensourceoperatingsystem,andwiththecharacterofopensourcecode,powerfulkernel,safe,supportingmorehardwareplatforms,Linuxgetaverywiderangeofapplicationsinembeddedsystemsandserver.Linuxiscurrentlythemostpopularembeddedoperatingsystems,andhasthehighestmarketshare.Inrecentyears,withtheandroidrising,commerciallinuxmarketisgrowing,Manylargecompaniestodevelopanewoperatingsystemonthebasisofthelinuxkernelandtrytouseitinwiderareas.LinuxsystemportinganddriverdevelopmentistheprimaryworktoapplyLinuxkerneltoaparticularembeddedimageacquisitionsystem.Whenthispartoftheworkiscompleted,thekernelwillshieldthecomplexityanddiversityofthehardwareplatformfortheupperlayerapplicationdevelopment,greatlyincreasetheefficiencyofproductdevelopment.ThisgraduationdesignuseFL2440platform,inordertocompletetheembeddedvideomonitoringsystemasthegoal,theplatformusingtheSamsungS3C2440AchipselectingLinux2.6.12versionofthekernel,theworkinvolvedinthelinuxUSBdrivetransplant,thedataacquisitionprogramusedtosendthevideocommunicationserversideandclientdatareceivingprogramming.Themaincontentofthegraduatedesignthesisasfollows:Studylinuxkernelusbdrivermodel,giventhestructuresofembeddeddevelopmentenvironmentandthepreparationofthelinuxdrivercode.Studylinuxserver-sidedatacollectionprograminterface(v4L,)andtcp/ipprotocolinterface,writethetopofthedatacollectionproceduresandtcp/ip-basedimagetransmissionprogram(serverside).WritingtheclientonUbuntuLinuxPCwithSDLlibrarytodisplayimages.Keywords:ARM9 Linux EmbeddedVideoMonitorUSBDriver目 錄摘 要 ⅢAbstract Ⅳ引 言 1概述 2課題任務(wù)與目的 2課題任務(wù) 2課題目的 2總體方案設(shè)計(jì) 3系統(tǒng)的總體方案設(shè)計(jì) 3硬件設(shè)計(jì) 3軟件設(shè)計(jì) 4嵌入式Arm-Linux交叉開發(fā)環(huán)境的配置 7交叉開發(fā)環(huán)境概述 7GNU工具鏈 7交叉編譯工具鏈 7交叉編譯相關(guān)工具 7交叉編譯的構(gòu)建 8系統(tǒng)硬件平臺(tái)配置 9ARM9處理器介紹 9USB攝像頭原理 11LinuxUSB驅(qū)動(dòng)程序 14Linux驅(qū)動(dòng)程序 14設(shè)備驅(qū)動(dòng)的簡介 14設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu) 15linux設(shè)備模型 18LinuxUSB驅(qū)動(dòng) 22usb協(xié)議 22內(nèi)核中的USB框架 24usb驅(qū)動(dòng)程序設(shè)計(jì) 26內(nèi)核、文件系統(tǒng)及驅(qū)動(dòng)移植 28USB攝像頭設(shè)備驅(qū)動(dòng)移植 28Linux文件系統(tǒng)移植 30嵌入式圖像采集系統(tǒng)的服務(wù)器端 31LinuxV4L視頻采集 31LinuxV4L視頻采集編程接口分析 31服務(wù)器端視頻采集程序 33Linux網(wǎng)絡(luò)編程 38linux套接字編程API 38linux多線程API和線程間的通信方式 44服務(wù)器端程序 46圖像采集系統(tǒng)的客戶端程序 48SDL庫 48客戶端程序 50結(jié) 論 53致 謝 54參考文獻(xiàn) 55PAGEPAGE10引 言1、研究背景與意義pad上網(wǎng)本等設(shè)備的大眾化,電子產(chǎn)品的微型化和專業(yè)化成為潮流,嵌入式產(chǎn)品日漸成為IT產(chǎn)業(yè)的中流砥柱.Linux1991年產(chǎn)生到現(xiàn)在,二十X86AlphaSparcMIPSPPCMotorolaNECARMwindows競爭.目前,Linux.[1]pc在嵌入式市場的大作為也吸引了許多大公司、科研單位和高校進(jìn)行研究.嵌入式Linux.Linux.視頻監(jiān)測系統(tǒng)其直觀、方便、信息內(nèi)容豐富而被廣泛應(yīng)用于許多重要場合,成為監(jiān)控的主要手段.監(jiān)控系統(tǒng)作為現(xiàn)代企業(yè)不可或缺的重要免安全隱患,提高工作效率.[2]2、本畢業(yè)設(shè)計(jì)論文的主要工作FL2440linux2.6.12usb圖像的采集,編碼,傳輸和保存,最終初步實(shí)現(xiàn)一個(gè)視頻監(jiān)控系統(tǒng).5linuxusblinux序的編寫,linux客戶端pc的程序編寫.Linuxlinux的開源特性,linuxlinux.linuxUSBusBlinuxcqt都有深入的理解和掌握.概述課題任務(wù)與目的課題任務(wù)題目設(shè)計(jì)以嵌入式系統(tǒng)為核心的圖像采集系統(tǒng),具有一定的通用性.基本要求:設(shè)計(jì)系統(tǒng)的總體方案.設(shè)計(jì)圖像傳感器與嵌入式系統(tǒng)的接口.設(shè)計(jì)圖像采集和存儲(chǔ)的軟件.部分實(shí)驗(yàn)及調(diào)試.撰寫畢業(yè)設(shè)計(jì)論文,答辯.課題目的在當(dāng)前的數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展的后pc時(shí)代,嵌入式系統(tǒng)已經(jīng)廣泛的滲透到科學(xué)研究、工程設(shè)計(jì)、軍事技術(shù)以及人們生活的各個(gè)方面之中..它一般由嵌入式操功能.[3]及到大眾生活各個(gè)角落,像MP3,手機(jī),上網(wǎng)本等娛樂設(shè)備,智能家電、車載導(dǎo)航儀.PC..近年來,隨著網(wǎng)絡(luò)通信以及圖像處理技術(shù)的飛速發(fā)展,視頻監(jiān)測技術(shù)也有了長足的進(jìn)步.Linux對(duì)于本畢設(shè)的研究,結(jié)合了arm9.本人通過本畢總體方案設(shè)計(jì)系統(tǒng)的總體方案設(shè)計(jì)整個(gè)系統(tǒng)由硬件和軟件兩部分組成.usbPC等組成.軟件部分由linux2.6.12gspcausb攝像頭、有線網(wǎng)卡驅(qū)動(dòng)以v4l采集程序、服務(wù)器端和客戶端程序等構(gòu)成.2-1所示.usbDSPJPEGusbjpeglinuxpc對(duì)圖像進(jìn)行顯示.USBUSB攝像頭以太網(wǎng)卡軟件層文件系統(tǒng)攝像頭驅(qū)動(dòng)以太局域網(wǎng)網(wǎng)卡驅(qū)動(dòng)監(jiān)控PCLinux內(nèi)核硬件層ARM平臺(tái)硬件設(shè)計(jì)
2-1總系統(tǒng)構(gòu)成FL2440USBUSB傳輸?shù)街靼?IEEE802.3x以太局域網(wǎng)標(biāo)準(zhǔn),對(duì)數(shù)據(jù)進(jìn)行發(fā)送和接收.RS232串口把宿主機(jī)和開發(fā)板連接起來,主要用作調(diào)試和通信使用.2所示.宿主機(jī)宿主機(jī)RS232接口FlashSDRAMARM920T監(jiān) 控以太網(wǎng)接口USB接口攝像頭電腦FL2440⑴主控制板
圖2-2 系統(tǒng)硬件圖S3C2440ASOC;內(nèi)置的ARM920T內(nèi)核32RISCS3C2440,主頻最高可達(dá)400MHz,可以完成JPEG.FL2440對(duì)S3C2440A進(jìn)行了擴(kuò)充,其外設(shè)資源包括NANDFlash、64MBSDRAMUSB等接口電路.⑵ 數(shù)字?jǐn)z像頭ZC301PHUSBA/DDSPJPEG640×480160X120.軟件設(shè)計(jì)ubuntuLinuxpcLinux的環(huán)境,然后才可以調(diào)試、編譯和運(yùn)行應(yīng)用程序.⑴ Linux環(huán)境的建立FL2440Linuxboot-loader,kernel,yaffs板.⑶ Usb攝像頭驅(qū)動(dòng)和網(wǎng)卡驅(qū)動(dòng)的移植將開發(fā)板自帶的有線網(wǎng)卡驅(qū)動(dòng)源代碼以及在網(wǎng)上將萬能usb攝像頭驅(qū)動(dòng)程序源代碼gspcawebcamdrivers下載下來,gspcawebcamdrivers是linux下攝像頭支持的最廣泛的一個(gè)驅(qū)動(dòng),這是由一個(gè)法國醫(yī)生(http://mxhaard.free.fr/)所設(shè)計(jì)編寫的開源驅(qū)FL2440Kconfig,Makefilemakemenuconfig面,選擇模塊的方式,重新編譯內(nèi)核,最終得到它們相應(yīng)的驅(qū)動(dòng)(.ko文件).gspca驅(qū)動(dòng)加進(jìn)內(nèi)核中,此方法較簡單.⑷基于V4L的視頻采集程序開始加載驅(qū)動(dòng)內(nèi)存映射或直接讀取打開攝像頭獲取視頻數(shù)據(jù)讀取設(shè)備信息否設(shè)置設(shè)備信息采集完成是選擇采集方式關(guān)閉攝像頭結(jié)束視頻采集是整個(gè)視頻采集模塊的核心.Video4Linux(V4L)Linux開始加載驅(qū)動(dòng)內(nèi)存映射或直接讀取打開攝像頭獲取視頻數(shù)據(jù)讀取設(shè)備信息否設(shè)置設(shè)備信息采集完成是選擇采集方式關(guān)閉攝像頭結(jié)束⑷網(wǎng)絡(luò)傳輸程序
圖2-3 視頻采集流程圖802.3x54MbpsFL2440100Mbps的數(shù)據(jù)流.TCP/IP協(xié)議基于線程對(duì)數(shù)據(jù)進(jìn)行無線傳輸.整體程序分為服務(wù)器端和客戶端.通信流程如圖2-4所示.服務(wù)器端服務(wù)器端開始采集區(qū)視頻緩沖區(qū)無客戶端有用戶需要嗎有接收并放入接收緩沖區(qū)網(wǎng)絡(luò)緩沖區(qū)解壓縮發(fā)送給相關(guān)用戶接收緩沖器顯示結(jié)束圖2-4 網(wǎng)絡(luò)傳輸流程圖pthread_create()server_thsocket()字,用bind()函數(shù)綁定端地址與和套接字,用listen().而此時(shí),服務(wù)器的狀態(tài)從closelisten監(jiān)聽狀態(tài).PCsocket()connect()函數(shù)連接服務(wù)器端.TCP將圖像數(shù)據(jù)發(fā)送給客戶端程序.客戶端程序通過接收?qǐng)D像,把數(shù)據(jù)存放在數(shù)據(jù)緩沖區(qū)PC上.Arm-Linux交叉開發(fā)環(huán)境的配置交叉開發(fā)環(huán)境概述嵌入式系統(tǒng)的開發(fā)環(huán)境和通用計(jì)算機(jī)是大不相同的,從硬件資源上說它有很大的局限性,比如存儲(chǔ)空間小,處理器頻率低,沒有鍵盤和鼠標(biāo)等設(shè)備,這限制了已有的開發(fā)工具的在其上的使用.除此之外,硬件資源的局限性會(huì)給嵌入式軟件帶來一定的約束,比如內(nèi)存的使用.經(jīng)過的嵌入式開發(fā)人員的長期探索,提出了一中方便和有效的開發(fā)模式,即宿主機(jī)--目標(biāo)板交叉開發(fā)環(huán)境模式.宿主機(jī)--目標(biāo)板交叉開發(fā)環(huán)境模式主要有兩部分組成:一是宿主機(jī),就是平時(shí)使用的桌面計(jì)算機(jī).二是目標(biāo)板,指的是嵌入式開發(fā)板.通過交叉開發(fā)環(huán)境的方式,在宿Linux系統(tǒng)作為一款非常優(yōu)秀的開源操作系統(tǒng),使用了大量的GNU軟件,包括shell、glibc、gcc、gdb等,還有強(qiáng)大的程序,比如vim和emacs.usb和JATG接口.usb接口連接的方式來進(jìn)行調(diào)試和測試工作GNU工具鏈交叉編譯工具鏈.譯生成目標(biāo)模塊,并由交叉鏈接器最后鏈接成可在目標(biāo)平臺(tái)上執(zhí)行得代碼.交叉編譯工具鏈主要包括:⑴標(biāo)準(zhǔn)庫⑵編譯器⑶鏈接器⑷匯編器⑸調(diào)試器交叉編譯相關(guān)工具⑴glibc庫glibcgnulibc庫,也即c運(yùn)行庫.glibclinux系統(tǒng)中最底層的用程序開發(fā)接口glibc.⑵gcc編譯器Gcc是一個(gè)跨平臺(tái)的編譯器,它是GNUCompilerCollection的縮寫,目前被許多unix/linux.GccGNUCCompiler持的編譯語言越來越多,編程更加強(qiáng)大的GNUCompilerCollection.已經(jīng)被移植到多種處理器架構(gòu)上,并且在商業(yè)、專利和開源軟件商廣泛使用.Gcc編譯器編譯的過程一般分為四個(gè)階段,分別為預(yù)處理、編譯、匯編和鏈接.在linuxshell中對(duì)gcc提供了強(qiáng)大的命令支持,在實(shí)際編程中可以靈活運(yùn)用.⑸ binutils開發(fā)工具包Binutils是一組開發(fā)工具包,包括鏈接器、匯編器和其他用于目標(biāo)文件和檔案的工具.Binutilsgcc工具包是嵌入式系統(tǒng)開發(fā)中必須掌握的,主要包括addr2linearasc++filtgprofldnmobjcopyobjdumpranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes.⑹ gdb調(diào)試器GDBGnuGNUCvisualstudioc/c++、java等⑺ KDEVELOPIDEKDevelopLinux,SolarisFreeBSDIDE(集成開發(fā)環(huán)境MaxOSXUnix系統(tǒng).它是一個(gè)功能全面,可擴(kuò)展的IDC/C++VC++IDE.本畢業(yè)設(shè)計(jì)KdevelopIDE進(jìn)行編譯調(diào)試的.⑻linuxshell簡介linuxshellbashshell.Shell際上是操作系統(tǒng)內(nèi)核和用戶進(jìn)行交互的接口,shellwindowsdos命令行非常相似.ls,cd,rm,cp,mv,du,man,mount等.交叉編譯的構(gòu)建.制作交叉編譯工具鏈之前,需要明確目標(biāo)平臺(tái),本平臺(tái)的嵌入式開發(fā)是在arm平臺(tái)下,所以選擇交叉編譯工具為arm-linux-gcc,arm-linux-gdb等.靈活,已經(jīng)滿足本系統(tǒng)的開發(fā)需求.系統(tǒng)硬件平臺(tái)配置FL2440硬件平臺(tái)的主要配置介紹:⑴S3C2440A處理器,主頻400MHz,可倍頻至533MHz;⑵ 64MSDRAM256M;⑶ 4MNORFlash,256MNANDFlash;⑷12MHz系統(tǒng)外部時(shí)鐘源;32.768KHz的RTC時(shí)鐘源;⑸支持3.3V或5V電壓供電;⑹兩個(gè)三線串口,一個(gè)TTL串口;⑺一個(gè)100M網(wǎng)口,采用DM9000AE,帶聯(lián)接和傳輸指示燈;⑻四個(gè)USBHOST接口;一個(gè)USBDevice接口;ARM9處理器介紹S3C2440.ARMARM9S3C2440的特點(diǎn).ARM眾多種類的嵌入式微處理器中脫穎而出.基于ARM技術(shù)的微處理器占據(jù)了32位75%以上的市場份額,ARM技術(shù)正在逐步滲入到我們生活的各個(gè)方面.采用RISC架構(gòu)的ARM微處理器一般具有如下特點(diǎn):Thumb(16位)/ARM(32位)8位/16位器件;大量使用寄存器,指令執(zhí)行速度更快;進(jìn)行操作;定,執(zhí)行效率高;統(tǒng)一的和固定的指令域,簡化了指令的譯碼;(ALU)ALU和移位器的最大利用;地址自動(dòng)增加和自動(dòng)減少的尋址模式實(shí)現(xiàn)了程序循環(huán)的優(yōu)化;多存儲(chǔ)器加載和存儲(chǔ)指令實(shí)現(xiàn)了最大數(shù)據(jù)吞吐量;所有指令的條件執(zhí)行實(shí)現(xiàn)了最快速的代碼執(zhí)行。處理器有和SecurCore等系列。每個(gè)系列除了具有ARM領(lǐng)域。S3C2440ARM920T532位ABMAMMU管理單元,能夠支持Symbian,Linux和WindowsCE16KB的指令數(shù)據(jù)TCM,通過和APB組成的內(nèi)部總線和外400MHZ的運(yùn)行頻率。即當(dāng)ARMCore1.2V300MHz1.3V的400MHZ。ARM9ARMARM9證。ARM9ARM9各種無線產(chǎn)品和消費(fèi)類電子產(chǎn)品中,包括PDA、數(shù)字電視、機(jī)頂盒、家用路由器、MP4播放器、商業(yè)銀行終端等。而其高數(shù)據(jù)吞吐量和高性能的結(jié)合則非常適合網(wǎng)絡(luò)也可以滿足汽車電子應(yīng)用的需求。S3C24401個(gè)LCD控制器(支持TFT-24bit真彩色帶有觸摸屏的液晶顯示屏),SDRAM控制器,NANDFlash4通道UART口,32通道DMA,4通道具有PWM1個(gè)內(nèi)部時(shí)鐘,全功能的SPIIC總線接口(2I2C控制器IIS3個(gè)PLL,看門狗計(jì)數(shù)器,USBHOST(支持usb1.01.1版本通道MMC/SD控制器等。[4]USB攝像頭原理攝像頭(CAMERA)作為一種視頻輸入設(shè)備,在過去被廣泛的運(yùn)用于視頻會(huì)議、遠(yuǎn)程醫(yī)療及實(shí)時(shí)監(jiān)控等方面.近年來,互聯(lián)網(wǎng)技術(shù)的發(fā)展,圖像傳感器技術(shù)的成熟,使得攝像頭的圖像質(zhì)量得到明顯改善,同時(shí)攝像頭的價(jià)格也大幅度下降.攝像頭在人們的日常生活中扮演著越來越重要的角色.攝像頭分為數(shù)字?jǐn)z像頭和模擬攝像頭兩大類.模擬攝像頭可以將視頻采集設(shè)備產(chǎn).模擬攝像頭捕捉到的以轉(zhuǎn)換到計(jì)算機(jī)上運(yùn)用.接口傳到計(jì)算機(jī)里.現(xiàn)在市場上的攝像頭主要以數(shù)字?jǐn)z像頭為主,而數(shù)字?jǐn)z像頭中又USBUSB數(shù)字?jǐn)z像頭.USB數(shù)字?jǐn)z像頭的工作原理為:景物通過鏡頭生成的光學(xué)圖像投射到圖像傳感器表面上,然后轉(zhuǎn)為電信號(hào),經(jīng)過模數(shù)轉(zhuǎn)換)DSPJPEGUSB接口傳輸?shù)教幚砥髦刑幚?,?shí)現(xiàn)圖像顯示存儲(chǔ)或編碼傳輸.USB數(shù)字?jǐn)z像頭的結(jié)構(gòu)框圖如圖3-1所示.圖3-1 USB數(shù)字?jǐn)z像頭的結(jié)構(gòu)框圖PAGEPAGE37DSP芯片.圖像傳感器是一種半導(dǎo)體芯片,其表面包含有幾十萬到幾百萬..CC(chargecoupledevice)CMOS(complementarymetaloxidesemiconductor)兩類,它們的性能將直接決定攝像頭的最大分辨率和圖像的質(zhì)量.CCD的優(yōu)點(diǎn)是靈敏度高,噪音小,信噪比大,但是生產(chǎn)工藝復(fù)雜、成本高、功耗高.CMOS的優(yōu)點(diǎn)是集成度高、功耗低(CCD1/3、成本低,但是噪音比較大、靈敏度較低、對(duì)光源要求高.CMOS的圖像傳感器,各廠商通過CCD攝像頭相媲美的效果.DSPsignalprocessoJPEG(JPEGencodeUSB(USBcontroller,主要功能是通過一系列復(fù)雜的數(shù)學(xué)算法運(yùn)算,對(duì)數(shù)字圖像信號(hào)進(jìn)行(如壓縮編碼USB等接口傳到PC等設(shè)備芯片類型的不同將直接影響圖片格式的差異.目前主要有國內(nèi)的中星微,臺(tái)灣的松翰、凌越和凌陽這些企業(yè)生產(chǎn)攝像頭的DSP芯片.DSP芯片DSP芯片市場的大半壁江ft.如今中星微電子的“星光”60%的市場份額,更占據(jù)國內(nèi)市場的90%.這是具有我國自主知識(shí)產(chǎn)權(quán)的集成電路芯片第一次在一個(gè)重要應(yīng)用領(lǐng)域占到領(lǐng)先地位.zc301.USB攝像頭的圖像格式主要有以下幾種:JPEG格式、YUV格式和第三格式.中星微的zc301p和松翰的sn9c105采用的是JPEG格式;凌陽的spca506和spca508采用YUV格式;松翰的sn9c101和凌陽的spca56la采用第三格式.第格式是指廠家用自己的圖像壓縮算法對(duì)RGB數(shù)據(jù)壓縮后得到的圖片格式.同一圖像格式的攝像頭由于采用芯片型號(hào)的不同捕獲的圖像數(shù)據(jù)流可能也會(huì)存在小的差異.有些芯片會(huì)在 JPEG 圖像數(shù)據(jù)前加一定長度的頭部,如中星微的zco301p;有些則沒有,如松翰的sn9c105.有些YUV格式的芯片采用YYUV數(shù)據(jù)流格式,而有些則采用YUVY數(shù)據(jù)流格式.表2-1列出了一些主要芯片的圖像格式.松翰凌陽sn9c102sn9c101sn9c102pspca506spca508spca561a第三格式第三格式JPEGYYUVYUVY松翰凌陽sn9c102sn9c101sn9c102pspca506spca508spca561a第三格式第三格式JPEGYYUVYUVY第三格式公司型號(hào)圖像格式中星微zc0301pzc0302zc030xsn9c105JPEGJPEGJPEGJPEGLinuxUSB驅(qū)動(dòng)程序Linux驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)的簡介驅(qū)動(dòng)程序本質(zhì)上是硬件和應(yīng)用程序之間的中間層 .驅(qū)動(dòng)程序工作在內(nèi)核空間應(yīng)用程序一般運(yùn)行于用戶空(32位Linux操作系統(tǒng)一般把內(nèi)存地址的空間作為用戶空間3~4G空間作為內(nèi)核空間.Linux下驅(qū)動(dòng)程序和dos或下的區(qū)別很大.設(shè)備驅(qū)動(dòng)程序是作為內(nèi)核與機(jī)器硬件之間的接口,而系統(tǒng)調(diào)用則是內(nèi)核和應(yīng)用程序的接口.設(shè)備驅(qū)動(dòng)為應(yīng)用程序屏蔽了硬件的細(xì)節(jié),硬件設(shè)備對(duì)于應(yīng)用程序來說只是一個(gè)設(shè)備文件應(yīng)用程序可以像操作普通程序一樣對(duì)硬件備進(jìn)行操作.[5]設(shè)備驅(qū)動(dòng)是內(nèi)核的一部分,一般完成以下功能:⑴設(shè)備的初始化和釋放.⑵把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)到內(nèi)核.⑶讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序的請(qǐng)求的數(shù)據(jù) .需要在用戶空間、內(nèi)核空間、總線以及外設(shè)之間傳送數(shù)據(jù).⑷檢測和處理設(shè)備出現(xiàn)的錯(cuò)誤.[6]Linux設(shè)備的分類Linux..塊設(shè)備則只能以塊為5121024Bytebuffer和cache進(jìn)行并且可以隨機(jī)訪問,一般通過文件系統(tǒng)來訪問塊設(shè)備,只有塊設(shè)備可以安裝文件系統(tǒng).塊設(shè)備主要針對(duì)慢速設(shè)備,一般采用緩存技術(shù),支持?jǐn)?shù)據(jù)的隨即讀寫,典型的塊設(shè)備是硬盤和cd-rom等.read、write際上它們的細(xì)節(jié)區(qū)別僅在內(nèi)核和驅(qū)動(dòng)程序的軟件接口上.Linux操作系統(tǒng)中的網(wǎng)絡(luò)設(shè)備的實(shí)現(xiàn)方法不同于字符設(shè)備和塊設(shè)備,它面對(duì)的上一層是網(wǎng)絡(luò)協(xié)議層,而不是字符型和塊設(shè)備所面向的文件系統(tǒng)層.設(shè)備文件煩的.用戶一般希望能用同樣的應(yīng)用程序接口和命令來訪問設(shè)備和普通文件.Linux抽象了對(duì)硬件的處理,所有的設(shè)備都看做文件:它們可以使用和操作普通文件相同的系統(tǒng)調(diào)用接口來完成打開、讀寫、關(guān)閉和I/O控制等,而驅(qū)動(dòng)程序的本質(zhì)就是將這些系統(tǒng)調(diào)用接口函數(shù)具體實(shí)現(xiàn).Linux中的所有外圍和內(nèi)部硬件設(shè)備都用特殊的設(shè)備文件來表示.[7]linux引入的設(shè)備文件的概念,linux對(duì)用戶來說,設(shè)備文件和普通文件沒有區(qū)別.主設(shè)備號(hào)和次設(shè)備號(hào)Linux設(shè)備的實(shí)例.有同一個(gè)設(shè)備驅(qū)動(dòng)程序控制的所有設(shè)備都具有相同的主設(shè)備號(hào).次設(shè).設(shè)備文.所有已經(jīng)加載(即注冊(cè))的硬件設(shè)備的主設(shè)備號(hào)能夠從文件系統(tǒng)中/proc/devices文件中得到.當(dāng)應(yīng)用程序通過系統(tǒng)調(diào)用對(duì)某個(gè)設(shè)備文件操作時(shí),linux驅(qū)動(dòng)程序找到對(duì)應(yīng)的次設(shè)備號(hào),最終完成對(duì)硬件的操作.linux驅(qū)動(dòng)程序代碼的分布所有的linux設(shè)備驅(qū)動(dòng)源代碼都放在drivers目錄下.設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)Linux驅(qū)動(dòng)程序與外界的接口可以分成三部分:⑴驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核的接口.只是通過include/linux/fs.h 中的file_operations數(shù)據(jù)結(jié)構(gòu)來完成的,下面會(huì)介紹這個(gè)數(shù)據(jù)結(jié)構(gòu).⑵驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口.這部分利用驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行初始化.⑶驅(qū)動(dòng)程序與設(shè)備的接口.這部分描述了驅(qū)動(dòng)程序如何與設(shè)備進(jìn)行交互.這與具體的設(shè)備密切相關(guān).[8]按照功能劃分,linux設(shè)備驅(qū)動(dòng)程序的代碼結(jié)構(gòu)大致劃分為以下幾個(gè)部分:設(shè)備的中斷與輪詢處理.驅(qū)動(dòng)程序的注冊(cè)和注銷往系統(tǒng)注冊(cè)一個(gè)設(shè)備驅(qū)動(dòng)需要賦予設(shè)備一個(gè)主設(shè)備號(hào)通過驅(qū)動(dòng)程序初始時(shí)調(diào)用定義在 fs/devices.c中的register_chrdev()函數(shù)或者fs/block_dev.c中的register_blkdev()函數(shù)來完成而關(guān)閉字符或者塊設(shè)備,需要通過使用unregister_chrdev()unregister_blkdev()設(shè)備號(hào).設(shè)備的打開與釋放通過調(diào)用定義在include/linux/fs.h中的file_operations中的open()的硬件設(shè)備的打開,本操作是驅(qū)動(dòng)程序用來完成初始化工作的以下是file_operations的數(shù)據(jù)結(jié)構(gòu)定義:struct file_operationsstructmodule *owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,size_t,loff_tssizet(*write)(structfile*,constchar*,size_t,loff_tint(*readdir)(structfile*,void*,filldir_t*);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,int);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsigned long( *get_unmapped_area) (struct file *,unsigned long,unsignedlong,unsignedlong);int(*check_flags)(int);}open、close、read、write內(nèi)核將通過file_operations結(jié)構(gòu)訪問驅(qū)動(dòng)程序提供的函數(shù).file_operationsread函數(shù).一般在驅(qū)動(dòng)程序中,open()別次設(shè)備號(hào);若有 必要的話需更新讀寫操作的當(dāng)前位置f_ops 指針;對(duì)file->private_data里的數(shù)據(jù)進(jìn)行分配和填寫;引用計(jì)數(shù)值增加一.file_operationsrelease()來完成釋放設(shè)備,close()open()使用計(jì)數(shù)減一,釋放file->private_data中分配的內(nèi)存;如果被釋放設(shè)備是最后一個(gè),則設(shè)備關(guān)閉.設(shè)備的讀寫操作讀寫字符設(shè)備的操作使用函數(shù) read()和write().對(duì)于塊設(shè)備,使用函數(shù)block_read()和block_write()來對(duì)數(shù)據(jù)進(jìn)行讀寫.設(shè)備的控制操作ioctl()來完成.Ioctl()設(shè)備的輪詢與中斷操作備是否已經(jīng)完成了此命令.進(jìn)行數(shù)據(jù)傳輸.輪詢方式意味著需經(jīng)常對(duì)設(shè)備的狀態(tài)進(jìn)行讀取,直到設(shè)備狀態(tài)表明請(qǐng)求已經(jīng)完成為止.如果設(shè)備驅(qū)動(dòng)程序被連接進(jìn)入內(nèi)核,輪詢方式會(huì)帶來災(zāi)難.程來完成檢查設(shè)備狀態(tài).輪詢方式比較消耗內(nèi)核資源.作.讓硬件在需要的時(shí)候會(huì)向內(nèi)核發(fā)出中斷請(qǐng)求信號(hào),內(nèi)核負(fù)責(zé)把信號(hào)傳遞給對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序.系統(tǒng)記錄下中斷處理程序中的地址和中斷號(hào).在系統(tǒng)的proc/interrupts程序?qū)?yīng)的中斷號(hào)和類型.在驅(qū)動(dòng)初始化一般已經(jīng)完成對(duì)中斷資源的請(qǐng)求.系統(tǒng)中某些中斷時(shí)固定的,大多數(shù)中斷需要在啟動(dòng)時(shí)進(jìn)行動(dòng)態(tài)分配.(IRQ)取得對(duì)此中斷的所有權(quán)之前找到.cpu模式發(fā)送,并且會(huì)阻止系統(tǒng)其他中斷的產(chǎn)生.驅(qū)動(dòng)程序在中斷處理過程中做得越linux.為了在接收中斷后能夠完成更linux設(shè)備模型設(shè)備模型概要Linuxlinux的設(shè)備驅(qū)動(dòng)程序中設(shè)備在底層的實(shí)現(xiàn)至關(guān)重要.usb.之后引進(jìn)了新的內(nèi)核設(shè)備模型.設(shè)備模型提供了獨(dú)立的機(jī)制表示設(shè)備,并表示其在系統(tǒng)中的拓?fù)浣Y(jié)構(gòu)..用樹的形式將全部設(shè)備設(shè)備模型設(shè)計(jì)的初衷是為了節(jié)能,有助于電源管理.通過建立表示系統(tǒng)設(shè)備.基本原理如下,當(dāng)系統(tǒng).舉例:內(nèi)核需要在關(guān)閉usb攝像頭之后,才能關(guān)閉usbPCI總線.[11]設(shè)備模型的具體實(shí)現(xiàn)3個(gè)數(shù)據(jù)結(jié)構(gòu)kobjecksetkobj_type層建筑,也就是決定了總線、設(shè)備和驅(qū)動(dòng)的組織關(guān)系.Linux2.6kobjeckobject是組成設(shè)備模型的最小單元,是構(gòu)成linux2.6設(shè)備模型的核心結(jié)構(gòu),它與sysfskobjectsysfs文件系統(tǒng)中的一個(gè)目錄對(duì)應(yīng).[12].雖然設(shè)備種類的千kobject中.kobjectinclude/linux/kobject.hstructkobject{constchar *k_name; /*指向設(shè)備對(duì)象名稱的指針.*/char name[KOBJ_NAME_LEN]; /*設(shè)備名稱,最長為structkrefkref; /*對(duì)象引用計(jì)數(shù)*/structlist_headentry; /*列表頭*/structkobject*parent;/*父對(duì)象*/structkset *kset; /*kobject集合structkobj_type*ktype/*kobject類型*/structdentry*dentry;/*sysfs的目錄項(xiàng)wait_queue_head_tpoll;/*等待隊(duì)列*/};ksetkobjectkobjectkset組織成層次化的樹結(jié)構(gòu),ksetkobject的集合.Kobject節(jié)點(diǎn),兩者的連接形成了一個(gè)樹狀結(jié)構(gòu).include/linux/kobject.hstructkset{structkobj_type *ktype;//kset->kobj所屬的類型.struct list_head list;// 鏈表頭,用于存放該kset 中所有spinlock_t list_lock;structkobjectkobj;//自身的kobjectstructkset_uevent_ops*uevent_ops;};kobj_typekobjectkobjectsysfsinclude/linux/kobject.hstructkobj_type{void(*release)(structkobject*kobj);structsysfs_ops*sysfs_ops;structattribute**default_attrs;};設(shè)備模型的上層建筑總線、設(shè)備、驅(qū)動(dòng)在內(nèi)核中的結(jié)構(gòu),全都定義在include/linux/device.h.Linux中的任一設(shè)備在設(shè)備模型中都有一個(gè)device.在最系統(tǒng)中的每一個(gè)設(shè)備都用device結(jié)構(gòu)的一個(gè)對(duì)象實(shí)例來表示.設(shè)備被structdevice結(jié)構(gòu)體.parent,kobj,bus_id,bus_type,device_driver,driver_data,void(*release)(structdevice*dev).結(jié)構(gòu)體全部部分在/usr/src/linux-/include/linux/device.hstructdevice{. structdevice *parent;//表示父設(shè)備,一般父設(shè)備是某種總線或者主控制器.指針為空,則此設(shè)備是一個(gè)頂層設(shè)備.structkobjectkobj;//代表這個(gè)設(shè)備并且連接它到層次中的kobject.注意,作為一個(gè)通用的規(guī)則device->kobj->parent等同于device->parent->kobj.char bus_id[BUS_ID_SIZE]; /*positiononparentbus*///唯一確定此總線上的設(shè)備的字符串structbus_type *bus; //typeofbusdeviceison種總線.structdevice_driver*driver; //whichdriverhasallocatedthisdevice 這個(gè)設(shè)備的驅(qū)動(dòng);void*driver_data; //一個(gè)可能被設(shè)備驅(qū)動(dòng)使用的私有數(shù)據(jù)成員void (*release)(structdevice*dev);//對(duì)設(shè)備的最后引用結(jié)束后調(diào)用;};device 注冊(cè)和銷毀函數(shù): void device_unregister(struct device *dev)、device_register(structdevice*dev)相關(guān)主要函數(shù):voiddevice_del(structdevice*dev)intdevice_add(structdevice*dev)intdevice_create_file(structdevice*dev,structdevice_attribute*attr)device_add_class_symlinks(dev);在device_add函數(shù)中,首先獲得設(shè)備的父設(shè)備,通過這個(gè)來設(shè)置設(shè)備結(jié)點(diǎn),kobjectdev->kobj.parentkobject處.kobject_add(&dev->kobj,dev->kobj.parent,"%s",dev->bus_id);此函數(shù)前面分析過.sysfs_create_file(&dev->kobj,&attr->attr);device_create_filesysfs相連.class相關(guān)性的函數(shù)中,是通過新增一個(gè)sysfs的link來完成的.此后還有很多的和class與sysfs之間的相連接.同時(shí)還要將此設(shè)備加入設(shè)備鏈表.classsysfslink來實(shí)現(xiàn)的,classdevice之間的聯(lián)系是通過結(jié)構(gòu)體中相關(guān)結(jié)構(gòu)體的指針互相指向而構(gòu)成的一個(gè)整體.這樣看來,就可以明確,kobject,kset,sysfs,class,device,driver.而呈現(xiàn)在用戶面前的.如果注冊(cè)成功,則sys/devices目錄中出現(xiàn),也會(huì)在添加到的總線中顯示.sysfs虛擬文件系統(tǒng)主要目的之一就是顯性顯示設(shè)備的狀況.設(shè)備模型的作用之一就是跟蹤系統(tǒng)已知的設(shè)備.通過跟蹤讓內(nèi)核驅(qū)動(dòng)程序核系統(tǒng)對(duì)象,就可完成大批工作.驅(qū)動(dòng)程序由下面的結(jié)構(gòu)體定義:structdevice_driver{constchar *name;name//是驅(qū)動(dòng)的名子(它在sysfs中出現(xiàn)structbus_type *bus;//bus是這個(gè)驅(qū)動(dòng)使用的總線類型structmodule *owner;constchar *mod_name; /*usedforbuilt-inmodulesint(*probe)(structdevice*dev);int(*remove)(structdevice*dev);void(*shutdown)(structdevice*dev);int(*suspend)(structdevice*dev,pm_message_tstate);int(*resume)(structdevice*dev);structattribute_group**groups;structdriver_private*p;//里面包含了kobject};structdriver_private{structkobjectkobj;structklistklist_devices;structklist_nodeknode_bus;structmodule_kobjectstructdevice_driver*driver;};注冊(cè)和注銷驅(qū)動(dòng)程序函數(shù):intdriver_register(structdevice_driver*drv)、voiddriver_unregister(structdevice_driver*drv)相關(guān)函數(shù):structdevice_driver*driver_find(constchar*name,structbus_type*bus)kset_find_obj(bus->p->drivers_kset,name);intbus_add_driver(structdevice_driver*drv)intdriver_create_file(structdevice_driver*drv,structdriver_attribute*attr)尋找驅(qū)動(dòng)程序driver_find(drv->name,drv->bus)通過總線和name則可以進(jìn)尋找.在設(shè)備集合kset中找到對(duì)應(yīng)的kset_find_obj(bus->p->drivers_kset,name);后是:bus_add_driver(drv);這個(gè)函數(shù)很關(guān)鍵:首先bus_get(drv->bus),然后則是在driver的私有屬性中設(shè)置:priv->driver=drv;drv->p=priv;priv->kobj.ksetbus->p->drivers_kset;讓他們形成相關(guān)聯(lián)的形式,這也是必須的,然后就是kobject_init_and_add(&priv->kobj,&driver_ktype,NULL,"%s",drv->name)-->module_add_driver(drv->owner, drv)-->driver_create_file(drv,&driver_attr_uevent);這個(gè)函數(shù)中,主體就是這一句:sysfs_create_file(&drv->p->kobj,&attr->attr);與形 成 關(guān) 聯(lián) 關(guān) 系 .-->add_bind_files(drv); 然 后 接 下 來 sysfs_create_group(&drv->p->kobj,groups[i]);就完成了注.LinuxUSB驅(qū)動(dòng)USB設(shè)備.USBUniversalSerialBUS(通用串行總線)的縮寫,是一個(gè)外部總線標(biāo)準(zhǔn),用于規(guī)范電腦與外部設(shè)備的連接和通訊.PC領(lǐng)域的接口技術(shù).USB接口支持設(shè)備的即插即用和熱插拔功能.USB1994Microsoft等多家公司聯(lián)合提出的.今天,usb1.0、1.1、2.0、3.0四個(gè)版本,目前市場的主流產(chǎn)品還是基于usb2.0的.其中usb2.0的高速模式最高達(dá)到了480Mbit/susb3.0更是達(dá)到了usb2.0的十倍.Usb各個(gè)版本是兼容的.Linux支持幾乎所有的通用USB.USB1.1UHCIOHCIUSB2.0EHCI.usb協(xié)議1.樹形拓?fù)銾SB作為總線系統(tǒng)上的一個(gè)子系統(tǒng),其并不是以普通總線的方式部署的,而是一棵樹.USB樹包括三部分:usb主機(jī)控制器(usbhostcontrolle,usb設(shè)備(usbdevicusb連接組成.USB系統(tǒng)是一種主從結(jié)構(gòu)cpuusbusb設(shè)備進(jìn)行通信.cpuusb主機(jī)控制器傳usb設(shè)備,usb發(fā)出的請(qǐng)求只能被主機(jī)控制器接收.USBUSBRootHub.usb集線器)綁定在一起,這個(gè)hub稱為根集線器hub).Roothub通常包含在PCIPCIUSB總線的橋梁.hubusb設(shè)備都可以連接在roothub上.usb設(shè)備的數(shù)目.usb127個(gè).所有的設(shè)備都連接在hub.usbusb設(shè)備提供電源.2.usb數(shù)據(jù)傳輸方式USB總線是一種輪詢方式的總線.USBUSBusb端點(diǎn)usbpipe(管道).管.通信時(shí),主機(jī)和設(shè)備之間可以建立多個(gè)管道進(jìn)行數(shù)據(jù)傳輸.這里值得一提的是接口的概念,一組端點(diǎn)實(shí)現(xiàn)一個(gè)接口,一個(gè)接口就是代表一個(gè)基本功能.usb揚(yáng)聲器包括usb揚(yáng)聲器需要兩個(gè)不同功能的驅(qū)動(dòng)程序也就是說,一個(gè)設(shè)備可以有多個(gè)接口,一個(gè)接口可以有多個(gè)端點(diǎn),一般我們編寫的usbusb整個(gè)設(shè)備.inout0inout端點(diǎn).usbusb0端點(diǎn)之間建立的缺省管道進(jìn)行的.管道通信的方式有兩種:流strea)和消息messag流是無結(jié)構(gòu)的.USB支持四種數(shù)據(jù)傳輸模式:控制傳輸,中斷傳輸,同步傳輸,批量傳輸一般在正式數(shù)據(jù)傳送開始前,主機(jī)控制器都會(huì)發(fā)送一個(gè)標(biāo)志包(tokent標(biāo)志包是描述數(shù)據(jù)傳輸方向、種類、USBusb數(shù)據(jù)包.然后再是正式數(shù)據(jù)的傳輸.usb描述符USB設(shè)備作為一個(gè)完備的設(shè)備,由硬件和固件組成.usbusb屬性和相關(guān)信息.usb符,接口描述符和端點(diǎn)描述符.UsbEEPROM中.其中設(shè)備描述符給出了設(shè)備的一般信息,內(nèi)核中用 structusb_device_descriptor結(jié)構(gòu)體描述,其中包括設(shè)備的廠商ID,產(chǎn)品ID,設(shè)備的描述信息,設(shè)別類碼等.對(duì)于usb攝像頭,設(shè)備內(nèi)碼值用以下宏定義:#defineUSB_CLASS_VIDEO0x0E.structusb_config_descriptor結(jié)構(gòu)描述.其給出了設(shè)備的配置數(shù),及對(duì)應(yīng)接口數(shù)和接口下的端點(diǎn)信息.送一個(gè)請(qǐng)求,要求得到配置描述符時(shí),接口描述符和端點(diǎn)描述符都被一起返回.接口描述符描述了一個(gè)配置內(nèi)的設(shè)備的接口的信息內(nèi)核用structusb_interface_descriptor數(shù)據(jù)結(jié)構(gòu)描述.接口總是和配置描述符一起返回.端口描述符主要是被主機(jī)用來決定設(shè)備的帶寬需求,內(nèi)核用structusb_endpoint_descriptor數(shù)據(jù)結(jié)構(gòu)描述,其實(shí)配置描述符的一部分.除此之外,usb還有其它的比如設(shè)備字符串描述符,設(shè)備限定描述符等.USB設(shè)備的識(shí)別USBusbusb.枚舉過程如下:⑴設(shè)備連接:usb設(shè)備接入usb接口.⑵設(shè)備上電:usb設(shè)備通過usb總線供電,也可已通過外部電源供電.⑶主機(jī)檢測設(shè)備:設(shè)備上電后,主機(jī)通過設(shè)備的上拉電阻檢測新的設(shè)備,然后向設(shè)備發(fā)送一個(gè)復(fù)位信號(hào).⑷設(shè)備默認(rèn)狀態(tài):設(shè)備需要在接受到總線的復(fù)位信號(hào)后,才會(huì)響應(yīng)總線的處理操作.⑸設(shè)備地址分配:設(shè)備在接收到復(fù)位信號(hào)以后,會(huì)使用默認(rèn)的地址(00h)對(duì)其進(jìn)行尋址.主機(jī)在接收到有設(shè)備對(duì)默認(rèn)地址備分配一個(gè)空閑的地址,設(shè)備以后只對(duì)這個(gè)分配的地址進(jìn)行響應(yīng).⑹讀取設(shè)備的描述符:主機(jī)會(huì)讀取設(shè)備的描述符,確定設(shè)備的屬性.⑺配置設(shè)備:主機(jī)通過讀取獲得設(shè)備描述符來進(jìn)行配置,如果設(shè)備所需的usb資源得以滿足,就發(fā)送命令給usb設(shè)備,表示配置完畢.⑻掛起設(shè)備:設(shè)備掛起主要是為了節(jié)省電源.3ms設(shè)備驅(qū)動(dòng)程序就進(jìn)入掛起狀態(tài).500uA.設(shè)備保持其配置和地址在內(nèi)的所有信息不變.通過以上過程,usb設(shè)備就可以使用了.USB框架USB子系統(tǒng)的結(jié)構(gòu)USBlinux長,族里的每個(gè)usb.Sys文件目錄是它們對(duì)外的一個(gè)窗口.USBdrivers/usb下面,該目錄下有一個(gè)coreUSBcore,這是個(gè)核心模塊.一般在主機(jī)usb設(shè)備有兩個(gè)模塊是必須的.USBcore,另外一個(gè)是主機(jī)控制器的驅(qū)動(dòng)程序,比如ehci_hcduhci_hcd,一個(gè)usb控制器模塊也是必不可少的.USBcore負(fù)責(zé)以一些核心的功能,為別的設(shè)備驅(qū)動(dòng)提供服務(wù),提供一個(gè)用usb硬件的接口,而不用考慮當(dāng)前存在那種主機(jī)控制器.USBcorehost主機(jī)控制器和usb驅(qū)動(dòng)三者之間的關(guān)系如下圖4-1所示:block層block層Net層Char層……USB設(shè)備驅(qū)動(dòng)USBcoreUSB主機(jī)控制器Usb硬件設(shè)備4-1usb子系統(tǒng)結(jié)構(gòu)USBusb(HCusb軟件的最下層.HCDUSBhub驅(qū)動(dòng),設(shè)備類驅(qū)動(dòng)接口、應(yīng)用程序訪問usb系統(tǒng)的文件接口usbusb設(shè)備USBcoreusbHCDHCD的.usbCorecorecoreHCDusbfile_operation結(jié)構(gòu)體中的函數(shù).USB子系統(tǒng)與設(shè)備模型對(duì)于設(shè)備模型,最主要的問題是如何建立bus、device、driver的聯(lián)系.一般,在討論一個(gè)設(shè)備或者驅(qū)動(dòng)時(shí),必須說明是屬于哪個(gè)總線系統(tǒng)下的設(shè)備或者驅(qū)動(dòng),所以總線對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)中有兩條鏈表,一個(gè)是devices設(shè)備鏈表,另外一個(gè)是drivers驅(qū)動(dòng)鏈表.usb子系統(tǒng),usbcoreusbstructbus_typeusbusbRootHubusbstructdevice,賦值后,插入到devices鏈表中.hubhubusb_bus_typedevices鏈表建立起來了.drivers驅(qū)動(dòng)鏈表,則需要自己去總線上登記了.usb子系統(tǒng),每usbstructusb_driverstructusb_driverdriver成員,usbcorestructusb_driverdriverusb_bus_typedrivers驅(qū)動(dòng)鏈表中.usb_deregister與usb_register作用相反,用于刪除驅(qū)動(dòng)鏈表中的驅(qū)動(dòng).structdevice結(jié)構(gòu).structdevicestructusb_driverusb總線驅(qū)動(dòng)鏈表中的驅(qū)動(dòng).usb驅(qū)動(dòng)程序設(shè)計(jì)USB驅(qū)動(dòng)分為主機(jī)端驅(qū)動(dòng)和設(shè)備端驅(qū)動(dòng).這里只介紹前者.Usb主機(jī)端驅(qū)動(dòng)可以分為主機(jī)控制器驅(qū)動(dòng)和主機(jī)端設(shè)備驅(qū)動(dòng).主機(jī)控制器驅(qū)集成,不需要開發(fā).usb要有設(shè)備驅(qū)動(dòng)程序來驅(qū)動(dòng).在usb驅(qū)動(dòng)中,有一個(gè)重要的概念,就是urb,它是USBRequestBlock,即USB請(qǐng)求塊的簡稱.urbUSB傳輸需要的相關(guān)信息,內(nèi)核中USBurbusb設(shè)備進(jìn)行通信.urb是一個(gè)異步的過urb_submit_urbusburb放.urburb_unlink_urb取消.urbcompleturb該函數(shù)都會(huì)被調(diào)用.設(shè)備的每個(gè)端點(diǎn)都支持請(qǐng)求隊(duì)列,請(qǐng)求隊(duì)列會(huì)在上一個(gè)請(qǐng)求usb帶寬.[15]一般urb的生命周期如下圖4-2所示:開始開始分配一個(gè)端點(diǎn)提交給usbcore傳送到主機(jī)控制器傳送到設(shè)備Y是否可重用動(dòng)N刪除結(jié)束圖4-2urb的生命周期在linux 內(nèi)核中,提供了一個(gè)開發(fā)usb 設(shè)備驅(qū)動(dòng)程序的框架,在drivers/usb/usb-skeleton.c 文件.描述usb 驅(qū)動(dòng)程序結(jié)構(gòu)的usb_driver 在structusb_driverinclude/linux/usb.h文件中,定義如下:structusb_driver{{constchar驅(qū)動(dòng)程序名字,int(*probe)(structusb_interface*intf,conststructusb_device_id設(shè)備接口插入時(shí),通過該函數(shù)自動(dòng)檢測設(shè)備是否與該驅(qū)動(dòng)匹配void(*disconnect)(structusb_interface設(shè)備接口被拔出時(shí)調(diào)用int(*ioctl)(structusb_interface*intf,unsignedintcode,void*buf);//驅(qū)動(dòng)與用戶空間交流控制函數(shù)int(*suspend)(structusb_interface*intf,pm_message_tmessage);//設(shè)備掛起時(shí)調(diào)用int(*resume)(structusb_device*udev,pm_message_tmessage);//設(shè)備喚醒時(shí)調(diào)用conststructusb_device_id驅(qū)動(dòng)支持的所有設(shè)備的花名冊(cè)structusbdrv_wrapdrvwrap;unsignedintunsignedintsupports_autosuspend:1;}name.Probedisconnect是函數(shù)指針,當(dāng)設(shè)備與在備與在id_table中變量信息匹配時(shí),這個(gè)函數(shù)會(huì)被調(diào)用.UsbUsb驅(qū)動(dòng)注冊(cè)時(shí)利用usb_registerusb_register函數(shù),一般放在模塊退出函數(shù)中.Usb設(shè)備插入到usb總線接口時(shí),系統(tǒng)會(huì)讀取設(shè)備描述符,其中,廠商的id和產(chǎn)品的id提供了設(shè)備的唯一標(biāo)識(shí).系統(tǒng)在corecore注冊(cè).函數(shù)probe自動(dòng)調(diào)用.Usb_device結(jié)構(gòu)指針、接口號(hào)和接口id都被傳到該函數(shù)中.一般來說,一般來說,usb驅(qū)動(dòng)會(huì)涉及到另外一個(gè)驅(qū)動(dòng)系統(tǒng).驅(qū)動(dòng)程序通過在這個(gè)驅(qū)動(dòng)系統(tǒng)中注冊(cè),號(hào)和file_operations指針,這樣任何用戶態(tài)的程序想要操作此設(shè)備都可以通過file_operations結(jié)構(gòu)里面定義的函數(shù)來執(zhí)行,這樣最終實(shí)現(xiàn)了對(duì)設(shè)備的控制和使用.id_table中尋找匹配的號(hào)和file_operations指針,這樣任何用戶態(tài)的程序想要操作此設(shè)備都可以通過file_operations結(jié)構(gòu)里面定義的函數(shù)來執(zhí)行,這樣最終實(shí)現(xiàn)了對(duì)設(shè)備的控制和使用.id_table中尋找匹配的usb內(nèi)核、文件系統(tǒng)及驅(qū)動(dòng)移植一個(gè)軟件平臺(tái).實(shí)現(xiàn)嵌入式系統(tǒng)功能的第一步就是進(jìn)行系統(tǒng)移植,其中包括操作系統(tǒng)內(nèi)核、文件系統(tǒng)和各種設(shè)備驅(qū)動(dòng)程序的移植.通過系統(tǒng)移植,嵌入式核心板就能運(yùn)行經(jīng)過裁剪的操作系統(tǒng)了.USB攝像頭設(shè)備驅(qū)動(dòng)移植Linuxzc301可以從網(wǎng)上獲得,進(jìn)行修改編譯進(jìn)內(nèi)核后即可使用.這極大的縮短了本課題的完成時(shí)間,也為開發(fā)降低了成本.移植攝像頭驅(qū)動(dòng)和內(nèi)核的具體步驟如下:1zc(xxx)usb-2.6.12LE06.patch.tar.gz,該補(bǔ)丁中內(nèi)置了 gspcav1-20071224.tar.gz 驅(qū)動(dòng). 把該補(bǔ)丁復(fù)制到linux-2.6.12/drivers/usb目錄下,解壓,打補(bǔ)?。簍ar–xzvfusb-2.6.12LE06.patch.tar.gzpatch–p1<usb-2.6.12.patch2、編譯內(nèi)核 進(jìn)入/linux-2.6.12/,然后執(zhí)行makemenuconfig,在其中選上以下幾個(gè)選項(xiàng):Multimediadevices >VideoForLinuxUSBsupport >SupportforHost-sideUSBUSBHostControllerDriversOHCIHCDsupportUSBMultimediadevicesUSBSPCA5XXSunplus/Vimicro/SonixjpegCameras保存修改,進(jìn)行進(jìn)行靜態(tài)編譯.把新生成的內(nèi)核鏡像文件zImage燒進(jìn)開發(fā)板,重啟后插上中星微芯片的攝像頭,命令行出現(xiàn)這條提示信息“drivers/usb/media/gspcav1-20071224/gspca_core.c: GSPCAcamerafound.(ZC3XX)”說明移植的攝像頭驅(qū)動(dòng)已經(jīng)能識(shí)別設(shè)備.Linux文件系統(tǒng)移植Linux啟動(dòng)時(shí),首先掛載的是根文件系統(tǒng);如果系統(tǒng)不能從指定的設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)就會(huì)因出錯(cuò)而退出啟動(dòng).根文件系統(tǒng)啟動(dòng)之后可以自動(dòng)掛載其它的文件系統(tǒng).一個(gè)系統(tǒng)中可以存在不同的文件系統(tǒng).FLASH約使用.FLASH具有獨(dú)特的物理特性,必須使用專門的嵌入式文件系統(tǒng).目前FLASHROMFS等.AnotherFlashFileNANDFlashGP(GeneralLicense)協(xié)議下發(fā)布的,可在其網(wǎng)站免費(fèi)獲得源代碼.YAFFS.FlashRAM的使用做了優(yōu)化LinuxWinCE.YAFFS中,文件是以固定大小的數(shù)據(jù)塊進(jìn)行存儲(chǔ)的,塊的大小可以是512字節(jié)、10242048字節(jié).這種實(shí)現(xiàn)依賴于它能夠?qū)⒁粋€(gè)數(shù)據(jù)塊頭和每個(gè)數(shù)據(jù)塊關(guān)聯(lián)起來.每個(gè)文件(包括目錄)都有一個(gè)數(shù)據(jù)塊頭與之相對(duì)應(yīng),數(shù)據(jù)塊ECC(ErrorCorrectionCode)NANDFlashFlash16字節(jié)備用空間中.也提高了文件的訪問速度,但是增加了內(nèi)存的消耗.[16]yaffsqte_touch.yaffsUSB下載到開發(fā)板上即可.成的服務(wù)器端程序servfox放到文件系統(tǒng)中.具體操作如下:先將飛凌公司已經(jīng)做好的文件系統(tǒng)壓縮包(qte_yaffs.tar.bz2)拷貝到某個(gè)目錄下,進(jìn)入這個(gè)目錄,然后解壓這個(gè)壓縮包,如下:tarjxvfqte_yaffs.tar.bz2解壓后得到qte_yaffs目錄,文件系統(tǒng)中的所有文件都在該目錄下,將servfox放到/tmp下.然后利用mkyaffs2image工具來制作文件系統(tǒng):./mkyaffs2imageqte_yaffsqte.yaffs最后將qte.yaffs下載到開發(fā)板上.嵌入式圖像采集系統(tǒng)的服務(wù)器端LinuxV4L視頻采集LinuxV4L視頻采集編程接口分析V4L標(biāo)準(zhǔn)的概述V4,全稱是Video4Linu(VideoforLinu,是在linux內(nèi)核中關(guān)于視頻設(shè)API接口,涉及開關(guān)視頻設(shè)備、采集并處理視頻圖像信息.V4L視頻采集設(shè)備和相應(yīng)的設(shè)備驅(qū)動(dòng)程序,可以實(shí)現(xiàn)影像采集、AM/FM應(yīng)用程序Video4LinuxAPI視頻設(shè)備驅(qū)動(dòng)V4LI/Oopen、readwriteclose.對(duì)中斷的處理函數(shù)、內(nèi)存映射功能函數(shù)以及對(duì)I/O通道的控制接口ioctl等.V4L通過對(duì)驅(qū)動(dòng)程序的封裝,為用戶提供統(tǒng)一的編程接口,實(shí)現(xiàn)對(duì)設(shè)備的讀寫、信息查詢等功能.5-1V4L在內(nèi)核中的位置:應(yīng)用程序Video4LinuxAPI視頻設(shè)備驅(qū)動(dòng)5-1V4L接口位置V4LLinux.在/devvideo0-video63的看成是視頻設(shè)備.函數(shù)中實(shí)現(xiàn)對(duì)視頻設(shè)備的注冊(cè).其次,V4L規(guī)定了查詢和設(shè)置設(shè)備參數(shù)的標(biāo)準(zhǔn)接口,其實(shí)是一些常量以及對(duì)應(yīng)的結(jié)構(gòu)體.V4L數(shù),通過這些函數(shù),可以執(zhí)行打開、讀寫、關(guān)閉等各種基本的操作.[18]USB攝像頭設(shè)備文件/dev/video0,進(jìn)行視頻圖像采集方面的程序設(shè)計(jì).V4L支持的部分重要數(shù)據(jù)結(jié)構(gòu)接口應(yīng)用程序訪問視頻設(shè)備文件主要是通過V4L提供的一系列接口函數(shù)實(shí)現(xiàn)的,本設(shè)計(jì)文用到的一些視頻接口如下:ideo_capability辨率、信號(hào)源信息、信道數(shù)等.struct video_capability{charname[32] //設(shè)備接口名稱intmaxwidth,maxheight,minwidth,minheight //最大最小采集高度和寬intchannels //支持的無線電或者電視通道數(shù)目inttype //capture,彩色還是黑白,是否能裁剪等}ideo_picutre度、白平衡等.structvideo_picutre{_u16brightness 0~65535 //圖像亮度_u16hue //圖像色調(diào)_u16colour //圖像顏色_u16contrast //圖像對(duì)比度_u16whiteness //灰度_u16depth //圖像深度_u16palette //調(diào)色板,VIDEO_PALETTE_YUV420P}ideo_channel:各個(gè)信號(hào)源的屬性,如信號(hào)源編號(hào),類型等structvideo_channel{channel //信號(hào)源的編name //名稱tunerstype //VIDEO_TYPE_TV|VIDEO_TYPE_CAMERA}ideo_window:采集窗口參數(shù),如圖像高度、寬度等structvideo_window{_u32x //Xwindows中的坐標(biāo)_u32y //Ywindows中的坐標(biāo)_u32width //campturepicturewidth_u32height //campturepictureheight_u32flags //捕獲的附加標(biāo)志structvideo_clip*clips //Alistofclippingrectangles}ideo_mbufmmapstructvideo_picutre{intsize //幀大小intframes //最多支持的幀數(shù),這個(gè)值是可以采用多緩沖的依據(jù)Intoffsets //每幀相對(duì)于基址偏移量}ideo_bufferbufferstructvideo_picutre{void*base //緩沖區(qū)的物理地址intheight //Heightoftheframeintwidth //Widthoftheframebufferintdepth //Depthoftheframebuffer}ideo_mmapmmapstructvideo_mmap{unsignedintframe;//幀序號(hào)intheight,width;//圖像的寬度和高度unsignedintformat;//圖像格式}5.1.2服務(wù)器端視頻采集程序V4LUSB對(duì)采集窗口、顏色模式、幀狀態(tài)初始化,最后才能進(jìn)行視頻圖像的采集.[17]基于V4L的視頻數(shù)據(jù)采集的流程如下:⑴設(shè)備的開啟⑵對(duì)設(shè)備信息的獲取⑶對(duì)圖像信息的獲?、仍O(shè)置設(shè)備和圖像信息⑸對(duì)采集緩沖區(qū)的內(nèi)存映射⑹對(duì)視頻幀數(shù)的捕捉⑺設(shè)備的關(guān)閉開始開啟視頻設(shè)備獲取/開始開啟視頻設(shè)備獲取/設(shè)置設(shè)備信息和圖像信息對(duì)采集緩沖區(qū)進(jìn)行內(nèi)存映射捕捉視頻幀數(shù)據(jù)No采集終止圖像處理Yes關(guān)閉視頻設(shè)備結(jié)束圖5-2 視頻采集流程圖USBLinux中的設(shè)備文件名為“/dev/vide0便是針對(duì)此設(shè)備名進(jìn)行.完成視頻圖像采集的具體步驟如下:打開視頻設(shè)備調(diào)用cam_fp=open("/dev/video0",O_RDWR)函數(shù).如果調(diào)用成功,返回設(shè)備文件描述符cam_fp;若打開失敗則返回-1.視頻設(shè)備成功打開后,就可以對(duì)設(shè)備文件進(jìn)行讀寫操作了.讀取設(shè)備的基本信息video_capability中有關(guān)攝像頭的信息,如攝像頭的名字,可獲取最大、最小圖像的分辨率等.讀取并設(shè)定圖像信息函數(shù)來讀取圖像的基本信息.如亮度brightnessdepthpalette等.得到的信息保存在video_picture結(jié)構(gòu)體里video_picture結(jié)構(gòu)體的成員中需要修改的變量進(jìn)行重新賦值,然后調(diào)用函數(shù)進(jìn)行參數(shù)的重新設(shè)置,這里需要注意的是重新設(shè)置后切不可再次調(diào)用.channel信息ioctl(cam_fp,VIDIOCGCHAN,&(vd->channel))函數(shù)來讀取信號(hào)源信息.如果是多通道的視頻采集卡(s看出,就必須設(shè)定是通過哪個(gè)信道來采集視頻.vd->channel結(jié)構(gòu)體中的成員重新ioctl(cam_fp,VIDIOCSCHAN,&(vd->channel))函數(shù)來實(shí)現(xiàn).進(jìn)行視頻采集mmap()內(nèi)存映射通過內(nèi)核緩沖區(qū)來讀取數(shù)據(jù).mmap().下面對(duì)比介紹這兩種方法.①直接讀取方式USBC語言中常見的文件讀寫函數(shù)來訪問.直接讀取視頻數(shù)據(jù)就是通過系統(tǒng)調(diào)用read()函數(shù)來實(shí)現(xiàn).read().函數(shù)原型為read(fd,(void*)pFramebuffer,(sizet)framesizeIn)其中fd為文件描述符,pFramebufFer為需要讀取的數(shù)據(jù)的長度.對(duì)于攝像頭設(shè)備的讀取,需要先分配內(nèi)存空間,用來存儲(chǔ)從攝像頭讀取視頻幀的大小.②使用mmap()內(nèi)存映射采集圖像mmap()函數(shù)來實(shí)現(xiàn)的.mmap系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存.普通文件被映射到進(jìn)程地址空間read(),write()等操作,從而提高采集傳輸系統(tǒng)的實(shí)時(shí)性.[19]ioctlVIDIOCSFBUF命令獲得攝像頭存儲(chǔ)緩沖區(qū)的幀信息,之后初始化video_mmap中的設(shè)置,重新設(shè)置圖像信息,如幀的垂直及水平分辨率、調(diào)
溫馨提示
- 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. 人人文庫網(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年度診所執(zhí)業(yè)醫(yī)師醫(yī)療風(fēng)險(xiǎn)防控聘用合同
- 二零二五年度手車轉(zhuǎn)讓與綠色出行推廣合同
- 二零二五年度投資分紅股收益分配協(xié)議
- 二零二五年度汽車展覽會(huì)參展商展位電力合同
- 2025年度道路破碎修復(fù)與再生利用合同
- 2025年度青貯收割作業(yè)與農(nóng)業(yè)物聯(lián)網(wǎng)平臺(tái)合作協(xié)議
- 二零二五年度口腔診所醫(yī)生培訓(xùn)與薪酬管理合同
- 二零二五年度商業(yè)秘密保護(hù)與員工保密義務(wù)合同
- 二零二五年度多功能辦公場所租賃服務(wù)協(xié)議
- 2025年度蔬菜大棚承包與品牌授權(quán)合作協(xié)議
- 談心談話記錄100條范文(6篇)
- 中學(xué)生心理輔導(dǎo)-第一章-緒論
- 工業(yè)品買賣合同(樣表)
- (完整)消化性潰瘍PPT課件ppt
- 《教育學(xué)原理》馬工程教材第二章教育與社會(huì)發(fā)展
- 《常見疾病康復(fù)》期中考試試卷含答案
- 地球使用者地樸門設(shè)計(jì)手冊(cè)
- 筑基功法精選
- 歐洲電力市場深度報(bào)告:歐洲電力市場供需格局和電價(jià)分析
- 2023年考研考博-考博英語-煤炭科學(xué)研究總院考試歷年高頻考點(diǎn)真題薈萃帶答案
- 塔式起重機(jī)操作使用安全專項(xiàng)方案
評(píng)論
0/150
提交評(píng)論