一、觸摸屏移植
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,安裝,編譯完後即可。
注意鍵盤驅動程序需另寫。