微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ARM+Linux的视频采集编码系统设计

基于ARM+Linux的视频采集编码系统设计

时间:06-18 来源:互联网 点击:

摘要:本文设计了嵌入式远程监控系统中的视频采集端。提出了基于 ARM Linux的视频采集编码设计方案,采用 S3C2440 作为主处理器,选用 OV511+OV7650 构造USB 摄像头进行视频采集。介绍了USB 摄像头驱动程序的设计以及视频原始码流采集的实现过程。由于嵌入式Linux在各种视频设备中已经得到了广泛应用,故设计具有一定的通用性。

关键词:嵌入式;Linux;视频采集;S3C2440

引言

嵌入式系统由于其体积小可便携,较 PC机而言很有优势。随着计算机技术的发展,一些基于PC机的应用也得以在嵌入式系统上实现。由于 USB 接口摄像头价格低廉,性能较好,即插即用,加上Linux下有Video4Linux标准支持对其编程,很容易集成到嵌入式系统,因此嵌入式系统视频采集设备通常用 USB 接口摄像头。

1 芯片介绍

S3C2440 处理器采用ARM920t内核,0.13um的CMOS 标准宏单元和存储器单元,支持高速总线和异步总线模式;具有 1G字节寻址空间;支持外部等待信号延长总线周期;支持掉电时SDRAM 自刷新模式;支持从 NAND flash存储器启动;采用 4KB 内部缓冲器进行启动引导。采用写穿式(write-through)或写回式(write-back)cache 操作来更新主存储器;写缓冲器可以保存 16个字的数据和 4 个地址[1]。

OV511 是高性能摄像机到 USB 接口单片控制芯片,它极大的简化了单片 CMOS 图像传感器和USB 的接口,其片上增加256K DRAM 和一个 USB 收发器,可以很容易构成基于USB 的视频子系统。OV511 最大视频传输设计使系统能够以更加实时的方式获取大量的视频信息[2]。

OV7650是高集成度高分辨率的 COMS 图像传感器,它将所有摄像功能和矩阵处理功能都集成在片上。其像矩阵位 640*480 像素(30 万像素),支持VGA,QVGA ,CIF,QCIF四种分辨率,可进行编程控制[3]。

2 摄像头硬件

视频采集部分由 OV511 和OV7650组成。通过 SCCB 总线初始化OV7650和OV511 ,将OV7650设置为 CIF 采集,输出YUV422 数据流;将 OV511 配置为YUV422 格式输入,输出为YUV420 数据流。OV511 提供OV7650所需的控制信号,并接受来自 OV7650的同

步输出信号并将输入图像数据通过内置的 USB 控制器和外接的 USB 收发器经USB 总线送入ARM,然后进行压缩编码、发送等处理,其硬件框图见图 1。

3 USB 摄像头驱动

设备驱动程序可以看成 Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文件一样来操作外部设备,可以使用和操作文件中相同的、标准的系统调用接口函数来完成对硬件设备的打开、关闭、读写和 I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数[4]。

Linux 视频采集设备的正常运行依赖于对 Video4Linux标准的支持。Video4Linux设备的驱动程序需要提供基本的 I/O 操作接口函数 open ,read ,write和对中断处理的实现、内存映射功能以及对I/O 通道的控制接口函数 ioctl 的实现等,并把它们定义在 struct video_device中。所以首先在驱动程序中声明一个 video_device 结构,并为其指定文件操作函数指针数组fops 向系统注册。应用程序发出文件操作的相关命令时,Linux 内核根据这些指针调用相应函数,并将该结构作为参数传递给它们,实现驱动与内核之间的通信。

Linux 内核是依据设备号来操作设备文件的,内核中摄像头对应的设备文件名为/dev/video,主设备号是81,次设备号根据摄像头数目来确定,本系统中仅使用一个摄像头。因此没有此设备号,所以可以通过mknod /dev/video0 c 81 0来创建节点,驱动程序原理如图2。

Linux 系统通过URB实现USB 传输。为提高有效数据的传输速度可扩大 URB的缓冲来降低每个USB 事务中握手信息所占比例。每次 USB 传输都需要在操作系统中进行URB的建立、发出、回收和数据整理等阶段。可建立两个URB,当等待一个 URB被回收时,也就是图像正在被传感器采集时同时处理、初始化另一个 URB,并在回收后立刻将其发出。两个URB交替使用,大大提高了系统处理的时间效率。

在编译器部分将 Linux 下的摄像头驱动程序中Makefile 文件中相关行修改为CC=/opt/host/armv4l/bin/armv4l-unknown-gcc-linux,修改 Config.in 文件,这样在配置内核的时候才可以看见驱动程序的名称。同时对下列与处理器相关的部分进行修改,即可实现对S3C2440 的USB 驱动的移植。

(1)PCI 接口处理

由于S3C2440 的USB 主机控制器不包含 PCI 接口,因此需要删除 usb-ochi.c中与PCI接口相关的代码。

(2)寄存器地址设置

在usb-ochi.c中,使S3C2440 的USB 主机控制器

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

网站地图

Top