微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于嵌入式Linux的3G无线视频终端的设计与实现

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

时间:07-10 来源:21ic 点击:

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

  NF_IP_LOCAL_IN

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

  NF_IP_FORWARD

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

  NF_IP_LOCAL_OUT

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

  NF_IP_POST_ROUTING

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

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

  参数是:

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)函数关闭设备文件,终止图像采集。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top