于海彬,张 雪,陈兴林
(哈尔滨工业大学 航天学院,黑龙江 哈尔滨150001)
数字视频监控系统因其监控效率高、扩展性能强、存储容量大、功能齐全和智能化等特点,在安全防范技术中得到广泛的应用。数字视频监控系统主要包括视频采集、视频处理、视频传输和远程监控等技术[1],其中视频采集芯片的选取直接决定了输出数字视频信号的质量和格式,对提高视频监控效果起到了至关重要的作用。
TW2835是TechWell公司的一款可同时支持四路视频采集和音频采集的高性能音视频采集芯片,具有功能强大,输出图像质量高,价格适中的特点,但TechWell公司并没有提供Linux下的驱动支持,而且TW2835功能复杂,驱动设计难度大。而嵌入式Linux操作系统因为其开放源代码、移植性高、成本低廉等优点,越来越多的被应用到数字视频监控系统中。故本文分析了TW2835的工作流程和Linux下I2C驱动体系以及V4L2视频驱动体系,并针对飞思卡尔i.MX53处理器,在Linux2.6.35内核基础上,采用模块化思想对TW2835驱动程序进行了实现。
TW2835是一款可同时支持四路音频和视频输入的音视频控制器,可将输入的音频或者视频转换为特定的数字信号输出。它包括4个高质量的NTSC/PAL视频解码器,4个音频模拟数字转换器,一个音频复用器,双色显示控制器,双视频译码器以及一个先进的OSD(屏幕菜单式调节方式)。
TW2835内置了4个10位的模数转换器,4个模拟反锯齿滤波器 (减少输入模拟视频信号中的交叉噪音),数字增益/钳位控制器和高质量Y/C分离器 (对视频信号进行转换和编码)。TW2835功能较多:支持视频的实时显示、记录和回放功能,并可实现多路复用;支持详尽的实时D1录制,在重放过程中将信道ID信息添加到视频流媒体中,用于自动解码与显示;5层的图形覆盖功能,为OSD、单盒、2D阵列箱以及鼠标指示器提供显示特征;支持IF补偿滤波器、CTI(瞬态色彩增强技术)和可编程峰值等图像增强技术。通过芯片间的级联,TW2835可扩展为8/16路的视频采集器[2]。
TW2835也包括音频编解码器,含有4个AD转换器和一个DA转换器。一个内置的音频控制器能产生用于记录/混合的数字输出,能接数字输入进行播放。
TW2835控制是通过I2C总线实现的,对TW2835控制的过程实际上就是对TW2835寄存器访问的过程。由于2835功能较多而且比较复杂,所以TW2835芯片的寄存器也是比较复杂的。
TW2835内部寄存器共有3页,分别为Page0、Page1、Page2,每一页包含256个寄存器。其中Page0主要用来控制视频解码的参数,Page1实现视频控制和视频编码的参数,Page2定义实现OSD、运动检测、工具箱和鼠标等功能。处理器可以通过两种方式来访问TW2835内存器,一种是通过并行访问方式,由引脚CSB0和引脚CSB1确定页地址。另一种是I2C串行访问方式,即通过处理器的I2C总线来访问芯片。
I2C总线是由飞利浦公司开发出来的两线式串行总线。它只有时钟线和数据线,占用资源非常少,主要用来实现处理器和外设之间的通信。TW2835在这种访问方式下,由引脚HDAT [6∶1]和引脚HCSB0确定该芯片的I2C从地址。由于通过I2C串行访问方式占用硬件资源少而且快速,所以本文中TW2835的驱动实现采用的是I2C串行访问方式。
采用I2C读写TW2835寄存器的过程如图1和图2所示。当写寄存器值时,需要向I2C总线发送3次数据,分别为页地址、寄存器地址和寄存器值。当读寄存器值时,需要先写入要读的寄存器的页地址和寄存器地址,然后开始接受数据。对TW2835的控制是通过嵌入式处理器中的I2C控制器来实现的,并且设置TW2835工作为从设备状态。
图1 TW2835的I2C写时序
图2 TW2835的I2C读时序
TW2835视频采集主要经历视频输入,视频控制,视频输出3个过程,其采集过程如图3所示。四路模拟信号经过视频输入进行转换处理得到四路数字视频信号,然后四路数字视频信号经过视频控制进行视频显示处理,然后得到将处理好的视频信号经过视频输出的ITU-R BT656编码器进行编码得到符合YUV格式要求的数字视频信号数据。
图3 TW2835视频处理过程
视频输入是将四路模拟信号经过输入端VINA或者VINB输入到AD转换器,经过AD转换为数字信号,然后对数字信号进行视频编码和视频裁剪预处理得到四路数字信号。其中视频编码包括数字信号同步处理、色彩编码、亮度处理和色度处理等过程。视频输入过程由Page0的寄存器控制,需要配置的寄存器见表1。在视频输入过程中视频裁剪器用于对视频进行裁剪和大小进行控制,主要调节的 寄 存 器 为: 0x02-0x06、 0x12-0x16、 0x22-0x26、0x32-0x36。
表1 所需配置寄存器
视频控制主要是对经过视频输入采集到的四路数字信号进行视频放大、图像增强、滤除噪声和四路通道切换等功能。通过对Page1的1x60,1x63,1x66,1x69,1x6C,1x6D进行配置来实现对四路视频显示的位置和大小进行配置。
视频输出主要是对数字视频信号进行ITU-R BT656编码,然后对视频输出通道进行选择,输出符合YUV(4∶2∶2)格式的数字信号。视频输出通道和视频输出格式有page1的1xA3寄存器控制。寄存器1xA4可以实现对BT656编码进行调整,包括奇偶场顺序、输出范围等。
嵌入式硬件系统采用的是飞思卡尔I.MX53系列处理器,嵌入式操作系统采用的是Linux2.6.35。i.MX53系列处理器是飞思卡尔基于ARM CortexTM-A8内核设计的先进多媒体、高性能处理器。它集成了视频处理单元,并且支持1080P硬件编解码功能,可直接对视频进行H.264视频编码,同时集成I2C、SD、MMC、USB、SPI等控制器,处理器的最高工作频率可达1.2GHz。本系统硬件部分的原理框图如图4所示。
图4 嵌入式系统硬件原理框架
采用I2C总线控制视频采集芯片TW283,视频信号通过8根并行总线传输至CPU的CSI接口,由CPU负责视频捕获、视频压缩和视频处理等操作,3G模块用于发送,SD卡用于存储视频,Nand Flash用于存储操作系统。
数字监控系统的视频采集的总体流程为:TW2835将模拟摄像头传输来的模拟信号经过AD转换为8位的数字信号,然后经过V4L2驱动的下层CSI接口进行视频采集,然后经过i.MX53的视频处理单元VPU进行H.264编码,然后由CPU进行发送或者存储。在这个过程中,TW2835驱动负责对TW2835进行初始化,并接收来自应用层的控制指令对TW2835的工作状态进行控制,同时将视频信号传输至V4L2驱动底层CSI的接口。
TW2835需要实现视频采集,多路视频切换,视频位置调整,视频放大,视频输入格式控制等功能。采用传统的V4L2底层接口无法实现TW2835的所有功能,所以本文采用模块化思想将TW2835驱动分为两个模块单独设计,即TW2835的I2C设备驱动模块和TW2835的V4L2视频接口驱动模块,如图5所示。TW2835的I2C设备驱动实现对TW2835工作状态的查询和控制,其通过设备节点对tw2835进行控制,可以实现视频输入格式控制,多路视频切换,视频位置控制,TW2835工作状态查询等工作;TW2835的V4L2视频接口驱动主要实现Linux系统通过V4L2对TW2835采集的数字信号进行捕捉,并将捕捉的视频信号传输给应用程序,应用程序通过设备节点video0进行采集。
图5 TW2835驱动结构
TW2835有并行控制和串行控制两种控制方式,本文中采用串行控制方式,即采用I2C总线对TW2835进行控制。
Linux系统下的I2C体系结构是由I2C核心、I2C总线驱动和I2C设备驱动3个部分组成[3]。I2C核心主要实现了对I2C总线驱动和I2C设备驱动的管理,实现了驱动和设备驱动的注册以及注销的方法,并且提供I2C通信方法的上层代码。I2C总线驱动是对I2C硬件体系结构中的适配器端的实现,适配器一般是ARM芯片内部集成的I2C控制器。I2C设备驱动主要是通过I2C总线驱动来实现对外设的访问,它对应于设备的初始化检测和具体控制方法[6]。
在本驱动设计中,I2C核心和I2C总线驱动在飞思卡尔的源码中已经实现,因此本文中主要实现的是TW2835的I2C设备驱动部分。TW2835的I2C设备驱动实现的主要功能是对TW2835的寄存器进行读写,传送和接收控制指令,实现对TW2835的工作状态进行检测和实行控制。TW2835的I2C设备驱动需要实现两个接口,一个是对应于I2C核心的接口,一个是对应于应用程序用户层的接口。
(1)I2C核心接口
I2C核心的接口主要是通过i2c_driver和i2c_client两个结构体实现。其中i2c_driver对应于TW2835设备的具体驱动方法。下面是其实现。
tw2835_probe负责将设备注册到系统,同时创建设备节点,对设备进行初始化等操作,tw2835_remove则是将设备从系统注销,释放变量,并注销设备节点。
i2c_client对应于真实的物理设备,每个I2C设备都需要一个i2c_client来描述。i2c_client信息通过BSP的板文件i2c_board_info填充,如下所示。
注册完I2C设备之后,驱动就可以通过I2C总线对TW2835设备的寄存器进行读写控制,该过程通过tw2835读写函数来实现,主要实现的函数为:
TW2835寄存器读函数原型:
TW2835寄存器写函数原型:
TW2835寄存器连续写函数原型:
(2)应用程序用户层接口
TW2835的用户接口主要实现open,release,close,read,write以及ioctl等标准的文件操作。应用程序通过这些接口函数来访问TW2835设备,实现对TW2835工作状态的控制。最主要的操作是ioctl函数,它的功能包括读寄存器,写寄存器,设置色彩,饱和度,亮度,设置通道等操作。
在嵌入式Linux下视频采集采用V4L2驱动体系。V4L(Video for Linux)是在Linux内核中关于视频设备的API接口,负责视频设备控制、采集处理视频图像信息等功能。V4L2是V4L的升级版本,灵活性和扩展性有很大的提升,提供了一套用于应用程序和底层驱动之间的接口规范[5]。V4L2对底层驱动提供的设备接口包括视频捕捉接口、视频Overlay接口和VBI接口。本文使用了V4L2的视频捕捉接口并通过CSI接口捕捉TW2835采集的数字信号。
V4L2底层驱动包括两部分。一部分是Video核心模块,它主要负责向系统注册字符设备,生成video0设备节点,为应用程序访问设备提供访问接口。另一部分可以看作Video核心的slave设备,是视频采集设备的具体实现,Video核心对应多个slave设备,如图6所示。
图6 V4L2视频采集驱动整体框架
当应用程序调用V4L2的API函数时,系统首先会将指针传递到Video核心模块,然后Video核心将指针转向slave设备相应的视频操作指针。下面是slave设备结构体的实现。
其中tw2835_ioctl_desc是slave设备的具体操作函数,在本文中实现初始化CSI接口,设置捕捉格式,查询设备支持的视频格式,对视频信号进行捕捉等操作。
为了方便实验和测试,本文将驱动单独编译成模块,采用动态加载的方式进行测试。将编译好的TW2835驱动模块tw2835_camera.ko拷贝到i.MX53开发板中,使用insmod tw2835_camera.ko命令将驱动加载到内核,这时会在系统的dev目录下生成两个设备节点,分别是video0和tw2835。video0用于视频采集,tw2835节点用于对TW2835芯片的工作状态进行控制。
测试程序使用V4L2提供的API接口函数实现视频采集[12],采用内存映射方法,并且每次采集100帧图像为一个周期视频,采集过程如图7所示。采集到的视频是test.yuv格式,可以使用YUVTools软件查看所采集到的视频文件。
图7 V4L2采集程序流程
本文TW2835驱动方案经过实际测试,能够支持四路NTSC/PAL/SECAM制式的模拟视频输入,同时支持四通道CIF分辨率输出和一通道D1分辨率输出,并可以通过应用程序进行TW2835工作方式控制,实现各通道之间视频的切换。采集到的视频输出效果如图8和图9所示。
本文针对TW2835功能复杂,控制困难等缺点,在Linux下采用模块化思想将TW2835驱动分为I2C设备驱动和V4L2底层接口驱动进行了实现,测试表明可采集到清晰稳定的D1、CIF、QCIF等分辨率的视频,并可实现多通道控制,位置控制等功能,同时提出了Linux下的I2C驱动和V4L2驱动实现的一般方法,对其它功能复杂的视频采集芯片的Linux驱动实现具有参考价值,并且利用多片TW2835芯片级联,可实现多路视频同时采集,在数字监控系统中具有广阔的市场前景。
[1]LIU Shunbo.Public safety of intelligent building systems[M].Beijing:China Communications Press,2010:109-113(in Chinese).[刘顺波.智能建筑公共安全系统 [M].北京:人民交通出版社,2010:109-113.]
[2]ZHOU Wenshu,PENG Hong.Design and application of TW2835in the video surveillance system [C]//The 2nd Asia-Pacific Conference on Information Theory and Technology,2011:19-23.
[3]XU Jia,CHEN Qi.Video driver development based on V4L2[J].Computer Engineering and Design,2010,31 (16):3569-3572 (in Chinese).[徐家,陈奇.基于 V4L2的视频设备驱动开发 [J].计算 机工程与设 计,2010,31 (16):3569-3572.]
[4]SHEN Wenjun.MENG Limin,FANG Lihua.Design and application of TW9910in the video surveillance system [J].Journal of Hangzhou Dianzi University,2010,30 (5):113-116(in Chinese).[沈文君,孟利民,方立华.TW9910在视频监控系统中的应用与设计 [J].杭州电子科技大学学报,2010,30 (5):113-116.]
[5]WEI Dongshan.Embedded Linux application development completely manual[M].Beijing:People’s Post and Telecommunication Publishing House,2009 (in Chinese). [韦东山.嵌入式Linux应用开发完全手册 [M].北京:人民邮电出版社,2009.]
[6]YU Haihang,DU Gang,SHI Renxie.Power management chip drive design based on I2Cunder Linux [J].Ordnance Industry Automation,2011,30 (6):78-90 (in Chinese).[于海航,杜刚,石仁协.Linux下基于I2C的电源管理芯片驱动设计 [J].兵工自动化,2011,30 (6):78-90.]
[7]LIU Yangyang,SHEN Xuanjing,WANG Yiqi,et al.Design and implementation of embedded intelligent monitor system based on ARM [J].Journal of Jilin University,2011,29(2):158-163 (in Chinese).[刘阳阳,申铉京,王一棋,等.基于ARM的智能监控系统的设计与实现 [J].吉林大学学报,2011,29 (2):158-163.]
[8]LIU Fei,ZHANG Xihuang.USB webcam driver development based on embedded Linux [J].Computer Engineering and Design,2008,29 (8):1994-1996 (in Chinese). [刘飞,张曦煌.基于嵌入式平台的USB摄像头驱动程序的实现 [J].计算机工程与设计,2008,29 (8):1994-1996]
[9]SONG Baohua.The detail of Linux device driver development[M].Beijing:People’s Post and Telecommunication Publishing House,2010 (in Chinese). [宋宝华.Linux设备驱动详解 [M].北京:人民邮电出版社,2010.]
[10]LIU Sheng,ZHAO Jingjing,FAN Xiuli.The embedded video surveillance system based on V4L2 [J].Microcomputer Applications,2011,32 (1):38-42 (in Chinese). [刘升,赵晶晶,范秀丽.基于V4L2的嵌入式视频监控系统 [J].微计算机应用,2011,32 (1):38-42.]
[11]ZHANG Le,ZHENG Shibao.Design of embedded intelligent video surveillance system based on wireless network [J].Microcomputer Information,2010,26 (10):55-57 (in Chinese).[张乐,郑世宝.基于无线网络的嵌入式智能视频监控系统设计 [J].微计算机信息,2010,26 (10):55-57.]
[12]CAO Zhanzhong,ZHOU Yu.Design of Linux video capture driver based on s3c2440 [J].Electronic Measurement Technology,2009 (2):108-111 (in Chinese). [曹占中,周余.基于s3c2440的Linux摄像头驱动开发 [J].电子测量技术,2009 (2):108-111.]