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
更多推荐
所有评论(0)