ARM Linux平台QTE+tslib移植後感

來源:互聯網
上載者:User

前言:
此時此刻的心情可以用興奮與悲哀一同的形容。興奮,是因為經過兩周“不懈努力”、“執著”地追求,終於達到了

預期的目標;悲哀,是因為作為一個“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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.