基于v4l2的嵌入式视频驱动程序


andDesign2010,31(16)3569计算机工程与设计ComputerEngineering ·嵌入式系统工程·基于V4L2的视频设备驱动开发徐 家, 陈 奇(浙江大学计算机科学与技术学院,浙江杭州310027) 摘要:在嵌入式系统上,特别是系统资源相对较少的情况下,良好的驱动结构设计能够有效地减少驱动的内存和CPU占用 础上,从减少系统资源消耗和提高驱动性能的角度出发,给出了一套有效的视频设备V4L2驱动开发方法.实验结果表明了 该方法的有效性。 关键词:V4L2;Linux;视频设备;驱动性能;资源消耗 中图法分类号:TP316;TP3ll文献标识码:A 文章编号:1000.7024(2010)16.3569.04VideodriverbasedonV4L2developmentxuJia. CHENQi3(CollegeofComputerScience,ZhejiangUniversity,Hangzhou10027,China)embeddedwithdriverstructuralcan Abstract:Inlowreducesystem,especiallysystemresources,good designeffectivelymemory andCPUtheisanewframeworkforvideodevicedriver underoccupation,henceimprovesystem’Sperformance.V4L2developmentfullaonthe mechanismofV4L2isUSeofitsV4L2driver Linux,andin—depthstudy runninggiven.Bymakingproperties,a develop methodis forvideodevicebasedon resourceanddriver'Sitsbehavior,andpresentedreducingsystem consumptionpromotingvalidity isprovenbyexperiment.words:V4L2;Linux;videodevice;driverbehavior;resource Keyconsumption O引 言随着视频监控技术、数字机项盒技术在生产生活中的不中的设备lD进行比对,找到匹配的驱动模块后即进行加载。

DE- 断应用和推广,在越来越多的系统中使用到嵌入式视频设备,因此在设备侧USB驱动实现中,首先要完成对MODULE Linux由于其可裁减,运行速度快的特点,在嵌入式系统上被VICETABLE的初始化Ⅲ。 广泛应用。但视频设备,如摄像头、电视卡、视频捕捉卡等,由 于其工作机制和涉及数据结构的复杂性,有着较高的开发门设备进行探测。一个USB设备在组织上包含4个逻辑层次: 槛。传统的视频驱动,存在着驱动结构设计较复杂,资源消耗即设备、配置、接口、端点。设备包含了该USB设备的基本属 较大,传输带宽利用不充分的缺点。针对上述问题,本文在深性,如设备协议号,产品编号等;配置决定了该USB表现出何种属性:如是视频设备还是存储设备等,一个设备中可以包含 入分析V4L2框架的基础上,给出了一套高效简洁的Linux视 频设备驱动实现方法。若干个配置;端点是USB通信的最基本形式:一个端点对应一个数据传输通道,端点可分为控制端点、批量端点、等时端 1视频设备的驱动结构点等;接口是相关端点的集合,一个接口完成特定的功能,而大多数硬件设备的驱动可以分为两部分:①硬件的接口层数的主要工作是选择USB设备的配置使其作为视频设备,并 驱动,主要有USB、PCI、12C、IEEEl394等驱动,这些驱动的作用 是使计算机能够挂载硬件并提供通信的管道;②实现硬件本身且获得数据传输端点。

主要实现代码如下: 功能的驱动,如字符设备驱、块设备驱动、视频设备驱动等。以USB类型的视频设备来说,其接口层驱动即为设备侧rc=usb—setinterface(usbdev,O,1); USB驱动,USB驱动根据USB设备的ID来识别设备。USB设 备的ID包括VendorID和ProductID,在Linux下可以通过lsusb 收稿日期:2009.09.08:修订日期:2009.11.19。 作者简介:徐家(1985一),男,江苏无锡人,硕士研究生,研究方向为多媒体视频与图像处理;陈奇,男,浙江杭州人,硕士,副教授,研究 方向为GIS地理系统、视频监控。E-maihxuujiaa@163.com 万方数据 31(16)and计算机工程与设计ComputerDesignEngineeringep=&interface->altsetting[i].endploint[j];并通过用mmap调用将其映射到用户空间Ⅲ,接着调用VIDIOCswitch(ep->desc.bmARfibutes){充,最后调用VIDIOCcase:USB_ENDPOINT_XFER_BULK:DQBUF取出完成填充的视频帧。

由于getMaxpoint(usbdev,”Bulk”): 将内核空间的数据队列地址映射到了用户空间,用户空问和break;内核空间的数据传输并不需要实际的数据拷贝,而仅仅是通过交换指针来实现,因此提高了数据传输的效率01。c邪e:USB—ENDPOINl婴ER—ISOCgetMaxpoint(usbdev,”Isoc”);V4L2中,应用程序和驱动程序之间数据传输的基本单位break;为videobufbuffer基于v4l2的嵌入式视频驱动程序开发与实现,videobuf 3reffub_态状待等:态状种有般一)}videobufbuffer已被填充,等待应用程序提取;用户空间状态该程序段首先调用usbsetinterface来选择正确的配置, 接着遍历该配置中所有可用的端点,找到两种类型的端点,批相转换如图2所示。 量和等时端点,等时端点用于视频数据的传输。为了充分利 用USB传输带宽和提高视频传输质量,程序中用了getMax. point来获得传输速度最快的等时端点。 2视频设备的V4L2驱动V4L2是Linux下开发视频设备驱动的一套新框架,V4L2 为应用程序定义一套标准的API调用,同时为驱动程序定义 了一系列对应的lIZlf调函数。

V4L2在Linux2.6版本中才被加入图2 videobuf—buffer状态 内核,是一个相对较新的框架,现在Linux下应用程序和驱动 程序用的大多都是以V4L为框架,不过可以肯定的是,由于V4L2驱动内部的视频数据队列的主要作用是对video. V4L2对于V4L的一系列改进,V4L2取代V4L只是时间问题。burbuffer进行管理,该队列是一个FIFO队列,先进入队列的 2.1 V4L2框架与字符设备和块设备不同基于v4l2的嵌入式视频驱动程序开发与实现,视频设备驱动有着较高的数 视频队列仅当有空白的videobuf 据时序性要求和较复杂的内存管理,传统read、write、ioctl方法 buffer时,才进行IO的传输,从硬件获得视频数 很难满足这些要求。V4L2框架则提供了良好了数据时序性据。否则,视频队列并不从硬件读取数据,这样节省了驱动的 和内存管理的功能,提高了驱动程序的健壮性,并减少了驱动CPU开销。以USB接口类型的视频设备来说,一个典型的数 开发的工作量。V4L2驱动框架的主要作用是对视频数据时据读取如图3所示:应用程序将一个空白的videobufbuffer放 序性的管理,和视频数据缓冲区的内存管理,并不直接和硬件 打交道,控制硬件和获得视频数据需要借助USB、12C、PCI等列发起一次URB传输。

web开发 嵌入动态图_基于v4l2的嵌入式视频驱动程序开发与实现_基于嵌入式的linux无线条码扫描仪系统的设计

首先初始化USB等时端点,接着初始 驱动啪。对于USB摄像头,V4L2需要通过URB获得视频数 据;对于电视卡,V4L2需要通过12C来选择视频输入,并通过等待数据传输,在URB传输完成的回调函数中将URB中的视 PCI来获得视频数据。具体关系如图l所示。频数据拷贝到空白videobufbuffer中。2.3 V4L2驱动实现方法V4L2提出了一种视频设备驱动开发的框架和机制,并定( Appilcation)义了基本的驱动接口函数,主要函数如表l所示。这些驱动接口函数和V4L2在应用层的API是一一对应驱动空间 捞的基于v4l2的嵌入式视频驱动程序开发与实现(基于V4L2的视频设备驱动开发徐家,陈奇(浙江大学计算机科学)),它们除了向上层提供的一系列接口,并没有实现实质性的( V4L2 )作用。在实现完V4L2驱动的核心部分后,最后才需要将这些◇◇@回调函数进行绑定嘲。首先,驱动需要注册视频设备,代码如下m:(Hardware)stnletvideo—device‘vd;vd=video_device_allot0;图l V4L2构架vid_dev=vd; 2.2 V4L2工作机制ret=videoGRAB—一个V4L2设备驱动中,应该存在一个视频数据队列以及BER,一1): 相应的队列操作方法。

当应用程序需要读取数据时,首先调接下来,需要实现视频缓冲队列以及相应的队列方法。驱动开发人员可以自行编写一套视频缓冲队列和相应的队列 VIDIOC—REQBUFS申请传输空间,然后调用V1DIOC_ QUERYBUF获得位于内核空间的VL42视频数据队列的地址,方法,由于视频数据结构的复杂性,上述方法不仅仅工作量万方数据3571徐家,陈奇:基于V4L2的视频设备驱动开发2010,31(16)lnitIsoc lnitbufferqueueII QBUrframeEnqueueInitUrbbuffer』Waitsubmiturb1lCopyDataHandledl Fr。mUrbbyUsbc。,7J 胁DQBUlframeDequeueUrbCompletedbuffer图4 videobufqueue基本队列函数图3获取视频数据过程。count=8:表1 v412_ioetl_ops函数函数说明v412一ioctl_ops函数vidioe_reqbufs申请缓冲区其超过驱动限制,则减少队列长度*count,最后返回。vidioe_querybuf查询缓冲区地址buf都会在prepare和bufeueuq.videobuf_qbuf,用调被中vidioc_qbuf入队操作这两个回调函数没有被赋予特殊的用途,前者可以理解为vidioe—dqbuf出队操作videobufbuffer在进入videobufeueuq.。

作操预的做所前列队’vidioe_streamon开肩流传输vidioe—streamof关闭流传输视频数据传输。完整的等时URB传输包括4个步骤:首先要大,而且很难保证程序的可靠性。一种更好的方法是使用Linux调用usb中videobuf结构来管理缓冲队列。Linux设置为数据输入端点,然后初始化一个URB并绑定到该端点,eueuq.videobuf__queue在内核中的videobuffer-core.c中定义,同时该文件内还定义了与中进行数据拷贝等处理。对于视频数据传输,还需要设置URB之相关的队列操作方法,驱动程序可以借助videobuf_dqbuf,videobuf fuboediv,freqbufsubq_出据数成完数函作操列队等等 内数据包的数量。设置方式如下:入队时的基本类型检查、条件判断、内存管理等。numberofvideobuf4videobufre中队列函数关系如图所示, eueuq_.ofURB的上限,number tekca即为p.样这。量数的包据数内qbufs为videobuf_queue申请内存空间;videobuf_querybuf查询设置后,一次URB便能完成一个视频帧的传输Ⅲ。

完成传输videobuf__queue的内存地址并返回给应用程序;videobuf_qbuf完成一个videobuf_buffer的入队操作;videobuf_dqbuf贝0完成一buf_buffer中。个videobufbuffer的出队操作。不过上述队列函数是和具体驱动无关的,完整的队列操作方法还需要实现和驱动相关的V4L2要求视频缓冲队列是一个FIFO的队列,因此,在实质性操作,如设置视频的高度,宽度,从硬件读取视频数据URB完成的回调函数中,获得数据拷贝的是最早进入队列并等。一种良好的设计方法是将这些和具体硬件以及驱动相关处于等待状态的videobufbuffer的管理是采取数组的方式,在URB数据拷贝和出队时,的操作与videobuf中的队列函数耦合起来。 videobufeueuq.一queue结构中存在一个videobufeueuq_ops,针指体构结数函是建立两个链表,等待链表和完成链表,这两个链表与video.该指针体中有4个回调函数:分别为buf_setup、buf_prepare、bufqueue、bufrelease。这4个回调函数会被videobuf_queue表按照顺序关系保存着需要填充的videobuf的队列函数调用,具体调用关系如图4所示。

因此,在实现这reffub_而,针指的4个回调函数时,可以将它们和具体驱动与硬件相关的代码结 完成链表也按顺序关系保存着已完成填充等待出队的video.合起来。buf组,提高了驱动的效率。setup在videobufyeqbufs中被调用,videobufreqbufsbufrelease在videobuf的作用是为videobuf申请内存空间,bufdqbuf中被调用,在这个函数中,主eueuq_据根需setup则要做一些资源释放工作。驱动指定的内存缓冲区大小返回videobuf_queue的合适队列长度。实现代码如下:3实验+size=fmt->depth+fmt->width+tint->height>>3;if(*count


免费领取: 只要加微信,回复“入门视频”,即刻获取 全网最系统,最容易入门的的Web前端入门全套视频,C语言入门全套入门视频,大数据全套入门视频,PhP全套入门视频,Pathon全套入门视频,Java全套入门视频!!!微信号:18370228235 ,立即领取!
版权申明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ892482387,本站将立刻清除。

分享到