QT4.7.1移植到ok6410

环境

host: Ubuntu 12.04

target:ok6410

交叉编译链:arm-linux-gcc-4.3.2

tslib的移植

tslib源代码:tslib-1.4.tar.gz
tslib安装目标路径:/usr/local/tslib

准备工作

首先在编译tslib包之前,先下载autoconf-2.64.tar.bz2、libtool-1.5.22.tar.gz、automake-1.11.1.tar.bz2  3个软件包。

http://ftp.ntu.edu.tw/gnu/autoconf/

http://mirror.hust.edu.cn/gnu/libtool/

http://mirror.bjtu.edu.cn/gnu/automake/

(1)解压automake-1.11.1.tar.bz2,输入命令tar jxvfautomake-1.11.1.tar.bz2后,在终端切换进入解压的目录cd automake-1.11.1,再输入命令./configure,生成Makefile文件后,接着输入make,然后输入make install安装,命令如下:
     # tar jxvfautomake-1.11.1.tar.bz2
     # cdautomake-1.11.1
     #./configure
     # make
     # makeinstall

(2)同理,autoconf-2.64.tar.bz2、libtool-1.5.22.tar.gz两个软件包也按照步骤(1)来操作。

编译tslib

1、下载tslib-1.4.tar.gz

  http://download.csdn.net/source/3177449 

2、解压安装tslib

 # tar -zxvf tslib-1.4.tar.gz
 # cd tslib
 # ./autogen.sh
 # echo "ac_cv_func_malloc_
0_nonnull=yes">arm-linux.cache 
  # ./configure --host=arm-linux--cache-file=arm-linux.cache --enable-inputapi=no -prefix=/usr/local/tslib 

# mkdir/usr/locoal/tslib
 # make
 # make install

说明:(1) 红色的“0”是数字0;(2) /usr/local/tslib表示tslib安装后的路径

编译并安装后会在/usr/local/tslib生成bin,etc,include,lib四个文件夹。

bin文件夹下是tslib的测试程序,把它们复制到开发文件系统下的/bin或者/usr/local/bin下,除了ts_calibrate触摸屏校准程序外,其他几个测试程序可有可无。 

etc文件夹内只有一个文件ts.conf,把它复制到目标板文件系统下的/etc目录,修改/etc/ts.conf配置如下:

module_rawinput  (注意把这句前的注释符#删除)

modulepthres pmin=1

modulevariance delta=30

moduledejitter delta=100

modulelinear

include文件夹包含有关tslib的头文件tslib.h,不需要复制到目标板。

lib文件夹下是tslib的动态库的。在目标板文件系统/usr/local/下新建文件夹tslib,把lib文件夹下的所有文件都复制过去。

在你目标板的/etc/profile文件里添加运行tslib的环境变量。

exportTSLIB_TSDEVICE=/dev/input/event0 (目标板触摸屏设备节点文件)

exportTSLIB_CONFFILE=/etc/ts.conf

exportTSLIB_PLUGINDIR=/usr/local/tslib/ts

exportTSLIB_CALIBFILE=/etc/pointercal  (触摸屏校准信息文件)

exportLD_LIBRARY_PATH=/usr/local/tslib/:$LD_LIBRARY_PATH

以上是我在自己目标板添加的环境变量,可以正常运行,参考网友环境变量配置如下(这个环境变量多一些,比较全面,做下记录):

exportTSLIB_ROOT=/usr/local

exportTSLIB_TSDEVICE=/dev/event0   (目标板触摸屏设备节点文件)

exportTSLIB_CALIBFILE=/etc/pointercal

exportTSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf

exportTSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts

exportTSLIB_CONSOLEDEVICE=none

exportTSLIB_FBDEVICE=/dev/fb0

修改/etc/profile后,执行:#source /etc/profile使刚配置的环境变量生效。

运行触摸屏校准程序ts_calibrate,会自动生成文件/etc/pointercal来保存校准信息。到此tslib移植工作完成!可能出现的错误:

1编译tslib,执行make时提示

ts_test.o:In function`main':
ts_test.c:(.text+0x1d4): undefinedreference to `rpl_malloc'
fbutils.o: In function `open_framebuffer':
fbutils.c:(.text+0x9f4):undefined reference to `rpl_malloc'
collect2: ld returned 1 exit status
make[2]: *** [ts_test] 错误 1
make[2]:正在离开目录 `/home/zhuandi/programs/tslib1.4/tslib/tests'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/home/zhuandi/programs/tslib1.4/tslib'
make: ***[all] 错误 2

这是因为config.h.in文件中有

/* Define to rpl_mallocif the replacement function should be used. */
#undef malloc

把#undef malloc注释掉重新make即可

(2

将交叉编译器的lib下的库全部复制到开发板的lib目录下即可

 

(3

但我在执行ts_calibrate命令的时候出现了下列提示错误:


selecteddevice is not a touchscreen I understand

经过仔细阅读代码,发现错误发生在tslib中的plugins目录下input-raw.c文件中的check_fd函数内:

static intcheck_fd(struct tslib_input *i)

{    

    structtsdev *ts = i->module.dev;

    intversion;

    u_int32_tbit;

    u_int64_tabsbit;

    if (!((ioctl(ts->fd, EVIOCGVERSION,&version) >= 0) &&

        (version == EV_VERSION)&&

        (ioctl(ts->fd,EVIOCGBIT(0, sizeof(bit) *8), &bit) >= 0) &&

        (bit & (1 <<EV_ABS)) &&

        (ioctl(ts->fd,EVIOCGBIT(EV_ABS,sizeof(absbit) * 8), &absbit) >= 0) &&

        (absbit & (1 <<ABS_X)) &&

        (absbit & (1 <<ABS_Y)) &&(absbit & (1 << ABS_PRESSURE)))) {

        fprintf(stderr,"selecteddevice is not a touchscreen I understand ");

        return-1;

    }

    if(bit & (1 << EV_SYN))

        i->using_syn= 1;

    return0;

}

首先tslib通过EVIOCGVERSION来获取驱动的版本号,然后再通过EVIOCGBIT来判断设备是否为触摸屏,因为触摸屏的事件是绝对值事件(EV_ABS),最后获取触摸屏的X轴(ABS_X),Y轴(ABS_Y),以及压力(ABS_PRESSURE)。其中只要有一项内容不正确,tslib都会认为该设备不是触摸屏,而打印出“selecteddevice is not a touchscreen I understand”错误。

版本号EV_VERSION是容易不一致的,我的交叉编译器定义的EV_VERSION值在编译器目录下的arm/usr/include/linux/input.h中给出的:

#defineEV_VERSION        0x010000

linux-3.0.1中的EV_VERSION是在include/linux/input.h中定义的:

#defineEV_VERSION        0x010001

两者不一致,改变任一一个都可以。


tslib 移植成功


QT的移植 

下载qt-everywhere-opensource-src-4.7.1.tar.gz,解压重命名为qt-4.7.3-src。

一键编译脚本如下:

#/bin/bash

exportPATH=/usr/local/arm/4.3.2/bin:$PATH

exportPKG_CONFIG_PREFIX=$TOOLCHAIN/arm-none-linux-gnueabi

exportTB_CC_PREFIX=arm-linux-

exportTOOLCHAIN=/usr/local/arm/4.3.2

rm-fr qt-everywhere-opensource-src-4.7.1

rm-fr /opt/qt-4.7.1

tarxfvz qt-everywhere-opensource-src-4.7.1.tar.gz

cdqt-everywhere-opensource-src-4.7.1

echoyes | ./configure -opensource -embedded arm -xplatform qws/linux-arm-g++  -no-webkit -qt-libtiff -qt-libmng  -qt-mouse-tslib -qt-mouse-pc-no-mouse-linuxtp -prefix /opt/qt-4.7.1  -I /usr/local/tslib/include -L /usr/local/tslib/lib

make2>&1 | tee ../qte4.7.1Makelog && make install

下面就是移植工作了,目标板需要用到的只有动态库、字库等,都在编译安装后生成的lib文件夹下,大概25.4M大小。其他文件和可执行程序是主机交叉编译目标板的Qt应用程序时用到的,不需要复制到目标板文件系统中。复制lib下所有文件到目标板/usr/local/qt-4.7.1-lib。修改目标板/etc/profile文件,添加环境变量如下:

exportQWS_MOUSE_PROTO=Tslib:/dev/input/event0

exportQWS_SIZE=480*272  (LCD分辨率)

exportQWS_DISPLAY=LinuxFb:mmWidth95:mmHeight54:0

exportQT_PLUGIN_PATH=/usr/local/qt473lib/plugins

exportQT_QWS_FONTDIR=/usr/local/qt473lib/fonts

exportLD_LIBRARY_PATH=/usr/local/tslib/:/usr/local/qt473lib/:$LD_LIBRARY_PATH

环境变量说明:

QWS_MOUSE_PROTO是鼠标的设置,Tslib表示使用tslib类型鼠标,即触摸屏,/dev/input/event表示触摸屏对应的设备节点,要与移植tslib时设置的环境变量TSLIB_TSDEVICE一致。如果想要同时支持USB鼠标,设置如下:

exportQWS_MOUSE_PROTO="Tslib:/dev/input/event0Intellimouse:/dev/input/mouse0"

QWS_DISPLAY指定显示形式和framebuffer。格式如下:

 export QWS_DISPLAY="[:] [:]"

的有效参数是LinuxFb, QVFb, VNC, Transformed, Multi 和keys identifying custom drivers,的参数通常是用来区分是否是相同的显示屏和是否支持多显示屏,这里设置为0。

驱动详细选项

可用的

描述

mmWidth=

LinuxFb,QVFb

屏幕的物理宽度 (通常是按分辨率计算).

mmHeight=

LinuxFb,QVFb

屏幕的物理宽度 (通常是按分辨率计算).

VNC,Transformed, Multi

指定一个子驱动.

Transformed

屏幕的旋转角度x的有效值为90,180,270.

mmWith和mmHeight的值的大小与Qt应用程序在LCD上显示的字体和控件大小有关系。VNC, Transformed和Multi screen drivers都依赖子驱动. 指定一个驱动的一般方法如下:

exportQWS_DISPLAY="[:][:] [:]

如果想要在原来设置的基础上把屏幕旋转90度,参数值设置如下:

QWS_DISPLAY=Transformed:Rot90:LinuxFb:mmWidth95:mmHeight54:0

Qt环境变量说明详见:环境变量配置完成后,执行#source/etc/profile使之生效。然后在主机交叉编译一个Qt测试程序,在目标板运行测试是否成功移植Qt。

测试程序hello.cpp如下:

#include<QApplication>

#include<QLabel>

intmain(int argc, char** argv)

{

        QApplication app(argc, argv);

        QLabel *label = new QLabel("HelloWorld!");

        label->show();

        return app.exec();

}

使用我们刚刚在/usr/local/qt-embedded-4.7.1/bin下生成的qmake,交叉编译生成目标板可执行文件hello。

#/usr/local/qt-embedded-4.7.1/bin/qmake -project

#/usr/local/qt-embedded-4.7.1/bin/qmake hello.pro

#make

下载到目标板,运行./hello -qws。目标板LCD显示出Hello World的窗口,Qt移植成功!


 

你可能感兴趣的:(qt,移植,OK6410)