這篇文章介紹在Qt 4.8.6 for Creator XScale PXA270上支援觸控螢幕一些過程,歡迎各位多多指教~
(PS:必須重開一個terminal,讓剛剛CC、CXX等環境變數不要影響Qt configure)
最後附上以上步驟成功的執行畫面
背景介紹
上一篇文章Porting Qt 4.8.6 for Creator XScale PXA270介紹如何cross compile Qt 4.8.6
此篇接續該篇的結果繼續說明支援觸控螢幕的步驟
此篇接續該篇的結果繼續說明支援觸控螢幕的步驟
首先拜問Google大神,尋找參考資料:
官方文件提供了詳細的說明: Qt for Embedded Linux Pointer Handling
甚至有論文(Wang Xibo; Yang Jianan, "Add Touch Screen Support for QT/Embedded," in Computer Science-Technology and Applications, 2009. IFCSTA '09. International Forum on , vol.3, no., pp.303-306, 25-27 Dec. 2009 doi: 10.1109/IFCSTA.2009.314)專門討論如何在Qt上支援觸控螢幕...
在這裡我們使用官網的Tslib Mouse Driver方案!!
Tslib,顧名思義就是Touch Screen Library(此句來源:小耕的隨手筆記: TSLIB on Android gingerbread),提供觸控螢幕矯正、過濾雜訊...等功能,據資料指出Android也有使用到該library,詳細資訊可以看作者github的README: https://github.com/kergoth/tslib
官方文件提供了詳細的說明: Qt for Embedded Linux Pointer Handling
甚至有論文(Wang Xibo; Yang Jianan, "Add Touch Screen Support for QT/Embedded," in Computer Science-Technology and Applications, 2009. IFCSTA '09. International Forum on , vol.3, no., pp.303-306, 25-27 Dec. 2009 doi: 10.1109/IFCSTA.2009.314)專門討論如何在Qt上支援觸控螢幕...
在這裡我們使用官網的Tslib Mouse Driver方案!!
Tslib,顧名思義就是Touch Screen Library(此句來源:小耕的隨手筆記: TSLIB on Android gingerbread),提供觸控螢幕矯正、過濾雜訊...等功能,據資料指出Android也有使用到該library,詳細資訊可以看作者github的README: https://github.com/kergoth/tslib
加入與修改tslib
由Github下載tslib-1.1版、解壓縮並進行修改
修改plugins/input-raw.c第142行,讓tslib不要檢查ABS and KEY event types是否支援
修改tests/fbutils.c第129行,試圖讓tslib的ts_calibrate可以正常顯示,但是似乎改了也沒有效?
修改tests/testutils.c、tests/ts_calibrate.c
這一部分的修改主要是讓ts_calibrate可以正常運作
修改了一些程式邏輯來暴力達到原calibrate的功能
放了很多printf,甚至scanf來檔,請至github commit diff處看
以下指令中,QT_ROOT是上一篇就設定的環境變數:
wget https://github.com/kergoth/tslib/archive/1.1.tar.gz
tar zxvf 1.1.tar.gz
cd tslib-1.1/
修改一、首先是修改etc/ts.conf,將第二行module_raw input取消註解# Uncomment if you wish to use the linux input layer event interface module_raw input此檔案會在ts_config.c中,由環境變數TSLIB_CONFFILE讀去指定的設定檔
./src/ts_config.c:45: if( (conffile = getenv("TSLIB_CONFFILE")) == NULL) {修改二、接著是參考新華libminigui-1.3.3範例的touch screen部分,修改src/ts_open.c第28行,開啟觸控螢幕裝置/dev/ts的flag為O_RDONLY
int flags = O_RDONLY;修改三、
修改plugins/input-raw.c第142行,讓tslib不要檢查ABS and KEY event types是否支援
- if (i->sane_fd == 0) - i->sane_fd = check_fd(i); + //if (i->sane_fd == 0) + // i->sane_fd = check_fd(i);與在第284行後增加code,一樣是參考新華libminigui-1.3.3範例,增加ev.type == 0的情況,使之不會進入Unknown event type
+ } else if (ev.type == 0) { + if (ev.code==0 && ev.value==0) + { + samp->pressure = ( samp->pressure > 0 ? 4:0); + } + //printf("Input_event : mousex=%d, mouse_y=%d\n", mousex, mousey);修改四、
修改tests/fbutils.c第129行,試圖讓tslib的ts_calibrate可以正常顯示,但是似乎改了也沒有效?
- fbuffer = mmap(NULL, fix.smem_len, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fb_fd, 0); + fbuffer = mmap(NULL, fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);修改五、
修改tests/testutils.c、tests/ts_calibrate.c
這一部分的修改主要是讓ts_calibrate可以正常運作
修改了一些程式邏輯來暴力達到原calibrate的功能
放了很多printf,甚至scanf來檔,請至github commit diff處看
編譯tslib
由於tslib使用到automake工具,故需要安裝autoconf、automake、libtool工具以下指令中,QT_ROOT是上一篇就設定的環境變數:
sudo apt-get install autoconf automake libtool ./autogen.sh export CC="arm-unknown-linux-gnu-gcc -O2 -march=armv5te -mtune=xscale -Wa,-mcpu=xscale -Uarm -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -fno-omit-frame-pointer" export CXX="arm-unknown-linux-gnu-g++ -O2 -march=armv5te -mtune=xscale -Wa,-mcpu=xscale -Uarm -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -fno-omit-frame-pointer" export CPP="arm-unknown-linux-gnu-gcc -E" export CXXCPP="arm-unknown-linux-gnu-g++ -E" ./configure -host=arm-linux -prefix=$QT_ROOT/build-pxa270/tslib-1.1 make -j8 make install
此時可以將$QT_ROOT/build-pxa270複製到Linux target上,執行build-pxa270/tslib-1.1/bin/ts_calibrate測試
export QTDIR=$(pwd)/build-pxa270 export QT_QWS_FONTDIR=$QTDIR/lib/fonts export QWS_MOUSE_PROTO=Tslib:/dev/ts export TSLIB_ROOT=$QTDIR/tslib-1.1 export TSLIB_TSDEVICE=/dev/ts export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_ROOT/lib:$LD_LIBRARY_PATH $TSLIB_ROOT/bin/ts_calibrate
但是在ts_lib的測試程式中,開啟frame buffer的code似乎沒有寫好
或是與板子的操作方式不太相容,故可能完全沒有畫面
但是拿觸控筆觸控螢幕時,卻可以讓tslib的printf印出數值
於是我放棄修改tslib的測試程式操作linuxfb部分
tslib與Qt結合
開啟qmake.conf加入tslib的include與link位置
或是與板子的操作方式不太相容,故可能完全沒有畫面
但是拿觸控筆觸控螢幕時,卻可以讓tslib的printf印出數值
於是我放棄修改tslib的測試程式操作linuxfb部分
tslib與Qt結合
cd $QT_ROOT gedit mkspecs/qws/linux-arm-pxa270-g++/qmake.conf填入以下內容,/home/eos/qt-desktop-opensource-src-4.8.6請改為你的路徑:
TS_LIB_ROOT = /home/eos/qt-desktop-opensource-src-4.8.6/build-pxa270/tslib-1.1 QMAKE_CFLAGS += -I$$TS_LIB_ROOT/include QMAKE_CXXFLAGS += -I$$TS_LIB_ROOT/include QMAKE_LFLAGS += -L$$TS_LIB_ROOT/lib -Wl,-rpath-link=$$TS_LIB_ROOT/lib接著增加-qt-mouse-tslib option重新configure Qt與重新build:
(PS:必須重開一個terminal,讓剛剛CC、CXX等環境變數不要影響Qt configure)
./configure -embedded arm -xplatform qws/linux-arm-pxa270-g++ -prefix build-pxa270 -release -no-opengl -opensource -verbose -no-glib -no-xrender -no-xrandr -no-xfixes -no-xcursor -no-xinerama -no-xsync -no-xvideo -no-xshape -little-endian -confirm-license -no-rpath -qt-mouse-tslib make -j8 make install然後再次複製$QT_ROOT/build-pxa270到Linux target上,以下列命令測試:
export QTDIR=$(pwd)/build-pxa270 export QT_QWS_FONTDIR=$QTDIR/lib/fonts export QWS_MOUSE_PROTO=Tslib:/dev/ts export TSLIB_ROOT=$QTDIR/tslib-1.1 export TSLIB_TSDEVICE=/dev/ts export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export LD_LIBRARY_PATH=$QTDIR/lib:$TSLIB_ROOT/lib:$LD_LIBRARY_PATH $QTDIR/demos/mainwindow/mainwindow -qws $TSLIB_ROOT/bin/ts_test $TSLIB_ROOT/bin/ts_calibrate $QTDIR/demos/pathstroke/pathstroke -qws大功告成
最後附上以上步驟成功的執行畫面
$TSLIB_ROOT/bin/ts_calibrate
$QTDIR/demos/pathstroke/pathstroke -qws
留言
張貼留言