【嵌入式开发技术之Qtopia】在UTU-2440上移植Qtopia4与TSLIB

时间:2022-03-20 21:07:31

by My Team Member WZF

摘要

     在扬创UTU-2440 ARM开发板上成功移植了Qtopia4.2.0,Qtopia4.3.3,以及QtopiaCore4.3.5,QtEmbedded4.4。总结移植过程及TSLIB库在嵌入式设备上的应用。

正文:

       首先必须明白,现在称的Qtopia4与Qt3的名称有一些变化,Qtopia4.x包括了原Qtopia在内的一整套程序,而Qt3.x中的qt- embedded在Qt4.4以前叫Qtopia-core,在Qt4.4中又改回Qt-embedded这个名字。(名字真多……)
       对于一般QT4程序的嵌入式开发,只需要移植QtopiaCore就可以了。
移植前需要配置好编译环境,本文中采用的编译环境是:

主机系统:Ubuntu 8.04.1
主机编译器:GCC 4.2.4(Ubuntu 4.2.4-1ubuntu3)
交叉编译器:arm-linux-gcc-3.4.1
软件资源:qtopia-opensource-src-4.2.0.tar.gz
             qtopia-opensource-src-4.3.3.tar.gz
             qtopia-core-opensource-4.3.5.tar.gz
             qt-embedded-linux-opensource-src-4.4.3.tar.gz
      这里以qtopia-opensource-src-4.3.3.tar.gz为例,其它几种包的移植方法类似,其中qtopia-opensource-src-4.2.0的移植方法可以参考以下链接:
[1]http://blog.chinaunix.net/u2/86537/showart_1676803.html

移植过程:

移植QTOPIA:

      设定工作目录为/home/arm
      在工作目录下,解压qtopia-opensource-src-4.3.3.tar.gz
      编译之前,打开qtopia-opensource-src-4.3.3/qtopiacore/qt/src/gui/embedded/qmouselinuxtp_qws.h
加上这2行:#define QT_QWS_IPAQ
           #define QT_QWS_IPAQ_RAW(如果采用TSLIB这步似乎可以不做,未验证)
      还有需要注意的地方是:看一下 qmouselinuxtp_qws.cpp /dev/h3600_tsraw, 是不是你板子上的驱动文件名字,如果不是改成一样就可以了。[2 ]
      由于qtopia不能直接在源码目录中直接编译,所以还要单独建立一个目录,这里新建一个build目录
root@linux:/home/arm # mkdir build
root@linux:/home/arm # cd build
      可以配置编译时的选项,通过configure的参数选择需要编译哪些模块或功能,关于configure的参数可以通过configure --help或者在源码包根目录下的README.html中查找。
     这里仅给出一个例子,不一定完全要按这样写,但是,-xplatform linux-arm-g++ 和 -embedded arm 一定要加上以表明是交叉编译。
      此外 -prefix指定了编译完后image安装的位置,默认为./image,注意!编译完成后程序一定要在这个指定的位置运行,否则会出错!

root@linux:/home/arm/build #  ../qtopia-opensource-4.3.3/configure -edition phone -xplatform linux-arm-g++ -arch arm -prefix /opt/Qtopia -no-qvfb -displaysize 272x480 -no-ssl -no-bluetooth -no-dbus -no-drm -no-v4l2 -no-modem -no-libamr -extra-qt-config "-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg" -extra-qtopiacore-config "-xplatform qws/linux-arm-g++ -embedded arm -qt-mouse-linuxtp -qt-mouse-tslib -I/home/arm/tslib/include -L/home/arm/tslib/lib"

      上面的例子中,将tslib库也编译进去作为触摸屏校准,由于我一开始用linuxtp触摸屏总是不能校准(反向),因此后来改用tslib。需要注意的是,这里需要指定tslib的头文件的库所在位置,所以必需在这个步骤之前交叉编译好tslib并把它放到/home/arm/tslib下。
交叉编译tslib的过程如下:[3 ][5 ]
root@linux:/home/arm # svn co svn://svn.berlios.de/tslib/trunk/tslib tslib
如果没有安装svn,请sudo apt-get install subversion
然后cd tslib
#export CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
#echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
#./autogen

//避免检查ac_cv_func_malloc_0_nonnull

#echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

//配置目标机、缓冲、安装路径

#./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=/home/arm/tslib

# make

# make install

如果出现错误,请检查m4,autoconf,automake是否已经安装。

tslib的配置将在本文的末尾详述。

接着说Qtopia4,上一步configure结束后,按照提示依次执行make,make install

这样在build目录下会得到image目录,里面的东西就是我们需要的了。

将image里面的文件通过NFS挂载或者其它方式移动到开发板的/opt/Qtopia目录下,然后编写一下shell脚本,内容如下:

#!/bin/sh

export set QTDIR=/opt/Qtopia
export set QPEDIR=/opt/Qtopia
export set KDEDIR=/opt/Qtopia
export set QWS_KEYBOARD="USB:/dev/input/event1"
export set QWS_MOUSE_PROTO="LinuxTP:/dev/h3600_tsraw"
export set PATH=$QPEDIR/bin:$PATH
export QWS_DISPLAY="LinuxFb:mmWidth105:mmHeight65:0"
export QWS_SIZE=480x272
export set LD_LIBRARY_PATH=$PATH:$QTDIR/lib:$QPEDIR/lib

$QTDIR/bin/qpe &

注意:此shell脚本中关于触摸屏的尺寸是针对三星4.3寸触摸屏。

执行脚本,如果显示及触摸屏反应一切正常,则基本移植成功,注意此时在/etc下必须要有校准文件pointercal

      如果提示时区错误,则必须在/usr/share下存在zoneinfo,也可以参照[1 ]修改文件的位置。

      如果提示共享库连接的错误,则可能是当时共享库与编译时所使用的库版本不同,可以参照另一篇文章《utu2440-利用busybox制作文件系统》进行更新。

TSLIB的移植与触摸屏校准

如果没有pointercal,则可以通过tslib进行校准,方法如下:[3 ][4 ]

将/home/arm/tslib中的所有文件拷到开发板的某个目录下,这里假设为/usr/share/tslib

然后设置tslib运行时所需要的环境变量:

TSLIB_TSDEVICE  //触摸屏设备文件名。

Default (no inputapi): /dev/touchscreen/ucb1x00

Default (inputapi): /dev/input/event0

TSLIB_CALIBFILE  //校准的数据文件,由ts_calibrate校准程序生成。

Default: ${sysconfdir}/pointercal

TSLIB_CONFFILE  //配置文件名。

Default: ${sysconfdir}/ts.conf

TSLIB_PLUGINDIR //插件目录

Default: ${datadir}/plugins

TSLIB_CONSOLEDEVICE //控制台设备文件名

Default: /dev/tty

TSLIB_FBDEVICE  //设备名

Default: /dev/fb0

以上环境变量在实际开发中的实际配置可以根据实际情况决定。

除了环境变量以外,Tslib的配置文件ts.conf同样是个十分重要的部分,在ts.conf中配置了需要加载的插件、插件加载顺序以及插件的一些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。

下面是Tslib 1.4中的ts.conf的参考配置:

# Uncomment if you wish to use the linux input layer event interface

# module_raw input

# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d

# module_raw collie

# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860

# module_raw corgi

# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface

# module_raw ucb1x00

# Uncomment if you're using an HP iPaq h3600 or similar

# module_raw h3600

# Uncomment if you're using a Hitachi Webpad

# module_raw mk712

# Uncomment if you're using an IBM Arctic II

# module_raw arctic2

module pthres pmin=1

module variance delta=30

module dejitter delta=100

module linear

这里我把# module_raw h3600 的注释去掉了。

我写了一个SHELL脚本来实现TSLIB的校准:

  1 #!/bin/sh
  2 export TSLIB_ROOT=/usr/share/tslib
  3 export TSLIB_TSDEVICE=/dev/h3600_tsraw
  4 export TSLIB_FBDEVICE=/dev/fb0
  5 export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
  6 export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH
  7 export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
  8 export QWS_MOUSE_PROTO="TPanel:/dev/h3600_tsraw"
  9 export TSLIB_CALIBFILE=/etc/pointercal
10 export TSLIB_CONSOLEDEVICE=none
11 $TSLIB_ROOT/bin/ts_calibrate

要在加载TSLIB的情况下运行Qtopia,需要将原来的SHELL脚本改为:

  1 #!/bin/sh
  2 export TSLIB_ROOT=/usr/share/tslib
  3 export TSLIB_TSDEVICE=/dev/h3600_tsraw
  4 export TSLIB_FBDEVICE=/dev/fb0
  5 export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
  6 export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
  7 export TSLIB_CALIBFILE=/etc/pointercal
  8 export TSLIB_CONSOLEDEVICE=none
  9 export HOME=/root
10 export QTDIR=/opt/Qtopia
11 export QPEDIR=/opt/Qtopia
12 export KDEDIR=/opt/Qtopia
13 export LD_LIBRARY_PATH=$PATH:$QTDIR/lib:$TSLIB_ROOT/lib:$LD_LIBRARY_PATH
14 export QWS_KEYBOARD="USB:/dev/input/event1"
15 export QWS_MOUSE_PROTO="Tslib:/dev/h3600_tsraw"
16 export PATH=$QPEDIR/bin:$PATH
17 export QWS_SIZE=480x272
18 export QWS_DISPLAY="LinuxFb:mmWidth115:mmHeight65:0"
19 [ -f /etc/pointercal ] || /usr/bin/calibrate
20 $QPEDIR/bin/qpe &

注意第15行中的Tslib

 

第19行的意思是,当/etc/pointercal不存在时(即触摸屏还没有进行校准),启动QTLIB校准程序(假设校准程序的脚本放在/usr/bin下,脚本名称为calibrate),校准程序执行后会在/etc下生成校准文件pontercal

附录:关于configure与交叉编译

      对于一些包(库)的安装,可以通过设置configure的参数来进行交叉编译,这样就可以免去修改Makefile的麻烦,常见的方法是在 configure的后面加上参数--host=arm-linux(当然还可以是其它架构)。具体请看参考资料[5 ]。对于某一些包,如zlib,这种方法可能无效,因此建议在configure之前先用configure --help查看一下是否支持这样的参数。对于此法无效的包来说,只好先configure再改Makefile了。

      我也尝试过移植QtExtended4.4,但是编译时出现Prerequisite failed的错误,暂时没找到解决方案,也没有再研究。

参考资料

[1]http://blog.chinaunix.net/u2/86537/showart_1676803.html
[2]http://blog.chinaunix.net/u2/86537/showart_1666271.html
[3]TSLIB校准过程 http://www.mangbar.com/document/8a80809d19bd3a240119ccd45b90399e
[4]tslib-1.4 交叉编译和分析文档http://linux.chinaunix.net/bbs/archiver/tid-1042741.html
[5]Configure 参数选项详解http://www.linuxdiyf.com/viewarticle.php?id=22076
[6]http://blog.chinaunix.net/u2/86537/showart_1668831.html

作者: gnuhpc
出处: http://www.cnblogs.com/gnuhpc/