前言:
此時此刻的心情可以用興奮與悲哀一同的形容。興奮,是因為經過兩周“不懈努力”、“執著”地追求,終於達到了
預期的目標;悲哀,是因為作為一個“IT打工仔”只能整天默默地為資本家們做著貢默。時逢金融風暴,做好份內的
事,也許是最好不過了……想說的話太多,只是無處抒發而已。
:)不說了,現在讓我們開始移植之旅吧。Here we go!
1。開發環境
PC+VMWARE+RED FLAG+交叉編譯器
PS:
VMWARE: VMWARE6.0
RED FLAG: RED FLAG Desktop 6.0
交叉編譯器:arm-linux-gcc/arm-linux-g++(交叉編譯器路徑:/opt/magus/arm/3.4.6/bin/)
2。tslib移植。
目前來說,tslib的版本有tslib-1.3、tslib-1.4。起始本人使用的是tslib-1.3,但最終在目標機上運行時效果不理
想,ts_calibrate與ts_test均無法正常運行,觸控螢幕的靈敏度以及響應都有問題。於是就從項目合作商那邊拿了一
個tslib的版本,幾經周折,終於可以讓tslib正常工作於目標機上。以下為tslib的移植過程
(1)設定環境
[~#]export CC=/opt/magus/arm/3.4.6/bin/arm-linux-gcc
(2)configure配置
[~#]echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
//如果沒有此句,make時會報rpl_malloc無法找到的錯誤。原因:configure中有#define malloc rpl_malloc。此時
只要將ac_cv_func_malloc_0_nonnull=yes寫到.cache檔案中,讓configure從檔案讀取此配置即可繞開#define
malloc rpl_malloc
[~#]./configure --prefix=$PWD/release --host=arm-linux --target arm-linux --cache-file=arm-
linux.cache CFLAGS='-L/opt/magus/arm/3.4.6/arm-linux/lib'
註:configure的具體選項的意義參考說明(./configure --help)
(3)編譯
[~#]make clean
[~#]make
[~#]make install
在$PWD/release目錄下會產生tslib的有相關庫及設定檔,將這些
(4)編寫運行ts_calibrate(螢幕校準程式)的指令碼ts_calibrate.sh,具體內容如下:
export QTDIR=/media/usrdata/stock/Qte
export QPEDIR=/media/usrdata/stock/Qte
export QPEDIR=/media/usrdata/stock/Qte
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
#SET THE FRAME BUFFER OF QTQPEDIR=/media/usrdata/stock/Qtopia
export QWS_DISPLAY=LinuxFb:/dev/fb0
#export QWS_DISPLAY=LinuxFb:/dev/fb0:mmWidth=320:mmHeight=240
export QWS_SIZE=320x240
#SET THE CONTROLLER OF INPUT(TOUCH SCREEN OR KEYPAD)
insmod /lib/modules/ak4182.ko
insmod /lib/modules/evdev.ko
#export TSLIB_TSEVENTTYPE="UCB1x00" #Default value
#export TSLIB_TSEVENTTYPE="MK712"
#export TSLIB_TSEVENTTYPE="ARCTIC2"
#export TSLIB_TSEVENTTYPE="COLLIE"
#export TSLIB_TSEVENTTYPE="CORGI"
#export TSLIB_TSEVENTTYPE="H3600"
export V_ROOT=/media/usrdata/stock/ts-release
#export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=$V_ROOT/etc/pointercal
export TSLIB_CONFFILE=$V_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$V_ROOT/lib/ts/
export QWS_MOUSE_PROTO=tslib:/dev/event0
#export LD_LIBRARY_PATH=$TSLIB_ROOTDIR/lib:$LD_LIBRARY_PATH
mm w 4 0x8005054 0x2d00
export PATH=$QPEDIR/bin:$PATH
export
LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$V_ROOT/lib:$V_ROOT/lib/ts:/media/usrdata/stock:/lib:/usr/lib:$
LD_LIBRARY_PATH
/media/usrdata/stock/ts-release/bin//ts_calibrate
至此,tslib編譯完成,但不代表在目標上運行時不會出問題。
(5)修改ts.conf設定檔
在$PWD/release/etc/ts.conf檔案的末尾添加以下模組配置項:
module_raw input
即配置觸摸事件的輸入源——觸控螢幕
(6)在目標機上建立目錄ts-release,將PC上$PWD/release目錄下的所有檔案全部COPY至ts-release目錄下。運行
ts_calibrate.sh。
[~#]./ts_calibrate.sh
此時會載入tslib中的外掛程式模組input.so,且會拋出Segement fault的錯誤。仔細分析tslib的源碼之後,得知在載入
input.so時,ts_attach.c中__ts_attach_raw()函數中使用NULL指標,導致Segement fault產生。經過修改過,重新
編譯tslib,再運行ts_calibrate.sh,一切正常。ts_attach.c中__ts_attach_raw()中的修改如下:
#if 0
for(next = ts->list, prev=next; next != NULL && next != prev_list; next = prev->next, prev =
next)
{
DEBUG("LIUHAO:: %s %s:count=%d prev_list=%x prev=%x next=%x prev->next=%x/n",
__FILE__, __FUNCTION__, count++, prev_list, prev, next, prev->next);
;
}
#else
for(next = ts->list, prev=next; next != NULL && next != prev_list;)
{
DEBUG("LIUHAO:: %s %s:count=%d prev_list=%x prev=%x next=%x prev->next=%x/n",
__FILE__, __FUNCTION__, count++, prev_list, prev, next, prev->next);
next = prev->next;
if(next == NULL)
break;
else
prev = next;
}
#endif
至此,tslib所有工作已經完成,ts_calibrate會在~/ts-release/etc/目錄下產生pointercal檔案。pointercal為觸
摸屏校準後產生的檔案,確保QT運行時,觸控螢幕工作正常。
2。QTE移植
網上關於QTE、QTOPIA移植的文章實在是太多了,而且涉及到的QTE、QTOPIA版本也都不一致,而且還有QTOPIA CORE
。相關人士說QTOPIA CORE是QTE與QTOPIA的結合體,於是本人就行拿QTOPIA CORE開刀,版本為qtopia-core-
opensource-src-4.3.1,運行結果不是很理想。於是,又換了qt-embedded-linux-opensource-src-4.5.0。好的,就
它了。
(1)設定環境
[~#]export PATH=/opt/magus/arm/3.4.6/bin:$PWD/bin:$PATH
[~#]export LD_LIBRARY_PATH=/lib:/usr/lib:/opt/magus/arm/3.4.6/arm-linux/lib:/opt/QT_SPACE/tslib-
1.3/release/lib:$LD_LIBRARY_PATH
(2)configure配置
[~#]./configure -prefix /media/usrdata/stock/Qte -xplatform qws/linux-arm-g++ -largefile -no-
exceptions -no-accessibility -stl -plugin-sql-sqlite -no-qt3support -no-xmlpatterns -no-phonon
-phonon-backend -no-svg -no-webkit -no-scripttools -no-mmx -no-3dnow -no-sse -no-sse2 -qt
-zlib -qt-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -no-nis -depths
8,16,24,32 -embedded arm -qt-mouse-tslib -no-feature-QWS_CURSOR -little-endian -
I$PWD/../tslib/release/include -L$PWD/../tslib/release/lib
註:configure的具體選項的意義參考說明(./configure --help)
(3)編譯
[~#]gmake
[~#]gmake install
編譯時間出現的錯誤及解決方案:
執行 gmake install 時會編譯examples/draganddrop/目錄下的example。編譯delayedencoding時,
(1)報QSvgWidget相關的錯誤。
解決方案:最直接的辦法,不去編譯delayedencoding。只要將draganddrop.pro中SUBDIRS項的delayedencoding刪掉
即可。
(2)svgtextobject.cpp:52: error: `QSvgRenderer' was not declared in this scope
解決方案:將examples/richtext/目錄下的.pro檔案中SUBDIRS項的textobject刪掉即可。
OK。QTE也正常編譯完成,且最終的發布位於/media/usrdata/stock/Qte下。
注意:configure時的-prefix /media/usrdata/stock/Qte 時的安裝路徑最好能與QTE在目標機上存放時的路徑保持
一致,否則運行QT時會報找不錯誤。
(4)編寫運行QT測試程式的指令碼test.sh,具體內容如下:
export QTDIR=/media/usrdata/stock/Qte
export QPEDIR=/media/usrdata/stock/Qte
export QPEDIR=/media/usrdata/stock/Qte
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
#SET THE FRAME BUFFER OF QTQPEDIR=/media/usrdata/stock/Qtopia1
export QWS_DISPLAY=LinuxFb:/dev/fb0
#export QWS_DISPLAY=LinuxFb:/dev/fb0:mmWidth=71:mmHeight=53
export QWS_SIZE=320x240
#SET THE CONTROLLER OF INPUT(TOUCH SCREEN OR KEYPAD)
insmod /lib/modules/ak4182.ko
insmod /lib/modules/evdev.ko
#export TSLIB_TSEVENTTYPE="UCB1x00" #Default value
#export TSLIB_TSEVENTTYPE="MK712"
#export TSLIB_TSEVENTTYPE="ARCTIC2"
#export TSLIB_TSEVENTTYPE="COLLIE"
#export TSLIB_TSEVENTTYPE="CORGI"
#export TSLIB_TSEVENTTYPE="H3600"
export V_ROOT=/media/usrdata/stock/ts-release
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=$V_ROOT/etc/pointercal
export TSLIB_CONFFILE=$V_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$V_ROOT/lib/ts
export QWS_MOUSE_PROTO=tslib:/dev/event0
#export LD_LIBRARY_PATH=$TSLIB_ROOTDIR/lib:$LD_LIBRARY_PATH
mm w 4 0x8005054 0x2d00
export PATH=$QPEDIR/bin:$PATH
export
LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$V_ROOT/lib:/media/usrdata/stock:/lib:/usr/lib:$LD_LIBRARY_PATH
/media/usrdata/stock/Qte/examples/widgets/calculator/calculator -qws #-geometry 320x240+0+0
(5)運行test.sh
[~#]./test.sh
GODNESS. THAT IS QT.
終於可以看到QT在目標機上跑起來了,同時可以正常響應觸控螢幕事件~:)
不過QT顯示時仍然有點缺陷:QT應有程式的尺寸超出了LCD的實際顯示範圍。問題來了,可能需要修改QT源碼了。哎
,又得要繼續戰鬥了,只能自己給自己打氣了!~
由於時間倉促,只是大致整理了一下,難免有錯誤之處,望瀏覽此文的同仁們多多包涵!
先就這樣了,得抽空休息一下了。。。
BEST REGARDS