分类: LINUX
2008-07-16 11:41:54
后注:
这是qte-
前提是已经做完了交叉编译环境建立和以上qtopia支持需要的库文件和支持触摸的tslib编译完毕
设置环境变量
tar xfz qt-embedded-
export QTEDIR=$PWD/qt-
tar xfz qt-x11-
export QT2DIR=$PWD/qt-
tar xfz qtopia-free-source-
export QPEDIR=$PWD/qtopia-
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-
用vi编辑/qte_arm/qte-
将SYSCONF_LIBS = -lm 修改为SYSCONF_LIBS = -lm -lts,
然后保存修改后的文件。在编译qte-
移植qte
cd qt-
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下的Makefile,add "-DQWS_CUSTOMTOUCHPANEL" into
"QT_CXXFLAGS_OPT",然后make sub-src。
****
cd ..
configure命令解释:
-xplatform linux-arm-g++,表示需要交叉编译,编译的目标平台是linux-arm-g++。具体可查看XPLATFORM文件。
-qconfig qpe,表示这次编译是为了支持QPE(Qtopia),只会生成QPE所需要的库。
-qvfb,qvfb支持。如果是在开发板上运行,则不需要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.
修改参见Qopi
****
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-
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-
qwsmouse_qws.cpp, and the libraries in qt-
now you can run examples "hello" to test it.
******
*******
Linux下的触摸平驱动有两种,一种是需要应用程序定位的;
一种是把定位信息写到驱动里面去的(貌似如此,不甚理解)。
对于Mizi 2410来说,里面的驱动属于第一种。
那么在移植Qt/E和Qtopia时,如何做才能使Qtopia支持触摸屏呢?我现在的理解是有两种办法。
第一种是修改Qt/E里面的src/kernel/qwsmouse_qws.cpp文件,具体方法是首先把在该文件种添加
#define CUSTOMTOUCH(该文件上面本行被注释调了,出去注释即可),
然后修改程序源代码,具体修改的办法可见Qopi
同时在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++.so和libgcc_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)、程序相应的desktop文件放在
qtopia_dev/.../arm/qtopia-phone-
(3)、所有的程序图标放在
qtopia_dev/.../arm/qtopia-phone-
手机目录:
/ (根目录)
|----bin
|----lib
|----home
|----mnt (对应于PC机的/opt/p2fs目录,该目录结构可随意)
|
|----opt
| |----Qtopia
| |----bin (放编译后的程序)
| |----etc
| |----pics (放图标文件)
| |----apps
| |--Applications (放desktop文件)
|
|----Applications (该目录结构任意,可存放工程自己的文件)
*****
拷贝库与触摸屏校准/测试程序
mkdir /root/2410s/qtopia-
mkdir /root/2410s/qtopia-
cp /root/2410s/tslib-1.3/tests/.libs/ts_*
/root/2410s/qtopia-
cp /root/2410s/tslib-1.3/src/.libs/libts-0.0.so.0*
/root/2410s/qtopia-
cp /root/2410s/tslib-1.3/src/.libs/libts.so
/root/2410s/qtopia-
cp /root/2410s/tslib-1.3/plugins/*.o /root/2410s/qtopia-
在/$QTEDIR/lib/目录下面看到libqte.so libqte.so.2 libqte.so.2.3
libqte.so.
有了这个库以后我们就可以把它拷贝到我们的开发板中相应的库目录下面,这里我们选择了
开发板上的/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-
export QPEDIR=/mnt/nfs/qtopia-
export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/0
export LD_LIBRARY_PATH=/mnt/nfs/qtopia-
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-
./ts_calibrate
运行PDA
/home/nfs/qtopia/bin
./qpe