APP下载

基于Linux平台的OV2715驱动研究与实现

2016-12-26李校林孙文华李银

现代电子技术 2016年22期

李校林+孙文华+李银

摘 要: 为了实现嵌入式Linux对CMOS图像传感器OV2715的支持,对OV2715的工作原理进行深入的研究,针对OV2715功能复杂和驱动编写困难的问题,提出一种模块化设计OV2715驱动的方法。在DM3730硬件平台下,将OV2715驱动分为I2C设备驱动和V4L2接口驱动并分别进行了实现,最后,设计视频采集程序并对驱动进行了测试。测试结果表明,输出视频图像质量清晰稳定,该实现在高清数字监控系统中有较好的应用前景。

关键词: OV2715驱动; V4L2; I2C总线; 嵌入式Linux; 高清数字视频监控

中图分类号: TN957.52?34; TP316 文献标识码: A 文章编号: 1004?373X(2016)22?0071?0

0 引 言

随着人们安全意识的提高,视频监控系统在众多行业中得到了大范围的普及。高清数字视频监控系统更以其储存信息量大、系统功能完善、控制灵活和智能化等显著优点,在安防领域得到越来越多的应用[1]。高清数字视频监控系统主要由前端采集设备、视频传输系统和主控显示存储系统组成,而前端摄像机采集芯片类型的选择直接影响着监控端输出数字视频信号的好坏,从而决定着视频监控系统的整体效果。

OV2715是TI公司针对高清视频监控领域推出的全高清1080P的CMOS图像传感器芯片,具有成本小、低功耗和输出图像质量高等特点,选取该芯片作为前端采集芯片。由于Linux 2.6.32内核版本没有提供该芯片驱动,需要手动编写该驱动实现对OV2715的支持。同时,以往的视频设备驱动往往存在结构层次不明晰等缺点,针对OV2715功能复杂和驱动开发难度大等特点,提出了模块化的思想编写该驱动。首先,深入研究了OV2715的工作原理,对Linux系统中的I2C驱动体系和V4L2驱动体系进行了全面的介绍;其次,针对特定的硬件平台,基于模块化方法对OV2715驱动程序进行了设计并给出了关键代码实现。最后,设计了视频采集程序对驱动进行了测试和分析,实现了视频采集和显示功能。

1 OV2715芯片

1.1 OV2715功能介绍

OV2715是一款1/2.7 英寸的低电压、高性能和能提供输出1080P高清分辨率的CMOS图像传感器,支持通过DVP和MIPI接口输出RAW/RGB格式的图像,还提供了SCCB接口来控制传感器的运行[2]。此外,OV2715集成了自动聚焦滤波器,PLL电路和1.5 V稳压器,可以保证其运行的稳定;OV2715的自动图形控制电路使其支持AEC,AGC,AWB,ABLC和LENC等功能,因而输出图像质量较其他传感器有明显的提高;OV2715图像传感器主要应用于高清数字视频监控摄像机的前端采集模块中。

1.2 OV2715寄存器介绍

OV2715内部寄存器主要包括三部分:用来控制输入输出的寄存器、用来实现具体图像功能的寄存器和用来辅助传感器正常工作的寄存器。视频监控系统中,处理器模块对OV2715寄存器的访问通常有两种方式,其一为并行访问模式,通过OV2715的DVP接口进行访问;其二为串行访问方式,经过系统提供的I2C接口来控制OV2715芯片。I2C总线是一种串行总线,主要由数据线和时钟线组成,其用途是完成微控制器模块和外围模块间通信的工作。OV2715通过I2C访问时硬件资源占用率小并且访问速度较快,故本次驱动实现中处理器和OV2715通信采用I2C总线方式。

1.3 OV2715工作过程

OV2715视频数据采集主要经过图像数据产生、图像数据处理和图像数据输出三个过程,采集工作过程如图1所示。

图像数据产生阶段,OV2715传感器内核根据引脚HREF,VSYNC和PCLK信号以固定的帧速率产生像素流数据。其中,定时产生器可以同步图片阵列的行数据,每个阵列中的像素经过模拟电路抽样、增益控制和ADC转换后产生10 b的数据;图像数据处理阶段,需要对采集到的数字信号进行图像增强、镜头控制和视频格式的设置等功能,主要配置的寄存器如表1所示;图像输出阶段,主要对图像数据进行编码,然后进行通道选择,输出符合要求的YUV/RGB数字信号。

2 硬件平台结构

无人机基站勘测系统中,前端采集系统硬件结构如图2所示。

嵌入式硬件系统处理模块采用TMS320DM3730片上系统,操作系统内核版本采用Linux 2.6.32。DM3730为TI公司的OMAP系列双核架构处理器,ARM端负责运行操作系统控制系统的工作流程和DSP负责处理大量高清视频数据,并且该处理器内部具有3D Image?Processor和IVA等,支持高清 720P,1080P视频解码。该处理器实时处理视频速度可达60 f/s,具有优秀的编解码能力,最高能达到每秒500万像素,具有VPSS和支持包括3A在内的众多功能[3]。

OV2715图像传感器通过I2C总线接入DM3730平台的ISP模块中;WiFi模块负责发送视频数据和基本通信功能,SD卡模块负责视频数据的存储和系统升级存储功能,电源管理模块为给系统提供可靠、稳定的电源输入,调试模块主要负责控制系统更新升级等。

3 OV2715驱动程序实现

高清数字视频监控系统中,视频采集的过程:OV2715将模拟电路产生的图像信号经过A/D控制器转换成8 b的数字信号,其次通过V4L2驱动支持的MIPI接口进行视频捕捉,此后DM3730平台DSP模块进行H.264编码,最后将视频数据通过网络发送或者进行本地存储。在此过程中,OV2715驱动程序负责初始化OV2715相关寄存器,同时接收用户空间的命令完成对传感器工作状态的操控,将视频信号传送到V4L2视频驱动接口;OV2715驱动结构如图3所示。

OV2715驱动被加载到内核后,向系统注册成功后会生成对应的设备节点;用户空间应用程序通过操作该节点使用V4L2驱动实现的API完成视频采集的工作。在此过程中基于模块化方法,OV2715驱动分为I2C设备驱动和V4L2设备接口层驱动两部分,进行分别设计和实现。

3.1 OV2715的I2C设备驱动

DM3730平台通过I2C总线向OV2715发送控制命令,完成相关寄存器的配置。Linux系统平台下,I2C驱动体系由I2C总线驱动、I2C核心以及I2C设备驱动3个部分组成。I2C核心集成了与具体设备无关的统一的设备注册和注销的方法,用于管理I2C总线驱动和I2C设备驱动;I2C总线驱动提供硬件系统中I2C Adaper和Slave设备通信的功能。I2C设备驱动主要进行总线上的具体设备驱动的实现,主要完成设备的具体操控方法和初始化探测功能[4]。

在OV2715 的I2C驱动模块设计中,内核版本Linux 2.6.32对I2C核心和I2C总线驱动已经进行了实现,只需对具体的I2C设备驱动进行实现。OV2715的I2C设备驱动完成的主要任务是读写OV2715芯片的相关寄存器,传送并接收控制命令,完成对硬件的初始化控制。在此驱动模块实现中,不仅要实现I2C核心相关接口,还要实现应用程序层接口。

3.1.1 I2C核心接口实现

该模块实现的数据结构包括struct i2c_driver和struct i2c_client两个结构体;其中i2c_driver对应于OV2715设备的具体驱动方法,实现代码如下:

ov2715_probe负责将OV2715传感器以I2C客户端设备的身份注册到系统,同时调用V4L2体系相关接口建立设备节点,最终完成对设备的初始化工作;ov2715_remove注销相关设备节点将设备移除,完成清空缓冲区和系统资源回收的任务;ov2715_id结构中储存了设备ID相关信息,OV2715上电启动后会根据此信息进行匹配驱动;ov2715_probe( )函数具体实现如下:

结构体i2c_client用于描述具体的物理设备,总线上的I2C设备均要用一个各自的i2c_client来描述;i2c_client信息通过开发板的板级支持包i2c_board_info结构体填充描述。

ov2715_i2c_driver结构内的函数实现完成后,利用i2c_add_driver( )函数将接口层驱动添加到设备驱动链表;其中,注册函数采用i2c_register_driver( )函数;I2C设备驱动被成功注册进入内核后,驱动程序可以通过I2C接口对OV2715传感器进行操控,此过程需实现的函数如下:

OV2715寄存器读函数:static int ov2715_read_reg(struct i2c_client *client, unsigned short data_length, unsigned short reg,unsigned int *val);

OV2715寄存器写函数:static int ov2715_write_reg(struct i2c_client *client, unsigned int addr, unsigned int val);

3.1.2 应用程序用户层接口

上层应用程序通过相关的文件接口访问底层硬件,OV2715应用程序用户层接口模块主要实现此功能。需要实现的文件接口如表2所示。表2中主要文件操作采用struct file_operations结构体描述。内核版本Linux 2.6.32封装了该接口并提供了struct v4l2_file_operations结构体,该结构体提供了标准的成员接口等,因此,将主要实现具体需要的函数和标准接口相连即可。具体实现代码如下:

3.2 OV2715的V4L2视频接口驱动

V4L2框架为Linux系统视频设备底层驱动规定了一致的接口,使用户层程序无须关心底层驱动细节使用统一的API操作具体的物理设备,主要用于操控视频设备和视频采集处理,给相关开发人员的操作和维护带来了极大方便[5?6]。

表2 常用文件操作接口

V4L2体系结构支持多种设备,向底层驱动提供了视频采集接口、视频输出接口和直接视频传输接口等。本文将采用V4L2框架中的Video Capture Interface并在OV2715传感器的MIPI接口获取采集数据。在V4L2视频接口驱动中,Video核心层调用v4l2_int_device_register( )函数将OV2715以V4L2从设备向系统进行注册,最终在dev目录下创建Video0设备节点,向用户层提供访问接口;Video核心模块底层为视频设备的具体实现,可以有多个slave设备,V4L2视频接口驱动框架如图4所示。

V4L2接口驱动调用流程:用户层调用标准的V4L2的接口时,经过Video核心层处理后传递到slave设备实现的具体操作函数中。其中,v4l2_int_ioctl_desc中包含针对具体设备实现的ioctl函数,主要用于视频采集过程中设置视频格式和对采集进行操作功能。主要代码实现如下:

//供应用层调用的v4l2 ioctl命令

4.1 OV2715采集测试程序

OV2715采集测试程序基于V4L2接口设计,直接调用以上章节实现的接口采用顺序执行的方式,将OV2715前端采集到的数据传输到DM3730的ISP模块进行处理,主要通过ioctl()命令来获取并配置视频采集参数,如申请缓冲区、设置视频采集参数等。循环采集图像时,read和write由于直接将大量数据从内核空间复制到用户空间,耗内存并且效率低下[7],本文采用内存映射的方式,直接申请缓冲区并对其操作,效率有很大提高,不会出现卡机现象。OV2715视频采集程序流程图如图5所示。

4.2 OV2715驱动测试结果

为了测试的灵活性,本文采用动态加载模块的方式;将编译好的OV2715驱动模块ov2715.ko拷贝到DM3730开发板中,使用insmod命令将驱动加载到内核:程序执行过程中打印出芯片PID、寄存器设置和时钟频率信息均与真实值一致,最终注册成功后在dev目录下创建Video0设备文件节点。调试信息如图6所示。

无人机基站勘测摄像机实物图如图7所示。

测试程序调用本文实现的V4L2的相关API接口进行采集,采用mmap的方式,每次采集200帧图像,捕捉到的视频为YUV格式,使用YUV Player软件播放所采集到的视频文件。OV2715驱动方案经过实际测试,采集到的视频输出效果如图8所示。

5 结 语

本文采用模块化的方法基于DM3730平台对OV2715驱动进行了实现,同时,对Linux下I2C设备驱动体系和V4L2驱动体系进行详细的阐述,提出两者实现的一般方法;该驱动结构层次清晰,对Linux系统中其他视频采集芯片驱动编写具有很强的参考价值;集成OV2715作为采集前端的无人机基站勘测系统在基站勘察领域中具有广阔的市场前景。

参考文献

[1] 于海彬,张雪,陈兴林.基于Linux的TW2835的驱动程序设计与实现[J].计算机工程与设计,2013(9):3068?3073.

[2] Omni Vision Technologies, Inc. OV2715 product specification, version 2.03 [S]. [S.l.]: Omni Vision Technologies, Inc, 2011.

[3] Texas Instruments. AM/DM37x multimedia device technical reference manual 1.0 [S]. USA: Texas Instruments, 2012.

[4] CORBET Jonathan,KROAH?HARTMAN Greg,RUBINI Alessandro.Linux设备驱动程序[M].北京:中国电力出版社,2006.

[5] 刘升,赵晶晶,范秀丽.基于V4L2的嵌入式视频监控系统[J].网络新媒体技术,2011,32(1):37?42.

[6] 郝俊,孟传良.基于V4L2的ARM11 USB视频采集终端的设计与实现[J].贵州大学学报(自然科学版),2011(4):74?78.

[7] 张辉,李新华,刘波,等.基于V4L2视频采集缓存机制应用与实现[J].现代电子技术,2010,33(20):54?56.