(1)QTE本身触摸屏加载;
主要注意三个内容:
-
编译QTE时,在其自定义配置文件(位于QTDIR/src/tools/qconfig-XXX.h,其XXX为自定义的名字,该特征字可以在configure时用-qconfig XXX指定)所应加的内容:
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
去掉鼠标自动识别功能 :#define QT_NO_QWS_MOUSE_AUTO
去掉不用的鼠标驱动,(在实际中,这一步可以不要,但对于缩减QTE的大小很有帮助),方法主要是在configure时设置配置参数为-no-mouse-pc -no-mouse-bus -no-mouse-yopy -no-mouse-vr41xx 。
以该编译好的QTE库为基础,编译应用程序;
-
在目标机上,要将触摸屏驱动链接好。在QTE3.0的版本中,如果定义了上述的两个IPAQ相关的宏,其默认打开设备文件/dev/h3600_tsraw。如果只定义QT_QWS_IPAQ,则打开设备文件为/dev/h3600_ts。
-
在目标机上,设定环境变量:QWS_MOUSE_PROTO=linuxtp:/dev/h3600_tsraw。
(2)使用tslib方法;
-
编译TSLIB1.3:
-
进行如下操作
-
-
#./autogen.sh #生成configure文件
-
CC= $ARM_TOOL_PATH/arm-linux-gcc
-
CXX= $ARM_TOOL_PATH/arm-linux-g++
-
./configure --host=arm-linux --target=arm-linux --disable-inputapi --prefix=$PWD/build
-
make
-
make install
-
-
将build的整个目录拷贝到目标机,然后在目标机做如下设定,修改/etc/profile文件,在其中加入以下环境变量的设置
-
export V_ROOT=/xxx/xxx/build #目标机上build所在的路径
-
export TSLIB_TSEVENTTYPE=H3600 #设定类型为H3600,其主要是对着tslib中的设备结构体定义,该定义要与触摸屏驱动中的一致
-
export TSLIB_CONSOLEDEVICE=none #设定控制台设备为none,否则默认为/dev/tty。在tslib1.3源码中,只要不是none,它就会打开$(TSLIB_CONSOLEDEVICE)1,默认的为/dev/tty1的设备,然后从中读取console的可用设置。这样可以避免出现“open consoledevice: No such file or directory KDSETMODE: Bad file descriptor”的错误
-
export TSLIB_FBDEVICE=/dev/fb0 #指定帧缓冲设备
-
export TSLIB_TSDEVICE=/dev/touchscreen/0raw #指定触摸屏设备节点文件
-
export TSLIB_CALIBFILE=$V_ROOT/etc/pointercal #指定触摸屏校准文件pintercal的存放位置
-
export TSLIB_CONFFILE=$V_ROOT/etc/ts.conf #指定TSLIB配置文件的位置
-
export TSLIB_PLUGINDIR=$V_ROOT/share/ts/plugins #指定触摸屏插件所在路径
-
-
编译TSLIB1.4(TSLIB07072006)
-
进行如下操作:
-
echo "ac_cv_func_malloc_0_nonnull=yes" > tslib/arm-linux.autogen #为了防止出现undefined reference to `rpl_malloc' 错误
-
CONFIG_SITE=arm-linux.autogen ./configure CC=arm-linux-gcc CXX=arm-linux-g++ --host=arm-s3c2410-linux-gnu --target=arm-s3c2410-linux-gnu --disable-input --disable-arctic2 --disable-mk712 --disable-collie --disable-corgi --disable-ucb1x00 --disable-linear-h2200 --with-gnu-ld --prefix=$PWD/build
-
make
-
make install
-
-
将build的整个目录拷贝到目标机,然后在目标机做如下设定,修改/etc/profile文件,在其中加入以下环境变量的设置。其解释类上,不同于TSLIB1.3的是,TLIB1.4通过配置文件ts.conf中module_raw h3600语句来加载对应的设备结构体定义。已废除了TSLIB_TSEVENTTYPE宏。
-
export V_ROOT=/xxx/xxx/build
-
export TSLIB_TSDEVICE=/dev/touchscreen/0raw
-
export TSLIB_CALIBFILE=/etc/pointercal
-
export TSLIB_CONFFILE=$V_ROOT/etc/ts.conf
-
export TSLIB_PLUGINDIR=$V_ROOT/lib/ts
-
export TSLIB_CONSOLEDEVICE=none
-
export TSLIB_FBDEVICE=/dev/fb0
-
-
一个值得注意的问题是:TSLIB1.4在ts_config函数中通过while((p=fgets(buf,BUFF_SIZE,f))!=NULL)来加载ts.conf中的语句,而buf只有512byte。所以对于ts.conf没有用的定义语句,请将其删除,以防止误发生段错误。
-
-
以TSLIB库为基础,编译QTE。
-
QTE2.3.10直接支持-tslib选项开关的应用。不用修改任何文件。可以通过网上所说的拷贝tslib.h头文件及库文件到QTE相关目录来进行编译(对于tslib1.4,还要拷贝tslib_private.h)。也可以在./configure进指定-L<path to tslib library> -I<path to tslib header>来防止出现找不到相应库文件 的错误。(对于tslib1.4,应该还加上-lts选项)。
-
对于其它版本的QTE,可以通过在QTE文件夹路径下执行grep -lir 'tslib' *来查看是否有对tslib的支持,如果没有则需要对源码进行相应的修改。(onebyte注:虽然网上说有补丁可下,但俺一直没找到相关的patch,但看看QTE2.3.10的源码后再做相应的修改还算比较方便:)
-
[onebyte后记]:
由于是一个人在做基于embedded linux的软件开发,没有他人直接的交流,所以摸索QTE触摸屏支持的过程是相当辛苦的!网上关于这一块的说法不一,使得自己对QTE触摸屏支持的方法很长时间辨不清方向。但在这里还是要非常感谢网上的许多朋友,正是通过大家的讨论才将这块内容逐渐理通。
在这里特将这些方法记载下来,送给同我一样经历过困惑的朋友们:P
[参考网站]
网上各论坛中关于TSLIB内容的帖子不少,这里只记一些主要的论坛网站,有兴趣的可以到这上面去看看:
[2] 华恒嵌入论坛
[4] QT Forum
onebyte注:前一阵子简略地分析了一下QT中触摸屏相关文件,现在把它共享出来。希望能对志同道合的朋友有所帮助:P
------------------------------
文件位于QTDIR/src/embedded/文件夹中。
(1)类结构示意图,如下图所示。
(2)与触摸屏相关主要函数进行解释如下:
-
QWSLinuxTPMouseHandlerPrivate其构造函数
在其中打开设备文件/dev/h3600_tsraw或h3600_ts或ts(视宏定义),并将其readMouseData()槽同QSocketNotifier的activated信号连接起来。
QsocketNotifier由所打开的设备文件号初始化。这样就可以将驱动中的事件同上层应用程序中的鼠标动作联系起来。
-
QWSLinuxTPMouseHandlerPrivate::readMouseData()
该函数读取设备文件/dev/h3600_tsraw或h3600_ts,视宏定义。并在其内部将触摸屏设备坐标(也就是电压值)通过其父类:QWSCalibrateMouseHandler::transform()函数转换为屏幕坐标。并取一定点的平均值。
-
QWSCalibrateMouseHandler::transform()
通过a, b, c, d, e, f转换参数将设备坐标转换为屏幕坐标。
-
QWSCalibrateMouseHandler::Calibration()
求取坐标转换系数及偏差(a, b, c, d, e, f,实际用的是二点校正法:左上及右下点。)。并调用writeCalibration将参数值输出到/etc/pointcal文件中。
-
QWSCalibrateMouseHandler::readCalibration()
从/etc/pointcal文件读取坐标转换系统及偏差。
(3)上述类都是通过qmousedriverfatory进行初始创建的。
[编译环境注:]
宿主机Linux操作系统为Fedro Core 5
交叉编译工具链版本:arm-linux-g++ 2.95.3,
宿主机编译工具链GCC 版本为4.1.0
QT-X11版本为2.3.2
QT/E版本为2.3.7
QTOPIA版本为1.7.0
(1)编译QT-X11
-
解压qt-x11-2.3.2.tar.gz,并更改解压文件夹名为qt-x11
-
cd qt-x11
-
更改qt-x11文件夹中src/tools/qvaluestack.h第57行源代码remove( this->fromLast() );为this->remove( this->fromLast() );否则,会出现[xml/qxml.o]错误
-
建立set-env文件
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/doc/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
echo yes | ./configure -no-xft -no-opengl -no-sm
make
-
在该文件夹下,执"source set-env"命令(.与set-env之间有空格)
(2)编译目标机版本的qte-2.3.7
-
为了编译QTOPIA,将QTOPIA文件夹下./src/qt/qconfig-qpe.h拷贝到QTE文件夹下 src/tools/
-
然后建立set-env文件
#!/bin/bash
#编译QTE脚本
#此处$PWD指的是QTE所在的文件夹
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export PATH=/usr/local/arm/2.95.3/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
echo yes | ./configure -platform linux-x86-g++ -xplatform linux-arm-g++ -qconfig qpe -depths 16,24,32
make
-
执行"source set-env"
-
注意,在此处configure时,一定要写明platform及xplatform,且platform要设为linux-x86-g++,否则当使用linux-generic-g++时,会找当前系统默认的g++,由于前面在PATH处设定新的g++路径,所以会出现错误。
-
如果需要移植到目标机上,则将$QTEDIR/lib/libqte.so.x.y.z拷贝至目标机上lib文件夹下,并命名为/lib/libqte.so.x(根据前面的libqte编号而定);
将$QTEDIR/lib/fonts/fontdir拷贝到目标机上qt/e的安装路径上(通过在目标机上设置$QTDIR来实现),如/usr/local/qt-embedded/lib/fonts/fontdir
(3)编译目标机版本的qtopia-1.7.0
-
由于在编译qtopia时,需要用到QTE的uic命令来解释有关的资源,所以此处,需要将前面编译的qt-x11中bin目录下的uic命令拷贝至QTEDIR/bin下。
-
建立set-env文件:
#!/bin/bash
#安装QTOPIA
export QPEDIR=$PWD
#此处的QTDIR是前面编译的QT/E的路径
export QTDIR=/friendly-arm/arm-qtopia/qt
export QTEDIR=$QTDIR
#本机工具链的位置,根据个人情况设置
export PATH=/usr/local/arm/2.95.3/bin:$PATH
export PATH=$QTDIR/bin:$PATH
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
cd ./src
echo yes | ./configure -platform linux-arm-g++
make
-
执行"source set-env"
-
如果需要移植到目标机上,将QPEDIR目录下的bin, apps, etc, plugins, services, sounds, i18n, lib, pics, help文件夹拷贝到目标机上的QPEDIR处(通过设置QPEDIR来实现)
-
在目标机的bin目录下,建立qtopia脚本文件(如下)
#!/bin/sh
export set HOME=/root
export set QTDIR=/opt/qt
export set QPEDIR=/opt/qtopia
export set QWS_KEYBOARD="USB:/dev/input/event1"
export set QWS_MOUSE_PROTO="USB:/dev/input/mouse0"
export set PATH=$QPEDIR/bin:$PATH
export set LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib
$QPEDIR/bin/qpe > /dev/null 2>/dev/null
-
在目标机启动后,就可以使用qtopia直接启动