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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于嵌入式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中,这样就可以产生一张张图片播放的效果。如果在播放下一张图片时,

相关文档
最新文档