基于DM6467T 的高清摄像头驱动设计

2015-03-06 01:32施伟斌
电子科技 2015年10期
关键词:驱动程序内核驱动

张 磊,施伟斌

(上海理工大学 光电信息与计算机工程学院,上海 200093)

随着数字视频技术成为安防监控与视频会议不可缺少的一部分,人们对视频稳定性、图像清晰度以及数据实时性的要求也逐步提高[1]。为得到更清晰的图像,TI(德州仪器)推出了达芬奇系列芯片。该系列芯片善于处理多媒体数据,支持多种视频格式的输入和高清视频的输入。对于YUV 格式的视频图像输入,目前已有较为成熟的驱动可直接使用,然而常见的传感器通常输出raw 格式的视频数据,raw 格式的是最原始的视频数据,其信息量最大,现阶段对传感器的驱动支持尚不完善。本文基于Linux 环境,介绍了V4L2、VPIF 和传感器驱动之间的关系,完成视频采集设备驱动的设计及简单测试程序的编写。

1 硬件平台架构介绍

在进行驱动程序设计之前,首先要了解相关硬件设备的信息。

1.1 DM6467T 介绍

DM6467T 是TI 公司推出的一款达芬奇系列的双核芯片。达芬奇技术的基础是集成了DSP 与ARM 双内核的片上系统,ARM 内核可加载操作系统,主要起控制和管理作用,DSP 内核相当于一个只负责处理编解码算法的协处理器[2]。DM6467T 拥有1 GHz 主频的DSP 内核,500 MHz 主频的ARM926E-JS 内核以及2 个HDVICP 硬件协处理器[3]。基于多媒体背景提出的DM6467T,不仅运算能力高,且具有较强的控制能力。

DM6467T 拥有VPIF(Video Port Interface)视频接口功能模块,VPIF 模块管理着视频数据的输入输出功能,可满足各种视频输入输出设备的格式。该模块有4 路可配置的数据通道,每路为8 bit 的数据宽度,其中两路用于视频输出,另两路用于视频输入。VPIF 支持ITU-BT.656、ITU-BT.1120 格式的视频,也可支持数据宽度为8/10/12 bit 的raw 格式图像数据。

1.2 MT9P031 传感器

MT9P031 传感器是Aptina 公司推出的一款高清传感器,最高可支持2 592×1 944 像素的视频采集。在720p 的视频格式下,每秒可采集60 帧视频图像。MT9P031 利用I2C(Inter-Integrated Circuit)总线进行通信,通过I2C 设置传感器内部寄存器,即可控制传感器的工作模式及工作参数。I2C 总线是由Philips 公司开发的两线式串行总线,用于连接微控制器及其外围设备。

传感器端连接示意图如图1 所示。传感器的数据接口与DM6467T 的VPIF 接口相连接。MT9P031 传感器采集输出的是12 位宽度的原始数据,需要占用VPIF 接口中两路8 bit 的数据通道,传感器利用行同步信号与帧同步信号进行同步,其同步信号与VPIF 接口相连接。

图1 连接示意图

2 视频驱动设计

2.1 V4L2 驱动

V4L2(Video for Linux two)是Linux 下开发视频采集设备驱动程序的一套规范,这套规范使用分层的方法为驱动程序的开发提供了清晰的模型和一致的接口[4]。V4L2 本身是一个字符设备,具有字符设备的所有特性,直接将接口暴露给用户。当视频设备连接到主机后,驱动程序会首先注册一个主设备号为81 的字符设备,其是硬件唯一的身份标识[5]。

图2 展示了V4L2 的驱动结构。驱动正常加载完毕后,会在/dev 目录下产生/dev/videoX 设备节点。图中的V4L2 驱动核心构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数。平台V4L2 驱动部分,根据平台自身的特性实现与平台相关的驱动,平台驱动用于控制视频接收端的相关操作。本文采用DM6467T 处理器,使用DM6467T 的VPIF 接口,该平台驱动即VPIF 驱动。用户在利用接口进行操作时,V4L2 调用平台驱动所提供的功能对DM6467T进行操作。用户需要采集传感器数据时,利用V4L2驱动核心提供的接口进行操作,驱动核心将负责下层驱动的调用,完成数据采集工作。

2.2 VPIF 接口驱动

VPIF(Video Port Interface)是DM6467 视频接口功能模块,VPIF 接口共4 路数据通道,两路8 位视频输入通道,两路输出通道,其4 路通道拥有相同的硬件结构[6]。DM6467T 通过VPIF 接口接收传感器采集的视频数据,并将所有输入数据都缓存在片内Flash 中。

图2 V4L2 驱动结构图

首先需设计驱动初始化程序,在加载驱动过程中,VPIF 需要进行初始化工作,主要包括分配缓冲,检测设备类型,分配内存给通道对象,将设备注册为v4l2_dev,申请视频数据接收时的中断,该中断表示一帧视频数据接收完成。注册相关的控制类函数,该类函数将实现用户层接口的控制操作。

余下的VPIF 驱动函数设计可分为3 部分:(1)用户控制相关的操作函数,该类函数实现V4L2 中ioctl 函数的具体操作。用户可通过V4L2 对VPIF 进行查询设备能力、设置像素、设置标准格式、申请缓冲区、对缓冲区进行操作和开启或停止视频采集等操作。(2)字符设备操作相关的函数,包括设备打开的实现,设备被关闭时资源释放以及内存映射的实现。(3)实现中断服务程序。采集视频数据阶段,每接收到一帧完整数据后,系统会产生一个中断,跳转到中断服务程序。产生中断表示缓存区域已被接收到的图像数据填满,中断服务程序中需要实现缓存轮换的操作,即将缓存指针指向下一个空白区域。

2.3 MT9P031 驱动

MT9P031 传感器驱动首先需要实现初始化功能。传感器驱动需要作为v4l2_subdev 进行注册,注册完成后可在VPIF 驱动中利用v4l2_subdev_call 函数对其进行操作。MT9P031 的内部控制寄存器由I2C 总线进行控制,传感器驱动在初始化时还需注册为I2C 设备,并利用I2C 总线进行探测,读取传感器的设备号,检测传感器芯片是否正常。

由于MT9P031 是V4L2 子设备,驱动需要实现供上层平台驱动调用的控制函数,包括设置及获取当前视频格式,设置及获取视频参数以及实现传感器数据采集与停止功能的函数。

最后需要在芯片相关的设置文件中,加入VPIF 与传感器的文件的配置,配置基本参数,如I2C 地址、VPIF 通道的连接情况等信息。

3 驱动测试程序

3.1 驱动程序编写

本文编写的驱动程序直接编译在内核中,在Linux内核启动的过程中,视频驱动进行初始化。内核加载完毕后,在/dev 目录下产生/dev/video0 设备节点,用户空间通过调用Open 函数即可打开设备,进行视频采集操作。具体流程如图3 所示。

图3 视频采集流程图

用户打开设备后,利用Ioctrl 函数进行操作,通过VIDIOC_QUERTCAP 控制命令可查询驱动支持格式,并利用其他控制命令进行相应设置[7]。Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能直接使用指针传递数据,需通过VIDIOC_REQBUFS 命令和Malloc 函数分别在内核空间和用户空间分配内存缓冲区,最后通过Mmap 函数进行内存映射[8]。利用VIDIOC_QBUF 命令将分配到的缓冲加入缓冲队列,该队列将用于存放接收到的视频数据。利用VIDIOC_STREAMON 命令开始视频采集,从缓冲队列中取到视频数据,并保存在SDRAM中,保存完毕后将缓冲区放回队列。采集完毕后需先停止视频采集,调用Close 函数关闭视频设备,并且释放申请的内存空间。

3.2 测试结果

最终采集到的视频数据存放在SDRAM 中,传感器采集到的视频图像是raw 格式的数据,其数据格式为红绿/绿蓝交错的值,需要利用差值算法将其转换成RGB 图像再进行显示,最终呈现了较为清晰的图像,验证了驱动程序的正确性。

由于raw 格式的数据量较大,在实际应用中并不适合将该数据直接存储至存储器中,需要对数据进行转码压缩,随后再存储或通过网络进行传输。利用该驱动程序进行网络摄像头的设计,由于转码运算量大,在720P 的格式下,目前实时的采集播放速率可达到10 fip·s-1。虽未达到传感器的标准,但验证了驱动的正确性,且基本满足使用需求。对DSP 算法进行优化后,视频每秒的帧数将可进一步提升。

4 结束语

本文介绍了 V4L2 驱动的设计架构,利用DM6467T 的VPIF 接口,设计了基于DM6467T 的高清摄像头驱动。现有基于VPIF 接口设计的驱动仅支持YUV 分量格式的视频数据,本文实现了在VPIF 下针对raw 格式视频数据采集的驱动,采集数据也达到了预期的效果。raw 格式图像数据量大,根据需求进行处理后,用途广泛。

[1] 赵勇,袁誉乐,丁锐.Davinci 技术原理与应用指南[M].南京:东南大学出版社,2008.

[2] 姚春莲,郭克友,阮秋琦,等.基于DM6467 的视频处理软件设计与优化[J].北京交通大学学报,2013,37(5):162-167.

[3] Texas Instruments.TMS320DM6467T digital media Systemon-Chip[M].America:Texas Instruments,2009.

[4] 王剑非.基于Linux 操作系统的视频采集卡驱动程序设计[J].微计算机信息,2007(23):94-96.

[5] 张海涛,蔡文寰,董有尔.基于DM642 的图像处理系统设计及应用[J].现代电子技术,2008(12):125-127.

[6] Texas Instruments.TMS320DM646x DMSoC video port interface user's guide[M].America:Texas Instruments,2009.

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

[8] 黄俊伟,巴义.基于V4L2 移动视频监控系统的研究与设计[J].电视技术,2012(17):159-162.

猜你喜欢
驱动程序内核驱动
多内核操作系统综述①
基于模糊PI控制的驱动防滑仿真系统分析
强化『高新』内核 打造农业『硅谷』
屈宏斌:未来五年,双轮驱动,砥砺前行
轨旁ATC系统门控柜接收/驱动板改造
阻止Windows Update更新驱动程序
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
基于S3C6410的Wi-Fi驱动移植实现