摘要:該文首先簡(jiǎn)要分析了Qtopia的實(shí)現(xiàn)技術(shù)和應(yīng)用現(xiàn)狀,然后詳細(xì)論述了如何在基于s3c2440架構(gòu)的開發(fā)板上移植Qtopia開發(fā)平臺(tái)的過(guò)程,并結(jié)合項(xiàng)目需求介紹了Qtopia平臺(tái)部分功能的完善。此外還介紹了MPlayer的移植過(guò)程,以及開發(fā)環(huán)境的搭建和若干開發(fā)實(shí)例。
關(guān)鍵詞:Qtopia,嵌入式Linux,utu2440,MPlayer
中圖分類號(hào):TP316文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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)”這個(gè)名詞已經(jīng)被各行各業(yè)的人所熟悉,它正以不同的形式改變著我們的生活生產(chǎn)方式。
Linux作為源碼完全開放的操作系統(tǒng),最近發(fā)展十分迅速。正是由于其開源特性得到了諸多愛(ài)好者和組織的支持,成為了嵌入式設(shè)備主流的操作系統(tǒng)之一。Qtopia作為一個(gè)成熟的跨平臺(tái)的C++開發(fā)平臺(tái),已經(jīng)發(fā)展過(guò)4代產(chǎn)品,其豐富的開發(fā)文檔支持和應(yīng)用實(shí)例,使其完全有理由充當(dāng)嵌入式應(yīng)用程序開發(fā)的首選平臺(tái)。
Qt/Embedded(簡(jiǎn)稱Qt/E)作為Trolltech開發(fā)的面向嵌入式系統(tǒng)的Qt版本,完全采用C++封裝,
兼容同版本的Qt-X11。Qt/E底層顯示的設(shè)備是幀緩沖設(shè)備/dev/fb0,也是標(biāo)準(zhǔn)顯示設(shè)備驅(qū)動(dòng)的接口。通過(guò)使用mma函數(shù)將幀緩存映射到應(yīng)用程序可訪問(wèn)的虛擬內(nèi)存空間中,直接進(jìn)行讀寫操作,便可立即反應(yīng)在屏幕上。Qt/E的將所有輸入均抽象為keyboard和mouse的輸入事件,而底層接口支持鍵盤、鼠標(biāo)、觸摸屏和自定義設(shè)備。下圖可以描述了Qt/E的實(shí)現(xiàn)結(jié)構(gòu):
2 Qtopia環(huán)境的設(shè)置
2.1 編譯環(huán)境的準(zhǔn)備
Qtopia的編譯是一個(gè)較為復(fù)雜的過(guò)程,對(duì)編譯環(huán)境的精心準(zhǔn)備是確保整個(gè)過(guò)程順利的重要部分。首先介紹一下軟硬件環(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)然,對(duì)于編譯和部署Qtopia而言,也許并不是最好的。其中很多問(wèn)題或編譯錯(cuò)誤也許都可以在openSUSE下輕松解決,因?yàn)槠淠J(rèn)的軟件包配置中就包含了絕大多數(shù)重要的QT(Qtopia)開發(fā)庫(kù)。
使用其他Linux Host系統(tǒng)也是可以,openSUSE、Fedora都是很好的選擇,使用它們也許會(huì)很大程度上避免由于缺少庫(kù)文件導(dǎo)致的編譯錯(cuò)誤。此處我們選擇Ubuntu作為開發(fā)環(huán)境是因?yàn)榭臻g原因未能安裝其他發(fā)行版Linux系統(tǒng),畢竟對(duì)于這類經(jīng)常使用Linux的人而言,其他發(fā)行版的桌面應(yīng)用體驗(yàn)遠(yuǎn)遠(yuǎn)不及Ubuntu。
2.2 編譯參數(shù)的配置
首先做幾點(diǎn)說(shuō)明:
1) 由于編譯出來(lái)的Qtopia大小很可能超過(guò)開發(fā)板Flash的大小,所以我們采用NFS方式進(jìn)行開發(fā)和調(diào)試,之后再考慮精簡(jiǎn)。
2) 為避免麻煩和一些不可預(yù)知的問(wèn)題,以下操作一律在root的Shell下執(zhí)行。下面說(shuō)明如何配置編譯環(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掛載的時(shí)候,該目錄即為Qtopia的根目錄。
2.2.2 加入宏定義,使得Qtopia支持觸摸屏
#vim $QTOPIA_DEPOT_PATH/qtopiacore/qconfig-qpe.h
然后在文件末尾添加宏定義:
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
在utu2440開發(fā)板上,不定義這兩個(gè)宏也能夠使用觸摸屏,但無(wú)論如何配置內(nèi)核關(guān)于觸摸屏的選項(xiàng),就是校不準(zhǔn)觸摸屏,因此需要定義這兩個(gè)宏.
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 修改時(shí)區(qū)信息的讀取路徑
#vim $QTOPIA_DEPOT_PATH/qtopiacore/qconfig-qpe.h
在文件末尾添加宏定義:
#define QTOPIA_ZONEINFO_PATH \"/opt/qtopia/etc/zoneinfo/\"
QTOPIA_ZONEINFO_PATH即時(shí)區(qū)文件所在的路徑,因?yàn)镼topia會(huì)在默認(rèn)的/usr/share/zoneinfo里尋找時(shí)區(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
這個(gè)軟件包在編譯過(guò)程中會(huì)用到,若不安裝會(huì)出錯(cuò)。
2.2.6 修改編譯器的.h文件
由于3.4.1的編譯器不支持qtopia4.3.2的一些特性,所以需要修改以下兩文件,否則會(huì)出現(xiàn)編譯錯(cuò)誤:
#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
在兩個(gè)文件第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
對(duì)于其中的配置參數(shù),有些雖然是Qtopia編譯的默認(rèn)參數(shù),但為了安全和清晰還是加上。
2.3 編譯安裝
#make
#make install
說(shuō)明:make install默認(rèn)將將編譯完成后的IMAGE安裝在$QTOPIA_IMAGE指定的地方,當(dāng)然你也可以通過(guò)make install IMAGE=$OTHER_PLACE重新指定安裝的位置。由于qtopia安裝的時(shí)候沒(méi)有為我們拷貝zoneinfo,所以還要拷貝一下:
#cp -avf $QTOPIA_DEPOT_PATH/etc/zoneinfo $QTOPIA_INSTALL/etc
qtopia運(yùn)行的時(shí)候需要一些運(yùn)行庫(kù):
#cd /usr/local/arm/3.4.1/arm-linux/lib
#cp -v libstdc++*so* $QTOPIA_IMAGE/lib/
配置至此結(jié)束,Qtopia已完成編譯。當(dāng)然,嵌入式開發(fā)不可預(yù)知的錯(cuò)誤很多,而且不盡相同。“成功是相同的,失敗是不同的”,這句話應(yīng)用在嵌入式開發(fā)中十分合適。
2.4 Qtopia的掛載和運(yùn)行
通過(guò)NFS方式掛載后,首先需要先定義一下Qtopia運(yùn)行所需要的環(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)找不到觸摸屏的情況可以考慮更改此處的定義,必要的時(shí)候可能還需要在/dev下建立符號(hào)鏈接來(lái)兼容Qtopia。
若這樣依然不能解決問(wèn)題,可以直接修改源碼該文件為:
$QT_DEPOT_PATH/qtopiacore/qt/src/gui/embedded/qmouselinuxtp_qws.cpp。
運(yùn)行成功后,建議修改一些關(guān)于板子的配置文件,將環(huán)境變量、設(shè)備符號(hào)鏈接等配置的命令加入自啟動(dòng)腳本,下次啟動(dòng)后便可以直接運(yùn)行Qtopia進(jìn)入“桌面”了。
3 Qtopia平臺(tái)的完善
3.1 Mplayer播放器的移植
無(wú)論是作為何種用途,在utu2440這塊以主頻為最大亮點(diǎn)的開發(fā)板上,下面為它添加對(duì)媒體播放的支持。首選播放器當(dāng)然是MPlayer,這里選擇的是最新的MPlayer-1.0rc2版本,交叉編譯器仍然選擇arm-linux-gcc 3.4.1。
需要注意的是,雖然這里用的是最新的1.0rc2版本,但是對(duì)于我們需要移植的目標(biāo)板2440而言,一些特性不能被很好支持。所以不僅要做一些參數(shù)上的配置,還需要編譯一些附加的庫(kù)來(lái)提供支持。
3.2 編譯libmad
由于utu2440開發(fā)板并沒(méi)配備專門用于音頻或者視頻解碼的DSP芯片,所有解碼任務(wù)均有CPU完成。由于arm本身沒(méi)有浮點(diǎn)運(yùn)算單元,所有浮點(diǎn)運(yùn)算均由軟件模擬實(shí)現(xiàn),速度之慢可想而知。而MPlayer自帶的音頻解碼器為完全浮點(diǎn)運(yùn)算的mp3lib,另一個(gè)ffmp3庫(kù)啟動(dòng)時(shí)有明顯的延遲,而且在解碼某些MPG文件的時(shí)候會(huì)有兼容性問(wèn)題,所以我們需要先編譯音頻解碼庫(kù)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庫(kù)文件了,一個(gè)include文件夾,一個(gè)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)化無(wú)法被編譯進(jìn)目標(biāo)文件。但是在rc2版本中,也可直接指定arm-linux即可.這里為了清晰起見(jiàn)還是寫的全一點(diǎn)。
--enable-static: 開啟靜態(tài)編譯模式。這里強(qiáng)烈建議開啟,可以省去很多麻煩。如果使用動(dòng)態(tài)編譯在strip時(shí)會(huì)出錯(cuò)。
--prefix=/tmp/mplayer: 設(shè)置安裝的路徑,如果使用static模式,這個(gè)參數(shù)無(wú)所謂,因?yàn)樽詈笾苯訌漠?dāng)前目錄拷出編譯以后的mplayer文件就行了。
--disable-dvdread: 禁用libdvdread庫(kù),沒(méi)有人會(huì)用開發(fā)板外接光驅(qū)來(lái)看DVD.
--disable-mencoder: MEncoder (A/V encoder),MPlayer’s Movie Encoder, 是一個(gè)用來(lái)編碼MPEG-4的簡(jiǎn)單視頻編碼器,這里我們關(guān)掉它,因?yàn)椴恍枰?/p>
--disable-live: 禁用555Live流媒體,對(duì)播放媒體文件必然沒(méi)關(guān)聯(lián),所以禁用之。
--enable-fbdev: 開啟對(duì)幀緩沖設(shè)備的支持,這個(gè)一定要選上。
--disable-mp3lib --enable-mad: 禁用使用浮點(diǎn)運(yùn)算單元的mp3lib庫(kù),開啟我們剛剛編譯完成的mad庫(kù)來(lái)進(jìn)行音頻解碼。
--disable-win32dll: 禁用win32的動(dòng)態(tài)鏈接庫(kù)支持。
--disable-armv5te --disable-armv6: 禁用armv5te和armv6指令擴(kuò)展。
注:處理器并不支持這兩種指令擴(kuò)展,所以關(guān)掉,否則放任何文件程序都會(huì)崩潰。
3.4 播放的設(shè)置和優(yōu)化
經(jīng)過(guò)若干測(cè)試。對(duì)于320*240大小的MPEG1/AVI片源大都能很流暢的播放。
播放mp3或者以mp3為音頻編碼的視頻時(shí),可以通過(guò)ac參數(shù)加載我們編譯的mad庫(kù)來(lái)解碼:
/mplayer $(MediaFile) –ac mad
在由于CPU速度不夠造成的影音不同步,可以通過(guò)framedrop參數(shù)讓mplayer做丟幀處理以保證影音同步,./mplayer $(MediaFile) –ac mad –framedrop
3.5 關(guān)于在Qtopia界面集成的問(wèn)題
MPlayer沒(méi)有專門給Qtopia開發(fā)的客戶端,所以GUI界面需要一個(gè)用JAVA寫的MPlayer GUI插件,可以在SourceForge上獲得,由于性能關(guān)系,移植后速度很慢,這里不建議使用。
4 Qtopia交叉開發(fā)環(huán)境的建立
開發(fā)Qtopia應(yīng)用程序有許多方法可行,可以使用簡(jiǎn)潔的文本編輯器+編譯器的命令行方式組合,也可以使用功能強(qiáng)大的KDevelop、QDevelop等強(qiáng)大的IDE,甚至可以在Windows環(huán)境下用喜歡的工具書寫代碼、繪制圖形界面,然后在Linux環(huán)境下編譯、掛載。
這里主要介紹兩種使用的較多的開發(fā)方式,命令行方式和KDevelop IDE。上文所說(shuō)的其他方式也試用過(guò),使用起來(lái)并不太方便,不推薦使用,僅供參考。下面將以KDevelop IDE中自帶的QtopiaHelloworld程序?yàn)槔榻B如何編譯出Qtopia的Helloworld。
4.1 命令行方式
在命令方式下開發(fā),適合于一些比較熟悉命令行的高手們。命令行模式下開發(fā),雖然界面部分很難處理,但是單純進(jìn)行無(wú)交互界面的功能性開發(fā)卻是十分的方便。
對(duì)于在Linux下開發(fā)比較麻煩的Makefile問(wèn)題,qtopiamake給了我們一個(gè)極好的選擇。qtopiamake就是qmake的一個(gè)衍生版本,使用基本同qmake一致。一般情況下,只需將所有工程文件放在一個(gè)文件夾下,如下幾條命令即可得到我們編寫的Qtopia程序:
#qtopiamake –project # 生成.pro工程文件
#qtopiamake // 生成Makefile
#make
#make install
目前qtopiamake所能識(shí)別的文件類型有*.c; *.ui; *.y; *.l; *.ts; *.xlf; *.qrc; *.h; *.hpp; *.hh; *.hxx; *.cpp; *.cc; *.cxx,基本涵蓋了所有我們Qt(Qtopia)工程所需的各種類型。
首先將工程中能被qtopiamake識(shí)別和與工程相關(guān)的文件置于一文件夾下,例如KDevelop中的Helloworld模板中的如下文件是有用的:
main.cpp
qtopiahelloworld.html
qtopiahelloworld.cpp
qtopiahelloworld.h
QtopiaHelloworld.png
qtopiahelloworldbase.ui
這里需要提一下,若最后make install時(shí)出現(xiàn)下述錯(cuò)誤:
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部分修改如下,若沒(méi)有,則手動(dòng)添加之:
# SXE information
target.hint=sxe
target.domain=trusted
注意,這樣會(huì)使得程序擁有對(duì)硬件的全部訪問(wèn)權(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ā)可以大大簡(jiǎn)化開發(fā)過(guò)程,但是用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,然后起個(gè)工程名。
3) 在接下來(lái)的對(duì)話框中,將所有的目錄改為實(shí)際的安裝目錄。如上文所述,采用/opt/Qtopia作為SDK根目錄。
4) 一路下一步,最后一定要指定qmake程序的位置:為 /opt/Qtopia/bin/qtopiamake。
5) 工程建立后,KDevelop沒(méi)能自動(dòng)設(shè)置相關(guān)的一些環(huán)境變量,所以我們還需手動(dòng)修改一下:
Project -> Project Options…
在Make Options標(biāo)簽中手動(dòng)將PATH, QPEDIR, QTDIR設(shè)置正確,同理設(shè)置Run Options標(biāo)簽中的相關(guān)參數(shù),可設(shè)也可不設(shè)。
6) 將幫助的html文件寫好,放于\\help\\html中,文件名與工程名同名。
注意,幫助文件一定要寫,否則會(huì)出錯(cuò)。若確實(shí)不需要幫助文件,可手工編輯.pro文件刪除關(guān)于幫助文件的定義字段。
7)接下來(lái)就可以Build -> Build Project了,然后再Build -> Install Project。其中:
① 命令行方式開發(fā)相同,Makefil也由qtopiamake生成,需按照如上方法修改后方可make install。
② 界面的編輯問(wèn)題,可以選擇KDevelop Designer或官方的Qt Designer。我們認(rèn)為KDevelop Disigner比Qt Designer好用,相比Qt Designer集成度更高,界面也更美觀。但是其生成的ui版本過(guò)低,無(wú)法進(jìn)行uic。一個(gè)折中的方法就是在Windows下安裝,然后用Visual Studio畫界面。
5 結(jié)束語(yǔ)
目前,隨著嵌入式系統(tǒng)的發(fā)展,在一些工業(yè)控制、儀器儀表制造等領(lǐng)域,越來(lái)越多嵌入式系統(tǒng)要求圖形顯示界面。我們結(jié)合項(xiàng)目需求和實(shí)現(xiàn)體會(huì),介紹了Qtopia平臺(tái)配置的方式,以及MPlayer的移植過(guò)程,這對(duì)同行開發(fā)人員在同類項(xiàng)目研究中,縮短了研發(fā)周期,降低開發(fā)難度,具有一定的借鑒意義。
參考文獻(xiàn):
[1] Trolltech.Online Reference Documentation[EB/OL].http://doc.trolltech.com.
[2] 倪繼利.Qt及Linux操作系統(tǒng)窗口設(shè)計(jì)[M].北京:電子工業(yè)出版社,2006.
[3] 徐廣振,張茂青,董里,等.嵌入式GUI應(yīng)用平臺(tái)Qtopia在IntelXScale pxa270上的移植[J].自動(dòng)化信息,2007(3).
[4] 張保立,王俊, 張發(fā)明,等.基于QT/Embedded和Qtopia的嵌入式溫室無(wú)線測(cè)控系統(tǒng)GUI設(shè)計(jì)[J].電子技術(shù),2008(6).