由于我的嵌入式平台为x86的。网上大多数资料都是ARM平台的。可能x86的更简单些,但是我也遇到不少问题。过程和问题如下:
tslib版本 tslib 1.4
下载地址:http://download.csdn.net/detail/mmz_xiaokong/4980129
qt版本:4.8.4
下载地址:
http://qt-project.org/downloads
触摸屏控制器:penmount 6000 usb
1、编译tslib 1.4
./configure --prefix=/usr/local/qte/tslib/
sudo make;sudo make install
2、修改ts.conf内容
# vi /usr/local/qte/tslib/etc/ts.conf
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
3、开发板配置环境变量
通过超级终端,# vi /etc/profile
添加如下内容(绿色):
export TSLIB_ROOT=/usr/local/qte/tslib
export TSLIB_TSDEVICE=/dev/input/event4
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
如下注释
export TSLIB_ROOT=/usr/local/qte/tslib
export TSLIB_TSDEVICE=/dev/input/event4 指定触屏设备
export TSLIB_CALIBFILE=/etc/pointercal 指定触摸屏校准文件 pintercal 的存放位置
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf 指定 TSLIB 配置文件的位置
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts 指定触摸屏插件所在路径
export TSLIB_FBDEVICE=/dev/fb0 指定帧缓冲设备
export TSLIB_CONSOLEDEVICE=none 设定控制台设备为 none ,否则默认为 /dev/tty ,这样可以避免出现“open consoledevice: No such file or directory KDSETMODE: Bad file descriptor ” 的错误
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
4、执行测试命令
./bin/ts_calibrate ./bin/test
*********************************************************************** 问题汇总 ***********************************************************************
问题1:
./autogen.sh: 4: autoreconf: not found
是在不同版本的 tslib 下执行 autogen.sh 产生。它们产生的原因一样,是
因为没有安装automake 工具, (ubuntu 10.04)用下面的命令安装好就可以了。
sudo apt-get install autoconf automake libtool
问题2:
错误: inlined from ‘main’ at ts_calibrate.c:229:11:
/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
make[2]: *** [ts_calibrate.o] 错误 1
make[2]:正在离开目录 `/home/kongdepeng/work/QTE_DSF/tslib/tests'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/home/kongdepeng/work/QTE_DSF/tslib'
make: *** [all] 错误 2
解决办法:
gcc 新版本编译器对语法检查严格,在源文件 ./tests/ts_calibrate.c 中
// 源文件
// if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {
// cal_fd = open (calfile, O_CREAT | O_RDWR);
// } else {
// cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR);
// }
// 需要更改成如下形式
if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {
cal_fd = open (calfile, O_CREAT | O_RDWR, 0777);
} else {
cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR, 0777);
问题3:
./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: Error 40
./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: No such file or directory
解决方法:
#echo $LD_LIBRARY_PATH // 查看lib路径
#export LD_LIBRARY_PATH=$TSLIB_ROOT/lib
问题4:
ts_open: No such file or directory
解决方法:
#export TSLIB_TSDEVICE=/dev/input/event0 // 触摸屏设备路径
问题5:
Couldnt open tslib config file: No such file or directory
ts_config: Illegal seek
解决方法:
#export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
问题6:
Couldnt load module pthres No raw modules loaded.
ts_config: Success
解决方法:
#export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
问题7:
No raw modules loaded.
ts_config: No such file or directory
解决方法:
修改$TSLIB_ROOT/etc/ts.conf,至少放开一个module_raw,打开tslib-1.4/etc/ts.conf文件,
去掉其中一个modules_raw前面的#符号,并删除空格即可并去掉前面空格
问题8:
framebuf cannot connect
需要打开framebuf
就是在grub.conf启动列表的kernel最后添加vga参数
如 kernel /bzImage vga=789 root=/dev/ram rw splash=silent quiet
色彩 640x400 640x480 800x600 1024x768 1280x1024 1600x1200
4bits ? ? 0x302 ? ? ?
8bits 0x300 0x301 0x303 0x305 0x307 0x31C
15bits ? 0x310 0x313 0x316 0x319 0x31D
16bits ? 0x311 0x314 0x317 0x31A 0x31E
24bits ? 0x312 0x315 0x318 0x31B 0x31F
32bits ? ? ? ? ? ?
问题9:elected device is not a touchscreen I understand
查看源码后,将input_raw.c的代码替换为pm6000(触摸屏控制器名)的代码。
http://www.pudn.com/downloads50/sourcecode/embed/detail170685.html
http://people.linux.org.tw/~fred/drivers/pm6000_tslib.tgz
或者编译后,将ts-config中的pm6000打开。
需要了解的可以看readme
问题10:如何得知你的触摸屏设备节点
cat /proc/bus/input/devices
看看哪个是你的 ts 设备。正确设置你的event.
问题11:kernel正确的触摸屏驱动,测试并确认/dev/input中的输入设备,假设测试event1设备文件是否为触摸屏设备文件:
cat /dev/input/mice | hexdump 触控触摸屏将有数据在终端输出,如下解析了,如何进行测试。不是所有的设备都是一样的节点,这个可以自己进行测试。
/dev/input/mouse4 是我的 。
问题12:由网友测试触摸屏不准确的问题如下:
-------------------------------------------------------------------------------------------------------------
现象:点击触摸屏有反映,但是触点与鼠标图标之间总是有距离,而且距离随着触控操作变化: 如,点击屏角,使触控点和鼠标位置很接近,
随后的触控操作能保持这种近距离, 但随着后继触控操作距离会变化.
问题分析:触摸屏有反映说明tslib有触控事件送往QWSTslibMouseHandler,怀疑只是送往QWSTslibMouseHandler的坐标信息未矫正
=> 直接运行tslib的配套工具 ts_calibrate, 并用ts_test验证,坐标校验成功,但是Qt应用程序仍然存在触点偏移。
=> google 类似问题,多为校验问题,有些文章提到QWS_MOUSE_PROTO显示指定鼠标事件来源,结合以上总结,怀疑是否使Qt默认没有使用正确的鼠标事件. Qt for Embedded Linux Pointer Handling 证明了这点: Note that Qt for Embedded Linux does not support auto-detection of touch panels in which case the driver must be specified explicitly to determine which device to use.
=> QWS_MOUSE_PROTO
Specifies the driver for pointer handling. For example, if the current shell is bash, ksh, zsh or sh:
export QWS_MOUSE_PROTO=<driver>[:<driver specific options>]
<driver> areMouseMan,IntelliMouse,Microsoft,VR41xx,LinuxTP,Yopy,Tslib
andkeys identifying custom drivers. (即此参数同对应QMouseDriverFactory或QMouseDriverPlugin的keys()返回的字符串)
<driver specific options> are typically a device, e.g.,/dev/mouse for mouse devices and/dev/ts for touch panels. 确认设备的方法: 如,测试/dev/input/mice 是否是输入设备: cat /dev/input/mice | hexdump, 测试移动鼠标应该有数据输出
Multiple mouse drivers can be specified in one go:
export QWS_MOUSE_PROTO="<driver>[:<driver specific options>] <driver>[:<driver specific options>] <driver>[:<driver specific options>]"
=> 使用cat发现目标设备的触摸屏设备文件为/etc/input/event1, 所以设置export QWS_MOUSE_PROTO=tslib:/etc/input/event1, 累计偏移故障消失
=> 为同时使用USB鼠标,用cat发现/etc/input/mice为USB鼠标输入,所以设置:export QWS_MOUSE_PROTO="tslib:/etc/input/event1 interlliMouse:/etc/input/mice". 此时USB鼠标可用,但是触摸屏鼠标又出现累计偏差,怀疑和mice (mouse的复数)有关,是否mice是一个叠加输入?
应该有单独输入的设备文件.
=> 用cat测试/dev/input下的设备文件,发现USB鼠标的输入文件还有/dev/input/mouse1, 反过来触控触摸屏/dev/input/mice也有输出,但是比较event1与mice的数据发现不同
=> QWS_MOUSE_PROTO中针对USB鼠标和触摸屏分别使用各自独立的设备文件export QWS_MOUSE_PROTO="tslib:/etc/input/event1 interlliMouse:/etc/input/mouse1", 问题解决.
=> 结论: mice是所有鼠标设备的设备文件(USB/PS2鼠标 或 触摸屏鼠标等), 其可能源自mouse1,event1, 并且其数据做了处理, mice作为默认鼠标设备文件优先使用, 而tslib需要的是提供原生触摸屏数据的event1,导致触摸屏定位总有偏差
重启开发板,在 /usr/local/tslib/bin 目录下,输入./ts_calibrate,出现tslib的触摸屏五点校准画面,至此,tslib的安装移植成功完成。
关于qt4.8.4的移植,在下一篇中说明。