摘要:該文首先簡要分析了Qtopia的實現(xiàn)技術(shù)和應(yīng)用現(xiàn)狀,然后詳細(xì)論述了如何在基于s3c2440架構(gòu)的開發(fā)板上移植Qtopia開發(fā)平臺的過程,并結(jié)合項目需求介紹了Qtopia平臺部分功能的完善。此外還介紹了MPlayer的移植過程,以及開發(fā)環(huán)境的搭建和若干開發(fā)實例。
關(guān)鍵詞:Qtopia,嵌入式Linux,utu2440,MPlayer
中圖分類號:TP316文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2009)04-0860-04
Transplanting and Application Development Based on Qtopia Platform in Utu2440 Based on ARM9 Architecture
WANG Yi-chen, PI De-chang
(College of Information Science Technology, Nanjing University of Aeronautics and Astronautics, Nanjing 210016, China)
Abstract: The article firstly made a brief analysis of Qtopia’s working principium and its’ current appliances situation. Then it introduced the full process of transplanting Qtopia into the develop boards based on the architecture of s3c2440. In the end, it discussed how to perfect the functions, mainly discussed about MPlayer. It also illustrate how to configure the develop environment, and gives some simple development examples based on Qtopia platform.
Key words: Qtopia; Embedded Linux; utu2440; MPlayer
1 引言
在生活數(shù)字化的浪潮中,電子產(chǎn)品已經(jīng)滲透到日常生活的方方面面。嵌入式技術(shù)作為眾多研究領(lǐng)域中最熱門的板塊之一,“嵌入式系統(tǒng)”這個名詞已經(jīng)被各行各業(yè)的人所熟悉,它正以不同的形式改變著我們的生活生產(chǎn)方式。
Linux作為源碼完全開放的操作系統(tǒng),最近發(fā)展十分迅速。正是由于其開源特性得到了諸多愛好者和組織的支持,成為了嵌入式設(shè)備主流的操作系統(tǒng)之一。Qtopia作為一個成熟的跨平臺的C++開發(fā)平臺,已經(jīng)發(fā)展過4代產(chǎn)品,其豐富的開發(fā)文檔支持和應(yīng)用實例,使其完全有理由充當(dāng)嵌入式應(yīng)用程序開發(fā)的首選平臺。
Qt/Embedded(簡稱Qt/E)作為Trolltech開發(fā)的面向嵌入式系統(tǒng)的Qt版本,完全采用C++封裝,
兼容同版本的Qt-X11。Qt/E底層顯示的設(shè)備是幀緩沖設(shè)備/dev/fb0,也是標(biāo)準(zhǔn)顯示設(shè)備驅(qū)動的接口。通過使用mma函數(shù)將幀緩存映射到應(yīng)用程序可訪問的虛擬內(nèi)存空間中,直接進(jìn)行讀寫操作,便可立即反應(yīng)在屏幕上。Qt/E的將所有輸入均抽象為keyboard和mouse的輸入事件,而底層接口支持鍵盤、鼠標(biāo)、觸摸屏和自定義設(shè)備。下圖可以描述了Qt/E的實現(xiàn)結(jié)構(gòu):
2 Qtopia環(huán)境的設(shè)置
2.1 編譯環(huán)境的準(zhǔn)備
Qtopia的編譯是一個較為復(fù)雜的過程,對編譯環(huán)境的精心準(zhǔn)備是確保整個過程順利的重要部分。首先介紹一下軟硬件環(huán)境:
CPU: Intel Core Duo T7250(2.00GHz)
Chipset: Intel P965M
Memory: 3G DDR2 667MHz
Graphic: Geforce 8400MG
Linux: Ubuntu 8.04.1
Architecture: x86_64
Kernel: 2.6.24-21-generic
Host GCC: gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
Target GCC: arm-linux-gcc (GCC) 3.4.1
這是大多數(shù)普通桌面Linux用戶的選擇,當(dāng)然,對于編譯和部署Qtopia而言,也許并不是最好的。其中很多問題或編譯錯誤也許都可以在openSUSE下輕松解決,因為其默認(rèn)的軟件包配置中就包含了絕大多數(shù)重要的QT(Qtopia)開發(fā)庫。
使用其他Linux Host系統(tǒng)也是可以,openSUSE、Fedora都是很好的選擇,使用它們也許會很大程度上避免由于缺少庫文件導(dǎo)致的編譯錯誤。此處我們選擇Ubuntu作為開發(fā)環(huán)境是因為空間原因未能安裝其他發(fā)行版Linux系統(tǒng),畢竟對于這類經(jīng)常使用Linux的人而言,其他發(fā)行版的桌面應(yīng)用體驗遠(yuǎn)遠(yuǎn)不及Ubuntu。
2.2 編譯參數(shù)的配置
首先做幾點說明:
1) 由于編譯出來的Qtopia大小很可能超過開發(fā)板Flash的大小,所以我們采用NFS方式進(jìn)行開發(fā)和調(diào)試,之后再考慮精簡。
2) 為避免麻煩和一些不可預(yù)知的問題,以下操作一律在root的Shell下執(zhí)行。下面說明如何配置編譯環(huán)境。
2.2.1 設(shè)置環(huán)境變量,方便下文的描述和使用
#export QTOPIA_DEPOT_PATH=/project/work/qtopia/qtopia-opensource-4.3.2
#export QTOPIA_IMAGE=/project/work/nfs/qtopia
#export QTOPIA_RUN_ON_TARGET=/opt/qtopia
QTOPIA_DEPOT_PATH:主機(jī)上Qtopia的源碼包目錄,即安裝源。
QTOPIA_IMAGE:編譯后生成的image存放的位置。
QTOPIA_RUN_ON_TARGET:Qtopia在target板文件系統(tǒng)中的所在路徑。以后使用NFS掛載的時候,該目錄即為Qtopia的根目錄。
2.2.2 加入宏定義,使得Qtopia支持觸摸屏
#vim $QTOPIA_DEPOT_PATH/qtopiacore/qconfig-qpe.h
然后在文件末尾添加宏定義:
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
在utu2440開發(fā)板上,不定義這兩個宏也能夠使用觸摸屏,但無論如何配置內(nèi)核關(guān)于觸摸屏的選項,就是校不準(zhǔn)觸摸屏,因此需要定義這兩個宏.
2.2.3修改開發(fā)板配置文件以匹配攝像頭接口
#vim $QTOPIA_DEPOT_PATH/src/libraries/qtopiabase/custom-linux-generic-g++.h
在文件末尾可以發(fā)現(xiàn)
#define V4L_VIDEO_DEVICE\"/dev/video\"
2.2.4 修改時區(qū)信息的讀取路徑
#vim $QTOPIA_DEPOT_PATH/qtopiacore/qconfig-qpe.h
在文件末尾添加宏定義:
#define QTOPIA_ZONEINFO_PATH \"/opt/qtopia/etc/zoneinfo/\"
QTOPIA_ZONEINFO_PATH即時區(qū)文件所在的路徑,因為Qtopia會在默認(rèn)的/usr/share/zoneinfo里尋找時區(qū)信息。這里的路徑一定要設(shè)置為$QTOPIA_RUN_ON_TARGET/etc/zoneinfo。當(dāng)然也可以不改使用其默認(rèn)路徑,之后將相關(guān)文件復(fù)制到默認(rèn)目錄下。
2.2.5 安裝libxtst-dev:
#apt-get install libxtst-dev
這個軟件包在編譯過程中會用到,若不安裝會出錯。
2.2.6 修改編譯器的.h文件
由于3.4.1的編譯器不支持qtopia4.3.2的一些特性,所以需要修改以下兩文件,否則會出現(xiàn)編譯錯誤:
#vim /usr/local/arm/3.4.1/arm-linux/include/linux/videodev2.h
#vim /usr/local/arm/3.4.1/arm-linux/sys-include/linux/videodev2.h
在兩個文件第208行后都添加:
/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
#define V4L2_PIX_FMT_SBGGR8v4l2_fourcc('B','A','8','1') /*8BGBG.. GRGR.. */
2.2.7 生成Makefile
首先一定要確認(rèn)上文所提到的環(huán)境變量設(shè)置正確,然后開始生成Makefile。在/opt目錄下新建Qtopia目錄,該目錄用于存放編譯完成以后的文件,作為SDK的默認(rèn)目錄。
#mkdir /opt/Qtopia
然后進(jìn)入build,執(zhí)行如下命令:
#cd $QTOPIA_DEPOT_PATH../build
#../qtopia-opensource-4.3.2/configure -image $QTOPIA_IMAGE -prefix $QTOPIA_RUN_ON_TARGET -xplatform linux-arm-g++ -arch arm -displaysize 240x320 -no-qvfb -no-bluetooth -no-infrared -no-modem -no-drm extra-qtopiacore-config \"-depths 4,8,16,32 -qt-mouse-linuxtp -no-mouse-pc -no-mouse-bus -no-mouse-yopy -no-mouse-vr41xx -no-mouse-tslib -no-mouse-qvfb\" -extra-qt-config \"-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg\" 2>1 | tee logfile
對于其中的配置參數(shù),有些雖然是Qtopia編譯的默認(rèn)參數(shù),但為了安全和清晰還是加上。
2.3 編譯安裝
#make
#make install
說明:make install默認(rèn)將將編譯完成后的IMAGE安裝在$QTOPIA_IMAGE指定的地方,當(dāng)然你也可以通過make install IMAGE=$OTHER_PLACE重新指定安裝的位置。由于qtopia安裝的時候沒有為我們拷貝zoneinfo,所以還要拷貝一下:
#cp -avf $QTOPIA_DEPOT_PATH/etc/zoneinfo $QTOPIA_INSTALL/etc
qtopia運行的時候需要一些運行庫:
#cd /usr/local/arm/3.4.1/arm-linux/lib
#cp -v libstdc++*so* $QTOPIA_IMAGE/lib/
配置至此結(jié)束,Qtopia已完成編譯。當(dāng)然,嵌入式開發(fā)不可預(yù)知的錯誤很多,而且不盡相同?!俺晒κ窍嗤模∈遣煌摹?,這句話應(yīng)用在嵌入式開發(fā)中十分合適。
2.4 Qtopia的掛載和運行
通過NFS方式掛載后,首先需要先定義一下Qtopia運行所需要的環(huán)境變量:
#export PATH=$PATH:/opt/qtopia/bin
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/qtopia/lib
#export QWS_MOUSE_PROTO=LinuxTP:/dev/ts0
#export QWS_DISPLAY=\"LinuxFb:mmWidth35:mmHeight45:0\"
其中關(guān)于QWS_MOUSE_PROTO的定義,在筆者的板子上觸摸屏是/dev/ts0,但是有些(好像更多的)是/dev/touchscreen/0,若出現(xiàn)找不到觸摸屏的情況可以考慮更改此處的定義,必要的時候可能還需要在/dev下建立符號鏈接來兼容Qtopia。
若這樣依然不能解決問題,可以直接修改源碼該文件為:
$QT_DEPOT_PATH/qtopiacore/qt/src/gui/embedded/qmouselinuxtp_qws.cpp。
運行成功后,建議修改一些關(guān)于板子的配置文件,將環(huán)境變量、設(shè)備符號鏈接等配置的命令加入自啟動腳本,下次啟動后便可以直接運行Qtopia進(jìn)入“桌面”了。
3 Qtopia平臺的完善
3.1 Mplayer播放器的移植
無論是作為何種用途,在utu2440這塊以主頻為最大亮點的開發(fā)板上,下面為它添加對媒體播放的支持。首選播放器當(dāng)然是MPlayer,這里選擇的是最新的MPlayer-1.0rc2版本,交叉編譯器仍然選擇arm-linux-gcc 3.4.1。
需要注意的是,雖然這里用的是最新的1.0rc2版本,但是對于我們需要移植的目標(biāo)板2440而言,一些特性不能被很好支持。所以不僅要做一些參數(shù)上的配置,還需要編譯一些附加的庫來提供支持。
3.2 編譯libmad
由于utu2440開發(fā)板并沒配備專門用于音頻或者視頻解碼的DSP芯片,所有解碼任務(wù)均有CPU完成。由于arm本身沒有浮點運算單元,所有浮點運算均由軟件模擬實現(xiàn),速度之慢可想而知。而MPlayer自帶的音頻解碼器為完全浮點運算的mp3lib,另一個ffmp3庫啟動時有明顯的延遲,而且在解碼某些MPG文件的時候會有兼容性問題,所以我們需要先編譯音頻解碼庫mad,為MPlayer的音頻解碼提供支持。
參考configure的幫助后,很容易寫出如下命令行:
#./configure CC=arm-linux-gcc --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging --prefix=/project/MPlayer/mad
配置完成后,接著make install。成功后就能得到相應(yīng)的mad庫文件了,一個include文件夾,一個lib文件夾。
3.3 配置Mplayer
#./configure --enable-cross-compile --host-cc=gcc --cc=arm-linux-gcc --as=arm-linux-as --ar=arm-linux-ar --ranlib=arm-linux-ranlib --target=armv4l-linux --enable-static --prefix=/tmp/mplayer --disable-dvdread --disable-mencoder --disable-live --enable-fbdev --disable-mp3lib --enable-mad --language=en --disable-win32dll --disable-armv5te --disable-armv6 --with-extraincdir=/project/MPlayer/mad/include --with-extralibdir=/project/MPlayer/mad/lib 2>1 | tee logfile
--enable-cross-compile: 開啟交叉編譯模式。
--host-cc=gcc --cc=arm-linux-gcc --as=arm-linux-as --ar=arm-linux-ar --ranlib=arm-linux-ranlib: 分別指定host和target端編譯器的相關(guān)信息
--target=armv4l-linux: MPlayer支持很多架構(gòu)的處理器,此處我們選擇的2440所使用的armv4l-linux。
在早期的pre版本中,必須要指定armv4l-linux,否則相應(yīng)的優(yōu)化無法被編譯進(jìn)目標(biāo)文件。但是在rc2版本中,也可直接指定arm-linux即可.這里為了清晰起見還是寫的全一點。
--enable-static: 開啟靜態(tài)編譯模式。這里強烈建議開啟,可以省去很多麻煩。如果使用動態(tài)編譯在strip時會出錯。
--prefix=/tmp/mplayer: 設(shè)置安裝的路徑,如果使用static模式,這個參數(shù)無所謂,因為最后直接從當(dāng)前目錄拷出編譯以后的mplayer文件就行了。
--disable-dvdread: 禁用libdvdread庫,沒有人會用開發(fā)板外接光驅(qū)來看DVD.
--disable-mencoder: MEncoder (A/V encoder),MPlayer’s Movie Encoder, 是一個用來編碼MPEG-4的簡單視頻編碼器,這里我們關(guān)掉它,因為不需要它。
--disable-live: 禁用555Live流媒體,對播放媒體文件必然沒關(guān)聯(lián),所以禁用之。
--enable-fbdev: 開啟對幀緩沖設(shè)備的支持,這個一定要選上。
--disable-mp3lib --enable-mad: 禁用使用浮點運算單元的mp3lib庫,開啟我們剛剛編譯完成的mad庫來進(jìn)行音頻解碼。
--disable-win32dll: 禁用win32的動態(tài)鏈接庫支持。
--disable-armv5te --disable-armv6: 禁用armv5te和armv6指令擴(kuò)展。
注:處理器并不支持這兩種指令擴(kuò)展,所以關(guān)掉,否則放任何文件程序都會崩潰。
3.4 播放的設(shè)置和優(yōu)化
經(jīng)過若干測試。對于320*240大小的MPEG1/AVI片源大都能很流暢的播放。
播放mp3或者以mp3為音頻編碼的視頻時,可以通過ac參數(shù)加載我們編譯的mad庫來解碼:
/mplayer $(MediaFile) –ac mad
在由于CPU速度不夠造成的影音不同步,可以通過framedrop參數(shù)讓mplayer做丟幀處理以保證影音同步,./mplayer $(MediaFile) –ac mad –framedrop
3.5 關(guān)于在Qtopia界面集成的問題
MPlayer沒有專門給Qtopia開發(fā)的客戶端,所以GUI界面需要一個用JAVA寫的MPlayer GUI插件,可以在SourceForge上獲得,由于性能關(guān)系,移植后速度很慢,這里不建議使用。
4 Qtopia交叉開發(fā)環(huán)境的建立
開發(fā)Qtopia應(yīng)用程序有許多方法可行,可以使用簡潔的文本編輯器+編譯器的命令行方式組合,也可以使用功能強大的KDevelop、QDevelop等強大的IDE,甚至可以在Windows環(huán)境下用喜歡的工具書寫代碼、繪制圖形界面,然后在Linux環(huán)境下編譯、掛載。
這里主要介紹兩種使用的較多的開發(fā)方式,命令行方式和KDevelop IDE。上文所說的其他方式也試用過,使用起來并不太方便,不推薦使用,僅供參考。下面將以KDevelop IDE中自帶的QtopiaHelloworld程序為例介紹如何編譯出Qtopia的Helloworld。
4.1 命令行方式
在命令方式下開發(fā),適合于一些比較熟悉命令行的高手們。命令行模式下開發(fā),雖然界面部分很難處理,但是單純進(jìn)行無交互界面的功能性開發(fā)卻是十分的方便。
對于在Linux下開發(fā)比較麻煩的Makefile問題,qtopiamake給了我們一個極好的選擇。qtopiamake就是qmake的一個衍生版本,使用基本同qmake一致。一般情況下,只需將所有工程文件放在一個文件夾下,如下幾條命令即可得到我們編寫的Qtopia程序:
#qtopiamake –project # 生成.pro工程文件
#qtopiamake // 生成Makefile
#make
#make install
目前qtopiamake所能識別的文件類型有*.c; *.ui; *.y; *.l; *.ts; *.xlf; *.qrc; *.h; *.hpp; *.hh; *.hxx; *.cpp; *.cc; *.cxx,基本涵蓋了所有我們Qt(Qtopia)工程所需的各種類型。
首先將工程中能被qtopiamake識別和與工程相關(guān)的文件置于一文件夾下,例如KDevelop中的Helloworld模板中的如下文件是有用的:
main.cpp
qtopiahelloworld.html
qtopiahelloworld.cpp
qtopiahelloworld.h
QtopiaHelloworld.png
qtopiahelloworldbase.ui
這里需要提一下,若最后make install時出現(xiàn)下述錯誤:
ERROR: /opt/Qtopia/bin/sxe_installer does not declare the domain: trusted
All pre-installed programs must declare the trusted domain in their project(.pro) file
Aborted
打開工程文件:
#vim $PROJECTNAME.pro
在文件的SXE部分修改如下,若沒有,則手動添加之:
# SXE information
target.hint=sxe
target.domain=trusted
注意,這樣會使得程序擁有對硬件的全部訪問權(quán)。更多的Qtopia SXE安全管理資料可以參照如下的Qtopia文檔:
http://doc.trolltech.com/qtopia4.3/syscust-sxe.html
http://doc.trolltech.com/qtopia4.2/sxe-pkgmgr-profiles.html
4.2 KDevelop IDE
用IDE進(jìn)行開發(fā)可以大大簡化開發(fā)過程,但是用KDevelop之前還是需要進(jìn)行一定的配置工作的。
Ubuntu中的KDevelop源已經(jīng)更新至最新的3.5.3版本的,該版本比3.5.1要穩(wěn)定些,使用中崩潰的次數(shù)有明顯的減少,建議使用,步驟如下:
1) 首先打開Kevelop: C/C++,Project -> New Project.
2) 新建工程類型為C++\\Embedded\\Qtopia 4 Application,然后起個工程名。
3) 在接下來的對話框中,將所有的目錄改為實際的安裝目錄。如上文所述,采用/opt/Qtopia作為SDK根目錄。
4) 一路下一步,最后一定要指定qmake程序的位置:為 /opt/Qtopia/bin/qtopiamake。
5) 工程建立后,KDevelop沒能自動設(shè)置相關(guān)的一些環(huán)境變量,所以我們還需手動修改一下:
Project -> Project Options…
在Make Options標(biāo)簽中手動將PATH, QPEDIR, QTDIR設(shè)置正確,同理設(shè)置Run Options標(biāo)簽中的相關(guān)參數(shù),可設(shè)也可不設(shè)。
6) 將幫助的html文件寫好,放于\\help\\html中,文件名與工程名同名。
注意,幫助文件一定要寫,否則會出錯。若確實不需要幫助文件,可手工編輯.pro文件刪除關(guān)于幫助文件的定義字段。
7)接下來就可以Build -> Build Project了,然后再Build -> Install Project。其中:
① 命令行方式開發(fā)相同,Makefil也由qtopiamake生成,需按照如上方法修改后方可make install。
② 界面的編輯問題,可以選擇KDevelop Designer或官方的Qt Designer。我們認(rèn)為KDevelop Disigner比Qt Designer好用,相比Qt Designer集成度更高,界面也更美觀。但是其生成的ui版本過低,無法進(jìn)行uic。一個折中的方法就是在Windows下安裝,然后用Visual Studio畫界面。
5 結(jié)束語
目前,隨著嵌入式系統(tǒng)的發(fā)展,在一些工業(yè)控制、儀器儀表制造等領(lǐng)域,越來越多嵌入式系統(tǒng)要求圖形顯示界面。我們結(jié)合項目需求和實現(xiàn)體會,介紹了Qtopia平臺配置的方式,以及MPlayer的移植過程,這對同行開發(fā)人員在同類項目研究中,縮短了研發(fā)周期,降低開發(fā)難度,具有一定的借鑒意義。
參考文獻(xiàn):
[1] Trolltech.Online Reference Documentation[EB/OL].http://doc.trolltech.com.
[2] 倪繼利.Qt及Linux操作系統(tǒng)窗口設(shè)計[M].北京:電子工業(yè)出版社,2006.
[3] 徐廣振,張茂青,董里,等.嵌入式GUI應(yīng)用平臺Qtopia在IntelXScale pxa270上的移植[J].自動化信息,2007(3).
[4] 張保立,王俊, 張發(fā)明,等.基于QT/Embedded和Qtopia的嵌入式溫室無線測控系統(tǒng)GUI設(shè)計[J].電子技術(shù),2008(6).