周潔
(華東交通大學(xué)信息工程學(xué)院,江西 南昌330013)
數(shù)碼相框作為數(shù)碼相機的衍生品,近年來備受市場青睞。但由于一直以來在嵌入式Linux上開發(fā)系統(tǒng)軟件和應(yīng)用程序缺乏強大的開發(fā)環(huán)境,中低端的數(shù)碼相框產(chǎn)品無論是在支持媒體播放格式種類、功能還是圖形環(huán)境方面都有很大可改進(jìn)的空間。Qtopia的出現(xiàn)為使用嵌入式Linux作為操作系統(tǒng)的消費電子產(chǎn)品提供了開發(fā)圖形應(yīng)用程序的便捷手段,很大程度上解決了移動設(shè)備上開發(fā)應(yīng)用軟件的難題。研究在mini2440開發(fā)板上,通過基于Qtopia的嵌入式軟件開發(fā),實現(xiàn)了一款能使用戶有較好使用體驗的數(shù)碼相框產(chǎn)品。
數(shù)碼相框的硬件平臺采用友善之臂mini2440開發(fā)板。板上集成了三星主頻為400 MHz的高端微處理器S3C2440,64MB的SDRAM,128 MB的Nand Flash,2 MB的Nor Flash,以及一些常用的外設(shè)接口[1]。其中S3C2440采用ARM920T內(nèi)核,其低功耗、簡單、優(yōu)雅且全靜態(tài)設(shè)計非常適用于對成本和功耗敏感型的應(yīng)用。在軟件方面,使用Linux-2.6.32.2內(nèi)核,運行環(huán)境Fedora9,根文件系統(tǒng)為缺省安裝的文件系統(tǒng)。
整個系統(tǒng)軟件由引導(dǎo)裝載程序(U-Boot)、設(shè)備驅(qū)動(包括幀緩沖frame buffer)、嵌入式Linux內(nèi)核、文件系統(tǒng)(YAFFS)以及基于QT/Embedded和Qtopia的應(yīng)用程序組成[2],系統(tǒng)平臺軟件結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)平臺軟件框架Fig.1 Software framework of system platform
目前基于嵌入式Linux的主流GUI系統(tǒng)主要包括MiniGUI、Microwindows、OpenGUI、Qt/Embedded,這些GUI在接口定義、體系結(jié)構(gòu)、功能特性存在很大差別,采取的技術(shù)路線也有所不同。MiniGUI是國內(nèi)研發(fā)的一款性能優(yōu)良、輕量級跨操作系統(tǒng)的嵌入式圖形用戶界面支持系統(tǒng),采用了可伸縮的系統(tǒng)架構(gòu),其建立在比較成熟的圖形引擎之上,如SVGALib和LibGGI,開發(fā)的重點在于窗口系統(tǒng)、圖形接口之上,但由于支持力量薄弱,其維護(hù)和再開發(fā)成本不可預(yù)計。MicroWindows與MiniGUI均為自由軟件,目前開發(fā)的重點在底層的圖形引擎之上,主要特色在于提供了類似X的客戶/服務(wù)器體系結(jié)構(gòu),它以較小的資源消耗、通用的幀緩沖技術(shù)、靈活的分層設(shè)計模式和豐富的API等特點獲得了廣泛的關(guān)注。由于其底層圖形引擎存在無任何硬件加速能力、算法低效、代碼質(zhì)量較差的問題,因此在窗口系統(tǒng)和圖形接口方面的功能還比較欠缺。OpenGUI性能穩(wěn)定,最底層是用匯編實現(xiàn)的快速圖形引擎,非常適合于基于X86平臺的實時系統(tǒng)。但由于其內(nèi)部使用私有API,因此在可移植性和可配置性的表現(xiàn)較差,并且不支持多進(jìn)程[3-5]。
Qt/Embedded是Trolltech公司開發(fā)的GUI開發(fā)工具Qt的嵌入式版本。Qt/Embedded類庫完全采用C++封裝,控件資源豐富,可移植性好。由于Qt/Embedded不依賴于XServer或者Xlib,直接調(diào)用幀緩沖進(jìn)行圖形繪制,節(jié)省了大量的系統(tǒng)資源,提高了效率。
Qtopia是一個基于Qt/Embedded的類似桌面系統(tǒng)的應(yīng)用環(huán)境。作為一款面向嵌入式Linux的全方位應(yīng)用程序開發(fā)平臺,Qtopia不僅提供了用于個人信息管理、辦公、娛樂、Internet網(wǎng)絡(luò)交流的應(yīng)用程序,還為嵌入式應(yīng)用程序提供了開發(fā)庫[4]。從圖2所示的Qt/Embedded體系結(jié)構(gòu)可以看出GUI系統(tǒng)的圖形庫窗口組建都是由Qt/Embedded實現(xiàn)的。Qt/Embedded作為Qtopia的基礎(chǔ)類庫,為其提供了底層支持。Qtopia包含PDA和Phone兩個版本。本文所述的數(shù)碼相框應(yīng)用程序使用PDA這個版本進(jìn)行開發(fā)。
圖2 Qt/Embedded體系結(jié)構(gòu)Fig.2 Structure of Qt/Embedded system
搭建編譯平臺是嵌入式GUI開發(fā)的必要工作。Qtopia的軟件開發(fā)環(huán)境主要包含嵌入式Linux操作系統(tǒng)、軟件開發(fā)工具鏈以及相關(guān)源碼包。本文的開發(fā)環(huán)境是在PC上安裝VMware Workstation 6.5.1和Fedora9,內(nèi)核版本為Linux-2.6.32.2,采用arm-linux-gcc-4.4.3交叉編譯器,源碼包為Qtopia-free-src-2.2.0。
由于Qtopia-2.2.0已經(jīng)包含了Qt/Embedded,tmake以及QtX11,因此只要把Qtopia-2.2.0源碼包安裝好,就不需要再單獨安裝這三個包了。其中tmake為跨平臺makefile生成器,QtX11為Qt開發(fā)工具包,包括:qvfb(虛擬幀緩沖)、moc(用于Qt C++擴(kuò)展的metra-object編譯器)、uic(用戶界面編譯器)、Qt designer(圖形設(shè)計器)等。
為了對Qtopia進(jìn)行交叉編譯,需要準(zhǔn)備如下的源碼包:
e2fsprogs-1.41.6.tar.gz:提供uuid支持,文件系統(tǒng)相關(guān)的庫。
jpegsrc.v6b.tar.gz:jpeg圖形編碼解碼程序庫。
libpng-1.2.16.tar.gz:png圖形編碼解碼程序庫。
tslib-1.4.tar.gz:觸摸屏中間件,提供濾波、去抖、校準(zhǔn)等功能。
zlib-1.2.3.tar.bz2:壓縮解壓程序庫。
移植步驟可分為:
1)Qtopia相關(guān)庫文件的編譯安裝
建立兩個目錄分別存放交叉編譯生成的動態(tài)鏈接庫文件和必要的頭文件。
mkdir/home/arm/lib
mkdir/home/arm/include
vim/etc/profile ;修改后需重啟才能生效
在pathmunge下一行添加
pathmunge/usr/local/arm/4.4.3/bin;交叉編譯器路徑
完成e2fsprogs、jpeg、png、tslib、zlib庫文件的交叉編譯安裝。特別要注意的是觸摸屏中間件tslib編譯時可能因為版本的不同有較大差別,對于tslib-1.3.tar.bz2,在編譯前要根據(jù)本身觸摸屏程序的數(shù)據(jù)結(jié)構(gòu)修改defaulttseventtype變量的值,默認(rèn)為UCB1X00,使用該版本的tslib庫必須更改為H3600。而對于tslib-1.4.tar.gz版本,則不需修改,可直接在生成的配置文件ts.conf中選擇不同的數(shù)據(jù)結(jié)構(gòu)類型。
2)使用下面的configure參數(shù)配置編譯安裝Qtopia。
./configure-qte'-embedded-no-xft-qconfig qpe-depths 16,32-system-jpeg-qt-zlib-qt-libpng-gif-no-g-exceptions-no-qvfb-xplatform linux-arm-g++-tslib’-qpe‘edition pda-displaysize 240x320-fontfamilies“helvetica fixed micro smallsmooth smoothtimes unifont”-xplatform linux-arm-g++-luuid’-qt2‘-no-opengl-no-xft’-dqt‘-no-xft-thread’
設(shè)置開發(fā)板環(huán)境變量:
export QPEDIR=/home/qtopia-home/nfs/arm-qtopia/qtopia-2.2.0/qtopia
export QTDIR=/home/qtopia-home/nfs/arm-qtopia/qtopia-2.2.0/qt2
export DQTDIR=/home/qtopia-home/nfs/arm-qtopia/qtopia-2.2.0/dqt
export TMAKEDIR=/home/qtopia-home/nfs/arm-qtopia/qtopia-2.2.0/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
export PATH=$QPEDIR/bin:$QTDIR/bin:$DQTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$QTDIR/lib:$TMAKEDIR/lib:$LD_LIBRARY_PATH
3)編譯安裝成功之后,必須將所有需要的庫文件拷貝到動態(tài)鏈接庫目錄(一般是安裝位置下面的lib目錄)。庫文件包括交叉編譯器中關(guān)于arm平臺的庫文件,之前交叉編譯安裝準(zhǔn)備的庫文件,支持Qtopia運行的庫文件。
4)將編譯生成的Qtopia安裝文件添加到根文件系統(tǒng)中,并燒寫至mini2440開發(fā)板上即完成了Qtopia到S3C2440上的移植。
當(dāng)安裝完成Qtopi-2.2.0后,已經(jīng)具備了數(shù)碼相框基本的功能,包括:圖片的瀏覽、簡單的編輯、幻燈片播放圖片;音樂播放;視頻播放功能;各種界面設(shè)置功能,包括上網(wǎng)協(xié)議設(shè)置、網(wǎng)絡(luò)參數(shù)設(shè)置、數(shù)碼相框界面設(shè)置(字體、背景、主題);安全功能;音量調(diào)節(jié);屏幕亮度調(diào)節(jié);輸入方式設(shè)置。其余功能均為冗余,可以根據(jù)源碼目錄src中的general.pri進(jìn)行整體上的裁剪。方法如下:
接下來可以按自己的方式組織界面。找到源碼目錄或Qtopia安裝目錄下的apps文件夾,里面的每個文件夾對應(yīng)一個選項卡。在其中既可以通過建立目錄來增加選項卡,也可以通過刪除目錄來刪除選項卡。每個目錄下面的desktop文件對應(yīng)于某個選項卡下顯示的一個程序圖標(biāo),文件內(nèi)容為程序圖標(biāo)的設(shè)置,而隱藏文件。directory用于設(shè)置選項卡屬性。
數(shù)碼相框軟件系統(tǒng)包括文件列表主界面、應(yīng)用程序主界面以及各功能界面。這些功能界面包括圖片瀏覽、文件管理、音樂、視頻、網(wǎng)絡(luò)等。各界面之間的切換和按鈕關(guān)系如圖3所示。
圖3 界面切換和按鈕的關(guān)系Fig.3 Relationship between interface switching and button
數(shù)碼相框作為數(shù)碼相機的衍生品,必須要支持主流的半導(dǎo)體存儲卡,并能從中讀取圖像文件。以SD卡作為外部存儲介質(zhì)。由于Linux-2.6.32.2已經(jīng)自帶了S3C2440的SD卡驅(qū)動,因此只需在初始化代碼中加入SD平臺設(shè)備結(jié)構(gòu)就可以實現(xiàn)SD卡自動掛載。在實現(xiàn)過程,SD卡曾一度不能正確識別,啟動時一直出現(xiàn)failed to get write protect的錯誤。由于SD卡側(cè)面移動的開關(guān)連接到了控制寫保護(hù)的引腳,因此有無寫保護(hù)其實就是檢查有無移動開關(guān)。在linux-2.6.32.2/drivers/mmc/host/s3cmci.c中應(yīng)添加如下代碼:
disable_irq(host->irq); //在SDI未準(zhǔn)備好之前先屏蔽SDI的中斷功能
host->irq_state=false;
host->pdata->gpio_detect=S3C2410_GPG(8);//設(shè)置GPG8為SD卡插入拔出的檢測
host->pdata->gpio_wprotect=S3C2410_GPH(8);//設(shè)置GPH8為有無寫保護(hù)的檢測
由于數(shù)碼相框的存儲介質(zhì)容量越來越大,必須通過有效的文件管理功能才能管理大量的文件。Qtopia-2.2.0本身不具有文件管理功能,但可以將Qtopia-1.7.0的文件管理器復(fù)制到目錄qtopia/src/applications/,在編譯工程文件qtopia/src/general.pri中添加filebrowser模塊,修改源碼使其具有搜索文件和文件夾的功能。添加搜索按鈕,并通過信號與槽函數(shù)顯示搜索界面。完成后設(shè)置好環(huán)境變量(source setQpeEnv),重新編譯安裝Qtopia即可。遞歸搜索文件及文件夾的部分關(guān)鍵代碼如下:
背景音樂是通過移植madplay播放器以及相關(guān)庫文件,然后在源碼中添加相關(guān)調(diào)用和控制實現(xiàn)的。準(zhǔn)備的文件如下:
libid3tag-0.15.1b.tar.gz:MPEG音頻解碼器MAD中所捆綁的ID3標(biāo)簽操控庫
madplay-0.15.2b.tar.gz:音樂播放器主程序
libmad-0.15.1b.tar.gz:高精度MPEG音頻解碼庫
將上述文件放到madplay文件夾,并創(chuàng)建源碼目錄src-arm和安裝目錄target-arm,文件解壓至src-arm目錄,運行安裝腳本mymadplay.sh后,通過ls命令查看到target-arm目錄下包含bin.include.lib.man.share子目錄,其中l(wèi)ib中的文件就是madplay要調(diào)用的庫。將編譯生成的庫和bin目錄下的可執(zhí)行文件復(fù)制到安裝好的Qtopia中對應(yīng)的lib、bin目錄下,然后調(diào)用可執(zhí)行程序madplay即可實現(xiàn)背景音樂的設(shè)置。
具體實現(xiàn)步驟為:
1)進(jìn)入Qtopia源碼目錄,設(shè)置好環(huán)境變量source setQpeEnv。
2)增加編譯參數(shù)/configure-languages“zh_CN”,告知系統(tǒng)增加簡體中文支持。
3)make lupdate確保翻譯所必須的文件都存在而且是最新的,針對每種語言通過調(diào)整Qtopia的語言配置選項產(chǎn)生翻譯文件。
4)bin/nct_lupdate產(chǎn)生源代碼中無法找到的字符串的翻譯文件。
5)vim i18n/zh_CN/.directory
[Translation]
File=QtopiaI18N
Context=Chinese(MainLand)
[Desktop Entry]
Name[]=Chinese(MainLand)
make lupdate;再一次更新
cd i18n/zh_CN
6)打開翻譯窗體界面Linguist,將zh_CN目錄下所有ts文件全部翻譯并保存。在文件QtopiaDefaults.ts中,修改處,使其支持utf-8的字體格式。
7)在zh_CN目錄下執(zhí)行l(wèi)release*.ts,使每個ts文件生成對應(yīng)的qm文件供Qtopia調(diào)用,make lupdate再次更新。
8)在zh_CN目錄下面建立兩個空文件:QtopiaRingTones.ts,QtopiaThemes.ts,然后在Qtopia目錄下執(zhí)行make install,啟動時選擇支持中文。圖4,圖5為中英文界面對照。
圖4 英文界面Fig.4 English interface
圖5 中文界面Fig.5 Chinese interface
消費電子類等嵌入式產(chǎn)品是否能讓用戶有更好的使用體驗關(guān)鍵在于人機交互技術(shù)的體現(xiàn)。Qtopia為基于嵌入式Linux的移動設(shè)備提供了一個很好的應(yīng)用程序開發(fā)平臺,本文通過Qtopia在mini2440開發(fā)板上的移植與應(yīng)用程序設(shè)計,快速開發(fā)出了一款高品質(zhì)的數(shù)碼相框圖形系統(tǒng)。
[1]廣州友善之臂計算機科技有限公司.Mini2440用戶手冊[EB/OL].(2011-04-21)[2012-01-09].http://www.arm9.net/download.asp.
[2]趙拯宇,張雪英,金剛.Qt/Embedded和 Qtopia在 OMAP5912平臺上的移植及應(yīng)用[J].儀器儀表用戶,2009,16(2):108-110.
[3]唐浩,代少升.Qt/Embedded在S3C2440平臺上的移植與開發(fā)[J].電視技術(shù),2010,34(10):32-35.
[4]周恕義,徐曉亮,李曉勇.新型嵌入式多媒體系統(tǒng)架構(gòu)[J].計算機工程與應(yīng)用,2011,47(1):64-66.
[5]涂春萍,甘嵐,張旭.基于Linux下MiniGUI的圖像處理GUI平臺設(shè)計[J].華東交通大學(xué)學(xué)報,2011,28(2):55-59.
[6]解超,李善平.基于Linux 的嵌入式GUI[J].計算機工程與應(yīng)用,2003,39(9):135-137.
[7]孫瓊.嵌入式Linux應(yīng)用程序開發(fā)詳解[M].北京:人民郵電出版社,2006:12-20.
[8]吳嫻.基于Qtopia的嵌入式軟件開發(fā)[J].計算機工程與設(shè)計,2006,28(21):5190-5192.
[9]任善全,呂強,錢培德,等.一個基于Qt/Embedded的嵌入式Linux應(yīng)用程序的實現(xiàn)[J].計算機應(yīng)用與軟件,2006,23(2):105-107.
[10]劉匯丹,芮建武,姚延棟,等.基于Qt的國際化圖形用戶界面設(shè)計與實現(xiàn)[J].中文信息學(xué)報,2006,20(4):94-99.