ARM Linux平台QTE+tslib移植后感

前言:
此时此刻的心情可以用兴奋与悲哀一同的形容。兴奋,是因为经过两周“不懈努力”、“执着”地追求,终于达到了

预期的目标;悲哀,是因为作为一个“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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值