搜索
您的当前位置:首页基于linux和S3C2410a网络视频监控器设计

基于linux和S3C2410a网络视频监控器设计

来源:飒榕旅游知识分享网
478 信 息 湖州师范学院2006届优秀毕业论文汇编

信 息

基于linux和S3C2410a网络视频监控器设计 信息工程学院 电子信息工程 02531班 吴壮荣

【摘 要】 随着网络和多媒体技术的广泛应用,数字网络视频得到了飞速发展。尤其在监控领域,将传统的模拟视频监控信号转换为数字视频信号,利用嵌入式系统实现远程视频监控、可视电话和视频会议等应用已成为可能。并且利用现有IP网络设计一个不受距离限制的廉价通用网络视频监控设备成为了新的热点。本文根据这方面的应用需求提出一种设计方案。本方案的实现平台是基于S3C2410a的嵌入式硬件平台以及基于嵌入式Linux的软件平台,采用JPEG图象编码标准。最终实现一个具有实时视频采集、压缩、传输、可接入以太网的网络视频监控器。

【关键词】 abcARM2410a Linux JPEG 网络视频监控器

第一章 绪 论

1.1 监视器发展现状

目前,监视器产品可分为模拟视频监控和数字视频监控两大类。因前者技术发展成熟、性能稳定、价格低廉、在实际工程应用中仍有广泛应用,特别是在大、中型视频监控工程中的应用;而后者是新近崛起的以计算机技术及图像视频压缩为核心的新型视频监控系统,该系统解决了模拟系统部分弊端而迅速崛起,虽然仍需进一步完善和发展,但是因为模拟监控系统存在如下主要缺点:

① 通常只适合于小范围的区域监控 模拟视频信号的传输工具主要是同轴电缆,而同轴电缆传输模拟视频信号的距离不大于1Km,双绞线的距离更短,这就决定了模拟监控只适合于单个大楼、小的居民区以及其它小范围的场所;

② 系统的扩展能力差 对于已经建好的系统,如要增加新的监控点,往往是牵一发而动全身,新的设备也很难添加到原有的系统之中;

③无法形成有效的报警联动 在模拟监控系统中,由于各部分独立运作,相互之间的控制协议很难互通,联动只能在有限的范围内进行。

而数字化系统恰好能解决了以上问题,因此,视频监控系统从目前数控模拟系统与数字系统混合应用逐渐向数字系统过渡已成为大势所趋。

信 息 湖州师范学院2006届优秀毕业论文汇编 479

1.2 嵌入式linux与abcARM2410a开发板功能介绍

以应用为中心,以计算机技术为基础,软件、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统,称为嵌入式系统。嵌入式系统应其结构复杂,使用操作系统来管理软硬件资源已是或不可缺。

Linux作为一个成熟而稳定的网络操作系统。因其移植入嵌入式设备具有众多的其他操作系统无法比拟的优势,而得到越来越广泛的应用。首先,Linux的源代码是开放的,任何人都可以获取并修改,用之开发自己的产品。其次,Linux是可以定制的,其系统内核最小只有约134kB。一个带有中文系统和图形用户界面的核心程序也可以做到不足1MB,并且同样稳定。另外,它和多数Unix系统兼容,应用程序的开发和移植相当容易。同时,由于具有良好的可移植性,人们已成功使Linux运行于数百种硬件平台之上。

为在有限的时间里,开发出此次的应用系统——网络视频监控器。我选择了 abcARM2410a开发板作为开发载体。其主要硬件资源描述如下图1.1:

图1.1 abcARM2410a开发板硬件资源描述图 开发板软件资源: (1)BIOS启动

bootloader启动系统(可以设置启动时间); Xmodem支持Xmodem传输协议;

Set Kernel Parameter 支持设置内核参数(Set Partation支持设置分区,Update Flash支

480 信 息 湖州师范学院2006届优秀毕业论文汇编

持更新Flash)

(2)内核及驱动

Linux kernel 2.4.18 -使用2.4.18稳定内核

CRAM/EXT2/FAT32/NFS file system-支持CRAM/EXT2/FAT32/NFS/YAFFS等文件系统 System Interrupt & Timer Driver -系统中断和系统时钟驱动 Serial device driver -串口驱动

Block memory device driver -块设备驱动 Flash memory device driver -Nand Flash驱动

10Base-T external Ethernet device driver -外接10M以太网卡驱动 RTC (Real Time Clock) Driver -实时时钟驱动

USB Host driver- USB Host驱动(USB Slave -USB Slave驱动 ) LEDS-跑马灯灯驱动 (Buttons-用户按键驱动 ) Many Country Language Support-国际化支持 LCD-液晶(LCD)驱动Frame Buffer (3)应用系统(网络支持)

TCP/IP-完整的TCP/IP协议 (Telnet Server -Telnet服务器,Remote login (telnet) -Telnet远程登录 ,NFS-支持NFS Client )

File transfer (FTP client / server) -FTP传输服务(包括登录和服务器)

第二章 系统设计

本方案设计的是基于网络的实时视频采集、处理及传输系统。整个系统在嵌入式软硬件构架上实现,无需其它设备协助就能独立完成通用目的视频应用,比如视频监控和网络视频会议。

2.1 硬件系统概述

对本次设计的整个系统除外接的摄像头部分外,都是在三星S3C2410a板评估平台abcARM2410a(简称abcARM2410a板)上面实现的。只是开发出其中构造远程视频监控器所需要的部分资源:通过在USB HOST接口上外接一个带USB口的摄像头,将采集到的视频图像数据放入输入缓存区中。然后,运行移植到平台上的图像处理程序,对缓冲的图像数据直接进行相关处理,再保存并打成UDP包。最后,通过网络接口将图像发送到Internet上,远程端可通过相应软件,以访问开发板服务器平台形式,采集数据。

整个硬件系统如图2.1所示。

信 息 湖州师范学院2006届优秀毕业论文汇编 481

PC 摄像头 USB HOST控制器 UART 控制口 JTAG 调试口 10M以 INTENET 太网控 制器

2.2 软件系统概述 s3c2410处理器 64M SDRAM 32M NAND FLASH 图2.1 网络视频监控器硬件系统框图 整个系统软件是在嵌入式Linux基础之上构建的。abcARM2410a板使用的嵌入式Linux内核是s3c2410-kernel.tgz(适用于abcarm的内核源代码,内含各种外设驱动)。abcARM2410a板使用的YAFFS文件系统是针对NAND Flash设计的嵌入式文件系统,文件系统中包含应用程序、模块、配置文件、库等。本系统中的视频采集分两步实现:一是为USB口数码摄像头在内核中写入驱动,二是要再写入上层应用程序获取视频数据。整个软件系统如图2.2所示。

应用程序(图像采集、压缩、传输,协议栈) linux 芯片驱动 引导程序(vivi bootloader) 图2.2 软件系统结构图 USB摄像头驱动,CS8900以太网内核 系统的设计目标是设计一个工作在abcARM2410a开发板和嵌入式Linux平台上,将从摄像头端口采集的OV511A处理后输出的OV压缩算法数据通过摄像头本身约5:1压缩后,通过USB 1.1端口输入处理器,并将图像压缩,保存为JPEG格式的文件。程序调用Encoder编码器可以将多幅JPEG格式的图像合成一段AVI视频流,实现视频回放。最后,系统还可以通过以太网口将保存的图片和视频流传到服务器上或者开发出一个外接USB硬盘,实现网络监控。

系统的设计可以被分为以下几个大部分:

482 信 息 湖州师范学院2006届优秀毕业论文汇编

(1)嵌入式vivi bootloader与Linux内核的移植和编译,文件系统的安装; (2)基于嵌入式Linux视频采集模块的设计; (3)视频图像压缩模块的设计;

(4)基于嵌入式Linux的网络视频流模块的设计。 本章小结

本章概述实现网络视频监控器硬软件系统总体的设计框架,并对相应部分提出了具体的设计方案。

第三章 开发板嵌入式 Linux 系统概述

在专用的嵌入式板子运行Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:

1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。

2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。

3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。

4. 用户应用程序。特定于用户的应用程序。

下图3.1就是一个同时装有Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。

图3.1 固态存储设备的典型空间分配结构 3.1 Boot Loader 配置

嵌入式系统中Boot Loader的功能如同PC机上的BIOS,同为引导加载程序,是系统加电后运行的第一段软件代码。当系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令,并首先执行 Boot Loader 程序,所以它是否正常运行,

信 息 湖州师范学院2006届优秀毕业论文汇编 483

直接关系到系统能否正常启动。

本系统选用vivi作为系统的Bootloader,它是韩国Mizi 公司开发的适用于ARM9 处理器的Bootloader。它具有Bootloader典型的两种工作模式:\"启动加载\"模式和\"下载\"模式,这种区别仅对于开发人员才有意义。。启动加载模式可以在一段时间后(这个时间可更改)自行启动Linux 内核,这是vivi 的默认模式。在下载模式下,vivi 为用户提供一个命令行接口,通过该接口可以使用vivi提供的一些命令,如下表3.1所示:

命 令 Load Part Param Boot F1ash

vivi的实现,与一般BOOTLOADER一样分为2部分:stage1与stage2,因汇编部分执行简单的硬件初始化,C部分负责复制数据,设置启动参数,串口通信等功能,根据用途特征,分别用汇编和c语言来实现,以下简述其实现内容:

3.1.1 Boot Loader 的 stage1 3.1.1.1 基本的硬件初始化

这是 Boot Loader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):

1. 屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。

2. 设置 CPU 的速度和时钟频率。

3. RAM 初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。

4. 初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息来完成这一点。

5. 关闭 CPU 内部指令/数据 cache。

注意:一般Boot Loader初始化以下硬件设备在最后阶段,而vivi这在此阶段完成。

功 能 把二进制文件载入Flash 或者RAM 操作MTD 分区信息。显示、增加、删除、复位、保存MTD 分区 设置参数 启动系统 管理Flash,如删除Flash 的数据 表3.1 vivi提供的一些命令 484 信 息 湖州师范学院2006届优秀毕业论文汇编

这通常包括:(1)初始化至少一个串口,以便和终端用户进行 I/O 输出信息;(2)初始化计时器等。 在初始化这些设备之前,也可以重新把 LED 灯点亮,以表明我们已经进入 main() 函数执行。 设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。

3.1.1.2 为加载 stage2 准备 RAM 空间

为了获得更快的执行速度,通常把 stage2 加载到 RAM 空间中来执行,因此必须为加载 Boot Loader 的 stage2 准备好一段可用的 RAM 空间范围。

由于 stage2 通常是 C 语言执行代码,因此在考虑空间大小时,除了 stage2 可执行映象的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是 memory page 大小(通常是 4KB)的倍数。一般而言,1M 的 RAM 空间已经足够了。具体的地址范围可以任意安排,比如 blob 就将它的 stage2 可执行映像安排到从系统 RAM 起始地址 0xc0200000 开始的 1M 空间内执行。但是,将 stage2 安排到整个 RAM 空间的最顶 1MB(也即(RamEnd-1MB) - RamEnd)是一种值得推荐的方法。

为了后面的叙述方便,这里把所安排的 RAM 空间范围的大小记为:stage2_size(字节),把起始地址和终止地址分别记为:stage2_start 和 stage2_end(这两个地址均以 4 字节边界对齐)。因此:

stage2_end=stage2_start+stage2_size

另外,还必须确保所安排的地址范围的的确确是可读写的 RAM 空间,因此,必须对你所安排的地址范围进行测试。具体的测试方法可以采用类似于 blob 的方法,也即:以 memory page 为被测试单位,测试每个 memory page 开始的两个字是否是可读写的。为了后面叙述的方便,我们记这个检测算法为:test_mempage,其具体步骤如下:

1.先保存memory page 一开始两个字的内容。

2. 向这两个字中写入任意的数字。比如:向第一个字写入 0x55,第 2 个字写入 0xaa。 3.然后,立即将这两个字的内容读回。显然,我们读到的内容应该分别是 0x55 和 0xaa。如果不是,则说明这个 memory page 所占据的地址范围不是一段有效的 RAM 空间。

4.再向这两个字中写入任意的数字。比如:向第一个字写入 0xaa,第 2 个字中写入 0x55。

5.然后,立即将这两个字的内容立即读回。显然,我们读到的内容应该分别是 0xaa 和 0x55。如果不是,则说明这个 memory page 所占据的地址范围不是一段有效的 RAM 空间。

6.恢复这两个字的原始内容。测试完毕。

为了得到一段干净的 RAM 空间范围,我们也可以将所安排的 RAM 空间范围进行清零操作。

信 息 湖州师范学院2006届优秀毕业论文汇编 485

3.1.1.3 拷贝 stage2 到 RAM 中 拷贝时要确定两点:

(1) stage2 的可执行映象在固态存储设备的存放起始地址和终止地址; (2) RAM 空间的起始地址。

3.1.1.4 设置堆栈指针 sp

堆栈指针的设置是为了执行 C 语言代码作好准备。通常我们可以把 sp 的值设置为(stage2_end-4),也即在 1.1.2 节所安排的那个 1MB 的 RAM 空间的最顶端(堆栈向下生长)。

此外,在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提示用户我们准备跳转到 stage2。

经过上述这些执行步骤后,系统的物理内存布局应该如下图2所示。 3.1.1.5 跳转到 stage2 的 C 入口点

在上述一切都就绪后,就可以跳转到 Boot Loader 的 stage2 去执行了。比如,在 ARM 系统中,这可以通过修改 PC 寄存器为合适的地址来实现。

head.S 负责完成硬件初始化操作,具体分析见源码注释。 3.1.2 Boot Loader 的 stage2

正如前面所说,stage2 的代码通常用 C 语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。但是与普通 C 语言应用程序不同的是,在编译和链接 boot loader 这样的程序时,我们不能使用 glibc 库中的任何支持函数。其原因是显而易见的。

这就给我们带来一个问题,那就是从那里跳转进 main() 函数呢?直接把 main() 函数的起始地址作为整个 stage2 执行映像的入口点或许是最直接的想法。但是这样做有两个缺点:

1)无法通过main() 函数传递函数参数;

2)无法处理 main() 函数返回的情况。一种更为巧妙的方法是利用 trampoline(弹簧床)的概念。也即,用汇编语言写一段trampoline 小程序,并将这段 trampoline 小程序来作为 stage2 可执行映象的执行入口点。然后我们可以在 trampoline 汇编小程序中用 CPU 跳转指令跳入 main() 函数中去执行;而当 main() 函数返回时,CPU 执行路径显然再次回到我们的 trampoline 程序。简而言之,这种方法的思想就是:用这段 trampoline 小程序来作为 main() 函数的外部包裹(external wrapper)。 下面给出一个简单的 trampoline 程序示例(来自blob): .text

.globl _trampoline _trampoline:

bl main

486 信 息 湖州师范学院2006届优秀毕业论文汇编

/* if main ever returns we just call it again */ b

_trampoline

可以看出,当 main() 函数返回后,我们又用一条跳转指令重新执行 trampoline 程序――当然也就重新执行 main() 函数,这也就是 trampoline(弹簧床)一词的意思所在。 在vivi中采用如下的代码 实现 循环调用: main返回之后 就reset @ get read to call C functions

ldr sp, DW_STACK_START

@ setup stack pointer

// STACK_BASE+STACK_SIZE-4

// STACK_BASE = (VIVI_PRIV_RAM_BASE - STACK_SIZE)

//STACK从上往下用。 所以 STACK_START = STACK_BASE+STACK_SIZE-4

mov fp, #0 mov a2, #0 bl main

@ no previous frame, so fp=0 @ set argv to NULL

@ otherwise, reboot, //FLASH_BASE=ROM_BASE0 = 0x0

@ call main //如果正常,一去不复返的了

mov pc, #FLASH_BASE

3.2 定制嵌入式Linux内核

定制嵌入式Linux内核时,工作在abcARM2410a板上的嵌入式Linux内核的定制步骤与其它嵌入式平台的开发步骤相似,具有一定的通用性,所以在这里将不再详述,但是要注意以下几点:

(1)在解压缩Linux内核源代码后,假设源代码是linux-2.4.18.tar.gz,需要为源代码打上abcARM2410a板的支持补丁:%gzip-dc patch-2.4.18-tar.gz|patch-p0。

(2)在使用make menuconfig定制内核时,注意要让内核支持USB接口的摄像头,具体步骤为:在制定菜单中选择Multimedia devices→Video for Linux,这使得内核被配置了Video4Linux,为视频采集设备提供了编程接口;在菜单中选择USB Support→USB Multimedia devices→USB OV511 Camera Support,这使得在内核中加入了对4采用OV511接口芯片的USB数字摄像头的驱动支持。并钩选[ ] CS8900 support 和[ ] YAFFS filesystem on Nand flash选项。

3.3 嵌入式文件系统

本系统Boot Loader从NAND FLASH 启动,NAND FLASH 具有容量大,比NOR Flash 价格低等特点。整个系统采用NAND Flash 与SDRAM 组合,可以获得非常高的性价比。通常,S3C2410X具有三种启动方式,可以通过OM[1:0]管脚进行选择: OM[1:0]=00 时处理器从NAND Flash 启动;(本系统选用方式) OM[1:0]=01 时处理器从16 位宽的ROM 启动; OM[1:0]=10 时处理器从32 位宽的ROM 启动。

信 息 湖州师范学院2006届优秀毕业论文汇编 487

因为本系统要从NAND flash启动,所以选择YAFFS(Yet Another Flash File System)形式文件系统:它是一种专门为NAND闪存设计的嵌入式文件系统,适用于大容量的存储设备的日志结构文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。YAFFS文件系统是按层次结构设计的,分为文件系统管理层接口、YAFFS内部实现层和NAND接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去。与JYFFS相比,它减少了一些功能,因此速度更快,占用内存更少。 文件系统NAND flash 使用 mtd+yaffs, YAFFS文件系统编译与基本操作过程如下 (1) 在内核中建立YAFFS目录/fs/yaffs,并把下载的YAFFS代码(devextras.h, yaffs_fs.c, yaffs_guts.c,

yaffs_guts.h,

yaffs_mtdif.c,

yaffs_mtdif.h,

yaffsinterface.h,

yportenv.h,

yaffs_config.h, Makefile )复制到该目录下面。 (2)修改fs/makefile,添加如下内容: O_TARGET := yaffs.o

obj-y := yaffs_fs.o yaffs_guts.o yaffs_mtdif.o yaffs_ecc.o obj-m := $(O_TARGET) include $(TOPDIR)/Rules.make (3)/fs/Config.in

if [ \"CONFIG_MTD_NAND\" = \"y\" ]; then tristate \"Yaffs filesystem on NAND\" CONFIG_YAFFS_FS fi (4)/fs/Makefile

subdir-$(CONFIG_YAFFS_FS) += yaffs (5)Make menuconfig and select Y,如下图3.2

(6)make dep -> make and

图3.2 Yaffs Setup of Menuconfig download

kernel 488 信 息 湖州师范学院2006届优秀毕业论文汇编

image.

#cat /proc/filesystems ;结果显示如下图3.3

YAFFS文件系统测试

1)内核启动之后,启动信息中应该含有如下内容:

NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3.3V 8-bit) Scanning device for bad blocks

Creating 5 MTD partitions on \"NAND 64MiB 3,3V 8-bit\": 0x00000000-0x00020000 : \"vivi\" 0x00020000-0x00030000 : \"param\" 0x00030000-0x00130000 : \"kernel\" 0x00130000-0x01a30000 : \"root\" 0x01a30000-0x04100000 : \"user\"

2)如果在内核里面添加了proc文件系统的支持,那么proc中应该包含有关YAFFS的信息。 3)dev目录下的相关目录中包括有关NAND设备的信息。 4)建立mount目录 #mkdir /mnt/flash0 mount blockdevice设备:

#mount -t yaffs /dev/mtdblock/3 /mnt/flash0 #cp 1.txt /mnt/flash0

将文件拷贝到mount上的目录下后,umount设备,再次mount后可以发现拷贝的文件

图3.3 #cat /proc/filesystems命令结果显示图 信 息 湖州师范学院2006届优秀毕业论文汇编 489

仍然存在。这时删除该文件,然后umount,再次mount后可以发现拷贝的文件已经被删除,由此可见该分区可以正常读写。 5)在Flash上建立根文件系统:

# mount -t yaffs /dev/mtdblock/3 /mnt/flash0 #cp (your rootfs) /mnt/flash0 #umount /mnt/flash0

重新启动,并改变启动参数:

param set linux_cmd_line \"noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0\" 再次重新启动后,开发板就可以从Flash启动根文件系统了。 本章小结

本章主要介绍在abcARM2410a板上的引导加载程序 Boot Loader (vivi)的基本使用,并对基本的Boot Loader启动过程代码结合功能做了简要分析。同时,针对该开发板实现网络视频监控器,概述了嵌入式Linux内核的定制时遇到的主要注意问题,还对从NAND flash启动的YAFFS文件系统的编译安装及基本操作作了必要叙述。

第四章 图像处理模块

4.1 图像采集处理部分 4.1.1 图像采集硬件配置

(1)外接摄像头选择:采用含OV511的网眼V2000型号,因为开发板芯片本身带有两个支持USB 1.1协议USB HOST接口:该规范支持低速1.5Mb/s和全速12Mb/s的数据传输率,故摄像头采用USB口,又因此协议传输量不高,镜头(LENS)采用CMOS,相比CCD具有反应快、成本低等特点,最关键的是适应传输量要求——要在VGA(640x480)下达到30fps,30×640×480×2(16位彩色)=17Mb/s,PC camera压缩率5,数据量也要达到3.4Mb/s,故选择高像素的CCD就无必要。其图像传感器(SENSOR)为OV7620和数字信号处理芯片(DSP)为OV511,因为一般Linux内核都自带这两款芯片的驱动程序,方便移植。

(2)开发板上的USB HOST接口,如下图4.1所示

490 信 息 湖州师范学院2006届优秀毕业论文汇编

图4.1 USB HOST接口电路设计

4.1.2 图像采集软件配置

在嵌入式Linux的内核定制和编译阶段,已经加入了对Video4Linux模块以及OV511设备的支持,所以运行在Linux下的视频图像采集程序,可以通过Video4Linux模块提供的编译接口(API)从OV511设备中获取图像帧。

Linux内核中的USB Core为设备和主控制器提供API接口。USB Core包含所有的USB设备和主控制器的一些通用操作,为向上和向下操作提供一个接口。在Linux系统中,设备驱动可分为字符设备、块设备以及网络设备。其中,字符设备面向字符I/O操作,没有缓冲,顺序读取;而块设备面向数据块,所有操作都通过内核地址空间的I/O缓冲区完成,支持随机存取操作。USB设备通过快速串行通信的方式工作,应作为字符设备来处理。系统加载设备驱动的方式有模块加载和内核初始化加载两种:前者通过用户使用insmod命令动态加载到内核中,通过rmmod命令卸载驱动模块;本系统采用后者:把驱动编进内核,在内核初始化时自动加载。USB主口程序由HCD(主机控制器驱动)、USBD (USB驱动程序)以及客户程序组成。其中USBD负责管理所有HCD、设备驱动和所有连接到USB总线上的设备,是USB主机软件的核心。如图2所示,Linux系统中USB子系统采用分层结构,其中USBD和HCD提供了支持设备驱动程序开发的API。USB设备驱动程序不是通过I/O操作访问设备,而是通过USB Core提供的标准接口与设备交互,它采用由管道组成的通道与设备进行通信。设备驱动程序根据USBD创建所需的管道,并为其分配传输所需的缓冲空间。

USB的传输分为控制传输、中断传输、批量传输以及等时传输四种模式。对于时间性极强但是准确性不高的视频捕捉应用来说,摄像头应采用等时传输模式。Linux系统中,任何USB传输都需要通过URB(USB请求块)来实现。为了尽可能快地得到图像数据,需要加

信 息 湖州师范学院2006届优秀毕业论文汇编 491

大URB的缓冲,这样可以降低每个USB事务中握手信息所占的比例,提高有效数据传输比例。由于每次USB传输都要包括URB的建立、发送、回收、数据整理,而在这些阶段中不产生有效数据,因此可建立两个URB交替工作,一个URB在等待回收时初始化另一个URB。获得图像的过程如图4.2所示。

摄像头视频捕获程序的编写:

摄像头属于视频类设备,遵循的标准为Video for Linux (V4L)标准。这个标准定义了一套API接口,内核、驱动、应用程序都以这个接口为标准进行交流。目前的V4L涵盖了音视频捕捉及处理等内容,也包括USB摄像头。

Linux系统中一般的文件操作是通过read、write等系统调用完成,但这些系统调用是通过内核态与用户态之间相互进行数据拷贝实现的。对于图像数据来说,进行拷贝必然会增加时间开销,因此需要使用内存映射的办法来加以解决。

首先应申请足够大的内核态内存作为图像数据缓存,将URB带来的数据暂存;然后将其用remap_page_range函数映射到用户态空间。这样,用户态空间的图像处理程序就可以使用mmap()函数,直接读写内核态帧缓冲区,减少了额外开销。要进行视频捕捉必须用到VIDIOCMCAPTURE 和VIDIOCSYNC这两个ioctl函数。VIDIOCGMBUF包含有所用缓冲器的设置与地址。VIDIOCMCAPTURE用于开始捕捉;VIDIOCSYNC用于等待捕捉完成。为加快数据处理速度,一般使用双缓冲设置,即buffer0捕捉数据时,buffer1传输数据;buffer1捕捉数据时,buffer0传输数据。

图4.2 获得图像过程 再次发出URB返判断有无请求 当前帧结束 缓冲当前帧 丢弃当前帧 当前请求 492 信 息 湖州师范学院2006届优秀毕业论文汇编

整个图像采集程序的流程图如图4.3所示。将采集到的图像保存为JPEG格式,然后调用Mplayer中的Mencoder编码器,即可将多幅JPEG文件合成一段视频流,实现视频回放。

调用VIDIOCSYNC,等待图完成 图4.3 视频采集模块的工作流程 4.2 图像压缩处理部分

图像数字化是处理图像之前的基本步骤,目的是把真实的图像转变成处理器能够接受的存储格式。过程分采样与量化处理两步,采样的实质就是要用多少点来描述一张图像,比如,一幅640×480的图像,就表示这幅图像是由307200个点所组成。量化是指要使用多大范围的数值,来表示图像采样之后的每一个点。这个数值范围包括了图像上所能使用的颜色总数,例如,以4个bits存储一个点,就表示图像只能有16种颜色,数值范围越大,表示图像可以拥有越多的颜色,自然可以产生更为细致的图像效果。量化的结果是图像能够容纳的颜色总数。两者的基本问题都是视觉效果与存储空间的取舍问题。

在采样与量化处理后,才能产生一张数字化的图像。 数字化后的图像数据在计算机中一般有两种存储方式,一种是位图模式,而另一种是矢量图模式。 位图能够精确地描述各种不同颜色模式的图像画面,此种存储模式比较适合于内容复杂的图像和真实的照片。虽然矢量不会失真,但是代价是耗费大量的时间做一些复杂的分析演算工作,相比较适合存储各种图表和工程设计图,而一般图像文件较少采用矢量处理方式。

总体来看,位图占用的存储空间较矢量图要大的多,而矢量图的显示速度较位图慢。 而对于本系统而言,无疑处理速度更重要,而容量可以扩展。

本系统采用的图像格式为JPEG位图格式:JPEG几乎不同于当前使用的任何一种数字压缩方式,它无法重建原始图像。一般用来显示照片和WWW以及在线服务的HTML(超文

初始化摄像头 调用VIDIOCMCAPTURE 处理上一帧图像 开始 信 息 湖州师范学院2006届优秀毕业论文汇编 493

本标记语言)文件,它能保存RGB图像中的所有颜色信息。JPEG也是一种带压缩的文件格式,但在压缩时文件有信息损失。当需要在INTERNET上发布新闻图片时,一般以 .jpg格式的图片上载。

JPEG格式包含有颜色深度信息,在保存照片和具有平滑渐变或混合模式的图像时,最好选择JPEG格式。它的压缩比可以达到100:1,压缩比越高,图像质量受到的损失越大。使用时系统要选择合适的图像大小和分辨率。

JPEG格式的,640*480一桢约20K左右。由于视频采集模块获取的视频图像需要在以太网上传输,为了提高传输效率又保证视频图像质量,则需要将原始的视频图像进行压缩编码。本系统采用JPEG标准对视频图像进行压缩编码,编译如下: $tar xvzf jpegsrc.v6b.tar.gz $cd jpeg-6b $./configure $make $ls libj*

libjpeg.a libjpeg.doc $./configure --enable-shared $make clean $make $ls libj*

libjpeg.la libjpeg.doc

4.3 图像本地显示调试

4.3.1 windons xp下超级终端调试,利用vidcat测试ARMSYS2410与USB摄像头的连接

1.首先配置内核make menuconfig

(1)进入Multimedia devices ---> 选中video for Linux后退出; (2)进入USB Suppot, 在 ---USB Multimedia devices中选中 USB OV511 Camera Support后退出。 然后make zImage

2.烧录kernel

进入vivi,输入load flash kernel x进行kernel的烧录。 3.启动Linux

烧录结束后输入boot启动Linux。根据vivi中串口程序要求,对COM1口作如下图4.4设置:

494 信 息 湖州师范学院2006届优秀毕业论文汇编

如果此时网眼2000已经插入USB主接口,则启动信息中出现如下图4.5:

图4.4 COM1口设置

4.运行vidcat

shell启动后,输入命令行ln -s /dev/v4l/video0 /dev/video(或者在rcS文件中加入这一条) 然后输入:vidcat -s 640x480 -p c > test.jpg

运行完成后,即可查看test.jpg来观察抓图的效果。 本章小结

本章主要结合外接摄像头和开发板相关硬件:USB模块及数据通道,概述了图像的采集,压缩应用程序的选择,并给出了具体应用流程,以达到从外部采集图像数据到开发板预定存储区,并用vidcat抓图,以检测静态图像数据是否符合预定要求。

图4.5 超级终端显示结果 信 息 湖州师范学院2006届优秀毕业论文汇编 495

第五章 基于嵌入式Linux的网络视频流模块设计

5.1 网卡CS8900A驱动程序的移植 5.1.1 解压Linux内核源代码: #tar jxf linux-2.4.18.6.tar.gz

5.1.2 打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。

(1)指定目标平台。 移植前:

ARCH = $(SUBARCH)

移植后:

ARCH :=arm (2)指定交叉编译器。 移植前:

CROSS_COMPILE = 移植后:

CROSS_COMPILE :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu

注:这里假设编译器就放在本机的那个目录下。

5.1.3 添加驱动程序源代码,这涉及到以下几个方面

(1)从网上下载了cs8900.c和cs8900.h两个针对2.4.18内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/

并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在\"第二部分\"解释。

(2) 修改drivers/net/arm/目录下的config文件,在最后添加如下内容: Config ARM_CS8900 tristate \"CS8900 support\"

depends on NET_ETHERNET && ARM && ARCH_SMDK2410 help

Support for CS8900A chipset based Ethernet cards. If you have a network (Ethernet) card of

496 信 息 湖州师范学院2006届优秀毕业论文汇编

this type, say Y and read the Ethernet-HOWTO, available from as well as . To compile this driver as a module, choose M here and read . The module will be called cs8900.o.

(3) 修改drivers/net/arm/目录下的Makefile文件,在最后添加如下内容: obj-$(CONFIG_ARM_CS8900) += cs8900.o

(4) 在/arch/arm/mach-s3c2410/mach-smdk2410.c文件中,找到smdk2410_iodesc[]结构数组,添加如下如下内容:{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE} 修改之后变成了:

static struct map_desc smdk2410_iodesc[] __initdata = { /* nothing here yet */

/* Map the ethernet controller CS8900A */ {vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE} };

注:由于在驱动程序的开发的时候,在驱动程序当中所用到的跟设备有关的地址都是虚拟地址,也就是说驱动程序操作的都是虚拟地址,那么要使驱动程序对设备的操作反映到设备上去,就得将设备的物理地址映射到正确的虚拟地址上去,从而保证驱动程序对虚拟地址的操作也就是对相应的物理地址操作。以上添加的语句就是为了将网卡的物理地址(0x19000000)映射到vSMDK2410_ETH_IO所指向的虚拟地址上去,上面的结构还定义了网卡虚拟地址所占用的区间,也就是从vSMDK2410_ETH_IO开始的SZ_1M大小的去间,并指定了该区间所指向的域(的属性)。(在本开发板上,网卡占用的是CPU的nGCS3片选信号,也就是在Bank3,根据处理器的地址空间定义,这个地址应该是0x18000000,在2.4.18的内核当中,是用0x19000000来进行映射。)

(5) 在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件,其内容为: #ifndef _INCLUDE_SMDK2410_H_ #define _INCLUDE_SMDK2410_H_ #include

#define pSMDK2410_ETH_IO 0x19000000 #define vSMDK2410_ETH_IO 0xE0000000 #define SMDK2410_ETH_IRQ IRQ_EINT9 #endif // _INCLUDE_SMDK2410_H_

注:因为在网卡驱动程序当中,用到了一些常量,所以特意在此添加这个头文件。这个头文件定义了网卡的物理地址、虚拟地址以及网卡占用的中断线。

5.1.4 配置、编译内核。在内核顶层目录当中键入: #make menuconfig

信 息 湖州师范学院2006届优秀毕业论文汇编 497

Networking support ---> Ethernet (10 or 100Mbit) ---> [*] CS8900 support

将刚才添加的网卡驱动程序静态添加到内核当中。 最后进行内核编译。 #make

然后将镜像下载到开发板中去,内核就支持cs8900驱动了。

5.2 Linux中流数据的操作

在本设计中,数据在整个系统中是以流数据的形式存在的,Linux内核为流数据提供了一个标准的编程接口,这种接口为数据从外部设备经内核到达用户进程提供了一个全双工通道。在这个通道中,数据的处理模块是作为可选的中间件由用户动态加载的,上面设计的视频压缩模块就是这样的一个中间件。

5.2.1 AVI流式文件格式

本系统主要是用于实时视频应用,所以需要系统提供对流式文件格式的支持,这样在接收方利用标准的流视频播放软件,如MMedia Player就可以观看实时传输的视频.在本系统中采用了开放的AVI流格式.压缩后的视频数据在传输前需要对其进行AVI编码。AVI文件的基本组织单元为AVI对象,每个对象由三个域组成:对象标识符域、对象大小域和对象数据域。AVI文件的高层逻辑结构也包含三部分:头对象、数据对象和索引对象。其中,头对象包含了许多全局信息,数据对象则包含了所有待播放的数据,头对象必须在数据对象之间被接收方接收并解释。

缩AVI压数据面: 编码视频 层 RTP

图5.1 网络视频流协议栈框图 INTERNET IPUDP/TCP层 控制面:RTCP层 控制面:RTSP层 协议栈 498 信 息 湖州师范学院2006届优秀毕业论文汇编

流视频协议介绍:

流视频协议是为了在客户机和视频服务器之间进行通信而设计和标准化的。根据它们的功能,与网络上流视频相关的协议分为三类。

(1)网络层协议:网络层协议提供了基本的网络服务支持。IP就是网络上流视频使用的网络协议。

(2)传输协议:传输协议为流服务提供端对端的网络传输功能。TCP、UDP、RTP和RTCP就是网络上流视频使用的传输协议。

(3)话路控制协议:话路控制协议定义消息和程序。RTSP就是一种话路控制协议。 为流视频设计的协议栈如图5.1所示。在发送方的数据面,压缩且经过AVI编码的视频数据被读出并在RTP/RTCP/RTSP层上打包,以提供定时和同步信息以及包的序列号。然后把这些打包的RTP数据流发送到UDP/TCP层和IP层,得到的IP包在网络上传输。在接收方则按照相反的方向处理。在控制面,RTCP包和RTSP包在UDP/TCP层上复用,并且被送到IP层,以便通过网络传输。 本章小结

本章主要对开发板上的用于连接INTENET的网卡CS8900A,在2.4.18内核中移植其驱动程序过程作了描述,并对JPEG压缩后的数据,如何在网络中传输作了分析,最终可以在远程端通过调用Mplayer中的Mencoder编码器,即可将多幅JPEG文件合成一段视频流,实现视频回放。

结 束 语

本文提出了一种基于三星S3C2410嵌入式微处理器和嵌入式Linux网络监控器的设计方案,系统采用JPEG编码标准,得到了较高的压缩比。经实验测试、在50Kbps~100Kbps的带宽下,对AVI(352×288,30fps)格式的视频有较好的表现能力。满足了在目前宽带环境中的网络视频监控的基本要求,有一定的实用价值。

但本次毕业设计,由于时间紧,要学习的内容多而杂,但也存在一些问题: 选择的载体不太适合,处理器ARM9,频率有限(206MHz),USB接口为1.1标准,其全速时为12Mbfs,相对来说,传输容量受限,清晰度不可能做的很高,有丢帧现象,而且许多功能还没开发出来。如语音模块等,需要进一步完善。

信 息 湖州师范学院2006届优秀毕业论文汇编 499

参考文献

[1]吴明晖主编,徐睿等编著.基于ARM的嵌入式系统开发与应用[M].北京:人民邮电出版社,2004.6

[2]孙天泽,袁文菊、张海峰编著.嵌入式设计及Linux驱动开发指南——基于ARM9处理器[M]. 北京:电子工业出版社,2005.6

[3]张嵛编著.32位嵌入式系统硬件设计与调试[M].北京:机械工业出版社,2005.5。 [4] Jobn Catsoulis著,徐君明,许铁军,黄年松等译.嵌入式硬件设计[M].中国电力出版社,2004.6。

[5] [美]Andrew.N.sloss ,[美]Dominic Symes,[英]Chris Wright著,沈建华译.ARM嵌入式系统开发——软件设计与优化[M].北京:北京航空航天大学出版社,2005.5。

[6]杜春雷编著.ARM体系结构与编程[M].北京:清华大学出版社,2003.2

Design of network monitor based on linux and S3C2410a Wu zhuangrong

Abstract:with the network and the multimedia technical of extensively applied, the numerical network video frequency got to fly to develop soon.Particularly in supervising and controling realm, supervise and control traditional emulation video frequency the signal convert into numerical video frequency signal, make use of built-in system to carry out a long range video frequency supervision and can see applications, such as telephone and video frequency meeting...etc. to have become possibility.And made use of an existing IP network to design 1 to be free from to be apart from a limiting cheap and in general use network video frequency supervision an equipments to become a new hot point.This text puts forward a kind of design project according to the applied need of this aspect.This project's carrying out platform is according to the built-in hardware terrace of the S3C2410 and according to the software terrace of built-in arm-Linux, the adoption JPEG portrait codes standard.Finally,carry out a have solid hour the video frequency collect, compress, deliver and can connect into an ether net of network video frequency monitor.

Key words: AbcARM2410a Linux JPEG network video frequency monitor

因篇幅问题不能全部显示,请点此查看更多更全内容

Top