当前位置:文档之家› 基于嵌入式Linux数码相框设计与实现

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

基于嵌入式Linux数码相框设计与实现
摘要:以嵌入式Linux软件平台的开源特点及嵌入式处理器快速发展,建立基于嵌入式Linux数码相框相关软件,对系统平台和各应用开发包移植应用程序开发。

结果表明,利用嵌入式Linux的软件开发框架,开发出的数码相框应用软件,开发灵活便于扩展和升级,该数码相框可以应用实际,并可以快速产品化,应用前景广泛。

关键词:数码相框;Linux;Jpeg;自动挂载
1软硬件总体框架
数码相框是展示数码照片而非纸质照片的相框。

数码摄影必然推动数码相框的发展,因为全世界打印的数码相片不到35%。

数码相框通常直接插上相机的存储卡展示照片,当然更多的数码相框会提供内部存储空间以接外接存储卡功能。

数码相框就是一个相框,不过它不再用放进相片的方式来展示,而是通过一个液晶的屏幕显示,它可以通过读卡器的接口从SD卡获取数字相片,并设置循环显示的方式,比普通的相框更灵活多变,也给现在日益使用的数码相片一个新的展示空间。

数码相框的硬件主要有LCD液晶屏幕、PCB印制电路板组成。

其中PCB集成了大部分器件包括处理器ARM9、内存32M、Flash64M 等其他外围电路。

软件架构是基于嵌入式Linux操作系统完成图片显示等相关操作。

软件功能当插入外存时候,完成自动挂载后,会检索外存内所有
JPG图片并解码显示到屏幕上。

2使用Udev自动挂载U盘
udev是一种工具,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。

设备文件通常放在/dev 目录下。

使用udev后,在/dev目录下就只包含系统中真正存在的设备。

Udev只支持linux-2.6内核,因为udev严重依赖于sysfs文件系统提供的信息,而sysfs文件系统只在linux-2.6内核中才有。

为了满足本项目外存自动挂载须修改配置文件(/etc/udev/rules.d/01-sda.rules)如下:
KERNEL=="sd[a-z][0-9]",MODE="0660"
ACTION=="add",KERNEL==" sd[a-z][0-9]",RUN+="/bin/mount -t vfat /dev/%k /mnt/udisk"
ACTION=="remove",KERNEL==" sd[a-z][0-9]",RUN+="/bin/umount /dev/%k"
ACTION为U盘的动作,add为插入U盘,remove为移除U盘。

KERNEL是U盘在内核中的名称。

RUN是满足以上两个条件时所做执行的命令。

将交叉编译好的udevd和udevstart下载到开发板中的/root/bin下并修改自启动脚本如下:
#start udevd
if [ f /sbin/udevd ]
then
/sbin/udevd daemon
if [ $? ne 0]
then
echo "dfmRun : start udevd error"
exit
fi
else
echo "dfmRun : udevd file not exist" exit
fi#start udevstart
if [ f /sbin/udevstart ]
then
/sbin/udevstart
if [ $? ne 0]
then
echo "dfmRun : start udevstart error" exit
fi
else
echo "dfmRun : udevstart file not exist" exit
fi
将以上加入自启动脚本后,当系统启动的时候会被自动调用,并启动Udev相关工具,可以自动挂载U盘或SD卡。

3自动检索U盘中的文件
在Udev中已经指定的挂载路径是/mnt/udisk,接下来需要对该目录检索。

由于U盘中的jpg图片数量未知,因此检索U盘返回的图片名称使用链表最为合适。

使用Linux系统提供的函数opendir及readdir读取文件,通过strstr函数查找***.jpg文件加入链表中。

Int search_files(const unsigned char *dirname,SEARCH_NODE *head,unsigned int *jpg_number)
{
if ((dir_ptr = opendir(dirname)) == NULL){

}
while((direntp = readdir(dir_ptr)) != NULL) {
ptr1 = strstr(direntp>d_name, ".jpg");
if (ptr){

}
closedir(dir_ptr);
*jpg_number = jpg_nums;
return 0;
}
4Libjpg解码JPG图片成RGB数据
libjpeg是一个被广泛使用的JPEG图片文件压缩/解压缩函数库。

通过libjpeg库,应用程序可以每次从JPEG压缩图像中读取一行像素点构成的一条图像线条,而诸如颜色空间转换、降采样/增采样、颜色量化之类的工作则都由libjpeg去完成了。

对于libjpeg而言,图像数据是一个二维的像素矩阵。

对于彩色图像,每个像素通常用三个分量表示,即R(Red)、G(Green)、B(Blue)三个分量,每个分量用一个字节表示,因此每个分量的取值范围从0到255。

以下是利用libjpeg解码JPEG格式图片,解码过程如图3。

图3JPEG解码过程
5FrameBuffer显示Libjpeg解压好的RGB数据FrameBuffer 是显示设备抽象为帧缓冲区。

用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。

FrameBuffer 设备还提供了若干ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度)。

操作如下图进行,将Libjpeg解码的RGB直接写入Framebuffer的用户控件映射区域内,屏幕上也随之进行变化。

图4Framebuffer显示RGB数据
6过渡效果实现
在libjepg解码后可以直接将RGB数据写入Framebuffer中,这样就可以产生一张张图片播放的效果。

如果在播放下一张图片时,
不按照图片时间和空间顺序进行填充Framebuffer的映射区,即产生了各种过渡效果。

同时,过渡效果是非常吸引客户眼球的功能之一。

以下仅举几例。

如图5为劈裂效果,屏幕分为四部分。

1和3部分自上而下显示,2和4部分是自下而上显示,每显示一行有100ms延迟。

图5劈裂效果
如图6为隔行分区效果,每区从上到下间隔两行进行显示。

图6隔行分区效果
7结束语
随着IC产品迅速发展,嵌入式处理器价格越来越低。

并且伴随数码相机的普及,给数码相框带来了快速发展的契机。

同时,该数码相框可以增加网络更新功能的扩展,多功能等相关的扩展,也是一个重要发展方向。

参考文献:
[1]华清远见嵌入式培训中心编.嵌入式Linux应用程序开发[M].北京:人民邮电出版社,2009.
[2]孙琼.嵌入式Linux应用程序开发详解[M].北京:清华大学出版社,2006.
[3]陈溯.基于ARM平台的数码相框软件开发[D].厦门:厦门大学,2008.。

相关主题