您的位置:首页 > 服装鞋帽 > 男装 > QT_Qtopia编译与移植_加触摸屏支持说明(已在QQ2440和XSbase255板子上测试通过)

QT_Qtopia编译与移植_加触摸屏支持说明(已在QQ2440和XSbase255板子上测试通过)

luyued 发布于 2011-01-04 17:26   浏览 N 次  

移植到Qtopia到开发板上

1. Prepare software and cross-compile toolchain

arm-linux-gcc-3.3.2 arm交叉编译工具链

e2fsprogs-1.35.tar.gz 用于编译生成libuuid库

tmake-1.11.tar.gz 生成makefile

qt-embedded-2.3.7.tar.gz Qt/Embedded

qt-x11-2.3.2.tar.gz Qt/X11

qtopia-free-1.7.0.tar.gz Qtopia

Suppose that we save these software to /root/qt-arm

2. Install toolchain这里使用的是3.3.2版本的交叉编译工具链

cd /root/qt-arm

tar zxvf arm-linux-gcc-3.3.2

mv arm /usr/local/

vi ~/.bash_profile 添加到PATH路径

PATH=/usr/local/arm/3.3.2/bin:$PATH add

source ~/.bash_profile

3. Install tmake

tmake用于交叉编译生成qt应用程序的makefile, 也可用于生成qt的本地makefile,区别在于设置TMAKEPATH路径的不同,一个用于arm,一个用于x86。

注意:tmake 机子上本来就有的,但我们要使用11以上的版本,如果是11以上的版本可以不用安装。tmake –v 查看一下它的版本,有些版本比较老,建议换掉,同时把以前的tmake可执行文件删掉

tmake使用:在某个qt工程文件夹内

qmake –project 生成工程文件 假定工程文件夹名hello

tmake hello.pro –o Makefile 生成makefile

make 编译连接成可执行文件

cd /root/qt-arm

tar zxvf tmake-1.11.tar.gz

vi tmake-1.11/lib/qws/linux-ipaq-g++/tmake.conf

TMAKE_LINK=arm-linux-g++ //将原来的arm-linux-gcc 改成 arm-linux-g++

TMAKE_LINK_SHLIBS=arm-linux-g++

方法一:

mv tmake-1.11 /usr/local/

vi ~/.bash_profile 添加以下一些信息

PATH=/usr/local/tmake-1.11/bin:$PATH add

TMAKEPATH=/usr/local/tmake-1.11/lib/qws/linux-ipaq-g++

export PATH

export TMAKEPATH

source ~/.bash_profile

假如不用这种方法,可以直接用:

export PATH=$PWD/tmake-1.11/bin:$PATH

export TMAKEPATH=$PWD/tmake-1.11/lib/qws/linux-ipaq-g++

方法二:

mv tmake-1.11 tmake

export TMAKEDIR=/root/qt-arm/tmake

export TMAKEPATH=/root/qt-arm/tmake/lib/qws/linux-ipaq-g++

export PATH=$TMAKEDIR/bin:$PATH

4. Install e2fsprogs

为arm编译libuuid库,这里需要重新解压e2fsprogs压缩包,否无法正常编译生成共享库文件

cd /root/qt-arm

tar zxvf e2fsprogs.tar.gz

cd e2fsprogs

mkdir build

cd build

../configure --enable-elf-shlibs --build=i386-linux --host=arm-linux --with-cc=/usr/local/arm/3.3.2/bin/arm-linux-gcc --with-linker=/usr/local/arm/3.3.2/bin/arm-linux-ld

make

其中lib/libuuid.so.1.2 libuuid.so.1 libuuid.so 即是我们需要编译的库

5. Unpack Qtopia

cd /root/qt-arm

tar zxvf qtopia-free-1.7.0.tar.gz

mv qtopia-free-1.7.0 qtopia

cd qtopia

export QPEDIR=$PWD QPEDIR环境变量下面要用到

6. Install Qt/X11

编译qt-x11-2.3.2并非是用来开发,而是Virtual为了产生编译qtopia必须的库以及用于在图形环境下进行调试的qvfb(Qt Virtual Frame Buffer)。

这里安装qtopia时之要编译qt-2.3.2,是为了使用qt-2.3.2生成的uic,所以要用gcc/g++编译,不要用arm-linux-gcc/g++编译。注意不能直接用/usr/bin/uic,读者自己比较。

cd /root/qt-arm

tar zxvf qt-x11-2.3.2.tar.gz

mv qt-2.3.2 qt-x11

cd qt-x11/

export QTDIR=$PWD

echo yes | ./configure -static -no-xft -no-opengl -no-sm

make -C src/moc

cp src/moc/moc bin

make -C src

make -C tools/designer

strip bin/uic bin/moc bin/designer

cd ..

tar zxvf qt-embedded-2.3.7.tar.gz

mv qt-2.3.7 qt

cp qt-x11/bin/?* qt/bin

rm -fr qt-x11

7. Install Qt/Embedded

cd /root/qt-arm

export QTDIR=$PWD/qt

export QPEDIR=$PWD/qtopia

export PATH=$QTDIR/bin:$QPEDIR/bin:$PATH

cd qt

vi src/kernel/qwsmouse_qws.cpp 修改触摸屏驱动,详见附件

make clean

cp ../qtopia/src/qt/qconfig-qpe.h src/tools/

这里需要对qconfig-qpe.h做修改,首先需要注释掉QT_NO_QWS_CURSOR QT_NO_QWS_MOUSE QT_NO_QWS_MOUSE_AUTO这几个编译选项,

还有要在文件末尾加上#define QT_QWS_IPAQ和#QT_QWS_IPAQ_RAW这两个编译选项,表示加入触摸屏(/dev/h3600_tsram)的支持。而加上#define QWS_CUSTOMTOUCHPANEL 表示对触摸屏(/dev/ts)的支持,具体可以查看相应开发板的触摸屏驱动文件。

附件二是一个触摸屏的驱动测试程序。可以用其来测试触摸屏能否获取点击的坐标数据。

./configure -platform linux-ipaq-g++ -qconfig qpe -depths 16,24,32

依次输入yes,no

vi src/Makefile

add "-DQWS_CUSTOMTOUCHPANEL" into "QT_CXXFLAGS_OPT"

make -C src

其中lib目录下的libqte.so.2.3.7即是我们需要的qte库,还有一些支持多线程的库

8. Build Qtopia

cp /root/qt-arm/e2fsprogs/build/lib/libuuid.so* /usr/local/arm/3.3.2/lib/

cp /root/qt-arm/e2fsprogs/build/lib/libuuid.so* /usr/local/arm/3.3.2/arm-linux/lib/

cp /root/qt-arm/e2fsprogs/build/lib/* /root/qt-arm/qtopia/lib

cp –a /root/qt-arm/e2fsprogs/build/lib/uuid /root/qt-arm/qtopia/lib

cd /root/qt-arm

cd qtopia/src

./configure -platform linux-ipaq-g++

Make

9. Running application

运行程序有两种方式,一种是把相应的库和应用程序下载到板子上,另一种是通过nfs方式。

9.1 running application in board

将qt/lib 目录下载到板子上/usr/local/qt-embedded/目录下

将qtopia目录下的文件(要做一些裁减工作,把不必要的文件删除)下载到/usr/local/qtopia目录下

Minicom 登陆到开发板上

下载步骤略

export LD_LIBRARY_PATH=/usr/local/qt-embedded/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/local/qtopia/lib:$LD_LIBRARY_PATH

export QWS_MOUSE_PROTO=TPanel:/dev/ts 加入触摸屏支持,如果是h3600_tsram驱动则应该改为/dev/h3600_tsram

cd /usr/local/qtopia/bin

./qpe –qws & 运行qpe程序,移植成功

在XSbase255开发板上运行上面的的qt程序,在点击触摸屏的时候qpe程序虽然收到点击信号也能读取坐标数据,但是同时原先的启动的X-Windows也收到了坐标点击信息,X-Windows会响应相应的操作,这导致了qpe的程序界面会慢慢被X-Windows覆盖掉。为了解决这个问题,可以修改原来的文件系统,使得系统不要启动X-Windows,反正qt程序不需要X-Windows。修改文件系统中的/etc/inittab文件中最后一行的

x action “Starting x” start

然后重新下载新的文件系统到开发板上,那样运行qpe的时候就不会出现以上问题了。

9.2 单独移植qt

前面介绍的是把所有的qtoia和相应的应用程序都移植到开发板子上,而实际应用的时候,我们只要我们自己的qt程序能够在板子上运行就可以了,所以不需要把所有的qtopia库和程序都下载到板子上面,我们可以对其进行一些裁减:

(1)裁减库和共享库存在的插件plugin

arm-linux-strip –R .note –R .comment qtopia/bin/*

arm-linux-strip –R .note –R .comment qt/lib/libqte.so*

arm-linux-strip –R .note –R .comment qtopia/lib/libqpe.so*

arm-linux-strip –R .note –R .comment qtopia/plugins/*/*

(2)复制相应的库文件

cp qt/lib/libqte.so.2.3.7 qtopia/lib

cp –a qt/lib/fonts qtopia/lib/

(3)拷贝相应的库文件到文件系统的/usr/local/qtopia/目录下

cp –a qtopia/lib /XSbase255/rootfs/usr/local/qtopia/

cp –a qtopia/plugins /XSbase255/rootfs/usr/local/qtopia/

在拷贝库文件的时候可以做相应的裁减,将不需要的库可以从其中删除,以节省最终文件系统的空间。

(4)做好符号连接

cd /XSbase255/rootfs/usr/local/qt-embedded/lib/

ln –s libqte.so.2.3.7 libqte.so.2.3

ln –s libqte.so.2.3.7 libqte.so.2

ln –s libqte.so.2.3.7 libqte.so

9.3 running application through nfs

首先我们的pc机要开启nfs服务,详见开发板网络配置文档

Pc机:

vi /etc/exports

/ *(rw, no_root_squalsh)

/etc/rc.d/init.d/nfs start 开启nfs服务

netstat –au 查看是否开启nfs服务,如果没有查看防火墙

开发板:

Minicom登陆到班子上

mount –t nfs –o tcp 192.168.1.22:/root/qt-arm /mnt/qt-arm

cd /mnt/qt-arm

export LD_LIBRARY_PATH=/usr/local/qt-embedded/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/local/qtopia/lib:$LD_LIBRARY_PATH

export QWS_MOUSE_PROTO=TPanel:/dev/ts

cd ../qtopia/bin

./qpe –qws 运行qpe程序,移植成功

附件1:触摸屏修改程序

class QCustomTPanelHandlerPrivate : public QWSMouseHandler {

Q_OBJECT

public:

QCustomTPanelHandlerPrivate(MouseProtocol, QString dev);

~QCustomTPanelHandlerPrivate();

private:

int mouseFD;

unsigned char prevstate=0;

private slots:

void readMouseData();

};

QCustomTPanelHandlerPrivate::QCustomTPanelHandlerPrivate( MouseProtocol, QString ){

#ifdef QWS_CUSTOMTOUCHPANEL

if ((mouseFD = open( "/dev/ts", O_RDONLY)) //这里表示打开的触摸屏驱动ts,具体查看/dev目录下的设备驱动文件,有些触摸屏肯需要做修改,如h3600_tsram

qWarning( "Cannot open /dev/ts (%s)", strerror(errno));

return;

} else {

sleep(1);

}

QSocketNotifier *mouseNotifier;

mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, this );

connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));

#endif

}

QCustomTPanelHandlerPrivate::~QCustomTPanelHandlerPrivate(){

if (mouseFD >= 0)

close(mouseFD);

}

struct CustomTPdata {

unsigned char status;

unsigned short xpos;

unsigned short ypos;

};

void QCustomTPanelHandlerPrivate::readMouseData()

{

if(!qt_screen)

return;

CustomTPdata data;

short data2[4]={0};

int ret;

ret=read(mouseFD,data2,sizeof(data2));

if(ret) {

data.status=data2[0];

data.xpos=data2[1];

data.ypos=data2[2];

QPoint q;

q.setX(data.xpos);

q.setY(data.ypos);

mousePos=q;

if(data.status &&!prevstate) {

emit mouseChanged(mousePos,Qt::LeftButton);

} else if(!data.status&& prevstate){

emit mouseChanged(mousePos,0);

}

prevstate=data.status;

}

if(ret<0)

qDebug("Error %s",strerror(errno));

}

}

附件二:触摸屏驱动测试程序

#include

#include

#include

#include

#include

int main()

{

int ts,ret;

int num=0,i=0;

short data[4]={0};

if((ts=open("/dev/ts",O_RDONLY))>0)

printf("ts=%d open succes!\n",ts);

else

exit(1);

while(1)

{

ret=read(ts,data,sizeof(data));

num++;

printf("n=%d,read ret=%d\n",num,ret);

if(ret==-1)

{

printf("read fail\n");

exit(1);

}//if

for(i=0;i<4;i++)

printf("data[%d]=%x\n",i,data[i]);

printf("status=%x\n",data[0]);

printf("x=%d\n",data[1]);

printf("y=%d\n",data[2]);

usleep(100);

}//while

close(ts);

return 0;

}

====================================

在PC上安装qtopia模拟运行环境

准备以下源码包和文件(可以从网上下载)

tmake-1.11.tar.gz

qt-embedded-2.3.7.tar.gz

qt-x11-2.3.2.tar.gz

qconfig-local.h

假设源码包放在/home/build_qte/目录下

cd /home/build_qte/

1 tmake 配置

tar zxvf tmake-1.11.tar.gz ; 解压tmake源码包

cd tmake-1.11 ; 进入解压目录

vi env.sh ; 建立shell文件,在文件中添加如下内容

export TMAKEDIR=$PWD

export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++

export PATH=$TMAKEDIR/bin:$PATH

保存退出.

source env.sh ; 添加环境变量

cd .. ; 退出tmake-1.11目录

2 配置编译qt-embedded源码包

tar zxvf qt-embedded-2.3.7.tar.gz

mv qt-2.3.7 qt-2.3.7-x86

cd qt-2.3.7-x86

cp /home/build_qte/qconfig-local.h src/tools/ ; qconfig-local.h文件可以通过修改qconfig-qpe.h文件得到,或者直接移用qconfig-qpe.h文件。

vi env.sh ;添加如下内容

export QTDIR=$PWD

export QTEDIR=$QTDIR

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export PATH=$QTDIR/bin:$PATH

;保存退出.

source env.sh ; 添加环境变量

./configure -qconfig local -gif -thread -qvfb -depths 4,8,16,32 ;配置源码包

make sub-src ;编译

cd ..

3 配置编译qt-x11源码包

tar zxvf qt-x11-2.3.2.tar.gz

cd qt-2.3.2

export QTDIR=$PWD

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

./configure -no-xft -no-opengl

make

make -C tools/qvfb

cp tools/qvfb/qvfb $QTEDIR/bin/

cp bin/uic $QTEDIR/bin

cd ..

; 退出终端!

4 实例

; 建立qte开发的工作目录

mkdir /home/qte

cd /home/qte

; 建立shell文件,设置环境变量

vi set-qte-x86.sh

; 在文件中添加如下

#!/bin/bash

export QTDIR=/home/build_qte/qt-2.3.7-x86 ;编译qt-2.3.7的目录

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export TMAKEDIR=/home/build_qte/tmake-1.11 ;tmake-1.11的目录

export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++

export PATH=$QTDIR/bin:$TMAKEDIR/bin:$PATH

echo $PATH

; 保存退出

; 先不要执行source set-qte-x86.sh (不要设置环境变量)

; 建立工程目录

mkdir hello

cd hello

; 用designer生成工程文件(hello.pro), 窗体文件(hello.ui), 和main.cpp文件.

progen -n hello -o hello.pro

cd ..

source set-qte-x86.sh ;设置环境变量

cd hello

; 生成源文件

uic hello.ui -o hello.h

uic hello.ui -i hello.h -o hello.cpp

删除hello.pro, hello.ui文件, 省下hello.h, hello.cpp, main.cpp三个文件

progen -o hello.pro ; 生成工程文件

tmake hello.pro -o Makefile ; 生成Makefile文件

make ;开始编译

; 在PC机的模拟执行

qvfb &

; 新建终端, 在新建的终端中执行如下

cd /home/qte

source set-qte-x86.sh

cd hello

./hello -qws ; 执行刚才编译的hello.

广告赞助商