收藏 分享(赏)

基于ARM的视频采集系统的设计与实现.doc

上传人:精品资料 文档编号:10532855 上传时间:2019-11-26 格式:DOC 页数:45 大小:388.36KB
下载 相关 举报
基于ARM的视频采集系统的设计与实现.doc_第1页
第1页 / 共45页
基于ARM的视频采集系统的设计与实现.doc_第2页
第2页 / 共45页
基于ARM的视频采集系统的设计与实现.doc_第3页
第3页 / 共45页
基于ARM的视频采集系统的设计与实现.doc_第4页
第4页 / 共45页
基于ARM的视频采集系统的设计与实现.doc_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、I基于 ARM 的视频采集系统的设计与实现摘 要本文根据家庭视频采集系统的要求,提出一种基于 ARM 的网络视频采集方案。方案要求视频的实时传输、实时监控。本系统以 Intel Xscale 芯片和嵌入式Linux 系统为平台,在平台中搭建网络视频服务器,并以它为中介,负责将USB 摄像头采集到得视频数据传输到网络服务器中,最后发送到申请监控的远程 PC 机中,远程 PC 只需在网页中便能实时的看到监控端的视频图像。论文首先阐述了嵌入式网络视频采集技术的发展、现状和前景,然后介绍了嵌入式硬件系统结构和嵌入式 Linux 操作系统的特点,阐述了嵌入式硬件整体结构,使大家大体的完整的对系统硬件有详

2、细的了解,实际记录了嵌入式操作系统内核的编译和移植,介绍了 Bootloader 的基本原理和启动过程,实现了视频采集程序的编译和移植,研究了嵌入式一般驱动程序的使用。随后,本文详细描述了视频采集程序的整体结构框图和具体功能代码块、网络通信编程技术、图像编解码、嵌入式视频服。关键词:ARM;嵌入式;Linux;视频采集11目 录摘 要 I第 1 章 引言 11.1 课题的背景和来源 11.2 本文的内容及主要工作 3第 2 章 嵌入式 ARM 系统硬件结构简介 32.1 视频监控系统结构简介 32.2 ARM 处理器简介 .32.3 XSCALE 体系结构 .42.4 主要硬件电路说明 7第

3、3 章 嵌入式 ARM 系统软件结构 93.1 LINUX 操作系统简介 93.2 交叉编译环境的建立 103.3 嵌入式 LINUX 操作系统移植 113.3.1 BootLorder 移植 .113.3.2 Linux 内核移植 .123.3.3 嵌入式文件系统 133.4 LINUX 下的程序调试 14第 4 章 USB 设备驱动程序设计 .154.1 设备驱动程序简介 154.2 LINUX 下驱动程序的实现 184.3 USB 摄像头驱动程序设计 201第 5 章 视频采集功能 的设计 235.1 基于 V4L 的编程 .245.1.1 摄像头相关数据结构 245.1.2 摄像头基本

4、功能实现 255.1.3 视频数据采集 295.2 图像编解码 325.2.1 编解码介绍 325.2.2 系统压缩技术 331第 1 章 引言1.1 课题的背景和来源二十一世纪的网络化、数字化让人们的生活每天都发生着翻天覆地的变化,获取信息的方便和快捷可以使人们在信息化的今天领先一步创造出巨大的利益,而获取信息的重要途径就是眼睛。据统计,人类采集信息的 80%来自视觉。图像和视频是对客观事物生动、形象的描述,是一种最直观的表现方式。而视频监控技术因为它方便快捷、生动形象、信息丰富等特点日益受到人们的青睐,并在各行各业得到广泛的应用。与此同时,现代网络和数字技术的快速发展也为视频监控技术的发展

5、奠定了坚实的基础。二十一世纪,嵌入式技术、多媒体处理技术进一步发展,为视频监控系统的发展提供了新的出路嵌入式视频监控系统。嵌入式系统是以应用为中心,软硬件可以剪裁,具有高稳定、低成本、功耗低、速度快、实时好的专用计算机系统,它由嵌入式微处理器,配以周边硬件设备,接口电路组成。嵌入式系统内部使用嵌入式操作系统,安装专用的功能软件。嵌入式技术把硬件和软件集于一体,独立工作。嵌入式视频监控系统比其他视频采集系统在布局区域范围上要广泛;由于使用 IP 技术,嵌入式视频监控技术比其他视频采集系统更具紧密的结合度,能够充分利用现代网络技术的成果,并能构成复杂的视频监控网络;性能上,嵌入式视频采集系统继承了

6、嵌入式技术的优点,非常适合自动化的环境。因此,嵌入式视频采集技术正在我国快速的发展,积极的研究会加强我们在这方面技术的学习,也会为视频监控技术的发展贡献力量。1.2 本文的内容及主要工作根据毕业设计的初衷,我们需要设计基于 ARM 的网络视频采集系统。在监控系统中,视频采集、传输、播放的功能不是由专门视频处理芯片完成,而是由软件实现。2论文首先介绍了嵌入式 ARM 系统的硬件结构和软件结构,方便大家熟悉ARM 和 Linux 系统,包括嵌入式设备的硬件结构,逻辑框图和 Linux 的基本操作、安装方法;第二,研究了嵌入式的一些驱动程序,主要是摄像头驱动程序V4L,系统中选用的摄像头芯片中星微

7、301;第三,研究了视频监控的具体流程和实现方式,让大家在总体上对整个系统有一个大概的认知。本次设计的目的只有一个,就是实现视频的实时监控。围绕它,不管是硬件结构还是软件流程,都需要学习和研究,不断调试,决不放弃。总之,论文的内容都是围绕如何建立一个视频采集系统。无论是从哪个方面,我们都是为这个目标而努力。3第 2 章 嵌入式 ARM 系统硬件结构简介2.1 视频监控系统结构简介网络视频监控系统是基于嵌入式技术设计的。嵌入式并没有统一的定义,但目前有一个广泛而又被认可的规范:将软件产品固化到硬件平台上,完成应有的功能既是嵌入式。基于嵌入式 ARM 技术的视频监控系统服务器端采用摄像头不断的采集

8、图像,压缩成视频流,然后通过网络发送到申请监控的客户端。监控系统的使用者可以在远程实现网页上的实时监控和一些简单的功能操作。系统整体结构如图 2.1所示 1。C P U 单元I n t e l X s c a l eL C D J T A GS D R A M F L A S H以太网控制器摄像头Z C 3 0 1远程 P C 客户端图 2.1 系统整体结构图该系统中 CPU 采用基于 ARM 的 PXA270 微处理器,通过在其上运行Linux 操作系统,执行 Boa 视频服务器,接受并处理来自摄像头的图像信号,通过以太网控制器发送至远端,实现视频数据的远程传输和接受,达到视频监控的目的 2

9、。2.2 ARM 处理器简介ARM,既是一个公司的名字,也是对一类微处理器的通称。ARM 嵌入式微处理器是全球领先的 16/32 位 RISK 处理器芯片知识产权设计供应商4ARM(AdvancedRISKMachines)公司的产品。ARM 公司本身不直接从事芯片生产,而是依靠转让设计许可,由合作公司生产各具特色的芯片。ARM 处理器以其完整的体系结构,极小的体积、极低的功耗、极低的成本、极高的性能,及时根据嵌入对象的不同进行功能上的扩展的优势,在众多种类的嵌入式微处理器中脱颖而出。基于 ARM 技术的微处理器应用占据了 32 位RISC 微处理器 75%以上的市场份额, ARM 技术正在逐

10、步渗入到我们生活的各个方面。采用 RISC 架构的 ARM 微处理器一般具有如下特点:(1) 采用固定长度的指令格式,指令规整、简单、基本寻址方式有 23 种;(2) 使用单周期指令,便于流水线操作执行;(3) 大量使用寄存器,数据处理指令只对寄存器进行操作,以提高指令的执行效率;(4)所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率;(5)可用加载/ 存储指令批量传输数据,以提高数据的传输效率;(6)可在一条数据处理指令中同时完成逻辑处理和移位处理;(7)在循环处理中使用地址的自动增减来提高运行效率。目前,ARM 处理器有 ARM7、ARM9 、ARM9E、 ARM10

11、、ARM10E 、SecurCore、StrongARM 和 XScale 等系列。每个系列除了具有 ARM 体系结构的共同特点以外,都有各自的特点和应用领域。2.3 XScale 体系结构Xscale 核是采用 ARM V5TE 架构的处理器,是 Intel 公司的 StrongARM 的升级换代产品,它具有高性能、低功耗等特点,并在流水线设计、DSP 处理和指令设计中有很大改进 3。ARM 的体系结构是基于 RISK 的,XScale 是 ARM处理器的一种,所以 XScale 具有 RISK 的基本特性。而且针对嵌入式系统,XScale 构架还引入了 Pentium 处理器工艺和系统结构

12、技术,实现了 Pentium 微处理器体系结构的一系列高性能技术,达到了高性能、低功耗和小体积等嵌入5式系统要求的特性。它的特点有:超流水线、高主频、存储体系、分支预测和指令集体系结构。本设计采用的就是基于英特尔 Xscale 构架的一种 32 位嵌入式处理器,它除了应用于掌上电脑之中外,还可以应用于智能手机、网络存储设备、骨干网路由器等电子设备。PXA27x 系列处理器是英特尔当前最新推出的嵌入式处理器。它的时钟频率从 312 到 624MHz 不等,并内建 64MB 的堆栈型 Intel StrataFlash 内存。内置了英特尔的无线 MMX 技术,能够显著提升多媒体性能。OURS-PX

13、A270-EP 是一款基于 INTEL XSCALE PXA270 处理器,针对高效嵌入式系统教学和实验科研的平台。这款设备主要包括核心板与底版两个部分,核心板主要集成了高速的 PXA270 CPU,配套的存储器,网卡等设备;底版主要是各种类型的接口与扩展口。核心板(8 层 PCB 电路)系统包括:CPU: INTEL PXA270(520M),支持 GDB 调试;SDRAM: 64M 工作在 104M 外频上;FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller (LAN91C111);SUPERIO: WINBOND 839

14、77;CPLD: XILINX 95144 (117USER IO);总线驱动器: 若干;核心板正面如图 2.2 所示,核心板背面如图 2.3 所示。6C P UC P L DS D R A ML D Od r vF L A S HF L A S Hd r v d r v d r vd r vd r v图 2.2 核心板正面图E t h e r n e tS D R A MS u p e r I O1 0 0 P I N C O N N E C TO RL D Od r v d r v d r vd r v图 2.3 核心板背面图底版(4 层 PCB 电路)如图 2.4 所示。包括:Ether

15、net: 10/100 接口 1 个UART: 6 个(包括 RS232,RS485,IRDA,全功能串口)USB1.1:2 个(1 个 host 一个 device)PS2:2 个(KEYBOARD(2) 为第二阶段准备 RA.M 空间;(3) 复制 BootLoader 的第二阶段代码到 RAM 空间中;(4) 设置好堆栈并跳转到第二阶段的 C 程序入口点。第二阶段则通常用 C 语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。这个阶段主要任务有:( l)初始化本阶段要使用的硬件设备;(2)检测系统内存映射;(3)将内核映像和根文件系统从 FLASH 读到 RAM

16、中;(4)为内核设置启动参数;14(5)调用内核文件运行。本设计中的 Bootloader 采用 Blob,Blob 是 Boot Loader Object 的缩写,是一款功能强大的 Bootloader。Blob 最初是由 Jan-Derk Bakker 和 Erik Mouw 两人为一块名为 LART(Linux Advanced Radio Terminal)的开发板写的,该板使用的处理器是 StrongARM SA-1100,现在 Blob 已经被成功移植到许多基于 ARM 的CPU 上了。本设计中的 Intel Xcale 就是采用 Blob 作为 Bootloader8。3.3.

17、2 Linux 内核移植选用嵌入式 Linux 作为目标机操作系统,一方面由于 Linux 是一款免费的操作系统,能很好的降低成本,同时 Linux 的开发应用现在已经成为热门,有大量的资源可用于学习与重复应用,并且 Linux 系统具有良好的可移植性和可裁剪性,能自动支持多任务管理。一般常用的 GUI 如 QT/E,MiniGUI 等都支持Linux。 Linux 的开发工具也都可以很方便的免费获得。系统采用的嵌入式 Linux 内核为随实验平台光盘中的 Linux 内核,它是针对这套实验平台所配置的 Linux 内核,内核版本为 Linux2.4.209。在实验过程中,只需要在这个内核的基

18、础上进行添加和删减所需要和不需要的功能,编译后就可以使用了。在编译内核之前,需要对内核进行必要的配置,通过虚拟机进入/pxa270_linux/linux/目录后在终端执行 make menuconfig10命令,就可以可视化的配置内核需要的功能和要求,本次试验,主要是针对视频方面,选择了对V4L 的静态加载、对 spca5xx 摄像头驱动的动态加载,这样就结束了对内核的配置。编译内核需要创建内核依赖关系、创建内核镜像文件和创建内核模块。首先执行 makedep 命令,读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而哪些不需要; 接着需要 makeclean 删

19、除前面步骤留下的文件,以避免出现一些错误;然后便可以生成所需要的内核文件了,用 make zlmage 来实现得到可移植的内核。内核文件通过并口下载线烧写入开发板中,便可以通过 BootLoader 加载运行。3.3.3 嵌入式文件系统嵌入式 Linux 操作系统一般采用 FLASH 作为存储介质。FLASH 具有独特的物理特性,所以必须使用专门的嵌入式文件系统。嵌入式系统对文件的操作15是通过层次结构实现的。对于用户程序来说,文件是有结构的文件,用户程序通过对文件 IO 函数操作文件。嵌入式文件系统是嵌入式操作系统的一部分,它的任务是对逻辑文件进行管理,其工作包括提供对逻辑文件的操作(复制、

20、删除、修改等)接口,方便用户操作文件和目录。在文件系统内部,根据存储设备的特点,使用不同的文件组织模式来实现文件的逻辑结构。此外,文件系统要对管理文件的安全性负责。文件系统不能直接控制物理设备,它是通过 FLASH 驱动实现控制的 11。目前 FLASH 支持的文件系统技术主要有JFFS2, YAFFS2,TrueFFS,FTL/NTFL,RAMFS,CRAMFS 和 ROMFS 等等。本系统采用的是 JFFS2 文件系统。JFFS2 文件系统是专门为 NAND 闪存设计的嵌入式文件系统,根据 NAND闪存以页面为单位存取的特点,将文件组织成固定大小的数据段。利用 NAND闪存提供的每个页面

21、16B 的备用空间来存放 ECC(ErrorCorrectionCode)和文件系统的组织信息、 ,不仅能够实现错误检测和坏块处理,也能够提高文件系统的加载速度。JFFS2 采用一种多策略混合的垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均和系统开销的目的。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。JFFS2 文件系统是按层次结构设计的,分为文件系统管理层接口、JFFS2 内部实现层和 NAND 接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去。与 YAFFS 相比,它增加了一些功能,因此

22、功能更强。3.4Linux 下的程序调试调试是程序开发过程中必不可少的一个重要环节,通用 PC 机的程序调试与嵌入式操作系统的调试环境上有着明显的区别,前者调试器和被调试的程序往往是运行在同一台机器上,是相同操作系统下的两个不同的进程,调试器通过操作系统专用调用接口控制被调试进程,后者通常为远程调试,调试器一般运行于桌面操作系统上,而被调试的程序则运行在嵌入式系统之上,因此需要协调这两个程序之间的通信。Linux 下的调试工具非常的少,gdb 是 Linux 下最著名的调试工具,它是 GNUC 自带的调试工具,它可以使开发人员了解程序运行的详细细节,从而消除程序的错误,达到调试的目的,gdb

23、还具有远程调试功16能,可以满足嵌入式系统调试的要求,在调试过程中 PC 机也称为宿主机和嵌入式系统通过串口协议或者 TCP/IP 协议连接起来,远程主机上运行被 gdb 规范断点改造过的内核,当条件成立时,断点被激活,然后等待本地宿主机的连接命令,一旦连接成功,宿主机就可以向远程嵌入式系统发送调试命令了。在调试过程中 gdb 通过调试 stub 来完成通信功能,调试 stub 是嵌入式操作系统中的一小段代码,它提供了运行 gdb 的宿主机和嵌入式系统进程之间交互的一个媒介。除了使用调试器外还可以直接在程序中使用 printf()或 printk 打印函数,这种方法功能比较弱,效率低下,但在内

24、核模块调试时这是唯一的方法。17第 4 章 USB 设备驱动程序设计4.1 设备驱动程序简介Linux 系统中,设备驱动程序扮演着特殊的角色。它就像一个独立的黑盒子一样,使某个特定的硬件可以相应一个定义良好的内部编程接口并且完成隐藏设备的作用。用户只需调用一组标准化的函数完成操作,而且这些操作与特定的驱动程序无关。驱动程序的任务就是将这些函数映射到作用硬件的具体操作上。这样的模块化的驱动程序结构使得 Linux 系统中的驱动程序可以独立于内核的其他部分,可以在需要使用的时候将驱动“插入 ”内核。从系统运行顺序来看,硬件平台启动运行 Linux 后,启用了 MMU 单元即内存管理单元,在这种模式

25、下系统不能直接对物理地址进行访问。若要对某一硬件外设进行读写,需要通过内核调用该硬件的驱动来实现。上面已经说过,驱动程序的作用在于向应用程序提供访问硬件设备的接口,驱动程序屏蔽了硬件实现上的细节操作,于是应用程序可以像操作普通文件一样对硬件设备进行操作。Linux 以模块的形式加载设备类型,通常是一个模块对应实现一个设备驱动。模块是内核的一部分,它们没有被编译到内核中,而是分别被编译并链接成一组目标文件。可以根据用户的需要在不需要对内核进行重新编译的情况下动态载入正在运行的内核,或从正在运行的内核中卸载。利用这种机制,内核尺寸可以保持在最小,并具有最大的灵活性,也便于检验新的内核代码,而不需要

26、重新编译内核并重新引导。设备驱动程序一般需要完成以下功能:( l)对设备初始化和释放 ;(2)把数据从内核传送到硬件和从硬件读取数据;(3)读取应用程序传送给设备文件的数据和回送应用程序的请求数据;(4)检测和处理设备出现的错误。在 Linux 操作系统下有两类主要设备文件类型:块设备、字符设备。用户进程正是通过设备文件来与硬件打交道。每个设备文件都有其文件属性,表示是字符设备还是块设备。另外每个文件都有 2 个设备号,第一个是主设备号,标18识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的设备号一致,否则用户进程将无法

27、访问驱动程序。Linux 驱动程序可以分为三个主要部分:( l)自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其他必需的条件位口中断、DMA 通道 )进行申一请并初始化。这部分驱动程序仅在初始化时被调用一次。(2)服务于 I/O 请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,但仍具有进行此系统调用的用户程序的运行环境,因而可以在其中调用与进程运行环境相关的函数。(3)中断服务子程序,又称为驱动程序的下半部分。在 Lin

28、ux 操作系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux 系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务子程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。在系统内部,I/O 设备的存取通过设备驱动程序提供的一组固定的入口点来进行,这组入口点在驱动程序初始化时向系统进行登记,以便在系统适当的时候调用。一般来说,字符型设备驱动程序能够提供如下几个入口点:

29、(1)open 入口点:打开设备准备 I/O 操作,对字符特别设备进行打开操作,都会调用设备的 open 入口点。 open 子程序必须对将要进行的 I/O 操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则 open 子程序必须设置一些标志以表示设备的状态。(2)close 入口点 :关闭一个设备,当最后一次使用设备结束后,调用 dose 子程序。独占设备必须标记设备可再次使用。(3)read 入口点:读取设备,对于有缓冲区的 I/0 操作,一般从缓冲区里读取设备数据。19(4)write 入口点 :向设备写数据,对于有缓冲区的 I/O 操作,一

30、般向缓冲区里写入数据。(5)ioctl 入口点:执行读写之外的操作。USB(Universal Serial Bus)即“ 通用串行外部总线”,用途广泛,可以外接硬盘、键盘、鼠标、打印机等多种设备,USB 能够使用尽可能少的接口支持尽可能多的外设,尤为适合在嵌入式设备中使用,是嵌入式接口标准的一个很好的选择。USB 总线规范有 1.1 版和 2.0 版。USB1.1 支持两种传输速率:低速1.5Mbit/s、全速 12Mbit/s,这样的速率完全满足鼠标、键盘、CD-ROM 等设备,但是在嵌入式视频监控系统中,这样的速度还是很慢。所以,USB2.0 提供了一种更好的传输速率:高速,它可以达到

31、480Mbit/s。USB2.0 向下兼容 USB1.1,可以将遵循 USB1.1 规范的设备连接到 USB2.0 控制器上,也可以把 USB2.0 的设备链接到 USB1.1 控制器上。USB 总线的硬件拓扑结构 12如图 4.1 所示。U S B 主机控制器U S B 设备U S B 设备U S B 设备U S B 设备U S B 设备U S B 设备 U S B 设备 U S B 设备U S B 设备根集线器集线器集线器集线器20图 4.1 USB 总线硬件拓扑图USB 主机控制器通过根集线器与其他 USB 设备相连。集线器也属于 USB设备,通过它可以在一个 USB 接口上扩展出多个接

32、口。除根集线器外,最多可以层叠 5 个集线器,每条 USB 电缆的最大长度是 5m,所以 USB 总线的最大距离为 30m。一条 USB 总线上可以外接 127 个设备,包括根集线器和其他集线器。整个结构图是一个星状结构,一条 USB 总线上所有设备共享一条通往主机的数据通道,同一时刻只能有一个设备与主机通信。通过 USB 主机控制器来管理外接的 USB 设备,USB 主机控制器共分 3 种:UHCI、OHCI 和 EHCI。在配置 Linux 内核的时候,看到的 “HCD”字样表示“Host Controller Drivers”,即主机控制器驱动程序。USB 驱动程序分为两类:USB 主机

33、控制器驱动程序(Host Controller Drivers) 、USB 设备驱动程序(USB device drivers) 。它们在内核中的层次如图4.2 所示。U S B D e v i c e D r i v e r sU S B H o s t C o n t r o l l e r D r i v e r sU s e rH a r d w a r e21图 4.2 USB 驱动程序层次结构在试验中,教学平台上的 Linux 嵌入式内核已经配置了 USB 主机控制器驱动程序,只需要添加需要的 USB 设备驱动程序,就能实现 USB 设备的正常使用。4.2 Linux 下驱动程序的

34、实现Linux 操作系统下对硬件设备进行驱动开发的一般步骤如下:(l)注册设备在系统启动时或者在模块加载的时候需要将设备和重要的数据结构登记到内核的设备数组中,并确定该设备的主次设备号。在 Linux 系统中,对于字符设备一般通过调用 register_chrdev 向系统注册设备驱动程序, register_chrdev 在fs/deviees.c 文件中的定义如下 :int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定义中的 major 是设备驱动程序向系统申请的主设备号,如

35、果 major 为 O,则系统为该驱动程序动态的分配一个主设备号,不过此设备号是临时的;name是设备名:fops 是各个调用入口点的说明。函数返回 O 表示注册成功,返回-INVAL 表示申请的主设备号非法,返回-EBUSY 表示申请的主设备号正在被其它设备驱动程序使用。以后对设备驱动程序的 file_operations 的操作都可以通过该主设备号的索引来完成。register_chrdev 函数操作成功后,设备名便出现在 /proc/devices 文件目录中,使用命令 cat/proc/devices 可以查看设备的工作状态。(2)定义操作集驱动程序中要通过一系列函数完成对设备的不同操

36、作,这些操作在面向对象编程术语中也称为方法,该操作集通过数据结构 file_operations 实现。内核内部通过 file 结构识别设备,通过 file_operations 数据结构提供的文件系统的入口点函数访问设备。file_operations 定义在中的函数指针表:struct file_operations22struct module*owner;loff_t (*llseek) (struct file*, loff_t, int);ssize_t (*read) (struct file*, size_t, loff_t*);ssize_t (*write) (struct

37、 file*, const char*, size_t, loff_t*);int (*readdir) (struct file*, void*, filldir_t*);unsigned int (*poll) (struct file*, struct poll_table_struct*);int (*ioctl) (struct inode*, struct file*, unsigned int, unsigned long);int (*mmap) (struct file*, struct vm_area_struct*);int (*open) (struct inode*,

38、 struct file*);int (*flush) (struct file*);int (*release) (struct inode*, struct file*);int (*fsync) (struct file*, struct dentry*, int datasync);int (*fsyne) (int, struct file*, int);int (*lock) (struct file*,int, struct file_lock*);ssize_t (*readv) (struct file*, const struct iovec*, unsigned long

39、, loff_t*);ssize_t (*writev) (struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t (*sendpage) (struct file*, struct page*, int, size_t, loff_t*, int);unsigned long (*get_unmapped_area) (struct file*, unsigned long, unsigned long,unsigned long, unsigned long);这个结构的每一个成员的名字对应一个系统调用,在用户程

40、序利用系统调用对设备文件进行诸如读/写操作时,系统调用会通过设备文件的主设备号找到23相应的驱动程序,然后读取这个数据结构的相应函数指针,把控制权交给该函数。对于具体的设备驱动并不需要实现结构中所有的例程,只要完成设备功能就可以了。例如对于一个常见的字符设备驱动来说,可能只有操作 open(),write(),read(),ioctl()和 close(),当用户程序通过系统调用访问设备时,最终要通过这些操作集来完成。(3)卸载模块当不再需要使用一个模块或设备时,需要将其从内核中卸载下来,这时会动态调用模块中的 module_exit()函数,并需要在该函数中调用modul_unregiste

41、r_chrdev()或 module_unregister_blkdev()释放挂入内核的数据结构同时释放该设备号。4.3 USB 摄像头驱动程序设计摄像头属于视频设备,在 Linux 内核中,VideoforLinux(简称 V4L)是关于视频设备的驱动标准。这个标准为应用程序定义了一系列的接口函数,内核、驱动和应用程序都是依靠这个标准来进行交流。本系统所使用的 USB 摄像头正是基于该标准来编写驱动和应用程序的。Linux 内核是依据设备号来操作设备文件的,在内核中,摄像头对应的设备文件名为/dev/video0,主设备号是 81,次设备号根据摄像头数目来确定,本系统中仅使用一个摄像头,所

42、以可以通过 mknod/dev/video0 c 81 0 来创建节点。USB 摄像头驱动程序实现原理如图 4.3 所示。USB 摄像头的驱动和通用设备的驱动准则一样,但需要与内核提供的视频驱动挂钩。即首先在驱动中声明一个 video_device 结构,并为其指定文件操作函数指针数组 fops,向系统注册。在应用程序发出文件操作的相关命令时,核心根据这些指针调用相应函数,并将该结构作为参数传递给它们。这样,就完成了驱动和核心之间的通信。例如:Static struct video_devie vdev_template=;声明 video_deviee,指出挂接驱动24摄像头驱动用户进程系统

43、调用摄像头文件操作接口接收缓冲区 发送缓冲区中断服务程序图 4.3 摄像头驱动实现框图Static Struct file_operation spcasxx_fops= ;声明本驱动的文件操作函数指针Struct video_device*vdev=video_devdata (file);从文件指针中提取出 video_deviee 结构在 video_deviee 结构中,有一个私有指针 priv,可以将它指向一块保留内存。在这块内存中,保存着本驱动、本设备的相关初始化信息。这块内存的申请、初始化、指针指向等工作都是在 USB 驱动的枚举函数 probe 中完成。这样,在枚举函数将控制权

44、返还给系统后,因为内核不销毁保留内存,所以驱动仍然保留着自己的信息。在驱动卸载函数中需要将申请的各块内存全部释放。Linux 系统中任何 USB 传输都通过 URB 实现。为提高速度,可以考虑扩大URB 的缓冲,这样可以降低每个 USB 事务中握手信息所占比例,提高有效数据的输速度。但是受限于总线带宽和具体的 USB 设备芯片,单纯扩大 URB 的缓冲不能无限制地解决问题。USB 在操作系统中每次传输都要包括 URB 的建立、发出、回收、数据整理等阶段,这些时间不产生有效数据。因此可以建立两个 URB,在等待一个 URB 被回收时,也就是图像正在被传感器采集时,处理、初始化另一个 URB,并在

45、回收后立刻将其发出。两个 URB 交替使用,大25大减少了额外时间。 由于嵌入式平台上运行的 Linux2.4.20 内核,内部已经集成了对 USB2.0 的支持,所以无需移植相应的 USB 驱动。在设计中,摄像头芯片采用中星微的 Z301 系列芯片, Linux2.4 内核并不支持这种芯片,所以我们通过移植芯片驱动程序来达到目的。芯片的驱动程序是spca5*系列,如果不重新编译内核的话,将驱动程序动态加载就可以正常使用。设计中动态加载的命令使用 insmod 命令,它和 modprobe 命令在使用上有所不同,modprobe 在加载模块时不用指定模块文件的绝对路径,也不用带模块文件的后缀.

46、o 或.ko;而 insmod 需要的是模块的所在目录的绝对路径,并且一定要带有模块文件名后缀的.o 或者.ko。但是在功能上,它们所达到的效果基本相同13。26第 5 章 视频采集功能的设计视频采集程序是基于 V4L 开发的,包括摄像头的初始化、打开/ 关闭、参数设置和数据读取等操作,视频采集程序流程图如图 5.1 所示 14。开始初始化摄像头 i n i t _ v i d e o I n ( )打开摄像头 o p e n _ v 4 l ( )获取摄像头参数 i c o t l ( i n t - v d , i n t c m d , . . )设置摄像头参数 i o c t l ( )获取一帧图像一帧是否截取完毕存储并准备传输是否终止视频采集关闭摄像头终止NYNY图 5.1 视频采集程序流程图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报