跳到主要內容

[Qt][Embedded][PXA270][Touch Screen][tslib]
在Qt 4.8.6 for Creator XScale PXA270支援觸控螢幕

這篇文章介紹在Qt 4.8.6 for Creator XScale PXA270上支援觸控螢幕一些過程,歡迎各位多多指教~

背景介紹

上一篇文章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

加入與修改tslib

由Github下載tslib-1.1版、解壓縮並進行修改
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位置
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

留言

這個網誌中的熱門文章

Run Android VTS with Android R emulator through WSL

Background Android VTS The Android Vendor Test Suite (VTS) provides extensive new functionality for Android testing and promotes a test-driven development process. Android R emulator Run the latest Android R image from Google CI build artifacts WSL WSL is a collection of components that enables native Linux ELF64 binaries to run on Windows . It contains both user mode and kernel mode components. It is primarily comprised of: User mode session manager service that handles the Linux instance life cycle Pico provider drivers (lxss.sys, lxcore.sys) that emulate a Linux kernel by translating Linux syscalls Pico processes that host the unmodified user mode Linux (e.g. /bin/bash) It is the space between the user mode Linux binaries and the Windows kernel components where the magic happens. By placing unmodified Linux binaries in Pico processes we enable Linux system calls to be directed into the Windows kernel. The lxss.sys and lxcore.sys drivers translate the Linux s...

[Qt][Embedded][PXA270]
Porting Qt 4.8.6 for Creator XScale PXA270

這篇文章介紹這學期我在嵌入式作業系統課程,使用Creator XScale PXA270板子的一些學習筆記與製作final project的一些過程,歡迎各位多多指教~ 背景介紹 Creator XScale PXA270開發版是一塊由 新華電腦(microtime) 公司出品的 模組化XScale/ARM/SoC/FPGA/DSP嵌入式行動通訊發展平台 ,在此課程與final project主要使用的是"Create XScale‐PXA270 子板"與"MTLCD‐0708048 LCD Module",在Create XScale‐PXA270子板上的為Intel(現在已出售給Marvell)的 Xscale系列 PXA270 處理器,基於ARMv5TE架構指令集,在旁附有SDRAM Memory 64MB、Flash Memory 32MB、SD Card Connectors、RJ45 10/100 Base‐T Ethernet Interface、USB 1.1 Device/Host Port各一、AC97 Audio Codec(Line_in、Mic_in、Headphone)、ADC Interface*4、PWM Interface、CMOS Camera Interface、TFT-LCD Interface、GPIO Interface...等;在軟體功能部分,由新華科技提供了GNU GCC cross compiler toolchain(arm-unknown-linux-gnu-gcc 4.0.2)、Uboot 1.1.5、Linux Kernel 2.6.15.3與patch(提供支援子板上的Ethernet、USB Host、TFT‐LCD(Frame buffer、Touch Screen)、AC97‐Codec...等與母板LED、7‐Seg LED、Key Pad...等的device driver)、rootfs,相關的實驗環境設定可以參考 User Guide 。 看到以上這麼多的軟硬體介面,別以為這板子有多強,其實這是 2006 年 ASUS P535 手機使用的規格了,不禁讓人感嘆科技進步之快阿~ 在此附上開發版本尊 Qt 是自由且開放原始碼的跨平台C...

[Android][AOSP][ddmlib][Intelij IDEA][Gradle]搭建Android ddmlib編譯環境

Android ddmlib在AOSP的platform/tools/base的repo內 可以使用以下指令將整個repo的master branch抓回: git clone https://android.googlesource.com/platform/tools/base 取其中的annotations、common、ddmlib 建立Intelij IDEA專案 使用Intelij IDEA開一新的Java Project,GroupId、ArtifictedId、Version隨便,並使用graddle wrapper方式建立專案: GroupId 'com.android.tools.ddms' ArtifictedId = 'ddmlib' Version '1.0-SNAPSHOT' 刪除IDE建立的src資料夾,建立base資料夾,將annotations、common、ddmlib複製進來 參考Android Studio建立的專案,修改build.gradle為: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { mavenCentral() } } allprojects { repositories { mavenCentral() } } task clean(type: Delete) { delete rootProject.buildDir } 修改settings.gradle,加入annotations、common、ddmlib為include rootProject.name = 'ddmlib' include ':base:annotations' include ':base:common' include ':base:ddmlib' 修改annotations、common、ddmlib內的b...