嵌入式Linux下USB通用摄像头驱动程序的研究与设计(硕士论文)


东北大学 硕士学位论文 嵌入式Linux下USB通用摄像头驱动程序研究与设计 姓名:王鑫 申请学位级别:硕士 专业:计算机系统结构 指导教师:王剑 20061201 东北大学硕士学位论文摘要嵌入式LinuX下USB通用摄像头驱动程序的研究与设计摘要随着科学技术的不断发展,越来越多的工业控制领域实现了自动控制。为了更好的进行远程控制与管理,视频监控与数据采集的技术迫切需要。随着嵌入式技术的不断发展和视频监控系统应用的日益广泛,视频设备驱动程序的开发与数据采集技术也成为了开发的热点。目前生产摄像头的厂家繁多,产品的种类也琳琅满目,不同类型摄像头的驱动程序几乎不能通用,尤其是LilluX下的摄像头驱动程序更是不完善,这给视频监控系统的普及以及应用带来了不便。因此,设计通用的摄像头驱动程序显得尤为重要。本文是基于LiIlux系统来研究USB摄像头设备的驱动程序并开发通用的摄像头驱动程序。通用的驱动程序是以uClillux嵌入式操作系统为目标系统,在目标系统中驱动程序是以模块的方式被加载到内核中,模块加载成功后驱动程序开始运行会驱动系统的摄像头设备以实现视频监控的应用,最后系统是利用Linux下的视频接口Vide04“mⅨ来实现数据采集的功能。本文首先介绍了Linu】【系统,重点是Linl】)【下的设备驱动开发技术以及开发调试环境,并对vide04Linux做了详细的介绍;其次介绍了usB接口知识与usB摄像头的工作原理,重点是USB摄像头设备的驱动程序开发方法;最后分析了摄像头驱动开发的技术框架,重点是通用驱动程序的设计方案,并详细论述了如何开发usB通用摄像头驱动程序以及各功能模块的具体实现方法。最后,给出了在Linll)(系统下对通用摄像头驱动程序的测试,测试结果达到了预期的技术要求和功能要求,并提出了进一步的改进建议。关键词:Linll)【;uSB;摄像头;通用驱动程序 查垄垄兰堡主兰竺垒墨.二竺竺!竺一ResearchandDesignOfUSBUniVersalCameraDriVerBasedOnEmbeddedLinuxAbstractAlo玎g谢m也econtin∞usdevelopmentofscienceandtechnology,mo诧andmorc砌llstrvcon由rol(10mainh邵re“izedtbeautomaticcoIm.01.IllordertoimprOVetlleremotec伽l仃ol锄dm猢gemem,videomonitoringanddatagatheringtecllllologyisurgcntlyneedednow.舢ong埘mmedeveIopmentofembeddedtcchnologyandWidcspreadingofVideomoIlitoriIIgsystem,med纠elopmentofvideodeviced晰er肌ddataga山eringtecllnologyhavebecOmeahotspot.Nowtherearem锄ykindsofcompaniest0producecamems,andtherearealsolotsofcamemproduc峨buttllecameradriverofonetypccatlflotbeu∞dbytheothertypcofcamer船,especiallythe拍versinLiIluxsyst咖.111ism8kesthcVideomoIlitoringsys把阻hardcrt0be峭ed.Theref.ore'也edesi弘oftheuIliversalc锄eradriver印pea船tobcparticulanyimportant.Thist11esisisb邪ed伽theL劬xsygtemt0殉ldy也euSBcameradriVeranddevelopmentOfuIliversalcameradriver.Thedestim瞳ionalenViro砌entofttle吼iversaldriVerprogr撇isembeddedLinuxOpe碍廿ngsystem.AtfirstthcdriVcristobelOadedintotlleembeddedLinII】【Operatingsystemasamodule,a舭rtIlatⅡledriVerbegi璐workinganddrivingthcc啪eraequipmentofthesyg把mtorealizetllevideomoIlitoringapplicatiDll’atlastvide04Linuxis懈edfordatagatll“ng.T¨stllesisintroducestheembeddedLimⅨsystcmatfi璐t,foc邺ingonmede、relop哪emofLinuxdev妇driveranddebuggingenvironm%t,andthereisdetailedin仃oductionofvide04LiIl_ux啪.Second,in仃0ducingmcusBi舭而ceandUsBc哪eraworking—nciple,foc峭ing∞thedevelopmentofUSBcamera“vcr;Fimlly'discussingthctcchrIicaldetailsofcamera蹦verdevelopme吐fbcusiIlg叩thedesi弘ofuniverSal缸Ver.加ldalsoelaborating∞howtodevelopttleUSBuniversalc锄em幽ver柏dtherealizationmemodsOffhnctionmoduIes.FinaIly,thist11esis萄vesthetcstsforthecameradriverintlleLinuxsystem.The钯stresuhaclli“estheanticipatedspecmcation强dtllef岫ctionrequest.ThistllesisalsomakesTecOmmendatio惦tofIlnhcrimpIovement,Keywords:mux;USB;c锄era;llIliVersal拍Ver·V一 独创声明本人声明所呈交的学位论文是在导师的指导下完成的。论文中取得的研究成果除加以标注和致谢的地方外,不包含其他人已经发表或撰写过的研究成果,也不包括本人为获得其他学位而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示诚挚的谢意。学位论文作者签名:签字日期:学位论文版权使用授权书多鑫本学位论文作者和指导教师完全了解东北大学有关保留、使用学位论文的规定:即学校有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允许论文被查阅和借阅。本人同意东北大学可以将学位论文的全部或部分内容编入有关数据库进行检索、交流。(如作者和导师同意网上交流,请在下方签名:否则视为不同意)学位论文作者签名:王鑫签字日期:导师签名:签字日期: 东北大擘硕士学位论文第l章绪论第1章绪论随着usB设备的普及,摆在程序开发人员面前的驱动程序开发任务也是越来越重,特别是对于一些嵌入式开发厂商来讲,由于其开发的设备所采用的操作系统不同,相应的软件环境也是不一样的,因此开发相关设备的USB驱动程序更是难上加难。现如今LiIlux操作系统下的各种设备的配套驱动程序十分稀少,使得许多设备无法在Lin溅操作系统下正常应用。本文不但介绍了LmI】)【操作系统下usB摄像头驱动程序的开发方法,而且详细论述了LiIlll)【操作系统下uSB通用摄像头驱动程序的设计方案并给出了具体的实现方法。本章首先介绍课题的开发背景,然后说明usB通用摄像头驱动程序的设计目标,最后给出了论文的研究内容。1.1课题背景随着多媒体技术,网络技术的迅猛发展,利用嵌入式系统实现远程视频监控、可视电话和视频会议等应用已成为可能。为了实现这些应用,设备的驱动程序开发是一个重要环节。目前,视频髓控系统应用到越来越多的领域,从普通的库房、工地、交通路段监控到危险环境的数据采集等领域都应用了视频监控的技术。其中视频监控系统主要包括以下几个功能Il】:(1)实时监控功能:实时监控摄像头所监视的范围:(2)数据流采集功能:实时保存监控的信息,以备将来查找相关影像资料;(3)照片抓取功能:周期性的抓取监控目标的照片。图1.1视频监控系统示意图Fig.1.1111ePictureOfVideoM0n酬ngSystem.1一用户终端 东北大学硕士学位论文第1章绪论视频监控系统以前多使用的是闭路电视系统,这种闭路电视系统对距离非常敏感,稍微远一点的地方,传输信号就会有很大的损耗,传输的图像质量也会下降很多。而且闭路电视系统联网非常麻烦,也就无法使用闭路电视监控系统连接Intenlet来提供远程监控服务,因此早期的视频监控系统是无法实现真正意义上的无人值守。为了解决这种问题,结合嵌入式系统的特点和Intemet的发展,产生了嵌入式的视频网络监控系统的概念。目前主要有两种视频监控系统实现方案获得了广泛的应用【2J:一种方案是将各个嵌入式视频前端设备(摄像机或摄像头等设备)获得的视频信号通过内部网络传输到一个PC机上,在这台作为核心的Pc机上运行相关的视频和网络服务器软件,处理与外网(Intelllet)的连接,提供视频监控服务。这种模式实际上是原来的闭路电视监控系统的延伸,这种模式将PC机作为服务器代替了控制中心,还提供Imemet接入能力,在一定程度上解决了闭路电视监控系统无法实现远程监控的缺陷。但这种模式的缺点也是很明显的:由于系统中图像压缩与解压缩采用的是基于PC机的视频卡,这使得视频前端设备(如CCD等用于视频信号的采集、压缩、通讯的设备)过于复杂,稳定性、可靠性不高,而且价格高昂。在这种系统下Pc机仍然需要专人管理,操作较为繁琐。另一种方案是将视频前端设备和嵌入式web服务器整合在一起,摄像机传送来的视频信号经过数字化后由高效压缩芯片压缩,再通过内部总线传送到内置的Web服务器。然后该Web服务器直接接上Intemet,Intr柚et,网络上用户可以直接用浏览器(如IE或NetscapeNavigator等)观看Web服务器上摄像机拍摄的图像。而且,授权用户还可以控制摄像机镜头的动作或对系统进行配置。由于该系统把视频压缩和web功能集成到一个设备内,因此可以直接接入Intemet,Intranct,以达到即插即看的目的。该系统可以节省很多复杂的电缆,不但安装很方便,而且用户无需使用专用软件。这种系统也可以应用在需要各设备之间距离较大的情况下,如交通监管、远程监控和视频远距离直播等。因此采用将视频前端设备和嵌入式web服务器整合在一起的这种方案是当前视频监控系统的首选方案。但是由于这种应用情况下设备之间的距离较大,监控系统所处的环境多种多样,所以也就要求系统要具有一定的适用性。如果由于前端摄像头设备的驱动程序的原因只能使用几种特殊的摄像头,无疑会给视频监控系统的普及和维护带来很多不便。因此开发摄像头设备的通用驱动程序可以增加系统的适用性,使系统更加易于应用和维护。当前大部分的视频监控系统都采用嵌入式Lillux操作系统,所谓嵌入式Lmu)【操作 东北大学硕士学位论文第l章绪论系统即Linll)【操作系统经过精简后,固化在嵌入式平台上的操作系统。嵌入式LiIlux操作系统的特点如下13】:(1)精简的内核,高效的性能,良好的多任务支持;(2)适用于不同的cPu:交持多种体系结构,如x86、ARM、M妒s等;(3)支持嵌入式GUI:能够提供完善的嵌入式OUI以及嵌入式x-windows;(4)支持多种嵌入式应用:提供嵌入式浏览器、邮件程序,MP3播放器、记事本等多种应用;(5)用户可定制、裁减;(6)支持大量的周边硬件设备、驱动丰富;(7)强大的技术支持,完整的文档:(8)开放源码,丰富的软件资源,受到广泛的软件开发者的支持,结构灵活,适用面广。在LinlI)【操作系统下开发设备的驱动程序不同于Windows等其它操作系统,这是因为Lillux操作系统对于设备有着独特的定义。在Lillll】【下,所有外围设备都被看成是一种特殊的文件,称为设备文件151。系统调用是内核和应用程序之间的接口,而设备驱动程序则是内核和外围设备之间的接口。设备的驱动程序完成设备的初始化和释放,并对设备文件进行各种相关操作和处理中断,为应用程序屏蔽了外围设备硬件的细节,使得应用程序可以像对普通文件一样对外设进行操作。因此usB摄像头在Lmu)【下也被看作是一种设备文件,USB摄像头的驱动程序也就是负责实现内核和USB摄像头之间的接口。摄像头(camera)又称为电脑相机、电脑眼等,摄像头作为一种视频输入设备,在过去一直被广泛的运用于视频会议、远程医疗及实时监控等方面【6】。近年以来,随着互联网技术的迅猛发展,网络速度的不断提高,再加上感光成像器件技术的成熟并已被大量用于摄像头的制造上,使得摄像头的价格降到普通人可以承受的水平,普通入也可以通过摄像头在网络进行有影像、有声音的交谈和沟通。摄像头作为一种硬件设备,在具体的应用领域都离不开软件,也就是摄像头设备的驱动程序的支持,只有安装了配套的驱动程序之后摄像头才可以正常的工作。目前常用的摄像头设备大都采用USB接口,这是因为usB摄像头具有良好的性能和低廉的价格,同时USB摄像头还具有灵活、方便的特性,易于集成到嵌入式系统中。基于UsB摄像头开发符合videofor“nux标准的通用驱动程序并配合视频应用程序软件,可以满足实时监控等应用的要求。因此开发基于嵌入式Linll)【系统的usB通用摄像头驱动程序对于视频监控系统的 东北大学硕士学位论文第1章绪论普及与发展有着重要的意义,本文就是在嵌入式Linux操作系统与uSB接口技术不断发展,以及当前社会对视频应用系统的需求越来越大的情况下,讨论usB摄像头驱动程序的技术框架并开发通用的摄像头驱动程序,在此基础上可以实现适应性更强的视频监控系统。1.2设计目标驱动程序的开发不但与硬件的特性有关,包括Li姗x操作系统下设备的驱动方式、usB总线的系统特性、以及摄像头设备的内部结构;而且还与软件的结构有关,包括Lin呱操作系统内核的组织方式、摄像头驱动程序的加载编译方式、以及摄像头驱动程序各功能模块的具体实现方法等。要开发usB摄像头驱动程序,首先需要UsB主机控制器驱动程序(HcD)的支持,usB主机控制器是负责USB设备与主机相互通信的设备。因此要先安装uSB主控制器的驱动程序,再安装摄像头的驱动程序才能起作用。目前大部分Linll)【系统内核都已经支持uSB设备,即usB主机控制器驱动程序已经安装好了,因此重点是设备端的驱动程序开发。首先通过Linu)【操作系统下已有的usB摄像头驱动程序研究驱动程序的组织结构,掌握Linux操作系统下USB摄像头的驱动程序开发方法,并开发中星微zc0301这款摄像头的驱动程序。其次通过对Linux操作系统下摄像头设备的驱动过程来分析设备的驱动程序工作过程,总结出不同摄像头的驱动程序无法通用的原因:主要是不同摄像头设备采用的芯片(Cllip)和传感器(Se璐or)不同,所以驱动程序对于不同摄像头设备的控制方法和寄存器设定不同。最后构造新的usB摄像头驱动程序软件结构,分为实现设备都具有的共性功能的共有功能模块和实现芯片操作与传感器设置的芯片和传感器功能模块,以此来实现usB通用摄像头驱动程序。本文的设计目标就是设计通用的摄像头驱动程序,其首要功能就是要使本通用驱动程序像专用驱动程序一样驱动摄像头设备正常工作,其次要实现本驱动程序可以支持多种芯片和传感器的目的,也就是可以支持多款摄像头设备,最后通过编译与调试可以将本通用驱动程序应用到视频监控系统的嵌入式Linux操作系统中。通用摄像头驱动程序的实现可以解决Linll)【操作系统下许多摄像头设备不被支持的情况,为视频监控系统的应用打下良好的基础。1.3论文研究内容 东北大学硕士学位论文第l章绪论在视频监控系统的设计与应用过程中,由于Lin峨操作系统对于UsB摄像头设备的支持比较差,导致许多种摄像头设备无法应用到实际项目中。因此引发了本文的研究,也就是开发Linll)【下usB通用摄像头驱动程序,本文的研究不但使视频监控系统对于前端摄像头设备的选择更加多样化,而且为开发Linux系统其它种类设备的驱动程序打下了良好的基础。论文的研究内容主要包括了以下的几个方面:首先研究了LiIIux操作系统下usB设备的驱动方式,并分析了Linux系统已有的uSB摄像头驱动程序,针对专用摄像头驱动程序支持设备单一的不足,提出了通用摄像头驱动程序的解决方案。其次进一步对比不同摄像头设备的驱动程序结构,并尝试开发中星微zc0301摄像头设备在Lillll)【下的驱动程序,总结了摄像头驱动程序的开发方法,最后提出了通用摄像头驱动程序的可行性分析。然后总结了摄像头内部芯片和传感器部件对于摄像头驱动程序的影响,给出了通用摄像头驱动程序的实现思路:将通用驱动程序分为两大模块来实现,即实现设备驱动程序中具有共性功能的共有功能模块和实现芯片操作与传感器设置的芯片和传感器功能模块。最后是对通用驱动程序的测试工作,首先在Linll)【系统下屏蔽了操作系统自带的摄像头驱动程序,然后加载已经编译好的本通用驱动程序模块,最后对于几款常用的摄像头设备进行了测试,实现了本文的设计目标。 东北大学硕士学位论文第2章L.n“系统下设备驱动开发第2章Linux系统下设备驱动开发目前的视频监控系统多采用的嵌入式Linll)【(EmbcddedLinll)【)操作系统是指对标准Linux操作系统经过小型化裁剪处理之后,能够固化在容量只有几KB或者几MB的存储器芯片或者单片杌中,适合于特定嵌入式应用场合的专用Linux操作系统171。Linll)【应用于嵌入式系统的一个显著的优势是可以使用主机模拟的环境进行开发。因为在嵌入式设备上运行的Lillux系统和普通的桌面LiIlll)【系统几乎完全相同,这对应用程序的开发提供了很大的便利。开发者可以在桌面环境下编写和调试程序,测试完成后直接将程序放到嵌入式设备中就可以使用,提高了开发的效率【8l。同时在桌面应用环境下的大多数应用程序都可以移植到嵌入式系统中,这样嵌入式系统的开发就有大量的资源可以利用。Linux应用于嵌入式系统的另一个显著的优势是使用Lin慨操作系统能节省成本,在购买Li肌x系统初期,L.mux厂商与硬件平台厂商的捆绑销售将会使得用户能够获得一定的优惠,在达到同样性能要求的前提下,LinuxⅨ86组合的性价比比较高;而且在后续的维护和扩展方面,Linux带来的成本节省也将是巨大。首先,主流软硬件厂商都提供了对Li眦x的支持,用户可以自由的选择厂商;其次,Linux的运行平台小到嵌入式芯片、大到大型主机,跨越了全线硬件平台,因此基于它的应用系统具有非常优异的扩展性,系统的扩展不但非常容易,而且不会浪费已有的各种资源,系统的容量,运算能力等都能得到充分的利用。除此之外,选用基于Linux操作系统的标准化硬件和软件可以大大降低系统的维护成本,而且现在已经有更多的商业公司提供“一站式”的支持服务。此外,众多来自开源社区的技术专家也会帮助用户解决所遇到的各种问题。从长远角度看,选用Li肌x所带来的成本节省将是巨大的19J。Linu)【作为开源软件的一部分,它必将随着更多商用软件走向开放源码而获得极大的发展。基于上述优点,本文设计的通用摄像头驱动程序也是基于Linll)【系统进行开发的。相信随着LiIlux系统的发展,Linux系统下设备的驱动程序开发也将成为一个重要的方面。本章首先介绍Linux系统的基本知识,然后分析了Linu)【系统下驱动程序的开发要点以及与Windows系统下驱动程序开发的不同之处,最后介绍了Linux系统下视频设备开发的接口规范Vide04Li肌x的主要内容。2.1LiIluX系统简介LinIl】【是当前最受欢迎的一种操作系统,它是从Unix系统衍生出来的,因此与UIlix系统兼容并且开放源代码(openSource),任何人都可以修改它,或者开发自己的应用。 东北大学硕士学位论文第2章Linux系统下设备驱动开发Unix已经发展了几十年,成熟而且稳定。因此Linux包含现代操作系统的一切特性,包括多任务处理、虚拟内存、代码共享、内存管理以及TcP,IP网络。并且它遵循P0sⅨ标准,只要遵循PosⅨAPI的应用程序都可以很容易的移植到Linux系统下。而且Linux是可以定制的,系统内核最小时只有240KB。一个带有中文系统以及图形化界面的核心程序也可以做到不足1MB,而且同样稳定。因此,Linll)(作为嵌入式系统,是非常具有潜力的。虽然Linux具有内核小,效率高,源代码开放,内核直接提供网络支持等优点。但嵌入式系统的硬件资源毕竟有限,因此不能直接把Linux作为操作系统,需要针对具体的应用通过配置内核、裁减shell和嵌入式c的库函数对系统进行定制,使整个系统能够存放到容量较小的Flash中。Linux的动态模块加载,使Linux的裁减极为方便,高度模块化的部件使添加非常容易。嵌入式Linux系统的基本框架如图2.1所示【luJ:圃囝匦驱动 阳图2.1嵌入式Linux基本框架Fig.2.1111eF舢eofEmbedd酣LlnII)【2.1.1嵌入式操作系统的种类一般情况下,嵌入式操作系统可以分为两类:一类是面向消费电子产品的非实时操作系统,这类产品包括个人数字助理(PDA)、移动电话、机顶盒、电子书、WebPhone等;另一类是面向控制、通信等领域的实时操作系统,如、矾ndRiver公司的Vxw6rks、ISI的pSOS、CINX系统软件公司的QNX、ATI的Nucleus等fll】。(1)非实时操作系统早期的嵌入式系统中没有操作系统的概念,程序员编写嵌入式程序通常直接面对裸.8. 东北大学硕士学位论文第2章Linux系统下设备驱动开发机及设备。在这种情况下,通常把嵌入式程序分成两部分,即前台程序和后台程序。前台程序通过中断来处理事件,其结构一般为无限循环;后台程序则掌管整个嵌入式系统软、硬件资源的分配、管理以及任务的调度,是一个系统管理调度程序。这就是通常所说的前后台系统。一般情况下,后台程序也叫任务级程序,前台程序也叫事件处理级程序。在程序运行时,后台程序检查每个任务是否具备运行条件,通过一定的调度算法来完成相应的操作。对于实时性要求特别严格的操作通常由中断来完成,仅在中断服务程序中标记事件的发生,不再做任何工作就退出中断,经过后台程序的调度,转由前台程序完成事件的处理,这样就不会造成在中断服务程序中处理费时的事件而影响后续任务和其他中断。实际上,非实时操作系统的实时性比较差。这是因为非实时操作系统认为所有的任务具有相同的优先级别,即是平等的,而且任务的执行又是通过FIFO(FirstInFirst0ut,先入现出)队列排队,因而那些实时性要求高的任务可能不会立刻得到处理。另外,由于前台程序是一个无限循环的结构,一旦在这个循环体中正在处理的任务崩溃,使得整个任务队列中的其他任务得不到机会被处理,从而造成整个系统的崩溃。由于这类系统结构简单,几乎不需要RAM瓜OM的额外开销,因而在简单的嵌入式应用被广泛使用。(2)实时操作系统实时系统是指能在确定的时间内执行其功能并对外部的异步事件做出响应的计算机系统。其操作的正确性不仅依赖于逻辑设计的正确程度,而且与这些操作进行的时间有关。“在确定的时间内”是实肘系统定义的核心。也就是说,实时系统是对响应时间有严格要求的。实时系统对逻辑和时序的要求非常严格,如果逻辑和时序出现偏差将会引起严重后果。实时系统有两种类型:软实时和硬实时系统。软实时系统仅要求事件响应是实时的,并不要求限定某一任务必须在多长时间内完成:而在硬实时系统中,不仅要求任务响应要实时,而且要求在规定的时间内完成事件的处理。通常,大多数实时系统是两者的结合。实时应用软件的设计一般比非实时应用软件的设计困难。实时系统的技术关键是如何保证系统的实时性。实时多任务操作系统是指具有实时性、能支持实时控制系统工作的操作系统。其首要任务是调度一切可利用的资源完成实时控制任务,其次才着眼于提高计算机系统的使用效率,重要特点是要满足对时闻的限制和要求。实时操作系统具有如下功能:任务管理(多任务和基于优先级的任务调度)、任务间同步和通信(信号量和邮箱等)、存储器优化管理(含ROM的管理)、实时时钟服务、中断管理服务。实时操作系统具有如下特点:规模小、中断被屏蔽的时间很短、中断处理时间短、任务切换很快。 东北大学硕士学位论文第2章Linll)【系统下设备驱动开发2.1.2嵌入式操作系统的发展嵌入式操作系统伴随着嵌入式系统的发展经历了4个比较明显的阶段【12】。第一阶段是无操作系统的嵌入算法阶段,是以单芯片为核心的可编程控制器形式的系统,同时具有与监测、伺服、指示设备相配合的功能。这一阶段系统的主要特点是:系统结构和功能都相对单一,处理效率较低,存储容量较小,几乎没有用户接口。由于这种嵌入式系统使用简便、价格很低,在国内工业领域应用较为普遍,但是已经远远不能适应高效的、需要大容量存储介质的现代化工业控制和新兴的信息家电等领域的需求。第二阶段是以嵌入式cPu为基础、以简单操作系统为核心的嵌入式系统。这一阶段系统的主要特点是:CPu种类繁多,通用性比较差;系统开销小,效率高;一般配备系统仿真器,操作系统具有一定的兼容性和扩展性:应用软件较专业,用户界面不够友好;系统主要用来控制系统负载以及监控应用程序运行。第三阶段是通用的嵌入式实时操作系统阶段,是以嵌入式操作系统为核心的嵌入式系统。这一阶段系统的主要特点是:嵌入式操作系统能运行于各种不同类型的微处理器上,兼容性好;操作系统内核精小、效率高,并且具有高度的模块化和扩展性;具备文件和目录管理、设备支持、多任务、网络支持、图形窗口以及用户界面等功能;具有大量的应用程序接口(API),开发应用程序简单;嵌入式应用软件丰富。第四阶段是以基于hltemet为标志的嵌入式系统,这是一个正在迅速发展的阶段。目前大多数嵌入式系统还孤立于Imemet之外,但随着Intemet的发展以及Intemet技术与信息家电、工业控制技术等结合日益密切,嵌入式设备与Imemet的结合将代表着嵌入式技术的真正未来。视频监控系统正是嵌入式设备与Intemet相结合的产物,它的应用代表了嵌入式技术的未来发展方向。2.1.3嵌入式Linux操作系统的特点嵌入式Linux得到了蓬勃发展,并已进入实用阶段,如R}Linux、ucLinuX等。LinuX是一种免费的,开放源代码的操作系统,它可应用于多种硬件平台,微内核直接提供网络支持,而不必象其他操作系统要外挂TCP佃协议包。Linll)【在台式机上的成功,也保证了Liml)‘在嵌入式系统中将有辉煌的前景。同时,图形图像技术是近年来计算机发展最为迅速、最吸引人的领域之一,其应用涉及多媒体通信、医学研究、工业生产等诸多领域,特别是数字成像技术的发展,使得图像应用更加广泛。嵌入式Lin慨的优越性十分突出。嵌入式Lin呱的优点很多,最突出的一点是它完全开放的源代码,可以被修改和重新发布,而且都是免费的,没有产权问题。同样是微内核设计,嵌入式Linux操作系统具有比其它嵌入式操作系统更良好的可扩展性。还有.10. 东北大学硕士学位论文第2章LinH系统下设备驱动开发遍布全球的开发团队和热心的、专业的爱好者,他们为嵌入式Linux不断地加入了新的技术。借助Lmx的不断升级,基于Lillux的嵌入式Lillll)【系统也能不断的得到扩充升级。嵌入式Lillux系统天生具有的网络支持特性在Intemet时代与其他嵌入式操作系统相比无疑也是一大优势。在uClinl|)【这个英文单词中u表示Micro,小的意思,C表示co曲.0l,控制的意思,所以uClinux就是Micfo_con的1.Linux,字面上的理解就是“针对微控制领域两设计的Linux系统”。Lin既自身具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越嵌入式系统开发中的仿真工具(ICE)的障碍113J。嵌入式LilIux作为嵌入式系统有以下几个特点:(1)系统内核小。由于嵌入式系统一般是应用于小型电子装置,系统资源相对有限,所以内核较之传统的操作系统要小得多。(2)专用性强。嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。(3)系统精简。嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能的设计及实现过于复杂,这也一方面利于控制系统成本,同时也利于实现系统安全。(4)高实时性。(5)多任务的操作系统。(6)嵌入式系统开发需要专门的开发工具和环境。2.2Linux下驱动程序开发在Linux系统下编写驱动程序的原理和思想完全类似于其他的uIlix系统,但它与dos或windows环境下的驱动程序有很大的区别。在Linll】【环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kemel中的函数,有些常用的操作要自己来编写,而且调试也不方便。下面先介绍一下在Linll】【系统下设备驱动程序的功能【14】。设备驱动程序是操作系统内核和外围设备之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:对设备进行初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在LiIl慨中应用程序是通过设备文件来对实际的设备进行操作,每个设备文件都有.11.。 东北大学硕士学位论文第2章Lin“系统下设备驱动开发其文件属性,表示是字符设备还是块设备。另外每个设备文件都有两个设各号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个摄像头,就可以用从设备号来区分它们。设备文件的的主设备号必须与设备驱动程序在内核注册时申请的主设备号一致,否则应用程序将无法访问到驱动程序。应用程序利用系统调用在对设备文件进行诸如读写操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取完成这个操作的相应的数据结构的函数指针,接着把控制权交给该函数指针,最后通过函数指针调用不同的函数完成对设备不同的操作,实现对设备的驱动功能。这是lillll)【的设备驱动程序工作的基本原理,可以说驱动程序工作分两步:首先将驱动程序注册迸系统内核,告诉系统如何找到驱动程序;其次实现驱动程序的具体功能,也就是函数指针指向的函数所实现的功能。2.2.1驱动程序开发基础在嵌入式系统中,操作系统是介于应用程序和硬件设备之间的一个系统软件,其目标是为用户提供一个统一的编程接口。由于操作系统所面对的硬件设备种类多种多样,不同型号不同厂家的设备又都有自己的特点。所以要支持某种设备就必须提供这种设备的驱动程序,然后把它加载进内核,内核才能使用该设备。从内核的角度来看,驱动程序是一个设备的代表。当内核需要与某个设备进行对话时它就找到该设备的驱动程序,然后通过标准的数据结构接口调用驱动程序的函数指针,来控制设备,而内核并不需要知道驱动程序的工作原理,也不需要了解设备的细节,设备的细节是由驱动程序掌握的。驱动程序可以动态地加载和卸载,从而内核只需要包含必需设备的驱动程序,这对于嵌入式应用是非常重要的。图2.2就是设备驱动程序的加载与卸载过程【l习: 东北大学硕士学位论文第2章LiIlux系统下设备驱动开发图2.2设备驱动加载与卸载示意图Fig.2.2111ePi咖rcofDeviceRegisteringandD啪gisteringLinll)【抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来处理,可以使用和操作文件相同的、标准的系统调用接口来完成对硬件设备打开、关闭、读写和I,o控制等操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Lillll)【设备驱动程序在Linll)【的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在LiIlux内核的不断升级过程中,驱动程序的结构仍就相对稳定。设备驱动程序是构成Linux内核的主要部分,它在高特权的内核环境下运行,如果驱动程序出错将会导致灾难性的后果。因为如果驱动程序设计的不合理会直接影响内核本身的稳定性,一旦系统内核出现了混乱,整个系统就可能崩溃,所以驱动程序的开发是设备开发的重点和难点之一。每个设备文件都有两个设备号,Linux内核通过设备的主设备号和次设备号来访问设备的驱动程序。在Linu】【2.O内核中的主设备号只能支持到128个设备,LinIl】【2.2内核之后主设备号就可以支持到256个设备。而从设备号只能使用8个bit,所以只能支持127个设备,从设备号主要是为了区别使用同一种驱动程序的多个设备。一旦驱动程序在系统注册成功后,系统最主要就是利用这个主设备号和驱动程序进行对话。2,2.2Linu)c下设备分类Linux系统的设备主要包括字符设备(chardcvice)和块设备(bIockdcvice)两种lⅫ。字符设备是指存取时没有缓存的设备,不需要随机存取;块设备的读写都需要有缓存来支持,并且块设备必须能够随机存取。字符设备和块设备的主要区别是:在对字符设备发出读,写请求时,实际的硬件I/O一般就紧接着发生了,块设备与此相反,块设备利用一 东北大学硕士学位论文第2章Linux系统下设备驱动开发块系统内存作缓冲区,当现有的数据能够满足用户的要求,就返回请求的数据,如果不能,才调用请求函数来进行实际的I/o操作。块设备是主要针对磁盘等慢速设备设计的,可以避免耗费过多的cPu时间来等待。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘,软盘和光驱等。’2.2.3驱动程序的构成在Linux中驱动一个硬件设备,首先要在内核中加载并运行这个设备的驱动程序模块;然后,当驱动程序模块加载成功后,驱动程序就会根据自己的设备类型向系统内核进行注册,驱动程序注册成功后系统内核会反馈一个主设备号,这个主设备号就是系统内核对驱动程序的唯一标识;最后,系统将这个硬件设备抽象成一个设备文件,并把设备文件通过主设备号和它的驱动模块相关联,因此应用程序可以像操作普通文件一样对设备文件进行操作,就相当于驱动模块通过read^枷te操作来完成对硬件设备的驱动。Linux下的摄像头驱动是以81为主设备号的字符型设备驱动,应用程序可以通过打开一个具有该主设备号的设备文件来建立与设备驱动程序的通信。如果所使用的Linux系统没有该设备文件,可使用Linu】【下命令%ml(110d/dev/videoOc8lO来手动创建该设备文件,其中参数c代表这是一个字符设备、81代表主设备号为8l、0代表从设备号设为0Im。图2.3就是Linu)【下一个硬件设备被驱动的过程:图2.3LinuxF硬件设备驱动过程Fig,2.3T1lePfocessofDriVeringHardwarcDeviceinLinux设备驱动程序可以分为三个主要组成部分:(1)自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备一切正常,则对这个设备及其相关的设备驱动程序进行初始化,这部分驱动程序仅在初始化的时候被调用一次,否则返回配置失败或初始化失败的错误信 东北大学硕士学位论文第2章Linll)【系统下设备驱动开发息。(2)服务于L,o请求的子程序,又称为驱动程序的上半部分。这部分子程序是由应用程序的进程来进行调用的,这部分子程序在运行的时候,系统把它看作和应用程序的进程属于同一个进程,所以这部分子程序也就具有和应用程序相同的运行环境,因此可以在其中调用sleep0等与进程运行环境有关的函数。(3)中断服务子程序,又称为驱动程序的下半部分。在Lill呱系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linll】【系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的多个设备,所以一般在系统调用中断服务子程序的时候,都带有一个或多个参数,以唯一标识请求中断服务的设备。在系统内部,∞设备的存取通过固定的接口来进行,这个接口是由每个设备的设备驱动程序提供的。2.3Ⅵde04Linux简介在目前的Linux核心中,视频部分的标准是Ⅵde04Linux(简称V4L)。这个标准定义了一套接口,内核、驱动、应用程序以这个接口为标准进行互相访问。在Lmll)【内核中,wL基本上为所有的视频和音频设备都提供了统一的接口,UsB摄像头也属于它支持的范畴。Ⅵde04Linll)【也是Linux中关于视频设备的内核驱动,它为针对视频设备的应用程序编程提供一系列接口函数,这些视频设备包括现今市场上流行的TV卡、视频捕捉卡和USB摄像头等l埔l。根据USB摄像头的驱动程序的需要,V4L不但提供了基本的I,o操作接口函数open、read、write、close等的实现,而且提供了对中断的处理实现,内存映射功能以及对I,o通道的控制接口函数ioctl的实现等,并把它们定义在s仉lctfileoperatioils中。这样当应用程序对设备文件进行诸如opcn、clo∞、read、write等系统调用操作时,Linll)【内核将通过fileoperalions数据结构访问设备的驱动程序提供的函数。例如,当应用程序对设备文件执行读操作时,内核将调用设备驱动程序的fileopefations数据结构中的read函数,读取USB摄像头捕捉到的数据。Vide“Lintl)【作为Linux中的接口规范,它为音视频设备的驱动程序的编写主要提供了以下数据结构:s饥lctVideo—capability缈bcap;s蛔Ktvideo—Jictll托grabpic;snctvideo—_mm印gmbjm£ 东北大学硕士学位论文第2章LIn“系统下设备驱动开发stnlctVIdeo—_mbufgmb_vm;这些数据结构的用途如下:video_capabil蚵包含了摄像头设备的基本信息,例如摄像头的名称、摄像头支持的最大和最小分辨率、信号源的信息等。video—picture包含了摄像头设备采集的图像的各种属性,如亮度、色调、对比度、颜色等。vide吖nmap用于实现内存映射。video-mbuf是利用video_Inmap进行内存映射得到的帧的信息,也就是输入到摄像头存储缓冲区中的帧的信息,包括帧的大小、最多支持的帧的数目、每一帧相对基址的偏移量等。Ⅵde04Linux向文件系统注册视频设备文件,应用程序通过操作视频设备文件实现对视频设备的访问。因此vide04Linu)【是Linux下usB通用驱动程序开发的关键,利用v4L可以较快较好的完成驱动程序的开发工作。 东北大学项士学位论文第3章uSB设备驱动开发第3章USB设备驱动开发USB是英文”UIliversalSerialBIlS”的缩写,意为”通用串行总线”【19J。是由compaq(康柏)、DEC、mM、硫el、NEC、微软以及Nordl哪Tclecom(北方电讯)等公司于1994年11月共同提出的,主要目的就是为了解决接口标准太多的弊端。USB使用一个4针插头作为标准插头,并通过这个标准接头,采用菊花瓣形式把所有外设连接起来,它采用串行方式传输数据,目前最大数据传输率为12Mbps,支持多数据流和多个设备并行操作,允许外设热插拔。USB摄像头不但具有体积小、重量轻、功耗小、工作电压低和抗烧毁等优点,而且在分辨率、动态范围、灵敏度、实时传输和自扫描等方面的优越性,也是其它摄像器件无法比拟的。目前,usB摄像头已在航空航天、卫星侦察、遥感遥测、天文测量、传真、静电复印、非接触工业测量、光学图像处理、图文识别、数据存储等领域得到了广泛的应用。3.1USB基础知识目前UsB接口虽然只发展了2代(USBl.o/1.1,usB2.o),但是usB综合了一个多平台标准的所有优点:降低成本,增加兼容性,可连接大量的外部设备,融合先进的功能和品质。这些优点使得usB逐步成为PC的接口标准,进入了高速发展的阶段。在早期的计算机系统上常用串口或并口连接外围设备,每个接口都需要占用计算机的系统资源(如中断,MD地址,DMA通道等)。无论是串口还是并口都是点对点的连接,一个接口仅支持一个设备。因此每添加一个新的设备,就需要添加一个IS刖EISA或PCI卡,同时系统需要重薪启动才能驱动新的设备。而采用USB接口则可以避免这类的问题,不但节省系统的资源而且使用起来非常方便。UsB第一版的规范定为1.1,其最大传输速率为12Mbps,最多可支持127个UsB外设连接到计算机系统,它的物理结构为星型,也就是说,即使主板上只有一个UsB接口,只要能找到合适的UsBHub,就可以实现连接最多127个usB设备的功能。3.1.1USB的优势(1)真正的即插即用;对UsB设备的自动检测与设置功能,usB是市场上通用的接口,可以更大限度地节省系统的资源,只需使用简易的电缆来连接,不需要单独电源。(2)速度的提升:USB第一版的规范定为1.1,其最大传输速率为12Mbps;随着全新的uSB2.O规范诞生,UsB设备的传输速率已经高达48弧dbps,usBoTG标准的提出,让usB2.O可以摆脱设备端一定要有主机端的束缚,大大扩展了usB2.O标准的应 东北大学硕士学位论文第3章usB设备驱动开发用范围。(3)性价比的优势:usB的接口在线缆和机械方面简单易行,价格上也有很大的优势,具有稳定的性能和强大的功能睇oJ。3.1.2USB数据传输usB的数据传输是通过通道在主机缓冲区与设备端点之间进行的,在消息通道中传送的数据具有USB定义的格式,但在USB定义的消息数据有效载荷区中也可以传输具有设备指定格式的数据。UsB提供了不同的数据传输类型,可以满足客户软件和设备功能的不同服务要求。usB主要有4种数据传输方式:控制传输、批量传输、等时传输和中断传输。(1)控制传输:突发式、非周期性的,由主机软件发起的请求或响应的通信,通常用于命令事务和状态事务。(2)等时传输:在主机与设备之间周期性的、连续的通信,一般用于传输与时间相关的信息。等时传输用于可以应付数据丢失情况的设备,这类设备更注重于保持一个恒定的数据流。(3)中断传输:低频率、固定延迟的通信。(4)批量传输:非周期性的、大量的突发性传送。典型地用于传送那些可以利用任何带宽的数据,而且当没有可用带宽时,可以延时传输的数据。不论控制传输、中断传输或批量传输都要保证所要传输数据的正确性,并且会自动进行CRC校验。正因如此,上述三种传输类型都有一个共同的缺点,就是并不保证数据传输的实时性。而有些应用对数据的实时性要求比对数据的J下确性要求更高,如实时传输声音、图像等。在这种情况之下,就必须选择等时传输来作为USB设备传输数据的方式。正如上面所说的原因,在等时传输模式的封包格式,并没有cRc校验这一验证数据是否正确的机制,只有ID包与数据包,当接收端接收到的数据封包内容与发送端的数据包不相同时,也就是发生数据传输错误时,USB主机端也不要求重新传输数据,只要将数据在一定时间内传送完成即可。图3.1是等时传输的包的格式f211:图3.1等时传输F.g3.1Isochronous11lans衙等时传输有严格的带宽保证,一般用于传输视频或者音频信号数据。数据包大小在 东北大学硕士学位论文第3章UsB设备驱动开发全速传输时为1023字节,高速传输时为1024字节,发送数据包的时间要求对于等时传输很重要的。为了减少数据包头的带宽,等时传输没有握手信号,没有重试,只有16位的CRC校验。3,1.3USB设备基础UsB协议中,除了通用的软硬件电气接口规范外,还包含了各种各样的cIass协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式及内容。这些cl部s协议的数量非常多,最常见的有支持视频功能的ⅥdcocI鹞s,以及通用的数据交换协议CDCClass,此外还包括M罅sstorageCl嬲s,PrimClass等122J。理论上即使没有这些CI勰s协议,通过专用的驱动程序也能够实现各种各样的应用功能。但是,制定这些class协议可以对相应的功能设备的应用起到巨大的推进作用。例如M解sstomgeClass协议的制定,使得各个厂商生产的U盘都能通过操作系统自带的统一的驱动程序来使用,对U盘的普及使用起了极大的推动作用。VideocI勰s协议的目的是给usB接口的视频设备提供一个统一的数据交换规范。最初版本是在2003年9月才添加到UsBCl硒s规范中的,Vidcocl髂s1.1的版本更是在2005年才发布。相比之下,Massstorageclass协议早在1998年就发布了,而且支持videoCl勰s协议的多媒体芯片也是在2005年才陆续发布。所以uSB视频设备目前还处在初始发展阶段,在设备端多数依旧还采用原先的各种包含通用uSB功能的多媒体处理芯片,主机端需要安装专用的设备驱动程序,基本上各个产品之间不具备兼容性。甚至对于操作系统而言,也只有在xP的sP2以后,才包含了对通用的ⅥdeoClass协议的支持。所以即使是某些多媒体设备包含了对Ⅵdeocl鹤s的支持,在windows2000或Linux等操作系统上依然需要安装驱动程序。尽管如此,使用ⅥdcoCl嬲s无疑会是~个趋势,在相应的多媒体芯片陆续投入市场后,支持Videocl嬲s的多媒体设备应该会在一两年内会迅速普及开来。由于目前支持ⅥdeocLass的设备还很少,所以在Linll】‘上相应的UsB摄像头设备的驱动程序还很少。因此研究Lin麟下usB的摄像头驱动程序对于未来Linll)(下多媒体设备的普及和应用有着重要的意义,特别是开发通用的摄像头驱动程序更是对摄像头设备的应用起到推动的作用。UsB设备的构成包括配置、接口和端点【2",图3.2是usB设备的概观: 东北大学硕士学位论文第3章uSB设备驱动开发Devicehltctfacec∞地EndpointEndpointEndpointjIllterfhceEndpoimEndpointEndpoint图3.2USB设备概观F唔3.2usBDeviceoverview端点(Endpoim):UsB通信最基本的形式是通过端点进行通信,USB端点只能往一个方向传送数据,从主机到设备(称为输出端点)或者从设备到主机(称为输入端点),端点可以看作是单向的管道。usB端点有四种不同的类型,分别对应控制、等时、中断、批量四种不同的数据传输方式。接口(Interf-ace):usB端点被捆绑为接口,usB接口只处理一种uSB逻辑连接,例如鼠标、键盘或者音频流。一些USB设备具有多个接口,例如USB扬声器可以包括两个接口:一个用于键盘控制,另一个用于音频流传输。因为一个USB接口代表了一个基本功能,而每个uSB驱动程序控制一个接口,因此,以扬声器为例,Linux需要两个不同的驱动程序来处理一个硬件设备。配置(collfi西:usB接口本身被捆绑为配置。一个UsB设备可以有多个配置。而且可以在配置之间切换以改变设备的状态。Lillll)【内核中的uSB代码通过一个urb和所有的usB设备通信。这个请求块使用s仕uctufb结构体来描述,可以从include/linux^lsb.h文件中找到。urb被用来以一种异步的方式往/从特定的usB设备上的特定usB端点发送/接收数据。UsB设备驱动程序可能会为单个端点分配许多urb,也可能对许多不同的端点重用单个的urb,这取决于驱动程序的需要。一个urb的典型生命周期如下:(1)由USB设备驱动程序创建: 东北大学硕士学位论文第3章usB设备驱动开发(2)分配给一个特定UsB设备的特定端点;(3)由USB设备驱动程序递交到USB核心;(4)由usB核心递交到特定设备的特定UsB主控制器驱动程序;(5)由USB主控制器驱动程序处理后传输到设备端:(6)当Ⅲb结束之后,USB主控制器驱动程序通知USB设备驱动程序。3.2USB驱动开发整个USB驱动程序的软件部分由USB主机控制器驱动(HCD)、USB核心驱动(USBD)和USB设备驱动程序组成阱J。其中HCD和USBD被称为USB协议栈,这两部分共同处理与协议相关的操作。图3.3是uSB驱动程序结构:用户图3.3USB驱动程序结构Fjg.3.3TheSt那ctureofUSBDriver3.2.1主机控制器驱动HcD(HostCon廿DllcrDrivcr)是usB驱动程序中直接与硬件交互的软件模块,其主要功能有:(1)主机控制器硬件初始化;(2)为USBD层提供相应的接口函数:(3)提供根}玎JB配置、控制功能;(4)完成4种类型的数据传输等。每个USB主机控制器都需要提供给USBD层一个数据结构llsb_-operatio嬲。通过数 东北大学硕士学位论文第3章usB设备驱动开发据结构中的相关函数,usBD可以实现针对该主机控制器的数据传输。目前有两种不同的主机控制器的设计规范,称为OHCI(OpenHostCon仃oller111terfkeSpecification)和UHCI(UIliversalHostControllermterfaceSpecification)【251。它们和各自的驱动程序一起,完成了对整个USB系统的管理和数据传输的控制,它的作用相当于一个CPU的通信协议处理器。oHCI的硬件性能比UHcI稍强,它的软件驱动相应简单些,因此嵌入式系统多采用OHcI规范的主机控制器。在Linux系统下定义了如下用于支持OHcI主机控制器的数据结构。smlct璐b-ope豫tio哪ohci_deVicc_ope枷om={ohci-alloc—dev'ohci一毹e-dev'ohci—get-purrent_丘amc--n啪喊ohci—submiUIrb,ohci—utlli虹urb};aIHcI协议中提出了两个主要的数据结构:端点描述符ED(EndpointDeScripo∞)和传输描述符TD(TransferDescriptI)r)。驱动程序为usB系统上的每一个需要传输数据的端点指定一个ED,该ED中包含了主机控制器与设备端点进行数据传输的各种必要信息,包括接口地址、端点地址、端点相关的数据的传输速度、最大数据包长度、数据传输方向等。不同传输类型的ED用单向链表的方式连接在一起,以便控制器进行顺序操作。ED存在的目的就是为主机控制器提供对设备端点的理解,ED长度为16字节,因为是驻留在内存中的数据结构,所以可以由HCD和主机控制器共同访问。每一个ED又包含了一系列TD,它们以单向链表的形式链接,每一个TD中包括数据访问内存区的地址、数据传输状态信息等。3.2.2USB核心驱动usB核心驱动,即uSBD,是指在Linll)【操作系统上用特殊的API对usB总线和协议提供支持的软件,它独立于HcD和usB设备类驱动程序,并对它们进行控制和为它们提供统一的编程接口。Lillux称其为usB内核,表示它是usB软件系统的核心。USBD通过定义一组宏、数据结构和函数来抽象出所有硬件或是设备具有依赖关系的部分。USB核心驱动对协议规定的USB总线以及USB设备共有的操作和性质提供支持,如设备插入和拔出的动态处理、地址分配、配置、负责各种类型的数据传输,对插入的设备供电,收集各种状态信息并进行处理等。usB核心驱动处于系统的中心,对于它进行研究是能够进行UsB驱动开发的第一.22. 东北大学硕士学位论文第3章usB设备驱动开发步。USB核心驱动为客户端驱动和主机控制器驱动提供了主要数据结构和接口函数,主要有四类功能:客户端驱动管理,usB设备的配置和管理,主机控制器的管理,协议控制命令集和数据传输的管理。USBD中主要有四个数据结构,分别是:(1)UsB设备数据结构usbjevice,它保存了一个UsB设备的信息,包括设备地址,设备描述符,配置描述符等等。蚶uctusbdevice{//代表一个UsB设备imdevnum:/,分配的设备地址,l一127amm{USB—SPEEDUNKNOWN=O,USB_SPEED_LOw,USB—SPEED』ULL,USB—SPEEDj{IGH)speed;//设备速度,低速/高速/全速stmct懈bdevice’tc;intt印ort;atomicjrefbm;s协Jct∞maphoreserialize;吼sigIledimtoggle【2】;硼signedimIlalted【2】;im印maxpacketin【16】;imepma)【packetout【16】;鼬mctusb—dcvice+parent;structllsb-bIls铀璐;s仇lctllsb_d“ic9jescriptordcs嘶p衄;s仇lctllsb』orIfig_descriptor+config;stnlctusb_config_descriptor+actcoll丘g;char··rawdescriptors;inthaVe-langid;ims仃ing_l觚百d;void·hcpriV;s们_Ict1ist.-headinodes;intmaxcllild:stnlctusb_.device·chndren【usBMAxcHILDREN】;}; 东北大学硕士学位论文第3章uSB设备驱动开发(2)UsB总线系统数据结构Ilsb_b哪,它保存了一个USB总线系统的信息,包括总线上设备地址信息,根集线器信息,带宽使用情况等。一个USB总线系统肯定有一个主机控制器和一个根集线器。s虮lctllsb.bus{仇JSB总线系统imbusn哪:intdeVn衄next;stnlctllsb—4evmapdem印;g协∞tlIsb_operatio璐+op;strIlctusb-device‘root-hub;s仉lctlist-}leadbu曼jist;void%cp五v;缸b锄捌dⅡLallocated;intb明dwidth—i珏t-feqs;iIltb{m小“dth—isoc-_reqs;stnlctlist--headinodes;atomicjrefcnt;);(3)客户端驱动程序数据结构llsb_driver,它保存了客户端驱动程序的信息,包括驱动程序的名称,以及驱动程序提供给usB内核使用的函数指针等。stn|ctusb_-driver{constchar牛name:Void+(+probe)(structusb—deVice·deV;msigIledi皿;coIlsts衄lctlls吐dcviccjd+id);void(’disco她ect)(gtrIlct啪b_device·,void·);shllctlist_headdriVer_list;s蚋Ktfile掣ration·fops;i芏垃minof:s咖ctsemaphoreseralize;int(·ioctl)(structllsbjevice+dev,∞signedmcode,Void幸bu织const咖ctllsb_deVicc-id+id_table;};(4)urb(UsBRequestBlock),它是进行UsB数据通信的数据结构。 东北大学硕士学位论文第3章usB设备驱动开发sl譬ucturb{spinlockjlockvoid+hcpriv;s臼uctIist—如adurb—list;stnIctufb+next:strIlct琳b_deVice+deV;unsignedintpipe;intstatus:瑚signedinttransfhnags;vOid·仃allsferbu插;r:im仃a郴ferbu脓length;imactualjengm;imkmd谢dtll:unsignedch盯·setup_packet;imstaftf随me;imnumbef—.of_packe招;iminterval:imerror-.comlt;inttimeout:vOid+comext:璐b_completejcomplete;iso_packet_descriptor-tiso.疳锄e.desc【O】;}urbt’+pIlrb-t;3.2.3USB设备类驱动UsB设备类驱动是最终与应用程序交互的软件模块,其主要为应用程序提供设备访阚接口、提供驱动程序的管理、负责设备接口的插入拨出处理以及对设备的控制与驱动等功能。但是,不同设备的驱动程序其功能的具体实现不同,需要根据usB提供的类协议进行分析。UsB设备驱动程序的代码根据功能来分,可以分为6个部分:(1)设备的注册和注销:由于USB设备一般具有即插即用功能,因此当设备插入时驱动程序要自动检测到设备已连接并向内核中注册该设备,当设备被拔出时驱动程序也要检测到设备已断开并向内核中注销该设备;(2)驱动程序的注册和注销:设备的驱动程序成功加载到内核后,会向内核注册本驱 东北大学硕士学位论文第3章usB设备驱动开发动程序的信息,如本驱动程序支持那些设备,当驱动程序支持的设备插入或者拔出时执行哪些操作等:f3)设备的打开和释放:当应用程序对设备文件进行打开和关闭操作时,设备的驱动程序需要完成相应的打开和释放功能;H)设备的读写操作:当应用程序对设备文件进行读写操作时,设备的驱动程序需要完成相应的读写功能;(5)设备的控制操作:驱动程序具有取得设备状态信息,对设备进行控制的功能:(6)设备的中断处理:驱动程序要可以处理设备运行过程中产生的各种中断。主机控制器驱动和设备类驱动把它们的功能函数以数据结构的形式注册进usB核心驱动中。但是它们的角色是不同的,主机控制器驱动负责从UsB总线上收集设备信息,扮演的是产生信息的角色;而各种设备类驱动负责解码数据包,并把数据包传送到它们各自的目的地。USBD通过一个双向链表邶bdiⅣerJist维护了所有的加载在uSB系统中的设备驱动程序。usB内核对设备驱动程序的管理包括两部分:驱动程序的加载和卸载,实现驱动程序对usB设备接口的驱动。为此usB内核提供了两个接口函数usbregister(s仃uctusb_driver+ncw』rivcr)和usb_dere百ster(s仃uct璐b—driVer+new_diⅣer)。(1)加载和卸载驱动程序LinIl】‘下驱动程序的管理是采用动态加载和卸载设备驱动程序的方法。当有新设备驱动程序试图加载到uSB协议栈中时,首先它会在自己的初始化函数中调用usbfegister0函数,然后USB内核会分析此驱动程序是否首次安装,如果是,就通过此驱动程序提供的数据结构stmctlIsb嘶ver中的双向指针,把此驱动程序链按到usB内核维护的usb.driverlist链表中,否则就返回注册失败的错误信息。当设备不再使用的时候,可以调用usbderegistcr()函数卸载相应的驱动程序。(2)实现驱动程序对usB设备接口的驱动Ilsbregigte“)除了将驱动程序加载到USB内核维护的usb嘶verlist链表中之外,它还通过深度优先算法按usB系统所具有的树状结构搜索系统中所有尚未被驱动的设备,由驱动程序检验是否能驱动。在LiIlux下,设备驱动程序可以看成Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和抛控制操作,而开发驱动程序的主要任务也就是要实现这些系统调用函数。本系统目标平台使用的嵌入式Lillll)【系统在内核主要功能上与普通的 东北大学硕士学位论文第3章usB设备驱动开发Linux操作系统没有本质的区别,所以开发驱动程序的方式是一样的。3.3摄像头USB摄像头作为当今流行的视频设备应用到各个相关的领域当中,尤其是在视频监控领域中,UsB摄像头作为前端设备负责图像的获取。因此了解usB摄像头设备的内部结构与性能参数对于其驱动程序的开发是十分重要的,从中也可以总结出不同型号摄像头设备的驱动程序差异的原因,为开发通用的摄像头驱动程序打下基础。3.3.1摄像头简介摄像头(c舳RA)又称为电脑相机、电脑眼等,它作为一种视频输入设备,在过去被广泛的运用于视频会议、远程医疗及实时监控等方面。近年以来,随着互联网技术的发展,网络速度的不断提高,再加上感光成像器件技术的成熟并大量用于摄像头的制造上,这使得摄像头的价格降到普通人可以承受的水平。普通的人也可以彼此通过摄像头在网络进行有影像、有声音的交谈和沟通。摄像头主要由核心Ic控制芯片,图像传感器和镜头三部分组成【26】。核心Ic控制芯片即数字信号处理芯片DSP,它将图像传感器获取的数据及时快速地传到主机端并刷新图像传感器,因此控制芯片的好坏,直接决定画面品质与流畅度;镜头和图像传感器是判断摄像头成像效果的重要指标,摄像头的图像成像效果取决于这两个重要组成部分的用料。在摄影摄像方面,由于要求较高,因此多采用CCD设计,而摄像头对图像要求没这么高,应用于较低影像的CMoS已经可以满足需要。丽且CMOS很大一个优点就是造价相对CCD来说比较低,功耗也小很多。镜头一般分为塑料镜片、玻璃镜头两种,在造价与性能方面,玻璃镜头的价格虽然高但是质量比较好。摄像头分为数字摄像头和模拟摄像头两大类。模拟摄像头可以将视频采集设备产生的模拟视频信号转换成数字信号,进而将其储存在计算机里。模拟摄像头捕捉到的视频信号必须经过特定的视频捕捉卡来将模拟信号转换成数字模式,并加以压缩后才可以转换到计算机上运用。数字摄像头可以直接捕捉影像,然后通过串、并口或者USB接口传到计算机里。现在电脑市场上的摄像头基本以数字摄像头为主,而数字摄像头中又以使用新型数据传输接口的usB数字摄像头为主,UsB接口的传输速度远远高于串口、并口的速度,因此现在市场上主要是usB接口的数字摄像头。例如一款常用的数字摄像头是今视通(ki潞tonc)的l【s.1218型号,其主要采用了中星微(Z.S伽州恤icr01的30l系列芯片和PB330型号的CMoS传感器。3.3.2摄像头工作原理摄像头的工作原理大致为:外面的景物通过镜头生成的光学图像投射到图像传感器 东北大学硕士学位论文第3章usB设备驱动开发表面上,首先光信号被转换为电信号,经过ⅣD(模数转换)转换后变为数字图像信号,然后再送到数字信号处理芯片(DsP)中加工处理,再通过UsB接口传输到电脑中处理,最后通过视频软件在显示设备中就可以看到图像了。其中图像传感器(s衄sor)是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷,也就是光信号转换为电信号。数字信号处理芯片(DsP)主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理,并把处理后的信号通过usB接口传到主机端。以下是摄像头设备的几个性能参数:(1)图像解析度,分辨率(Resolution):SXGA(1280x1024)又称130万像素;XGA(1024x768)又称80万像素:svGA(800x600)又称50万像素;VGA(640x480)又称30万像素:cIF(352)(288)又称lO万像素;sIF/QVGA(320x240);QCIF(176x144);QsIF役QVGA(160x120)。(2)图像格式(ImageFo瑚州colorspace):RGB24和1420是目前最常用的两种图像格式。其中RGB24图像格式表示R、G、B三种颜色各占8bit,最多可表现256级浓淡,可以再现256·256+256种颜色。其它格式还有RGB565,RGB444,YUV4:2:2等。(3)自动白平衡调整(AwB):在不同色温环境下,照白色的物体,屏幕中的图像应也是白色的,这就是自动白平衡调整。其中色温低表示长波光成分较多,当色温改变时,光源中三基色(红、绿、蓝)的比例会发生变化,需要调节三基色的比例来达到彩色的平衡,这就是自动白平衡调节的功能。(4)图像压缩方式:例如静态图像压缩方式JPEG,采用这种压缩方式图像的质量会有一定的损失。压缩比越大,图像质量也就越差。当图像精度要求不高而存储空问有限时,经常选择这种方式,例如在大部分摄像头设备中都使用JPEG格式。(5)彩色深度(色彩位数):反映摄像头设备对色彩的识别能力和成像的色彩表现能力,也就是A仍转换器的量化精度,是指将信号分成多少个等级。常用色彩位数(b“)表示。彩色深度越高,获得的影像色彩就越艳丽动人。(6)图像噪音:指的是图像中的杂点干扰,表现为图像中有固定的彩色杂点。(7)视角:摄像头捕捉图像的范围。(8)输出,输入接口;串行接口(Rs232/422)的传输速率慢,为115Kb耐s:并行接口(PP)的传输速率可以达到1Mbit,s:红外接口(IrDA)的传输速率也是115Kbi魄,一般笔记本电脑有此接口;通用串行总线usB接口支持热插拔,usBl.1的传输速率可达12Mbi仇,usB2.0的传输速率可达480Mbi以:匝EEl394接口的传输速率可达100M~400Mb彬s。 东北大学硕士学位论文第4章通用摄像头驱动开发第4章通用摄像头驱动开发本通用摄像头驱动程序主要包括了两大模块,首先是实现各种摄像头共有功能的共有功能模块,其次是实现芯片操作和传感器设置的芯片和传感器功能模块。本章首先介绍了通用摄像头驱动程序的主要数据结构,然后分别介绍了共有功能模块和芯片和传感器功能模块的具体实现方法,最后总结了通用摄像头驱动程序的开发方法。在Linuxkemel源代码的目录耐ver/usb觚b,skeleton.c中提供了一个最基础的UsB驱动程序,可称之为UsB驱动程序的骨架鲫。通过这个骨架仅需要修改极少的部分,就可以完成一个USB设备的驱动开发,本通用驱动程序的开发也是部分基于这个骨架的。4.1主要数据结构通常USB设备类驱动程序需要提供两个数据结构接口,一个针对UsBD层,一个针对文件系统。为了使本驱动程序实现通用的目的,本通用驱动程序还给每个芯片的操作函数提供了一个数据结构。4.1.1USBD层数据结构首先介绍摄像头驱动程序与UsBD层的接口,摄像头驱动程序需要做的第一件事情就是在usB子系统里注册,并提供一些相关信息,如这个驱动程序支持那种设备,当被支持的设备插入或拔出时,会执行那些操作等,所有这些信息以数据结构tIsbdriver的形式传送到USB子系统中。例如:s硼cs劬Jctusb—蛳Verc哪eradriVer=(Ilame:“c锄era,’.fips:&tlsb-camera—f.ops,probe:cameraJ,robc,disco彻ecl:c锄em—disco加ect};其中,mme是指向驱动程序名字的指针,在内核的所有usB驱动程序中它必须是唯一的,它通常被设置为和驱动程序模块名相同的名字;probe是指向USB驱动程序中的自动检测函数的指针,当UsB内核认为它有一个slnlctusbinterface可以由该驱动程序处理时,UsB内核将调用该probe函数;disco彻ect是指向USB驱动程序中的断开函数的指针,当stmclusbinlerfllce被从系统中移除或者驱动程序正在从IJSB内核中卸载时,usB内核将调用disconnect函数;fops是指向stmctfil9-opcratio璐的指针,驱动程 东北大学硕士学位论文第4章通用摄像头驱动开发序定义了该结构体,把它注册为字符设备文件的访问接口。4.1.2文件系统数据结构当一个摄像头连接到usB总线上时,USB内核通过probe函数判断自己是否支持该设备,如果支持,usB内核为此设备创建设备文件节点,以后应用程序可以把设备当成普通文件来访问,否则会返回错误信息。以下结构定义了摄像头驱动程序与文件系统的接口;staticstnlctfile—operatio邶usbLc锄era—f.ops:{name:“camera'’。open:c锄era—Open,closc:c锄efa—plose,read:c锄era_1read,ioctl:c锄erajoctl,mmap:c锄era—mmap,);其中,name是指向驱动程序名字的指针,在内核的所有uSB驱动程序中它必须是唯一的,它通常被设置为和驱动程序模块名相同的名字:open是指向UsB驱动程序中设备文件打开函数的指针,负责打开摄像头设备并初始化解码器:close是指向usB驱动程序中设备文件关闭函数的指针,负责关闭摄像头设备:fead是指向usB驱动程序中设备文件数据读取函数的指针,负责将数据从设备的缓存读取到用户空间中;ioctl是指向USB驱动程序中设备文件状态控制的指针,负责控制设备文件的状态;mmap是指向usB驱动程序中设备文件的内存映射函数的指针。4.13芯片操作函数数据结构由于摄像头芯片类型众多,所以为了使本驱动程序达到通用的目的,首先需要在初始化的时候根据取得的厂商号和产品号来判断出芯片的类型,然后挂接相应芯片的操作函数到驱动程序共有模块的芯片操作接口下,这样当USB内核调用驱动程序的芯片操作接口时就相当于调用了该芯片的操作函数一样。以下结构定义了芯片操作函数的数据结构:smlctcam—operation{intcam—opsiIlitialize;intc锄—opscoⅢigm_e;c锄Opsstart;cam-opsstop;u16c锄opsgeLbright; 东北大学硕士学位论文第4章通用摄像头驱动开发cam—opss咆bnght;u16cam一叩sget.』olm船t;锄—opsset-印mmst;u16c锄—opsgetJolo墙;c锄opsset-polors;c鼬opsset-旦utobfight;c锄叩ssctqllal埘;imc锄_detcctsof_4etect;);i疵iali盟是指向芯片的初始化函数的指针,负责对芯片进行初始化操作;co曲gu陀是指向芯片的配置函数的指针,负责对芯片的相关参数进行设置;stan是指向芯片的启动数据传输的函数的指针,负责从传感器开始获取数据:s协p是指向芯片的停止数据传输的函数的指针,负责停止从传感器获取数据;sof_detect即startofframedetect,是指向芯片的判断帧的头部的函数的指针,是用来区分帧的头部与数据部分;get_bright和∞tbright是指向芯片图像亮度控制函数的指针,分别负责取得和设定图像亮度的值;getconn私t和setc伽纰Lst是指向芯片的图像对比度控制函数的指针,分别负责取得和设定图像对比度的值;geLcolo璐和set.-colo璐是指向芯片的图像颜色控制函数的指针,分别负责取得和设定图像颜色的值;set.-autobirgllt是指向芯片的自动显亮函数的指针;seLqml时是指向芯片的设定图像质量的函数的指针。4.2通用驱动程序设计各种不同类型的摄像头的驱动程序一般是不能通用的,因此当一个摄像头的配套驱动程序丢失时,即使摄像头设备是完好的也无法继续使用,这给视频监控系统的应用带来了一些困难。经过对不同类型摄像头驱动程序的分析,总结出不同摄像头设备的驱动程序之所以不同通用主要是由于以下几个原因造成的:(1)首先是生产摄像头的厂商不同,基于同一款芯片,不同厂商生产了多种产品,有些厂商在自己产品的驱动程序开发过程中定义了自己的协议规范,这些专有的协议规范给驱动程序的通用设定了障碍,常见的厂商包括3c咖、Aiptek、Benq、creative、Logitech、Intel等。(2)其次是生产摄像头所选用的芯片不同,常见的芯片包括sunplus、z—star,vimicf0、Soni,【、Etoms、Conex柚t、Zor姐、IcMedia仃bnsVision、Pix硪等品牌的芯片。可以说芯片的差异是摄像头设备驱动程序无法通用的主要原因之一,这是因为芯片是一个摄像头设备的主要部件,摄像头设备的主要功能就是通过驱动程序对芯片的操作来完成的。(3)然而即使设备采用了相同的芯片,它采用的cM0s传感器不同,那么驱动程序.31. 东北大学硕士学位论文第4章通用摄像头驱动开发———————————————————————_——————_’—-’—————●—_——_———●—_●—-。—--———_————————_—————————————————一一一一也无法通用。cMos传感器这里指的就是摄像头内部的CMOS电路,通过对传感器内部寄存器的读写可以完成设定摄像头设备的状态和获取图像的功能,常见的传感器包括协5130C、1'cml05A、P鹤102b、Hv7131b、CS2102等。摄像头中芯片(Cllip)和传感器(SeIlsor)的结构图如图4.1所示:图4.1摄像头结构图Fig.4.1ThePictIlreofC踟eraStmctIIre不同的摄像头设备都具有各自的芯片和传感器的搭配组合,每一种搭配组合方法叫做一种方案,可以说有一种方案就有一种摄像头驱动程序。部分摄像头设备的芯片和传感器的搭配组合如表4.1所示:表4.1摄像头中芯片和传感器搭配组合表Table4.1TheRelationshipGroupofchtpa11dsensorinCamem通过以上对于影响驱动程序的摄像头的芯片和传感器搭配组合表,可以得出不同类型的摄像头设备由于其芯片和传感器的不同,所以设备的驱动方式也不同。而且~般摄像头的驱动程序都是将所有的驱动函数写在一个文件中,不但结构不清晰而且也无法被其它摄像头的驱动程序也利用。因此本通用驱动程序分成两部分:一部分是驱动程序的共有功能模块,负责实现驱动程序的共有操作函数,对于不同摄像头设备的区别(主要 东北大学硕士擘位论文第4章通用摄像头驱动开发是由于芯片操作和传感器设置带来的区别)则通过驱动程序的芯片操作函数接口来调用具体的芯片操作函数和传感器设置函数;另一部分就是芯片和传感器功能模块,负责实现不同种类的芯片的操作函数和不同种类的传感器的设置函数。这样不但程序结构清晰,而且当有新的设备的驱动程序需要添加时,只需要增加新的芯片操作文件和传感器设置文件,然后再重新编译就可以使用。4.3共有功能模块’通用驱动程序共有功能模块的源程序由四个主要部分组成:设备模块的初始化和卸载函数,上层软件接口函数,数据传输函数和usB内核函数。4-3.1初始化和卸载函数由于驱动程序是以模块的方式编译入内核的,因此首先调用modlllejmt来初始化一个模块,并在模块卸载时调用moduleexit。4.3.1.1模块初始化首先在USB内核的模块初始化函数中载入llsb』锄em-jIIit函数,mb_c锄ertinit是驱动程序中负责模块初始化工作的函数,它首先建立摄像头设备的设备文件,然后再向USB内核中注册设备的驱动程序,当驱动程序注册成功时返回0,否则返回.1表示注册失败。moduleiIlit(usbc锄emimt);//】溪块加载staticint—initusbLc锄em—jnjt(void){撑ifdefCoNFIG_PRoC_FSproc_c锄era-crcate();//建立PROC设备文件毒endif产CoNFIG_-PROC-FS+,if(usbJrcgistcr(&c锄em—蚯ver);这个数据结构主要向系统注册了驱动程序的上层软件接口,oⅥmcr是指向驱动程序所属模块的指针;mme是指向驱动程序名字的指针;typc是指向该驱动程序可以驱动的设备的类型的指针;hard、^Ⅲe是指向该驱动程序可以驱动的设备的指针;fops就是上层软件操作函数的接口指针,指向了上层软件接口中具体的操作函数的数据结构,fops的数据结构定义如下:staticsnuct矗le_opemtionsc锄em—f.ops={.owner=THIS—MODULE,.Open2c锄era』peIl,.他le懿e=c锄era—plose,.read=c啪em—read,.mmap=cameraj姗ap,.ioctl=camerajoctl,};//open功能,/clo∞功能/施ad功能//内存映射功能//设备控制功能4.3.2.1opcn功能c啪emopen函数的具体功能如下:首先检测驱动程序是否注册入系统内核以及申请的内存空间是否已经分配,如果满足上述条件则函数继续执行,否则返回错误信息。其次调用c锄erainjtsource函数和camera_initDecodcr函数来完成传感器和解码器的初始化工作。 东北大学硕士学位论文第4章通用摄像头驱动开发最后初始化urb包,启动摄像头设备并开始进行同步数据传输;如果初始化成功,则设置设备的亮度,否则返回错误信息,结束urb包的传输并释放内存。Open功能的程序流程图如图4.4所示:图4.4设备打开程序流程图F-g.4.41kFlowchartofDe“ceOpcn 东北大学硕士学位论文第4章通用摄像头驱动开发4.3.2.2Close功能c锄emclose函数的具体功能如下:首先驱动程序模块的使用数减一,这是用来判断有多少应用程序调用了本驱动程序模块。其次判断当前是否还有驱动程序加载,如果没有则释放驱动程序数据结构占用的内存,否则继续执行下一步操作。然后停止当前的数据传输并关闭摄像头,唤醒所有等待的进程。最后释放内存完成设备的关闭。Close功能的程序流程图如图4.5所示:图4.5设备关闭程序流程图Fig.4.5111eFlowchartofDeViceClo辩4.3.23Read功能cameraread函数的具体功能如下:首先判断设备是否工作正常,申请的内存空间是否成功,如果满足这两个条件则继续执行下一步操作,否则会返回错误的信息,结束函数。其次调用waiLevenUnlemlptible函数轮询等待数据帧的到来,并取得数据帧的长度。然后将数据传送到用户空间完成对设备的读操作· 东北大学硕士学位论文第4章通用摄像头驱动开发最后释放该帧,并设定设备的自动显亮功能,返回数据帧的长度。Read功能具的程序流程图如图4.6所示:图4.6设备数据读取程序流程图F唔4.6111eFlowch珊ofDa协Transfer4.3.2.4Mmap功能‘ 实现设备内存映射到用户进程的地址空间的功能,其关键函数是rema山age_raIlge,c锄em姗ap函数的具体功能如下:首先判断是否有设备连接,如果没有设备则返回错误信息,否则继续执行下一步操作。 东北大学硕士学位论文第4章通用摄像头驱动开发然后判断要进行内存映射的地址空间容量是否大于设备的可用内存容量,如果大于则返回错误信息,否则继续执行下一步操作。最后循环调用rcmap_page-r弛ge函数,实现设备内存映射到用户进程的地址空间的功能。4.3.2.5Ioctl功能Ioctl功能主要实现设备的控制功能,c锄era_ioctI函数的主要代码如下:s诅ticiIltc锄eraioctl(stnlctinode·inodc,s仃uctfile十file,uIlsignedimcmd,眦si掣lcdlongarg){stnJctvide0_device+vdcV=file一>private_咖;stnlct啪b_c锄era·canle托=Vdev->pfiV;intrc:if(down_intemlptible(&c锄em->lock)),/获取信号量rcmm也INTR:rc=video.埘ercopy(劬dc,file,cmd,arg,c锄啪—doocⅡ);//将控制信息传送到用户进程,调用came豫—do_iocu函数来实现up(&c锄em->lock);renlmrC:>4.3.3数据传输函数程序采用outpict』—tasl【let函数来实现同步快速传递数据,并通过软件解码模块实现图形信息的解码。解码模块的入口点挂接在c锄era_open函数中,其具体的函数为camerLinit'isoc。当设备被打开时,同步传输数据也开始,通过调用c锄era__mov幽函数将数据传递给驱动程序,驱动程序通过轮询的办法实现对数据的访问。voidoutpictdotas材et(unsi驴edJongp仃){imerr:snllctcamera-触me‘tasklet觑lme=(s协lctc眦efaj}ame幸)ptr;诅sklet肋me->scaIllengtll=t舔kletf.舢e》highwater—t私klet触me·>da惚;PDEBUG(2,”Taskletask印cadecodcrhd州dnl%dhdrheight%dmemod%d¨,taskIet触me->㈣dt也t觞kIet丘锄e->hdrheight,taskle心ame一>method);err=c锄era-ouIpicture(tasl【letf妇e);/,输出处理过的图片数据if(errf-0){ 东北大学硕士学位论文第4章通用摄像头驱动开发PDEBUG(O,”疗amedecoderfailed(%d)“,e哪;tasklet劬me->grabstate=F&~ME_ERROR;}else{tasklet矗ame一>grabs诅tc=F&气ME_I)oNE;)if(waitqueuc_active(&tasklet舳me->wq))//如果有进程等待,唤醒等待进程wakeupinte删ptible(&t硒klet缸me->wq);}4.3.4USB内核函数Linll)‘下uSB设备驱动程序对下层硬件的操作依靠系统的UsB核心层来实现,USB核心层对上层驱动程序提供了众多函数接口如:峭b-co曲.ol—msg,usD—bulk.msg等。这两个函数接口的作用是,当usB驱动程序只是要发送或者接收一些简单的usB数据时,不想通过创建urb、初始化llrb、等待接收urb这一系列复杂的过程来完成数据传输,这时就可以使用这两个简单的函数接口来完成简单的数据传输。其中usb-contml—msg函数可以实现驱动程序发送和接收usB控制消息的功能,通过这个调用函数就可以实现对usB端点寄存器进行读写操作的函数。例如c砌era—reg_write和c锄era—re&read函数就是通过调用usb—con仃oLmsg函数来实现对usB端点寄存器进行读写操作的函数,其中c锄era』g-vmte函数的具体实现如下:staticintcamem—Jegwrite(stnlct啪bJevice+deV,—_u16reg,—-u16index,—-u16valuel{intr℃:rc2usb』ontfoI—msg(deV,llsb-sndc仃lpipe(dev,O),reg,UsBjⅥE.VENDORIUSBj也Cm—DEVICE,valIle,i11dex,NULL,0,TimeOut);//通过uSB核心层提供的接口函数来设置寄存器的值PDEBUG(5,”reg、喇te:Ox%02X,o)【%02X:0)c%02X,Ox%x”,rcg,index,Value,rc);if(rc<0)err(”regwritc:error%d¨,rc);D曰=urIlrc:} 东北大学硕士学位论文第4章通用摄像头驱动开发4.4芯片和传感器功能模块通用驱动程序的共有功能模块介绍的是通用驱动程序的共有函数部分,主要负责设备的初始化和卸载、以及给上层软件提供结构,负责数据传输函数的调用等功能。为了实现驱动程序通用的目的,各种芯片的操作函数以及传感器的设鹭函数都需要分别实现,下面介绍的就是芯片和传感器功能模块的内容。在通用驱动程序的共有功能模块中,驱动程序在执行打开设备的操作时会调用c锄Detcctcamem函数,这个函数会根据取得的摄像头设备的厂商号(idVendor)和产品号(idProduct)来确定一个摄像头的型号并设定该设备的相关参数,例如一款型号为Z.sta肌icrozc0302的摄像头对应的idvendor和idProdllct分别为0xoac8和o】【0302。根据厂商号和产品号确定了芯片的类型,就可以挂接该芯片的操作函数到驱动程序的共有模块的芯片操作接口下,这样当通用驱动程序调用共有模块的芯片操作接口时,就是调用该摄像头设备的芯片的具体操作函数,然后在芯片的操作函数的初始化函数中还会确定为该芯片搭配的传感器的类型,当芯片和传感器的类型都确定以后,使用驱动程序就像使用为摄像头配备的专用的驱动程序一样。这样无论是哪种摄像头设备,驱动程序都会自动为该设备匹配相应的芯片操作和传感器设置函数,在用户的角度看来与使用该摄像头配套的驱动程序没有区别,这也就实现了通用的摄像头驱动程序。在芯片和传感器功能模块中,每种芯片的操作函数都分别定义在各自的文件中,并且不同传感器设置的函数也分别定义在各自的文件中,这种将不同的芯片和传感器函数分别定义的文件结构对于驱动程序的通用有着重要的意义。因为如果有新的摄像头设备的驱动程序需要加入到系统的时候,不需要全部编写该设备的驱动程序,而只需要根据该设备的芯片类型和传感器类型找到匹配的文件,修改传递给驱动程序的共有功能模块的函数接口即可。如果没有找到符合的芯片类型或传感器类型,则只需要先编写相应的芯片操作函数或相应的传感器设置函数的文件,再将这些文件加入到芯片和传感器功能模块并重新编译就可以使用。总之大部分摄像头的驱动程序都可以这样实现:首先根据芯片和传感器的类型来确定具体的芯片操作函数和传感器设置函数,然后在初始化的过程中将具体的实现函数挂接到通用驱动程序的共有模块提供的接口上,最后驱动程序就可以正常的驱动该摄像头设备。4.4.1芯片操作函数中星微30l系列芯片制成的摄像头在市场占有率极高,但是该厂商不支持Li棚x,这导致中星微的大部分产品都无法在Li肌x下驱动。因此以中星微系列芯片为例子说明 东北大学硕士学位论文第4章通用摄像头驱动开发芯片的操作函数部分既有一定的代表意义,又可以涵盖大量的摄像头产品。芯片即摄像头内部的核心IC控制芯片,包括UsB接口连接和图像处理的功能,芯片的主要作用是对图像传感器发过来的电信号进行处理并控制数据的传输,芯片是由USB接口提供电源的【29】。如图4.7所示的就是中星微zc0301型号的芯片:圈4.7中jli微ZC030l芯片Fig.47z—st甜zc030Ich.p芯片操作函数部分的功能就是分别实现对芯片的功能操作,包括芯片的初始化、启动,停止数据传输、设置传输图像参数等,由于这些功能因芯片的不同而实现的方法不同,因此每种芯片都根据通用驱动程序中的共有模块提供的函数操作接口分别实现自己的操作函数,然后将芯片自己的操作函数挂接到共有功能模块的函数操作接口上,例如函数memcpy(&c锄em一>funct,&£w3xx,sizeof(s仇lctcam.operation))就是实现将z—star芯片的操作函数&f2c3xx挂接到共有功能模块的芯片操作接口&c跏era.>劬ct上。在通用驱动程序的共有功能模块直接调用芯片操作接口就可以实现不同的功能,例如调用接口c锄era->缸1ct.stan在这里就是调用z.s协r的芯片启动函数。在共有功能模块中定义统一的接口为通用驱动程序的实现带来了便利,当初始化完成后,通用驱动程序的共有功能模块中就不需要区分具体的芯片类型,而直接使用定义的芯片操作接口就可以实现相应的功能,这相当于屏蔽了具体摄像头设备的差异性。具体的芯片操作函数c锄operationf2c3xx定义如下:sta_ticstnlctcamope阳tionfzc3xx={.iIlitialize=zc3xx-i础,.con丘gure=zc3xx—poIlfig,.start=zc3】()(一start,.stop=zc3xX_一stop,.getbright2zc3xx—getbri曲nless,.∞t_bright=zc3xx—setbrigh协ess,.get_con拄猫t=zc3xx_ge蛔)mr弱t,.setcOn仃髂t=zc3】‘)【一setcOIln黼t, 东北大学硕士学位论文第4章通用摄像头驱动开发.get—colors=zc3x)【-getcolo碍,.seLcolo墙=zc3xx∞泐lors,.∞Lautobright=zc3x)LsetAutobrig虬.set_qllality;zc3x)【-setquali坝.c棚一shmdown=zc3xx_shuldowll,.sof_qetect=zc3xxjofdete吒);(1)传输的启动和结束函数:zc3)【)【-s伽t是启动等时传输的函数,它同时会根据返回的传感器的类型进行初始化传感器设置的操作;zc3xxstop是传输结束的操作,负责设备寄存器的清零等操作。(2)设备参数的设置函数:摄像头相关参数包括图像亮度、图像对比度、图像颜色的设定的函数,例如zc3)【)【getcolors和zc3Xxsetcolors是取得和设定图像颜色的函数;此外还有支持自动显亮功能的函数zc3xx-s盹~u幻bright。(3)帧头部的判断函数:zc3xxsofdetcct是用来区别帧的头部和数据部分的函数,帧的头部以oxFFOxD8为标识,如果当前传输的是一个帧的头部则返回0,否则返回数据部分的长度:芯片初始化函数zc3xxinit是负责将寄存器的值设为初始值。“)传感器设定函数:标准视频帧格式的定义包括SIF和vGA两种,其中sIF一般为320×240像素,传输速度可以达到20~26句s,vGA一般为640×480像素,传输速度为lOfbs。首先判断一个传感器返回的图像是sIF格式的还是vGA格式的,这个判断过程通过调用函数zc殛pmbese璐or来实现,判断完成后会返回该传感器的id。例如SIF格式的p嬲106型传感器的数组定义为{o)‘0£ox8d,0)【08,0)【03,0)【舱,Oxoo,Ox或o)【噩o)【m,这几个参数分别对应该该传感器的id、8位地址寄存器、8位数值寄存器、传感器寄存器l、16位数值寄存器1的低位、16位数值寄存器1的高位、传感器寄存器2、16位数值寄存器2的低位、16位数值寄存器2的高位;zc3xK—coIl丘g函数是根据得出的传感器id设置芯片的信息,包括传感器名称、图像的高度和宽度、传输管道的大小、数据帧格式和类型等参数。综上所述,大部分芯片的操作函数都是基于共有模块定义的camoperation这个数据结构来实现的,这些操作函数负责完成芯片的参数设定、数据传输设置等功能。这些芯片的操作函数主要是调用USB内核函数中的寄存器读写函数camera』g—州te和c锄era-.re良婵Id来实现的,通过对设备的寄存器读写来完成相应的芯片操作功能。在本通用驱动程序当中,当有新的芯片加入或者需要修改芯片操作函数时,不需要修改共有功能模块,只要新加入一个芯片的操作函数文件或者将相应的芯片操作函数进行修改就可以。 东北大学硕士学位论文第4章通用摄像头驱动开发4.4.2传感器设置USB摄像头中传感器的类型也是影响驱动程序的一个重要因素,同一种芯片可以搭配几种不同的传感器组成不同的摄像头设备方案,例如中星微301系列芯片就支持协s5130、icml05、hdcs2020、hv713l、pb0330、cs2102、ov7630和pasl06b等几款传感器【2鲫。因此除了针对不同芯片的操作函数实现外,针对不同的传感器也要有相应的传感器设置,用来定义对传感器进行设置的数据结构。传感器即图像传感元件,以CMOS(complementaD,Metal0xidesemiconductor互补金属氧化物半导体)居多,也有少量采用ccD的。传感器一般在镜头的底端,是用来将镜头传送进来的光信号转换为电信号,以便在电脑上处理和传输,图4.8就是cMOS传感器的示意图:幽4.8cMosf‘感器小惫幽F培4.8ThePicturcofcMoSSensor例如pasl06b是一款彩色CMoS图像传感器,其内部的SensorAⅡay就是用来感应传入的光信号,传感器通过行/列的解码器将光信号转换成电信号,然后将电信号传给摄像头的芯片进行进一步处理,如图4.9就是pasl06b型传感器的结构图【30l:图4.9p∞106b型cMOS传感器结构图F-g4,9TheBlockDiagramofp鹤106bcMOss蚰sor一46. 东北大学硕士学位论文第4章通用摄像头驱动开发对于传感器的设置一般是通过将需要写入寄存器的数值按照写入的顺序定义为数组来实现的,这些数值每三个为一组分别对应寄存器的地址(rcg)、写入的值(value)、地址的偏移量(index)。当驱动程序需要对传感器进行设置时,会调用邶b-control—msg函数按照定义好的传感器设置数组对寄存器进行读写,也就是通过设置相应寄存器的值来达到控制传感器的目的。下面是pasl06b型传感器在开始传输数据时用来设置传感器的部分数组定义:s协tic—p16pasl06b_startdata口【3】-{{0xAO,o)【03,0)【0008},,,ClockS嘶llg,.SreamandSensOrspecific+/{OxAO,oxOF,Ox0010},//CMOSSe瑚orSelect/.Picturesize·/{OxA0,o)【OO,ox0003},//将Fr咖eWidmHi曲设为00{0)iA0,o)【BO,Oxo004},//将FrameWidtll】Low设为BO{OxAO,0】【00,o)【o005),//将Fr锄eHeightHi曲设为oo{OxA0,0)【90,ox0006),//将Fr锄eHightLow设为90严System+/{0xAO,o)【01,o)【0001},//Systemoperating严SreamandSeIlsorSpecific+/{OxAO,ox03,0,【0012},删dcoComrolFunction{OxAO,o】‘01,0)【0012),删deoCon∞lF咖ction/.IIlittllesemor+/{OxAO,0)【02,Ox0092),//writcregistcr0x02tosemor(i2c){OxAO,0)【04,o)【0093),/,valucOx04{OxAO,oxoo,0)【0094},{OxAO,ox01,o)【0090},{OxAl,0)【Ol,ox0091),//endwritei2c1.G积cIs’|{OxAO,0)【40,o)【Oll6},∥RGain{OxAO,0)【40,o)【0117},//GGain{0)【AO,0)【40,o)【0118},,/BGaill{O,O,O}};以上数组首先初始化了传感器的时钟,其次设定了传感器的类型说明,然后定义了.47. 东北大学硕士学位论文第4章通用摄像头驱动开发‘_‘-●_____-—_-____-———。‘-____-____。。。。_。。。。‘。。。。。_。——‘—。。-。。。。。。。‘。。。。。p‘。。。—。—————’’———————————一传感器传输的图像格式,最后通过向寄存器写值的方式初始化了传感器的设定。关于具体的寄存器地址和数值所代表的意义需要参考具体的CMOS传感器的d她lsheet,根据datasheet上不同寄存器的作用通过寄存器的读写来实现不同的功能。在通用驱动程序中传感器设置和芯片操作函数部分类似,当有新的传感器类型加入的时候,只需要编写新加入的传感器的设置部分就可以,对其它的模块和函数没有影响。4.5总结综上所述,本驱动程序提取出了摄像头设备驱动程序的共有函数操作作为共有功能模块来完成基本的初始化/卸载、与上层软件的接口以及数据传输等功能。也就是说共有功能模块实现的功能是各种不同的摄像头驱动程序所共有的,因此也是本通用摄像头驱动程序的基础。同时,根据不同种类摄像头的差异性,也就是摄像头设备中芯片和传感器的区别,来分别实现芯片的操作函数与传感器的设置,这部分就是通用摄像头驱动程序的芯片和传感器功能模块。‘通用摄像头驱动程序不但实现了对多种摄像头设备都可以驱动的功能,而且将驱动程序分成共有功能模块、芯片和传感器功能模块两大部分,这种驱动程序结构也大大的加快了新摄像头设备的驱动开发速度。 东北大学硕士学位论文第5章系统测试第5章系统测试绝大多数Li肌x的软件开发都以native方式进行,即在本机进行开发和调试,软件也在本机运行的方式口n。这种方式通常不适于嵌入式系统的软件开发,因为对于嵌入式系统的软件开发,它没有足够的资源在嵌入式系统平台运行开发工具和调试工具,所以通常的嵌入式系统软件开发采用交叉编译调试的方式。由于普通的LiIl呶操作系统和嵌入式Linl】)【操作系统对于驱动程序来说在内核和功能上几乎没有区别,因此本通用驱动程序也是在普通Linll】【操作系统下进行开发和调试的。5.1编译通用驱动程序开发完成后首先要将程序文件编译成模块的形式,然后加载入内核,加载成功后就可以进行测试【32l。下面是驱动程序编译的具体步骤:(1)首先在Lill呱系统下屏蔽系统自带的摄像头驱动程序,然后进入通用驱动程序的代码所在的文件夹c锄era中;(2)然后运行编译命令makc进行编译,如【root@10calhostc锄era】群make;(3)运行安装命令mal【einstall来安装驱动模块,如【root@localhostcam叫#makeingtan:(4)创建内核可加载的模块的依赖关系文件,如【mot@localhostc锄era】撑depmod-a:(5)自动载入通用驱动程序模块,如【root@locamostcanle叫#modprobec锄era;(6)最后可以查看驱动程序模块是否加载成功,如果成功则本通用驱动程序就可以使用了,否则需要重新编译和加载。5.2测试编译并加载成功以后就可以开始测试工作,由于编译时已经屏蔽了系统自带的USB摄像头驱动程序,所以测试时不用考虑其它驱动程序对本通用驱动程序的影响。举例测试常用的今视通(kingcone)ks.1218的摄像头,首先将摄像头设备插入系统的UsB接口,然后打开Linux系统下的通讯软件gnomemeeting,按下确定键,就能看到摄像头的画面,其画面如图5.1所示: 东北大学硕士学位论文第5章系统测试图5.1摄像头测试四面Fig.5.1CamemTestImage如果打开V4L设备列表,就可发现该设备已被系统识别,表示系统可以自动的识别设备。不同摄像头设备具有不同的芯片和传感器搭配,这样的一组搭配叫做一个方案。而为了测试本驱动程序的通用性,需要测试不同方案的摄像头设备。本驱动程序能够对已实现的芯片和传感器搭配的摄像头进行驱动,因此通用驱动程序已基本符合要求。未来需要加入更多的芯片和传感器搭配,才能达到真正通用的目的。 东北大学硕士学位论文第6章结束语第6章结束语基于嵌入式Linll】【的UsB摄像头通用驱动程序对于监控系统的顺利实施有着重要的作用,目前的嵌入式系统中选择Lin慨作为操作系统的非常多,也是未来的发展趋势。所以研究开发Linux下的设备驱动有着重要的意义,掌握了开发usB摄像头设备驱动程序的方法对于开发其它设备的驱动程序一样是可以借鉴的。当前的技术领域流行的Lillll)【操作系统与通用的USB接口可以说是一个非常优秀的组合,在很多应用中起到非常重要的作用。目前本驱动的开发实现了以下目标:(1)分析了Lin慨的设备驱动程序开发方法,特别是UsB接口设备驱动的组织结构。(2)分析了视频监控系统的组成,以及摄像头设备在其中的作用和数据的获取方法。(3)解析了USB摄像头驱动程序的构成以及开发模式,详细描述了USB摄像头驱动程序的开发流程与细节,给出了通用驱动程序的软件结构以及具体的实现方法。当然系统还有一些需要改进的地方:(1)目前本驱动程序只是部分通用,由于摄像头设备的种类比较繁多,因此未来改进的目标是可以适应更多的摄像头,达到完全通用的目的;(2)其次是要对驱动程序的大小进行控制,因为嵌入式系统中存储空间有限,要减少驱动程序文件的大小。未来考虑加入联网搜索的功能,在内核空间只保留十分常用的几种传感器和芯片的搭配文件,其它的芯片和传感器搭配文件放到主机上。如果当前的设备在系统中找不到相搭配的芯片或传感器,驱动程序会返回错误信息并退出。而通过联网之后,当驱动程序无法找到相应的芯片或传感器搭配时可以通过网络将厂商号和产品号等相关信息发送回主机,然后主机进行搜索将找到的搭配文件及相关函数发送回到系统上来驱动设备,这种方式的好处是可以节省内核空间并可以使该嵌入式应用系统更为通用lj,J。(3)需要进行更多的摄像头设备的测试工作,由于本驱动程序是为了实现通用驱动程序的目的,因此要测试更多的芯片和传感器的搭配方案,总结出驱动程序的缺点进一步完善。总之基于嵌入式Linll】【的UsB驱动的开发有着现实的意义,尤其是开发LiIlll)【下UsB摄像头的通用驱动程序,不但可以降低系统对摄像头设备的要求,而且还可以提高视频监控系统的适用性,甚至为系统将来的维护运行工作提供了很多的便利,因此USB摄像头的通用驱动程序在很多的实践应用中都将有广泛的用途。 东北大学硕士学位论文参考文献参考文献1.杨继华.基于嵌入式LinuX的远程图像监控系统【D】,华中科技大学,20052.余亚东.基于嵌入式wEB服务器的远程监控系统的研究与实现【M】,华中科技大学,20033.黄英,肖旭,魏急波.基于嵌入式Lillux的远程监控系统的设计【J】,电子工程师,2002,28(4):ll·134.张永强,赵永勇,李崇德.嵌入式远程视频采集系统的设计与实现【J】,现代电子技术,2005.60:38-465.姜平.基于嵌入式Linll)【的摄像系统研究和实现【D】,天津大学电子信息工程学院,20056.林水明,章坚武,王俊.嵌入式Linll)【下UsB主控制器驱动的开发与应用【C】.2005嵌入式世界研讨暨展示会论文集.北京:电子产品世界杂志社,2005.9,3l乱37.肖踞雄,翁铁成,宋中庆.UsB技术及应用设计【M】,北京:清华大学出版社,2003,2—6,244.2808.边海龙,贾少华.USB2.0设备的设计与开发【M】,北京:人民邮电出版社,2004,1-20,217.2509.10.李涵.usB接口驱动的研究与设计【I)】,山东科技大学,200511.刘文权.基于ARM9的车载定位终端研究及usB驱动程序设计【D】,河北工业大学,200612.戴祥.USB数字摄像平台的软件开发【D】.天津大学电子信息工程学院,200413.王滔,于洁。Linux系统下usB摄像头驱动开发【D】,南京大学电子科学与工程系,200514.JonathaIlCorbet,GregKroah-Hamn弛,AlessalldroRubiIli.Linll)【DeviceDmers【M】,3fdEdition,Am丽call:O’ReillyMedia,Inc,2005,327-36l15.DaIlielP.Bov吒MarcoCesati.Understan幽g恤lillIl】【Kemel[M】,3mEdition,Americ锄:O’ReillyMedia,Inc,2005,358—39516.蒋伟宏.嵌入式通信平台设备接口驱动的设计与实现【D】,国防科技大学,200217.余黎煌,张石,鲍喜荣,张平.Linux下基于sitSallg板UsB摄像头图像采集【J】,电子世界2005年7期,54.5518.ZhiboGuo,Hu面城L沁QiongW抽g,肚ng”Yang.AFaStAlgorithmofFaceDetectionforDriverMonit嘶ng【A】,ProccedilIgsoftheSixtllhltcmationalConferenceon 东北大学硕士学位论文参考文献IntelligemSystemsDes咖andApplicatioIls【C】.2006:267-27119.Ruey—ShuIlChell,K啪一C11iehYch,ChaIl-C11illeCh粕g,HHChien.UsingDataMiningTcchnolog),toilnproveManufacturingQIlal姆-ACaseStudyofLcDDriVerICPackagingIndusny【A】,ProceedingsoftlleSeventllACISImemationalConferenceonSo胁娥En酉ncering,AnificialIntelligence,Networking,舭dP啪llel/DistributedComputing【C】,2006:126一13120.魏忠,蔡勇,雷红卫.嵌入式开发祥解【M】,北京:电子工业出版社,2003,183一19121.李嘉,杨佃福.嵌入式远程监控系统的开发【J】,自动化仪表,2002,4:5·722.刘云飞.LimⅨ下usB系统研究与应用【D】,解放军信息工程大学,200423.张春平.UsB数据采集系统的设备与应用[D】,河北工业大学,200424.刘欣,翟勇,方家宝,杨雪鹏.uclinll)【平台上uSB摄像头驱动开发【D1,自动化技术与应用,2006年第3期25.张海峰.嵌入式Linll)【内核及其驱动开发【J】,红外月刊,2003.10(10),26·3126.HongfengZhu,TianhIlaLiu,ChuallshengZhou,Gui啪Cllang.Rcse撤haIldIIIlplementationofZero-CopyTechnologyBasedonDeviceDriVerinLiIlll)【【A】,ProceedingsofmeFirstIntematiollalMuhi—SyInposi啪sonComputeraIldComputatiollalsciences【c】,2006:129一13427.孙天泽,袁文聚,张海峰.嵌入式设计及Linux驱动开发指南一基于ARM9处理器【M】.北京:电子工业出版社,2005.228.JoelMcCall,MohallMTrivedi.DrivermonitoringforahumaJl一centercddriVerassistancesystcm【A】,ProceedingsofthelstACMinterIlatiomlworkshoponH啪an—centeredmultimediafC】,2006:115—12229.毛德操,胡希明.Li删x内核源代码情景分析【M】,浙江:浙江大学出版社,200130.刘峥嵘,张智超,许振山等编著.嵌入式Lmll)【应用开发详解【M1,北京:机械工业出版社,200431.张念淮,江浩.UsB总线接口开发指南【M】,北京:国防工业出版社,200l,1-7,48-86,181.19932.Benj锄iIlSheallaIl,JollrIWFattanIs0,J蜘血ferWbng,K盯lheiIlzMulll,BorisMumaIlIlJul.4.25Gb/sl船er嘶ver:desi印challengesaIldEDAtoolIimitations【A】,Proceedingsofthe43rd黜吼lco砥renceonDesigllautomation【C】,2006:863-86633.JoseCGarc‰Ju她AMomiel-Nelson,SaeidNooshabadi.Bootstrappedmll—s“ngCMOSdriverforlowsupplyVoltageoperation【A1,ProceedingsoftheconferenceonDesign,automationandtcstiIlEllrope.2006:4lO一411 东北大学硕士学位论文致谢致谢首先感谢我的导师王剑副教授,他为我的课题的研究提供了全面的指导,在我的设计过程中提出许多可行性、创造性建议,使系统更趋于完善。王老师在我的学习和生活中也给予我极大地帮助和关怀,为我提供了锻炼和实习的机会。在论文的写作过程中王老师不辞辛劳对我的论文进行了指点和检查,王老师认真负责而又极具耐心的态度给我留下了深刻的印象,在此,我对恩师表示崇高的敬意和诚挚的感谢!感谢高福祥老师,高老师认真的科学态度和亲切和蔼的态度,以及难得的几次对我的指导都使我受益匪浅。感谢史岚老师,史老师是我本科的毕业论文指导老师,她的指导让我有了巨大的进步。感谢夏利老师和刘辉林老师,通过本科学习两位老师教授的课程,使我学到了很多的知识,他们的治学态度也让我深深敬佩。感谢我的同学韦伟、赵晓鹏、赵立英、刘宁、常大亮、李风云对我在学习上的帮助和指导。感谢所有曾帮助和支持过我的人,祝愿他们在各自的工作岗位上取得新的成就。祝他们永远幸福快乐,万事如意! 嵌入式Linux下USB通用摄像头驱动程序研究与设计 作者: 王鑫 学位授予单位: 东北大学 本文链接:http://d.g.wanfangdata.com.cn/Thesis_Y1221142.aspx
还剩57页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf