基于AT91RM9200的图像采集系统设计

发布者:草木知秋最新更新时间:2012-05-21 来源: 微计算机信息 关键字:ARM  嵌入式Linux  图像采集 手机看文章 扫描二维码
随时随地手机看文章

引言:

近年来高性能、低功耗的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中得到数据。[page]

(3)  V4L简介与摄像头驱动程序开发

Video for Linux(简V4L)是Linux中关于视频设备的内核驱动,它为编写视频应用程序提供一系列接口函数,内核、驱动程序和应用程序以它为标准进行交流,因此视频类驱动程序的开发必须遵循此标准,应用V4L API函数进行设计[4]。

设备驱动程序是Linux内核与应用程序之间的接口,通过USB客户驱动程序提供的USBD接口和应用程序接口,屏蔽了硬件实现的细节。应用程序将外部设备看成是一类特殊文件__设备文件,可以使用像操作普通文件一样的系统调用接口函数来完成对外部设备的打开、关闭、读写和I/O控制操作。陷于篇幅原因只对驱动程序的重要部分进行阐述。

驱动程序的注册、注销:所有的USB设备类驱动程序都要在USBD中进行注册和注销,Linux中的驱动程序通常采用模块方式编写,使用函数module_init注册设备,使用函数module_ exit注销设备。

module_init(usb_gfkd_init);  /*加载模块入口,调用函数usb_register()注册设备*/

module_exit(usb_gfkd_exit); /*注销模块入口,调用函数usb_deregister()注销设备*/

驱动程序与USBD的接口:USBD为每个设备驱动程序维护一个相关的 usb_driver的数据结构,负责设备的初始化和卸载。当总线上有设备连接操作时,USBD通过该结构来查找相关的驱动程序,并调用初始化函数 probe()对设备初始化;当设备断开时,USBD也通过该结构来查找相关的驱动程序,并调用设备卸载函数disconnect ()对设备卸载。USBD接口的数据结构定义为:

static struct usb_driver gfkd_driver = { "gfkd",gfkd_probe,gfkd_disconnect};

初始化函数static void * gfkd_probe(…)首先读取设备的Usb dev结构,根据设备的配置描述符判断该设备是否被驱动程序所支持, 判断使用接口是否正确,然后为驱动申请一块内存,再探测使用的摄像头,完成对摄像头的初始化,最后创建摄像头的设备文件结点[5]。

卸载函数static void  gfkd_disconnect (struct usb_device *dev, void *ptr)的作用是终止数据传输、删除摄像头的设备文件结点、释放接口、将驱动占用的内存释放。连接

驱动程序与应用程序接口:摄像头驱动程序在static struct file_operations gfkd_fops中给应用程序提供了统一的外设操作函数接口,当应用程序对摄像头进行open 、release、read、内存映射mmap以及IO控制等系统调用操作时将通过该结构访问驱动程序提供的函数。

static struct file_operations gfkd_fops = {

    .owner = THIS_MODULE,   .open = gfkd_open,

    .release = gfkd_close,  .read = gfkd_read,      

.mmap = gfkd_mmap,      .ioctl = gfkd_ioctl,

    .llseek = no_llseek,  };

打开摄像头函数static int gfkd_open(struct inode *inode, struct file *file)作用是打开摄像头的设备文件结点,并为数据传输做好必要的准备工作。它先调用函数gfkd _alloc()分配用于视频解码的临时数据缓冲区、帧缓冲区和数据缓冲区;然后初始化摄像头,用函数gfkd _setMode()设置输出的视频格式和分辨率;再用函数gfkd _setFrameDecoder()设置帧缓冲区接收的视频帧的格式和分辨率;最后调用函数gfkd _init_isoc()初始化等时数据传输设置、打开摄像头和分配提交URB。

关闭摄像头函数static int gfkd_close(struct inode *inode, struct file *file)作用是关闭摄像头的设备文件结点。它先调用函数gfkd _stop_isoc()终止等时数据传输;再调用函数CameraShutDown()关闭摄像头;最后使用函数gfkd _dealloc()释放分配的各种缓冲区。

内存映射函数static int gfkd_mmap(struct file *file, struct vm_area_struct *vma)实现内核空间与用户空间的内存映射。先通过函数vmalloc()申请分配足够大的内核态内存作为图像帧缓冲区,并能存储两个URB采集的图像;然后用函数remap_page_range()将其映射到用户空间中。这样提高了用户程序获取内核态图像帧缓冲区数据的速度。

读函数static long gfkd_read(struct video_device *dev, char *buf, unsigned long count, int noblock)通过调用函数copy_to_user()将图像数据从内核态的帧缓冲区拷贝到用户态的数据缓冲区。

IO控制函数static int gfkd_ioctl(struct video_device *vdev, unsigned int cmd, void *arg)的功能是接收应用程序的各种命令,实现对摄像头的控制操作,如获得摄像头的参数、设置摄像头的分辨率、开始采集图图像和设置帧同步。

由于Linux中任何USB传输都是通过URB实现的,每次URB传输都包括URB的建立、发出、回收、数据整理等阶段不产生有效数据,因此在具体实现中采用等时传输方式,通过建立两个URB,使用双URB轮流通信的方法来提高图像的采集速度。

本驱动程序开发是基于ATMEL最新版Linux-2.4.27-vrs1-Atmel,在驱动程序开发完后需重新配置内核,让内核支持usb- ohci 和video for linux,再把驱动程序配置成module,然后重新编译内核生成.o文件。将编译好的驱动放入文件系统,建立设备文件,然后将文件系统烧入 flash,再连接USB摄像头(如内置中芯微Zc301P DSP),把模块加载进内核并注册就可以找到该摄像头并显示:

 gfkd _core.c: USB gfkd camera found. Type Vimicro Zc301P 0x301b
 gfkd _core.c: gfkd driver 00.57.06LE registered

(4)  图像采集的实现与性能分析

服务端应用程序的实现是基于C/S模式,使用了3个线程,其中一个主线程,一个图像采集线程负责从驱动程序获取图像,可根据变量grabMethod选择采用read方式或内存映射方式获取图像;另有一个图像发送线程负责图像发送,程序通过建立带共享锁的4帧图像循环队列做为图像采集线程和图像发送线程进行数据交换的公共缓冲区。服务端还使用了两个socket,一个用于和服务端口绑定后侦听是否有服务请求,另外一个用于发送图像数据,主线程流程如图3所示。

程序首先设置采集图像的相关参数(如设备号、图像大小、初始化图像帧缓冲区等),然后通过函数 int init_videoIn()获取摄像头参数,设置采集图像宽度、高度、格式、采集方式等参数,并分配4帧采集图像缓存 vd->ptframe[i] =(unsigned char *) realloc (vd->ptframe[i], sizeof(struct frame_t) + (size_t) vd->framesizeIn ),再启动图像采集线程 pthread_create (&w1, NULL, (void *) grab, NULL)进行图像采集;创建服务端socket,与服务端口绑定后侦听服务请求;如果有新连接进来,函数accept()返回一个新的发送 socket,并启动新的图像发送线程,pthread_create(&server_th, NULL, (void *)service, &new_sock); 如果采集结束或连接产生错误,调用pthread_join (w1, NULL)和close(serv_sock)关闭图像采集线程和图像发送线程,释放有关资源后退出。

图3.主程序流程[page]

采集方式

READ

内存映射

分辨率

640×480

320×240

640×480

320×240

JPEG图像大小(KB)

32

7

32

7

图像采集时间(ms)

56

16

40

12

采集发送速度(帧/s)

15

50

22

60

表1.实验结果

使用奥尼银色天使S900摄像头分别对640×480和320×240两种分辨率用read方式和内存映射方式进行了图像采集和发送,实验结果如表1所示,应用程序采用内存映射方式图像获取的实时性较高,达到实时视频的要求。

4结束语

本文针对市场主流USB摄像头开发了驱动程序,实现了基于AT91RM9200的嵌入式图像采集和网络传输。克服了其它图像采集方案采集BMP图像数据量大和实时性差的问题,并解决了目前嵌入式Linux缺乏USB摄像头驱动程序的问题,具有集成度和性价比高、实时性好、支持多种USB摄像头和充分利用USB带宽的优点。实验表明适于高质量实时图像监控场所和智能图像监控应用,具有很好的广泛应用前景。

参考文献:

[1]ATMEL, AT91RM9200 DATA,[Z]. America, Atmel Corporation , 2003.

[2](美)科比特、鲁宾尼、哈特曼主编,LINUX设备驱动程序[M],东南大学出版社,2004

[3]周力功 主编 ,USB编程与驱动程序开发[M],北京航空航天大学,2004

[4]李侃,基于S3C2410平台与嵌入式Linux图像采集应用[J],微计算机信息,2006,第3-2期

[5]Don Anderson、Dave Dzatko 著,USB系统体系[M],中国电力出版社,2003

[6]倪继利著,LINUX 内核分析及编程[M],电子工业出版社,2005

关键字:ARM  嵌入式Linux  图像采集 引用地址:基于AT91RM9200的图像采集系统设计

上一篇:基于ARM的嵌入式BootLoader设计与启动过程
下一篇:基于S3C4510B的ARM开发平台

推荐阅读最新更新时间:2024-03-16 12:59

ARM7在嵌入式应用中启动程序技术难点分析
技术难点分析 ⑴.MMU的使用 MMU是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU决定数据是在RAM内还是在大容量存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断。 MMU的两个主要功能是: 将虚地址转换成物理地址。 控制存储器存取允许。MMU关掉时,虚地址直接输出到物理地址总线。 在实践中,使用MMU解决了如下几个问题: ①使用DRAM作为大容量存储器时,如果DRAM的行列是非平方的,会导致该DRAM的物理地址不连续,这将给程序的编写调试造成极大
[单片机]
Cortex-A17仅为Cortex-A12小更新,为确保ARM在终端移动架构影响力
    应ARM客户要求,ARM以Cortex-A12为基础进行改版,推出Cortex-A17,主要针对大小核的支援能力进行改善,并强化记忆体子系统的效率。事实上,除大小核支援能力外... Cortex-A17仅是原有Cortex-A12小改款后重新命名,与原有Cortex-A12性能及功耗相差不大。 Cortex-A17之命名方式为客户要求,但实际性能仍落后于Cortex-A15。 Cortex-A15仍将是标准32位元ARM高阶定位产品。
[手机便携]
完备IoT生态链 ARM无线通信IP/子系统上阵
ARM强力部署物联网(IoT)系统平台。瞄准智慧联网装置商机,ARM推出Cortex-M处理器专用物联网子系统(IoT Subsystem)和Cordio无线通讯矽智财(IP),前者采用台积电(TSMC)55奈米(nm)超低耗电制程技术,可缩小晶片体积、降低成本和功耗,且可在一伏以下(Sub-one Volt)的电压运作;后者具备低功耗讯号传送特性,且可降低电力使用,两者皆有助加速未来物联网晶片的开发时程。 ARM技术营运执行副总裁Dipesh Patel表示,装置与装置的相互连结越来越紧密,然目前没有单一的解决方案能满足物联网多元应用的特性;因此ARM推出全新的Cordio无线通信IP和物联网子系统,提供一个完善
[物联网]
基于Linux的ARM/单片机串口通信设计
  本文介绍Linux 环境下串口通信的设计方法和步骤,并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进行串行通信的设计方法,给出了硬件连接和通信程序流程图。该方法可靠、实用,适用于大多数Linux ARM 和单片机串口通信的场合。      数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux 操作系统的s3c2440 可以在Linux 环境下操作串口,降
[单片机]
基于Linux的<font color='red'>ARM</font>/单片机串口通信设计
ARM for ADS1.2
一、新建项目文件夹(最好用英文名称); 二、将相应的项目中的INIT文件夹中的Src和inc中的9个文件托人新建文件夹中。 三、打开 ADS1.2,点击File,在弹出窗口中的Project标签下,选中ARM Executable Image,在右边Project name下的框中输入项目名称(英文),点击下面的保存路径按钮SET...选择存放路径保存。 四、在项目界面,点击右键,选择Add Files,选中拖入项目文件夹中的8个单后缀文件添加进来,最后再点击右键,添加新建组,将几个文件分类,以便是界面简明整洁。 五、再点击ads1.2的File菜单下的New(同三),在弹出窗口中的File name 下的框中输入代码源代
[单片机]
Arm推出Mbed Edge延伸Mbed Cloud设备管理能力到物联网边缘
电子网消息,Arm宣布推出Mbed Edge,进一步拓展Mbed Cloud的设备管理能力,在边缘侧,即物联网网关上实现设备的接入、控制和管理。  网关在物联网网络中发挥着至关重要的作用,是本地连网设备(包含有线与无线设备)与云端之间的桥梁,通常在本地运行应用程序以实现设备控制。网关失效将对本地生产运营带来灾难性的后果,可能导致生产线停滞,甚至是关停风力发电机组。得益于Mbed Cloud新增的Mbed Edge能力,Mbed Cloud将能够实现三大功能,包括连接和管理异构连网设备、网关管理和诊断以及边缘计算。   协议转换:许多传统连网设备使用的通信协议与IP网络协议不兼容,比如 Modbus和BACnet,Mbed
[网络通信]
ARM7学习---GPS练习
下午抽了点时间在调试ARM7,想把上次用ATMEGA8做的GPS移植到ARM7上去,下午移植了LCD和串口,但是还没把串口中断程序编写好。按键也还没移植,其他OK了,再花点时间就可以完整了。我想GPS和GSM结合起来,这样可以做个比较实用的东西。自己玩玩很不错!哈哈!再接再厉继续努力...... /**************ARM7(LPC2103)练习程序**************************/ /*************************************************************/ /*****File Function : lcd10265液晶显示程序
[单片机]
<font color='red'>ARM</font>7学习---GPS练习
基于ARM微控制器 延伸USB产品组合【恩智浦】
中国上海,2011年4月13日 —— 恩智浦半导体NXP Semiconductors N.V. 今日宣布推出基于ARM® Cortex™-M0的低成本微控制器LPC11U00系列,该系列采用高度灵活的全新USB架构和智能卡接口。LPC11U00配备了高度可配置的全速USB 2.0设备控制器,为消费者的电子产品和移动设备提供了无与伦比的设计灵活性和可靠的USB连接性。 恩智浦半导体副总裁兼微控制器产品线总经理Geoff Lees表示:“LPC11U00系列为8位和16位USB微控制器提供了卓越的替代方案,以低于1美元的价格水平实现了可靠的USB性能。我们在LPC11U00中采用的高度灵活的USB架构是一种更佳的USB方案
[单片机]
基于<font color='red'>ARM</font>微控制器 延伸USB产品组合【恩智浦】
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved