【轉】基於Qt, TUIO和TSLIB的嵌入式Linux下的多點觸摸設計


這個教程描述了在嵌入式linux下使用Qt如何設置一個支持多點觸摸和單點觸摸的輸入系統。這里假定你已經有了對應的驅動程序,驅動可以從觸摸屏的廠商那里獲得或者使用一個linux 內核源碼中已經存在的驅動。

 
第一要務,找到你的驅動程序(通常在/drivers/input/touchsreen/*)並且確認你已經定義好了tslib中所需要的每個事件類型。通常你需要EV-SYN, EV-ABS和EV_KEY.我自己使用的驅動中沒有定義EV_KEY, 因此驅動不會發送這一個類型的事件。為了能夠使tslib和這個驅動的輸入系統好好工作,我需要在驅動代碼中定義這個事件。
 
set_bit(EV_SYN, aura.input_dev->evbit);
set_bit(EV_ABS, aura.input_dev->evbit);
set_bit(EV_KEY, aura.input_dev->evbit); # I had to add this line so that tslib was happy
 
現在使用修改后的驅動源碼重新構建內核,並且在開發板上運行起來。
我這里的輸入設備名稱是‘touchscreen’, 由於多種原因, 你們的輸入設備名稱可能是event1 或者event0 。
使用下面的命令查看設備
 
# ls -rlt /dev/input/touchscreen 
lrwxrwxrwx    1 root     root             6 Jan 17 21:06 /dev/input/touchscreen -> event1
# chmod 777 /dev/input/touchscreen 
# chmod 777 /dev/input/event1 
 
使用下面的命令,你可以看到更多的信息
 
# cat /sys/devices/virtual/input/input1/uevent 
PRODUCT=0/0/0/0
NAME="aura-touchscreen"
PROP=0
EV=9
ABS=650000 0
MODALIAS=input:b0000v0000p0000e0000-e0,3,kra30,32,35,36,mlsfw
 
使用下面的命令,然后再屏幕上移動你的手指以確認觸摸屏驅動是否正在工作。
當你的手指在屏幕上移動時,你應該看到下面的現象。
 
# cat /dev/input/touchscreen  | hexdump
0000000 9011 3883 565f 0001 0003 0030 0001 0000
0000010 9011 3883 565f 0001 0003 0032 0001 0000
0000020 9011 3883 565f 0001 0003 0035 04c9 0000
0000030 9011 3883 565f 0001 0003 0036 0c3f 0000
0000040 9011 3883 565f 0001 0000 0002 0000 0000
0000050 9011 3883 565f 0001 0000 0000 0000 0000
0000060 9011 3883 90a9 0001 0003 0030 0001 0000
0000070 9011 3883 90a9 0001 0003 0032 0001 0000
 
返回你的主工作台, 從這里 https://github.com/kergoth/tslib  下載tslib的源碼。
進入tslib的源碼目錄(cd tslib/plugins)並且編輯input-raw.c 文件。
使用ABS_MT_POSITION_X / Y替換所有的 ABS_X / Y, 這些是多點觸摸驅動產生的多點觸摸事件變量的名稱。
現在剩下的事件已經很明朗了,使用下面的命令 構建tslib並且部署到板子使用的根文件系統中。
 
sudo ./autogen-clean.sh
sudo ./autogen.sh
sudo export ac_cv_func_malloc_0_nonnull=yes
sudo export PATH=`pwd`:$PATH
sudo ./configure CC=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-gcc
CXX=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-g++
--host=arm-linux
--prefix=/usr/local/tslib
--enable-shared=yes
--enable-static=yes
sudo make
sudo make install
sudo cp /usr/local/tslib/bin/* /home/user/exported-nfs/usr/bin/
sudo cp /usr/local/tslib/etc/ts.conf /home/user/exported-nfs/etc/
sudo cp -r /usr/local/tslib/lib/ts /home/user/exported-nfs/usr/lib
sudo cp /usr/local/tslib/lib/* /home/user/exported-nfs/lib/
sudo vim /home/user/exported-nfs/etc/ts.conf
 
打開ts.conf 准備編輯,刪除'input raw'這一行的注釋符。
現在回到嵌入式板子上, 導出下面這些環境變量。
 
export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_TSDEVICE=/dev/input/touchscreen
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export TSTS_INFO_FILE=/sys/devices/virtual/input/input1/uevent
export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen
export PATH=$PATH:/usr/bin
 
現在我們准備校正,進入目錄/usr/bin並且啟動校正功能,你應該能成屏幕上看到一個校正圖片,要求你點擊一個十字。
按照屏幕上說明進行操作,直到校正結束。現在你的屏幕已經校正過了。校正的參數存儲在/etc/pointercal 這個文件中。
使用下面的命令可以增加屏幕的亮度  echo 127 > /sys/class/backlight/generic-bl/brightness 。
 
# ts_calibrate 
xres = 640, yres = 480
Took 5 samples...
Top left : X = 3817 Y = 3912
Took 6 samples...
Top right : X =  269 Y = 3822
Took 5 samples...
Bot right : X =  356 Y =  550
Took 5 samples...
Bot left : X = 3732 Y =  614
Took 6 samples...
Center : X = 2202 Y = 2216
643.068298 -0.155621 -0.000056
491.792572 0.002567 -0.115674
Calibration constants: 42144124 -10198 -3 32230118 168 -7580 65536 
 
你也可以運行 ts_test 來測試觸摸屏的鼠標輸入功能。
到目前為止, 使用tslib的單點輸入功能,已經可以使用了。
現在我們開始進行多點觸摸的功能
 
下載下面的包,用來在Qt上支持多點觸摸事件。
 
導出你的交叉編譯工具和工具鏈

export CC=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-gcc
export CXX=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-g++
 
進入liblo的源碼目錄, 使用下面的命令構建和部署:
 
cd /home/user/Desktop/QTUIO/liblo-0.26
export SKIP_RMDIR_CHECK=yes
./configure --prefix=/usr/local/lib/liblo --host=arm
make clean
make
sudo make install
cd /usr/local/lib/liblo
sudo cp bin/* /home/user/exported-nfs/usr/bin/
sudo cp lib/liblo.a /home/user/exported-nfs/usr/bin/
sudo cp lib/liblo.la /home/user/exported-nfs/usr/bin/
進入mtdev的源碼目錄, 使用下面的命令構建和部署:
cd /home/user/Desktop/QTUIO/mtdev-1.1.2
./autogen.sh
./configure --prefix=/usr/local/lib/mtdev --host=arm
make clean
make
sudo make install
cd /usr/local/lib/mtdev
sudo cp bin/* /home/user/exported-nfs/usr/bin/
sudo cp lib/libmtdev.a /home/user/exported-nfs/usr/bin/
sudo cp lib/libmtdev.la /home/user/exported-nfs/usr/bin/
 
進入mtdev2tuio的源碼目錄, 使用下面的命令構建和部署:
cd /home/user/Desktop/QTUIO/mtdev2tuio
make clean
make
sudo cp mtdev2tuio /home/user/exported-nfs/usr/bin/
 
進入qTUIO的源碼目錄, 使用下面的命令構建和部署:
cd /home/user/Desktop/QTUIO/qTUIO
sudo rm -rf /home/user/Desktop/QTUIO/qTUIO/lib/*
cd src/
/home/user/output/buildroot/host/usr/bin/qmake
make clean
make
cd ../lib
mv libqTUIO_d.so.1.0.0 libqTUIO.so.1.0.0
sudo rm -rf *libqT*_d*so*
sudo ln -sf libqTUIO.so.1.0.0 libqTUIO.so.1.0
sudo ln -sf libqTUIO.so.1.0.0 libqTUIO.so.1
sudo ln -sf libqTUIO.so.1.0.0 libqTUIO.so
sudo mkdir -p /usr/local/lib/qTUIO
sudo cp -r ../lib/* /usr/local/lib/qTUIO
sudo cp -r /usr/local/lib/qTUIO/* /home/user/exported-nfs/usr/lib/
 
現在,啟動服務進程,服務進程會從mtdev接收多點觸摸事件,並以TUIO 包的形式轉發給Qt。
# ./mtdev2tuio /dev/input/touchscreen osc.udp://127.0.0.1:3333/
Sending OSC/TUIO packets to osc.udp://127.0.0.1:3333/
 
當然,要保證你已經像下面那樣,導出了Qt Mouse 指向的輸入環境變量。
export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen
 
現在,可以使用QtCreator 或者其他的IDE 構建和部署qUIO examples 目錄下的pinchzoom 到板子上。
在板子上(或者在QtCreator中) 像下面那樣運行應用程序 
 
cd /home/test ; export QWS_MOUSE_PROTO=Tslib:/dev/input/touchscreen  ; ./pinchzoom -qws
 
應該得到類似下面的輸出:
Connecting to device...
Killing remote process(es)...
Starting remote process ...
Remote process started.
graphicsview initialized 
listening to TUIO messages on UDP port 3333

 
應用程序將會顯示在你的屏幕上,並且你可以使用你的手指作為鼠標使用及通過手勢動作進行縮放的操作。
快樂編程微笑
原文連接:
http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/embedded-linux-multitouch.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM