• 【嵌入式开发技术之Qtopia】在UTU2440上移植Qtopia4与TSLIB


    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/


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    关于软件测试的浅谈
    软件测试中的压力测试和性能测试
    白盒测试一些方法
    浅谈黑盒测试
    关于判断是否为闰年以及异常处理问题
    软件测试用例
    等价类划分
    关于白盒测试
    【软件测试】软件测试方法划分
    【软件测试】灰盒测试
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2806710.html
Copyright © 2020-2023  润新知