嵌入式图像检测系统的设计与应用

2012-04-20 09:31:32杨勇刘永俊
常熟理工学院学报 2012年4期
关键词:驱动程序内核嵌入式

杨勇,刘永俊

(常熟理工学院计算机科学与工程学院,江苏常熟 215500)

嵌入式图像检测系统的设计与应用

杨勇,刘永俊

(常熟理工学院计算机科学与工程学院,江苏常熟 215500)

基于Linux2.6内核下的最新标准Video For Linux 2(简称V4L2),介绍摄像头的驱动程序快速开发方法.传统的驱动开发很少能实现所有的接口功能,这严重影响到系统开发周期与维护工作,而且OmniVision公司的ov9650摄像头在Linux下尚未得到驱动支持.本文选择S3C2440开发板作为硬件平台,在Linux2.6.30.4系统下基于OV9650传感器芯片实现摄像头驱动模块的层次结构以及视频采集模块设计的开发工作,提出基于V4L2接口规范的驱动开发方案,从而实现低成本、低功耗、高效率的图像检测系统的应用.

V4L 2;驱动;ov 9650;Linux-2.6.30.4

嵌入式系统是一种完全嵌入到受控器件内部,为特定应用而设计的专用计算机系统.它的应用领域涵盖了消费电子、智能家居、医疗设备、航空航天等[1].随着物联网的不断发展,嵌入式产品层出不穷,例如基于嵌入式的图像视频监控系统的需求在不断增加,而数字化视频系统能够充分利用嵌入式系统的特点对采集的图像进行预处理、分析、存储以及显示.因此,充分利用linux2.6内核系统的特点,基于ARM920T平台的视频处理系统应运而生.

本文以三星公司生产的S3C2440芯片构建基于V4L2规范实现的图像采集系统,详细介绍V4L2标准提供的接口函数,以及视频采集程序模块的设计与实现[2-3].由于传统的驱动程序的开发很少提供完整API接口函数,导致开发周期长的缺陷.本文提出基于V4L2规范的驱动程序开发[4],在保证图像采集质量的前提下,能够缩短开发周期,提高开发效率[5].

1 硬件体系架构介绍

1.1 S3 C2440 A处理器概述

三星公司的ARM920T处理器为嵌入式的产品提供了丰富的片上集成系统.比如:16/32位RISC体系结构,16位压缩指令集Thumb与32位ARM指令集;增强的ARM体系结构MMU;同时支持高速总线模式和异步总线模式.外部接口主要有SDRAM控制器、LED控制器、4通道DMA、3通道UART、IIC总线等[6].本文采用ARM920T的camera功能模块,如图1.

1.2 OV9650传感器芯片

由于CMOS芯片与CDD芯片相比具有低功耗、低成本、速度快、工艺简单等优点,因此本文选用了CMOS摄像头模块,型号OV9650.该芯片的像素阵列大小1280*1024,130万像素,支持SXVGA、VGA、QVGA、CIF等图像输出格式.通过S3C2440的IIC总线和串行SCCB总线接口相连,其饱和度、平衡度、曝光时间等参数均可通过芯片内部寄存器的读写来设置.

图1 S3C2440的camera模块框图

2 Linux2.6操作系统下的摄像头驱动开发与实现

图2 硬件系统平台框架图

嵌入式系统上电启动的过程依次是引导加载程序Bootloader、Linux内核、根文件系统、应用程序.本文在完成移植uboot、linux2.6内核与Yaffs文件系统的基础上,利用V4L2接口规范编程,设计并实现OV9650驱动编码、视频采集、预处理、压缩、传输等功能模块,以及应用程序的测试工作[7].

2.1 V4 L2 接口规范

Video For Linux(V4L)提供了各种视频图像采集设备的API和数据结构,比如TV tuners和usb网络摄像机等.1999年,V4l接口函数得到了发展,成为V4L2,这解决了在V4L中的bugs,而且支持了更加广泛的设备.

常用的设备结构体在linux2.6内核目录include/linux/videodev2.h中定义:

2.2 Linux平台下V4L2驱动的编码

OV9650的CMOS传感器在Linux2.6内核中是作为混杂设备来描述,其驱动程序给应用程序提供了一个流控制接口,让用户进程借助设备文件与硬件联系,对设备文件的操作实质上就是系统调用.所以,系统调用与驱动关联起来就要通过file_operations{}这一结构体来实现[8].系统工作流程如图3所示.

在结构体miscdevice中定义了file_operations*fops,该文件结构体指针对应的操作如下:

这些操作需要在驱动程序中具体实现.

file_operations提供了基本的I/O操作接口open,read,write,close,ioctl等函数,实现了对中断的处理,内存映射功能以及I/O通道的控制功能.在应用程序发出文件操作的相关命令时,内核根据这些指针调用相关函数.这样就完成了驱动和内核之间的通信.

实际上,V4L2是一种两层驱动系统模型,上层是videodev模块.当初始化videodev模块的时候,它被Linux内核注册为主设备号为81的字符设备,,同时还注册了一些字符设备的功能函数.而下层就是V4L2驱动程序,它相当于是videodev的客户端,videodev通过V4L2提供的一套接口函数访问这些驱动.每当初始化V4L2驱动的时候,它就会传递给videodev模块的一个数据结构或文件节点.准确地说,通过V4L2方法实现的驱动模型与普通字符设备的不同是前者包含了一些特有的元素.

每当应用程序触发一个驱动程序调用时,控制权会首先传给videodev中的方法,它负责把应用程序传递过来的结构指针或文件节点转换为对应的V4L2的数据结构指针,并调用V4L2驱动程序中的处理函数.

在初始化V4L2驱动程序的时候,videodev将会枚举它要处理的设备函数,为每个设备填充一个struct v4l2_device结构,同时指向该结构体的指针传给v4l_register_device()函数.它能够保证次设备号可用,然后调用struct v4l2_device结构中的相关函数实现设备的初始化工作.如果初始化成功,那么设备注册成功.如果要卸载设备驱动,调用v4l_unregister_device()取消注册.

2.3 视频驱动模块设计

本文驱动程序的设计是围绕着file_operations{}这个数据结构体展开,其主要功能是注册相应的各个函数的功能,实现对摄像头设备打开、设置控制项、设备buf映像、采集像素格式初始化、采集图像、关闭摄像头等功能.

在初始化函数s3c2440_ov9650_init(void)中设置GPIO-J引脚为camera的对应模式,通过函数re⁃quest_mem_region((unsigned long)S3C2440_PA_CAMIF,S3C2440_SZ_CAMIF,CARD_NAME)为camera申请I/O内存资源,然后使用函数ioremap_nocache((unsigned long)S3C2440_PA_CAMIF,S3C2440_SZ_CAMIF)进行内存映射.接着,初始化camera时钟、设置ov9650寄存器等.下一步,使用misc_register(&misc)函数注册到videodev层.

图3 系统工作流程

此外,在驱动程序结构中必须要包含的两个模块函数分别为:模块加载函数和模块卸载函数.在安装模块时被系统自动调用的函数,通过module_init宏来指定;而卸载模块时被系统自动调用的函数,通过module_exit宏来指定.

module_init是驱动程序的入口点,如果被用户进程加载,它就会自动调用s3c24xx_ov9650_init函数,其实现的工作包括:配置相关寄存器,初始化OV9650摄像头.

当驱动被用户进程卸载时,module_exit(s3c24xx_ov9650_exit)会自动调用s3c24xx_ov9650_exit函数,其实现的工作包括:进程地址空间的释放,中断请求的关闭.

对于主机端设备驱动程序,接下来的工作就是把驱动程序嵌入到内核,这里采用模块的形式编写,因为模块方式可以动态加载到Linux内核,而且利于程序调试.

2.4 基于V4L2的图像采集模块设计与实现

视频采集是通过操作系统调用V4L2接口与设备驱动程序来实现的.V4L2接口是内核里提供的一组支持影像设备的API函数,配合视频采集模块驱动程序实现图像采集功能.在Linux中,可以把视频设备当作普通的设备文件,采集图像的程序就是通过调用V4L2接口规范中API函数对设备文件进行读操作.整个采集流程图如图4所示.

主要用到的函数模型说明如下:

1)int open(devicename,mode):打开设备文件,采用非阻塞模式调用视频设备,当没有可用的视频数据时不会阻塞而立即返回.

2)int ioctl(int__fd,unsigned long int__request,.../*args*/):在打开设备后,使用ioctl函数可以对设备的I/O通道进行管理,能够设置该视频设备的相关属性以及采集方式,还能够向驱动申请帧缓存获取每个帧缓冲的信息后,映射到用户空间.

3)void*mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset);由于V4L2采集到的图像数据是存放在内核空间,而应用程序无法访问内核空间中的数据.我们利用mmap这个函数将内核地址映射到用户空间.这样程序就可以对缓冲区的数据进行操作,从而提高了效率.

4)int close(fd):关闭图像采集设备.最后还要使用munmap方法来释放设备申请的内存.

2.5 测试程序

图4 图像采集流程

本文中驱动程序的测试采用开源编码库—mjpg-streamer,在移植mjpg-streamer之前还需要移植SDL库.mjpg-streamer使用的是V4L2接口,通过对源码的相关修改以及移植来实现一个自己需要的视频服务器,从而可以测试驱动程序开发与图像采集模块程序的编写工作.

3 结论与展望

本文给出了在嵌入式系统中基于V4L2实现的驱动程序开发和图像采集与传输设计方案.在Linux2.6内核中,视频设备也是文件,可以像访问普通文件一样对其进行读写,摄像头设备在/dev/video0目录下. Video for Linux 2是Linux中有关视频驱动的内核驱动,它为嵌入式驱动程序开发提供了统一规范,从而提高开发效率.基于S3C2440A硬件平台,再加上适当的外围器件与应用程序,可应用于图像传输、视频监控等领域.

[1]余辉.嵌入式Linux程序设计案例与实验教程[M].北京:机械工业出版社,2009(4):191-195.

[2]S3C2440A User’s manual Revision1[Z].SUMSUNG,2004.Http://www.samsungsemi.com.

[3]OV9650_DS CameraChipTM Implementation Guide[Z].OmniVision Co.,2004(12).http://www.pdf-ic.com/datasheet_0V9650.html.

[4]曹占中,周余,王自强,等.基于s3c2440的Linux摄像头驱动开发[J].电子测量技术,2009,32(2):108-111.

[5]周晓光,潘延涛.基于S3C2440A的嵌入式视频系统设计[J].电子测量技术,2006,29(6):84-86.

[6]杨水清,张建,施云飞.ARM嵌入式Linux系统开发技术详解[M].北京:电子工业出版社,2008:17-20.

[7]宋宝华.设备驱动开发详解[M].第二版,北京:人民邮电出版社,2010:85-88.

[8]Jonathan Corbet,Alessandro Rubin,Greg Kroah-Hartman.Linux Device Drivers 3rd Edition[M].America:O'Reilly Media,2005: 108-112.

Design and Application of Embedded Image Detection System

YANG Yong,LIU Yong-jun
(School of Computer Science and Engineering,Changshu Institute of Technology,Changshu 215500,China)

Based on the latest standard Video for Linux 2(V4L2)in Linux kernel 2.6,this paper introduces the rap⁃id development method of driver programs.Traditional driver development is rarely able to realize all the interface functions,which seriously affects the system development cycle.The ov9650 camera driver of OmniVision Compa⁃ny has not been supported by Linux kernel.For this reason,under the condition of s3c2440 board hardware plat⁃form and Linux kernel 2.6.30.4,the authors of this paper achieve development work including camera driver mod⁃ule hierarchy and video capture module design,put forward the method of driver development based on V4L2 inter⁃face specification,and realize the application of low-cost,low-power,highly efficient image detection system.

V4L2;driver;ov9650;Linux-2.6.30.4

TP316.81

B

1008-2794(2012)04-0105-05

2012-03-01

江苏省高校自然科学基金“基于投影分析理论与算法的图像特征抽取及分类技术研究”(05KJB520152);常熟理工学院科研创新项目基金“基于arm的便携式人脸识别系统”(KY2012116)

杨勇(1989—),男,江苏宿迁人,常熟理工学院计算机科学与工程学院学生.

刘永俊(1981—),男,山东青岛人,讲师,硕士,研究方向:人工智能与智能系统,模式识别理论与应用,人脸识别,E-mail:yongjun1981@126.com.

猜你喜欢
驱动程序内核嵌入式
万物皆可IP的时代,我们当夯实的IP内核是什么?
现代装饰(2022年4期)2022-08-31 01:41:24
强化『高新』内核 打造农业『硅谷』
今日农业(2021年9期)2021-07-28 07:08:36
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
电镀与环保(2016年3期)2017-01-20 08:15:32
Altera加入嵌入式视觉联盟
倍福 CX8091嵌入式控制器
自动化博览(2014年4期)2014-02-28 22:31:15
驱动程序更新与推荐
驱动程序更新与推荐