基于AT91RM9200的图像采集系统设计
引言:
近年来高性能、低功耗的ARM处理器成为嵌入式应用的主流;开源的嵌入式Linux操作系统由于系统稳定、兼容性和移植性好、网络功能强等优点也成为首选嵌入式操作系统之一,但目前嵌入式Linux支持的USB摄像头(如OV511)市场上已淘汰,使用现有USB摄像头需开发相关驱动程序,由于采用中芯微公司的USB摄像头在市场中的占有率很高,可高效压缩后输出JPEG图像,所以本文针对这类USB摄像头设计了基于 AT91RM9200处理器的图像采集处理平台,实现了JPEG图像的采集和网络传输。
1.硬件系统设计
(1) AT91RM9200简介
AT91RM9200是ATMEL公司生产的基于ARM920T的工业级SOC芯片,不仅有丰富的片上资源和标准接口,而且有低功耗、低成本、高性能、支持多种主要的嵌入式操作系统等特点,其采用5级整数流水线结构性能高达200 MIPS, 具有标准的ARMv4存储器管理单元(MMU),内部集成有两个USB 2.0 全速(12 M比特/秒) 主机端口和10/100 Base-T 型以太网接口,该芯片具有多种工作模式,其低功耗待机模式下电流仅3.1 mA[1]。
(2)AT91RM9200的USB主机端口(UHP)
AT91RM9200集成有一个USB器件端口(UDP)和一个USB主机端口(UHP),均符合USB V2.0 全速及低速规范。UHP内部集成一个根集线器和2个收发器,可连接127个USB 器件,UHP控制器与OHCI Rev 1.0规范完全兼容,标准分类驱动可以自动检测并在用户程序中使用[1]。
(3)硬件系统结构
图像采集平台的硬件系统结构设计如图1所示,主要包括AT91RM9200处理器、JTAG接口、网络模块、32M SDRAM、16M FLASH、串口、USB主从口等部分。其中网络模块通过外接DM9161实现10M/100M自适应网络连接,通过处理器内置的4个通用同步(异步)收发器(USART) 可实现4路数据传输与控制。另外,处理器内置的双主机收发器可连接USB摄像头和USB存储设备,也可经USB集线器连接更多USB设备,提高了系统的扩展性。
图1.硬件系统结构
2.软件系统设计
(1)嵌入式Linux软件架构
Linux工作模式分为内核模式和用户模式,其软件系统架构由硬件控制器、Linux内核、系统调用接口和用户进程4层组成。一个用户进程就是一个用户程序,操作系统支持多进程并发;内核是操作系统的中心组件,有进程管理、内存管理、文件系统管理、设备控制、网络控制等功能,它通过底层接口层以一致的方式管理硬件,通过高层抽象层为用户进程提供与硬件无关的API控制硬件资源;系统调用接口负责为应用程序调用内核中特定的过程,从而实现特定服务,一般认为这些调用和服务也是操作系统内核的一部分。
(2)USB驱动程序系统框架
图2.USB驱动程序系统框架
USB驱动程序的系统框架如图2所示,包括客户驱动程序、通用总线驱动程序、主机控制器驱动程序几部分。其中,客户驱动程序是特定USB设备的驱动程序,提供了USB设备的功能操作及特定子类协议封装[6];通用总线驱动程序(USBD)拥有特定操作系统上抽象出的主机控制器驱动程序的共有特性,是整个USB驱动程序的核心,主要实现USB总线管理、URB管理、为客户驱动程序提供相关接口等功能,它还负责维护设备的加载和卸载、设备配置、客户端驱动程序的安装和卸载等工作[2];主机控制器驱动程序是直接与硬件交互的软件模块,主要实现主机控制器硬件初始化、负责总线的注册、为USBD层提供相应的接口函数、完成4种类型的数据传输等功能[2]。
Linux通过定义了统一的URB(Universal Request Block)结构,在客户驱动程序和USBD之间,以及USBD和HCD之间进行消息传递,为USB驱动程序的开发带来了很大方便[3]。我们开发USB驱动程序主要是编写USB客户软件层的程序,即如何将数据封装成URB和如何从URB中得到数据。
(3) V4L简介与摄像头驱动程序开发
Video for Linux(简V4L)是Linux中关于视频设备的内核驱动,它为编写视频应用程序提供一系列接口函数,内核、驱动程序和应用程序以它为标准进行交流,因此视频类驱动程序的开发必须遵循此标准,应用V4L API函数进行设计[4]。
设备驱动程序是Linux内核与应用程序之间的接口,通过USB客户驱动程序提供的USBD接口和应用程序接口,屏蔽了硬件实现的细节。应用程序将外部设备看成是一类特殊文件__设备文件,可以使用像操作普通文件一样的系统调用接口函数来完成对外部设备的打开、关闭、读写和I/O控制操作。陷于篇幅原因只对驱动程序的重要部分进行阐述。
驱动程序的注册、注销:所有的USB设备类驱动程序都要在USBD中进行注册和注销,Linux中的驱动程序通常采用模块方式编写,使用函数module_init注册设备,使用函数module_ exit注销设备。
module_
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)