


摘 要: 为了实现嵌入式 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.
为支持嵌入式Linux下的OV2715 CMOS传感器,采用模块化设计实现其驱动,包括I2C设备驱动与V4L2接口驱动,测试表明视频输出稳定清晰,适用于高清数字监控。
7383

被折叠的 条评论
为什么被折叠?



