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,安裝,編譯完後即可。

        注意鍵盤驅動程序需另寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章