2024年4月8日发(作者:)
Computer
与技术
电脑知识
与技术
Computer
Knowledge
Knowledge
and
and
Technology
Technology
电脑知识
Vol.6,No.15,
May
2010,pp.3988-3990
ISSN1009-3044
第
6
卷第
15
期
(2010
年
5
月
)
E-mail:xsjl@
Tel:+86-551-569
基于V4L2的视频设备驱动开发与移植
张辉,李新华,刘波,钱翔
(安徽大学电子科学技术学院,安徽合肥
230039
)
摘要:
V4L2
是
Linux2.6
内核的一大特征,其主要提供了视频设备的内核驱动协议。文章介绍了
V4L2
的驱动模型,以此为基础开发
设计出针对
MediaTekInc
公司
MT6229
芯片
USB
摄像头视频设备的驱动程序,采用多帧缓存的内存映射技术大大提高了图像采
集的速度,在
EmbedSkyTQ2440
平台下移植并给出了网络环境下的测试流程,对视频驱动程序开发方法和实现步骤具有重要的指
导意义。
关键词:
V4L2
;
USB
摄像头;设备驱动;程序移植
中图分类号:
TP316
文献标识码:
A
文章编号:
1009-3044(2010)15-3988-03
TheVideoDeviceDriverProgrammingandProtingBasedonV4L2
ZHANGHui,LIXin-hua,LIUBo,QIANXiang
(SchoolofElectronicScienceandTechnology
,
AnhuiUniversity,Hefei230039,China)
Abstract:V4L2isamajorfeatureoftheLinuxkernelVersion2.6,-
perintroducesdrivermodelofV4L2first,andanalyzesthewebcamdriverofMediaTekInc
’
ory
mappingtechniquesofmultify
,
theprogramisplantedinto
thedevelopmentboardoreisanimportantguidance
tothedevelopmentmethodsandstepsofthevideodriver.
Keywords:V4L2;USBWebcam;devicedriver;transplanting
V4L2
(
VideoForLinuxTwo
)
[1]
是
Linux
内核中关于视频设备的
API
接口,主要用来对视频设备进行开关、采集、输出等操作。在
嵌入式系统中多采用
Linux
作为其软件平台,
V4L2
是
Linux2.6
采用的内核驱动模型
[2]
,与之前版本的
V4L
存在很大差别,因而有部
分视频设备的驱动还无法支持新版本的
V4L2
,对新标准下视频设备的一般性开发过程研究就显得特别具有现实意义。
在项目开发中所使用的视频设备为
USB
摄像头,其芯片是
MediaTekInc
公司的
MT6229
,并不能被系统自带的视频设备驱动所
识别,在参考中芯
zc0301
驱动程序的前提下,基于
V4L2
标准开发设计了视频驱动程序,并采用多帧缓存技术提高了采集帧数。通
过交叉编译成模块后,移植加载到
EmbedSkyTQ2440
开发板(
ARM920T
架构,
Linux2.6.30
)上,在网络环境下进行了该驱动程序的测
试工作,对我们开发视频驱动程序及其应用具有重要的实用价值。
1V4L2
驱动模型
V4L2
使在
Linux
下开发视频设备驱动程序具有统一的接口规范,这套规范给驱动程序开发提供了清晰的模型和接口,应用程
序处于最上层,硬件设备处于最下层,这套规范就处于中间层。在
Linux2.6
发行版之前此类规范都是
V4L
,它将所有的视频设备驱
动程序都放在其管理中,为编程人员减少了大量的工作,然而它不能同时打开多个设备以及不能很好地支持带编码能力的设备是
其软肋,
V4L2
是由
BillDirks
[3]
重新设计的,与
V4L
相比,它的扩展性和灵活性都有了很大的提高,并且支持的硬件设备也更多,已成
为
Linux2.6
的标准接口,涵盖了
VideodvbFm
……等等,但它和
V4L
结构特点都不尽相同,因而与
V4L
是不兼容的。
V4L2
是一个两层驱动程序模型,以内核模块加载到系统中,因而当内核补丁安装后不需要重新对内核完全编译
[4]
。在开发板中
对视频设备的驱动是按照以下步骤来完成的:首先,将设备与开发板相连接,若设备支持
hot-plug
,系统会自动装载驱动程序,否则
需要使用
insmod
命令加载驱动程序到上层的
videodev
内核模块中,此时驱动程序向系统提交注册请求,成功后返回一个主设备号,
根据此设备号生成的第一个视频设备文件为
/dev/video0
;而下层是
V4L2
驱动程序,当其初始化后,将驱动程序的成员函数、次设备
号以及其他相关信息的结构传递给
videodev
。当应用程序触发一个驱动程序调用时将调用
V4L2
驱动中的处理函数。
V4L2
驱动的主要功能是使程序有发现设备的能力并操作设备。它主要是调用一系列的回调函数来实现这些功能,如设置摄像
头的工作频率,帧频,视频压缩格式和图像参数等等。
2
在
V4L2
下编写
USB
视频设备驱动程序
根据上面所定义的驱动模型以及
V4L2
所提供的
API
函数,结合
USB
设备的特性,视频设备驱动可按照以下步骤来开发完成,
图
1
所示为视频设备驱动流程图。
1
)编写视频设备驱动首先要确定驱动程序支持的设备,通过结构体
structusb_device_id
[5]
定义驱动程序支持的设备列表:
收稿日期:
2010-03-25
作者简介:张辉(
1979-
),男,安徽巢湖人,讲师,主要研究方向为信号与信息处理,嵌入式;李新华(
1968-
),男,安徽铜陵人,副教授,
硕士生导师,研究方向为图像处理计算机视觉
MCAI
;刘波(
1986-
),男,安徽六安人,硕士,研究方向为数字图像处理;钱
翔(
1985-
),男,安徽石台人,硕士,研究方向为信号与信息处理。
3988
软件设计开发
本栏目责任编辑:谢媛媛
第
6
卷第
15
期
(2010
年
5
月
)
ComputerKnowledgeandTechnology
电脑知识
与技术
staticstructusb_device_idmyvideo_table[]={
{USB_DEVICE(USB_MYVIDEO_VENDOR_ID,
USB_MYVIDEO_PRODUCT_ID)},
…………
};
其中
USB_MYVIDEO_VENDOR_ID
是视频设备的制造商
ID
,
USB_MYVIDEO_PROD-
UCT_ID
是该设备的产品
ID
,一般通过厂商的说明手册可以得到,本项目中使用的芯片制造商
和产品
ID
为
0x0e8d
和
0x0002
,将其定义到程序中就可以了。
2
)在
V4L2
中,视频设备通常被看成一个设备文件,比如
/dev/video0
,对设备的操作其实就
是对该设备文件的操作,首先调用
module_init
初始化模块,在初始化中通过
usb_register
注册
USB
驱动程序,主要是向
USB
核心描述驱动,从而创建
structusb_driver
结构
[5]
,在该结构中一
般是初始化
4
个指针字段,包括指向驱动程序名字的
name
,指向探测函数的
probe
,指向断开函
数的
disconnect
和指向设备列表的
id_table
,具体结构如下:
staticstructusb_drivermyvideo_driver={
.name="myvideo",
.probe=myvideo_usb_probe,
图
1
视频设备驱动流程图
.disconnect=myvideo_usb_disconnect,
.id_table=myvideo_id_table,
};
探测函数主要是通过循环访问
USB
接口中的每一个端点,将正确的端点相关信息保存到结构体
structusb_interface
中以便后期
与端点进行通信,同时调用
usb_register_dev
将设备注册到
USB
核心中。当设备被断开时,使用断开函数将所有与该设备关联的资源都
清除掉,若探测函数已经调用
usb_register_dev
函数进行了注册,则在断开函数中需使用
usb_deregister
将设备号返还给
USB
核心。
当设备驱动程序卸载时,可以调用
usb_deregister_driver
来注销
structusb_driver
[6]
。
3
)视频设备正常工作必须要有一些对应的文件操作接口模块,根据
V4L2
协议规范,实现设备的关键系统调用,其
file_opera-
tions
结构体如下:
staticstructfile_operationsmyvideo_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
主机上开发完成的,要移植到
EmbedSkyTQ2440
开发板上必须通过交叉编译
[7-8]
,我们所使用的交叉编译工
具是
EABI
,具体的交叉编译安装设置不做赘述,需强调的是在设置过程中编译器“
CC=gcc
”要更改为“
CC=arm-linux-gcc
”,从而满足
可交叉编译的要求。
在
Kconfig
文件中添加对该驱动程序的支持:
configmyvideo
tristate
“
MyVideoDeviceDriver
”
/*
将显示在
menuconfig
配置界面中
*/
dependsonARCH_S3C2440
help
EmbedSkySupportVideoDriver
/*
帮助提示信息
*/
修改
Makefile
文件,主要是定义如何编译目标文件:
obj-$(CONFIG_myvideo)+=myvideo.o
通过
makemenuconfig
命令配置内核选项,因为采用模块方式来编译,可使用命令
makemodule
编译出驱动模块,产生的文件是
(
开发板的嵌入式系统版本为
Linux2.6.30)
,通过串口连接工具
SSH
将该文件传输到开发板上。
本栏目责任编辑:谢媛媛
软件设计开发
3989
ComputerKnowledgeandTechnology
电脑知识
与技术
第
6
卷第
15
期
(2010
年
5
月
)
使用
insmod
命令加载模块后,可发现在
/dev/
目录下产生了一个
video0
的设
备文件。测试使用的视频设备应用程序我们使用
mjpg_streamer
,它是一种应用于
网络摄像机的开源软件包,编译后可得到一系列
.so
组件,将
input_
和
out-
put_
文件传输到开发板的
libWebCam
目录下,可执行文件
uvc_stream
传
输到开发板文件系统的
sbin
目录下,运行后在
PC
主机端使用
mjpg_screamer
自带的
视频采集程序与开发板网络互连后即可测试到视频设备采集
到的实时图像,如图
2
所示。
采集到的图像分辨率为
640x480
,采集速率为
8fps
,根据图像绝对质量的
评价尺度可以评为良好,满足项目开发的要求。
4
结论
通过开发实例详细介绍了
V4L2
下视频设备驱动程序的设计开发过程,实
现了针对
MediaTekInc
公司
MT6229
芯片
USB
摄像头视频设备的驱动程序,并
成功移植到开发板上,经过测试达到了预期结果,在软件实现上降低了编程的难
度,具有较高的性价比,可应用于视频采集、远程监控等诸多领域,同时也为视频
设备驱动的一般性开发提供了重要的参考价值,下一步研究的方向可以关注对
程序性能的优化,从而可以提高采集帧数及降低对系统资源的占用。
图
2
视频截图效果
参考文献:
[1]
勒伏
.Linux
内核设计与实现
[M].
陈莉君
,
康华
,
张波
,
译
.2
版
.
北京
:
机械工业出版社
,2006.
[2]JanakiramD,-orientedwrappersfortheLinuxkernel[J].SOFTWARE
—
.
Exper.2008,38:1411-1427.
[3]orLinuxTwoAPISpecification:Draft0.12.[S].MichaelHSchimek.
[4]
设备驱动程序
[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.
(上接第
3985
页)
2)
业务逻辑与表示层逻辑清晰而严格的分离:通过使用会话表面层模
式,执行业务逻辑所需的方法完全被包装在会话
bean
的方法之中,
EJB
客户
端只需要考虑表示层的问题就可以了,它为完成一个工作单元而在一个
EJB
上所执行的方法永远不会超过一个,这样业务逻辑就被严格地分离开了。
3)
事务完整性:会话
bean
封装在一个事务中,起到了一个把事务都限制
在服务器端,事务可以在“会话
bean
方法”这一级别上被划分边界,也可以通
过发布描述符进行配置。
4)
较低的耦合性:会话
bean
缓冲了客户端与实体
bean
之间的请求。在
以后实体
bean
层需要修改时,可以避免改变客户端,因为客户端是通过会话
bean
层间接访问实体
bean
。
5)
还有良好的可重用性、良好的可维护性等特性。
图
7
客户端访问
SessionBean
进行转移资金
4
结束语
MVC
模式由于其结构清晰等特性,在当前大型软件开发中应用日渐广泛。其模型部分的设计是关系到一个应用的高效性、可靠
性、安全性的重要因素。文中提出使用
EJB
的
SessionFa?ade
设计模式来设计
MVC
的模型部分。很好地解决了其它几种方案中的缺
点,并结合某市社保系统企业领导查询系统证明了这一方案的可行性。
参考文献:
[1]
[2]
[3]
[4]
[5]
赵强
,
乔新亮
.J2EE
应用开发
(WebLogic+JBuilder)[M].
北京
:
电子工业出版社
,2003.
彭小军
,
刘渊
.
基于
MVC
的
Enhydra
开发技术研究与设计
[J].
计算机应用研究
,2005,22(12):230-231.
陈华泉
,
张忠能
.UML
与
MVC
模式在网站重构项目中的应用
[J].
计算机应用与软件
,2005,22(8):48-49.
HustedT.
实战
STRUTS[M].
黄若波
,
程峰
,
程繁科
,
译
.
北京
:
机械工业出版社
.2005.
设计模式
[M].
饶若楠
,
陈昊鹏
,
张保稳
,
译
.
北京
:
电子工业出版社
,2001.
3990
软件设计开发
本栏目责任编辑:谢媛媛


发布评论