关于tslib移植的配置

来源:互联网 发布:数据库定义 编辑:程序博客网 时间:2024/05/08 13:40

作者:程老师,华清远见嵌入式学院讲师。

在数据结构的栈和队列的学习过程中,除了需要了解栈、队列的基本特点外,需要掌握包括创建、出栈入栈、出队入队等基本操作。并熟悉一些常见的应用问题,比如球钟问题就是一个典型利用栈和队列实现的实际问题。本文描述球钟问题的具体实现过程。

大家都知道,Qt程序时可以跨平台的,可以在任何平台运行。我们在pc机上编写Qt程序的时候可以很快就运行出来,但是如果要把它移植到另一个平台,我们该怎么做呢?下面开始我们的工作吧。

平台:s3c2410
        交叉编译工具链:arm-none-linux-gnueabi-gcc(4.3.2)
        源码:tslib-1.4.tar.gz、qt-everywhere-opensource-src-4.7.0-beta2.zip

一、移植tslib

A、解压tslib源码包, 运行autogen.sh生成configure文件。如果出了如下错误:

        /autogen.sh: 4: autoreconf: not found

        因为没有安装一些工具, (ubuntu 10.04)用下面的命令安装好就可以了。
                sudo apt-get install autoconf automake libtool autotools-dev

B、 执行confugure生成Makefile文件

        $ echo "ac_cv_func_malloc_0_nonnull=yes" >$ARCH-linux.cache
                $        ./configure        --host=arm-softfloat-linux-gnu        --prefix=/home/linux/tslib --cache-file=$ARCH-linux.cache

        说明:
                --host是指你的交叉编译器的前最;例如:你的交叉编译器是arm-linux-gcc,则
                --host=arm-linux.如果是arm-none-linux-gnueabi-gcc 则--host=arm-none-linux-gnueabi

        -prefix 是你执行make install 的时候编译后生成的可执行文件和库文件以及配置文所安装的目录,这个目录不能和tslib源码目录相同;

        configure文件下还有好多选项,你可以执行./configure --help 来进行选择其他项,不过在这里这些选项就够了。

C、执行make、make install操作

D、把指定安装目录下的tslib的文件都拷贝到你所挂载的根文件下
                $ cp -a /home/linux/tslib /rootfs

E、修改/rootfs/tslib下的etc目录中ts.cong文件
                #vim ts.conf 将第二行的#module_raw input修改成module_raw input 注意一定要顶格写否则程序执行时会发生读取ts.conf错误

F、启动开发板,设置一些环境变量

在开发板的/etc/profile文件中添加如下代码
                export TSLIB_ROOT=/tslib
                export TSLIB_TSDEVICE=/dev/event0
                export LD_LIBRARY_PATH=/tslib/lib:$LD_LIBRARY_PATH
                export QWS_SIZE=320x240
                export TSLIB_FBDEVICE=/dev/fb0
                export TSLIB_PLUGINDIR=/tslib/lib/ts
                export TSLIB_CONSOLEDEVICE=none
                export TSLIB_CONFFILE=/tslib/etc/ts.conf
                export POINTERCAL_FILE=/etc/pointercal
                export QWS_MOUSE_PROTO=Tslib:/dev/event0
                export TSLIB_CALIBFILE=/etc/pointercal
                export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0"
                export TSLIB_TSEVENTTYYPE=H3600

说明:
                TSLIB_TSDEVICE        //触摸屏设备文件名。
                TSLIB_CALIBFILE        //校准的数据文件,由ts_calibrate校准程序生成。
                SLIB_CONFFILE        //配置文件名。
                TSLIB_PLUGINDIR         //插件目录
                TSLIB_CONSOLEDEVICE        //控制台设备文件名
                TSLIB_FBDEVICE        //设备名

以上环境变量在实际开发中的实际配置可以根据实际情况决定。而这些指定的设备节点一定要和你的开发板上的/dev目录下的设备节点相对应。

G、 就可以运行/tslib/bin下的测试文件,如ts_calibrate校准程序。
        # /tslib/bin/ts_calibrate

注意:

1、我们在实际调试的时候,都是通过nfs挂载的形式。当我们运行ts_calibrate的时候,会在/etc目录下生成一个pointercal文件。有时候会因为挂载目录的权限不够,导致无法生成Pointercal文件。这个时候我们可以用chmod 777 etc加个权限。

2、有时候由于交叉编译工具两没有指定正确,会出现非法指令或者是“ line 1: syntax error: unexpected "("”错误。可以用file ts_calibrate是否是在当前平台上运行的程序,用readelf -a ts_calibrate查看当前的指令集.

3. export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0",这句话我们在后面的Qt程序国际化的得到,在移植的所有工作都完成以后,我发现LCD屏山的字体非常小。后来经过多发打听,才知道需要修改这句话。我们把其中的数字值都改为其一半的时候,屏山的字体就比较大了。具体原因有待研究。

二、qt-everywhere的移植

1、 解压源码并改名
               $ tar xvf qt-everywhere-opensource-src-4.7.0-beta2.zip
               $ mv qt-everywhere-opensource-src-4.7.0-beta2 qt-everywhere-source
               $ mkdir qt-everywhere-target

2、 配置
               $ cd qt-everywhere-target
               $ ../qt-everywhere-source/configure  -prefix  /qt-everywhere  -embedded  arm  -release  -opensource  -fast  -no-accessibility   -no-scripttools  -no-mmx  -no-multimedia  -no-svg  -no-webkit  -no-3dnow  -no-sse  -no-sse2  -silent  -qt-libpng  -qt-libjpeg -no-libtiff -no-multimedia -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-arm-gnueabi-g++ -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-linuxinput -no-glib -qt-mouse-tslib -I/home/linux/tslib/include -L/home/linux/tslib/lib

3、 编译
                $ make

4、 安装
                $ make install

5、 添加环境变量
                修改/etc/bash.bashrc添加如下内容
                export PATH=$PATH:/qt-everywhere/bin

6、 修改文件系统
                $ cp / qt-everywhere /source/rootfs -a

7、 修改/source/rootfs/etc/profile添加如下内容
                export LD_LIBRARY_PATH=/qt-everywhere/lib:$LD_LIBRARY_PATH
                export QWS_SW_CURSOR
                export QT_QWS_FONTDIR=/qt-everywhere/lib/fonts
                export set HOME=/root
                export set QPEDIR=/ qt-everywhere

8、 修改/ qt-everywhere/bin/qmake
                $ cd / qt-everywhere/bin
                $ mv qmake qmke-target

三、qt应用程序的移植

1、 写一个简单的应用程序
        //main.cpp
        #include <QApplication>
        #include <QPushButton>

int main(int argc, char **argv)
        {
                QApplication app(argc, argv);

        QPushButton pushButton(QPushButton::tr("hello world"));
                pushButton.show();

        return app.exec();
        }

2、 主机上编译应用程序
                $ qmake-target –project
                $ qmake-target
                修改Makefile
                修改:
                 LIBS = $(SUBLIBS) -L/qt-everywhere/lib -lQtGui -L/home/linux/tslib/lib -L/qt-everywhere/lib -lQtNetwork -lQtCore –lpthread
                为:
                 LIBS = $(SUBLIBS) -L/qt-everywhere/lib -lQtGui -lts -L/home/linux/tslib/lib -L/qt-everywhere/lib -lQtNetwork -lQtCore –lpthread
                $ make
                $ cp test /source/rootfs

3、 目标板上运行
                $ ./test -qws
                这时发现在LCD屏上出现一个button,这说明我们的Qt库已经移植成功
        4、 国际化

        国际化是在qt编程中比较重要一部分,这里我们尝试去国际化我们的应用程序
                ●    修改main.cpp为

        #include <QApplication>
                #include <QPushButton>
                #include <QTranslator>

        int main(int argc, char **argv)
                {
                        QApplication app(argc, argv);

                app.setFont(QFont("simsun",10));

                QTranslator translator;
                        translator.load("zh_CN",".");
                        app.installTranslator(&translator);

                QPushButton pushButton(QPushButton::tr("hello world"));
                        pushButton.show();

                return app.exec();
                }

        ●    修改pro文件添加如下内容:

        TRANSLATIONS += zh_CN.ts

        ●    到处ts文件

        $ lupdate test.pro

        ●    查看ts文件

        zh_CN.ts
                <?xml version="1.0" encoding="utf-8"?>
                <!DOCTYPE TS>
                <TS version="2.0">
                <context>
                        <name>QPushButton</name>
                        <message>
                                <location filename="main.cpp" line="15"/>
                                <source>hello world</source>
                                <translation type="unfinished"></translation>
                        </message>
                </context>
                </TS>
                ●    修改ts文件为
                <?xml version="1.0" encoding="utf-8"?>
                <!DOCTYPE TS>
                <TS version="2.0">
                <context>
                        <name>QPushButton</name>
                        <message>
                                <location filename="main.cpp" line="15"/>
                                <source>hello world</source>
                                <translation>你好</translation>
                        </message>
                </context>
                </TS>
                ●    导出qm文件
                $ lrelease zh_CN.ts –qm zh_CN.qm
                ●    为文件系统中添加字库
                $ cp simsun.ttc /source/rootfs/qt-everywhere/lib/fonts/
                simsun.ttc是宋体字库,我们可以在Windows的C:\WINDOWS\Fonts目录下找到
                ●    运行程序
                将hello 和 zh_CN.qm拷贝到/source/rootfs下
                # ./hello –qws
                会发现“hello world” 变成“你好”了!

注意:

-xplatform qws/linux-arm-gnueabi-g++ 平台,交叉编译工具链可以在这个地方改(qws)。

对于翻译工作者,主要是利用Qt提供的工具lupdate、linguist和lrelease(它们都可以在Qt安装目录的bin文件夹下找到)来协助翻译工作并生成最后需要的.qm文件,包括以下内容:

1.利用lupdate工具从源代码中扫描并提取需要翻译的字符串,生成.ts文件。类似编译时用到的qmake,运行lupdate时我们也需要指定一 个.pro的文件,这个.pro文件可以单独创建,也可以利用编译时用到的.pro文件,只需要定义好变量TRANSLATIONS就可以了,具体用法可 以参见后面的小例子。

2.利用linguist工具来协助完成翻译工作,即打开前面用lupdate生成的.ts文件,对其中的字符串逐条进行翻译并保存。由于.ts文件采用了xml格式,我们也可以用其它编辑器来打开.ts文件并翻译。

3.利用lrelease工具处理翻译好的.ts文件,生成格式更为紧凑的.qm文件。这便是翻译工作者最终需要提供给程序员的资源文件,它所占的空间比.ts文件小,但基本不具有可读性,只有QTranslator能正确的识别它。

笔记:

不晓得为什么,TE6410的开发板带有TSLIB,删除掉/etc/pointercal文件 重启开发板的确可以进入屏幕校准程序,但是在控制台下进入/usr/local/tslib/bin/ts_calibrate的时候显示却是 ts_open:No such file or directory,百度一下说 环境变量没有配置好 搜索的结果放在下面

在你的开发板的/etc/profile文件里添加运行tslib的环境变量(一定要放到/etc/profile,原因是export只能在当前shell和它的子shell有用,不能影响登录的shell)

#vi  /etc/profile
加入以下内容:
export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/input/event1(你的开发板的触摸屏设备节点!!!!!)
export TSLIB_TSEVENTTYPE=H3600
export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/tslib/lib/ts
#export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CALIBFILE=/mnt/disk/pointercal

export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

#export QWS_MOUSE_PROTO=Tslib:/dev/input/event1
#export QWS_MOUSE_PROTO=TPanel:/dev/input/event1
#export QWS_MOUSE_PROTO="Tslib:/dev/input/event1 MouseMan:/dev/input/mice"
#export QWS_MOUSE_PROTO=MouseMan:/dev/input/mice
export QWS_KEYBOARD="TTY:/dev/tty1"

export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/plugins/qtopialmigrate/:$QTDIR/qt_plugins/imageformats/:$QTDIR/lib:/root/tslib/build/lib:$LD_LIBRARY_PATH

#exec /usr/local/tslib/bin/ts_calibrate  1>/dev/null 2>/dev/null

然后 source /etc/profile



0 0