Qtopia 移植實(shí)驗(yàn)過(guò)程
本文介紹的內(nèi)容是關(guān)于 Qt opia 移植實(shí)驗(yàn)過(guò)程,以實(shí)驗(yàn)報(bào)告的形式向大家展現(xiàn)內(nèi)容,方便又很清晰的瀏覽內(nèi)容。
一、準(zhǔn)備工作
了解QT庫(kù)的使用
了解QTopia移植步驟
學(xué)習(xí)如何使用Tslib來(lái)構(gòu)建帶有觸摸屏的GUI系統(tǒng)
二、實(shí)驗(yàn)原理
1、實(shí)驗(yàn)程序介紹
本章重點(diǎn)講述如何利用源代碼一步一步的將Qtopia(一套基于QT的GUI界面)移植到Filesystem中,最終可以在開發(fā)板上看到Qtopia運(yùn)行起來(lái)。
2、實(shí)驗(yàn)原理
目前嵌入式Linux的主流GUI系統(tǒng)主要有MiniGUI、Microwindows、OpenGUI、Qt/Embedded,這些GUI在接口定義、體系結(jié)構(gòu)、功能特性存在很大差別,采取的技術(shù)路線也有所不同。MiniGUI是建立在比較成熟的圖形引擎之上,開發(fā)的重點(diǎn)在于窗口系統(tǒng),其小巧精致并且盡量與Win32兼容。MicroWindows目前開發(fā)的重點(diǎn)在底層的圖形引擎,窗口系統(tǒng)和圖形接口方面功能比較欠缺,與Win32和X Windows窗口系統(tǒng)保持兼容,提供了相對(duì)完善的圖形功能。OpenGUI基于一個(gè)用匯編實(shí)現(xiàn)的x86圖形內(nèi)核,提供了一個(gè)高層的C/C++圖形/窗口接口,它的資源消耗小,可移植性差,不支持多進(jìn)程。
我們這次的實(shí)驗(yàn)用的就是基于Qt/Embedded,它具有良好的擴(kuò)展性和眾多優(yōu)秀的配套工具。
實(shí)驗(yàn)過(guò)程中,一共用到4個(gè)源代碼包,下面是它們的介紹說(shuō)明:
Qt/Embedded:Qt/Embedded是一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架,其對(duì)象容易擴(kuò)展,可移植性好,支持多個(gè)GUI平臺(tái)的交互開發(fā)?,F(xiàn)在,Qt/Embedded被廣泛地應(yīng)用于各種嵌入式產(chǎn)品和設(shè)備中,從消費(fèi)電器(如智能手機(jī)、機(jī)頂盒)到工業(yè)控制設(shè)備(如醫(yī)學(xué)成像設(shè)備、移動(dòng)信息系統(tǒng)等)。因此本實(shí)訓(xùn)項(xiàng)目選擇Qt/Embedded為系統(tǒng)的GUI。
Qtopia :Qtopia 是Trolltech 公司為采用嵌入式Linux 操作系統(tǒng)的消費(fèi)電子設(shè)備而開發(fā)的綜合應(yīng)用平臺(tái), 它基于Qt/Embedded框架,所以在編譯Qtopia之前先要搭建好Qt/Embedded框架。另外Qtopia包含完整的應(yīng)用層、靈活的用戶界面、窗口操作系統(tǒng)、應(yīng)用程序啟動(dòng)程序以及開發(fā)框架。
Tslib:在采用觸摸屏的移動(dòng)終端中,觸摸屏性能的調(diào)試是個(gè)重要問(wèn)題之一,因?yàn)殡姶旁肼暤木壒剩|摸屏容易存在點(diǎn)擊不準(zhǔn)確、有抖動(dòng)等問(wèn)題。Tslib是一個(gè)開源的程序,能夠?yàn)橛|摸屏驅(qū)動(dòng)獲得的采樣提供諸如濾波、去抖、校準(zhǔn)等功能,通常作為觸摸屏驅(qū)動(dòng)的適配層,為上層的應(yīng)用提供了一個(gè)統(tǒng)一的接口。
Tmake:tmake是一個(gè)很好用的生成和管理makefile的工具,他是由Trolltech這家公司開發(fā)的,用perl寫成。
3、移植流程圖
圖1 流程示意圖
三、實(shí)驗(yàn)步驟
1、實(shí)驗(yàn)準(zhǔn)備
首先需要下載如下資源:
- qtopia-free-1.7.0.tar.bz2
- qt-embedded-2.3.7.tar.bz2
- tmake-1.11.tar.gz
- Tslib-1.3.tar.gz
其次,需要保證能夠正常使用交叉編譯工具鏈,即可以正常使用諸如arm-linux-gcc的命令
解壓這四個(gè)壓縮包分別到如下幾個(gè)目錄:
- qtopia-free-1.7.0.tar.bz2 /work/qtopia-1.7.0
- qt-embedded-2.3.7.tar.bz2 /work/qt-2.3.7
- tmake-1.11.tar.gz /work/tmake-1.11
- Tslib-1.3.tar.gz /work/tslib-1.3
2、設(shè)置環(huán)境變量
在Shell中輸入下了命令,也可以做一個(gè)腳本文件來(lái)執(zhí)行
- export export QTDIR=/work/qt-2.3.7
- export export QPEDIR=/work/qtopia-1.7.0
- export LD_LIBRARY_PATH=/work/qt-2.3.7/lib:$LD_LIBRARY_PATH
- export TMAKEDIR=/work/tmake-1.11
- export TMAKEPATH=/work/tmake-1.11/lib/qws/linux-arm-g++
- export PATH=/work/tmake-1.11/bin:$PATH
3、編譯Tslib 1.3
在Shell界面輸入如下命令,假設(shè)當(dāng)前目錄是”/work”
- [root@emdoor work]#cd tslib-1.3
- [root@emdoor tslib-1.3]#export CC=arm-linux-gcc //選擇編譯工具鏈
- [root@emdoor tslib-1.3]#./autogen.sh
- [root@emdoor tslib-1.3]#./configure --host=arm-linux //生成ARM版本的Tslib
- [root@emdoor tslib-1.3]#make
- [root@emdoor tslib-1.3]#cp -a src/.libs/* ../qt-2.3.7/lib/
- [root@emdoor tslib-1.3]$cp -a plugins/.libs/*.so ../qt-2.3.7/lib/
- //拷貝生成的庫(kù)文件到QT/E源碼中
- [root@emdoor tslib-1.3]$cp -a src/*.h ../qt-2.3.7/include //拷貝文件到QT/E源碼中
這樣我們就生成Tslib的庫(kù)文件與鏈接文件了
4、編譯QT/E 2.3.7
由于我們最終要編譯的是qtopia 1.7.0,而它對(duì)應(yīng)的QT/E庫(kù)文件是2.3.7,所以我們需要交叉編譯一個(gè)它專用的QT/E框架,即庫(kù)文件
(1)首先即要確保步驟2已經(jīng)完成,并且生成的庫(kù)文件都是ARM架構(gòu)的,可以用下列代碼測(cè)試一下:
- [root@emdoor tslib-1.3]$ file /work/qt-2.3.7/lib/libts* //反饋信息中會(huì)有ARM字樣
(2)為了能在Qt/E中順利使用觸摸屏,還需要做如下修改
修改configs/ linux-arm-g++-shared的第41行,紅色部分為新添加內(nèi)容,表示在編譯過(guò)程中,調(diào)用libts.so庫(kù)文件,即導(dǎo)入了我們步驟二生成的觸摸屏驅(qū)動(dòng)程序
SYSCONF_LIBS = -lm –lts
從實(shí)驗(yàn)源代碼中的補(bǔ)丁目錄,找到一個(gè)名字為“qwsmouse_qws.cpp”替換掉qt-2.3.7目錄下對(duì)應(yīng)的同名文件(src/kernel目錄內(nèi)),由于該代碼修改的內(nèi)容較多,筆者在此就不一一描述,該修改主要將tslib的調(diào)用方式嵌入到Qt/E中,感興趣的讀者可以自行解讀該代碼。
(3)進(jìn)入源代碼目錄,使用configure進(jìn)行配置
- [root@emdoor qt-2.3.7]$ cd $QTDIR
- [root@emdoor qt-2.3.7]$ cp /work/qtopia-1.7.0/src/qt/qconfig-qpe.h src/tools/
- [root@emdoor qt-2.3.7]$ ./configure -xplatform linux-arm-g++ -qconfig qpe
注意:qtopia 1.7.0針對(duì)QT/E 2.3.7預(yù)設(shè)了一個(gè)配置腳本qconfig-qpe.h,所以要將其拷貝到src/tools目錄下,然后在configure中就可以用”—qconfig”調(diào)用了
(4)隨后QT的配置過(guò)程中會(huì)跳出幾個(gè)問(wèn)題,回答如下:
- Q:… license? A:yes
- Q:color depth? A:16
- Q:Virtual Framebuffer? A:no
(5)***就直接編譯了:
[root@emdoor qt-2.3.7]$ make sub-src //sub-src表示僅編譯src目錄下的內(nèi)容
5、編譯Qtopia 1.7.0
- [root@emdoor qt-2.3.7]$ cd $QPEDIR
- [root@emdoor qtopia-1.7.0]$ ./configure -xplatform linux-arm-g++
- [root@emdoor qtopia-1.7.0]$ make
這樣就會(huì)在當(dāng)前目錄生成整個(gè)GUI界面的所有可執(zhí)行文件和配置文件
6、壓縮CodeSize
生成的系統(tǒng)有點(diǎn)冗余,可以用arm-linux-strip工具將多余的調(diào)試信息剝離開,減小Qtopia的體積:
- [root@emdoor qtopia-1.7.0]$ arm-linux-strip -R .note -R .comment bin/*
- [root@emdoor qtopia-1.7.0]$ arm-linux-strip -R .note -R .comment plugins/*/*
- [root@emdoor qtopia-1.7.0]$ arm-linux-strip -R .note -R .comment $QTDIR/lib/libqte.so* $QTDIR/lib/libqpe.so*
7、構(gòu)建Run-time目錄
由于Otopia目錄下還存在的源代碼之類的文件,而且它的運(yùn)行離不開QT/E的共享庫(kù)文件,所以我們新建一個(gè)qpe目錄,然后把Qtopia給放進(jìn)去:
- [root@emdoor qtopia-1.7.0]$ mkdir ../qpe
- [root@emdoor qtopia-1.7.0]$ cd ../qpe
- [root@emdoor qpe]$ cp -aR ../qt-2.3.7/lib/ ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/lib/* ./lib
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/apps ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/bin ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/plugins ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/i18n ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/pics . /
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/etc . /
- [root@emdoor qpe]$ cp ../tslib/etc/ts.conf /qpe/etc
- [root@emdoor qpe]$ cp ../tslib/tests/.libs/ts.calibrate /qpe/bin
8、整合入filesystem
(1)進(jìn)入由上一章節(jié)生成的busybox的Filesystem,將qpe目錄拷貝到Filesystem中的usr目錄下,即目標(biāo)板運(yùn)行起來(lái)時(shí),qpe的絕對(duì)路徑是/usr/qpe
(2)新建一個(gè)Qtopia運(yùn)行腳本qpe.sh ,具體代碼如下:
- /usr/qpe/qpe.sh
- export QTDIR=/usr/qpe
- export QPEDIR=/usr/qpe
- export LANG=zh_CN
- export LD_LIBRARY_PATH=/usr/qpe/lib:$LD_LIBRARY_PATH
- export QT_TSLIBDIR=/usr/qpe/lib
- export TSLIB_CONFFILE=/usr/qpe/etc/ts.conf
- export TSLIB_PLUGINDIR=/usr/qpe/lib
- export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/ucb1x00
- export KDEDIR=/usr/qpe
- cd /usr/qpe/bin
- ./ts_calibrate
- ./qpe -qws
(3)修改etc目錄下的inittab文件,在該文件的末尾加入如下代碼:
- x:5:once:/usr/qpe/qpe.sh &> /dev/null
(4)根據(jù)busybox實(shí)驗(yàn)的步驟進(jìn)行格式化和運(yùn)行即可
小結(jié):Qt opia 移植實(shí)驗(yàn)過(guò)程的內(nèi)容介紹完了,希望對(duì)你有所幫助。關(guān)于Qt/Embedded,它是一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架,其對(duì)象容易擴(kuò)展,可移植性好,支持多個(gè)GUI平臺(tái)的交互開發(fā)。