嵌入式Linux的图像采集与显示

发布者:RoboPilot最新更新时间:2013-04-17 来源: dzsc关键字:Linux  图像采集  S3C2410 手机看文章 扫描二维码
随时随地手机看文章
1 系统平台的硬件结构

本文使用的系统平台硬件功能框图如图1所示,该平台采用Samsung公司的处理器S3C2410。该处理器内部集成了ARM公司ARM920T处理器核的32b微控制器,资源丰富,带独立的16kB的指令Cache和16kB数据Cache,LCD控制器、RAM控制器,NAND闪存控制器,3路UART、4路DMA、4路带PWM的Timer、并行I/O口、8路10位ADC、Touch Screen接口,I2C接口,I2S接口、2个USB接口控制器、2路SPI,主频最高可达203MHz。在处理器丰富资源的基础上,还进行了相关的配置和扩展,平台配置了16MB 16b的FLASH和64MB 32位的SDRAM,通过以太网控制器芯片AX88796扩展了一个网口,另外引出了一个HOST USB接口。在USB接口上外接一个带USB口的摄像头。另外,还配有分辨率为320×240,256色的LCD。

2 嵌入式Linux简介

Linux操作系统具有相当多的优点,他的内核稳定、功能强大、支持多种硬件平台、源代码完全开放,可裁减和低成本的特性非常适合于嵌入式应用,并且Linux本身直接提供完整的TCP/IP协议,可非常方便地进行网络应用。但Linux内核本身不具备强实时性,且内核体积较大,而且嵌入式系统的硬件资源有限,因此把Linux用于嵌入式系统,必须对Linux进行实时化和嵌入式化,即通过配置内核,裁减shell和嵌入式C库对系统定制,使整个系统能够存放到容量较小的FLASH中,Linux的动态模块加载,使Linux的裁减极为方便,高度模块化的部件使添加非常容易。

整个系统软件是在嵌入式Linux的基础上构建的。S3C2410平台使用的Linux内核是在Linux-2.4.18内核打上patch-2.4.18-S3C2410这个补丁后编译而成。S3C2410平台使用的文件系统是yaffs,文件系统包括应用程序、模块、配置文件和库等,图像的采集和显示是建立在嵌入式Linux内核之上的,整个软件系统如图2所示。

通常宿主机和目标板上的处理器不同,宿主机通常为Intel处理器,而目标板如图1所示为SAMSUNG S3C2410,所以程序需要使用针对处理器特点的编译器才能生成在相应平台上可运行的代码,GNU编译器提供这样的功能,在编译时,可以选择开发所需的宿主机和目标机,从而建立开发环境。在进行嵌入式开发前的第一步工作就是把一台PC机作为宿主机开发机,并在其上安装指定操作系统。对于嵌入式Linux,宿主机PC上应安装Linux系统。之后,在宿主机上建立交叉编译调试的开发环境,开发环境的具体建立这里不细谈。本文采用移植性很强的C语言在宿主机上编写视频采集程序,再利用交叉编译调试工具编译链接生成可执行代码,最后向目标平台移植。

 

3 基于Video4Linux的图像采集

Video4Linux是Linux中关于视频设备的内核驱动,他为针对视频设备的应用程序编程提供一系列接口函数,在Linux下,视频采集设备的正常使用依赖于对Video4 Linux标准的支持。如果使用Video4Linux,在编译内核时,一定要选中Multimedia Devices下的Video for Linux选项,本文针对的设备文件是/dev/video,使用的器件是基于OV511的USB摄像头。在运行程序前,一定要先加载USB及OV511设备驱动模块,同时加载Video4Linux模块,分别使用命令:modprobe usbcore,modprobe usbohci,modprobe videodev和modprobe ov511,以确保生成设备文件/dev/video,若使用的Linux操作系统不支持modprobe命令,也可使用insmod命令。一般来讲,基于Video4Linux的图像采集的程序流程如图3所示。

[page]

以下简单介绍程序的编写,在这里只给出关键部分的实现代码。

首先,必须声明包含2个头文件:

在获取图像信息后,还可根据需要改变这些信息,例如对比度、亮度、调色板等,具体做法是先给video_picture中相应变量赋新值,再利用VIDIOCSPICT ioct1函数。

第2部分,使用mmap方式的单帧图象采集:

然后调用ioct1(grab_fd,VIDIOCSYNC,&frame)函数,该函数成功返回则表示采集完毕,采集到的图像数据放到以data为起始地址,长度为240×320×3的内存区域中,读取该内存中的数据便可得到图像数据。

在此基础上同样可实现连续帧的采集,即一次采集连续多帧图像的数据,Video4Linux最多支持一次采集32帧,此时首先要设置grab_buf.frame为要采集的帧数,而每一帧的数据在内存中的位置为data+grab_vm.offsets[frame],其中grab_vm为video_mbuf结构体变量的一个声明,利用ioct1(fd,VIDIOCGMBUF,&grab_vm)便可获得grab_vm的信息。

4 基于FrameBuffer的图象显示

当Video4Linux使用mmap方式采集图像时,他总是尽最大努力将图像直接显示在屏幕上,但并不一定能够完成,因此一个完整的设备应该具有图像显示的功能,一般来讲,嵌入式Linux下显示一幅图像总共有以下几种方法:

(1)在利用Video4Linux采集图像时,将采集到的图象数据直接放到FrameBuffer的内存映射区中,而Video4Linux也支持这种功能,利用VIDIOCSFBUF和VIDIOCGFBUF这两个ioct1函数,可设置和获得struct video_buffer。但该方法并不是每个图像采集设备都支持。

(2)进图像数据存成各种格式(例如bmp),在各种GUI软件中,均会直接显示不同格式的图像的函数,如MiniGui中的FillBoxWithBitmap函数。

(3)直接将图像数据写入FrameBuffer中。

在这里主要介绍第3种。FrameBuffer设备是运行在Linux控制台上的一个优秀的图形接口,他几乎支持所有的硬件,提供了统一的API接口,很好地实现了硬件无关性,他可以直接操作显存,而且还留有提供图形加速功能的接口,运行时不需要root权限;FrameBuffer的设备节点是/dev/fb*,用户若要使用他,需要在编译内核时选中FrameBuffer,其简单的使用程序如下:

简单的使用程序

从vinfo和finfo中取得显存起始地址、分辨率、色深等信息,然后根据这些计算出需映射显存的大小。

从vinfo和finfo中取得显存起始地址、分辨率、色深等信息,然后根据这些计算出需映射显存的大小

由此便可直接操作大小为screensize,起始地址为fbp的内存区域,在LCD上直接显示图像、图形、文字等,例如执行memset(fbp,0,screensize)将进行清屏操作。

需要注意的是,对于色深为8位或8位以下的设备,在进行绘图操作前还需要设置合适的调色板,操作调色板要用到fb_camp结构,执行ioctl(fd,FBIOGETCMAP,&old_cmap)将保存调色板信息,执行ioctl(fd,FBIO-PUTCMAP,&new_cmap)将设置新的调色板。

以下介绍如何显示一个象素,这里假设LCD为24位色的。

如何显示一个象素,这里假设LCD为24位色的

 

由此便可逐一显示每个象素,进而显示整幅图像。

5 结语

由于Linux的驱动模型支持模块堆叠技术,内核开发者已提供了一些通用模块,因此,虽然文中是以USB摄像头为例,但只要针对自己的图像采集设备编写基于Video4 Linux的驱动程序,针对自己的LCD编写基于FrameBuffer的驱动程序,以上的程序便可成为通用的图像采集与显示程序。应用本文所述方法完成图像采集与显示工作,再加上相关的处理并接入网络,就构成了一个智能终端设备,可用于工厂、银行等场合全天候的智能监控,图像的网络通信等,具有广阔的是市场和应用前景。

关键字:Linux  图像采集  S3C2410 引用地址:嵌入式Linux的图像采集与显示

上一篇:Linux 2.6 内核的嵌入式系统应用
下一篇:基于I2S的USB 声卡系统设计

推荐阅读最新更新时间:2024-03-16 13:22

linux和单片机的串口通信
最近做无线传输方面的东西,需要cc2430开发板和tq2440进行数据串口通信。os为linux。 linux驱动在移植后时已经写好了,所以直接写应用层的程序即可,跟pc的写法类似。 修改自tq的serial_test demo程序,由pc端得串口ttyS0和tq2440的uart1口进行数据通信,互发字符串。 Uart.h文件: #ifndef UART2_H #define UART2_H #define FALSE 0 #define TRUE 1 #define WORDLEN 32 struct serial_config { unsigned char
[单片机]
<font color='red'>linux</font>和单片机的串口通信
linux中S3C2440的物理地址映射到虚拟地址详解
linux-2.6.30.4\arch\arm\plat-s3c\include\plat\ map-base.h #defineS3C_ADDR_BASE (0xF4000000) #ifndef __ASSEMBLY__ #define S3C_ADDR(x) ((void__iomem __force *)S3C_ADDR_BASE+ (x)) #else #defineS3C_ADDR(x) (S3C_ADDR_BASE+ (x)) #endif #define S3C_VA_IRQ S3C_ADDR(0x00000000) /* irq controller(s) */ #d
[单片机]
基于模糊控制的恒流源设计
  0 引言   各种电子设备中,电源都是关键的部件,其性能影响着整个设备的性能指标。应用中大多数是电压源,但工业上为了避免传输线路的电阻和电磁干扰,通常都采用电流源作为通信信号。在激光应用领域,半导体激光器是一种电流型驱动器件,其电源为恒流源,电流源性能的好坏直接影响到整个激光器装置的技术指标。为了使电流源的性能更好,充分发挥智能控制的作用,提出了一种基于模糊控制的恒流源,通过模糊算法的控制使恒流源的性能更好,以满足现代电子设备对恒流源越来越苛刻的要求。   1 总体方案概述   本设计采用三星公司的嵌入式ARM9 S3C2410处理器作为恒流源的控制和电流检测核心,实现了20~2000mA的高精度模糊控制恒流源,如图1所
[单片机]
基于模糊控制的恒流源设计
ucos在s3c2410上运行过程整体剖析-从main函数到UCOS初始化完毕
下面要讲解的内容基本上都是c语言编写的了,还有一部分代码是用汇编写的。以下我就以这个系统移植的实验源码为例做详细讲解。讲解的方式是根据程序执行的顺序进行,如果感觉有什么难理解的地方,会做一个宏观讲解和分析。 好了废话不多说,进入main()函数之后做的事情有: 对硬件平台做进一步的初始化操作 对ucos操作系统做初始化操作 对硬件的初始化主要包括: 初始化时钟总线 初始化串口 初始化中断结构体的相关内容 初始化定时器 关于以上的时钟的,串口的,还有定时器的等硬件的具体初始化和使用我不想一一详细阐述,这些你都可以通过查看datasheet自己弄明白的。毕竟我想详细讲解的是UCOS这个操作系统,只不过有些硬件知识是不得不讲的。
[单片机]
ucos在<font color='red'>s3c2410</font>上运行过程整体剖析-从main函数到UCOS初始化完毕
嵌入式Linux网络驱动程序开发设计
引言   随着人们对开放源代码软件热情的日益增高,Linux作为一个功能强大而稳定的开源操作系统,越来越受到成千上万的计算机专家和爱好者的青睐。在嵌入式领域,通过对Linux进行小型化裁剪后,使其能够固化在容量只有几十兆字节的存储器芯片或单片机中,成为应用于特定场合的嵌入式Linux系统。Linux强大的网络支持功能实现了对包括TCP/IP在内的多种协议的支持,满足了面向21世纪的嵌入式系统应用联网的需求。因此,在嵌入式系统开发调试时,网络接口几乎成为不可或缺的模块。   1 嵌入式Linux网络驱动程序介绍   Linux网络驱动程序作为Linux网络子系统的一部分,位于TCP/IP网络体系结构的网络接口层,主要实现上层
[单片机]
嵌入式<font color='red'>Linux</font>网络驱动程序开发设计
Linux内核编译初体验
1. 下载内核 在 ftp://ftp. kernel.org/pub/linux/kernel/ 下载原版内核 此处使用linux-2.6.22.6.tar.bz2 2. 解压内核 tar -xjvf linux-2.6.22.6.tar.bz2 3. 打补丁 补丁文件linux-2.6.22.6_jz2440.patch和解压后的文件夹linux-2.6.22.6处于同一目录下 执行patch命令 patch -p1 ../linux-2.6.22.6_jz2440.patch 4. 配置 a.直接执行make menuconfig直接一项一项的配置 b.使用默认配置,在上面修改:arm的配置在arch
[单片机]
基于ARM+Linux的视频采集编码系统设计
引言 嵌入式系统由于其体积小可便携,较 PC机而言很有优势。随着计算机技术的发展,一些基于PC机的应用也得以在嵌入式系统上实现。由于 USB 接口摄像头价格低廉,性能较好,即插即用,加上Linux下有Video4Linux标准支持对其编程,很容易集成到嵌入式系统,因此嵌入式系统视频采集设备通常用 USB 接口摄像头。 1 芯片介绍 S3C2440 处理器采用ARM920t内核,0.13um的CMOS 标准宏单元和存储器单元,支持高速总线和异步总线模式;具有 1G字节寻址空间;支持外部等待信号延长总线周期;支持掉电时SDRAM 自刷新模式;支持从 NAND flash存储器启动;采用 4KB 内部缓冲器进行启动引导。采用
[单片机]
基于ARM+<font color='red'>Linux</font>的视频采集编码系统设计
采用ARM+Linux架构的基于CAN总线和MiniGUI的虚拟仪表设计
当今发达国家普遍使用全数字式汽车仪表,且绝大部分是步进电动机式汽车仪表,并准备向更高方向发展。由于受到成本的限制,目前国内显示汽车仪表只能选用字段显示方式的显示屏,无法选用显示分辨率更高的点阵式显示屏,因此其视觉效果和显示精度还不能令人满意。ECU性能不断提高,抗强电磁干扰、工作温度范围和对工作电源稳定性要求等方面得到较大的改善,同时价格大幅度降低,因而目前有条件在汽车仪表上使用ECU控制的全数字仪表,国内汽车仪表界一致看好全数字式汽车仪表 。随着现代电子技术的发展,要求汽车仪表与汽车上其他装置交换数据,即要求接入到汽车的计算机系统总线上,因此本文设计了一个基于嵌入式系统、CAN总线技术和TFT LCD液晶显示技术的全数字式汽车
[单片机]
采用ARM+<font color='red'>Linux</font>架构的基于CAN总线和MiniGUI的虚拟仪表设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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