开发者社区> sky-heaven> 正文

ARM QT实现多点触摸【转】

简介: 转自:http://www.cnblogs.com/sky1991/archive/2013/06/03/3114702.html http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/ Embedded Linux...
+关注继续查看

转自:http://www.cnblogs.com/sky1991/archive/2013/06/03/3114702.html

http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/

Embedded Linux Multitouch with Qt, TUIO, and TSLIB

 

This tutorial describes how to set up multi-touch and single-touch touchscreen input
for Qt for embedded Linux. I assume that you received a driver from your touchscreen
manufacturer or there is an existing one you can use in the Kernel source.

First things first, locate your driver ( usually /drivers/input/touchscreen/* ), and 
ensure that you have every event type being defined that is required by tslib. So, 
specifically you need EV_SYN, EV_ABS, and EV_KEY. My driver did not define EV_KEY, 
and even though it does not report that event type, I still had to define it in the 
driver source for tslib to work with the input from the driver.

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

Now build the Kernel with your driver ( either as module or driver ) and fire up your
board.

My input device is called 'touchscreen'. Yours will probably be event1 or event0 depending
on serveral possible reasons.

See what the device is with:

# 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 


You can see more information with:

# 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


To ensure that your driver is working do the following command and 
then move your finger around the screen. You should see output here
when you finger is touching the screen.
# 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


Go back to your host machine and download the tslib src from here 
--> https://github.com/kergoth/tslib.

Enter the tslib source directory ( cd tslib/plugins ) and edit the input-raw.c file.
Replace any occurences of ABS_X / Y with ABS_MT_POSITION_X / Y. These are the names
of the multi-touch event type variables produces by a multitouch driver.

Now that everything is in order, build tslib and deploy using the following commands
to your exported nfs ( root file system ) for the board:
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


When ts.conf opens for editing, uncomment the 'input raw' line ( the very first 
commented out module ).

Now log back into your embedded machine and export the following environment
variables:

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


Now we are ready to calibrate. Go to /usr/bin and launch the calibration
utility. You should now see a calibration image on the screen requesting
you to touch a few crosshairs. Go ahead and do that until it stops. Then
your screen is calibrated! The calibration parameters are stored in the
/etc/pointercal file. (you may have to first increase the brightness
of your screen with --> 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 


You can also test the touchscreen mouse input by running:

ts_test

Great! Now you have single mouse input with tslib ready to go!

Now let's move on to multi-touch.

Download the following packages to enable multitouch events with Qt.

https://github.com/x29a/qTUIO 
https://github.com/olivopaolo/mtdev2tuio 
http://bitmath.org/code/mtdev/ 
http://liblo.sourceforge.net/ 

Export your cross-compiler and toolchain:

export CC=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-gcc
export CXX=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-g++


Enter the liblo source code directory and build and deploy with:


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/

Enter the mtdev source code directory and build and deploy with:

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/


Enter the mtdev2tuio bridge source code directory and build and deploy with:

cd /home/user/Desktop/QTUIO/mtdev2tuio
make clean
make
sudo cp mtdev2tuio /home/user/exported-nfs/usr/bin/


Enter the qTUIO source directory and build and deploy with:

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/


Now kick off the server that will take multi-touch events input from
mtdev and feed that as TUIO packets to Qt:

# ./mtdev2tuio /dev/input/touchscreen osc.udp://127.0.0.1:3333/
Sending OSC/TUIO packets to osc.udp://127.0.0.1:3333/


Also, ensure that you exported your Qt mouse pointer input environment
variable as follows:

export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen

Now use Qt Creator or some other IDE to build and deploy the pinchzoom
example found in the qTUIO examples directory to the board.

On the board ( or from Qt Creator ) run the application like:

cd /home/test ; export QWS_MOUSE_PROTO=Tslib:/dev/input/touchscreen  ; ./pinchzoom -qws

Output should look like:

Connecting to device...
Killing remote process(es)...
Starting remote process ...
Remote process started.
graphicsview initialized 
listening to TUIO messages on UDP port 3333


The application will launch on your screen and you should be able to use your finger
as a mouse but also pinch and zoom ( gestures ) at the same time!

Happy coding :)

Feel free to leave feedback - happy coding

【作者】张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用飞凌嵌入式IMX6UL-C1板子——qt+opencv环境搭建
使用飞凌嵌入式IMX6UL-C1板子——qt+opencv环境搭建
96 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十)gcc编译器的使用(下)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十)gcc编译器的使用
104 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十)gcc编译器的使用(上)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十)gcc编译器的使用
190 0
Qt实用技巧:Qt从QtCreator更换为VS开发Qt所需要注意的坑
Qt实用技巧:Qt从QtCreator更换为VS开发Qt所需要注意的坑
169 0
Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示
Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示
155 0
QT5.6移植到ARM三星4412-
QT5.6移植到ARM三星4412-
133 0
QT应用编程: 基于Qt设计的跨平台录音机功能
QT应用编程: 基于Qt设计的跨平台录音机功能
163 0
Qt6-Qt5代码移植到Qt6
尝试下Qt5的代码是否可以正常在Qt6上编译通过,使用的我网易云代码,这里测试的时候我先添加了5.12的版本进行测试没有问题,下面将切换到6.0的环境试一下。
647 0
Qt-QML-安卓编译问题
Qt-QML-安卓编译问题
50 0
Qt HUD(平显)演示程序绿色版
把一个黑底白字的程序改成黑底绿字
69 0
+关注
sky-heaven
我是一个技术爱好者,喜欢分享交流技术心得
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载
相关镜像