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來校正一下,這邊就不說明了。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lanmanck/archive/2009/08/04/4402942.aspx