您的位置:首页 > 编程语言 > Qt开发

QT下触摸屏和键盘接口移植

2010-07-15 14:12 246 查看
一、触摸屏移植
1、安装及编译tslib 1.4
将tslib 1.4.tar.ba2复制到/home 目录下解压缩
# cd /home/tslib
# ./autogen.sh
# echo ac_cv_func_malloc_0_nonnull=yes>arm-linux.cache
# ./configure --prefix=/usr/local/tslib --host=arm-linux --cache-file=arm-linux.cache CC=/usr/local/arm/arm-2007q3/bin/arm-none-linux-gnueabi-gcc CXX=/usr/local/arm/arm-2007q3/bin/arm-none-linux-gnueabi-g++
# make
# make install
编译好后,修改/usr/local/tslib/etc/下ts.conf文件 将module_raw input前注释号给去掉,然后将/ust/local/tslib下所有文件拷贝到开发板相应的目录下。
2、配置及交叉编译QT
方法同第一节所述,在配置QT的时候需加上触摸屏选项 -qt-mouse-tslib,同时要指定tslib头文件和库路径。在
/home/qt-embedded-linux-opensource-src-4.5.2/mkspecs/qws/linux-arm-g+/qmake.conf 添加
QMAKE_INCDIR = /usr/local/tslib/include
QMAKE_LIBDIR = /usr/local/tslib/lib
也可以直接在-qt-mouse-tslib后指定
-qt-mouse-tslib –I/usr/local/tslib/include -L/usr/local/tslib/lib
3、环境变量设置
在开发板上/etc/profile 文件中加入
export TSLIB_TSDEVICE=/dev/input/touchscreen0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
完成后,重启开发板运行 ./ts_calibrate,校验触摸屏。
二、键盘接口移植
1、注册键盘类
修改/qt-embedded-linux-opensource-src-4.5.2/src/gui/embed下qkbddriverfactory_qws.cpp文件如下:
QWSKeyboardHandler *QKbdDriverFactory::create(const QString& key, const QString& device)
{
#ifndef QT_NO_QWS_KBD_VR41XX
if (driver == QLatin1String("ts") || driver.isEmpty())
return new QWSVr41xxKeyboardHandler(device);
#endif
}

QStringList
QKbdDriverFactory::keys()
{
#ifndef QT_NO_QWS_KBD_VR41XX
list <<
QLatin1String("TS");
#endif
}

2、修改/qt-embedded-linux-opensource-src-4.5.2/src/gui/embed 下qkbdvr41xx_qws.cpp文件如下:
QWSVr41xxKbPrivate::QWSVr41xxKbPrivate(QWSVr41xxKeyboardHandler *h,const QString &device) : handler(h)
{
terminalName = device;
if (terminalName.isEmpty())
terminalName = "/dev/kbd7279";

if ((kbdFD = open((const char *)terminalName.toLocal8Bit(), O_RDONLY | O_NDELAY)) < 0) {
qDebug("Cannot open techshine keybord (%s)/n", (const char *)terminalName.toLocal8Bit());
} else {
qDebug("open techshine keybord (%s) success!!/n", (const char *)terminalName.toLocal8Bit());
notifier = new QSocketNotifier(kbdFD, QSocketNotifier::Read, this);
connect(notifier, SIGNAL(activated(int)),this, SLOT(readKeyboardData()));
}

kbdBufferLen = 80;
kbdBuffer = new unsigned char [kbdBufferLen];
kbdIdx = 0;

keyDelay=qgetenv("QWS_KEYDELAY").toInt();
if(keyDelay<=1000)
keyDelay=200000;//us
}

void QWSVr41xxKbPrivate::readKeyboardData()
{
int tmp;
static int bakkey;
int nKey(Qt::Key_unknown);
int unicode(0);
static struct timeval tv;
struct timeval tv1;

tmp=ioctl(kbdFD,0,0);
if(tmp!=0xFF & kbdFD!=-1)
{
gettimeofday(&tv1,NULL);
tmp&=0x0F;
if(tmp==bakkey && ((tv1.tv_sec-tv.tv_sec)*1000000+tv1.tv_usec-tv.tv_usec)<keyDelay)
{
bakkey=tmp;
qDebug("have Repeat Key!!!!!");
return;
}
switch(tmp)
{

case 0x00:
{
nKey=Qt::Key_0 ;
unicode=0x30;
break;
}
case 0x01:
{
nKey=Qt::Key_1 ;
unicode=0x31;
break;
}
case 0x02:
{
nKey=Qt::Key_2 ;
unicode=0x32;
break;
}
case 0x03:
{
nKey=Qt::Key_3 ;
unicode=0x33;
break;
}
case 0x04:
{
nKey=Qt::Key_4 ;
unicode=0x34;
break;
}
case 0x05:
{
nKey=Qt::Key_5 ;
unicode=0x35;
break;
}
case 0x06:
{
nKey=Qt::Key_6 ;
unicode=0x36;
break;
}
case 0x07:
{
nKey=Qt::Key_7 ;
unicode=0x37;
break;
}
case 0x08:
{
nKey=Qt::Key_8 ;
unicode=0x38;
break;
}
case 0x09:
{
nKey=Qt::Key_9 ;
unicode=0x39;
break;
}
case 0x0A:
nKey=Qt::Key_Period ;
unicode=Qt::Key_Period;
break;
case 0x0B: nKey=Qt::Key_Tab ;break;
case 0x0C: nKey=Qt::Key_Backspace ;break;
case 0x0D: nKey=Qt::Key_Down ;break;
case 0x0E: nKey=Qt::Key_Up ;break;
case 0x0F: nKey=Qt::Key_Return ;break;
default:nKey=Qt::Key_unknown;
}
bakkey=tmp;
//qDebug("readkeyboardData tmp%d nKey%d /n",tmp,nKey);
handler->processKeyEvent(unicode, nKey, 0, true ,false);
gettimeofday(&tv,NULL);
}
}

注:由于调用了延时,要加头文件#include <sys/time.h>

3、配置及交叉编译QT
方法同第一节所述,在配置QT的时候需加上键盘选项-qt-kbd-vr41xx,安装,编译完后即可。
注意键盘驱动程序需另写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: