基于V4L2的视频设备驱动开发与移植

本栏目责任编辑:谢媛媛软件设计开发Computer Knowledge and Technology 电脑知识
与技术第6卷第15期(2010年5月)基于V4L2的视频设备驱动开发与移植
张辉,李新华,刘波,钱翔
(安徽大学电子科学技术学院,安徽合肥230039)
摘要:V4L2是Linux2.6内核的一大特征,其主要提供了视频设备的内核驱动协议。文章介绍了V4L2的驱动模型,以此为基础开发设计出针对MediaTek Inc 公司MT6229芯片USB 摄像头视频设备的驱动程序,采用多帧缓存的内存映射技术大大提高了图像采集的速度,在EmbedSky TQ2440平台下移植并给出了网络环境下的测试流程,对视频驱动程序开发方法和实现步骤具有重要的指导意义。
关键词:V4L2;USB 摄像头;设备驱动;程序移植
中图分类号:TP316文献标识码:A 文章编号:1009-3044(2010)15-3988-03
The Video Device Driver Programming and Proting Based on V4L2
ZHANG Hui,LI Xin-hua,LIU Bo,QIAN Xiang
(School of Electronic Science and Technology ,Anhui University,Hefei 230039,China)
Abstract:V4L2is a major feature of the Linux kernel Version 2.6,which mainly provides the kernel driver of video equipment.This pa -per introduces driver model of V4L2first,and analyzes the webcam driver of MediaTek Inc ’s MT6229chip according it.The memory mapping techniques of multi frame cache is adopted to increasing the speed of image acquisition greatly .Finally ,the program is planted into the development board of EmbedSky TQ2440and gives testing process under the network environment.There are is an important guidance to the development methods and steps of the video driver.
Key words:V4L2;USB Webcam;device driver;transplanting
V4L2(Video For Linux Two )[1]是Linux 内核中关于视频设备的API 接口,主要用来对视频设备进行开关、采集、输出等操作。在嵌入式系统中多采用Linux 作为其软件平台,V4L2是Linux2.6采用的内核驱动模型[2],与之前版本的V4L 存在很大差别,因而有部分视频设备的驱动还无法支持新版本的V4L2,对新标准下视频设备的一般性开发过程研究就显得特别具有现实意义。
在项目开发中所使用的视频设备为USB 摄像头,其芯片是MediaTek Inc 公司的MT6229,并不能被系统自带的视频设备驱动所识别,在参考中芯zc0301驱动程序的前提下,基于V4L2标准开发设计了视
频驱动程序,并采用多帧缓存技术提高了采集帧数。通过交叉编译成模块后,移植加载到EmbedSky TQ2440开发板(ARM920T 架构,Linux2.6.30)上,在网络环境下进行了该驱动程序的测试工作,对我们开发视频驱动程序及其应用具有重要的实用价值。
1V4L2驱动模型
V4L2使在Linux 下开发视频设备驱动程序具有统一的接口规范,这套规范给驱动程序开发提供了清晰的模型和接口,应用程序处于最上层,硬件设备处于最下层,这套规范就处于中间层。在Linux2.6发行版之前此类规范都是V4L ,它将所有的视频设备驱动程序都放在其管理中,为编程人员减少了大量的工作,然而它不能同时打开多个设备以及不能很好地支持带编码能力的设备是其软肋,V4L2是由Bill Dirks [3]重新设计的,与V4L 相比,它的扩展性和灵活性都有了很大的提高,并且支持的硬件设备也更多,已成为Linux2.6的标准接口,涵盖了Video\dvb\Fm ……等等,但它和V4L 结构特点都不尽相同,因而与V4L 是不兼容的。
V4L2是一个两层驱动程序模型,以内核模块加载到系统中,因而当内核补丁安装后不需要重新对内核完全编译[4]。在开发板中对视频设备的驱动是按照以下步骤来完成的:首先,将设备与开发板相连接,若设备支持hot-plug ,系统会自动装载驱动程序,否则需要使用insmod 命令加载驱动程序到上层的videodev 内核模块中,此时驱动程序向系统提交注册请求,成功后返回一个主设备号,根据此设备
号生成的第一个视频设备文件为/dev/video0;而下层是V4L2驱动程序,当其初始化后,将驱动程序的成员函数、次设备号以及其他相关信息的结构传递给videodev 。当应用程序触发一个驱动程序调用时将调用V4L2驱动中的处理函数。
V4L2驱动的主要功能是使程序有发现设备的能力并操作设备。它主要是调用一系列的回调函数来实现这些功能,如设置摄像头的工作频率,帧频,视频压缩格式和图像参数等等。
2在V4L2下编写USB 视频设备驱动程序
根据上面所定义的驱动模型以及V4L2所提供的API 函数,结合USB 设备的特性,视频设备驱动可按照以下步骤来开发完成,图1所示为视频设备驱动流程图。
1)编写视频设备驱动首先要确定驱动程序支持的设备,通过结构体struct usb_device_id [5]定义驱动程序支持的设备列表:
scm435收稿日期:2010-03-25
作者简介:张辉(1979-),男,安徽巢湖人,讲师,主要研究方向为信号与信息处理,嵌入式;李新华(1968-),男,安徽铜陵人,副教授,
硕士生导师,研究方向为图像处理计算机视觉MCAI ;刘波(1986-),男,安徽六安人,硕士,研究方向为数字图像处理;钱
翔(1985-),男,安徽石台人,硕士,研究方向为信号与信息处理。
ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.6,No.15,May 2010,pp.3988-3990E-mail:xsjl@cccc www.dnzs Tel:+86-551-569096356909643988
软件设计开发本栏目责任编辑:谢媛媛Computer Knowledge and Technology 电脑知识与技术
第6卷第15期(2010年5月)static struct usb_device_id myvideo_table []={
{USB_DEVICE(USB_MYVIDEO_VENDOR_ID,
USB_MYVIDEO_PRODUCT_ID)},
…………};
led斗胆灯其中USB_MYVIDEO_VENDOR_ID 是视频设备的制造商ID ,USB_MYVIDEO_PROD -
UCT_ID 是该设备的产品ID ,一般通过厂商的说明手册可以得到,本项目中使用的芯片制造商
和产品ID 为0x0e8d 和0x0002,将其定义到程序中就可以了。
儿童远程监控手表
2)在V4L2中,视频设备通常被看成一个设备文件,比如/dev/video0,对设备的操作其实就
是对该设备文件的操作,首先调用module_init 初始化模块,在初始化中通过usb_register 注册
USB 驱动程序,主要是向USB 核心描述驱动,从而创建struct usb_driver 结构[5],在该结构中一
般是初始化4个指针字段,包括指向驱动程序名字的name ,指向探测函数的probe ,指向断开函
数的disconnect 和指向设备列表的id_table ,具体结构如下:
static struct usb_driver myvideo_driver ={
.
name ="myvideo ",
.probe =myvideo_usb_probe,.disconnect =myvideo_usb_disconnect,
.id_table =myvideo_id_table,
};
探测函数主要是通过循环访问USB 接口中的每一个端点,将正确的端点相关信息保存到结构体struct usb_interface 中以便后期与端点进行通信,同时调用usb_register_dev 将设备注册到USB 核心中。当设备被断开时,使用断开函数将所有与该设备关联的资源都清除掉,若探测函数已经调用usb_register_dev 函数进行了注册,则在断开函数中需使用usb_deregister 将设备号返还给USB 核心。
当设备驱动程序卸载时,可以调用usb_deregister_driver 来注销struct usb_driver [6]。
3)视频设备正常工作必须要有一些对应的文件操作接口模块,根据V4L2协议规范,实现设备的关键系统调用,其file_opera -tions 结构体如下:
static struct file_operations myvideo_fops ={
.owner =THIS_MODULE,//设备的拥有者
.open =myvideo_open,//open 功能
.release =myvideo _close,//close 功能
.read =myvideo _read,//read 功能
.write =myvideo _write,//write 功能
.mmap =myvideo _mmap,//内存映射功能
.ioctl =myvideo _ioctl,//文件信息获取
};
其中,使用open 和close 系统调用可以打开和关闭视频文件设备,而ioctl 函数是非常强大的,它可以管理设备的I/O 通道,设置视频的制式和帧格式,还提供了查询当前设备属性的功能,V4L2捕获的数据,最初是存放在内核空间的,所以用户无法直接访问,在中芯zc0301驱动程序中使用copy_to_user 方式将数据从内核空间传输到用户空间,速率较慢,这里使用mmap 函数定义的内存映射方式把设备内存映射到应用程序内存中,从而直接处理设备内存。
4)V4L2标准相比较V4L 的最大优势是可以自定义设备驱动缓存数量,主要是通过ioctl 命令中VIDIOC_REQBUFS 来定义的,多帧缓存技术大大提高了图像的采集速度。当用户程序调用缓存数据时,使用VIDIOC_DQBUF 和VIDIOC_QBUF 两个ioctl 命令,缓存队列将最先采集到的视频数据缓存输出,并重新采集一张视频数据,放置到队列末尾,这样就可以实现循环采集,最后通过VIDIOC_STREAMOFF 控制命令停止视频的采集。
至此,视频设备驱动程序编写完成,可以将其移植到开发板中测试效果。
3设备驱动程序的移植与测试
驱动程序是在PC 主机上开发完成的,要移植到EmbedSky TQ2440开发板上必须通过交叉编译[7-8],我们所使用的交叉编译工具是EABI ,具体的交叉编译安装设置不做赘述,需强调的是在设置过程中编译器“CC=gcc ”要更改为“CC=arm-linux-gcc ”,从而满足可交叉编译的要求。
在Kconfig 文件中添加对该驱动程序的支持:
config myvideo
tristate “My Video Device Driver ”
金属圆锯片
/*将显示在menuconfig 配置界面中*/
depends on ARCH_S3C2440
help高压电线杆
EmbedSky Support Video Driver
/*帮助提示信息*/
修改Makefile 文件,主要是定义如何编译目标文件:
obj-$(CONFIG_myvideo)+=myvideo.o
通过make menuconfig 命令配置内核选项,因为采用模块方式来编译,可使用命令make module 编译出驱动模块,产生的文件是myvideo.ko(开发板的嵌入式系统版本为Linux2.6.30),通过串口连接工具SSH 将该文件传输到开发板上。
图1视频设备驱动流程图3989
本栏目责任编辑:谢媛媛软件设计开发Computer Knowledge and Technology 电脑知识与技术第6卷第15期(2010年5月)
(上接第3985页)
2)业务逻辑与表示层逻辑清晰而严格的分离:通过使用会话表面层模
式,执行业务逻辑所需的方法完全被包装在会话bean 的方法之中,EJB 客户
端只需要考虑表示层的问题就可以了,它为完成一个工作单元而在一个EJB
上所执行的方法永远不会超过一个,这样业务逻辑就被严格地分离开了。
3)事务完整性:会话bean 封装在一个事务中,起到了一个把事务都限制
在服务器端,事务可以在“会话bean 方法”这一级别上被划分边界,也可以通
过发布描述符进行配置。
4)较低的耦合性:会话bean 缓冲了客户端与实体bean 之间的请求。在
以后实体bean 层需要修改时,可以避免改变客户端,因为客户端是通过会话
bean 层间接访问实体bean 。
5)还有良好的可重用性、良好的可维护性等特性。4结束语
MVC 模式由于其结构清晰等特性,在当前大型软件开发中应用日渐广泛。其模型部分的设计是关系到一个应用的高效性、可靠性、安全性的重要因素。文中提出使用EJB 的Session Fa?ade 设计模式来设计MVC 的模型部分。很好地解决了其它几种方案中的缺点,并结合某市社保系统企业领导查询系统证明了这一方案的可行性。
参考文献:
[1]
赵强,乔新亮.J2EE 应用开发(WebLogic+JBuilder)[M].北京:电子工业出版社,2003.[2]
彭小军,刘渊.基于MVC 的Enhydra 开发技术研究与设计[J].计算机应用研究,2005,22(12):230-231.[3]
陈华泉,张忠能.UML 与MVC 模式在网站重构项目中的应用[J].计算机应用与软件,2005,22(8):48-49.[4]
Husted T.实战STRUTS[M].黄若波,程峰,程繁科,译.北京:机械工业出版社.2005.[5]Marinescu F.EJB 设计模式[M].饶若楠,陈昊鹏,张保稳,译.北京:电子工业出版社,2001.
图7客户端访问SessionBean 进行转移资金
使用insmod 命令加载模块后,可发现在/dev/目录下产生了一个video0的设
备文件。测试使用的视频设备应用程序我们使用mjpg_streamer ,它是一种应用于
网络摄像机的开源软件包,编译后可得到一系列.so 组件,将input_uvc.so 和out -
put_http.so 文件传输到开发板的\lib\WebCam\目录下,可执行文件uvc_stream 传
输到开发板文件系统的\sbin\目录下,运行后在PC 主机端使用mjpg_screamer
衬套
自带的 视频采集程序与开发板网络互连后即可测试到视频设备采集
到的实时图像,如图2所示。
采集到的图像分辨率为640x 480,采集速率为8fps ,根据图像绝对质量的
评价尺度可以评为良好,满足项目开发的要求。
4结论
通过开发实例详细介绍了V4L2下视频设备驱动程序的设计开发过程,实
现了针对MediaTek Inc 公司MT6229芯片USB 摄像头视频设备的驱动程序,并
成功移植到开发板上,经过测试达到了预期结果,在软件实现上降低了编程的难
度,具有较高的性价比,可应用于视频采集、远程监控等诸多领域,同时也为视频
设备驱动的一般性开发提供了重要的参考价值,下一步研究的方向可以关注对
程序性能的优化,从而可以提高采集帧数及降低对系统资源的占用。参考文献:
[1]勒伏.Linux 内核设计与实现[M].陈莉君,康华,张波,译.2版.北京:机械工业出版社,2006.
[2]Janakiram D,Gunnam A.Object-oriented wrappers for the Linux kernel [J].SOFTWARE —PRACTICE AND EXPERIENCE Softw.Pract.
Exper.2008,38:1411-1427.
[3]Dirks B.Video for Linux Two API Specification:Draft 0.12.[S].Michael H Schimek.
[4]Rubini A.Linux 设备驱动程序[M].魏永明,译.2版.北京:中国电力出版社,2002.
[5]曹占中,周余,王自强,等.基于s3c2440的Linux 摄像头驱动开发[J].电子测量技术,2009(2):109-111.
[6]王滔.Linux 系统下摄像头驱动开发[J].计算机应用,2004(11):8-10.
[7]刘飞,张曦煌.基于嵌入式平台的USB 摄像头驱动程序的实现[J].计算机工程与设计,2008(8):1994-1996.
[8]孙天泽,袁文菊.嵌入式设计及Linux 驱动开发指南——基于ARM9处理器[M].2版.北京:电子工业出版社,2007.
图2视频截图效果
3990

本文发布于:2024-09-23 21:27:38,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/138712.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:设备   视频   驱动程序   驱动   开发   采集   使用
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议