基于DM6467T的高清摄像头驱动设计
扫描二维码
随时随地手机看文章
摘要 为满足高清视频监控的需求,针对目前raw格式传感器的驱动支持尚不完善的问题。文中基于TI公司的DM6467T芯片硬件平台,利用芯片提供的VPIF接口,对高清摄像头进行驱动程序的设计。分析了V4L2驱动结构,并分别对V4L2核心驱动、VPIF接口驱动以及传感器驱动进行修改及设计。编写了驱动测试程序,实验结果表明,该设计能成功采集到raw格式的图像数据,对同类传感器驱动设计具有一定参考价值。
随着数字视频技术成为安防监控与视频会议不可缺少的一部分,人们对视频稳定性、图像清晰度以及数据实时性的要求也逐步提高。为得到更清晰的图像,TI(德州仪器)推出了达芬奇系列芯片。该系列芯片善于处理多媒体数据,支持多种视频格式的输入和高清视频的输入。对于YUV格式的视频图像输入,目前已有较为成熟的驱动可直接使用,然而常见的传感器通常输出raw格式的视频数据,raw格式的是最原始的视频数据,其信息量最大,现阶段对传感器的驱动支持尚不完善。本文基于Linux环境,介绍了V4L2、VPIF和传感器驱动之间的关系,完成视频采集设备驱动的设计及简单测试程序的编写。
1 硬件平台架构介绍
在进行驱动程序设计之前,首先要了解相关硬件设备的信息。
1.1 DM6467T介绍
DM6467T是TI公司推出的一款达芬奇系列的双核芯片。达芬奇技术的基础是集成了DSP与ARM双内核的片上系统,ARM内核可加载操作系统,主要起控制和管理作用,DSP内核相当于一个只负责处理编解码算法的协处理器。DM6467T拥有1 GHz主频的DSP内核,500 MHz主频的ARM926E—JS内核以及2个HDVICP硬件协处理器。基于多媒体背景提出的DM646 7T,不仅运算能力高,且具有较强的控制能力。
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接口相连接。
2 视频驱动设计
2.1 V4L2驱动
V4L2(Video for Linux two)是Linux下开发视频采集设备驱动程序的一套规范,这套规范使用分层的方法为驱动程序的开发提供了清晰的模型和一致的接口。V4L2本身是一个字符设备,具有字符设备的所有特性,直接将接口暴露给用户。当视频设备连接到主机后,驱动程序会首先注册一个主设备号为81的字符设备,其是硬件唯一的身份标识。
图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路通道拥有相同的硬件结构。DM6467T通过VPIF接口接收传感器采集的视频数据,并将所有输入数据都缓存在片内Flash中。
首先需设计驱动初始化程序,在加载驱动过程中,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/vide0设备节点,用户空间通过调用Open函数即可打开设备,进行视频采集操作。具体流程如图3所示。
用户打开设备后,利用Ioctrl函数进行操作,通过VIDIOC_QUERTCAP控制命令可查询驱动支持格式,并利用其他控制命令进行相应设置。Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能直接使用指针传递数据,需通过VIDIOC_REQBUFS命令和Malloc函数分别在内核空间和用户空间分配内存缓冲区,最后通过Mmap函数进行内存映射。利用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格式图像数据量大,根据需求进行处理后,用途广泛。