Qtopia 移植實驗過程
本文介紹的內容是關于 Qt opia 移植實驗過程,以實驗報告的形式向大家展現內容,方便又很清晰的瀏覽內容。
一、準備工作
了解QT庫的使用
了解QTopia移植步驟
學習如何使用Tslib來構建帶有觸摸屏的GUI系統
二、實驗原理
1、實驗程序介紹
本章重點講述如何利用源代碼一步一步的將Qtopia(一套基于QT的GUI界面)移植到Filesystem中,最終可以在開發板上看到Qtopia運行起來。
2、實驗原理
目前嵌入式Linux的主流GUI系統主要有MiniGUI、Microwindows、OpenGUI、Qt/Embedded,這些GUI在接口定義、體系結構、功能特性存在很大差別,采取的技術路線也有所不同。MiniGUI是建立在比較成熟的圖形引擎之上,開發的重點在于窗口系統,其小巧精致并且盡量與Win32兼容。MicroWindows目前開發的重點在底層的圖形引擎,窗口系統和圖形接口方面功能比較欠缺,與Win32和X Windows窗口系統保持兼容,提供了相對完善的圖形功能。OpenGUI基于一個用匯編實現的x86圖形內核,提供了一個高層的C/C++圖形/窗口接口,它的資源消耗小,可移植性差,不支持多進程。
我們這次的實驗用的就是基于Qt/Embedded,它具有良好的擴展性和眾多優秀的配套工具。
實驗過程中,一共用到4個源代碼包,下面是它們的介紹說明:
Qt/Embedded:Qt/Embedded是一個多平臺的C++圖形用戶界面應用程序框架,其對象容易擴展,可移植性好,支持多個GUI平臺的交互開發。現在,Qt/Embedded被廣泛地應用于各種嵌入式產品和設備中,從消費電器(如智能手機、機頂盒)到工業控制設備(如醫學成像設備、移動信息系統等)。因此本實訓項目選擇Qt/Embedded為系統的GUI。
Qtopia :Qtopia 是Trolltech 公司為采用嵌入式Linux 操作系統的消費電子設備而開發的綜合應用平臺, 它基于Qt/Embedded框架,所以在編譯Qtopia之前先要搭建好Qt/Embedded框架。另外Qtopia包含完整的應用層、靈活的用戶界面、窗口操作系統、應用程序啟動程序以及開發框架。
Tslib:在采用觸摸屏的移動終端中,觸摸屏性能的調試是個重要問題之一,因為電磁噪聲的緣故,觸摸屏容易存在點擊不準確、有抖動等問題。Tslib是一個開源的程序,能夠為觸摸屏驅動獲得的采樣提供諸如濾波、去抖、校準等功能,通常作為觸摸屏驅動的適配層,為上層的應用提供了一個統一的接口。
Tmake:tmake是一個很好用的生成和管理makefile的工具,他是由Trolltech這家公司開發的,用perl寫成。
3、移植流程圖
圖1 流程示意圖
三、實驗步驟
1、實驗準備
首先需要下載如下資源:
- 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的命令
解壓這四個壓縮包分別到如下幾個目錄:
- 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、設置環境變量
在Shell中輸入下了命令,也可以做一個腳本文件來執行
- 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界面輸入如下命令,假設當前目錄是”/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/
- //拷貝生成的庫文件到QT/E源碼中
- [root@emdoor tslib-1.3]$cp -a src/*.h ../qt-2.3.7/include //拷貝文件到QT/E源碼中
這樣我們就生成Tslib的庫文件與鏈接文件了
4、編譯QT/E 2.3.7
由于我們最終要編譯的是qtopia 1.7.0,而它對應的QT/E庫文件是2.3.7,所以我們需要交叉編譯一個它專用的QT/E框架,即庫文件
(1)首先即要確保步驟2已經完成,并且生成的庫文件都是ARM架構的,可以用下列代碼測試一下:
- [root@emdoor tslib-1.3]$ file /work/qt-2.3.7/lib/libts* //反饋信息中會有ARM字樣
(2)為了能在Qt/E中順利使用觸摸屏,還需要做如下修改
修改configs/ linux-arm-g++-shared的第41行,紅色部分為新添加內容,表示在編譯過程中,調用libts.so庫文件,即導入了我們步驟二生成的觸摸屏驅動程序
SYSCONF_LIBS = -lm –lts
從實驗源代碼中的補丁目錄,找到一個名字為“qwsmouse_qws.cpp”替換掉qt-2.3.7目錄下對應的同名文件(src/kernel目錄內),由于該代碼修改的內容較多,筆者在此就不一一描述,該修改主要將tslib的調用方式嵌入到Qt/E中,感興趣的讀者可以自行解讀該代碼。
(3)進入源代碼目錄,使用configure進行配置
- [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針對QT/E 2.3.7預設了一個配置腳本qconfig-qpe.h,所以要將其拷貝到src/tools目錄下,然后在configure中就可以用”—qconfig”調用了
(4)隨后QT的配置過程中會跳出幾個問題,回答如下:
- 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目錄下的內容
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
這樣就會在當前目錄生成整個GUI界面的所有可執行文件和配置文件
6、壓縮CodeSize
生成的系統有點冗余,可以用arm-linux-strip工具將多余的調試信息剝離開,減小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、構建Run-time目錄
由于Otopia目錄下還存在的源代碼之類的文件,而且它的運行離不開QT/E的共享庫文件,所以我們新建一個qpe目錄,然后把Qtopia給放進去:
- [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)進入由上一章節生成的busybox的Filesystem,將qpe目錄拷貝到Filesystem中的usr目錄下,即目標板運行起來時,qpe的絕對路徑是/usr/qpe
(2)新建一個Qtopia運行腳本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)根據busybox實驗的步驟進行格式化和運行即可
小結:Qt opia 移植實驗過程的內容介紹完了,希望對你有所幫助。關于Qt/Embedded,它是一個多平臺的C++圖形用戶界面應用程序框架,其對象容易擴展,可移植性好,支持多個GUI平臺的交互開發。