摘要:本文介绍了在嵌入式linux系统下开发usb摄像头图象采集系统的方式,给出了基于intelxscalepxa255处理器的嵌入式图象采集系统的设计方案,并对怎样编撰符合videoforlinux标准的摄像头图象采集程序进行了讨论。关键词:videoforlinux;usb摄像头;usb驱动序言嵌入式linux操作系统同目前广泛应用的嵌入式操作系统如psos、vxworks、wince相比,具有可移植性好、网络功能强、有优秀的gnu编译工具支持等优点。更重要的是linux的开放源代码和免费的优点促使系统成本明显减少。一流的程序设计和开发加上测试的开放性促使linux系统十分可靠和稳定,因此越来越多的人开始使用linux开发应用程序。intelxscalepxa255处理器是一款采用arm结构,面向高性能、低帧率设备的嵌入式处理器,特别适用于手持联通设备的开发。usb摄像头因具有低廉的价钱,良好的性能,及便捷使用的特点,因而很容易集成到嵌入式系统中。本文介绍的基于嵌入式linux系统的usb摄像头图象采集系统使用采用ov511芯片的webeye摄像头,在基于pxa255处理器的开发板上实现了图象的采集与压缩,利用mencoder编码工具可以将多幅jpeg图片合成avi视频流,并实现视频回放。
图1硬件系统总体框图图2linux下usb系统软件结构图3获得图象过程图4图象采集程序的流程图系统硬件平台系统结构系统硬件平台如图1所示。pxa255处理器外频最高可达400mhz,内部集成了多种外设控制模块,在实际使用时可以按照须要进行裁减。开发板上提供了64msdram、32mflash、640×480tftlcd触摸屏linux驱动下载,以及外扩的usb主口控制器等,它们构成了一个嵌入式多媒体开发平台,可以满足复杂估算和图形显示的需求。采用ov511芯片的webeye摄像头支持多种制式,cif(352×288)格式分辨率达30fps,可实现真正的实时视频捕获,vga(640×480)格式分辨率为10~15fps,具有健全的手动色温、白平衡控制,提供色调饱和度、对比度、边缘提高、伽马表等中级数码影像控制功能。它与twain标准兼容,提供640×480格式的高清晰静止图象捕获模式,具有多种视频和输出格式供选择。usb总线控制器采用cypress公司的一款专为嵌入式领域研发的usb控制芯片cy67300,该芯片可作为主口控制,也可作为从口控制芯片,内嵌有8051微控制器和ram,支持全速和高速两种模式。
jtag口用于flash的擦写,uart用于系统调试。以太网口可使现网路传输,也可作nfs调试用。系统工作过程系统通过webeye摄像头采集图象,对现场图象进行高速捕捉,之后将捕捉到的图象通过usb总线传输到pxa255处理器进行处理,并将图象压缩,保存为jpeg格式的文件。程序调用encoder编码器可以将多幅jpeg格式的图象合成一段avi视频流,实现视频回放,这在安全监控、事故鉴别、车辆防盗等领域中都有广泛应用。最后,系统还可以通过以太网口或uart口将保存的图片和视频留传到服务器上,实现网路监控。系统软件实现软件系统结构liunx系统中对usb设备的支持是通过如图2所示的结构实现的。linux内核中的usbcore为设备和主控制器提供api插口。usbcore包含所有的usb设备和主控制器的一些通用操作,为向下和向上操作提供一个插口。在linux系统中,[工业家电网-cnelc]设备驱动可分为字符设备、块设备以及网路设备。其中,字符设备面向字符i/o操作,没有缓冲,次序读取;而块设备面向数据块,所有操作都通过内核地址空间的i/o缓冲区完成,支持随机存取操作。usb设备通过快速串行通讯的形式工作,应作为字符设备来处理。
系统加载设备驱动的形式有模块加载和内核初始化加载两种:后者通过用户使用insmod命令动态加载到内核中,通过rmmod命令卸载驱动模块;前者是把驱动编进内核,在内核初始化时手动加载。usb主口程序由hcd(主机控制器驱动)、usbd(usb驱动程序)以及顾客程序组成。其中usbd负责管理所有hcd、设备驱动和所有联接到usb总线上的设备,是usb主机软件的核心。如图2所示,linux系统中usb子系统采用分层结构,其中usbd和hcd提供了支持设备驱动程序开发的api。usb设备驱动程序不是通过i/o操作访问设备,而是通过usbcore提供的标准插口与设备交互,它采用由管线组成的通道与设备进行通讯。设备驱动程序按照usbd创建所需的管线,并为其分配传输所需的缓冲空间。usb的传输分为控制传输、中断传输、批量传输以及等时传输四种模式。对于时间性极强而且确切性不高的视频捕捉应拿来说,摄像头应采用等时传输模式。linux系统中,任何usb传输都须要通过urb(usb恳求块)来实现。为了尽可能快地得到图象数据,须要加强urb的缓冲linux系统,这样可以减少每位usb事务中握手信息所占的比列,增强有效数据传输比列。
因为每次usb传输都要包括urb的完善、发送、回收、数据整理,而在这种阶段中不形成有效数据嵌入式linux在车载导航系统中的应用,因而可构建两个urb交替工作,一个urb在等待回收时初始化另一个urb。获得图象的过程如图3所示。摄像头视频捕获程序的编撰摄像头属于视频类设备,遵守的标准为videoforlinux(v4l)标准。这个标准定义了一套api插口,内核、驱动、应用程序都以这个插口为标准进行交流。目前的v4l囊括了音视频捕捉及处理等内容,也包括usb摄像头。linux系统中通常的文件操作是通过read、write等系统调用完成,但这种系统调用是通过内核态与用户态之间互相进行数据拷贝实现的。对于图象数据来说,进行拷贝必然会降低时间开支,因而须要使用显存映射的办法来加以解决。首先应申请足够大的内核态显存作为图象数据缓存,将urb带来的数据暂存;之后将其用remap_page_range函数映射到用户态空间。这样,用户态空间的图象处理程序就可以使用mmap()函数,直接读写内核态帧缓冲区嵌入式linux在车载导航系统中的应用,减轻了额外开支。要进行视频捕捉必须用到vidiocmcapture和vidiocsync这两个ioctl函数。vidiocgmbuf包含有所用缓冲器的设置与地址。
vidiocmcapture用于开始捕捉;vidiocsync用于等待捕捉完成。为推动数据处理速率,通常使用双缓冲设置,即buffer0捕捉数据时,buffer1传输数据;buffer1捕捉数据时,buffer0传输数据。整个图象采集程序的流程图如图4所示。将采集到的图象保存为jpeg格式,之后调用mplayer中的mencoder编码器,即可将多幅jpeg文件合成一段视频流,实现视频回放。结语本文在台式机上编程实现了基于linux系统的usb摄像头图象采集系统。系统可以实现每秒30帧的图象采集,可以直接连续显示到屏幕上构成实时监控系统,也可压缩为一段视频流,用播放器播放下来。通过交叉编译将程序移植到pxa255开发板上,实现了预期功能。