Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309951
  • 博文数量: 55
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-07 13:47
文章分类
文章存档

2011年(1)

2010年(2)

2009年(14)

2008年(38)

我的朋友

分类: LINUX

2008-11-21 17:50:58

QtTrolltech公司的一个产品。Trolltech是挪威的一家软件公司,主要开发两种产品:一种是跨平台应用程序界面框架;

另外一种就是提供给做嵌入式Linux开发的应用程序平台,能够应用到PDA和各种移动设备上。QtQtopia分别是其中具有代表性的两个。

Qtopia基于Qt的嵌入式版本Qt/Embedded库的基础上,专门针对PDASmartPhone这类运行嵌入式Linux的移动计算设备和手持设备所开发的开放源码的一套应用程序包和开发库。

下面就开始移植工作。

我的工作环境为vmware linuxredhat完全安装,pxq255,交叉编译工具链为自带的hybus-arm-linux-R1.1.tar.gz2.95.3),由于采用的是pxa255板子上自带的触摸屏驱动以及其提供的修改方法,所以如果按照下面的步骤做,这里也基本上遇到不了什么大的问题。小问题,仔细分析一下就可以解决掉了。

第一步:准备所需要的软件和交叉编译工具。

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

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

       tmake-1.13.tar.gz生成makefile

       qt-embedded-2.3.7.tar.gzQt/Embedded

       qt-x11-2.3.2.tar.gzQt/X11

       qtopia-free-1.7.0.tar.gzQtopia

第二步:安装交叉编译工具链

       具体步骤(见上一篇blog

第三步:安装tmake工具

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

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

       # cd /home/tang/qt

       # tar zxvf tmake-1.13.tar.gz

       # vi tmake-1.13/lib/qws/linux/arm-g++/tmake.conf

       做如下的修改:

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

TMAKE_LINK_SHLIBS=arm-linux-g++

# mv tmake-1.13   /usr/local/

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

PATH=/usr/local/tmake-1.13/bin:$PATH

TMAKEPATH=/usr/local/tmake-1.13/lib/qws/linux-arm-g++

export PATH

export TMAKEPATH

# source ~/.bash_profile使环境变量生效,如果你刚才没有将原有的旧版本删去,这时候你发现使用# tmake –v的时候还是旧版本。这时候你可以# rm –rf /usr/bin/tmake将旧版本的tmake删去,然后# source ~/.bash_profile,这样就替换掉了系统上原来的tmake

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

# export PATH=$PWD/tmake-1.13/bin:$PATH

# export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-arm-g++

第四步:安装e2fsprogs

E2fsprogs 提供用于ext2 文件系统的工具。它还支持ext3 日志文件系统。E2fsprogs内含了许多标准工具,用于针对EXT2EXT3文件系统的创建、修复、配置和debugger用途。

arm编译libuuid

              # cd /home/tang/qt

              # tar zxvf  e2fsprogs-1.35.tar.gz

              #cd e2fsprogs-1.35

              # mkdir build

# cdbuild

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

# make

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

第五步:解压qtopia

       #cd /home/tang/qt

       # tar –zxvf qtopia-free-1.7.0.tar.gz

       #cd qtopia-free-1.7.0

       #export QPEDIR=$PWD

              下面要用到QPEDIR这个环境变量

第六步:安装Qt/Embedded

       #cd /home/tang/qt

# tar zxvfqt-embedded-2.3.7.tar.gz

# cdqt-2.3.7

# export QTDIR=$PWD

# export QTEDIR=$PWD

# export PATH=$PWD/bin:$PATH

# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH

# vi src/kernel/qwsmouse_qws.cpp

 

修改触摸屏驱动,如下:

************************************************************************************

触摸屏修改程序

class QCustomTPanelHandlerPrivate : public QWSMouseHandler {

    Q_OBJECT

public:

    QCustomTPanelHandlerPrivate(MouseProtocol, QString dev);

    ~QCustomTPanelHandlerPrivate();

private:

    int mouseFD;

    unsigned char prevstate;

private slots:

    void readMouseData();

};

QCustomTPanelHandlerPrivate::QCustomTPanelHandlerPrivate( MouseProtocol, QString ){

#ifdef QWS_CUSTOMTOUCHPANEL

    if ((mouseFD = open( "/dev/ts", O_RDONLY)) < 0) {

        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));

    }

}

 

***********************************************************************************

第七步:安装Qt/X11

 

 

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

这里安装qtopia时只要编译qt-2.3.2,是为了使用qt-2.3.2生成的uic,所以要用gcc/g++编译,不要用arm-linux-gcc/g++编译。

#cd/home/tang/qt

# tar zxvfqt-x11-2.3.2.tar.gz

# cdqt-2.3.2/

# vi configs/linux-g++-shared修改语句

SYSCONF_CXXFLAGS_X11= -I/usr/include/freetype2

 

 

#export QTDIR=$PWD

# export PATH=$PWD/bin:$PATH

# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH

# ./configure –no-xft

# make

# make -C tools/qvfb/

# cp tools/qvfb/qvfbbin/

# ./bin/qvfb             //////////////////////x11-FrameBuffer就运行起来了

#cp bin/uic$QPEDIR/bin/

# cp bin/uic$QTEDIR/bin/

第八步:安装Qtopia

      

 

#cd /home/tang/qt /qtopia-free-1.7.0

# cp /home/tang/qt/e2fsprogs/build/lib/libuuid.so* /usr/local/Hybus-arm-linux-R1.1/lib/

# cp /home/tang/qt/e2fsprogs/build/lib/libuuid.so* /usr/local/Hybus-arm-linux-R1.1/arm-linux/lib/

# cp -a /home/tang/qt /e2fsprogs/lib/uuid include/

# export QTDIR=$QTEDIR

# export PATH=$PWD/bin:$PATH

# export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH

# cdsrc/

#./configure -xplatformlinux-arm-g++需要交叉编译

#make

这样交叉编译工作就完成了,剩下的就是可以将这些东西下载到板子上来运行了。

第九步:运行程序

首先,要关闭PXA255XWindows,注释掉/etc/inittab文件最后一行代码

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

 

 

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

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

Minicom登陆到开发板上。

下载步骤略。

在板子上运行qpe的过程如下:

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

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

# cd/usr/local/qtopia/bin

#./qpe–qws ////////////////////能够运行,表明移植成功。

 

 

通过nfs运行qpe

首先我们的pc机要开启nfs服务(略)

配置环境变量(脚本文件)

# export QTDIR=/mnt/qte

# export QPEDIR=/mnt/qtopia

# export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH

# cd../qtopia-free-1.7.0/bin

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

下载完成后就可以运行程序了。

congratulations

不过这过程中也会出现一些问题,上面的命令有的空格符号标示的不太明显,所以结果有可能不对,这样就需要回头找原因到底是哪个环节出错误了,google一下就有了。

 

编绎Qtopia遇到的主要问题.

1) 版本问题: 以上所用的QTEQPE的版本都必须严格对应, 稍有差错,编绎将不能通过. GCC的版本问题, 用最新的GCC4.1是不能编绎的, 这是一个已经报告的此版本GCCBUG, 所以能做的只有卸掉此版本的GCC, 装上3.4.2.

2) 库问题: 编绎中可能会提示各种错误, 如未定义引用, 找不到头文件之类的错误, 其主要原因是缺少相应的库, 找到那个库, 编绎之,问题就会迎刃而解. 当然, 编绎库的过程中也可能会需要另外一个库, 这个过程是反复的.

ps:

参考主要来自于张老师的指导文档。

阅读(2067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~