基于ARM6410嵌入式数码相框的设计与实现

2013-10-12 09:14鄢梦林殷张发高心宽
黄冈职业技术学院学报 2013年6期
关键词:相框调用数码

鄢梦林,殷张发,高心宽,叶 翔,姚 莉

(湖北理工学院计算机学院,湖北黄石435003)

随着信息化、智能化、网络化的发展,嵌入式系统的广泛应用已经渗入到我们日常生活的各个方面。在手机、MP3、PDA、数码相机、电视机、甚至电饭锅、手表里都有嵌入式系统的身影。据统计,每年全球嵌入式系统带来的相关工业产值已超过1万亿美元。随着多功能手机、便携式多媒体播放机、数码相机、HDTV和机顶盒等新兴产品逐渐获得市场的认可,嵌入式系统的市场正在以每年30%的速度递增[1]。

数码相框正是这样一种嵌入式技术应用的代表产品,它的主要功能是保存和查看电脑、U盘或手机等存储设备上的数码照片。数码相框在市场上的用途很多,比如产品展示、车载、数码摄影、个人娱乐等。数码相框作为伴随数码相机及互联网不断飞速发展的衍生产物进入市场至今,已经被愈来愈多的普通消费者所接受。

1 系统软硬件平台选择

嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系统。嵌入式系统由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户应用程序4部分组成[1]。

1.1 Mini6410开发板

本系统采用了广州友善之臂设计、生产和发行销售的mini6410开发板进行设计与实现。Mini6410属于ARM11系列的微处理器,采用三星公司的S3C6410芯片。ARM11系列微处理器是ARM公司近年推出的新一代RISC处理器,是ARM新指令架构-ARMv6的第一代设计实现。Mini6410处理器一方面,包含了更多的多媒体处理指令来加速视频和音频处理;另一方面,它的新型存储器系统进一步提高了操作系统的性能,提供了新指令来加速实时性能和中断的响应,为软件开发者带来便利。

1.2 linux操作系统

目前较为流行的嵌入式操作系统有VxWorks、Windows CE、Linux、C/OS等。Linux是以 Unix为基础发展而成的操作系统,能够支持 ARM、MIPS、ALPHA、x86、PowerPC等多种系列的嵌入式微处理器[2]。Linux操作系统最大的特性就是开源性和可剪裁性,除此之外linux操作系统还有内核高效稳定,良好的可移植性,支持多种文件系统等优点,有利于Linux在嵌入式设备中的应用。因此,本系统选用嵌入式Linux操作系统作为开发平台,选用Ubuntu系统作为前台开发编译的操作系统。Ubuntu是一个以桌面应用为主的Linux操作系统。

2 ARM6410嵌入式数码相框软件设计

本系统实现市场现有的数码相框图片显示功能。通过解析图片信息获取图片名称及图片说明信息,分析图片类型确定图片格式,调用libjpeg库文件实现jpeg图片解码,调用freetype字体库实现图片说明信息的处理。通过FrameBuffer帧缓冲设备的使用,实现对jpeg格式图片,文字的各种效果显示,音乐播放等,完成对数码相框的设计。

2.1 Freambuffer

Framebuffer(帧缓冲)是Linux内核的一种图形设备驱动接口,提供了LCD控制器的抽象性描述。它将LCD控制器上的显存抽象成一种字符设备,应用程序通过定义好的接口可以访问LCD控制器的显存,直接对显示缓冲区进行读/写操作,而不需要知道底层的任何操作细节。对于开发者来讲,framebuffer是一块显示缓冲区,向这个显示缓冲区写入特定格式的数据就可以更新显示屏的输出[2]。

FrameBuffer机制模仿显卡的功能,将显卡硬件结构进行抽象,可以通过FrameBuffer的读写直接对显存进行操作。Linux抽象出FrameBuffer设备来供用户态进程实现直接写屏,这种操作是抽象、统一的,由Framebuffer设备驱动完成。用户不必关心物理显存的位置、换页机制等,允许应用程序不必关心底层硬件细节利用Framebuffer通过指定的接口访问图形硬件。

Framebuffer设备的设备节点位于/dev目录,设备文件一般是 /dev/fb0、/dev/fb1等。要想系统支持FrameBuffer,首先要在内核(Kernel)里设置对该功能的支持。我们选择的操作系统Ubuntu不需要另外配置Kernel选项,可以在/dev下看到fb0设备文件。本系统在Linux下将显示模式设置为图形模式,采用1024x768-16位色,使用命令$dd if=/dev/zero of=/dev/fb0 bs=1024 count=768。FrameBuffer设备提供了若干 ioctl命令,通过ioctl操作可以读取或设定设参数。例如:显示设备的固定信息(设备名、显示屏的组织等)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度等),以及伪彩色模式下的调色板信息等。本系统设计通过FrameBuffer将设备映射到进程地址空间,并通过mmap系统调用进行地址映射,以实现对设备的图像显示控制。实现代码如下:

short*fbmem;

int fd,w,h;

struct fb_var_screeninfo fb_var;

fd=open("/dev/fb0",O_RDWR);

ioctl(fd,FBIOGET_VSCREENINFO,&fb_var);

w=fb_var.xres;

h=fb_var.yres;

fbmem=mmap(0,w*h*2,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);

因此,本系统中只需要将相框中需要显示的JPEG图片进行解码为bmp像素点,再通过Framebuffer设备写入就可以实现图像显示。

2.2 图片格式处理

本系统设计支持JPEG格式和PNG格式图片,两者都是位图文件存储格式。JPEG格式是一种支持8位和24位色彩的压缩位图格式,适合在网络上传输,是非常流行的图形文件格式。在Linux下使用的JPEG压缩/解压缩函数库是libjpeg,它能够读写JFIF标记图像文件格式)格式的JPEG图像文件,通常这类文件是以.jpg或者.jpeg为后缀名的。通过libjpeg库,应用程序可以每次从jpeg压缩图像中读取一个或多个扫描线(scanline),而诸如颜色空间转换、降采样/增采样、颜色量化之类的工作则都由libjpeg完成[3]。PNG格式是设计来替代gif,它对于更小范围的TIFF(标记图像文件格式)来说有了非常多的进步和拓展,并且减少了关于专利权的麻烦。Linux下使用的PNG压缩/解压缩函数库是libpng。

实现图片解压并通过FrameBuffer进行显示的任务主要分为三步。首先,实现FrameBuffer设备的初始化操作;其次,获取图片名称、判断图片类型、调用 libjpeg、libpng库函数实现图片解压;最后,通过FrameBuffer实现图片的效果播放。在数码相框系统设计中,由于我们需要显示的图片信息被保存在链表节点中,若想显示图片需要从链表中获取图片文件信息[4]。主要实现代码如下:

intmain(int argc,char*argv[])

{…………

/*Open the Framebuffer equipment files*/

if((fb_device=getenv("FRAMEBUFFER"))==NULL)

fb_device=FB_DEV;

fbdev=fb_open(fb_device);

/*Access equipment's parameters,wide,high,bpp*/

if(fbdev>=0)

iotcl(fbdev,FBIOGET_VSCREENINFO,&fb_var);

else return-1;

fb_width=fb_var.xres;

fb_height=fb_var.yres;

fb_depth=fb_var.bits_per_pixel;

printf("please check display mode%d*%d-%dbpp”,fb_width,fb_height,fb_depth);

/*The frame buffer equipment Framebuffer mapped intomemory area*/

screensize=fb_width*fb_height*(fb_depth/8);

fbmem=fb_mmap(fbdev,screensize);

init_config();

new=&head;

for(i=0;i<1000;i++)

{int type;

new=get_next_link(new);

if(new->filename==NULL)

break;

type=get_file_type(new->filename);

if(type==JPEG)

display_jpeg(new- > filename,fbmem,200,120,1);

if(type==PNG)

display_png(new- > filename,fbmem,200,120,1);

}

……….return 0;

}

2.3 数码相框背景音乐设计

本系统采用多进程编程解决数码相框的背景音乐设计问题。每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。系统调用fork()的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process)。System()会调用fork()产生子进程,由子进程来调用/bin/sh-c string执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD信号会被暂时搁置,SIGINT和SIGQUIT信号则会被忽略。如果system()调用成功则最后会返回执行shell命令后的返回值来确认执行成功。本系统中,主要用到一个调用系统播放器的命令来控制音乐的播放。具体函数如下:

void*code_music(void*m)

{

system("/usr/bin/mplayer /home/dpf/mus/snq.mp3>/dev/null");

return 0;

}

3 应用程序移植

本系统采用交叉编译进行应用程序移植。交叉编译是嵌入式开发中最常见的概念,简单地说,就是在一个平台上生成另一个平台上的可执行代码。交叉编译这个概念的出现和流行是与嵌入式系统的广泛发展同步的。因为在进行嵌入式系统的开发时,开发平台和运行平台是不同系列的机器。当开发平台(主机系统)和运行平台(目标系统)不兼容时,就必须使用交叉编译的方式把用高级语言编写的程序转换成机器可以执行的二进制程序。

本文介绍的嵌入式数码相框系统设计主机采用x86体系结构的Ubuntu Linux系统,在此操作系统下安装Linux发行包以及交叉编译器arm-linux-gcc。目标系统是S3C6410 ARM11处理器。我们在主机(PC机)上开发程序、运行交叉编译器,并成功编译生成执行程序后,再移植到目标机(mini6410开发板)上运行。由于 PC机与 mini6410开发板的编译工具不同,在配置安装上首先解决对动态链接库和静态链接库的支持。可使用如下命令:

#export CC=arm-linux-gcc

#./configure--host=arm-unknown-linux--prefix=/home/jpeg/jpeg--enable-shared--enable-static

下载、安装和编译jpeg库,可使用如下命令:

[root@monahans jpeg]#tar-xzf jpegsrc.v8b.tar.gz

[root@monahans jpeg]#mv jpeg-8b jpeg

[root@monahans jpeg]#cd jpeg

[root@monahans jpeg]#./configure--host=arm-unknown-linux--prefix=/home/jpeg/jpeg--enable-shared--enable-static

修改生成的Makefile文件:

prefix=/home/jpeg/jpeg

CC= /usr/local/arm/3.4.1/arm-linux/bin/arm-linux-gcc

最后通过如图1所示命令对文件(fb.c,img.c,jpeg.c)进行交叉编译生成可执行的文件fb,此文件是本系统的主程序代码。

图1 交叉编译

把目标机上可执行程序fb下载或烧写到目标机上,终端运行可执行文件,即可看到数码相框图片的展示效果。运行效果图如图2所示。

4 结语

本文主要介绍了在Linux操作系统下采用广州友善之臂公司生产的嵌入式开发板mini6410设计实现的数码相框产品。本系统实现了图片浏览和音频播放功能,已经完成了数码相框的基本功能,鼠标的加入为后面数码相框的进一步制作奠定了基础。对于数码相框的后续研究设计,仍有可以进一步扩展和改进的地方。如可以在本系统上扩展USB功能和网络通信功能,加入触摸屏功能进一步完善上层操作界面的设计等。

图2 系统运行效果图

[1]马忠梅.ARM&Linux嵌入式系统教程(第2版)[M].北京航空航天出版社,2008.

[2]陈赜.ARM9嵌入式技术及Linux高级实践教程[M].北京航空航天大学出版社,2005.

[3]涂克亮.基于ARM嵌入式的图像采集与显示系统设计[J].工业控制计算机,2011(08):10~12.

[4]Li Yao.On the S3C2440-based design for embedded system of digital photo frame[J].IEEC,2011:386~389.

猜你喜欢
相框调用数码
相框
核电项目物项调用管理的应用研究
Naim Audio Uniti Nova数码播放/放大器一体机
LabWindows/CVI下基于ActiveX技术的Excel调用
相框
沙滩相框
基于系统调用的恶意软件检测技术研究
数码暗房
利用RFC技术实现SAP系统接口通信
Who am I?5款不可貌相的数码利器