基于Linux与Qt4的网络数码相框实现
2014-09-26张红雨
童 凯,张红雨
(成都电子科技大学 电子工程学院,四川 成都 611731)
在这个数字时代,数码相机及各种电子拍照设备走入千家万户,越来越多的家庭都拥有自己美好的“数字回忆”,怎样回顾这些让人难忘的记忆呢?传统的方式是将相片冲洗成实物,或者将数字资源上传到PC观看。但是这些数字资源往往数量巨大,冲洗成实物浪费资源,且使用起来极不方便。数码相框以其便捷,可重复使用等特点,极大的满足了人们在这一方面应用的需求。本设计提出了一种实现数码相框的方案,并加强了网络功能。
1 技术方案
目前数码相机生产的图片格式大多为.jpg文件,显示这些图片需要进行JPEG解码处理,同时为了显示的流畅性,对图片处理实时性有较高的要求。结合功能需求与性价比考虑,选用低功耗、高性能的32位ARM处理器S3C2440。
基于ARM920T体系结构的S3C2440嵌入式微处理器具有如下特点:16/32bit处理字长,ARM920T内核,拥有MMU与CACHE,IIS总线控制器,LCD控制器,ADC控制器,最高工作频率达到400MHz,运算能力为440MIPS,能够胜任图像的处理任务;LCD控制器、ADC控制器为使用触摸屏设备提供了方便,简化了外围电路的设计[1]。所以,硬件部分采用在S3C2440基础上构建的一个具有网络功能的嵌入式平台。
软件部分选择较新的Linux2.6.30操作系统,Linux操作系统属于开源免费的,可大大降低产品的开发成本。Linux操作系统遵守GPL开发原则,可找到丰富的驱动程序源码以及库函数,该系统还支持TCP/IP协议栈,可以有效降低开发难度,缩短开发周期[2]。完全满足Web数码相框的设计要求。
Qt是一个使用广泛的面向对象编程的跨平台图形界面开发工具,拥有丰富的类库、清晰的开发文档。Qt/Embedded的API和Qt的API有着类似的接口,但是有针对嵌入式开发的特点进行的改进,包括手写识别、选择板和虚拟键盘等等。本设计使用Qt的QFtp类实现FTP客户端用于传输图片,使用QPixmap和QPainter类实现图片的显示以及调整。
2 硬件设计
2.1 触摸屏接口电路
触摸屏接口电路主要包括两部分,一是LCD显示电路,二是 ADC转换电路。本设计采用 480×272的 TFT LCD,S3C2440 LCD控制器能够为TFT屏提供必要的控制信号,比如帧同步信号VFRAME,行同步信号 VLINE,时钟信号VCLK等。图2是LCD控制器的框图,其中REGBANK是LCD控制寄存器组,包括了17个LCD控制寄存器以及一款256×16的调色板内存;LCDCDMA是其专用的DMA通道,可以自发地从总线上获取图片的数据;VIDPRCS将LCDCDMA中传输过来的数据转换成特定的格式;TIMEGEN与LPC3600,LCC3600协调产生LCD屏所需的控制时序。S3C2440与LCD的硬件连线如图3所示。
图1 硬件系统方案图Fig.1 Hardware system diagram
图4 DM9000连线示意图Fig.4 DM9000 connection diagram
图2 S3C2440 LCD控制器框图Fig.2 S3C2440 LCD controller
图3 S3C2440与LCD的硬件连线图Fig.3 S3C2440 with LCD’s hardware diagram
S3C2440提供了触摸屏的触控接口,向外提供4个控制信号引脚:nYPON、YMON 、nXPON、XMON,以及两个中断信号:INT_ADC,表示 AD转换完成;INT_TC,表示触摸屏被按下或拿起。通过这两个信号的不同组合,可以表达出不同的触摸动作,在应用程序端可以识别并进行处理。
2.2 网卡芯片DM9000接口电路
网络接口设计采用目前常见的DM9000芯片。该芯片是一款高度集成的,低成本的单片快速以太网控制器,包含10M/100M物理层,16KB SDRAM以及通用的处理器接口,支持远端唤醒。S3C2440与DM9000之间采用地址线和数据线复用的方式,使用CMD信号来分辨他们。DM9000的访问基址为 0x20000000(BANK4的基址)。nOE、nWE 分别控制读/写操作使能。完成一次数据的读写产一个中断信号,接到EINT7。网络接口设计如图4所示。
3 软件设计
3.1 在S3C2440嵌入式平台上搭建Linux系统简介
Linux的低成本、强大的定制功能(内核可裁剪,网络功能强大)以及良好的移植性能,使得Linux在嵌入式系统方面得到广泛应用。搭建一个嵌入式linux系统通常需要以下几个步骤:移植Bootloader;移植内核;构建根文件系统[3]。
3.1.1 移植Bootloader
使用Bootloader是为了在系统上电时,完成部分硬件设备的初始化,准备好软件环境,最后调用操作系统。U-BOOT是一款常用的Bootloader,可以引导多种操作系统,支持多种架构的CPU。本设计采用的U-BOOT版本为1.1.6,主要完成的工作包括:修改SMDK2410板的系统时钟、SDRAM时钟设置方式,使其支持S3C2440芯片;新建nand_flash.c文件,修改对nand flash命令的支持,加入型号为 K9F1208U0B的nand flash的信息,添加配置的宏定义,然后在cpu/arm920t/s3c24x0/Makefile中的COBJS添加nand_flash.o项。
3.1.2 移植内核
内核移植的工作很多,这里只提出和本设计重点相关的几个配置,配置LCD驱动寄存器;设置Bufferframe;添加对DM9000驱动的支持;选择支持input子系统和yaffs子文件系统等,然后对该源码进行针对目标平台的交叉编译(armlinux-),生成内核镜像文件,最后将镜像文件烧写到目标平台中。
3.1.3 构建根文件系统
根文件系统存放着Linux操作系统启动必须的文件与程序,比如提供用于界面的shell程序,应用程序使用的库,配置文件等等。通常使用工具集来构建根文件系统[4]。使用busybox工具集创建根文件系统主要包括以下步骤:获取源代码;配置,busybox中包含了数百个系统命令,嵌入式系统并不会完全使用到这些命令,可以筛选命令以减少根文件系统的大小;编译,安装;创建必要的目录与文件,主要是etc目录下对系统进行整体配置的文件inittab,默认启动脚本rcS,挂载文件系统需要的fstab文件以及dev目录下的设备文件。随后使用mkyaffs2工具将整个根文件系统制作成yaffs映像文件。
3.2 Qt/Embedded编程
3.2.1 通过QFtp类实现FTP客户端功能
QFtp类提供了实现FTP通信的底层函数:connectToHost(), login(), close(), list(), cd(), get(), put(), remove(),mkdir(), rmdir(), rename()和 rawCommand(),以异步方式工作,当某个操作不能立即执行完的时候,马上返回继续执行下一条指令,通过发送signals来对执行结果进行通知。使用时封装一个自己的FtpWindow类,然后将QFtp类作为private成员,这样就可以调用QFtp类中的底层函数来实现FTP 通信[5]。
在FtpWindow类的构造函数 FtpWindow::FtpWindow()中设置GUI,设置好的客户端界面如下所示:
图5 FTP客户端界面Fig.5 FTP client interface
然后通过信号与槽机制,设置按下各个功能按钮后进行的操作。
connect (progressDialog, SIGNAL (canceled ()), this,SLOT(cancelDownload()));//取消下载
connect(connectButton, SIGNAL(clicked()), this, SLOT(connectToFtp()));//连接 FTP 服务器
connect (cdToParentButton, SIGNAL (clicked ()), this,SLOT(cdToParent()));//返回上层目录
connect (downloadButton, SIGNAL (clicked ()), this,SLOT(downloadFile()));//下载文件
connect (quitButton, SIGNAL (clicked ()), this, SLOT(close()));//退出
输入ftp服务器地址,调用connectToFtp函数,创建一个新的QFtp对象ftp,使用信号与槽机制,关联listInfo信号与addToList函数:
connect (ftp, SIGNAL (listInfo (QUrlInfo)), this, SLOT(addToList(QUrlInfo)));
将输入的服务器地址作为参数传递给QUrl对象,QUrl类含有对url地址进行解析的函数。它默认的ftp有效地址结构如下所示。
图6 Ftp有效地址结构Fig.6 Ftp valid address structure
将解析出的参数传递给QFtp::connetToHost函数,连接主机。如果url中指定用户名与密码,使用QFtp::login(url.user(),url.password())进行登录。登录后,QFtp::list()将查询服务器上的目录,发出listInfo(const QUrlInfo&)信号触发addToList函数为目录下的每个文件及目录创建一个QTreeWidgetItem对象,利用 QUrlInfo型参数对QTreeWidgetItem对象进行设置,完成后添加至FtpWindow::QTreeWidget对象filelist。在GUI界面就可以看到这些目录项了。
当一个目录项被双击时,将调用FtpWindow::processItem(),查询isDirectory里关于该项的记录,如果是目录,就改变当前路径,进入到新目录,更新filelist。下载文件时,downloadFile()函数使用 QFtp::get()函数下载文件。FtpWindow::QTreeWidget对象获取选定文件的文件名,在客户端建立一个QFile对象使用该文件名作为参数,在本地目录建立文件。
3.2.2 图片显示
Qt画图机制为屏幕显示提供了统一的API接口,主要分为 3类:QPainter类,QPaintDevice类和 QPaintEngine类。QPainter类提供了画图操作的各种接口;QPaintDevie类提供了用于画图的空间,是所有可以用QPainter类进行绘图的类的基类;QPaintEngine类类则是内部使用的抽象接口,是前面两种类的桥梁[6]。
常用的画图容器有QPixmap,QImage。QPixmap是针对荧幕显示图像而设计并最佳化,依赖于所在平台的原生绘图引擎,所以一些效果的展现(比如反锯齿),在不同的平台上可能会有不一致的结果,并且无法提供个别像素的存取。QImage使用Qt自身的绘图引擎,可在不同平台上显示相同的图像效果,并可透过 setPixpel()、pixel()等方法,直接存取指定的像素。本设计采用的是QPixmap。
图片显示主要实现的功能包括:图片显示,缩放,翻转。在图片显示主界面设置toolbar,设置相应功能的图标,当我们按下这些图标的时候,就可以通过信号与槽机制,调用到相应的功能函数,实现图片的切换,缩放,翻转功能。
显示图片:编译Qt/Embedded时,在configure中指定我们需要显示jpg,jpeg格式,就由Qt自身实现图片的编解码,而不需要借助第三方的软件。调用QPainter::drawPixmap(int x,int y, int width, int height, const QPixmap&pixmap) 绘制需要的图片,绘制时参数有多种。上述的参数表使用x,y指定显示位置,width、height限定显示的大小。可通过(QPixmap::load())::size()获取加载图片的尺寸可以进行优化设置。pixmap是绘图容器,pixmap.load()从本地文件夹里加载需要显示的图片。
缩放:在播放图片的时候,会因为比例和分辨率的问题而导致图片不能全屏显示,为了更好的展示图片的细节,设计了图片缩放功能。本设计指定,每按一次放大/缩小按钮,边框变化10%。以放大为例:
图7 pixmap缩放模式Fig.7 Pixmap scale mode
Qt::IgnoreAspectRatio:忽略长宽比,按指定的大小缩放;
Qt::KeepAspectRatio:保持长宽比,并让图片在指定外框内尽量缩放;
Qt::KeepAspectRatioByExpanding:保持长宽比,以边框的最小长度作为宽度进行缩放。
图片的翻转通过改变QPainter的作图坐标系实现,常规情况下,QPainter作图参照的坐标系是显示器上的像素点。通过 QPainter::rotate(qreal angle)函数实现翻转,angle 大于 0,顺时钟方向旋转;小于0,逆时针方向旋转。
4 结束语
本设计方案是基于Qt/Embedded的一种网络数码相框实现,使用QT类实现了数码相框显示图片的功能,另外,本设计可通过FTP客户端从服务器端实时更新资源,解决了嵌入式产品内存小带来的不便。使用Qt/Embedded做开发,拥有大量的可用库和清晰的指导文档,便于实现功能的扩展。
[1]Samsung.S3C2440A 32-Bit CMOS Microcontroller User’s Manual[C]//Revision 1 Publication Number:21-S3-C2440A-072004,2004.
[2]徐英慧,马忠梅,王磊,等.ARM9嵌入式系统设计---基于S3C2410与Linux[M].北京:北京航空航天大学出版社,2007.
[3]天嵌科技.基于天嵌科技的SKY2440/TQ2440的Linux系统移植手册V4.5.2010.6.5[EB/OL].http://www.armbbs.net/forum.php mod=viewthread&tid=630&extra=page%3D2.
[4]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.
[5]Jasmin Blanchette, Mark Summerfield.C ++ GUI Programming with Qt4[M].Pretice Hall Ptr,2007.
[6]周洁.基于Qtopia的数码相框软件开发 [J].华东交通大学学报,2012,29(2):88-93.
ZHOU Jie.Digital album software development based on Qtopia[J].Journal of East China Jiaotong University,2012,29(2):88-93.