基于ARM核心的视频监控系统底层软硬件设计
2012-01-29曾维鹏蔡莉莎
曾维鹏,蔡莉莎
(海南软件职业技术学院 计算机系,海南 琼海 571400)
智能手机的巨大市场潜力与发展趋势,使得以ARM架构为核心的嵌入式芯片得到了广泛的使用.对于社会安全防范而言,视频监控系统由于有着较强的防范能力,已成为社会治安、小区安保等不可或缺的组成部分,而现今监控系统已经步入了数字化、网络化时代,以ARM为核心的视频监控系统得到了广泛的应用,本文主要从嵌入式系统的底层硬件设计、软件设计等方面介绍视频监控系统的设计方法.
1 以S3C2440为核心的ARM架构硬件设计
传统的视频监控系统一般采用C/S架构,主要分为服务器端与客户端,服务器端主要完成视频采集、压缩与传送等任务;客户端主要采用PC机,完成视频的解压、存储以及回放等功能.这种传统监控系统的视频监控终端从现场的摄像头捕获实时的视频信息,压缩之后通过以太网传输到视频监控服务器上.
在硬件设计上,视频监控采集系统已抛弃原有的PC机平台+视频采集卡的形式,而是采用体积小、功耗低的基于ARM片上系统+视频采集卡的方式.在主控芯片的选择上,由于三星的S3C2440性价比高、功耗低,且CPU本身含有视频采集接口[1],较符合视频监控系统的需求,所以选择此芯片作为主控芯片.除此之外,加上电源管理模块、接口模块(USB接口、串口、以太网口、JTAG接口)、存储器模块(SDRAM、NAND flash)以及摄像头传感器模块[2]等,构成了整个服务器端的底层硬件系统.
1.1 以太网接口设计
由于S3C2440本身没有以太网接口,需要在系统中扩展网络模块,本设计采用DM9000芯片,该芯片为10 M/100 M以太网物理层芯片,具有通用的处理器接口.模块与S3C2440接口如图1所示.其中CMD为命令类型引脚,在高电平时为数据周期,在低电平时为地址周期.可通过CMD与数据总线访问内部54个控制及状态寄存器.当AS9—AS8设置成高,SA7设置成低,SA6—4与TXD2—0匹配时,DM9000由AEN引脚唯一控制是否被选中.此外,DM9000工作在正常模式,TEST1—4依次为1、1、0、0.需要注意的是在硬件设计时加上25 M的晶振保证数据的收发正常.
图1 S3C2440与DM9000端口连接示意图
1.2 视频采集模块设计
视频采集模块采用OV9640图像传感器,是一款高集成度、高分辨率(1280×960)的CMOS传感芯片,内部集成了时序电路、模拟信号处理电路、数字信号处理电路.该芯片支持RGB(4∶2∶2),YUV(4∶2∶2),YCrCb (4∶2∶2)数据输出格式,内置138个设备控制寄存器,地址分别从0x00到0x8A,通过SCCB(serial camera control bus)接口可以方便地设置传感器视窗大小、增益、白平衡校正、曝光控制、饱和度、色调等.由于S3C2440芯片有一个专用的视频接口,所以CPU可以直接和CMOS图像传感器连接.图像传感器输出的数据及控制信号包括像素时钟(PCLK)、水平参考(HREF)、帧同步(VSYNC)和数据总线(D0—D7),分别和主处理器的相应信号相连.PCLK与HREF在处理器内部相与后产生有效的像素时钟信号,在有效时钟信号的上升沿或下降沿将数据锁定.模块和S3C2440接口电路如图2所示.在OV9640图像传感器中,如果输出YUV格式,要用到数据线的Y2—Y9;如果输出RGB格式,则要用数据线Y0—Y9.本设计中采用了YUV格式.
图2 S3C2440与OV9640接口
2 基于S3C2440的片上Linux系统构建
在硬件上搭建一个软件平台、即片上系统,一般首选Linux.一个完整的片上系统,包括完成U-boot的移植、嵌入式Linux操作系统内核移植以及嵌入式Linux操作系统的设备驱动程序的开发等工作.在片上系统的基础上,开发系统的应用程序.借助交叉编译工具,开发视频监控终端上运行的采集、压缩、传输程序的编写.
2.1 片上系统设计与制作
要将系统移植到嵌入式芯片上,首先需要定制一个专用的嵌入式操作系统,由于Linux内核源代码包中包含了所有的功能模块.系统中只用到了其中的一部分.因此,编译内核之前首先要配置内核,裁减冗余的功能模块,采用最为普遍的宿主开发模式,即在宿主机上编译内核及应用程序,然后通过网口下载到目标平台上运行,通过打印终端打印调试信息.具体步骤如下:
1)键入命令make menuconfig,对内核进行配置,选择YAFFS文件系统,支持NFS启动,启用USB设备支持模块,包括USB设备文件支持模块、USB主控制器驱动模块等;
2)用make dep命令生成内核程序间依赖关系;
3)用make zImage命令生成内核映像文件;
4)用make modules和make modules_install命令生成系统可加载模块.
这样就生成了zImage内核映像文件,将这个镜像移植到硬件的Flash中.要完成系统的移植,首先要解决硬件系统的引导问题,本设计采用移植U-boot1.1.6来完成系统的引导加载,这一过程需要下载S3C2440的专用U-boot,并通过超级终端完成U-boot的烧写;当烧写好U-boot后便可通过U-boot的引导来完成片上系统的移植.
2.2 扩展模块驱动程序的设计
本设计扩展了一些外部模块,在内核配置时需要完成驱动程序设计,驱动中需要提供基本的I/O操作接口函数open、read、write、close的实现、对中断的处理实现、内存映射功能以及对I/O通道的控制接口函数ioctl等,并把他们定义在struct file_operations中.这样,当应用程序对设备文件进行诸如open、close、read、write等系统调用操作时,嵌入式Linux内核将通过file_operations结构访问驱动程序提供的函数[3].接着把驱动程序编译成可以动态加载的模块,这样扩展模块就可正常工作了.
图3 摄像头file_operations结构中的数据结构
本设计以编写视频采集传感器OV9640 CMOS图像传感器驱动为例,Linux下编写驱动,首先要初始化OV9640,通过SCCB总线设置OV9640的工作模式,各种参数分配连续内存空间,容量与采集图像的点阵数相匹配,然后用request_irq()函数为OV9640登记中断,其中断号为06.当S3C2440捕捉到VSYNC信号时触发中断,把一帧图像数据拷贝到用户空间.如此反复,视频数据源源不断地被采集到SDRAM.摄像头file_operations结构中的数据结构如图3所示.
写好成员函数后,编写 module_init()和module_exit ().module_init()是驱动程序的入口,当用insmod命令加载模块时自动运行.此函数中包括:初始化CMOS图像传感器;分配连续内存地址空间;注册设备文件;登记中断.module_exit()函数在rmmod卸载模块时调用.函数功能包括:释放内存空间;释放中断;注销设备文件[4].至此,驱动模块编写好了,编译加载后,就可以像操作普通文件一样对摄像头进行读取数据了.至此,基于S3C2440的视频监控系统底层的硬件设计、片上系统移植与驱动程序开发基本完成,再加上视频采集模块的数据压缩算法、客户端视频解压等,构成一个完整的远程视频监控系统.
3 结论
本系统较传统视频监控系统的优势在于将操作系统集成在远程的监控端,远程摄像头的控制以及采集视频的处理都可在远程完成,将视频数据压缩以后再通过网络传送至服务器端,减少了大量的传送数据,有效地提高视频数据的传输速率.由于ARM在嵌入式领域技术相当成熟,功耗低,运行可靠,可在非常恶劣的环境下正常运行,符合在户外恶劣环境下使用.
目前,基于ARM为核心的片上系统远程视频监控系统广泛地应用于酒店监控、十字路口监控、小区安保等多种领域.在保安系统中,这一系统具有较强的适应性,符合数字化、网络化的发展趋势.在这一系统的基础上稍作修改,在视频监控模块中加入强光示警控制系统、声音警报系统等硬件模块,当远程客户端发现监视画面中有人为违法行为和动机时,通过远程操作现场的强光照射警示作案者,让作案者放弃作案行为,起到比较人性化的及时警示作用.
[1]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2009.
[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.
[3]刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006.
[4]王宪,刘井权,戴旻.基于ARM平台的远程视频监控系统的研究[J].微计算机信息,2007,23(1/2):178-180.