http://blog.csdn.net/sabalol/archive/2009/01/08/3737093.aspx
前一陣子,一直是用的qtopia-free-1.7.0.tar.gz,因為這個已經在開發板運行起來了的,但由於要求實現硬體滑鼠,所以得去分析
qtopia的原始碼;在網上逛了逛,發現qtopia最新完全版已經是4.3.2了,而且介面也十分漂亮,於是就想,既然要分析qtopia的原始碼,
為什麼不直接使用最新的qt4呢,而且qt4也必將是今後一段時間的主流,於是決定移植最新的qtopia-4.3.2完全版。
概念:
什麼是qtopia?
Qtopia
是一個面向嵌入式
Linux
的全方位應用程式開發平台,同時也是用於基於
Linux
的
PDA
(個人數位助理),智能電話(
Smartphone
)以及其他行動裝置的使用者介面。簡單地說,
Qtopia
實質上是一組關於
PDA
和智能電話的應用程式結合,如果需要開發這類產品可以在這組程式的基礎上迅速構建出
PDA
或者智能電話。
一、環境:
主機系統:Fedora 10
目標板:重慶神州龍芯科技有限公司的CQ8401工控機開發板,1024x768液晶顯示器,PS2滑鼠、鍵盤
CPU: mipsel ,主頻400MHz,
記憶體64M
檔案系統:使用nfs(busybox 1.13.1)
硬碟:160G(IDE或SATA)
qtopia版本: qtopia 4.3.2 大小:109.89M
:ftp://ftp.trolltech.com/qtopia/source/qtopia-opensource-src-4.3.2.tar.gz
交叉編譯器:mipsel-linux-gcc, mipsel-linux-g++ //gcc版本3.3.6
二、準備工作:
建立build目錄和安裝目錄:
目錄結構:
/opt/qtopia/source 原始碼解壓到該目錄(根據.configure提示,必須為source目錄。
/opt/qtopia/target編譯目錄:存放configure,make產生的檔案(編譯目錄不能為source目錄)
/usr/local/qtopia安裝目錄,安裝後,複製到nfs檔案系統的對應目錄下,如:我的nfs檔案系統結構為:/nfsroot/cq8401/{bin,etc,lib,opt,tmp,usr,var}
那麼就將/usr/local/qtopia這個qtopia目錄複寫到/nfsroot/cq8401/usr/local目錄下,為什麼呢?因為你進入開發板上的系統後運行QT應用程式,它會搜尋/usr/local/qtopia下的庫配置!
三、配置與編譯
:
由於我之前沒有配置這個,導致螢幕中間沒有游標出現,只有我的硬體滑鼠,但我實現的硬體滑鼠還沒有與QT的滑鼠事件介面
結合上,導致老是點擊無效,要猜測QT當前的滑鼠位置在哪裡!
cd /opt/qtopia/source
# vi qtopiacore/qconfig-qpe.h
首先注釋掉關於滑鼠游標的宏定義,讓程式運行時,屏中央有游標出現:
// Qtopia Core
/*
#ifndef QT_NO_QWS_CURSOR
# define QT_NO_QWS_CURSOR
#endif
*/
/*
#ifndef QT_NO_QWS_MOUSE
# define QT_NO_QWS_MOUSE
#endif
#ifndef QT_NO_QWS_MOUSE_AUTO
# define QT_NO_QWS_MOUSE_AUTO
#endif
*/
其它宏定義根據需要進行注釋。
儲存後將qconfig-qpe.h拷貝到global目錄。
# cp qtopiacore/qconfig-qpe.h qtopiacore/qt/src/corelib/global/qconfig-qpe.h
注釋掉其他檔案裡的QT_NO_QWS_CURSOR的定義
# vi qtopiacore/qt/src/corelib/global/qfeatures.h
注釋掉如下內容:
/*
#if !defined(QT_NO_QWS_CURSOR) && (defined(QT_NO_CURSOR))
#define QT_NO_QWS_CURSOR
#endif
*/
儲存退出。
# vi qtopiacore/qt/src/corelib/global/qglobal.h
注釋掉以下內容:
//# define QT_NO_QWS_CURSOR
# cd /opt/qtopia/target
#
../source/configure -release -image /usr/local/qtopia -prefix
/usr/local/qtopia -xplatform linux-mips-g++ -arch mips -no-qvfb
-displaysize 1024x768 -no-modem -extra-qtopiacore-config "-release
-xplatform qws/linux-mips-g++ -embedded mips -qconfig qpe -depths
8,16,32 " 2>../configure_error.log
# make 2>../make_error.log
把錯誤輸出到make_error.log 檔案中,不然編譯後,你還不知道在哪兒出錯了,因為輸入資訊相當的多!
主要配置選項解說如下:
-release Create a release build.
-xplatform linux-mips-g++ -arch mips
//目標平台為mips-linux,體繫結構為mips。(.configure它會怎麼檢測是大端還是小端CPU,當然,你也可以強制指定:
-little-endian ......... Force target build to use little endian (LSB first).
-big-endian ............ Force target build to use big endian (MSB first).)
支援的arch列表:alpha, arm, boundschecker, generic, i386, ia64, macosx, mips
, parisc, powerpc, s390, sparc, windows, x86_64
-no-qvfb
//目標平台已支援framebuffer,因而不使用虛擬幀緩衝。
-extra-qtopiacore-config
//為Qtopia core 配置選項。
-xplatform qws/linux-mips-g++ -embedded mips
//目標平台編譯設定檔使用qtopiacore/qt/mkspecs/qws/linux-mips-g++目錄下的設定檔,嵌入式平台為mips。
-qconfig qpe
//使用設定檔qconfig-qpe.h,若使用qconfig-large.h設定檔,則使用-qconfig large選項。
2>../confgure_error.log
//最後將配置過程中的錯誤輸出到confgure_error.log檔案中。
在編譯安裝完成後,在/usr/local/qtopia 中的東西就是Qtopia在mipsel上運行所需要的檔案
建立時區資訊:
複製剛才編譯目錄下:/opt/qtopia/target/etc/zoneinfo目錄到nfs檔案系統的usr/share目錄下,我的就是
# cp -a /opt/qtopia/target/etc/zoneinfo /nfsroot/cq8401/usr/share/
然後複製主機:/usr/local/qtopia目錄到nfs檔案系統相應的目錄下:(共74M)
# cp -a /usr/local/qtopia /nfsroot/cq8401/usr/local/
四、進入開發板,配置與運行
好了,現在進入開發板系統中:
環境設定:(最好把它們寫到/etc/profile檔案中,免得每次重啟系統後,都要重輸一遍)
export HOME=/root
#設定使用者目錄,QT運行後,相應的設定檔,文檔就存放在使用者主目錄下
export PATH=/usr/local/qtopia/bin:$PATH
#設定QT程式搜尋路徑
export LD_LIBRARY_PATH=/usr/local/qtopia/lib:$LD_LIBRARY_PATH
#設定QT庫搜尋路徑
export QWS_KEYBOARD_PROTO=TTY:/dev/tty0
#設定鍵盤
export QWS_MOUSE_PROTO=MouseMan:/dev/input/mice
#設定滑鼠設定
export TZ=Asia/Chongqing
#此句設定時區,可以為Beijing,或Shanghai,我在重慶,所以就設定為Chongqing了
export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0"
#此句顯示字型和表徵圖。
完成後,在命令列執行
# qpe -qws&
如果看到目標板螢幕上啟動的Qtopia 說明已經成功了。
=========================================================
http://hi.baidu.com/ruanbanyong/blog/item/953537de4e61ee14632798d4.html
最近在論壇上看到許多朋友在交叉編譯Qtopia-opensource-src-4.3.2時出現很多問題,而不能繼續。
本人一直以來都不會使用新版本的開發庫,一個原因是新的東東用的人少,網上資料也少,問題解決辦法不容易查得到,而且我的arm CPU也跟不上。
以下是我的完全的交叉編譯過程,希望能對您有所協助。
我的主機系統:FC6
目標板:Arm 9200
目標板檔案系統:cramfs
可以在網上下載該Qtopia版本:ftp://ftp.trolltech.com/qtopia/source/qtopia-opensource-src-4.3.2.tar.gz
總共大小:109.89M
交叉編譯器:cross-3.3.2
解壓到目錄:/root/Qtopia4/source
建立目標:/root/Qtopia4/target 存放make 所產生的檔案
建立安裝目錄:/mnt/nfs/image 存放make install 所產生的檔案,也是arm板上所執行檔案,我是採用nfs方式來和arm板串連的
修改時區資訊
# vi src/libraries/qtopia/qtimezone.cpp
將 /usr/share/zoneinfo/ 改為/mnt/nfs/qtopia4/qtopiatslibtarget/zoneinfo/ ,儲存退出。
# vi src/settings/systemtime/settime.cpp
將 /usr/share/zoneinfo/ 改為/mnt/nfs/qtopia4/qtopiatslibtarget/zoneinfo/ ,儲存退出。
裁減Qtopia core的庫
# vi qtopiacore/qconfig-qpe.h
首先注釋掉關於滑鼠游標的宏定義,讓程式運行時,觸控螢幕中央有游標出現:
// Qtopia Core
/*
#ifndef QT_NO_QWS_CURSOR
# define QT_NO_QWS_CURSOR
#endif
*/
/*
#ifndef QT_NO_QWS_MOUSE
# define QT_NO_QWS_MOUSE
#endif
#ifndef QT_NO_QWS_MOUSE_AUTO
# define QT_NO_QWS_MOUSE_AUTO
#endif
*/
其它宏定義根據需要進行注釋。
儲存後將qconfig-qpe.h拷貝到global目錄。
# cp qtopiacore/qconfig-qpe.h qtopiacore/qt/src/corelib/
global/qconfig-qpe.h
注釋掉其他檔案裡的QT_NO_QWS_CURSOR的定義
# vi qtopiacore/qt/src/corelib/global/qfeatures.h
注釋掉如下內容:
/*
#if !defined(QT_NO_QWS_CURSOR) && (defined(QT_NO_CURSOR))
#define QT_NO_QWS_CURSOR
#endif
*/
儲存退出。
# vi qtopiacore/qt/src/corelib/global/qglobal.h
注釋掉以下內容:
//# define QT_NO_QWS_CURSOR
Qtopia4移植過程配置源碼包
進入/root/Qtopia4/target目錄
#../source/configure -release -image /mnt/nfs/image -prefix
/mnt/nfs/image -xplatform linux-arm-g++ -arch arm -no-qvfb -displaysize
640x480 -no-modem -extra-qtopiacore-config "-release -xplatform
qws/linux-arm-g++ -embedded arm -qconfig qpe -depths 4,8,16,32
-qt-mouse-linuxtp " 2>../confgureERR.txt
主要配置選項解說如下:
-xplatform linux-arm-g++ -arch arm
目標平台為arm-linux,體繫結構為arm。
-no-qvfb
目標平台已支援framebuffer,因而不使用虛擬幀緩衝。
-extra-qtopiacore-config
為Qtopia core 配置選項。
-xplatform qws/linux-arm-g++ -embedded arm
目標平台編譯設定檔使用qtopiacore/qt/mkspecs/qws/linux-arm-g++目錄下的設定檔,嵌入式平台為arm。
-qconfig qpe
使用設定檔qconfig-qpe.h,若使用qconfig-large.h設定檔,則使用-qconfig large選項。
-qt-mouse-linuxtp
觸控螢幕協議支援linuxtp
2>../confgureERR.txt
最後將配置過程中的錯誤輸出到confgureERR.txt檔案中。
# make 2>../makeERR.txt
# make install
在編譯安裝完成後,在/mnt/nfs/image 中就是Qtopia在arm上運行所需要的檔案
建立時區資訊
# cd $QTOPIATARG
# mkdir zoneinfo
# cp -a /usr/share/zoneinfo/* /mnt/nfs/image/zoneinfo/
到這一步主機上的工作已經基本完成。
NFS串連主機,進入目標板系統,mount -t nfs 主機地址:/mnt/nfs /mnt/nfs -o nolock
輸入目標板環境設定
export PATH=/mnt/nfs/image/bin:$PATH
export LD_LIBRARY_PATH=/mnt/nfs/image/lib:$LD_LIBRARY_PATH
export QWS_MOUSE_PROTO=LinuxTP:/dev/touchscreen/0 待選: /dev/input/mice
export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0" 此句顯示字型和表徵圖。
後執行qpe -qws&
就可以看到目標板螢幕上啟動的Qtopia 說明您已經成功了。
註:
a 由於在pc機上安裝的時候qtopia的image的存放路徑是file:/mnt/nfs/image.
所以在板子上的存放路徑也必須跟其一致。否則會出錯。如下:
**********************************************************
* ERROR: Expecting this binary to be located in
* /opt/arm-qt/qt-arm-bin/bin/qpe
* but it is being run from
* /Qtopia/bin/qpe
*
* This generally indicates that you have specified the wrong
* value for -prefix when configuring Qtopia. Based on the
* location of this binary, you should be using a prefix of
* /Qtopia
**********************************************************
b 另外會提示如下錯誤:
Could not read calibration: "/etc/pointercal"
查看的在/etc目錄下沒有pointercal檔案,而自己的qpe怎麼也起不來五點校正圖片,可以用tslib來校正一下,這邊就不說明了。