环境:周立功的m3352的核心板,使用tslib,Qt4.7的环境下
usb触摸屏断开之后,即使重连,在已经运行的qt程序中,并且系统已经生成了触摸设备节点,qt程序也是不能恢复触摸。
解决方法:修改qt源码中的src/gui/embedded/qmousetslib_qws.cpp
在QWSTslibMouseHandlerPrivate::readMouseData()的开始处加入以下代码
void QWSTslibMouseHandlerPrivate::readMouseData()
{
if(!qt_screen)
return;
/* Support usb touchscreen hotplug */
int version;
if (ioctl(ts_fd(dev), EVIOCGVERSION, &version) < 0) {
disconnect(mouseNotifier, 0, 0, 0);
delete mouseNotifier;
while (1) {
if(open()) {
mouseNotifier = new QSocketNotifier(ts_fd(dev), QSocketNotifier::Read, this);
connect(mouseNotifier, SIGNAL(activated(int)), this, SLOT(readMouseData()));
resume();
return;
}
system("echo waiting for tp ...");
system("sleep 1");
}
}
/* end */
...
}
注:
- 记得ioctl()的头文件, #include <sys/ioctl.h>
- EVIOCGVERSION未定义 ,#define EVIOCGVERSION _IOR('E', 0x01, int) /* 获取驱动的版本信息*/
重新编译qt,将生成的libQtGui.so.4.7.3替换到机器上即可
这一次真的被搞死了,arm板子是周立功的m3352的核心板,一切都按照他给的参考资料,然后发现,实际里面的跟他们给的教程的build-qt是不一致的,使用新编译的库替换后,永远运行不成功,不是bus error,就是Segmentation fault
替换后的Qt4编译源码的build-qt.sh文件
#!/bin/sh
(echo yes) | \
./configure \
-prefix /opt/qt /*指定路径*/ \
-embedded arm \
-platform qws/linux-x86-g++ \
-xplatform qws/linux-arm-gnueabi-g++ \
-depths 16,18,24,32 \
-no-mmx \
-no-3dnow \
-no-sse \
-no-sse2 \
-no-glib \
-no-cups \
-no-largefile \
-no-accessibility \
-no-openssl \
-no-gtkstyle \
-qt-mouse-pc \
-qt-mouse-linuxtp \
-qt-mouse-linuxinput \
-plugin-mouse-linuxtp \
-plugin-mouse-pc \
-fast \
-D QT_NO_QWS_CURSOR \
-D QT_QWS_CLIENTBLIT \
-release \
-host-little-endian -little-endian \
-opensource \
/* 添加内容 */
-qt-mouse-tslib \
-I/opt/tslib/include \
-L/opt/tslib/lib \
同时修改qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf文件
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC = arm-none-linux-gnueabi-gcc -lts /* -lts为添加内容 */
QMAKE_CXX = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++ -lts
# modifications to linux.conf
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_STRIP = arm-none-linux-gnueabi-strip
load(qt_config)