基于S3C2410的视频监控系统的设计与实现
姓名:吴军勇申请学位级别:硕士专业:物理电子学指导教师:张国平
20090501
⑨硕士学位论文MASTER’STItESIS摘要视频监控系统以其直观、方便等特点广泛应用于诩:多场合。随着嵌入式系统和通信技术的快速发展,传统的基于模拟信号的监控方式已经小能满足FI益增长的市场需求。本文在深入研究ARM体系结构、Linux设备驱动、V4L的基础之上,将基于ARM的嵌入式开发方法与网络技术栩结合,实现了基于¥3C2410和嵌入式Linux的远程图像监控系统。首先,我们对视频监控系统的研究背景、嵌入式Linux操作系统、ARM体系结构的基本知识和本文的主要工作进行了简单的介绍。然后,我们介绍了系统的总体结构,在这里我们介绍了系统的各个主要的硬件模块和系统的软件结构,即B/S模式的视频监视架构。其次,我们详细讨论了Linux设备驱动的开发方法,分析了USB摄像头驱动的程序结构,并说明了USB摄像头驱动程序的设计要点。再次,我们详细讨论了视频图像采集的实现过程,阐述了JEPG压缩步骤,并构建了一个boa服务器,实现了基于TCPsocket的图像传输。我们搭建了系统的开发平台,构建了一个由bootloader、Linuxkernel和根文件系统组成的嵌入式软件系统。最后,我们展示了在客户端观看视频监控的结果,对本文]:作进行总结并对未来后续工作提出了展塑。关键词:¥3C2410;嵌入式Linux;摄像头驱动;V4L;视频监控AbstractVideominitorsystemconvenience.withthefastiSwidelyusedindevelopmentinalotofoccationsforitsintuitionandsystemandembeddedoncommunicationtechnology,traditionalmonitoringmethodswhichbasedincreasingrequirementsofthemarketanyanalogsignalcannotmeetthestudyingonmore.In—depthARMarchitecture,LinuxdevicedriversandvideoforLinux,combiningembeddedsystemdevelopmentmethodbasedonARMwithnetworktechnology,thispaperhasrealizdonremoteimagemonitorsystembasedFirstofall,wemakeminitoringsystem,theaS3C2410andembeddedLinux.simpleintroductiontotheresearchbackgroundofvideoLinuxoperatingsystem,thebasicknowledgeofembededadvancedRSICMachinearchitectureandthemainworkofthispaper.Secondly,wehaveintroducedtheoverallstructureofthesystem,inthispartweintroducedthemajorhardwaremodulesofthesystem,andthenintroducedthesoftwarearchitecture,thatiS,B|Smodevideomonitoringstructure.Thirdly,wehavediscussedthedevelopmentmethodofLinuxdevicedriversindetail,analyzedtheUSBcameradriverprogramstructure,anddescribedthedesignfeaturesofcameraUSBdrivenInthefourthpartofthispaper,wehavediscussedtherealizationofvideoimageacquisitionprocessindetail,describedJEPGcompressionsteps,andbuildaboaserver,realizedtheimagetransmissionoverTCPsocket.Andthen,wesetupthesystemdevelopmentplatform,andbuilttheembeddedsoftwaresystemswhichconsistedbythebootloader,Linuxkemelandtherootfilesystem.Finally,wehaveshowedtheexperimentalresultsofthevideomonitoringsystemfromtheclient’Sbrowser,andsummarizedtheworksdoneinthispaper,andthellgivensomercsarchpointstobecontinued.Keywords:¥3C2410;EmbeddedLinux;CameraDriver;V4L;VideoMonitoring⑨硕士学位论丈^l^S丁ER‘STHES]S华中师范大学学位论文原创性声明和使用授权说明原创性声明本人郑重声明:所呈交的学位论文,是本人在导师指导下,独立进行研究工作所取得的研究成果。除文中已经标明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做H{贡献的个人和集体,均已在文中以明确方式标明。本声明的法律结果由本人承担。懒名:灭x2霉多日期。7“月Ⅵ学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使川学位论文的规定,&|]:学校有权保留并向国家有关部门或机构送交论文的复印件和电二于版,允许论文被查阅和借阅。本人授权华中师范大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采川影印、缩印或扫描等复制手段保存和汇编本学位论文。同时授权中陶科学技术信息研究所将本学位论文收录到《中国学位论文全文数据库》,并通过网络向社会公众提供信息服务。本人已经认真阅读“CAMS高校学位论文全文数据库发布章程",同意将本人的学位论文提交“CALIS高校学位论文全文数据库”中全文发布,并可按“章程"中的规定享受相关权益。回意途室握窆厦溢卮L旦堂玺i旦二生;旦三生筮鱼!.作者签名:日期:弋参1年6月阳天切导日⑥硕士学位论文MASTER‘STlIESIS第一章绪论1.1研究背景及意义国内外视频监控技术的发展动力源于对特殊场所安全的需求,出于反恐、国家安全、社会安定和建设和谐社会等多方面的需要,视频监控技术逐渐成为被人们关注的热点和前沿研究领域。近年来视频监控技术发展极为迅速,已经从第一代的模拟视频监控系统发展到第二代的部分数字化视频j}{i控系统,目前iF在朝第三代完全数字化视频监控系统的方向迈进I¨。目前,视频豁控系统主要应用在以下几个方面:交通安全:如铁路、车站、机场、公路等场所的安全监控。工业领域的安伞和质量监控:如生产车问的一些自动化设备的监控,实时监视其工作状态。居住环境和公共场所安全:如银行、超市、停车场、居民小区等。医院和监狱:如对传染病人jflI服刑人员等特殊人群的远程监控等。军事领域:如空中监视、战场中对部队移动的监视等。嵌入式系统是以应用为t}-心,以计算机技术为基础,软、硬件均可裁剪,适用应用系统对功能、可靠性、成本、体积、功耗严格要求盼专用计算机系统【2J。fn器根据美国电子电气工程协会(IEEE)的定义,嵌入式系统是“用来控制、监控、或者辅助操作机器、装置、工J一等大规模系统的设备(devicesassisttheopermionofequiment,machineryorusedtocontrol,monitor,orplants)”121。本设计所采用的基于ARM的嵌入式技术的视频监控的主要优点是:第一,数字化的视频图像数据可以不受距离限制地通过计算机网络上进行传输,其信号不易受到干扰,这样可以大幅度提高图像的品质和系统的稳定性;第二,数字视频图像可利用计算机网络连接,网络带宽可复用,不需要为此系统进行专门的布线;第三,经过压缩之后的视频图像数据可以存储在磁盘中,查询简便快捷13J。基于¥3C2410的嵌入式视频监控系统具有以下特点:监控范围广:本设计中将采集到的视频数据在网络上进行传播,因此只要是有网络可以覆盖的地方,该系统就可进行视频监控。扩展能力强:本设计所采用的浏览器一客户端模式的视频蕊控系统,实现了服务器端采集视频到客户端显示的完整监控过程,对本系统做适当的扩展与修改,可应用于更加复杂的场合,如基于Intemet的视频监控,多路监控等。⑨1.2硕士学位论文M^STER‘STIIESIS性能稳定可靠:本设计的服务器端采用的ARM9处理器¥3C2410A和Linux操作系统捆绑紧密,功能更加专一,不像PC机那样容易受到其他软硬件环境的影响。ARM体系结构ARM(AdvancedRISCMachines)是微处理器行业的一家知名食业。ARM处理器以其性能高、功耗低、体积小、代码密度紧凑和多供应源(包括芯片供应商、=Jl:发环境供应商、调试工具供应商等)的出色结合而著名。它的RSIC性能业界领先,以小尺寸集成,具有很低的芯片成本,在非常低的功耗和价格下提供了高性能的处理器。目前,ARM在移动通信、消费电子等领域拥有很高的市场占有率,它这些领域嵌入式解决方案的RSIC标准。ARM体系结构主要由32bit的逻辑运算单元ALU、31个32bit的通用寄存器和6个状态寄存器、移位寄存器、乘法器、指令译码器及控制逻辑单元、指令流水线和数据/地址寄存器等单元组成。基于ARM体系结构的处理器具有以下特点141:(1)因为.‘孑处理器打交道的指令执行时间远远人于在寄存器内操作的执行指令的,,Iff3j,ARM采刚了RSIC普遍采用的Load/Store结构,即多{有Load/Store指令可以与存储器打交道,其他指令都不允许进行存储器操作,从而达到了减少功能复杂的指令、使用频度最高的指令,最终达到简化处理器结构的f1的。(2)由于RSIC处理器的指令功能相对较弱,为弥补此不足,在新型ARM体系结构定义了16位的Thumb指令集。Thumb指令集比通常的8位和16位CISC/RISC型处理器具有更好的代码密度,而:卷片面积只增加6%,这样更节约程序存储器空fnj。(3)ARM可以支持用户、快速巾断、中断、管理、终II二、系统乖l未定义等7种处理器模式,除了用户模式外,其他均为特权模式。这也是ARM的特色之一,可以大大提高ARM处理器的效率。(4)ARM体系机构具有协处理器接口,这样,既可以使基本的ARM处理器内核尽可能小,又可以方便的扩充各种功能。ARM允许接16个协处理器。(5)由于ARM体系结构的处理器多用于手持式嵌入式系统中,所以特别注意低电压低功耗的设计。本系统所用到的¥3C2410处理器是Samsung公司生产的基于ARM体系结构的ARM920T处理器核,具备上述基本特点。1.3嵌入式Linux操作系统操作系统的基本思想是隐藏底层不同的硬件差异,向在其上运行的应用程序提2⑧\::::/硕士学位论文M人STER’STHESIS供一个统一的调用接口,它主要完成四项任务:内存管理、任务管理、文件管理和外围设备管理。嵌入式操作系统(EmbeddedOperatingSystem)就是工作在嵌入式环境中的操作系统,它负责嵌入式系统全部软、硬件资源的分配、调度、控制、协调,能够通过加载/卸载某些模块来达到系统的功能要求。嵌入式操作系统除了…般操作系统的基本功能外,还有以下特剧":(1)其设计目标是为了完成某一项任务或有限项助能,而不像通用型的操作系统那样拥有常见的许多功能;(2)在性能和实时性方面可能有更加严格的限制;(3)功耗、成本和产品可靠性是影响设计的重要因素;(4)占用系统资源少,适合在有限的存储空问内运行;(5)系统功能针对具体的需求进行裁剪,以满足最终产品的设计要求。Linux是遵循GPL协议的开放源码的操作系统,嵌入式Linux操做系统是将Linux操作系统进行裁剪修改后使之能运行在嵌入式计算机上的操作系统。使用它作为嵌入式计算机系统有许多优势。第。,Linux足tJI:放源代码的,方便了任何爱好Linux的软件二[:程师都・叮以在它的基础l二进{j:"发,遍斫j全球的Linux技术社区足Linux开发者的强人的技术支持;第二,Linux系统内核较小、效率高,内核的更新速度很快,并且Linux内核还是是可以定制的,对于开发者来既使用起来更加灵活方便。第三,Linux是免费的操作系统,柱价格上极具有很强的竞争力。Linux还有着嵌入式操作系统所需要的很多特色,最突出的地方那个就是Linux适应于多种CPU和多种硬件3F台,因此具有很好的移植性。到目前为止,它可以支持包括ARM体系结构在内的■:、三-|-种CPU。1.4本文的主要工作本文的主要工作包括如下内容:(1)在友善之臂SBC2410V6实验板上移植了一套Linux系统,包括U.boot、linux一2.6.11.1内核和根文件系统。(2)在ARM.1inux下完成了USB摄像头的图像采集工作。(3)将采集到的RGB格式图像压缩成成JPEG格式。(4)在开发板上构建boa服务器,并通过socket编程实现视频图像的传输。(5)实现视频图像在客户端网页浏览器上的显示。⑧\二一一硕士学位论文M^STER‘STItESIS1.5论文内容安排本设计的最终目的是在相关硬件的基础上构建一个基于ARM9处理器¥3C2410A的视频监控系统,主要实现视频图像的在基于ARM9的服务器端采集和压缩、基于TCP协议的网络传输及在基于PC机的客户端的鼹示。本设计将传统的监控系统与现代网络通信技术相结合,采用Browser/Server模式进行设计,减小了视频监控中客户端软件的复杂度,更加方便用J、与服务器的交互。论文的具体内容安排如下:第~章,绪论。介绍了课题研究背景和意义、ARM体系结构、嵌入式Linux概况,以及本文的主要工作和内容安排。第二章,系统的总体结构。介绍了本设计所用到的SBC2410.V6丌发板和新视通摄像头的基本情况、本构建本系统所需的硬件资源和构建本系统的软件架构。第三章,USB摄像头驱动。分析了摄像头驱动的结构及关键设计思路。第叫章,视频图像的采集、压缩与传输。介绍了Vide04Linux编程、图像采集其体实现的过程、图像j.ii缩技术、boa服务器的构建过程、基于TCP的图像传输过程等内容。第血章,嵌入式Linux系统的移植。主要介绍了Bootloader、Linux内核、ya凰文件系统的编泽和移植。第六章,总结与展望。展示了本系统运行结果,简要总结本论文所做的工作,并对下一阶段的研究工作进行了展望。4第二章系统的总体结构2l系统的硬件结构奉系统采用厂州友善之臂计算机科技公司生产的SBC2410V6作为碰件平台r它基于韩霄三星公司的ARM9处理器¥3C2410A,采用6屋板设计,具有高性能、低功耗、接n丰富和体积小辞优良特Ri“。如同2-1所示,魁使用奉系统扣摄f『JSBC2410V6的实物图。华中师范人学光电子信息上程实验室枞颧j‰控系统黢■瓣幽2I使川奉系统拍摄的SBC2410V6扳实物嗤本系统的硬件主要包括以下几个方面。(11cPu处理器为三星¥3C2410A芯片,主频200MHz,最高频率达266MHz;圆¥DRAM芯片HY57V561620,包含32bit数据总线,其时钟频率高达100MHz:f3)64M的NaadFlash存储器芯片K9F1209DOA.掉电非易失;㈣1个10M以太网RJ-45接口:(5)1个USB}f皤tA型接口(遵循USBI.1协议):(6)1个标准.[TAG接口,主要用束F载Bootloader;(7)1个电源接口(5v):⑧硕士学位论文MASTER’STItESIS\::/(8)新视通摄像头,采用的是中星微Z301的:卷片;(9)PC机,用来通过IE访问ARM9服务器。本系统的硬件总体结构图如图2.2所示。图2—2视频监控系统硬件结构圈ttt-I二本系统是在比较成熟的硬件基础一卜进行设计的,下面仅对系统硬件中最关键的几个部分进行简单的介绍,我们不过多关注硬件实现的细节。2.1.1¥3C2410处理器介绍¥3C2410处理器是韩围三星公iiJ(Samsung)在美因ARM公司的ARM920T处理器核的基础上,采用O.18um制造工艺生产的32位微处理器。¥3C2410采用272脚的FBGA封装,含有非常丰富的片内设171:(1)1个LCD控制器。(2)SDRAM控制器。(314个通道的DMA。“)3个通道的UART。(5)4个具有PWM功能的计时器和1个内部时钟。(6)1个USB设备接口。(7)1"2C总线接口。(8)2个SPI接口。(9)8通道的10位ADC触摸屏接口.6⑧硕士学位论文MASTER’STItESIS(10)1个USB主机接口。(11)SD接口和MMC卡接口。(12)117位通用I/O口和24位外部中断源。(13)8通道10位AD控制器。在时钟方面¥3C2410X也有突出的特点,它芯片集成了~个具有同历功能的实时时钟发生器RTC和具有PLL(MPLL和UPLL)的:卷片IFt-'0l'发生器。其中MPI。L单元产生的主时钟能够使处理器的最高工作频率达到203MHz,这个工作频率能够使处理器轻松运行于Linux、WindowsCE等操作系统之上以及进行比较复杂的信息处理和运算。UPLL单元则产生实现主从USB功能的时钟,供USB模块使用。¥3C2410X将系统的存储空间分成8个Bank,每个Bank的大小是128MB,共1G。Bank0到Bank5的开始地址是固定的,可以用于ROM和SRAM。Bank6和Bank7可以用于ROM,SRAM或SDRAM,这两纽Bank可编程且大小相同。而从Bank7了f:始的地址是Bank6结束的地址,它的结束地址灵活可变。所有内存块的访问周j鲥都可编程。¥3C2410X可以采用nGCSf7:018个通用片选信号选择这些Bank。¥3C4120X具有三种启动方式,可通过OM【1:0l锋脚进行选择。其中包含支持从NandFlash和NorFlash启动方式,NandFlash其仃容量大,比NORFlash价格低等特点,在本系统中,我们选择从NandFlash启动。系统采用NANDFlash:{!;片FLASHl208UOM与SDRAM芯片K4S561632C—TC75组合,可以获得非常高的性价比。2.1.2存储电路友善之臂_:}I:发板包括三种存储器接口I乜路,NorFlash接U、NandFlash接【_]和SDRAM接1]}乜路。由于本系统是从NandFlash启动的,我们只考虑NandFlash接口和SDRAM接口电路。NandFlash具有成本低,擦写速度快,支持随歧口存敬,高存储密度等特点,是一种非易失存储器。本文硬件中采用SAMSUNG公司生产的FLASHl208UOM芯片用于存放Bootloader、内核文件、根文件系统、应用程序和用户数据。该芯片为8位NandFlash,容量为64M,采用TSOP封装。FLASHl208UOM的I/O口既能接收和发送数据,也能接收地址信息和控制命令。在CLE有效时,锁存在I/O口上的是控制命令字;在ALE有效时,锁存在1/o13上的是地址;/RE或/WE有效时,锁存的是数据181。这样一13多用的方式大大减少了总线的数目。NandFlash接口电路如图2.3所示。SDRAM是一种易失存储器,不具备掉电保持数据的特性,其存取速度大大高7⑧\:一,硕士学位论文MASTER’STHESIS于Flash存储器,具有读写特性。因此,SDRAM用来做程序的运行空间、数据和堆栈区。图24是K4S561632C—TC75的接口电路罔。图2—3NandFlash接口电路由。尸”王-r图2-4SDR/L~!的接口电路£了]习r:2.1.3以太网电路基于以太网的网络连接最典型的应用形式是Ehernet和TCP/IP的组合,它的底层是以太网,网络层和传输层采用国际公认的标准TCP/IP协议。本系统中采用的是Crystal公司的CS8900,该芯片是一款单121的10/100Mbps快速以太网物理层接口芯片191。它与¥3C2410的接El电路如图2.5所示。在本系统中,我们使用该接口电路进行uboot.bin、zlmage、filesystem.yaffs等文件的下载和视频图像的传输。8硕士学位论文M人S丁ER’STI-]ESIS;i;;;囊;;鼍i芎{i》2耋j每=~{==foZ71<‘‘‘7‘‘‘一量妻量星蔓主三三I5S三S5≤≤暑≤S≤j量沁。n};晰榔搿1I牛jj高篙£器磊l矗矗矗矗矗矗矗矗孟矗舞矗l}l{l}£li景景嚣f=;{;;l.f;叁e毫君善匿壹璺.‘一+时旺罐SS==5古董;二≤毒====l:==崔I盆,‘一彭‘j熏霎i蘑√|鬻蓁睾穿。J●6C站量1捕0。黧/v(1"4.,.1妻。~;凌藩}'ldj;誊嚣穹’;”“。广卜_母童广。p_!,三曼:§ll’1ilzHg≥;盘:§‘一蔷ji.:。iIH石一,叫口卜』基。・警蕾窨量;熏至一‘瓤.雪;奔’{孑1.了茎龠,11.n.冲..。觏。Et罕一生;1譬Ig=。、,~jg2锄2—1”g.亳尝§.。。‘I..p”Ai§△i墨Q;星Q;高釜~.拶’。‘●暑§..,§Il、z鼍I考幽2.5以太网接口电路9⑧\::/硕士学位论文MASTER‘STHESIS2.1.4串口目前,在国际上最通用的串行通信接口标准是电子工业协会(EIA)制定的RS一232C标准,它采用的是9芯或25j卷的D型插头,如图2-6所示。在本系统中,我们使J}j串rJ来和WindowXP下的超级终端进行通信。COMllXCO》N【)B96273g495RS’lXDORSc’IS0—裟蚺TIINIII[、o』避J叫Ro帆至J黑}婴一T21N蚓塑!{Ro垤。叫糍州l——oL—土当当RSRⅫ)oRSRlS0T2刚OU2F'—立,7—』R&SR型IS0\:/1ale)c5∞一¨+::::::耵molu叫c1.三Br晓.14器翟1丁潞图2-6RS一232接口电路2.1.5JTAG接口JTAG(JointTestActionGroup)是~种国际标准测试协议,通过这个标准可对具有JTAG接【1芯片的硬件电路进行边界扫描和故障检测,主要用于芯片内部测试及对系统进行仿真、调试【lOl。JTAG技术也是一种嵌入式调试技术,通过JTAG接口可以对嵌入式系统内部的所有节点进行测试。目前,ARM、FPGA、DSP等主流嵌入式芯片都支持JTAG协议,ARM9微处理器芯片带有JTAG接口。JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,实现对各个器件分别测试和ISP(In.SystemProgrammable)系统编程、对目标存储单元(如NandFlash进行编程。JTAG接口描述见表2.1所示。在本系统中,我们使用JTAG接口进行u-boot镜像文件首次下载到开发板,在PC机端我们使用并口连接。JTAG接口和并口的转换电路如图2.7所示。10硕士学位论丈MAS下ER‘STIlESIS表2.1JTAG接口描述・;I脚1幺弱:V”efVcc‘l脚助隧描述【j轹板参考电艇.拨I毡灏缓f也源测试系统堑位信呼接地测试数掘}l{行输入测试模式选择溯试时钟溯试时钟返I.“lffl垮测试教掘书行输:{{目珏系统耋乏经信t,未连接nTRST4.6。8,10.1:.14,16,18,20GND5TDI7ThIS9TCK11RTCK13TD015nRESET17.19NClI。Ull一l!!G1G2i87654能罂;ii・i岢”a宁}:。,4№川孳7上l20;…VCC………P嘤10上32●一南‰棒亍ll=C5300plF图2.7并口和JTAG口转换电路2.1.6USB接口¥3C2410芯片带有USB接口管理器,包括USB.HOST和USB.DEVICE两类,⑨硕士学位论丈M^STER’STHESIS其中,USB.HOST是本系统中USB摄像头所要使用的USB主机接口。其接口电路如图2.8所示。其中DNO、DPO接到¥3C2410A芯片的相应引脚上。‘=F图2.8USB接口电路2.2系统的软件结构在一个嵌入式Linux系统l|l,从软件的角度~般可以粗略的分为引导加载稚序、Linux内核、文件系统和用,、应用程序等3个层次…l,如图2-9所示:I引导加栽程序l引导参数l内核l根文件系统I图2-9Linux系统的总体框架(1)第一部分是引导加载程序,它包括固化在固件内的boot代码和Bootloader代码两个部分。许多CPU在运行Bootloader之前会先运行一段被称之为固件的程序,例如x86结构的CPU就是先运行BIOS中的固件,然后再运行硬盘主引导记录MBR(MasterBootRecord)d?的Bootloader。在系统中本没有固件程序,Bootloader是上电后执行的第一个程序。(2)第二部分是Linux内核。这一般是为特定于某种体系结构的嵌入式板子定制的内核和内核的启动参数。一般I面言,内核的启动参数是内核默认的,或是由Bootloader传递给它的。(3)第三部分文件系统。里面包含了Linux系统能够运行所必需的应用程序、库等,例如给用户提供操作控制界面的shell程序,动态连接程序运行时所需要的glibe或uClibc库等,本设计中我们使用的文件系统是ya舔文件系统。本系统的视频监控,是通过Browser/Server模式来实现的。因此,基于web的视频图像监控系统包括采集视频图像的服务器端(友善之臂SBC2410实验板)和进行监控的客户端(PC机网页浏览器),其系统框架如图2.10所示【121。12服务器端(友善之臂SBC2410开发板)Socket监听PC机客户端浏览器Javat流媒体服务进程applet用来连接和播放视频图像下载Javaapplet程序到本地运行boa服务器一视频播旅模块t‘职m掺口中星徽摄像头驱动tLinux内核接口层图2.10BIS模式的视频播放架构13⑥硕士擘位论文MASTER’STIlESIS第三章USB摄像头驱动USB是通用串行外部总线(UniversalSerialBus)的简称,它接l:l简袍,只有5VI乜源和地,两根数据线D+署llD一,支持热捅拔,其接rl标准统一,可以同时挂接多个USB设备,广泛应用在嵌入式设备中【l引。现有的USB总线规范有1.1版和2.0版。¥3C2410的USB控制器只支持USBI.1版本。USBI.1规范可以支持两种传输速率:低速1.5Mbps和全速12Mbps。3.1Linux设备驱动程序Linux外设一般可以分为字符设备,块设备和网络设备等三类。字符设备是指可以像字节流…样被访问的设备。块设备上的数据以块的形式存放,块设备与字符设备不同的是,它通常按照一定的存储格式存放数据。网络设备同时具有字符设备和块设备的一些特点,例如在网络传输中的报文,包,帧等,它们的输入和输出都是成块的,有结构的;但是块的大小又是不刚定的,可以大到几千字节,小到几个字节。由・l二USB设备足通过快速耳;口通信来完成数据的读写,因此我们~般将USB设备当作字符设备来进行处理1141。Linux内核就的很大部分是由各种驱动程序构成的,内核中高达85%的代码是各种驱动程序的代码。Linux软件的伟大之处在于GPL(GNUPublicLicense)协议,我们要站在前人的基础上作进一步的开发,避免霞复的工作。所以编写驱动的难点并不是硬件的具体操作,而是弄清现有驱动程序的框架,在这个框架的基础上加入这个硬件。一般说来,编写一个Linux设备驱动程序的大致流程如下『J5J:(1)查看电路原理图、数据手册,了解设备的操作方法;(2)在内核中找到相近的驱动程序,弄清它的框架结构,以它为基础进行开发;(3)实现驱动程序的初始化,向这个内核注册这个驱动程序,这样应用程序传入文件名时,内核才能找到相应的驱动程序。(4)编写需要实现的操作,如open,close,read,write等函数;(5)编译该驱动到内核中。Linux操作系统将所有的设备都看成文件,然后以操作文件的方式进行访问。应用程序不能直接对硬件进行操作,而是使用一些统一的函数接口来调用硬件的驱动程序,这些在库函数中定义的函数接口叫作系统调用接口SCI(System备驱动程序,这些函数集合在一个struet14CallInterface)。对于每个系统调用,驱动程序中都有一个与之对应的函数,对于字符设fileoperations的数据结构中,因此我们可snoitarepo_、⑧\:1:./硕士学位论文MASTER’STIIESIS以认为这个数据结构的实质就是函数跳转表【16J。我们可以在内核linux/fs.h文件中找到关于它的详细声明。因此,编写没备驱动程序的一个非常重要的工作就是为具体硬件的fileoperations结构编巧各个函数。例如,当应用程序使用open函数打丌某个设备时,系统就会调用fileoperations结构叶I的open函数,如果它返网0就表示成功打开了设备文件,否则就表示代开失败。在file这个结构巾定义了例如readwrite、ioctl、lock等多个成员函数,而且随着Linux内核不断发展,实现符种功能的函数不断增加,其函数功能意义我们不一一列出。file结构是另外的一个重要的数据结构,由于它是一个内核结构,因此不会出现在用户空问,它…般由Linux内核在执行open操作的时候创建,代表的是一个被打丌的设备文件。File结构实际代表的是设备的一个实例句柄,当一个设备文件同时被多个进程打丌时,具有多个file句柄而inode只有一个117I。在内核中,我们通常f{jfops表示指向fileoperations结构的指针,用flip表示指向file结构的指针。内核使用inode结构在内部表示文件,凶此它和file结构有所不同。对单个文件而言,可能会有多个表示打开的文件设备的file数据结构,但他们郝指向单个的inode结构。inode结构I卜的字段devfiletirdev包含了真jE的设备编号。opermions、file、inode等三个结构体是Linux设备驱动巾的i个重要数据结构,我们在后面将会川到他们。3.2USB摄像头驱动程序结构USB接口分为主机从机方式,多个设备连接成一个树状网络结构,所以USB主机必须具备能够对连接在总线上的所有USB从机设备进行管理功能,所有USB动作都由USB主机发起1喁J。LinuxUSB主机的驱动部分由HCD,USBD,USB等设备类驱动三部分组成,如图3一l所示【191。下面分别对USB驱动结构中重要的模块进行介绍:(1)主机控制器驱动HCD(HostControllerDriver)是主机驱动中与硬件部分进行直接交互的软件模块。我们用usbhcd结构体来描述主机控制器,可以在Linux内核的drivers/usb/eore/hed.h文件中找到关于它的定义,它包含了HCD的基本信息、硬件资源、状态描述,负责主机控制器的初始化、并为USBD层提供相应的函数接口。HCD支持UHCI(UniversalHostInterface)、EHCl(EnhancedControllerInterface)、OHCl(OpenHostControllerHostControllerInterface)等三种规范。⑥硕士学位论文MASTER’ST11ESIS应用软件八{rUSB伎昝麦马匹功打Ep机驱动摄像头驱动.卜一奇储娄驱动…r—jr-7’V1..…US廿UIj芏USB内核USBIhub驱动程序Ij芏HCL)UHcI驱动0HCI驱动EHCI驱动j∑IT拣B龋件辖口}l。J。。“”3“。}t_tHcI马勖¨OHCI驱动lIItl图3-1USB驱动结构EHCI驱动.(2)USBD驱动是整个USB主机驱动的核心,它实现的功能主要分为这几个方面:USB总线管理、USB总线设备管理、USB总线带宽管理、USB的四种类型传输、USBHUB的驱动、为USB设备类驱动提供相关函数接口、提供应用程序访问的USB系统的文件接口等。(3)USB设备类驱动是最终与上层用户应用程序进行交互的软件模块,其功能主要是实现访fuJ特定的USB设备、为应用程序提供访问API等120l。Linux还定义了一个统一的数据传送块即URB(UrfiversalRequestBlock)用来在USB设备类驱动、USBD和HCD问进行数据的传输。应用程序则通过操作系统接口POSlX(PortableOperatingSystemInterfaceforUNIX)来访问相应的USB设备类驱动程序和USBD驱动;USB设备类驱动程序则通过USBD驱动层提供的相关函数接口将数据请求包传递给USBD:USBD通过HCD层提供的函数接口将数据包传递给HCD;HCD层最终将请求数据包发送到USB总线上。当有设备接入到USB总线的时候,USBHub驱动会通过中断数据传输来获得当前设备连接信息,通过调用USB内核模块的相关函数来完成对USB设备的有关配置工作,同时USBD层会为新的设备分配USBD层所需要的各种资源和HCD层的各种资源。接着USBD层通过调用所有的USB设备类驱动程序都提供了的probe函数来查找适合该设备的设备类驱动程序。当设备16⑨硕士学位论丈MASTER‘STttESIS断开的时候,USBHub会通过中断数据传输来获得当前设备断开的有关信息,然后通过调USB内核模块所提供的相关函数来释放USBD层和HCD层为其分配的资源。同时调用给设备的驱动程序所提供的disconnect函数来通知设备驱动样序它已经断)I:。数据传输过程见图3—2。USB设备类驱动的一个最主要的功能就是向USBD层提供一个函数接口,并向usbdevice数据结构注册这个设备。USBD层是整个USB主机系统的核心,它主要通过usbbus、usboperations、usbdriver、usbdevice等四个数据结构来实现了对USB总线、USB主机控制器、USB设备驱动和所有USB设备的管理。图3-2USB数据传输过程USBD层通过usbdevice这个数据结构来保存与每个USB设备相关的信息,并对总线上的所有USB设备进行资源分配等管理。下面对usbdevice中的各个主要成员进行简单的介绍。这个结构体中的devnum指挂接在USB总线上的每个设备唯一的设各地址;本系统所使用的USBl.1协议支持低速设备和全速设备,USBUSBSPEEDSPEEDLOW字段指低速设备,而UNKNOWN字段则是指无法FULL字段则指全速设备,USBSPEED识别的非法的传输速率;bus指USB设备所连接的总线;结构体中的CHILDREN则表示了连接在USBHUB下行端口设备的信息12¨。在usbdriver结构体中实现了设备驱动程序和设备之间的连接与断丌等函数的声明。结构体中的船me字段表示驱动程序的名字,probe函数和disconnect函数分别表示设备挂接和断开时所调用的函数。idtable则记录了该驱动程序所支持的设17⑥3.3硕士学位论文MASTER’STHESIS备的标示。当设备驱动程序被加载时,就会调用usbregister函数向USB子系统注册该设备的驱动程序;当设备驱动程序被卸载时,就会调用usbderegister函数向USB子系统注销此设备的驱动程序。当设备挂接到USB总线t米时,usbdriver结构中的probe函数将会被调用;而当设备断丌连接时,disconnect函数被调J{Jf2叭。USB摄像头驱动设计从上面的分析我们知道,视频设备驱动层是处于上层应用和USB子系统之ffj【J的一个中问层,各种不同的USB设备软件上的差异主要体现在这一层。该层主要完成两个部分的工作:第一是实现相应的接口函数供上层应片j调用,第二是实现相应的接口函数供USB子系统回调。USB系统的层次结构如图3.3所示,在本设计的视频设备驱动函数中,供上层调用的函数接口包括open函数,read函数,close函数和ioctl函数等;供USB子系统回调的函数是probe函数和isoeirq函数122J。上层应用囤叵圃囤囤嚣嚣团曰l巨ioctl接口.Q]—close]扣—]叵亘习E垂亘]USB子系统图3—3USB系统层次结构当上层应用使用open、read、ioctl、close等系统调用的时候,相应的,USB视频设备驱动中的open、read、ioctl、close等接口等将会被调用。通俗的讲,回调函数为系统提供一个函数接口,系统会自动记录下这个函数的地址,当某个事件发生的时候,系统就会调用你所提供的这个函数做你定义的事情,可以把它看做是一个下层调用上层的过程。当USB子系统检测到总线上存在有USB摄像头时,probe回调函数被调用;当USB视频设备驱动提交给USB子系统的URB完成的时候,isoeirq函数会被调用。下面具体来说明这几个接口函数的实现过程1231。1.probe函数probe函数是驱动程序调用的第一个函数,当驱动程序检测到有USB视频设备⑨staticint硕士学位论文M人S下ER’STIlESIS存在时,该函数被调用。它的声明及实现逻辑如下:probe(structusb—interface}inteconststructusb—device—id掌id){获取USB的一些通用信息;分配一个企局的数据结构;检测到摄像头信息并保存到全局数据区中去;把设备注册位视频设备;)该函数首先根据参数intf得到USB的~些通用的信息,例如USB设备有多少个配:旨.(configure),以及每个配置有多少个接El(interface)等信息。然后为这个设备分配一个全局的数据结构来保存全局信息,如图片格式,数据缓冲区大小等。最后检测摄像头的基本信息,如该摄像头的公司号、产品号等。最后调用video_registerdevice函数把设备注册为视频设备。2.open函数当应用程序调用open系统函数时,这个函数被渊用。它的声明及实现逻辑如下:staticintopen(structinode车inode,structfile拳file){分配全局内存空问;打开摄像头;初始化2个URB;提交2个URB;)3.read函数read函数的主要功能是将全局数据结构中的缓存中的视频图像数据用copytouser函数拷贝到用户空间中去。其函数声明为:staticssize_tread(structfilecnt,loff_t・ppos)誊file,char事bur,size_t4.ioctl函数当用户调用ioctl函数对视频设备进行控制时,这个函数被调用。它包括两项工作,一是读取摄像头参数,即把全局数据结构中的对应项复制到arg参数中;二是修改摄像头参数,即调用usbcontrol_msg函数对摄像头控制端点发送数据和对全局全局数据结构的修改。其函数声明为:19⑥staticint硕士学位论丈MASTER’STIIESISioctl(structinode卑inode,structfile宰file,unsignedintcmd,unsignedlongarg)5.回调函数isocjrq回调函数isocirq是驱动样序中的一个非常匝要的函数,它从,}j户调用open函数打开摄像头丌始一直处于运行状态直到用户调用close函数关闭摄像头为止。其函数声明为:staticvoidisoe__irq(structurb毒urb.structpt_regs木regs)其执行逻辑如图3.4所示。图3-4isocirq函数流程图⑨4.1.1硕士学位论文MASTER‘STHESIS第四章视频图像的采集、压缩与传输4.1图像采集Vide04Linux编程Vide04Linux是Linux内核为电视捕获卡和并口及USB的摄像头提供的统一编程的接口。配合适当的视频采集设备和驱动程序,可以实现影像采集、AM/FM广播、频道切换等功能,在远程会议、可视电话和视频监控系统中有着广泛的应用124,251。Vide04Linux视频图像采集所使用的一些主要参数和函数定义在Linux内核代码include/linux/videodev.h文件中。下面是videodev.h中定义的几个重要的数据结构的简单说明。(1)structvideocapability包含设备的一些基本信息,如name字段表示设备名称、type字段表示接口种类、channels字段表示信号源信息、maxwidth、maxheight和minwidth、minheight字段则表示的足所支持的最大和最小分辨率等。(2)structvideopicture结构中包含了视频设备采集剑的图像的各种属性,如brightness字段表示亮度、hue字段表示灰度、contrast字段表示对比度等属性信息。(3)structvideochannel结构包含信号源的各种属性,例如如接l:l的种类,VIDEOTYPETV表示电视接口,VIDEOTYPECAMERA则表示摄像头接口,llOrlll字段表示信号源的制式等。(4)structvideowindow结构中包含了有关图像采集的一些基本信息,如用x,y字段表示图像的坐标,witdh字段表示图像的宽度、height字段表示图像的高度等。(5)structvideombuf结构包含了利用mmap方法进行映射的帧信息,例如size字段表示映射内存的大小,frames字段表示图像帧的数目,offsets数组则表示的是图像帧的偏移地址。另外,由于vide041inux中对视频采集部分涉及到的变量和参数很多,我们把与视频采集有关的的参数和结构封装在一个名为vdIn的结构体中,便于处理。在vdln结构体中fd字段表示打开视频设备文件所返回的描述符:videodeviee为图像设备文件名的指针;videombuf,vmmap、videoeap、videombuf,videopict、videowin、videoehan、videoparam等为V4L中几个重要的数据结构,在本节前半部分已有介绍;cameratype字段表示摄像头的类型;c御neraname字段表示摄像头的名称:bridge字段表示为摄像头芯片类型:palette字段表示视频流的格式;grabMethod字段为图像采集方式,有两种方式可用,我们在下一节进行介绍;pFrarnebuffer字21⑥frame硕士学位论文MASTER’STHESIS段表示内存映射后指向设备映射地址指针;framesizeln字段代表每个数据帧的大小;ptframe字段则表示为指向待发送数据缓冲区的指针数组;framelock字段表示等待发送数据缓冲区的锁标志;grabmutex字段表示视频图像采集线程的互斥锁;COUI"字段代表正在传送的ptframe;bppln字段表示为像素点的位深,即。‘个像素点可以用几个比特位来表示;hdrwidth字段代表像素的宽度;hdrheight字段则是像素的高度;formatln字段代表palette的格式;signalquit则表示退出采集信号。4.1.2图像采集的具体实现在本设计中,我们所使用的是USB摄像头设备文件/dev/vide00,据此来进行视频图像采集部分的应用程序设计。视频图像采集部分的主要功能包括设定参数、摄像头I/O控制、视频图像的读取显示等几个部分,其工作流程如图4.1所示1261。图4-1图像采集流鞋图因此,我们的图像采集程序必须包含这样的几个部分:(1)打.丌视频设备⑧fo、.硕士学位论文MASTER’STIIESIS打开视频设备的操作是通过这样的语句实现的:if((vd一>fd=open(vd一>videodevice,0~RDWR))一一1)exit—fatal(”ERRORopeningV4Linterface”);其中fd是通过structvdln*vd定义的,vdln这个结构体我们在上面已经介绍过;open为Linux内核中的一个函数,在sys/types.h中声明,用于对文件的打开操作,其函数原型为:imopen(constchar宰pathname,intflags)参数pathname是被打开的文件名;flags是文件打开的方式,如O—RDWR这种方式是以可读写的方式打开。videodevice是一个文件名,对应视频设备为“/dev/vide00”。如果成功的打开了视频设备,将得到的文件描述符赋给vd->fd;如果得到的文件描述符为.1,表示打开设备时}l;错,并报告“ERRORopeningV4L(2)读取设备信息读取设备信息主要包括这样几个方面的内容。首先是读取video_capability中有关摄像头的信息,并保存到vd一>videocap中。我们可以通过下面的语句实现:interface”。if(ioctl(vd一>fd,VIDIOCGCAP,&(vd->videocap))一一1)exit—fatal("Couldn’tgetvideodevicecapability”);其次是读取videopicture图像信息,保存到vd.>videopict中,可以通过这样的语句来实现:if(ioctl(vd一>fd,VIDIOCGPICT,&vd->videopict)<0)exit—fatalCCouldntgetvideopictparamswithVIDIOCGPICT”);还有就是读墩videochannel中关于设备通道的信息,保存剑vd.>videochan中,可以通过下而的语句实现。if(ioctl(vd一>fd,VIDIOCGCHAN,&vd一>videochan)==一1){if(debug)printf(”Hmmdidnotvd->cameratype2supportVideo._channel协”);UNOW;)else{if(vd->videochan.name){iffdebug)printf(”Bridgefound:%s、n”,vd->videochan.name);snprintf(vd->bridge,9,”‰”,vd->videoeban.name);vd->camemtype2GetStreamld(vd->videochan.name);⑧\::::/硕士学位论文MASTER’STHESISspcaPrintParam(vd一>fd,&vd一>videoparam);}else{iffdebug)printf(”Bridge)(3)设置设备参数接下来就是为摄像头数据采集前的最后准备工作,即对摄像头参数进行设咒,主要包括图像参数和分辨率,可以通过ioctl函数实现。设置图像参数主要是对vd->videopict的各个属性例如亮度、对比度等进行设置,可以通过下面的语句来实现:if(ioctl(vd->fd,VIDIOCSPICT,&vd一>videopict)<o)exit—fatal("CouldntsetvideopictparamswithnotfoundnotaWebcamProbingthehardware!!\n”);vd->carneratype=UNOW;VIDIOCSPICT”);设置分辨率主要是对videowin的两个分量进行设置,可以通过这样的语句来实现:vd->videowin.height=vd->hdrheight;vd一>videowin.width=vd->hdrwidth;if(ioctl(vd一>fd,VIDIOCSWⅢ,&(vd一>videowin))<0)perror("VIDIOCSWINfailed、Il”);(4)进行视频采集在V4L中视频数据的采集有两种方法,第一种是商接读取没备的方法,即通过调用read函数来实现对视频设备的访问。第一种是内存映射法,它通过调用内存映射(mmap)奁fi数使得进程之问通过映射到I_寸一个普通文件实现内存的共享,普通文件被映射到进程地址空问后,进程可以像访问普通内存一样对文件进行访问,不必再调用read,write等操作。由于内存映射的方法可以对内存进行直接的读写操作,不需要任何数据的拷贝,因此具有更高的采集效率。在本系统中,我们采用的是内存映射的方法。具体步骤为:首先设置picture的属性。可以通过下面的语句实现:vd->vmmap.height=vd->hdrheight;vd->vmmap.width=vd->hdrwidth;vd->vmmap.format=vd->formatln;然后,通过这样的语句实现图像的采集:if((ioetl(vd->fd,VIDIOCMCAPTURE,&(vd->vmmap)))<O)24⑨{)硕士学位论文MASTER’STIIESISperror("cmcapture”);if(debug)printf(”>>cmcaptureerr_\n”);erreur2—1;(5)对采集的视频图像进行处理,由于采集到的原始图像冗余量大,不利于在网络上的传输,这里主要是对原始RGB图像压缩编码,我们在4.2节另作介绍。(6)关闭视频设备。主要是释放内存空间,可以通过调用下面的函数实现。free(vd->pFramebuffer);free(vd->videodevice);free(vd->cameraname);free(vd->ptframe[i]);4.2图像压缩在奉系统中,摄像头采集到的视频图像信息通过网络传输厉在客户端的浏览器上通过JavaApplet容器中显示出来。考虑到远程传输的问题,需要埘图像进行压缩,减少网络传输的负荷,这里我们将RGB格式压缩为JPEG格式。JPEG是JointPhotographicExpertsGroup的缩写,即ISO和IEC联合图像专家组,它主要负责静态图像压缩标准的制定,由这个专家组开发的JPEG图像压缩算法已经成为了一个通用的标准,即JPEG标准。/PEG压缩是有损压缩,它的基本思想是利用了人眼对计算机色彩中的高频信息部分不敏感的特点,因此高频部分所损失的内容是入的视觉不容易察觉到的,这样就大大节省了需要处理的数据信息。一个最原始视频图像信息,要对其进行JPEG瞧缩编码,可以分为下面三个步骤12¨。首先,把在空问域当中表示的视频图像转换成在频率域表示的图像。JPEG图像压缩的理论依据是,一般而言,在同~幅图像内,包含了各种频率的分量,而且图像信号的频谱线在0到6MHz的范围内。但大多数为低频频谱线,只在占图像区域比例很低的图像边缘的信号中才含有高频的频谱线。因此在对图像做数字处理时,可根据频谱因素来分配各个频率区间的比特数,例如对包含信息量大的低频谱区域分配较多的比特数,而对包含信息量较低的高频谱区域则分配较少的比特数,这样人眼就察觉不到图片质量的损伤,达到了数据压缩的目的。将原始视频图像从时间域转换到频率域有多种方法,其中应用最为广泛的是余弦变换(DiscreteCosineTransform)。⑨硕士学位论文MASTER’STItESIS其次,使用加权函数对DCT系数进行量化,它利用了人眼对高频部分信息不敏感的特性来实现图像数据的大幅简化。量化过程是图像质量下降的主要原因,因为它实际上是简单地把频率域一卜每个成份,除以一个对于该成份的常数,然后四舍五入取最接近的整数,因此这是整个l丘缩过程rfl的乇要有损运算。最后,使用Huffman可变长编码器前一步骤中的量化系数进行编码。这样就实现了原始RGB图像到JPEG图像的压缩编码过程。JPEG解压缩的过程与压缩编码的过程J下好相反。4.3嵌入式web服务器4.3.1嵌入式web服务器的技术分析随着Intemet技术的快速发展,在不同的计算机系统结构上运行着不同的http服务器。boa是一个运行在Linux系统上的小型http服务器。它是一个单任务的http服务器,如果有两个用户同时访问它,其中一个J{j户必须稍作等待【281。它产生独立的进程来处理CGI程序,因此占用较少的系统资源,这样就保证了访问的可靠性和快速性,因此特别适合在嵌入式场合中的应用。在本设汁中,我{l、J在客户端的通过浏览器访问ARM板上的服务器,boa是一个很好的选择。boa服务器处理来自用户的请求并返M数据给用户端的浏览器。图4.2是boa服务器的体系结构图。图4-2boa服务器体系结构图boa服务器首先进行一些初始的基本配置,然后再建立socket连接。调用select函数来监视文件描述符的状态,再调用相应函数来处理用户请求。如图4.3所示是其工作流程图。幽4-3boa服务器一I:作流挂图4.3.2Boa服务器的移植在这一一节晕,我们介绍boa服务器的移植和配冠。首先,我们可以从http://www.boa.org上下载到boa程序的最新版本boa一0.94.14rc21.tar.tar。(1)解压:群tarxzfboa-O.94.14rc21.tar.tar(2)直接运行src/configurc文件,生成Makefile文件。(3)修改Makefile文件修改CC=gcc为CC=arnl-linux—gcc,修改CPP2gee—E为CPP=arm-linux—gec-E(4)编译:群make接下来进行boa的配置。boa需要在/etc目录下建立一个boa目录,里面放入boa的主要配置文件boa.collf,在boa源码目录下已经有一个实例boa.cont',因此我们可以在它的基础上进行修改即可。在本设计中,配置文件boa.cord"的内容为:⑥Port80硕士学住论丈MASTER‘STttESlSUserrootGrouprootErrorLog/dev/eonsoleAccessLog/dev/nullDocumentRoot/wwwDirectorylndexindex.htmlKeepAliveTimeout10KeepAiiveMax1000MimeTypes/etc/mime.typesCGIPath/binDefaultTypetext/plainAddTypeapplication/x—ht印d—cgicgi以上各项分别解释如下:port是boa运行的端口号。默认的http服务器的端13号为80;User和Group分别为运行服务器时的用户名和组名;ErrorLog为错误Fl志文件的保存位置;AccessLog为访问f:1志文件的保存路径;DocumentRoot为HTML文档的根11录;Directorylndex为首页HTML文档的名称;KeepAliveMax为每个连接的最大请求次数;KeepAliveTimeout为等待连接的时问;MimeTypes资源的媒体类型;DefaultType为资源的默认媒体类型;CGIPath为赋给CGI程序环境变量路径;AddType为资源媒体的附加类型l矧。至此,完成了boa服务器的配置。4.4基于TCPsocket的图像传输TCP是面向连接的全双工的传输协议,可以提供一个可靠的、可流控的、全双工的流传输服务。连接一旦建立,发送端主机的应用程序就不断地把数据写入TCP发送缓存(TCPSendBuffer),TCP就把数据流分块再装上TCP协议首部以形成TCP报文段【301。这些报文段封装成数据报之后发送到网络上。当对方接收到报文段之后就把它存放到TCP接收缓存(TCPReceiveBuffer)qb,目的端主机的应用程序就不断地从这个缓存中读取数据【3IJ。本文中服务器端与客户端通过TCPsocket建立连接,发送/接受数据口。服务器端用C语言实现socket服务程序;客户端用java语言实现,采用javaapplet与服务器建立socket连接,传送数据并显示在客户端的网页浏览器上。⑥硕士学位论文MASTER’STIIESIS4.4.1服务器端编程分析本文中使用socket建立一个服务器释序【32捌,主要步骤为:(1)初始化Vdin结构,可以J1j这样的语句实现:if(initvideoln(&videoln,videodevice,width,height,format,grabmethod)!=o)Vdin中描述了摄像头设备的完整信息,包括V4L标准中定义的所有的函数接口和数据结构和一些用于视频图像采集的参数。关于Vdin结构体的介绍存4.1.1节了进行了说明。(2)创建图像采集线程在主线程中创建图像采集线程,可以使用这样的语句:pthread_ereate(&w1,NULL,(void幸)grab,NULL);其中pthreadcreate创建的grab线程是图像采集的实现部分。(3)初始化socket连接在进行socket通信阿,必须进行socket初始化,可以用这样的语句实现:serv—sock2open_sock(serverport);其中,servsock是一个整型变量,用来保存山opensock创建的一个套接1-1的文件描述符。Serverport参数表示通信的端口号,在之前的程序巾,已经赋值为7070。在opensock函数首先创建socket:if((server_handle2socket(AF_INET,SOCK_STREAM,0))一一1)INETexit—fatal(”ErroropeningsocketAbort!tI);上面的语句中,socket函数的第一个参数为套接I二l的地址家族,这晕的AF表示使用的是IPV4协议族,第二个参数为套接口的类型,这避的SOCKSTREAM表示使用于TCP协议,第三个参数表示套接口的通信协议,对于给定的协议族,只有单一的协议支持特定的套接口类型,这时只需将这个参数设置成0即可【341。接下来,使用setsockopt函数来设置serverhandle所指定的socket的状态。用这样的语句来实现:if(setsockopt(serverhandle,SOL_sOCKET,SO_REUSEADDR,&o_.oIl,sizeof(int))一-1)exit—fatal(”SettingreusedaddressfailAbort!”);初始化端口地址:initaddr(&servadr,NULL,port);绑定socket和端口号:if(bind⑨硕士学位论文M人STER’STIlESIS(serverhandle,(structsockaddr幸)&servadr,sizeof(structsockadd0)一-1)exit—fatal(”errorbindsocket”);丌始监听:if(1isten(serverhandle,MAXCONNECT)一-1)exit—fatal("Damnederrol'swhen(4)创建socket服务线程listenAbort!”);当监听产生后,服务进程负责不断的循环j|:i听接收到的请求并建立新的socket连接,通过以下的语句实现:if((new_sock=accept(serv_sock,(structsockaddr毒)&their__addr,&sin_size))==一1)(5)创建网络通信进程通过socket的write函数向客户端写图像数据帧,通过下面的语句实现:ret-训te_sock(sock,(unsignedchar车)headerframe,sizeof(structframe_t));其中,headerframe为等待发送的帧。4.4.2客户端编程分析当我们从客户端的网页浏览器连接到服务器时,访问过程将会按以下顺序进行操作‘35I。(1)将一个简化的视频播放器(一个javaapplet程序)下载到客户端;(2)启动客户端机器上的JavaVirtualMechine,运行这个播放器applet;(3)播放器连接到web服务器,,i:始访问视频图像。在客户端浏览器输入视频服务器的lP地址后,默认访问index.html。在这个html文件中,<applet>…</applet>部分嵌入的是javaapplet小程序,其主要功能为与服务器端视频采集模块进行通信,接收视频图像数据,另外,还把接收到的图像数据显示出来。javaapplet中实现的网络通信流程图如图4.4所示。(1)初始化,可以使用下面的语句实现初始化。rn—strColor=getParameter(”Color”);if(rn_strColo同ulllIm_strColo严¨”)m_strColor..’#FFFFFF”;strServer-一-nullnm—strServer=getParameter(”Server”);if(rnm_strPort=getParameter(”Port”);if(m_-StrPo怍=nuU0m_strServ萨帅)m_strServer=什127.0.0.1”;m_strPo忙””)m—strPort=¨7070”;⑨硕士学位论文MASTER’STHESIS劁4—4客户端释序流程图在初始化过程中,主要是实现米白嘲页的Color、Server、Port等参数的传递。如果没有对这些参数进行设置,其默认值分别为#FFFFFF、127.0.0.1和7070。需要说明的是,Server是指视频图像采集端的地址,本系统中视频图像采集模块和boa服务器模块都是在实验板上实现的,所以其IP地址为本地主机地址127.0.0.1。(2)创建socket对象,可以通过这样的语句实现:Socket(m—strServer,port);(3)创建输入流和输出流对象in=connection.getlnputStream0;out2connection.getOutputStream0;connection=new(4)分配接收视频流缓冲区bytef】buffer=newbyte【512}1024];(5)读取图像数据。视频流缓冲区内接收的是一幅静态的jepg图像数据流,其中包含有图像的头信息,为了单独使用图像数据,把图像数据拷贝到另外一个缓冲区即buffer2内。可以用这样的语句实现:byte【】buffer2=newbyte【n】;for(inti=0;i<n;i++)buffer2[i】=buffer[i+HDRLEN];(6)视频播放。定义一个Bufferedlmage对象image,把buffer2中的数据保存在其中。3l㈤\∥矗、.硕士学位论文MASTER’STHESIS/用这样的语句实现:Bufferedlmageimage=ImagelO.read(newByteArraylnputStream(buffer2));然后,以这个image定义一个图标对象:lmagelconii2newImagelcon(image);把这个图标对象显示出来:re_label.setlcon(ii);上述步骤是实现~幅静态图像显示的过程,循环重复这个过程,即可实现连续动态的视频图像了。(7)最后,关闭socket。⑧\一一硕士学位论文MASl’ER’STItESIS第五章嵌入式Linux系统的移植5.1开发环境的搭建嵌入式软件开发与PC机软件丌发有较大的不同。丌发PC机上的软什时,可以直接在PC机上编译、调试软件,开发完成后最终发撕i的软件也是在PC机.卜运行使用。但对于嵌入式软件开发而言,因为最初的嵌入式设备在软件上是空白的,需要通过PC机为它构建基本的软件系统,并烧写到嵌入式硬件设备中去,另外嵌入式设备的资源并不足以用来进行软件开发,所以要用到交叉编译开发模式。所谓交叉编译是指在系统资源比较丰富的主机上编译软件,并生成可执行的二进制代码,然后将二进制代码下载到目标板上运行1361。于是,我们有必要搭建一个满足开发的软件环境。5.1.1在WindowsXP下安装Linux虚拟机本系统基于Ubuntu7.10进行歹l:发,它是一个基于Linux2.6内核的的操作系统。Ubuntu十分注重系统的安伞性,它采用sudo:[具,所有系统相关的任务均需使J}】此指令并输入密码才能执行,比起传统以登入系统管理员帐号进行管理工作更可靠、更安全。Ubuntu也注重系统的呵用性,它设计为在标准安装完成后即可以让使用者投入使用的操作系统。举例来说,完成Ubuntu安装后,使用者不用另外安装网页浏览器、办公常用软件、多媒体播放软件以及绘图软件等日常应用的软件,因为这些软件大多数在系统中已经安装,用户可以随时使用。我们可以从http://www.ubuntu.corn/download获取Ubuntu光盘镜像文件。Ubuntu的安装方法有好几种,我们可以在WindowsXP系统下通过VMware来安装它。从VMware的官方网站http://www.vmware.tom上可以下载到VMware工具。Ubuntu的安装方法比较简单,请读者参考其他资料,这里不再赘述。安装完成后,PC机上就有两个操作系统了,一个是WindowsXP,另一个是运行在WindowsXP上的Ubuntu操作系统虚拟机。5.1.2配置SAMBA服务器Samba是一个工具套件,它在Linux系统上实现SMB(ServerMessageBlock)协议,可以被Windows系统等用来实现磁盘和打印机共享1371。在本设计中,我们需要在Linux和Windows两个操作系统上进行相关开发,配罱好SambaJill务器,可以实现开发过程中两个操作系统下的文件共享,方便我们的开发过程。⑨硕士学位论文MASTER‘STHESIS(1)在Ubuntu虚拟机下运行命令sudoapt—getinstallsamba安装samba服务器(2)在ubuntu上创建共享文件夹,mkdir命令,例女ll/home/share(3)编辑sudovi/etc/samba/smb.confo编辑修改sam.conf文件的以下儿行:workgroup=WORKGROUPsecurity=user改为share(4)在配嚣文件最后,设置share文件央属性为可读可写,可访问。【share】path=/home/sharewirteable=yesbrowseable=yesavailable2yespublic2yes(5)设置完成后,用sudo/etc/init.d/sambarestart命令重肩服务,使设置生效。这样完成后,将Linux虚拟机的地址设置成与Windows柏同的网段并输入Linux虚拟机的IP地址就可以在XP上访问ubuntu了。5.1.3安装交叉编译工具链为了方便丌发,我们直接使用已经制作好的工具链。使用以下命令解压得到gcc.3.4.5.glibc.2.3.6目录。arm—linux—gcc一3.4.5一glibc一2.3.6.tar.bz2可以从网上下载获得。¥tarxjfarm—linux—gee一3.4.5一glibc一2.3.6.tar.bz2然后在环境变量PATtt中增加路径,这样可以直接运行使用anti—linux—gcc而无需指定arm.1inux-gcc所在目录位置。如下所示:¥exportPATH=¥PATH:/tools/gcc・3.4.5一glibc・2.3.6/bin接着需要安装ncurses,这是一个能提供快捷键定义、屏幕绘制以及基于文本终端的图形互动功能的动态库。安装它的目的,是为了保证在后续执行makemenuconfig命令配置程序时不会出错。¥cd/tools¥tarxzfncurses—tar.gz¥cdncurses一5.6¥./configure-with-shared-prefix=/usr¥make・¥makeinstall⑨硕士学位论文M人STER’STILESIS5.2嵌入式系统的引导与启动系统上l乜之后,需要一段程序来完成系统的初始化工作:关闭看门狗、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等。并_只,这段程序能够将操作系统内核复SJJ-至0内存中运行,就称这段程序为Bootloader!孙】。现在Bootloader种类较多,比如x86上有LILO、GRUB等,对于ARM架构的CPU,有U.Boot、vivi、armboot等。ARM体系结构的CPU上电后从地址0x0000000丌始运行。在友善之臂SBC2410开发板中,需要把存储器件Flash映射到这个地址,Bootloader就存放在这个地址的开始处,这样一上电就可以执行。Bootloader可以分二r:作在两种操作模式下,第一是启动加载模式,系统上电后,Bootloader从板子上的某个固态存储设备如nandflash上将操作系统加载到RAM中运行,整个过程并都不需要用户的介入。在产品开发完成并发夼后,Bootloader就工作在这种模式下;第二是下载模式,这主要是站在,1:发的角度上看待的,在这种模式下,,|:发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机下载文件(比如内核映像、文件系统映像),将它们烧入Flash等l嗣态存储设备中。,f发板与主机问进行文件传输时,可以使用串口协议如xmodem等,它们的使用方法简单,但是传输速度比较慢;还可以通过网络使用trip、nfs协议来传输文件,这时,主机上要相应的开启tftp、nfs服务。5.2.1Bootloader的结构Bootloader的结构可以按启动过程可以分为两个阶段。第+一阶段使用汇编来实现,它的主要工作足完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码。第二阶段通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性13w。一般而言,Bootloader两个阶段完成的工作可以分为如下几个方面1401:(1)Bootloader第一阶段的工作是:≯完成基本的硬件初始化。它的主要目的是为第二阶段以及随后的内核准备好一些基本的硬件环境。它通常是屏蔽所有的中断、设嚣CPU的速度和时钟频率、关闭CPU内部指令,数据cache、初始化RAM等。>为加载第二阶段的代码准备好合适的RAM空问。为了获得更快的执行速度,通常会把Bootloader的第二阶段的代码加载到RAM空间中来执行,因此必须为此准各一段洲空间。⑨硕士学位论文MASTER’STHESIS》将Bootloader的第二阶段代码拷贝到RAM空间中去。>由于第二阶段是主要是C代码,所以还要设置好堆栈。>跳转到第二阶段代码的C语言代码入口处继续执行。(2)Bootloader第_二阶段的工作。>进一步完成硬件的初始化:相对于第一阶段而言,这是更高~级层面上的硬件初始化,例如初始化串口以便和PC机超级终端进行输入输出操作;初始化计时器等。>检测系统内存映射(memorymap)。所谓内存映射就是指在ARM的整个4GB物理内存地址空问中有哪些地址区间被分配用来对系统的RAM单元进行寻址。≯将操作系统内核映像和根文件系统映像加载到内存中去。>为操作系统内核设置启动参数。>调用操作系统内核。5.2.2U—boot简介U.Boot(UniversalBootLoader)即通用Bootloader,是遵循GPL条款的开放源代码项目。它的名字“通用”可以从两个方两理解:其一可以引导多种操作系统,它支持的操作系统有Linux、VxWorks、NetBSD、QNX、RTEMS、ARTOS、LynxOS等多种。其二它支持多种体系结构的CPU。例如PowerPC、MIPS、Xscfle、x86、ARM、NIOS等几种。我们可以从ftp://ftp.denx.de/pub/u.boot/获得U-Boot的最新代码。本设计在u.boobl.2.0的基础上进行分析和移植。我们先了解u-boot的工作流程,然后对U—boot-I.2.0根目录进行简煎介绍。图5—1是u-boot的工作流程图,跟其他的bootloader一样,u-boot首先在RAM中运行汇编程序,对硬件进行最基本的初始化工作,然后将启动代码复制到SDRAM中,准备好C语言的运行环境并跳转到C入口,对外围硬件设备进行更高层级的初始化,我们注意到,此时u-boot会遇到一个分支选择,在u-boot启动的时候,我们如果长按空格键将会进入u-b00t执行shell程序即下载模式,否则将默认为加载内核即启动加载模式14¨。u-boot-I.2.0根目录下共有26个子目录,这些子目录可以分为与开发板相关、与CPU平台相关、通用的函数、通用的设备驱动程序、文档、示例程序、开发工具等几个部分,其功能与作用描述如表5.1所示。⑨目录Board硕士学位论文MASTER‘STtlESIS表5.1U.boot目录介绍特性解释说明对应不同配置的电路板,比如smdk2410、与开发板相关CPUsbc2410x等对应不同体系结构的CPU,比如arm920t、与平台相关arm925t、i386锋;在相应的子目录一卜.仍可以进一步细分,例如如arm920t目录下就还有at91rm9200、s3c24x0等子目录libi386include某一架构卜-通Jlj的文件通JH的函数头文件和开发板配置文件,与开发板相关的配置文件都放在include/configs目录下,U—Boot没有朋米进行图形化的操作界面,需要手动地修改配置文件中的各个宏定义libgeneric通川的库函数,例如printf等通JlJ的函数,多是对下一层驱动程序的进一步封装CommOnDisk通J{j的设备驱动程序硬盘接口程序各类具体设备的驱动程序数字温度测量器或者传感器的驱动有关文件系统的部分支持从NANDFlash启动,在本系统中就是这种启动方式driversDttFsNand—.splNet各种网络协议例如tcp、tftp等上电自检程序实时时钟的驱动文档示例程序:I:具u-boot相关的开发、使用文档一些示例程序,在使JHjU-Boot下载后运行制作U-Boot格式映像的:【具,比如mkimagePostRtcDoeexamplesTools37⑨硕士擘位论文MASTER’STHESIS图5一lu—boot。f:作流样图5.2.3U-boot的移植和下载由于U.boot目前还没有提供类似于Linux内核那样的图形化的配置界面f例如我们可以使用makemenuconfig命令进行图形化界面的配置),因此要通过手动的修改配置文件include/config/<boardname>.h来裁剪、设置U—boot。我们可以在smdk2410的基础上进行U.boot的配置和编译142J。(1)新建开发板的相关目录和文件。在u-boot.1.2.0/board/t量l录下新建文件央utu.bootloader,将smdk2410下的文件全部复制进来,并将u—boot-1.2.0/board/utu-bootloader目录下的smdk2410.c改名为utu-bootloader.e。在include/configs目录下建立一个配置文件utu-bootloader.h,可以将includedconfigs/smdk2410.h直接复制为utu-bootloader.h。在顶层Makefile中增加两行:utu-bootloaderconfig:unconfig@¥(MKCONFIG)¥(@:-confi90armarm920tutu-bootloaderNULL然后在u-boot-1.2.0/board/utu-bootloader/Makefile中将COBJS:=smdk2410.Oflash.Os3c24x038⑧修改为:硕士学位论文MASTER’STttE¥ISCOBJS:=utu.bootloader.oflash.O(2)修改SDRAMSDRAM的初始化工作一般足在bootioader的第一阶段完成的,我们需要在u.boot.1.2.0/board/utu。bootloader/lowlevelinit.S文件中设置存储控制器。对于BANK6主要是修改寄存器REFCNT,对于其他BANK,原来的设置刚好匹配无需修改。SBC2410开发板的HCLK是100MHz,需要根据SDRAM芯片具体参数重新计算寄存器I垣FCNT的值,并做如下修改:#defineREFCNTll13/*period=15.6us.HCLK=60MHz幸/修改为:#defineREFCNTOx4f4/}period=7.8125us.HCLK=100MHz幸/(3)支持网卡芯片CS8900相对串口而言,使用网络可以大大提高文件的传输速度。U—boot支持网卡芯片CS8900,它的驱动为drivers/cs8900.C。在友善之臂SBC2410丌发板上,CS8900接在¥3C2410的BANK3上,在u—boot.1.2.0/board/utu.bootloader/lowlevelinit.S文件中已经对存储控制器做了合理的设置。#defineB3TacS#defineB3#defineB3#defineB3#defineB3#defineB3TcosTaccTcohTabTacp0x0|10clk毒|0x3|聿4clk毒}0x7/宰14clk宰/0xlljlOxOplclk’|0clk|l0x3|卑6clk毒}0x0|’normal’|#defineB3PMC另外还需要设置CS8900的基地址,这也已经在include/eortfigs/utu-bootloader.h文件中做了正确的配置。on-board・/r#defineCONFIGDRIVERC:¥8900l#defineC¥8900BASE#defineCS8900BUS160x19000300产wehaveaC¥8900l产theLinuxdriverdoesaccessesasshorts*/39⑨硕士学位论文MASl’ER‘STtlESIS最后,还要在include/configs/utu.bootloader.h中定义CS8900的各个默认地址:#defineCONFIG—NETMASK#defineCONFIG—IPADDR#defineCONFIG—SERVERIP255.255.255.0192.168.1.200192.168.1.1l由于友善之臂SBC2410实验板上的以太网与SMDK2410完全相同,可以直接使用/driver/cs8900.cfill/driver/cs8900.h这两个文件,这样就完成了对网卡芯片CS8900的基本配置。(4)添加“nan”等命令我们这里简要说明添加命令的主要过程。首先要在在include/cmdconfdefs.h中定义了所有U—Boot命令的标志位,然后在common/cmdcache.C文件中实现命令代码,最后在include/configs/utu.bootloader.h文件中打开CONFIGCOMMANDS选项的命令标志位143l。这样就可以添加命令了。如此配置好之后,执行“make会生成u.boot.bin文件。utu—bootloaderconfig'’、‘"makeall”命令之后,就在本设计中,首次烧写u—boot.bin义件是通过JTAG进行的。下面以Mizi公司的sjf2410为例,介绍利用JTAG接口对NandFlash的烧写过程。(1)安装并口驱动GIVEIO.SYS,具体步骤是将开发板光盘中的GIVEIO.SYS文件拷贝到PC机C:\WINNT\system32ktrivers目录下,选择控制面板下的“添加硬件”按提示添加一个新的硬件即可。(2)用JTAG接Li电路板(有的地方称Wiggler小板,本设计中将此调试接口电路集成在开发板AT)连接PC机并口和开发板JTAG接El。(3)如图5—2所示,第一步,在XP系统的命令行中输入sjf2410/f:uboot-bin命令,如果没有什么连接问题的话就可以探测到¥3C2410处理器,如图中所示探测到处理器的ID号为0x0032409d;第二步,由于本系统硬件中的NandFlash芯片是K9F1208所以选择0即选择对K9S1208编程,于是又探测到了K9F1208芯片;第三步,接着继续选0确认对K9F1208编程;第四步最后选O表示从地址0开始编程;约5分钟后,第五步,选择2退出,编程完成,这样uboot.bin文件就成功下载到开发板上的NandFlash芯片K9F1208中去了。削5-2迎过sjr2410F载u-boot刮N蛐dFish立¨图5—3所示,重新肩动tJ|=发板后,IV以通过超级终端看到如下结果lO-Boot120utullnuxs3c24i0bootloaderIFeb202089—1,1823)l噼州64岫|Flash.0蚰lI*帅:B耐blod【tablenotfo帅dforchip0lBadblocktablenotfoundforchleB16‘H1Bl…hr…-badcncofN月HD.usingdefaulienvirotiNentlIn一。。ljOuttserialjE丌・讣rialJHit∞yk…totopautoboot。o1utu—bootloader=>>>圈5-3下载完u-hoot后通过超级终端显示的运行开发板的结果5,3移植内核到开发板Linux内核是操作系统的一个庞大而复杂的核心,它采用子系统和分层的思想进行了良好豹组织。如图5-4所示我们可以看到LintLx内核的系统调用接口、虚拟⑨硕士学位论文MASTER’STHESIS文件系统、内存管理、网络堆栈、进程管理等5个子系统和设备驱动程序、依赖于体系结构的代码等2个模块Ⅲ1。[二二二苎!二].图5-4Linux内核的子系统(1)系统调用接口系统调用接口SCl(SystemCallInterface)层提供了某些机制实现从用户空问到内核空l'IlJ的函数调用。我们可以在./linux/kernel中找到有关SCI的实现代码。(2)进程管理在操作系统内核中,进程可以再细分为线程,代表了单独的处理器虚拟化。在用户空间,通常使用进程这个概念,不过在Linux中并没有对进程和线程这两个概念进行区分。操作系统内核通过系统调用接口提供了一个应用程序编程接口(ApplicationProgrammingInterface,API)来创建一个新进程(可以通过fork、exec或PortableOperatingSystemInterfaceforUNIX【POSIX】函数),停止一个进程(可以通过kill、exit等函数),并在进程之间进行通信和同步。进程管理还包括活动进程之间对CPU的共享。Linux操作系统内核实现了一种称为O(1)的调度算法,即不管有多少个线程在同时竞争CPU资源,这种算法都可以在固定时间内进行操作,由它调度的多个线程所消耗的时问和调度一个线程所消耗的时问几乎是一样的。(3)内存管理操作系统内核所管理的另外一个重要资源就是系统的内存。内存是一般按照分页的方式进行管理的,对于本系统而言分页粒度是4KB。Linux内存管理部分包括了管理可用的内存的方式、物理内存和虚拟内存映射所使用的硬件机制。内存管理包含了为内核进程自身分配内存以及为用户进程分配内存两个方面,可以说,整个42⑥硕士学位论文MASTER’STtIESIS系统性能的好坏很大程度上决定于如何有效的管理利用好宝贵的内存资源。内存管理模块需要要管理的不仅仅是4KB缓冲区,‘Linux提供了对4KB缓冲区的抽象,例如slab分配器。这种内存管理模式使用4KB的缓冲区为基数,然后从I}1分配结构,并跟踪内存页的使用情况,比如哪些内存页是完全使用的,哪些页面还没有完全使用,哪些页面完全为空等。这样就允许在该模式下根据系统需要来动态地调整内存使用。由于可能有多个用户同时使用内存,就可能会出现可用内存被消耗光的情况。为了解决这个问题,内存页面可以通过一定的算法移出物理内存并存放到磁盘中,这个过程就是内存页面的“交换”。Linux系统中与内存管理相关的源代码可以在./linux/mm目录中找到。(4)虚拟文件系统虚拟文件系统VFS(VirtualFileSystem)是内核中非常重要的一个方面,它为文件系统提供了一个通用的接U抽象。如图5.5所示,VFS在SCI和内核所支持的文件系统之间提供了一个交换层。厂,、"virtualFileSystem(VFS)l・llBuff矗CachellExt3。I...l℃卜目l卜cl/ID咖e脚叮sI哪ic粕眦嚣图5-5虚拟文件系统在用户和文件系统之间提供了一个交换层在虚拟文件系统上面的一层,是对诸如open、read、close和write等的函数的一个通用API的抽象。而在VFS下面则是文件系统抽象,它定义了上层各个函数的实现方式。有关文件系统的源代码可以在./linux/fs目录中找到。在文件系统层之下的是缓冲区,它为文件系统层提供了一个通用的、与具体的文件系统无关的函数集。在这个缓冲区层将数据保留一段时间或者是随即预先读取数据以便在需要时就可用,这样优化了对物理设备的访问。缓冲区之下的是设备驱动程序,它实现了特定的物理设备的函数接口。43⑧\::硕士学位论文MASTER’STHESIS/.(5)网络堆栈。网络堆栈在设计上沿袭了网络协议本身的分层的思想。IntemetProtocol(IP)协议是传输控制协J,.q.(TCP)qz面的核心网络层协议。TCP层上面是socket层,它是通过系统调用接口进行调用的。socket层是网络子系统的标准应用程序接口,它为各种网络协议提供函数接口。从原始帧访问到IP协议数据单元,再到TCP和用户数据报,socket层提供了一种标准化的方法来管理网络连接,且在各个终点问传输数据。在本系统的图像传输程序中,我们使用了大量的socket函数。内核中关于网络的源代码可以在./linux/net目录中找到。(6)设备驱动程序。与设备驱动程序相关的代码可以在./linux/drivers目录中中找到。Linux内核中有大量代码都属于各种设备的驱动程序,它们为各种硬件设备提供了驱动。Linux源码树提供了一个驱动程序子目录,在这个目录中包含了支持各种设备的驱动子同录,例如usb、vedio、serial等。(7)依赖于CPU体系结构的代码。与CPU体系结构相关的代码可以在Jlinux/arch目录中找到。Linux内核很大程度上独立于所运行的计算机的体系结构,但是有些地方则必须考虑到CPU体系结构才能正常操作并实现更高的效率。在./linux/arch子目录中定义了内核源代码中依赖于体系结构的相关代码,其中包含了各种特定于体系结构的子目录。对于本文来说,使用的是aria目录。5.3.1编译内核下面,我们介绍内核的配置和编译的整个过程145‘。(1)登陆Linux内核的官方网站http://www.kemel.org下载Linux内核,本设计所用的是linux.2.6.11.1.tar.bz2。(2)解压内核文件,进入内核目录,执行makemrproper操作。这步操作的目的是清除原先配置、编译过程中残留在此目录下的.config和.0文件,因此如果是第一次编译内核,那么这一步就可以省略,但是如果在实验的过程中已经编译过多次内核的话,这一步一定要,不然以后会出现很多小问题。(3)进行makemenuconfig操作,此步骤为配置内核参数的过程。该步是编译内核过程中最繁琐的一步。要选择诸多参数。我们可以首先使用makedefcontig命令生成默认内核配置选项,然后使用makemenuconfig修改、添加所需的内核选项1461.选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于缩减内核,减少内核消耗的内存。与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。我们把本设计中所必须的关键配置进行简要说明,如图5石所示的是执行makemenuconfig操作后进入的内核参数配置图形界面。⑧砸士学位论文鱼型£!塑I銎些鲤蛰:墓§§蛙:地}型唑矬美!≥蛙自熊姿垒些鹾塑熊划蚕《函8基e卧】eEdit坐刚l刊lmITab拦p剐56内核参数配拦H_【_善界而陶57足配置山棱使之支持VideoforLinux编羁’的界…削s.7配苜Vldeo如rLinux图58足配罱内核使之支持USB接口的界面。蚣互譬2兰.!垫鎏鲤幽:幽盥,些鲤些幽!些些堂芝薹固画画H58配出2USB接口蚓59足配置摄像头驱动的界㈨。甘、,o;止曲。^越蛳,J刈uu卫删卫蝴Ⅵ黜im”k捌避Jhb出p!lle耻tm吖l卧lmlArrow1∞ys…髓tetI∞…<Enter>seI啪elbm…・>ml倒eo+7N>eMl州*。mzⅫ二zh鲥1ette…Intl.e、*e7肚1日ddarl2esfeatures{orSearchLe辨划。【qrr日5s驯<73Pr日Es<Esc><E%>㈣t,‘7)for瞻lP,“)MuI—in【】eMI础d<D-卅me(>>sBSE40l髓FeM5t∞portK)sBsHgcIoxPCContrdlerstrJ0portK>K>SBsupportJPEGK>卯惜96【昕】cF星—盏盏显函瓷箍k盈墨匣囝匠衄sBS'P/6RO(P—m)caⅫeraD璐l¨o出c…a钟ponHet忡吨自d帅tersC槲a譬盏:等:…。lSBSe““%聃rt盯婶”卜’幽5-9配置摄像头驱动(5)进行makedep操作。对内核原代码的文件进行完整性和依赖性进行检验,确保关键文件在正确的位置。伯1进行makeclean操作,清除一螳不必要的文件。f71执打makeulmage后,将会在kernel/arch/arm/boot口求F‘p成ulmagc文什。5.3l下载内核文件ulmagc到NandFalsh本节的主要工作是把已经生成的ulmagc文件F载到丌发扳的NandFlash中去。fi-先,我们要在Pc机端开肩TF『P服务器软件t邱d州n,可以在刚l。搜索下域,提供有30天的免费试用。然后把ulmage文件拷贝到D:\lddownloadF并对tflpdwin进行帕荚设置,图5—10是tn口dwin运行后通过T盯P协议r藏镜像3Z{'t瑚界面。重肩实验板,&按键盘k的空格链进入bootloaderF载模式。输入runinstall—kernel命令,稍等片刻就将}i{核下载到NandFlash中去了。如罔5-1l所示,是在超级终端卜执行F载命令的界面。图511通过超级终端锰示的r载内棱的过胖5544移植文件系统到开发板1制作yaffs文件系统文件系统fl勺主要作闹是负责存储和管理文件,yaffs文件系统是专门针对NANDFI。ASH设计的嵌入式文件系统,其英文全称为YetAnotherFlashFileSysteml4”。在构造一个文件系统的时候,应该遵循FHS标准(FilesystemHierarchyStandard,文件系统层次标准1,在这个标准中定义了文件系统中目录和文件的分类存放的一些砸则””。为了简化Jl发过程,我们直接使月{SBC2410』F发板光盘上的FriendlyARM/SBC2410/rootdefault作为文件系统模板,略去繁杂的目录构建过程,将本设计需要用到的应用程序及相关文件拷贝到相关的目录叶1。f11将应用程序ccnu拷贝到usr,bin中去;(2)将HTML代码javaapplct程序及拷贝到www目录F;(3)在/etc下创建boa目录,里面放入boa的相关文件。接着,返回上层目录,运行/mkyaffsimage图如图5一12所示。root_defaultfilesystemyaffs。稍等片刻,便在此目录下生成了filesystemyaffs文件。生成filesystemyaffs文件的过程截繁盖蔷蔷黔缆皆幽丝些继虬——围smb・kyaff*i…∞t№fa㈨ftt㈨*∞k^;no口:/0|gt/Friedly^RⅣs雌4105forYAFF¥baht%p17踟-k日ffs…岬bmIm《t∞Iy5t∞Nfh}…slwd…tor¨忡t—defaultInt。工H口fil…fil257,ro¨f㈣t/hi…m…"y咖刚%r舭famtm…n/t…s州L^to”h{衄x№|Etsyst∞,affs邕啦I刚∞『“t☆f。mt/hi删f叫%tsylI,n’●~u5如w∞Je删.r舢faⅢt/bi√㈨i5y“lm¨bu'灿2咖*t261.r∞t☆famt/bI“kn∞"…sy_jimto≈uE灿xui¥a蚴㈣262ro“☆hmtnlj,p“…sy“1d2祜,r∞t,№fa“tnin/f…abuo加Fi…ml^“~s灿x[u…265…defa“t/hirdt……y㈣inkCbject蛳,FOOt&famt/hi叽}咖…§ol】it&to’bus*ox“a.1to’bⅥ灿xto!一0bject鲫,r∞L☆fault/hin/do州1n咖㈣.…耐amt/hi“-m…5pIlnk衄xHto饥灿r咖蚴.r∞t^famt/bLo/刊…5pIId咖Kt抽,r。。t.dhfault/hiⅣLptuⅣd…"m蚴∞t抽.root—default/bln/wa州l☆go、usCozx咖删27rdHL^…”■lnq㈣272r∞t_dofaultfoia/……itusmrto、us灿f■f,I】lLnto~us^o*“is呦Et拼,r∞t—村amtnl“刚stu咖x叫en∞4.root—d搴fam讪I“iMddr4叩Il^to’u¥灿rr。ot∞famtAl“㈣sg州l^to’∞灿r1%山x276,root*famt/hi∥呲ssⅢlna。州i^toar∞t.dbfault/hito’∞*oftol|1|l|l{1{l|f日is西Jen275gbjwtttJaCta叫e“卵.呲*hm似“ad打圳^#dlnto、us灿x.z".呲defaultAiⅣc培p…s州l“to、us灿x.咖Et[bjEt痂,r。。tdgfauIt/hi“…ssyali☆”bm如x’叫哪∞1.ron自famt/hi“n舢it∞衄xagy■l^toz?9,r∞tdefault/hiⅣecheisa¥yMinto、m*ox丌aaF州ldto酗5一12生成fllesystemva侬文fl。的过群⑨硕士学位论丈MASTER’STIIESIS5.4.2下载文件系统到NandFalsh仿照5.3.1节的步骤,打开tfipdwin软件,把刚生成的filesystem.yaffs文件拷贝到D:\tddownload下,重新启动开发板,长按键盘上的空格键进入bootloader下载模式。输入runinstall.filesystem命令,稍等片刻就将文件系统下载到NandFlashl}l去了。如图5.13所示的是通过超级终端显示的下载文件系统的过程。utu-bootloader=>>>runinstall-filesystemTFTPfrolseruer192.168.1.200:OUPIPaddressis192.168.1.168Filename’filesvstem.vaffs’.Loadaddress:Ox30000000LOad.1『lgHHHHHHHHH#HHH#H抖H#HHH*H特H#HHH*HH#H#HHH捧H#*HH#HH#HHHH*#H抖特HH#¨HHHH#*HH#H##H#*HH##H*#HHH#HH#HH*H抖#H#H#HHHH#H#H#H*H#H#HHHHH#HHHH抖#H#HHHHHHH#H#件HHHHH#HH特HHH抖HHH#HHHH#HHH#HHHHH#HHHHHH#HH抖HHH##HHHHHHHHHHH#HHHHH#HH*HHHH#H**HHHH#HH#HH#HHHHH#H¨HHH##HHH¨HH*H¨HH并HHH¨H#HHHHHHH#H件抖HH#HH#HH#H¨特HHHH*HHHH##HHHH*#HHH#HHH#HHHHHHHH##HH##HH##HHHH#H*#HHH#H*HH#HH#HHH抖#HHH#特*HH持HHHHH#HHHHH#*HHHHH抖持HHHHH#HH抖HH*HH#HH体HHH#HHHHHRH#HH**H*HH#HH恃HH#H*抖#特H##H#HH###*HH#H##HHHH#HHHHH抖H#HH#H#*HH###H抖H抖HHH##H#H抖H*HH*HHH#HH##H#HH#特图5-13通过超级终端显示的+卜.载文件系统的过样49第六章总结与展望61运行结果首先,我们通过超级终端运行服务器上的程序。在超级终端卜执行命令CgNli--S640x480--W7070,如图6-1所示:I【root勘tu—linux/】HhomeIbinlibldevletc1inuxrclslOSt*foundmntprocrootusrvarww”gbintmp|【rooteuto一1inux/】*CCnUs6&gx489—w7070ClrlctostoplWairing.forconnectionff”l一蹦6-I在超级终端P肩动图像采集其中,CCnU为叮执行的应用程序,s参数指定要输出的视频网像的大小,柯两种大小可以设置,分别为640x480或320x240;W参数为传输过柑I・要使刚的端¨,这里我们选择7070端口。然后,在客J1端的计算机1.打开IE浏览器,输入服务器地址192将硅示的视频图像截图如图6-2所示:168I168,口盈盈罱翟正峦匹岱羞盘墨墨墨基曩翌蜀宴豳赘醴疆暖瞬癌囊■蓝醴盛鲤西瞧菌曩i幽j”f…_-7^x…wf】一。}●一l-华-},州】予人节光fiirf,i味I烈'、蛤争说频船挣系统—o”~1‘幽6-2监测剖的桃频削像⑨程。硕士学位论炙MASTER’STHESIS6.2研究工作总结本文提出了一种基于¥3C2410的视频监控系统的解决方案。包括系统的硬件组成、视频驱动、图像采集与压缩、boa服务器的构建、图像传输等软件的设计,并在友善之臂SBC2410实验板的基础上,重点讨论了相关软件的设计思路和实现过首先我们讨论了基于Linux操作系统的驱动程序开发,讨论了USB摄像头驱动的层次结构并给出了摄像头驱动的设计要点,这里我们要注意利用可重用的代码,在现有驱动架构的基础上进行进一步的开发。其次,我们讨论了基于Vide04Linux的图像采集过程,为了能够让采集到的图像能够在网络上进行传输我们还给出了对原始视频图像进行JEPG压缩的过程,并给出了在网络上传输的思路:在服务器友善之臂SBC2410实验板端,我们构建一个boa嵌入式http服务器:在客户端,我们使用了网页浏览器来进行访问,其中我们使用了平台无关性的iava技术。视频图像在网络上的传输中,我们使用到了socket编程接口。最后,我们讨论了uboot的工作流程、kernel的丰要部分和yaffs的一些特点并构建了一个从uboot、kernel到yaffs文件系统的整个软件系统。在交叉编译生成uboot.bin、ulmage和filesystem.yaffs等镜像文件之后,首先用并口将PC机与友善之臂SBC2410实验板相连,通过sjf软件往NandFlash中下载uboot.bin;然后,在实验板能够运行起bootloader之后,就可以通过tftpdwin软件使用tRp协议来进行ulmage和filesystem.yaffs等镜像文件的下载或uboot.bin的再次下载了,这样可以具有更快的下载速度。本系统的实现过程中涉及到了ARM体系结构、嵌入式Linux操作系统、图像压缩编码、网络编程及java编程等多方面的知识内容。由于涉及到的范罔广、技术深,在实现过程中多处借鉴了前人的研究成果。6.3展望本文成功的设计并实现了基于B/S模式的视频监控系统,还存在许多不足,需要继续完善。进一步的工作应该包含如下几点:(1)本系统在具体实现的时候让友善之臂SBC2410视频采集服务器和两台PC机客户端处于同一个局域网内,视频数据通过网线传输,在两台PC机上通过网页浏览器均可以直接访问。这样就实现了在小型局域网内的网络视频监控,如果要通过Internet访问摄像头采集的数据,在数据的传送过程中,需要对视频监控这类敏⑥硕士学位论文MASTER’STHESIS感信息的安全性作进一步的研究,防止被非法用户窃听、篡改和随意传播。(2)需要进一步实现云台的控制,增加摄像头的空间可视范围。(3)本设计目前只实现了通过网络进行实时视频监控,并没有考虑将视频图像采集后保存到磁盘中,供同后检阅,例如系统监控到了犯罪现场,将视频图像文件保存后作为日后指控罪犯的证据。这是一个重要并且实用的功能,在后续的研究中将会考虑到这点。(4)根据视频监控系统具体的用途来实现更加智能的监控,这是视频监控系统的一个重要的发展方向,它需要与图像识别技术相结合。例如在工业控制领域,如在烟草烘烤控制过程中,烟叶的颜色是烘烤工艺的~个重要参数,我们可以通过监视烟叶的颜色变化来自动实现烤房的通风、加热等相关操作。52⑨【l】165硕士学位论文MASTER’STttESIS参考文献杨向东.智能视频监控技术的发展与红外技术的应用.中困公共安全,2007,(5):【2】【3】魏洪兴等.嵌入式系统设计师教程.北京:清华大学出版社,2006许贵娟.有线电视监控系统的发展方向及相关技术.中国有线电视,2004,(18):81-82【4】吴学智,戚玉华,林海涛.基于ARM的嵌入式系统设计与开发一匕京:人民邮电出版社,2007【5】熊江.三种嵌入式操作系统的分析与比较.单片机与嵌入式系统应用.2003,(5):14 ̄17【6】广州友善之臂科技有限公司.SBC一2410X使用手册Version0.9,2004【7】【8】Samsung.¥3C2410X32bitRSICmicroprocessor2003user’smanualsRevisions1.2,于明,范书瑞,曾祥烨.ARM9嵌入式系统设计与开发教程.北京:电子工业出版社,2006【9】CS8900AProductDatasheets,CirrusLogic.1999Stdl149.1—1990.TestAccessPortandBoundaryScanArchitecture【10】IEEEDescription.1990【11】陈峰,李滨滔,戈志华.基于¥3C2410的嵌入式Linux系统的构建.现在电子技术.2007,(24):55-57【12】宋桥,叶念渝,田俊.基于java的嵌入式网络视频服务器.兵工自动化.2006,(11):14 ̄17【13】Compaq,Intel,Microsoft,NEC.Universal1998SerialBusSpecificationRevision1.1.【14】梁孔科,杨林楠,张丽莲.基于¥3C2410与Linux的USB驱动的设计.福建电脑.2008,(4):2 ̄4【15】韦东山.嵌入式Linux应用开发完全手册.北京:人民邮电出版社,2008【16】张玉民,陈定方.Linux下USB驱动程序的设计与实现.湖北工业大学学报.2007,(22):53-55【l7】罗苑棠,嵌入式Linux驱动程序和系统开发实例精讲.北京:电子工业出版社,2009【18】自桦.基于Internet的嵌入式视频监控系统接口设计.燕山大学硕士论文,2007⑨【20]Detlef【231硕士学位论文MASTER’STHESIS【19】冯伟,王博.嵌入式Linux案例开发指南.北京:中国电力出版社.2008Flie91.ProgrammingGuideforLinuxUSBDevice.Drivers.http://usb.CS.tum.edu/download/usbdoc【21】商斌.Linux设备驱动开发入门与编程实践.北京:电子.-E_qk出版社.2009【22]ZC030XWebcamLinuxDriverProject,http://zc0302.sourcefo曙e.net/zc0302.phpJonathanCorbet,AlessandroRubini,GregKroah—Hartman.LinuxDeviceDrivers,Ⅲrd【241AlanEdition.O’Reilly,2006Cox.Vide04LinuxProgramming.alan@redhat.corn,2000KernelAPIReference.Version0.1,1999【25】Netsource.Vide04Linux【261韩军.基于ARM的仓库视频监控系统的设计和实现.现代电子技术.2008,(24):43---44f27]林福宗.多媒体技术基础(第2版).北京:清华大学出版社.2002【28]LarryDoolittle,JonNelson.BoaWebserver.Feb032000【29]李新峰,何广生,赵秀文.基于ARM9的嵌入式Linux开发技术.北京:电子工业出版社.2008【30】JeremyGroupBentham.TCP/IPLEAN.W曲serversforembeddedsystems.PublishersWestinUSA,2002,12(06):83—102Bowden.ThePerformanceAnalysisofLinux【3l】WenjiWu,MattCrawford,Mark【32]W.RichardStevens.UNIXNetworking—Packetreceiving.ComputerCommunications,2007,30(2):l044—1057NetWorkProgrammingNetworkingAPIs:SocketsandXTI.2ndEdition.PrenticeHall.2000【33】JonPostel.TransmissionControlProtoc01.RFC793,September1981f341徐千洋.LinuxC库函数详解词典.北京:机械工业;l{J_;反社.2008【35】Wroxpress.创建基于applet的播放器.http://www.ibm.com/developerworks/cn/java/j—mpe94/index.html【361李超,肖健.嵌入式Linux开发技术与应用.北京:电子工业出版社.2008【37】刘晓辉,张剑宇,张栋.网络服务搭建、配置与管理大全(Linux版).北京:电子工业出版社.2009【38】詹荣开.嵌入式系统BootLoader技术内幕http://www.ibm.eom/developerworks/cn/linux/l-btloader/index.html【391阙大顺,杜玮,岳鹏.VIVI在¥3C2410上的移植研究.武汉理工大学学报.2007,29(12):47-50【40】许信顺,贾智平.嵌入式Linux应用编程.北京:机械工业出版社.2007【411曲翠翠,田书林.基于¥3C2410A和Linux引导加载程序的实现.自动化信息,⑧\::::/硕士学位论文MASTER’STHESIS2007,(10):58~60【42】华清远见嵌入式培训中心.嵌入式应用程序开发标准教程.北京:人民邮电出版社.2009【43】孙纪坤,张小全.嵌入式Linux系统开发技术详解一基于ARM.北京:人民邮电出版社.2006【44】Linux系列教材编写组.Linux操作系统分析与实践.北京:清华大学出版社.2008【45】李晶,赵小强,范九伦.嵌入式Linux系统移植技巧.现代电子技术.2008,(24):40^叫42【46】河秦,王洪涛.Linux2.6内核标准教程.北京:人民邮电出版社.2008【47】YAFFSDirectUserGuide.http://www.yaffs.net/HierarchyStandard.【48】RustyRussell,DanielQuinlan,ChristopherYeoh.FilesystemJanuary282004⑨多。硕士学位论文MASTER’STHESIS致谢在本论文完成之际,我也即将告别生活了7年之久的桂子山。我从一个懵懂无知的少年,经过在华中师范大学的麽练,不断成长不断进步,其中要感诩}的太多太感谢我的导师张国平先生,您严谨的治学态度、深厚的理论功底和踏实的工作作风给了我极大的影响,值得我用…尘的时间去继续品味,继续学习。感谢师兄孔德鹏博士,潘栋学弟,我们一起为项目研究而通宵达旦的经历至今令人难忘。感谢丁玉斌、陈柳、陈明宏、刘洋、李卿、夏洪星等几位博士给我的帮助和支持,特别是丁玉斌和陈柳博士,你们在我的毕业论文写作过程中给了我非常有价值的参考意见。感谢张漫、熊丽萍、张玉姣、王锐等几位同学,我们一起度过了研究生3年这段愉快的时光。感诩|李小明、陈若兰、陈静、曾程、张文华、吴困燕、潘玲、杨雯、梅小光等师弟师妹,在实验室的学习和生活,让我们结下了深厚的友谊。感谢我的好友胡小勇、黄东、下亮以及更多我无法逐一列fI{名字的朋友,三年时间,我们结成了手足般的友谊,感谢你们的帮助和陪伴,让我的研究生生活充满了幸福美好的回忆。感谢我的父母兄长,多年来你们为了培养我成才无私奉献,在物质上支持我,在精神上也给了我莫大的鼓舞。最后,衷心地感谢为评阅本文而付出辛勤劳动的各位评委老师并深深祝福所有关怀和帮助过我的人!吴军勇2009.5.3于桂子山
因篇幅问题不能全部显示,请点此查看更多更全内容