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

软件设计开发

本栏目责任编辑:谢媛媛