基于嵌入式Linux的3G无线视频终端的设计与实现

发布者:RainbowDreamer最新更新时间:2013-10-26 来源: 21ic关键字:3G模块  Linux  无线视频终端 手机看文章 扫描二维码
随时随地手机看文章
  随着网络技术和嵌入式技术的迅猛发展,通过网络来实现视频监控已经得到了广泛的应用,3G网络以其高带宽使得传输流畅的视频信息成为可能,本文在采用3G技术的基础上设计了一款基于嵌入式Linux的无线终端,在数据处理部分采用了Linux的Netfilter架构,通过挂载钩子函数来实现数据包在内核态的获取及高效转发,并且通过在Linux内核开辟一片缓冲区,解决了视频服务器与3G模块拨号延时而造成的速率不匹配的问题,减少了数据丢包。配合Netfilter用户态管理工具iptables的使用,可实现包过滤防火墙,及NAT等功能,从而便于本系统对流经其数据包的管理。

  另一方面对嵌入式Linux的视频采集程序的设计进行了详细的介绍,并将其实际应用到了本系统的数据采集模块中去,完成了数据的采集工作,同时针对目前市场上对与3G模块通常只提供Windows CE下的驱动这一情况,开发了嵌入式Linux系统下的3G模块驱动程序,在软件设计上充分发挥了开源软件的优势,采用高效的Xvidcore编解码库,来完成视频的编码,以及使用PPP源码来编译拨号上网工具,成本低廉并且缩短了系统的开发周期,使得本系统具有较强的工程实用价值。

  1 系统硬件结构

  硬件上采用“ARM 3G模块”系统架构。ARM与3G模块采用分离模块的设计方法,通过USB线相连,较整体设计而言具有更好的灵活性,使得一些现有的以ARM为主处理器的系统能够很好地扩展3G功能,便于产品的过渡。本系统的核心处理器是S3C2440A,S3C2440A是一款由SamSu-ng半导体公司推出的基于ARM920T内核的16/32位RISC微处理器。内部带有全性能的MMU(内存处理单元),主频为400MHz最大可达到533MHz,提供了一个数字摄像头接口(Camera Interface)。具有高性能、低功耗、接口丰富和体积小等优良特性。而3G模块核心部件采用的是MC8630模块,该模块具有语音、短信和高速数据业务等功能,可以广泛应用于高速数据传输、安防、无线媒体、直放站监控、铁路终端和车载监控等领域。

  系统硬件结构如图1所示。


  2 系统软件设计

  系统主要由视频采集模块、数据处理模块、网络转发模块组成。

  2.1 视频采集模块设计

  根据项目的实际需要,在本系统中视频数据来源主要有两个方面:

  1)系统与可提供主动上传功能的视频服务器通过RJ45网线直接相接 主要用于完成多路视频图像采集。视频服务器的主要功能是将摄像头采集的数据完成编码压缩,并且将压缩的数据以IP包的形式发送给接收端,由于该类视频服务器通常是在局域网内使用,目前还很少有对于3G网络的支持,随着3G技术在国内发展的不断深入,将在很大程度上取代有线网络。所以本系统可作为现有视频服务器的3G功能扩展。针对在外接视频服务器时只需对收到的数据包进行转发而无需对IP数据本身做分析处理的问题,并且在系统启动到3G模块拨号成功获得IP地址之间会有一定的延迟,在本系统中提出了采用Linux的Netfilter架构的方法以及缓冲机制,通过在数据流经TCP/IP协议栈时挂载钩子函数,实现IP数据在内核态的获取,并且通过在内核开辟一块足够大的环形缓冲区来存储数据。由于系统需要频繁对缓冲区进行读写,为避免产生内存碎片,在本系统中采用了环形队列的数据结构。在3G模块获得IP地址后,再通过驱动读取缓冲区中的数据,由3G网络完成转发,从而降低丢包率并且提高数据包的转发效率。因为传统的方法是采用socket API来进行网络编程,其对数据的访问通常发生在用户态,对于Linux操作系统来说,用户进程的优先级和所占用的CPU时间要远远小于内核线程,同时内核进程拥有较高的执行优先度,故在网络布局允许获得IP数据包的条件下,将用户态的数据包获取功能载入内核态,可进一步提高系统的处理能力,增加系统的有效带宽,本方法还可用于其他对IP数据本身进行处理并且对处理效率有苛刻要求的系统中,例如:本方法在本实验室与某航空院合作开发的IP-TS协议转换器上也得到了成功的应用,具有一定的通用性。Netfilter是Linux 2.6.x系列内核提供的一套数据包过滤框架,基于该框架的软件能够实现如数据包过滤、网络地址转换(NAT)等功能。要使用Netfilter,在内核编译时设置“Network Packet Fihering”选项。Netfilter提供了一个抽象、通用化的框架,作为中间件,为每种网络协议(IPv4、IPv6等)定义一套钩子函数。对于Ipv4协议定义了5个钩子函数,这些钩子函数在数据报流过协议栈的5个关键点被调用,Netfilter可以在通过TCP/IP协议栈的路径中的几个定义良好的点上捕获数据包,IPv4中的一个数据包通过netfilter系统的过程如图2所示。

NF_IP_PRE_ROUTING

  在对数据包进行初始正确性检查(校验和等)后,截获该数据包。

  NF_IP_LOCAL_IN

  如果数据包将要到达本地主机,则捕获该数据包。

  NF_IP_FORWARD

  如果数据包将要到达某些其他主机,则捕获该数据包。

  NF_IP_LOCAL_OUT

  在本地捕获其目的地是外部的已创建的数据包。

  NF_IP_POST_ROUTING

  这是最后的钩子,在此之后将传输数据包。

  内核netfilter结构在/usr/src/inelude/linux/netfilter.h中定义,类似如下:

[page]

  参数是:

list

  Netfilter本身是一个钩子链;它指向netfilter钩子的头部,通常设置为{NULL,NULL}。

  hook

  该函数在数据包碰到钩子点时被调用。该函数与前面描述的函数相同,它必须返回NF_ACCEPT、NF_DROP或NF_QUEUE。如果返回NF_ACCEPT,则下一个钩子将被附加到将要调用的点。如果返回NF_DROP,则数据包被丢弃。如果返回NF_QUEUE,则对数据包进行排队。sK_buff指针被传递到该函数中,并用数据包信息如IP报头、TCP报头等进行填充,可以使用sk_buff结构指针来操作或删除数据包(要删除数据包,只需将skb指针设置为空即可)。

  pf

  协议簇;例如,适用于IPv4的PF_INET。

  hooknum

  钩子的挂载点,由于本系统不需要在本地对数据包进行任何处理,因此选择的挂在点为NF_IP_PRE_ROUTING,在对数据包进行正确性校验后就调用钩子函数处理数据包。Priority表明钩子的优先级,在本系统中采用高优先级处理NF_IP_PRI_FIRST。

  内核数据处理的关键是钩子函数的编写,此函数规定了数据包在到达时需要进行的处理过程。

  钩子函数框架如下:

设定好特定的钩子函数之后,调用函数

  int nf_register_hook(struct nf_hook_ops*req);

  将钩子函数注册至内核。一旦该结构注册到内核中,Linux将调用这里定义的函数来处理数据包。

  使用函数

  void nf_unregister_hook(struct nf_hook_ops*req);

  可以将已经注册入内核的钩子函数取消,此时,接收到数据包将按照内核的默认规则来进行处理。流程如图3所示。

2)直接采用CMOS摄像头作为视频采集装置 该视频采集模块在硬件上S3C2440带有CMOS摄像头接口,在开发板上通过称为CAMERA的接口引出,并且带有camera控制器,在本系统中使用了OmniVision公司的OV9650摄像头。S3C2440支持ITU-R BT601/656格式的数字图像输入,支持2个通道的DMA,Preview通道和Codec通道,参见图4。

Preview通道可以将YCbCr4:2:2格式的图像转换为RGB(16bit或24bit)格式的数据,并存放于为PreviewDMA分配的内存中,最大分辨率为640×480。主要用于本地液晶屏显示,Codec通道可以输出YCbCr4:2:0或YCbCr4:2:2格式到为Codec DMA分配的内存中。最大分辨率为4 096x4 096,主要用于图像的编解码处理。在本系统中使用的是Codec通道。

  视频采集模块的设计采用的是V4L2(Video for Linux Two)V4L2,它是Linux下开发视频采集设备驱动程序的一套规范,该规范采用分层的方法给驱动程序的开发提供了清晰的模型和一致的接口,并且正对视频设备的应用程序编程也提供了一系列接口函数。其中应用程序处于最上层,V4L2处于中间层,而实际的硬件设备则处于下层,其本身包括两层驱动结构,上层是videodev模块,下层为V4L2驱动程序。video-dev通过V4L2驱动程序的成员函数来调用V4L2驱动。在V4L2驱动的驱动程序初始化过程中,它首先枚举它将要处理的系统中的设备,为每个设备填充struct v412_device结构,并且将指向该结构的指针传递给v412_register_device()函数,该函数调用v4L2_deviee结构体中的初始化函数对设备进行初始化。当v412驱动程序初始化完成后,v412通过传递一个包含驱动程序成员函数,次设备号以及相关信息的结构给videod-ev,从而完成它将要处理设备在videodev的注册工作,当应用程序通过系统调用触发了某个驱动程序时,控制权首先传递给videodev中的函数,videodev将应用程序传递的文件或i节点结构指针转换为相应的v412结构指针,并调用v412中的处理函数。以本系统以OV9650摄像头为例,其驱动框架如图5所示。

视频采集过程如下,应用程序首先打开视频设备文件,摄像头在系统中对应的设备文件为/dev/camera,通过系统调用“open(“/ dev/camera”,O_RDWR)”函数打开该设备,获得一个文件描述符fd,利用ioctl(fd,VIDIOCGPICT,&capability)函数获取摄像头的相关信息,例如设备名称、支持的最大最小分辨率、信号源信息等,填充在结构体video_capability中,通过调用ioctl(fd,VIDIOCGPICT,&pict-ure)获取图像的相关信息如采集图像的对比度、亮度、调色板等属性,并且填充在video_picture结构体中,在获取这类信息后,可根据实际需要来对其重新赋值,具体做法是将需要设置的值赋给相应结构体,然后通过系统调用ioctl(fd,VIDIOCSPICT,&)函数写入设备。在图像获取方式上使用mmap()系统调用来实现内存映射达到各进程共享内层的目的,利用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。使用mmap方式获取图像数据,需要首先设置图像帧的缓冲区结构,即struct video_mmap,如每次采集帧数,图像高度、宽度,图像调色板格式等等。然后调用ioctl(fd,VIDIOCMCAPTURE,&grab_buf)启动捕获过程。调用iotcl(fd,VI-DIOCSYNC,&frame)等待采集完成,若该函数成功返回则表示采集完毕,采集到的图像将放在通过mmap()映射的内存区域内,读取该内存数据即可获得图像数据,其中frame为当前截取的帧数,V4L2允许一次采集多帧数据,可通过设置grab buf.frame来实现。调用close(fd)函数关闭设备文件,终止图像采集。[page]

  2.2 视频数据处理模块设计

  由视频采集模块获取的视频图像需要通过3G网络来进行传输,而从摄像头直接采集的未经压缩的数据量非常大,为了在不影响图像质量的前提下提高传输效率,本系统中对原始获得的视频图像进行了压缩编码。由于MPEG-4是专门为播放流式媒体的高质量视频而设计的,并且MPEG-4标准以其高压缩比、高质量、低传输率已经成为目前网络多媒体传输的主要格式和标准。它可利用很窄的带宽,通过帧重建技术压缩和传输数据,以求使得用最少的数据获得最佳的图像质量并且能够保存接近于DVD画质的小体积视频文件。在本系统中选用开源的Xvidcore作为视频压缩模块的核心算法。Xvidcore是一个高效而且便于移植的编码软件。它不仅支持Simple Profile和Advanced Profile,还支持I/P Frames B-Frames Interlacing和GMC,以钻石和方块模式来进行PMVFast和EPZS运行估计,是目前比较流行的MPEG-4编码软件。Xvidcore源码可从网上下载免费获得,目前最新版为xvidcore-1.2.2,它提供了一系列的库函数及接口函数供应用程序使用。但针对嵌入式系统平台,要使用该库需要将其移植到嵌入式系统中。移植过程如下:

  解压源代码:tar-zxvf xvidcore-1.2.2.tar.gz;在使用前需要对xvidcore-1.2.2进行交叉编译,步骤如下:

  1)设置环境变量:export=“xvidcore当前所在目录”;

  2)进入/build/generic目录;

  3)生成Makefrle:/configure-host=local hostbuild=arm-linux-gcc;//指定交叉编译工具以便进行交叉编译;

  4)编译源代码:make。

  将交叉编译生成的库文件libxvidcore.so.*拷贝到交叉编译器工作目录lib子目录中。完成编码库的移植工作。

  以上对个独立模块进行了介绍,在软件实现上对系统进行了整体设计,将各个模块有机的组合在一起,并充分考虑了系统的可扩展性。

  主要结构体如下:

以视频压缩模块为例,其软件流程如图6所示。


2.3 网络转发模块设计

  在完成对采集图像的压缩或者接收完视频服务器后,需要将数据通过3G网进行转发,完成网络数据转发通常采取的办法是利用Linux提供的socket API进行,socket给用户提供了统一的编程接口,网络传输协议通常有TCP和UDP两种,对于TCP每次要通过3次握手建立连接,在等待乱序及重传丢失数据时会产生较大延时,而UDP又缺乏流量控制,所以都不太适用于实时数据传输,在这种情况下运行于UDP之上的RTP则具有很大的优势,目前对于有实时要求的数据传输RTP是最好的协议,故在本系统中使用了RTP协议作为数据传输协议,流程如图7所示。


2.4 3G模块驱动设计及联网

  3G模块与ARM是通过USB相连的。无线终端到3G网络的连接是通过PPP协议实现的,PPP协议是一种点对点串行通信协议,为在点对点连接上传输多协议数据包提供了一个标准方法。由于目前嵌入式市场上的3G模块基本上都是提供Windows CE操作系统下的驱动程序,但对于嵌入式Linux下面的目前还没有驱动支持,所以为本系统开发了3G模块的驱动程序。要完成3G模块的拨号上网功能,需要3个层面的支持:1)是内核层面;2)驱动层面;3)应用程序层面的支持。内核层面主要是通过对内核的重新配置来完成,由于3G模块与ARM通过USB线连接,而上层的PPP通信采用的是串行协议,所以要在内核中加入USB转串口的支持,通过makemenuconfig命令进入内核配置界面,依次选择Device Drivers->USB support->USB Serial Converter Support选择USB Generic Serial Driver按两次空格键使项目前加『*』将其编译入内核,其中加*为编译成内核模块,加M为编译为模块。由于采用的是PPP协议,故要在内核中加入PPP的支持。进入内核配置界面以后,依次选择DeviceDrivers->Network device support->PPP(point-to-point)protocol support选中,将PPP编译入内核,同时选择PPP展开项,将其全部编译入内核,保存退出。对于驱动层面,3G模块的驱动开发主要是通过修改两个文件generic.c以及usb-serial.c,其中generic.c为USB通用程序,usb-serial.c为USB转串口程序。通过在其中加入一些网络层的hook函数来达到对上层协议的支持。将修改过后的文件复制到/linux2.6.29/drivers/usb/serial,重新编译内核,生成zImage镜像,然后下载到板子上。完成3G模块驱动的设计以及内核对PPP协议的支持,对于拨号上网应用程序的支持,主要是通过PPP提供的两个工具pppd和chat来实现的,其中PPP提供了一种点对串行线路上传输数据流的方法,chat主要用于拨号并等待提示。可从网上下载PPP源码,在本系统中采用的版本为PPP-2.4.0,下载后要解压并且根据目标板的类型来进行交叉编译得到拨号程序。

  3 结束语

  本文在一块ARM开发板上实现了多种功能,包括无线数据视频终端,通过外接视频服务器实现了现有视频服务器的3G功能扩展,通过采用了Netfilter与socket结合的方法,将数据包获取功能从用户态载入Linux内核态,避免了数据的内存拷贝,提高了处理效率,同时引入内核缓冲机制。解决了3G拨号延时而造成的视频服务器丢包问题,配合Netfilter用户工具iptables的使用,可以在本系统上实现NAT,包过滤防火墙等功能。方便对流经系统数据包的管理。

  针对目前市场上的3G模块大多只提供Windows CE下驱动这一问题,开发了3G模块驱动,使得现有3G模块可使用与嵌入式Linux系统下,用户可直接在此基础上通过socket进行编程,而无需考虑底层的硬件通信问题。在软件设计上充分发挥开源软件的优势,采用Xvideore进行视频编码,以及PPP源码编译拨号软件等,缩短了系统开发周期,系统在软件的整体设计上提出了一套相对通用的软件架构,可方便实现功能的扩展及升级。

关键字:3G模块  Linux  无线视频终端 引用地址:基于嵌入式Linux的3G无线视频终端的设计与实现

上一篇:基于MiniGUI的数字加密电话系统GUI设计
下一篇:ARM Cortex-M3的SRAM单元故障软件的自检测研究

推荐阅读最新更新时间:2024-03-16 13:29

OK6410A 开发板 (八) 50 linux-5.11 OK6410A 基于VMA的sys_mmap与sys_brk
前提 A 用户空间虚拟内存的管理机制VMA B 用户空间物理内存的管理机制(CONFIG_FLATMEM内存模型下的struct page的管理) mmap 和 brk 通过封装 A 和 B , 完成了 对 用户空间虚拟物理内存的管理 代码流程 mm/mmap.c:190:SYSCALL_DEFINE1(brk, unsigned long, brk) mm/mmap.c:1641:SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, mm/mmap.c:2953:SYSCALL_DEFINE2(munmap, unsigned long, a
[单片机]
Windows上网本后来居上 因用户不习惯Linux
据国外媒体报道,英国调研机构Ovum分析师劳伦特·拉查尔(Laurent Lachal)周三指出,尽管Linxu在上网本市场领先一步,但Windows已后来居上。 拉查尔说:“在Linux强势起步之后,Linux上网本的销售量已经被Windows上网本反超。” 全球第一台上网本采用Linux系统,但随后,PC厂商发现Windows上网本更受欢迎,因为很多用户并不习惯于Linux界面。正因为如此,在菲律宾,华硕所有型号的易PC均已放弃Linux系统。 尽管如此,Linux又找到了新的市场,即小型、掌上互联网设备,如苹果的iPod Touch。拉查尔称,Linux在手机操作系统发展已久,因此地位可能会很稳
[手机便携]
基于嵌入式Linux与QT的汽车虚拟仪表设计
  摘 要:为了简化汽车内部控制系统,降低汽车制造成本,提高人车交互界面的友好度,设计并实现了一种新型的汽车虚拟仪表。采用以ARM 处理器S3C6410为核心的硬件平台和以嵌入式Linux系统为核心的软件平台,并在此基础上采用开放源代码的图形界面库QT开发仪表终端应用程序。经试验验证,虚拟仪表系统具有成本较低、界面友好、反应灵敏等特点,并在跨平台性、可扩展性等方面得到了显着改善。   0 引 言   仪表作为汽车整个系统中十分重要的部分,是提高汽车综合性能的重要方面之一。随着计算机软硬件技术、总线技术、电子技术等的快速发展,控制系统臃肿、接线布线复杂、占用空间大的传统电磁机械仪表渐渐被淘汰,虚拟仪表正以传统机械仪表无法比拟的速度迅
[单片机]
基于嵌入式<font color='red'>Linux</font>与QT的汽车虚拟仪表设计
linux内核移植-移植2.6.35.4内核到s3c2440
硬件平台:FL2440 主机平台:Ubuntu 11.04 交叉编译器:arm-linux-gcc 4.3.2 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/6604616 本来是想移植最新的内核2.6.39但是总是在编译快完成的时候报错,有人说是新的内核对arm平台的支持不好,所以就降低了一下版本,这里移植2.6.35.4内核 一、准备工作 1、下载 解压内核 从官网上下载linux-2.6.35的内核, ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ ,文件不大,约85M。 新建一个工作目录s3c2440
[单片机]
基于tiny4412的Linux内核移植 -- eMMC驱动移植(六)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 eMMC:KLMxGxFE3x-x00x 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 概述 eMMC驱动在内核中也已经支持好了,代码在:
[单片机]
基于tiny4412的<font color='red'>Linux</font>内核移植 -- eMMC驱动移植(六)
ARM Linux根文件系统Root Filesystem的制作
http://xianzilu.spaces.live.com/blog/fakehandlerpage.aspx?wa=wsignin1.0 http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!290.entry 关于根文件系统的制作,网络上有很多文章,大多数都只讲到建几个目录,然后用Busybox做个Shell,有很多关键的东西没有说。经过很长时间的摸爬滚打,我终于能够白手起家建立一个根文件系统了。其实我也不懂得原理,只是告诉大家我的作法,其中也不免有错误,欢迎大家指正。 首先介绍根文件系统的组成:目录、Shell、库、脚本,一个个来。 目录 根
[单片机]
基于S3C2440的嵌入式Linux驱动——看门狗(watchdog)驱动解读
本文将介绍看门狗驱动的实现。 目标平台:TQ2440 CPU:s3c2440 内核版本:2.6.30 1. 看门狗概述 看门狗其实就是一个定时器,当该定时器溢出前必须对看门狗进行 喂狗“,如果不这样做,定时器溢出后则将复位CPU。 因此,看门狗通常用于对处于异常状态的CPU进行复位。 具体的概念请自行百度。 2. S3C2440看门狗 s3c2440的看门狗的原理框图如下: 可以看出,看门狗定时器的频率由PCLK提供,其预分频器最大取值为255+1;另外,通过MUX,可以进一步降低频率。 定时器采用递减模式,一旦到0,则可以触发看门狗中断以及RESET复位信号。 看门狗定时器的频率的计算公式如下
[单片机]
基于S3C2440的嵌入式<font color='red'>Linux</font>驱动——看门狗(watchdog)驱动解读
stm32上移植linux的实操案例经验分享
刚从硬件跳槽为嵌软时,没有任何一丝的准备。一入职,领导就交代了一项特难的任务——在stm32上移植linux! 瞬间我就懵了,没办法硬着头皮上吧,先搜集资料,我之前跑的是ok6410的板子上运行的linux,现在是在stm32上移植,以前stm32倒是玩过,研究生期间就捣鼓过它,但现在还没从抓烙铁的硬件当中缓过神来,就转到嵌入式软件的开发,更头疼的是stm32没有MMU!没有MMU!找了一下,好吧,有个uClinux! 于是开始学习各种相关的知识,了解到linux的启动一般是u-boot——》liunx内核——》根文件系统,那么首先要做个基于stm32的u-boot,先初始化时钟、外设、中断什么的,看了韦东山老师的视频感觉
[单片机]
stm32上移植<font color='red'>linux</font>的实操案例经验分享
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved