基于ARM的小区车辆进出管理系统软硬件设计_第1页
基于ARM的小区车辆进出管理系统软硬件设计_第2页
基于ARM的小区车辆进出管理系统软硬件设计_第3页
基于ARM的小区车辆进出管理系统软硬件设计_第4页
基于ARM的小区车辆进出管理系统软硬件设计_第5页
已阅读5页,还剩48页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I摘要本文根据家庭网络监控系统的要求,提出一种基于ARM的网络视频监控方案。方案要求视频的实时传输、实时监控。本系统以INTELXSCALE芯片和嵌入式LINUX系统为平台,在平台中搭建网络视频服务器,并以它为中介,负责将USB摄像头采集到得视频数据传输到网络服务器中,最后发送到申请监控的远程PC机中,远程PC只需在网页中便能实时的看到监控端的视频图像。论文首先阐述了嵌入式网络视频监控技术的发展、现状和前景,然后介绍了嵌入式硬件系统结构和嵌入式LINUX操作系统的特点,阐述了嵌入式硬件整体结构,使大家大体的完整的对系统硬件有详细的了解,实际记录了嵌入式操作系统内核的编译和移植,介绍了BOOTLOADER的基本原理和启动过程,实现了视频采集程序的编译和移植,研究了嵌入式一般驱动程序的使用。随后,本文详细描述了视频采集程序的整体结构框图和具体功能代码块、网络通信编程技术、图像编解码、嵌入式视频服务器和搭建网站等内容的设计和具体实现,最后进行系统测试,描述系统功能,调整用户友好界面,提出未来进一步开发建议。本文的研究成果有很大的应用价值,是现代嵌入式发展的新方向,也是IP通信的新应用,对嵌入式视频未来发展有一定参考价值。关键词ARM;嵌入式;LINUX;视频监控II目录毕业设计(论文)任务书II摘要IIIABSTRACTIV第1章引言111课题的背景和来源112课题研究的实际意义213本文的内容及主要工作3第2章嵌入式ARM系统硬件结构简介521视频监控系统结构简介522ARM处理器简介523XSCALE体系结构624主要硬件电路说明9第3章嵌入式ARM系统软件结构1131LINUX操作系统简介1132交叉编译环境的建立1233嵌入式LINUX操作系统移植13331BOOTLORDER移植13332LINUX内核移植14333嵌入式文件系统1534LINUX下的程序调试16第4章USB设备驱动程序设计1741设备驱动程序简介1742LINUX下驱动程序的实现2043USB摄像头驱动程序设计22第5章视频采集功能的设计2551基于V4L的编程26III511摄像头相关数据结构26512摄像头基本功能实现27513视频数据采集3152图像编解码34521编解码介绍34522系统压缩技术3553SOCKET简介35第6章网络视频服务器和网站的搭建3761视频服务器介绍3762构架网络视频服务器37621网络视频服务器软件BOA37622配置网络视频服务器38623网络视频服务器开启、运行以及维护4063建立网站41第7章系统功能测试4371测试环境及内容4372测试结论45第8章结论4781本文工作总结4782进一步展望47参考文献49致谢510第1章引言11课题的背景和来源设想一下这样的场景您正在外地或是公司,有些不放心家里年幼的孩子,怎么办打个电话不,太麻烦。您可以用你的便携PDA或者是智能手机访问一个网页,您就会像回家了一样马上看到您家里的所有情况,每个角落都不会放过。无论黑天白天、离家多远,你都能方便的看到家中的情况,无比安全。这不是什么高深的技术,只需在家中安装一台摄像头,实现视频监控的功能。二十一世纪的网络化、数字化让人们的生活每天都发生着翻天覆地的变化,获取信息的方便和快捷可以使人们在信息化的今天领先一步创造出巨大的利益,而获取信息的重要途径就是眼睛。据统计,人类采集信息的80来自视觉。图像和视频是对客观事物生动、形象的描述,是一种最直观的表现方式。而视频监控技术因为它方便快捷、生动形象、信息丰富等特点日益受到人们的青睐,并在各行各业得到广泛的应用。与此同时,现代网络和数字技术的快速发展也为视频监控技术的发展奠定了坚实的基础。在摄像机、电视出现后,视频监控就因为其优异的特点随之出现了,并伴随着实际技术水平不断发展。发展之初,模拟技术正当流行,视频监控中的图像和视频主要是模拟信号,传输和处理的方式也以模拟为主。接着,数字技术出现,它以领先模拟技术的诸多特点引领着视频监控技术的快速发展。在这个时期,视频监控把采集到的图像、声音和视频转换成数字信号进行处理、传输,接受端再把数字信号通过模数转换技术转换成模拟信号供用户使用。近些年来,计算机、通信、电子技术像脱缰的马一样把以前所有的技术以前所未有的方式极具凝聚力的结合在一起,视频监控技术达到了它发展的顶点。上世纪末,基于PC的数字化网络视频监控系统迅速崛起,部分取代了以视频矩阵图像分割器、录像机为核心,辅以其他设备的模拟视频监控系统。数字化的视频监控技术在图像质量、传输距离、看干扰性、传输速度、方便快捷等方面远远的超过了模拟视频技术。也许,数字视频监控系统唯一的缺点就是它的复杂和昂贵。二十一世纪,嵌入式技术、多媒体处理技术进一步发展,为视频监控系统1的发展提供了新的出路嵌入式视频监控系统。嵌入式系统是以应用为中心,软硬件可以剪裁,具有高稳定、低成本、功耗低、速度快、实时好的专用计算机系统,它由嵌入式微处理器,配以周边硬件设备,接口电路组成。嵌入式系统内部使用嵌入式操作系统,安装专用的功能软件。嵌入式技术把硬件和软件集于一体,独立工作。嵌入式视频监控系统比其他视频监控系统在布局区域范围上要广泛;由于使用IP技术,嵌入式视频监控技术比其他视频监控系统更具紧密的结合度,能够充分利用现代网络技术的成果,并能构成复杂的视频监控网络;性能上,嵌入式视频监控系统继承了嵌入式技术的优点,非常适合自动化的环境。因此,嵌入式视频监控技术正在我国快速的发展,积极的研究会加强我们在这方面技术的学习,也会为视频监控技术的发展贡献力量。12课题研究的实际意义网络视频监控系统是在高带宽网络、大规模集成电路、高速通信等高科技手段发展的基础上产生的。虽然它利用了当今最前沿的技术,却解决了一直以来都没有完美解决的老问题安全问题。以往的监控系统体积过于庞大、技术落后、成本高昂,这直接影响了视频监控系统的普及程度。不能在所有需要安装视频监控系统的地方安装,导致了一些监控的盲点,有些还造成了严重的损失。嵌入式早期应用于军事及航天领域,以后逐步广泛的应用于工业控制、仪器仪表、汽车电子、通信和家用消费领域。随着互联网的发展,嵌入式处理器类型多样化,处理能力空前提升,新兴的嵌入式系统正朝着信息家电IA(INFORMATIONAPPLICATION)和3C(COMPUTER,COMMUNICATIONNET10/100METHERNETCONTROLLERLAN91C111SUPERIOWINBOND83977CPLDXILINX95144117USERIO总线驱动器若干;核心板正面如图22所示,核心板背面如图23所示。CPUCPLDSDRAMLDODRVFLASHFLASHDRVDRVDRVDRVDRV图22核心板正面图7ETHERNETSDRAMSUPERIO100PINCONNECTORLDODRVDRVDRVDRV图23核心板背面图底版(4层PCB电路)如图24所示。包括ETHERNET10/100接口1个UART6个(包括RS232,RS485,IRDA,全功能串口)USB112个(1个HOST一个DEVICE)PS22个(KEYBOARD2为第二阶段准备RAM空间3复制BOOTLOADER的第二阶段代码到RAM空间中4设置好堆栈并跳转到第二阶段的C程序入口点。第二阶段则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。这个阶段主要任务有L初始化本阶段要使用的硬件设备2检测系统内存映射3将内核映像和根文件系统从FLASH读到RAM中4为内核设置启动参数5调用内核文件运行。本设计中的BOOTLOADER采用BLOB,BLOB是BOOTLOADEROBJECT的缩写,是一款功能强大的BOOTLOADER。BLOB最初是由JANDERKBAKKER和ERIKMOUW两人为一块名为LART(LINUXADVANCEDRADIOTERMINAL)的开发板写的,该板使用的处理器是STRONGARMSA1100,现在BLOB已经被成功移植到许多基于ARM的CPU上了。本设计中的INTELXCALE就是采用BLOB作为BOOTLOADER8。332LINUX内核移植选用嵌入式LINUX作为目标机操作系统,一方面由于LINUX是一款免费的操作系统,能很好的降低成本,同时LINUX的开发应用现在已经成为热门,有大14量的资源可用于学习与重复应用,并且LINUX系统具有良好的可移植性和可裁剪性,能自动支持多任务管理。一般常用的GUI如QT/E,MINIGUI等都支持LINUX。LINUX的开发工具也都可以很方便的免费获得。系统采用的嵌入式LINUX内核为随实验平台光盘中的LINUX内核,它是针对这套实验平台所配置的LINUX内核,内核版本为LINUX24209。在实验过程中,只需要在这个内核的基础上进行添加和删减所需要和不需要的功能,编译后就可以使用了。在编译内核之前,需要对内核进行必要的配置,通过虚拟机进入/PXA270_LINUX/LINUX/目录后在终端执行MAKEMENUCONFIG10命令,就可以可视化的配置内核需要的功能和要求,本次试验,主要是针对视频方面,选择了对V4L的静态加载、对SPCA5XX摄像头驱动的动态加载,这样就结束了对内核的配置。编译内核需要创建内核依赖关系、创建内核镜像文件和创建内核模块。首先执行MAKEDEP命令,读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而哪些不需要接着需要MAKECLEAN删除前面步骤留下的文件,以避免出现一些错误然后便可以生成所需要的内核文件了,用MAKEZLMAGE来实现得到可移植的内核。内核文件通过并口下载线烧写入开发板中,便可以通过BOOTLOADER加载运行。333嵌入式文件系统嵌入式LINUX操作系统一般采用FLASH作为存储介质。FLASH具有独特的物理特性,所以必须使用专门的嵌入式文件系统。嵌入式系统对文件的操作是通过层次结构实现的。对于用户程序来说,文件是有结构的文件,用户程序通过对文件IO函数操作文件。嵌入式文件系统是嵌入式操作系统的一部分,它的任务是对逻辑文件进行管理,其工作包括提供对逻辑文件的操作复制、删除、修改等接口,方便用户操作文件和目录。在文件系统内部,根据存储设备的特点,使用不同的文件组织模式来实现文件的逻辑结构。此外,文件系统要对管理文件的安全性负责。文件系统不能直接控制物理设备,它是通过FLASH驱动实现控制的11。目前FLASH支持的文件系统技术主要有JFFS2,YAFFS2,TRUEFFS,FTL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系统采用的是JFFS2文件系统。JFFS2文件系统是专门为NAND闪存设计的嵌入式文件系统,根据NAND闪存以页面为单位存取的特点,将文件组织成固定大小的数据段。利用NAND15闪存提供的每个页面16B的备用空间来存放ECCERRORCORRECTIONCODE和文件系统的组织信息、,不仅能够实现错误检测和坏块处理,也能够提高文件系统的加载速度。JFFS2采用一种多策略混合的垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均和系统开销的目的。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。JFFS2文件系统是按层次结构设计的,分为文件系统管理层接口、JFFS2内部实现层和NAND接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去。与YAFFS相比,它增加了一些功能,因此功能更强。34LINUX下的程序调试调试是程序开发过程中必不可少的一个重要环节,通用PC机的程序调试与嵌入式操作系统的调试环境上有着明显的区别,前者调试器和被调试的程序往往是运行在同一台机器上,是相同操作系统下的两个不同的进程,调试器通过操作系统专用调用接口控制被调试进程,后者通常为远程调试,调试器一般运行于桌面操作系统上,而被调试的程序则运行在嵌入式系统之上,因此需要协调这两个程序之间的通信。LINUX下的调试工具非常的少,GDB是LINUX下最著名的调试工具,它是GNUC自带的调试工具,它可以使开发人员了解程序运行的详细细节,从而消除程序的错误,达到调试的目的,GDB还具有远程调试功能,可以满足嵌入式系统调试的要求,在调试过程中PC机也称为宿主机和嵌入式系统通过串口协议或者TCP/IP协议连接起来,远程主机上运行被GDB规范断点改造过的内核,当条件成立时,断点被激活,然后等待本地宿主机的连接命令,一旦连接成功,宿主机就可以向远程嵌入式系统发送调试命令了。在调试过程中GDB通过调试STUB来完成通信功能,调试STUB是嵌入式操作系统中的一小段代码,它提供了运行GDB的宿主机和嵌入式系统进程之间交互的一个媒介。除了使用调试器外还可以直接在程序中使用PRINTF或PRINTK打印函数,这种方法功能比较弱,效率低下,但在内核模块调试时这是唯一的方法。计16第4章USB设备驱动程序设计41设备驱动程序简介LINUX系统中,设备驱动程序扮演着特殊的角色。它就像一个独立的黑盒子一样,使某个特定的硬件可以相应一个定义良好的内部编程接口并且完成隐藏设备的作用。用户只需调用一组标准化的函数完成操作,而且这些操作与特定的驱动程序无关。驱动程序的任务就是将这些函数映射到作用硬件的具体操作上。这样的模块化的驱动程序结构使得LINUX系统中的驱动程序可以独立于内核的其他部分,可以在需要使用的时候将驱动“插入”内核。从系统运行顺序来看,硬件平台启动运行LINUX后,启用了MMU单元即内存管理单元,在这种模式下系统不能直接对物理地址进行访问。若要对某一硬件外设进行读写,需要通过内核调用该硬件的驱动来实现。上面已经说过,驱动程序的作用在于向应用程序提供访问硬件设备的接口,驱动程序屏蔽了硬件实现上的细节操作,于是应用程序可以像操作普通文件一样对硬件设备进行操作。LINUX以模块的形式加载设备类型,通常是一个模块对应实现一个设备驱动。模块是内核的一部分,它们没有被编译到内核中,而是分别被编译并链接成一组目标文件。可以根据用户的需要在不需要对内核进行重新编译的情况下动态载入正在运行的内核,或从正在运行的内核中卸载。利用这种机制,内核尺寸可以保持在最小,并具有最大的灵活性,也便于检验新的内核代码,而不需要重新编译内核并重新引导。设备驱动程序一般需要完成以下功能L对设备初始化和释放2把数据从内核传送到硬件和从硬件读取数据3读取应用程序传送给设备文件的数据和回送应用程序的请求数据4检测和处理设备出现的错误。在LINUX操作系统下有两类主要设备文件类型块设备、字符设备。用户进程正是通过设备文件来与硬件打交道。每个设备文件都有其文件属性,表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序第二个是从设备号,标识使用同一个设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的设备号一致,否则用户进程将无法访问驱动程序。计17LINUX驱动程序可以分为三个主要部分L自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其他必需的条件位口中断、DMA通道进行申一请并初始化。这部分驱动程序仅在初始化时被调用一次。2服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,但仍具有进行此系统调用的用户程序的运行环境,因而可以在其中调用与进程运行环境相关的函数。3中断服务子程序,又称为驱动程序的下半部分。在LINUX操作系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由LINUX系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务子程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。在系统内部,I/O设备的存取通过设备驱动程序提供的一组固定的入口点来进行,这组入口点在驱动程序初始化时向系统进行登记,以便在系统适当的时候调用。一般来说,字符型设备驱动程序能够提供如下几个入口点1OPEN入口点打开设备准备I/O操作,对字符特别设备进行打开操作,都会调用设备的OPEN入口点。OPEN子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则OPEN子程序必须设置一些标志以表示设备的状态。2CLOSE入口点关闭一个设备,当最后一次使用设备结束后,调用DOSE子程序。独占设备必须标记设备可再次使用。3READ入口点读取设备,对于有缓冲区的I/0操作,一般从缓冲区里读取设备数据。4WRITE入口点向设备写数据,对于有缓冲区的I/O操作,一般向缓冲区里写入数据。5IOCTL入口点执行读写之外的操作。USB(UNIVERSALSERIALBUS)即“通用串行外部总线”,用途广泛,可以外接硬盘、键盘、鼠标、打印机等多种设备,USB能够使用尽可能少的接口支持尽可能多的外设,尤为适合在嵌入式设备中使用,是嵌入式接口标准的一个很好的选择。计18USB总线规范有11版和20版。USB11支持两种传输速率低速15MBIT/S、全速12MBIT/S,这样的速率完全满足鼠标、键盘、CDROM等设备,但是在嵌入式视频监控系统中,这样的速度还是很慢。所以,USB20提供了一种更好的传输速率高速,它可以达到480MBIT/S。USB20向下兼容USB11,可以将遵循USB11规范的设备连接到USB20控制器上,也可以把USB20的设备链接到USB11控制器上。USB总线的硬件拓扑结构12如图41所示。USB主机控制器USB设备USB设备USB设备USB设备USB设备USB设备USB设备USB设备USB设备根集线器集线器集线器集线器图41USB总线硬件拓扑图USB主机控制器通过根集线器与其他USB设备相连。集线器也属于USB设备,通过它可以在一个USB接口上扩展出多个接口。除根集线器外,最多可以层叠5个集线器,每条USB电缆的最大长度是5M,所以USB总线的最大距离为30M。一条USB总线上可以外接127个设备,包括根集线器和其他集线器。整个结构图是一个星状结构,一条USB总线上所有设备共享一条通往主机的数据通道,同一时刻只能有一个设备与主机通信。通过USB主机控制器来管理外接的USB设备,USB主机控制器共分3种UHCI、OHCI和EHCI。在配置LINUX内核的时候,看到的“HCD”字样表示计19“HOSTCONTROLLERDRIVERS”,即主机控制器驱动程序。USB驱动程序分为两类USB主机控制器驱动程序(HOSTCONTROLLERDRIVERS)、USB设备驱动程序(USBDEVICEDRIVERS)。它们在内核中的层次如图42所示。USBDEVICEDRIVERSUSBHOSTCONTROLLERDRIVERSUSERHARDWARE图42USB驱动程序层次结构在试验中,教学平台上的LINUX嵌入式内核已经配置了USB主机控制器驱动程序,只需要添加需要的USB设备驱动程序,就能实现USB设备的正常使用。42LINUX下驱动程序的实现LINUX操作系统下对硬件设备进行驱动开发的一般步骤如下L注册设备在系统启动时或者在模块加载的时候需要将设备和重要的数据结构登记到内核的设备数组中,并确定该设备的主次设备号。在LINUX系统中,对于字符设备一般通过调用REGISTER_CHRDEV向系统注册设备驱动程序,REGISTER_CHRDEV在计20FS/DEVIEESC文件中的定义如下INTREGISTER_CHRDEVUNSIGNEDINTMAJOR,CONSTCHARNAME,STRUCTFILE_OPERATIONSFOPS定义中的MAJOR是设备驱动程序向系统申请的主设备号,如果MAJOR为O,则系统为该驱动程序动态的分配一个主设备号,不过此设备号是临时的;NAME是设备名FOPS是各个调用入口点的说明。函数返回O表示注册成功,返回INVAL表示申请的主设备号非法,返回EBUSY表示申请的主设备号正在被其它设备驱动程序使用。以后对设备驱动程序的FILE_OPERATIONS的操作都可以通过该主设备号的索引来完成。REGISTER_CHRDEV函数操作成功后,设备名便出现在/PROC/DEVICES文件目录中,使用命令CAT/PROC/DEVICES可以查看设备的工作状态。2定义操作集驱动程序中要通过一系列函数完成对设备的不同操作,这些操作在面向对象编程术语中也称为方法,该操作集通过数据结构FILE_OPERATIONS实现。内核内部通过FILE结构识别设备,通过FILE_OPERATIONS数据结构提供的文件系统的入口点函数访问设备。FILE_OPERATIONS定义在中的函数指针表STRUCTFILE_OPERATIONSSTRUCTMODULEOWNERLOFF_TLLSEEKSTRUCTFILE,LOFF_T,INTSSIZE_TREADSTRUCTFILE,SIZE_T,LOFF_TSSIZE_TWRITESTRUCTFILE,CONSTCHAR,SIZE_T,LOFF_TINTREADDIRSTRUCTFILE,VOID,FILLDIR_TUNSIGNEDINTPOLLSTRUCTFILE,STRUCTPOLL_TABLE_STRUCTINTIOCTLSTRUCTINODE,STRUCTFILE,UNSIGNEDINT,UNSIGNEDLONGINTMMAPSTRUCTFILE,STRUCTVM_AREA_STRUCTINTOPENSTRUCTINODE,STRUCTFILEINTFLUSHSTRUCTFILEINTRELEASESTRUCTINODE,STRUCTFILEINTFSYNCSTRUCTFILE,STRUCTDENTRY,INTDATASYNCINTFSYNEINT,STRUCTFILE,INTINTLOCKSTRUCTFILE,INT,STRUCTFILE_LOCKSSIZE_TREADVSTRUCTFILE,CONSTSTRUCTIOVEC,UNSIGNEDLONG,LOFF_T计21SSIZE_TWRITEVSTRUCTFILE,CONSTSTRUCTIOVEC,UNSIGNEDLONG,LOFF_TSSIZE_TSENDPAGESTRUCTFILE,STRUCTPAGE,INT,SIZE_T,LOFF_T,INTUNSIGNEDLONGGET_UNMAPPED_AREASTRUCTFILE,UNSIGNEDLONG,UNSIGNEDLONG,UNSIGNEDLONG,UNSIGNEDLONG这个结构的每一个成员的名字对应一个系统调用,在用户程序利用系统调用对设备文件进行诸如读/写操作时,系统调用会通过设备文件的主设备号找到相应的驱动程序,然后读取这个数据结构的相应函数指针,把控制权交给该函数。对于具体的设备驱动并不需要实现结构中所有的例程,只要完成设备功能就可以了。例如对于一个常见的字符设备驱动来说,可能只有操作OPEN,WRITE,READ,IOCTL和CLOSE,当用户程序通过系统调用访问设备时,最终要通过这些操作集来完成。3卸载模块当不再需要使用一个模块或设备时,需要将其从内核中卸载下来,这时会动态调用模块中的MODULE_EXIT函数,并需要在该函数中调用MODUL_UNREGISTER_CHRDEV或MODULE_UNREGISTER_BLKDEV释放挂入内核的数据结构同时释放该设备号。43USB摄像头驱动程序设计摄像头属于视频设备,在LINUX内核中,VIDEOFORLINUX简称V4L是关于视频设备的驱动标准。这个标准为应用程序定义了一系列的接口函数,内核、驱动和应用程序都是依靠这个标准来进行交流。本系统所使用的USB摄像头正是基于该标准来编写驱动和应用程序的。LINUX内核是依据设备号来操作设备文件的,在内核中,摄像头对应的设备文件名为/DEV/VIDEO0,主设备号是81,次设备号根据摄像头数目来确定,本系统中仅使用一个摄像头,所以可以通过MKNOD/DEV/VIDEO0C810来创建节点。USB摄像头驱动程序实现原理如图43所示。USB摄像头的驱动和通用设备的驱动准则一样,但需要与内核提供的视频驱动挂钩。即首先在驱动中声明一个VIDEO_DEVICE结构,并为其指定文件操作函数指针数组FOPS,向系统注册。在应用程序发出文件操作的相关命令时,核心根据这些指针调用相应函数,并将该结构作为参数传递给它们。这样,就完成了驱动和核心之间的通信。例如计22STATICSTRUCTVIDEO_DEVIEVDEV_TEMPLATE声明VIDEO_DEVIEE,指出挂接驱动摄像头驱动用户进程系统调用摄像头文件操作接口接收缓冲区发送缓冲区中断服务程序图43摄像头驱动实现框图STATICSTRUCTFILE_OPERATIONSPCASXX_FOPS声明本驱动的文件操作函数指针STRUCTVIDEO_DEVICEVDEVVIDEO_DEVDATAFILE从文件指针中提取出VIDEO_DEVIEE结构在VIDEO_DEVIEE结构中,有一个私有指针PRIV,可以将它指向一块保留内存。在这块内存中,保存着本驱动、本设备的相关初始化信息。这块内存的申请、初始化、指针指向等工作都是在USB驱动的枚举函数PROBE中完成。这样,在枚举函数将控制权返还给系统后,因为内核不销毁保留内存,所以驱动仍然保留着自己的信息。在驱动卸载函数中需要将申请的各块内存全部释放。LINUX系统中任何USB传输都通过URB实现。为提高速度,可以考虑扩大URB的缓冲,这样可以降低每个USB事务中握手信息所占比例,提高有效数据的输速度。但是受限于总线带宽和具体的USB设备芯片,单纯扩大URB的缓冲不能无限制地解决问题。USB在操作系统中每次传输都要包括URB的建立、发出、回收、数据整理等阶段,这些时间不产生有效数据。因此可以建立两个URB,在等待一个URB被回收时,也就是图像正在被传感器采集时,处理、初始化另一个URB,并在回收后立刻将其发出。两个URB交替使用,大计23大减少了额外时间。由于嵌入式平台上运行的LINUX2420内核,内部已经集成了对USB20的支持,所以无需移植相应的USB驱动。在设计中,摄像头芯片采用中星微的Z301系列芯片,LINUX24内核并不支持这种芯片,所以我们通过移植芯片驱动程序来达到目的。芯片的驱动程序是SPCA5系列,如果不重新编译内核的话,将驱动程序动态加载就可以正常使用。设计中动态加载的命令使用INSMOD命令,它和MODPROBE命令在使用上有所不同,MODPROBE在加载模块时不用指定模块文件的绝对路径,也不用带模块文件的后缀O或KO;而INSMOD需要的是模块的所在目录的绝对路径,并且一定要带有模块文件名后缀的O或者KO。但是在功能上,它们所达到的效果基本相同13。24第5章视频采集功能的设计视频采集程序是基于V4L开发的,包括摄像头的初始化、打开/关闭、参数设置和数据读取等操作,视频采集程序流程图如图51所示14。开始初始化摄像头INIT_VIDEOIN打开摄像头OPEN_V4L获取摄像头参数ICOTLINTVD,INTCMD,设置摄像头参数IOCTL获取一帧图像一帧是否截取完毕存储并准备传输是否终止视频采集关闭摄像头终止NYNY图51视频采集程序流程图2551基于V4L的编程511摄像头相关数据结构摄像头的组成部分是传感器、DSP、镜头、外壳、USB连线、电路板和周边电路构成,其中最重要的是传感器和DSP(数字信号处理器)。本系统选用的摄像头采用了CMOS传感器和中星微301处理器。V4L15提供了一系列的接口应用程序,可以利用这些程序实现对摄像头的调用,其中有READ、OPEN、IOCTL等。V4L同时将这些函数和参数封装成一个数据结构VDIN。STRUCTVDININTFDCHARVIDEODEVICESTRUCTVIDEO_MMAPVMMAPSTRUCTVIDEO_CAPABILITYVIDEOCAPINTMMAPSIZESTRUCTVIDEO_MBUFVIDEOMBUFSTRUCTVIDEO_PICTUREVIDEOPICTSTRUCTVIDEO_WINDOWVIDEOWINSTRUCTVIDEO_CHANNELVIDEOCHANSTRUCTVIDEO_PARAMVIDEOPARAMINTCAMERATYPECHARCAMERANAMECHARBRIDGE9INTSIZENATIVEINTSIZEOTHERSINTPALETTEINTNORMEINTCHANNELINTGRABMETHODUNSIGNEDCHARPFRAMEBUFFERUNSIGNEDCHARPTFRAME426INTFRAMELOCK4PTHREAD_MUTEX_TGRABMUTEXINTFRAMESIZEINVOLATILEINTFRAME_COURINTBPPININTHDRWIDTHINTHDRHEIGHTINTFORMATININTSIGNALQUITINTFD打开摄像头时,OPEN函数返回的文件描述符,其他函数使用这个描述符对摄像头进行操作。STRUCTVIDEO_MMAPVMMAP用于内存映射的结构体。STRUCTVIDEO_CAPABILITYVIDEOCAP描述摄像头基本信息,如设备名称、支持的最大分辨率、信号源信息、信道数等。STRUCTVIDEO_MBUFVIDEOMBUF在进行内存映射时读取帧的信息,实际上是输入到摄像头存储缓存中的帧信息。STRUCTVIDEO_PICTUREVIDEOPICT摄像头采集图像的属性,如亮度、色调、对比度、色度、深度等。STRUCTVIDEO_WINDOWVIDEOWIN表示采集窗口参数,如分辨率等。STRUCTVIDEO_CHANNALVIDEOCHAN关于信号源的属性。512摄像头基本功能实现1初始化摄像头参数在对摄像头进行操作之前,要对摄像头进行初始化,即对VDIN这个结构进行初始化。使用INIT_VIDEOIN函数。INTINIT_VIDEOINSTRUCTVDINVD,CHARDEVICE,INTWIDTH,INTHEIGHT,INTFORMAT,INTGRABMETHODINTERR1INTIIFVDNULL|DEVICENULLRETURN127IFWIDTH0|HEIGHT0RETURN1IFGRABMETHOD1GRABMETHOD1/READBYDEFAULT/CHECKFORMATVDVIDEODEVICENULLVDCAMERANAMENULLVDVIDEODEVICENULLVDVIDEODEVICECHARREALLOCVDVIDEODEVICE,16VDCAMERANAMECHARREALLOCVDCAMERANAME,32SNPRINTFVDVIDEODEVICE,12,“S“,DEVICEIFDEBUGPRINTF“VIDEOSN“,VDVIDEODEVICEMEMSETVDCAMERANAME,0,SIZEOFVDCAMERANAMEMEMSETVDBRIDGE,0,SIZEOFVDBRIDGEVDSIGNALQUIT1VDHDRWIDTHWIDTHVDHDRHEIGHTHEIGHTVDFORMATINFORMATVDBPPINGETDEPTHVDFORMATINVDGRABMETHODGRABMETHODVDPFRAMEBUFFERNULLERRINIT_V4LVDFORI0IPTFRAMEINULLUNSIGNEDCHARREALLOCVDPTFRAMEI,SIZEOFSTRUCTFRAME_TSIZE_TVDFRAMESIZEINVDFRAMELOCKI0VDFRAME_COUR0PTHREAD_MUTEX_INITRETURNERR282打开摄像头在LINUX中,类似摄像头的设备是作为文件来看待的,叫做设备文件。我们可以使用OPEN函数来对设备进行打开操作,OPEN带有两个参数,第一个为设备文件名称,本实验的摄像头设备名称是/DEV/VIDEO0,第二个则是打开的类型。在使用OPEN函数打开摄像头之前,要判断是否有摄像头设备,即检查参数VIDEODEVICE是否为空。OPEN函数执行结束后会返回摄像头的文件描述符,如果返回值为1,则说明打开设备出错。INTOPEN_V4LCHARVDVIDEODEVICEIFVDVIDEODEVICEPRINTF“NODEVICEFILE,ERROROPENINGV4LINTERFACE”RETURN1IFVDFDOPENVDVIDEODEVICE,O_RDWR1PRINTF“ERROROPENINGV4LINTERFACE”RETURN1RETURNVDFD3获取摄像头参数成功打开摄像头后,需要获取摄像头的一些参数,利用IOCTL函数控制I/O通道来实现。IOCTL函数的使用是IOCTLINTFD,INTCMD,,FD代表文件描述符,CMD表示用户对设备的控制命令,第三个参数是一个其他的参数。其中,CMD包括VIDIOCGCAP(获得VIDEO_CAPBILITY中有关摄像头的信息)、VIDIOCGPICT(获取图像信息)、VIDIOCSPICT(改变图像信息)、VIDIOCGMBUF(获取摄像头存储缓冲区帧信息)、VIDIOCAMCAPTURE(获取视频图像)、VIDIOSYNC(判断摄像头是否截取成功)等。读取VIDEO_CAPABILITY中有关摄像头的信息IFIOCTLVDFD,VIDIOCGCAP,RETURN1读取VIDEO_PICTURE中的图像信息IFIOCTLVDFD,VIDIOCGPICT,29RETURN1读取VIDEO_WINDOW信息IFIOCTLVDFD,VIDIOCGWIN,RETURN14设置摄像头参数在对摄像头参数进行设置的时候,应该按照以下步骤比如更改图像信息,首先,先给VIDEO_PICTURE结构中所要修改的变量赋值,如VDVIDEOPICTPALETTEVDFORMAINVDVIDEOPICTDEPTHGETDEPTHVDFORMATIN然后通过IOCTL函数的VIDIOCSPICT来设置,如IFIOCTLVDFD,VIDIOCSPICT,IFVDGRABMETHODIFDEBUGPRINTF“UNMAPPINGFRAMEBUFFERN“MUNMAPVDPFRAMEBUFFER,VDMMAPSIZEELSE30FREEVDPFRAMEBUFFERVDPFRAMEBUFFERNULLIFDEBUGPRINTF“CLOSEVIDEO_DEVICEN“CLOSEVDFD/DEALLOCTHEWHOLEBUFFERS/IFVDVIDEODEVICEFREEVDVIDEODEVICEVDVIDEODEVICENULLIFVDCAMERANAMEFREEVDCAMERANAMEVDCAMERANAMENULLFORI0IPTFRAMEIFREEVDPTFRAMEIVDPTFRAMEINULLVDFRAMELOCKI0IFDEBUGPRINTF“FREEINGOUTPUTBUFFERDN“,IPTHREAD_MUTEX_DESTROY513视频数据采集视频数据的采集是系统实现的第一步,是所有工作的前提。嵌入式LINUX系统支持两种视频数据采集的方式内存映射、直接读取视频。1内存映射31内存映射方式是通过MMAP系统调用函数来实现的。MMAP系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用READ、WRITE等操作。首先,使用IOCTL系统调用的VIDIOCSFBUF命令获得摄像头存储缓冲区的帧信息,之后初始化VIDEO_MBUF,修改VIDEO_MMAP中的设置,重新设置图像信息,如帧的垂直及水平分辨率、彩色显示格式等。为了防止缓冲区的内容与有用信息叠加产生干扰,在初始化之前可以先调用MEMSET第二个参数为映射到调用进程地址空间的字节数,它从被映射文件开头OFFSET个字节开始算起第三个参数指定共享内存的访问权限PROT_READ可读,PROT_WRITE可写,PROT_EXEC可执行第四个参数可以是MAP_SHARED或者MAP_PRIVATE第五个参数为设备描述符。MMAP成功调用后返回系统实际分配的起始地址。内存映射方式下真正进行视频截取的是IOCTL系统调用的VIDIOCMCAPTURE命令,若函数成功调用,再用VIDIOCSYNC命令来判断图像截取是否己经完毕,若该函数调用成功,则表明一帧图像的截取已完成,便开始下一帧图像数据的截取,并将当前截取的帧号按缓冲区总帧数的模加上L。VDVMMAPHEIGHTVDHDRHEIGHTVDVMMAPWIDTHVDHDRWIDTHVDVMMAPFORMATVDFORMATLN/判断图像截取是否完成/IFIOCTLVDFD,VIDIOCSYNC,PTHREAD_MUTEX_LOCKTEMPSMS_TIMEJPEGSIZECONVERTFRAMEVDPTFRAMEVDFRAME_COURSIZEOFSTRUCTFRAME_T,VDPFRAMEBUFFERVDVIDEOMBUFOFFSETSVDVMMAPFRAME,VDHDRWIDTH,VD32HDRHEIGHT,VDFORMATLN,VDFRAMESIZEINHEADERFRAMESTRUCTFRAME_TVDPTFRAMEVDFRAME_COURSNPRINTFHEADERFRAMEHEADER,5,”S”SPCA”HEADERFRAMESEQTIMESMS_TIMEHEADERFRAMEDELTATIMESINTHEADERFRAMESEQTIMESTIMECOURANTHEADERFRAMEWVDHDRWIDTHHEADERFRAMEHVDHDRHEIGHTHEADERFRAMESIZEJPEGSIZEFORMATVDFORMATLNHEADERFRAMENBFRAMEFRAMEPTHREAD_MUTEX_UNLOCK/截取视频帧/IFIOCTLVDFD,VIDIOCMCAPTURE,ERREURLVDVMMAPFRAMEVDVMMAPFRAME1VDVIDEOMBUFFRAMESVDFRAME_COURVDFRAME_COURLOUTFRMNUMB2直接读取方式直接读取视频数据是通过READ系统调用函数来实现。READ是一个用来从指定的文件或设备中读取数据的系统调用。参数表为READFD,VOIDPFRAMEBUFF,SIZE_TFRAMESIZELN。其中FD为文件描述符,PFRAMEBUFFER为指向存放数据的内存的指针,FRAMESIZELN为需要读取的数据的长度。对于摄像头设备的读取,需要先分配内存空间,用来存储从摄像头读取过来的视频数据,然后直接调用READ系统调用读取视频数据,返回值为实际读取的视频帧大小,也正是在视频传输过程中发送的视频数据大小。SIZEVDFRAMESIZELNVDPFRAMEBUFFERUNSIGNEDCHARREALLOCVDPFRAMEBUFFER,SIZE_TSIZELENREADVDFD,VDPFRAMEBUFFER,SIZEIFLENFRAMELOCKVDFRAME_COUR0PTHREAD_MUTEX_LOCKTEMPSMS_TIMEJPEGSIZECONVERTFRAMEVDPTFRAMEVDFRAME_COURSIZEOFSTRUCTFRAME_T,VDPFRAMEBUFFER,VDHDRWIDTH,VDHDRHEIGHT,VDFORMATLN,VDFRAMESIZELNHEADERFRAMESTRUCTFRAME_TVDPTFRAMEVDFRAME_COURSNPRINTFHEADERFRAMEHEADER,5,”S”,”SPCA”HEADERFRAMESEQTIMESMS_TIMEHEADERFRAMEDELTATIMESINTHEADERFRAMESEQTIMESTIMECOURANTHEADERFRAMEWVDHDRWIDTHHEADERFRAMEHVDHDRHEIGHTHEADERFRAMESIZEJPEGSIZEFORMATVDFORMATLNHEADERFRAMENBFRAMEFRAMEVDFRAME_COURVDFRAME_COUR1OUTFRMNUMBPTHREAD_MUTEX_UNLOCK52图像编解码521编解码介绍通过摄像头采集到数据后,还并不能把它们直接通过网卡传输,因为这样的数据很大,网络不能承担如此庞大的数据传输。所以,必须将采集到得数据进行编码,压缩数据大小。通过这样的操作,我们采集到得数据就会变得很小,然后再把这些数据通过网络传输。同样的道理,在输出端我们还要把接收到的已经压缩的数据还原回来,这就涉及到解码的内容。通过这一系列的操作,图像和视频数据就实现的远程的传输。如果没有编解码,远程传输就是实际上不可能的事情,所以图像的编解码是非常重要的。现在普遍使用的编解码技术。对于静态图像,普遍使用静态压缩JPEG标准;对于动态视频,普遍使用动态压缩MPEG标准。JPEG是由ISO和CCITT为静态图像压缩所建立的国际上第一个静态图像压缩标准,JPEG有着较高的压缩比,复杂度适中,既可以用硬件实现,也可以34用软件实现,实用性强,被广泛使用于计算机和通信行业。MPEG中文译名为动态图像专家组。到目前为止,MPEG标准主要有五个,MPEG1、MPEG2、MPEG4、MPEG7和MPEG21。它是由ISO/IEC1172压缩编码标准得出的视频压缩格式,MPEG的出现使视听传播进入数码化时代。MPEG标准的视频压缩编码技术主要利用了具有运动补偿的帧间压缩编码技术以减少时间冗余度,利用DCT技术以减少图像的空间冗余度,利用熵编码技术在信息表示方面减少了统计冗余度。通过一系列技术,极大的体现了压缩性能16。522系统压缩技术由于本系统要求实现远程视频传输,为了达到预计的设计要求,设计采用基于MJPEG算法的压缩技术进行视频压缩。MJPEG和MPEG的不同点在于MJPEG不使用帧间编码。可是MJPEG与MPEG仍然是一脉相承的,它对MEPG进行了一些改进和发展,功能更加强大,能发送高质图片、清晰视频,编码容易实现。但MJPEG也有一些缺点,由于功能的提升,MJPEG对带宽的要求很高,编码效率低。53SOCKET简介SOCKET是一种网络接口,可以把它看成网络的表现形式。网络终端可以通过SOCKET对网络进行I/O操作。所以,LINUX就可以通过SOCKET实现进程或者网络之间的通信。SOCKET有三个要素网域、类型、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论