您的位置:首页 > 运维架构 > Linux

ARM Linux平台QTE+tslib移植后感

2009-06-15 10:09 351 查看

ARM Linux平台QTE+tslib移植后感收藏

document.body.oncopy = function() {
if (window.clipboardData) {
setTimeout(function() {
var text = clipboardData.getData("text");
if (text && text.length>300) {
text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href;
clipboardData.setData("text", text);
}
}, 100);
}
}

function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}
前言:

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

预期的目标;悲哀,是因为作为一个“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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: