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

一、触摸屏移植

     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/embedqkbddriverfactory_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,安装,编译完后即可。

        注意键盘驱动程序需另写。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值