基于S5PV210的1080P网络摄像头设计

2014-12-23 01:06李宇成黄堂猛
计算机工程与设计 2014年11期
关键词:共享内存内核内存

李宇成,黄堂猛

(北方工业大学 机电工程学院,北京100144)

0 引 言

随着人们对视频监控的需求增加,嵌入式视频监控系统正日益得到广泛应用。但受技术和成本的约束,市场上的高清的IP Camera较为少见,以往仅TI的多媒体芯片功能较为突出,如TM320DM365[1]能够实现720p视频拍摄;TM320DM368[2]能够实现1080p拍摄。随着智能多媒体芯片的发展,高通、三星高性能多媒体芯片也在市场出现[3],且具有价格低廉、软件开放的优点,但鲜见高清网络摄像机方面的研究论文。本文设计一款基于三星高性能多媒体芯片的高清IP 摄像头。处理器采用三星公司CORTEXA8[4]芯片S5PV210,该芯片主频1 GHZ,支持1080P/30 fps H264[5]硬件编解码,支持CCD 和CMOS[6]摄像头。本文采用OmniVision 公司生产的500 万像素、功能强大的OV5642CMOS传感器,进行了S5PV210的摄像头接口设计与驱动设计。操作系统采用Linux 组织近年发布的Linux-3.8内核,对其新特性尤其在基于三星的多媒体框架方面进行了深入的研究,并用UML[7]语言进行描述;通过对驱动间共享内存探索与研究,将视频压缩参数,逼近S5PV210芯片的提供的最大参数1080P/30fps。

1 系统硬件设计

系统硬件架构如图1 所示,嵌入式处理器S5PV210接收来自视频采集模块采集的视频数据,同时利用内部硬件编码器进行H.264 高速压缩编码,然后将H.264 码流通过RTP 协议上传,客户端可通过VLC 播放器实时播放。其中,S5PV210 具有低功耗、高性能、低价格的特点,使用ARM V7指令集,64/32位内部总线结构,32/32KB的数据/指令一级缓存,512KB的二级缓存,可以实现2000DMIPS (每秒运算2 亿条指令)的高性能运算能力[8]。

图1 系统架构

1.1 视频采集模块

OV5642采用1.4 微米×1.4 微米的像素具有高灵 敏度,低串扰,低噪音等性能。具备自动图像控制功能:自动曝光 (AEC),自动白平衡 (AWB)、自动带式过滤器(ABF)、镜像和翻转、裁剪、窗口和平移等;以及图像质量控制功能:色彩饱和度、色调、清晰度 (边缘增强)、镜头校正、缺陷像素消除、噪音消除、防抖等。拥有标准串行接口 (SCCB),数字视频端口 (DVP)并行输出、双通道MIPI输出等接口。支持500万像素图像、支持自动对焦控制 (AFC)、AF VCM 驱动器。还支持60fps 的720p高清视频以及30fps的1080p高清视频[9]。

本文设计的OV5642 应用电路采用了双电源,分别为OV5642内部核心提供1.5 V、为IO 口提供2.8 V 电压,这样能保证与S5PV210的CAMERA 3.3V 接口直接相连。为了增强摄像头模块坑干扰能力和提高时钟信号的完整性,采用了有源晶振来提供时钟信号。

1.2 系统可行性分析

一般认为,内存带宽=内存时钟频率×内存总线位数×倍增系数/8。三星的S5PV210的最高的内存时钟频率是200M,内存总线位数32,倍增系数为1,可得内存宽带800 M。1080P一帧YUV420图像大小为3M,如果帧率为25fps,数据从OV5642 到内存需要75 M/s,从内存到MFC编码器需要75 M/s,共需要的内存带宽为150 M,因此,内存运行速度足够满足要求。摄像头设计的PLCK 频率96 M/s,8位数据线,可满足75 M/s的需求。S5PV210标称支持1080P/30fps的H264 的内部硬件压缩,但是,实测下来,在这个速度上运行不太稳定。因此,本系统设计帧率为25fps。

2 SCCB驱动程序设计

SCCB是简化的I2C 协议,因此SCCB驱动设计本质就是I2C[10]的 驱 动 设 计。随 着Linux 内 核[11,12]的 不 断 发 展,I2C设备的架构也在不断的改进和完善。

Linux内核虚拟了一条I2C总线,尽管其上挂的I2C 设备跟物理的I2C 设备一一对应,但是,虚拟的I2C 总线与硬件总线有所不同。物理I2C 总线的数量与处理器I2C 适配器数量相等,有多个。而在虚拟的I2C 总线上,同时挂载了系统全部的I2C设备。比如OV5642设备描述符 “0-003C”,“-”前面的0表示该设备挂载在S5PV210的0号I2C接口上,003C 表示OV5642 的物理地址,其余类推。例如在本系统中,是音频编解码芯片wm8580 设备描述符为0-001B,E2PROM 非易失数据存储器24c08设备描述符为0-0050。

图2表示了I2C_client设备和驱动匹配后生成的整个I2C设备数据结构信息。设备I2C_client由i2c_new_device()函数创建,并通过device_register()函数挂载到i2c_bus上。这样在/sys/bus/i2c目录下生成文件名为0-003C文件。一旦OV5642驱动与设备名匹配成功后,将执行对应的ov5642_probe ()函数,并为如图2 所示的OV5642数据结构分配内存,同时,初始化与摄像头属性相关的数据变量。

Linux老版本内核Clients驱动中xxxx_attach ()和xxxx_detach ()函数被新的内核中的xxxx_probe()函数代替,从而简化了驱动的架构,方便了用户对驱动的移植和编写。

通过i2c_set_clientdata (),将I2C_client 设备的driver_data指针指向v4L2_subdev视频系统子设备,并通过v4l2_set_subdevdata ()函数,将v4L2_subdev视频子设备的driver_data指针指向i2c_client设备。这样就在OV5642设备与v4L2_subdev视频子设备之间建立了对应联系。

虽然Linux-3.8内核在多媒体设备驱动中提供了摄像头的设备挂载接口,但OV5642驱动中没有实现与之对应的接口。为此,作者在图2 中的OV5642 设备数据结构里增加定义了media_pad变量pad。

如图3所示,pad在ov5642_probe()函数中被初始化。pad.flags=MEDIA_PAD_FL_SOURCE,说明该media_pad为数据源。v4l2_subdev中的entity:media_entity也在probe函数中被初始化,entity.type=MEDIA_ENT_T_V4L2_SUBDEV_SENSOR,指明entity为摄像头类。通过注册函数media_device_register_entity(),将entity挂载到media_device中的设备链表上。

与OV5642挂载到FIMC 上类似,作者也通过添加变量pad后,将MFC设备挂载到media_device设备链表上。以便实现FIMC,MFC 和OV5642 这3 个设备之间数据的高速访问。

图2 OV5642整体数据结构

图3 Entity图

当FIMC、MFC和OV5642 的设备中的media_entity都被初始化后,fimc_md_probe函数中的fimc_md_create_links()函数将把3个设备捆绑在一起,执行关系如图4所示。

经过图4连接后,FIMC,MFC和OV5642这3个设备“融合”成为一个设备。根据Linux内核编程机制,在同一设备中,数据可以共享,由此,能较好地解决各设备之间数据的高速互访。

在应用层open (“/dev/video1”)函数执行过程中,将会调用__fimc_pipeline_open ()函数中的fimc_pipeline_prepare()函数,此函数中的media_entity_remote_source()函数用于获取与参数pad连接的OV5642设备的media_pad。根据图4,通过media_entity_remote_sink (pad)函数获取MFC设备中media_pad。media_entity_to_v4l2_subdev (pad->entity)函数通过设备链表,查找到MFC设备中v4l2_subdev视频子设备。这样,如图5所示,FIMC设备就可以直接调用v4l2_subdev了。

图4 Link图

图6 OV5642设备访问流程

图6是用户程序通过视频设备结点/dev/video1访问OV5642设备流程。借助于所做的media_entity初始化和media_pad连接,我们实现了通过一个设备结点同时访问3个设备,从而在加速数据处理的同时,也简化了程序步骤。

3 MFC驱动程序设计

如图7所示,MFC 设备本身是一个ADT 抽象数据结构,本文利用V4L2接口,将原有的MFC 驱动加入多媒体框架中。与OV5642 中的media_pad 注册类似,在MFC驱动中主要设计了内存块的分配,其中包括FIMC 驱动中用的帧缓冲,相关内存参数保存在的mfc_men_alloc_arg和mfc_enc_exe_arg这2 个数据结构中供MFC 驱动和FIMC驱动访问。在mfc_probe()函数中通过执行platform_set_drvdata (pdev,mfc)函数,将dev->p->driver_data指针指向MFC (mfc_dev),从而为第4节中通过MFC驱动的dev获取mfc_dev做好准备。

图7 MFC设备

4 FIMC驱动程序设计

本系统中,很关键的是实现FIMC驱动和MFC 驱动共享内存。如果不使用FIMC和MFC共享内存,就会多一次内存拷贝,导致大大降低运行速度。如图8所示,V4L2设备内存是由vb2_queue结构中的vb2_mem_ops结构体操作分配的。

在Linux-3.8 中 的videobuf2-dma-contig.c文 件 中 提 供了vb2_mem_ops结构体。关键函数部分代码如下:

图8 多媒体驱动架构

因为alloc_ctx=fimc->alloc_ctx,所以conf->dev为FIMC 设备;可见dma_alloc_coherent仅仅能为设备FIMC分配内存,无法与mfc设备共享内存。

经过前述节2处理,FIMC 设备与MFC 设备已经捆绑在一起。现在,需要为两设备分配共享内存。为此,需要重新实现vb2_men_ops结构体。下面是关键函数*vb2_dma_contig_alloc()中的修改情况,其中黑体字部分为新增加的内容。 void*fimc_vb2_dma_contig_alloc(void*alloc_ctx,unsigned long size)

{ struct vb2_dc_conf*conf= (struct vb2_dc_conf*)alloc_ctx;

struct mfc_dev*mfc =dev_get_drvdata (conf->dev);//获取MFC设备

buf=kzalloc(sizeof*buf,GFP_KERNEL);

call_mfcsubdevcore (mfc->subdev,ioctl,IOCTL_MFC_GET_IN_BUF,&in_param);//为MFC 分配内存

buf->vaddr=in_param.args.mem_alloc.v_addr;

//将MFC内存的虚拟地址传递给FIMC设备

buf->dma_addr =in_param.args.mem_alloc.p_addr;

//将MFC内存的物理地址传递给FIMC设备

其中,call_mfcsubdevcore定义如下:

#define call_mfcsubdevcore(sd,op,args...)\

(((sd)->ops->core->op)?((sd)->ops->core->op (args)):0)

图9 应用层程序流程

如上所示,进行初始化内存分配时,首先分配MFC 内存,然后将MFC内存参数传递给FIMC 设备,使得FIMC设备能够与MFC设备实现内存共享。

本系统中,各个驱动程序之间具有顺序依赖关系,因此,必须依次加载。首先注册MFC 驱动,其次注册FIMC驱动,然后是加载多媒体驱动。OV5642驱动由多媒体驱动中的probe()函数完成。下面是实现这一过程的代码:

5 应用程序设计

如 图9 示,应 用 程 序 调 用open 函 数 打 开 “/dev/video1”,获取该设备的句柄。待各个驱动初始化完,应用程序调用ioctl(VIDIOC_REQBUF)函数分配4帧视频缓冲内存供FIMC和MFC设备共享。接着初始化输入、输出队列。在运行的过程中,空白 (或旧)数据帧内存排在输入队列里,准备接收来自摄像头的采集数据;新鲜数据帧内存排在输出队列里,供MFC设备压缩处理。

接着初始化socket通信,传输层使用UDP协议,应用层基于RTP协议,然后,调用STREAMING_ON 开始采集 数 据 流。此 后,FIMC 驱 动 通 过ITU-601 协 议 接 收OV5642传来的数据,存入待处理队列,内核通知应用层POLL ()函数,数据接收成功;然后从共享内存的输出队列中获取索引,再调用VIDIOC_ENCODER_CMD 进行压缩。压缩完毕后,将旧数据帧内存重新放回输入队列。同时,将压缩好的数据打包发送到上位机,再由上位机存储和实时播放。

6 实验结果

测试平台是戴尔OPTIPLEX 330,双核处理器1.8 GHz,内 存1.98 GB,播 放 器 采 用 的 是vlc-media-player-0.9.8a-win32.exe。图10为S5PV210开发板将OV5642摄像头图像数据压缩成H264格式,再由Linux应用程序打包成RTP包并发送给PC机,最后由VLC media player在PC上实时播放的快照。实测VLC media player播放网络摄像头发送过来实时视频流时的参数:视频流编码格式为H264,分辨率为1920*1088即1080P,比特率为3 Mb/s。

图10 VLC media player播放时的快照

7 结束语

本文提出了一种基于S5PV210的1080PIP Camera设计方案。首先描述了该系统的总体硬件架构及可行性分析,介绍作者自行设计制作的OV5642 摄像头。然后,详细给出了基于Linux-3.8内核的多媒体架构设计,其中,重点介绍了作者设计的设备驱动之间共享内存的解决方案,以及Linux应用层程序设计。经过VLC media player播放测试,本系统可实现1080P/25fbs流畅、稳定、动态的视频流。本系统具有低成本、高性能的特点,在高清视频监控市场上具有较好应用潜力。

[1]YU Xiao,LIU Xiaowen,LIU Zhongyu,et al.The design of underground multimedia environmental awareness node based on WIFI[J].The Computer Measurement and Control,2012,20 (9):2520-2522 (in Chinese). [俞啸,刘晓文,刘忠育,等.基于WIFI的井下多媒体环境感知节点设计 [J].计算机测量与控制,2012,20 (9):2520-2522.]

[2]LI Yucheng,LI Cong.The video processing and software design based on DM368 [J].The Computer Measurement and Control,2013,21 (10):2865-2867 (in Chinese).[李宇成,李聪.基于DM368的视频处理及软件设计 [J].计算机测量与控制,2013,21 (10):2865-2867.]

[3]TONG Fangyuan,YU Qiang.Real-time video transmission system based on Android [J].Computer Engineering and Design,2012,33 (12):4639-4642 (in Chinese).[童方圆,于强.基于Android的实时视频流传输系统 [J].计算机工程与设计,2012,33 (12):4639-4642.]

[4]LIU Hongtao,ZOU Nan.Development design based on ARM cortex-A8 [M].Electronic industry press,2012 (in Chinese).[刘洪涛,邹南.基于ARM Cortex-A8处理器的开发设计 [M].电子工业出版社,2012.]

[5]International telecommunication union. ITU-T H.264[S].2009.

[6]XIONG Ping.The contrast between CCD and CMOS image sensor[J].Semiconductor Optoelectronic,2004,25 (1):1-4 (in Chinese).[熊平.CCD 与CMOS图像传感器特点比较[J].半导体光电,2004,25 (1):1-4.]

[7]XIE Benju,LI Xiaona,GONG Shengwen.UML and Rational Rose 2003from entry to the master[M].Electronic Industry Press,2010 (in Chinese).[解本巨,李晓娜,宫生文.UML与Rational Rose 2003 从 入 门 到 精 通 [M].电 子 工 业 出 版社,2010.]

[8]Samsung electronics company limited S5PV210RISC microprocessor.S5PV210_UM _REV1.1.pdf [EB/OL].http://www.samsungsemi.com,2011.

[9]Omni vision technologies,Inc OV5642color 5megapixel image sensor with OmniBSITMand embedded True FocusTMtechnology.OV5642_CSP _DS_1.11 _OVT.pdf [EB/OL].http://www.ovt.com/support/datasheet.php,2009.

[10]FAN Enkui,CHEN Yajun.Embedded Linux2.6the I2Cbus and device driver analysis and implementation [J].Microcomputer Application,2009,30 (6):71-75 (in Chinese). [范恩魁,陈亚军.嵌入式Linux2.6I2C 总线及设备的驱动分析与实现 [J].微计算机应用,2009,30 (6):71-75.]

[11]WANG Honghui.Practical guide of embedded systems Linux kernel development:ARM platform [M].Electronic Industry Press,2009 (in Chinese). [王洪辉.嵌入式系统Linux内核开发实战指南:ARM 平台 [M].电子工业出版社,2009.]

[12]Li Quanxi,Liu Peiqian,Li Changyou.Research on embedded video monitoring system based on Linux [J].International Conference on Computer Engineering and Technology,2009.

猜你喜欢
共享内存内核内存
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
通过QT实现进程间的通信
“春夏秋冬”的内存
Linux内核mmap保护机制研究
基于Linux内核的文件服务器模型的研究与构建
基于PCI总线的多处理器协同机制研究
内存搭配DDR4、DDR3L还是DDR3?