Chinaunix首页 | 论坛 | 博客
  • 博客访问: 635459
  • 博文数量: 121
  • 博客积分: 8469
  • 博客等级: 中将
  • 技术积分: 1065
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-03 10:32
文章分类

全部博文(121)

文章存档

2013年(1)

2012年(15)

2010年(2)

2009年(8)

2008年(95)

我的朋友

分类: LINUX

2008-07-16 11:41:54

后注

这是qte-2.3.10qtopia-2.1.1版本的交叉编译

前提是已经做完了交叉编译环境建立和以上qtopia支持需要的库文件和支持触摸的tslib编译完毕

 

设置环境变量

tar xfz qt-embedded-2.3.10-free.tar.gz(解压后qt-2.3.10改名为qt-2.3.10-arm)

 

export QTEDIR=$PWD/qt-2.3.10-arm

 

tar xfz qt-x11-2.3.2.tar.gz

 

export QT2DIR=$PWD/qt-2.3.2

 

tar xfz qtopia-free-source-2.1.1.tar.gz(解压后qtopia-free-2.1.1改名为qtopia-2.1.1-arm)

 

export QPEDIR=$PWD/qtopia-2.1.1-arm

 

tar xfz tmake-1.13.tar.gz

 

export TMAKEDIR=$PWD/tmake-1.13

 

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

 

export PATH=$TMAKEDIR/bin:$PATH

 

 

修改qte-2.3.10交叉编译环境参数文件使其增加对触摸屏的支持;

 vi编辑/qte_arm/qte-2.3.10/configs/linux-arm-g++-shared文件,

 SYSCONF_LIBS = -lm 修改为SYSCONF_LIBS = -lm lts

 然后保存修改后的文件。在编译qte-2.3.10源代码过程中使用触摸屏共享库。

 

移植qte

cd qt-2.3.10-arm

 

export QTDIR=$PWD

 

export PATH=$QTDIR/bin:$PATH

 

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

 

 #vi src/kernel/qwsmouse_qws.cpp

        修改触摸屏驱动源代码,见下面

 

mkdir bin

 

cp $QT2DIR/bin/uic bin

 

cp $QT2DIR/tools/qvfb/qvfb bin

 

cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/

 

./configure -xplatform linux-arm-g++ -qconfig qpe -qvfb –thread –tslib

-system-jpeg -gif -depths 4,8,16,32

 

#vi src/Makefile

        添加 -DQWS_CUSTOMTOUCHPANEL QT_CXXFLAGS_OPT

 

make sub-src

 

**

注意:有人说要编辑src下的Makefileadd "-DQWS_CUSTOMTOUCHPANEL" into

"QT_CXXFLAGS_OPT",然后make sub-src

****

 

cd ..

 

configure命令解释:

-xplatform linux-arm-g++,表示需要交叉编译,编译的目标平台是linux-arm-g++。具体可查看XPLATFORM文件。

-qconfig qpe,表示这次编译是为了支持QPEQtopia,只会生成QPE所需要的库。

-qvfbqvfb支持。如果是在开发板上运行,则不需要qvfb

-thread,是否支持多线程。选择后会生成libqte-mt.so库(挺大的)。

-system-jpeg -gif,图形文件支持

-depths 4,8,16,32,支持4,8,16,32位颜色,如只需要16位,则-depths 16,或在./configure询问中输入16

 

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

 

修改参见Qopia 2.1.1 文档/docpointer_qws.html一文

****

1.2 Make Touchscreen useful under Qt

We want to use touchscreen in Qt/e and Qtopia enviroment, but it

doesn't work yet, so we have to change it myself

Using Vi to open Qt/e source code

"qt-2.3.7/src/kernel/qwsmouse_qws.cpp", refer to the read function à

read(ads7843_ts_read) in touchscreen driver

"driver/char/ads7843_ts.c", modify the file:

1.     Uncomment definition "#define QWS_CUSTOMTOUCHPANEL", it means

that you will use your own custom touchscreen class à

QCustomTPanelHandlerPrivate

2.class QCustomTPanelHandlerPrivate : public QWSMouseHandler {

   Q_OBJECT

public:

   QCustomTPanelHandlerPrivate(MouseProtocol, QString dev);

   ~QCustomTPanelHandlerPrivate();

 

private:

   int mouseFD;

   int prevstate;    // add this line

private slots:

   void readMouseData();

 

};

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

   }

   prevstate = 0;     //add this line

   QSocketNotifier *mouseNotifier;

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

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

#endif

}

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

    }

 

#if 0                   // below has been disabled

#ifdef QWS_CUSTOMTOUCHPANEL

   if(!qt_screen)

      return;

 

  CustomTPdata data;

   unsigned char data2[5];

   int ret;

 

   ret=read(mouseFD,data2,5);

 

   if(ret==5) {

      data.status=data2[0];

      data.xpos=(data2[1] << 8) | data2[2];

      data.ypos=(data2[3] << 8) | data2[4];

      QPoint q;

      q.setX(data.xpos);

      q.setY(data.ypos);

      mousePos=q;

      if(data.status & 0x40) {

         emit mouseChanged(mousePos,Qt::LeftButton);

      } else {

      emit mouseChanged(mousePos,0);

      }

   }

   if(ret<0) {

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

   }

#endif

#endif

}

 

///我实际用了这个

void QCustomTPanelHandlerPrivate::readMouseData()

{

#ifdef QWS_CUSTOMTOUCHPANEL

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

   }

#endif

}

 

5.     in function QWSMouseHandler* QWSServer::newMouseHandler(const

QString& spec)

QWSMouseHandler *handler = 0;

mouseProtocol = TPanel;   // add this line

   switch ( mouseProtocol ) {

6.Change path to qt-2.3.7/src, and run "make", just only compile

qwsmouse_qws.cpp, and the libraries in qt-2.3.7/lib has been relinked,

now you can run examples "hello" to test it.

******

 

*******

Linux下的触摸平驱动有两种,一种是需要应用程序定位的;

一种是把定位信息写到驱动里面去的(貌似如此,不甚理解)。

对于Mizi 2410来说,里面的驱动属于第一种。

那么在移植Qt/EQtopia时,如何做才能使Qtopia支持触摸屏呢?我现在的理解是有两种办法。

 

     第一种是修改Qt/E里面的src/kernel/qwsmouse_qws.cpp文件,具体方法是首先把在该文件种添加

     #define CUSTOMTOUCH(该文件上面本行被注释调了,出去注释即可)

     然后修改程序源代码,具体修改的办法可见Qopia 2.1.1 文档中pointer handling一文。

     同时在config Qtopia时,最好在设备特定配置文件中加入#define QWS_NEED_CALIBRATION

     这样当Qtopia在启动时会去检验在/etc是否有pointcal文件,没有的话,

     就先产生叫用户校正的过程,并把校正信息存放在/etc/pointcal文件中,

     以后启动时不再需要校正。如果没有加入#define QWS_NEED_CALIBRATION配置,

     那么为了使Qtopia相应你的触摸平,你必须在启动QTOPIA前进行校正(必须用与QT/E里面相同的算法)

     并产生/etc/pointcal文件,否则Qtopia启动时会报告打不开该文件,从而无法相应触摸平。

 

    第二种不用修改Qt/E,而是利用tslib

*******

 

qtopia移植

注:这里需要libstdc++.solibgcc_s.so库,hybus-arm-linux-R1.1/lib没有,所以要从网上下载;版本一定要是2.95.3

cd $QPEDIR

 

export QTDIR=$QTEDIR

 

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

 

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

export LD_LIBRARY_PATH=$QTEDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH

 

export PATH=/usr/local/arm/2.95.3/bin:$PATH

 

cd $QPEDIR/src/libraries/qtopia

cp custom-linux-ipaq-g++.cpp custom-linux-arm-g++.cpp

cp custom-linux-ipaq-g++.h custom-linux-arm-g++.h

 

 

cd $QPEDIR/src

../configure -xplatform linux-arm-g++

 

***

我编译的时候遇到了缺少头文件的情况,我就从本机的/usr/include目录中复制过去了

***

make

 

make install

 

*****

将编译好的程序、desktop文件和图标放在手机上/opt/Qtopia/各自对应的目录下。

 

   (1)、所有编译后的程序放在

qtopia_dev/.../arm/qtopia-phone-2.1.1/image/opt/Qtopia/bin/目录下

 

   (2)、程序相应的desktop文件放在

qtopia_dev/.../arm/qtopia-phone-2.1.1/image/opt/Qtopia/apps/Application/目录下

 

   (3)、所有的程序图标放在

qtopia_dev/.../arm/qtopia-phone-2.1.1/image/opt/Qtopia/pics/程序名/ 目录下

 

 

手机目录:

   /            (根目录)

   |----bin

   |----lib

   |----home

   |----mnt        (对应于PC机的/opt/p2fs目录,该目录结构可随意)

   |

   |----opt

   |    |----Qtopia

   |        |----bin    (放编译后的程序)

   |        |----etc

   |        |----pics    (放图标文件)

   |        |----apps

   |                |--Applications    (desktop文件)

   |

   |----Applications    (该目录结构任意,可存放工程自己的文件)

*****

 

拷贝库与触摸屏校准/测试程序

     mkdir /root/2410s/qtopia-2.1.1-arm/bin/tests

     mkdir /root/2410s/qtopia-2.1.1-arm/lib/ts

     cp /root/2410s/tslib-1.3/tests/.libs/ts_*

/root/2410s/qtopia-2.1.1-arm/bin/tests

     cp /root/2410s/tslib-1.3/src/.libs/libts-0.0.so.0*

/root/2410s/qtopia-2.1.1-arm/lib

     cp /root/2410s/tslib-1.3/src/.libs/libts.so

/root/2410s/qtopia-2.1.1-arm/lib

     cp /root/2410s/tslib-1.3/plugins/*.o /root/2410s/qtopia-2.1.1-arm/lib/ts/

 

     /$QTEDIR/lib/目录下面看到libqte.so libqte.so.2 libqte.so.2.3

libqte.so.2.3.10 这四个文件.

     有了这个库以后我们就可以把它拷贝到我们的开发板中相应的库目录下面,这里我们选择了

     开发板上的/usr/lib 目录,将/$QTEDIR/lib/下的libqte.so*复制到/usr/lib 目录下。

 

     首先要建立宿主机和开发板的通讯,假设本机的ip 地址为192.168.0.155 并且/root/share 为共享文件夹。

cp –arf /$QTEDIR/lib/libqte.so*  /root/share

 

 注意 ::::   把文件/root/2410s/tslib-1.3/etc/ts.conf文件拷贝到你的板子的/mnt/yaffs/目录下

 

cp /root/2410s/tslib-1.3/etc/ts.conf  /root/share

 

   执行 minicom

 

    重启nfs /etc/rc.d/init.d/nfs restart

 

    mount t nfs o nolock 192.168.0.155:/root/share /mnt/nfs 将文件复制到开发板上

 

    cp –arf /mnt/nfs/libqte.so* /usr/lib

 

    cp /mnt/nfs/ts.conf /mnt/yaffs

  4.运行[以下操作在目标板上进行]:

     在你的板子上设置运行环境变量

export QTDIR=/mnt/nfs/qtopia-2.1.1-arm

export QPEDIR=/mnt/nfs/qtopia-2.1.1-arm

export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/0

export LD_LIBRARY_PATH=/mnt/nfs/qtopia-2.1.1-arm/lib

 

export TSLIB_TSDEVICE=/dev/touchscreen/0

export TSLIB_CONSOLEDEVICE=/dev/vc/

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_CONFFILE=/mnt/yaffs/ts.conf

export TSLIB_PLUGINDIR=$QTDIR/lib/ts

 

 

export TSLIB_TSDEVICE=/dev/ts

export TSLIB_CALIBFILE=/etc/pointercal

export TSLIB_CONFFILE=/etc/ts.conf

export TSLIB_PLUGINDIR=/usr/ts?/ts/plugins

export TSLIB_CONSOLEDEVICE=none

 

     校准屏幕(5点校准)

     cd /mnt/nfs/qtopia-2.1.1-arm/bin/tests

     ./ts_calibrate

     运行PDA

     /home/nfs/qtopia/bin

     ./qpe

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