触摸屏校正总结_第1页
触摸屏校正总结_第2页
触摸屏校正总结_第3页
触摸屏校正总结_第4页
触摸屏校正总结_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、移植 tslib-1.4 所遇到的问题分析与总结(elephant 半原创 )一:移植环境1 :主机环境: Ret Hat Enterprise 52 : 交叉工具链: arm-linux-gcc-4.3.23:开发平台:友善之臂 mini2440+统宝3.5寸屏4:所需的软件资源:tslib-1.4.tar.gz qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-opensource-src-4.5.3.tar.gz ( QT 的移植是参考网上找到一篇较好的移植手册,但是此手册的作者不知道是无心之失还是咋的,给的资料有所保留。不过思路比较清晰以及解

2、析的比较详细,还是非常值得参考的)参照的文章链接地址为:二:交叉编译tslib-1.4在移植好触摸屏的驱动后( 在移植内核的时候完成) ,一般都要移植一个tslib 来配合,在用户层对触摸屏的数据进行 滤波和矫正 ,同时也可以给应用程序一个统一的接口,很多GUI 都支持 tslib 的接口。我移植到开发板的 QT 版本是 QT4 ,所以用 tslib-1.4 进行触摸屏校正,因为QT4 只是支持 tslib-1.4 (目前最新版) , QT2 支持的是 tslib-1.3 版本,所以在移植过程中先要看清楚自己移植的是什么版本。简单描述tslib 校正触摸屏原理:Tslib 是触摸屏驱动和应用层

3、之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、 坐标变换 等操作, 来去除噪声并将原始的设备坐标转换为相应的屏幕坐标 。通过 tslib/src/tslib.h 文件可以看出,在tslib 中为应用层提供了 2 个主要的接口ts_open(),ts_close();ts_read()和 ts_read_raw() ,其中 ts_read() 为正常情况下的接口, ts_read_raw() 为校准情况下使用的接口。从tslib 默认的 ts.conf 文件中可以看出包括如下基本插件: (强烈建议通读这个配置文件并理解这个文件所写的内容)pthres 为 Tsli

4、b 提供的触摸屏灵敏度门槛 插件;variance 为 Tslib 提供的触摸屏滤波算法 插件;dejitter 为 Tslib 提供的触摸屏去噪算法 插件;linear 为 Tslib 提供的触摸屏坐标变换 插件。tslib 从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下:raw device -> variance -> dejitter -> linear -> applicationmodulemodule module module再来看看 ts_calibrate 主要做了哪些事情,校准情况下, tslib 对驱动采样到的数据进行处理的一般

5、过程如下:1 。读取屏上5 个点的坐标(Top Left,Top Right,Bottom Left,Bottom Right,Center) ,在进行一系列的变换, 取样的 5 个点,实际上是包含 3 个不同的 X 值, 3 个不同的 Y 值。和 scaling值一共 7 个值,一起保存到 /etc/pointercal中 . (触摸屏校准文件)2 . 这个 /etc/pointercal 文件主要是供 linear 插件使用。而我们每次的触摸的操作都进行多 次触摸坐标变换。至此已经找到解决问题的大体的方法了。在校准触摸屏后只需及时的让linear 插件再次读取新的 /etc/pointer

6、acal 文件,这样新校准的坐标信息就及时的更新到上层应用。下面就要考虑具体实现的问题了。1 。 从 linear .c 文 件 可 以 看 出 在 该 模 块 初 始 化 时 读 取 了 /etc/pointercal 文 件 。 只 要 在 linear_read() 中读取新的 /etc/pointercal 文件即可。2 。校准后保存了一个新的 pointercal 文件, 但 ts_lib 怎么知道当前的 pointercal 文件是应该读取的新文件 。刚开始的时候我们在linear .c 的 linear_read() 函数中采取计数轮询的方式查看/etc/poinercal 文件

7、的最后更新时间,如果当前的更新时间大于上次更新时间,就去读取下pointercal 文件。我们暂且不说在一台刚下流水线的机器,它的 rtc 时间是不确定,再进行时间比较时会出现错误。另外始终的轮询的方式和 ts_lib 的采样间隔时间值很小。这样用户在进行触摸屏常按操作时,会非常明显的消耗系统资源。3 。此时想到的办法就是进程通信, ts_lib 是个 动态库运 行于系统中,他存在系统中不是以进程方式,但可以采取折衷方法,将调用 ts_lib 的进程号(实际上就是X 的进程号)保存到一个配置文件中。这样在使用 ts_calibrate 校准触摸屏后,利用信号的方式给ts_lib 发送用户自定义

8、信号, ts_lib 的 lineral.c 中加一个简单的信号处理函数。在接受到信号后就去读取下新的pointercal 文件。正常情况下不做任何的轮询和读取操作。从上说的 3 个步骤中 完全解决了校准后应用端触摸及时生效的问题 。还有个次要问题就是如何锁屏?这需要从内核入手了,查看linux2.6 内核 /drivers/input/evdev.c 从该驱动提供的ioctl 中看到对基于evdev 的输入设备都提供 EVIOCGRAB 实现。顾名思义, grab 就是将当前的输入操作抓取到当前的操作中,让当前操作之外的所有应用端读不到触摸屏的触摸操作。由驱动源码就很容易知道该如何实现锁屏解

9、锁操作了。源码如下:truct tsdev *ts;char *tsdevice = "/dev/input/event0"ts = ts_open(tsdevice, 0);int ts_tmpfd = ts_fd(ts);if (ts_tmpfd= -1)perror("ts_open");exit(1);unsigned long val =1;int ioctl_ret=ioctl(ts_tmpfd,EVIOCGRAB,&val);printf("now lock the ts ioctl ret is:%dn",io

10、ctl_ret);if (ioctl_ret!=0)printf("Error: %sn", strerror(errno);exit(1);printf("lock the ts success n");现在开始交叉编译tslib ,在开始编译前需要确定自己的开发环境是否安装了 autoconfautomake 和 libtool 等软件包。之前我的虚拟机并不是完全安装,在编译过程中出现很多问题,在这里我建议大家虚拟机完全安装。不过如果确实不想重装系统的话,也可以手动安装,之前我自己就是手动安装的,虽然成功安装了 tslib 软件,但是在后续的 QT

11、移植过程中出现很多不可预知的错误,因此还是建议大家的虚拟机是完全安装的。可以利用命令查看自己虚拟机上的autoconf 版本:autoconf V在开始编译tslib 前还有一个问题需要特别注意:就是要确定在编译时所用的工具是交叉工具链而不是PC平台下的GCC工具,因为我要运行的平台是嵌入式ARM架构而不是PC的X86架构。关于这一点,在网上找到很多资料都没有说明,几经寻找之下,终于在CSDN博客上看到网友yihui8 的文章,对这一点作了说明。(还是网友yihui8 厚道)。网友 yihui8 博客地址(详细解析tslib-1.4 交叉编译): 第一步:解压源码包:tar xvzf tsli

12、b-1.4.tar.gz cd tslib第二步:进入 tslib 之后关键是要设置交叉编译环境(下面是根据我自己的实际情况所添加的) 如果不设置交叉编译环境,在移植到开发板时,执行./ts_calibrate 程序时会出现以下错误:./ts_calibrate: line 1: syntax error :” ( ” unexpected.$export PATH=$PATH:/usr/local/arm/4.3.2/bin$export CC=arm-linux-gcc$export CXX=arm-linux-g+设置好交叉编译环境后就可以开始安装了:执行 ./autogen.shdai

13、q®daiq_desk top: ZmoikZcvs/apps/ts 1 ib$ > /autogenB shLibtoolize. libtoolize: putting auxiliary files in.'.libtoolize; copying file . /Itmaia* shJlibtq口Li工e; You should add he contents £ the fuLlowHg files tc aclpcal.n4 : libtoolise: /usr/shar&/aclocal/libtool.>4J libtooliEe

14、: /nsr/share/aclocal/ltop+ions- >4' libtcolise: /usr/share:/acloc al/ltversion.航4'lLbt4olis«:肛?/aGLQGal/ltAugar.皿4libtoolize: /usr/share/aclocal/ltobsolete.libtcolize; Ccnsidex adding AC_CONFIG_MACRO_DIRCn4)J to configuxe.ac and Ixbtoolize: reiunning. libtoolizej to keep the correct

15、libtool macr os in-tree, libtoolize; ConsideT adding _I to ACLOCAL_AMFLGS in Makefile, am.Dine.Aclocal., Dene.Autoheadezr. . . D one.Autamake.configure, as:21: installing */canfig. guess'Configure, ac:21: install/ config, subJcanfi£ure- ac: 7 : installing , /in£tall-sli,c(?nf ijuxe, ac

16、: 7: installing . /missing p Lua ins/Mak efile, am: instailing '. /depcompDone.Auto conf. . Dons,Now you can do . /confiuie, make, make install-执行./autogen.sh之后可能会有上述信息出现,但是我的机器上灰常不给力,只是显示出其 中几行信息,一开始以为是出错,但是最后还是移植成功,证明这步就算只出现几行信息 并无多大关系。接着执行以下命令:./configure -prefix=/usr/local/tslib/ -host=arm-l

17、inux ac_cv_func_malloc_0_nonnull=yes 有些开发板在执行此命令时需要添加一enable inputapi=no或者一enable input=no,至于是哪一个就需要根据tslib目录下的configure文件才可以知道。(建议这个文件还是看一下)。 由于友善之臂 mini2440的触摸屏驱动是支持ioctl操作的(在内核移植时做触摸屏驱动时可 以看到源码中是支持ioctl的),因此我在这里并没有加上一enable inputapi=no.(2)如果没有加上 ac_cv_func_malloc_0_nonnull=yes 会 出现交叉编译错误:undefine

18、d reference to 'rpl_malloc'.这是由 ac_cv_func_ma110c_0_nonnull检查弓I起的, 为了不让它检查,产生一个cache文件daiq_tslib . cache,欺骗configure 再执行:因此为了编译的顺利进行,在配置的时 候需要力口上这一句:ac_cv_func_ma110c_0_nonnull=yes最后执行make & make instal l就可以在指定的路径上成功安装tslib。我的指定路径是/usr/local/tslib/,在这个文件下安装成功的话会有四个目录:lib/ etc/ include/ b

19、in/ .安装好tslib之后将动态链接库文件拷贝到根文件系统中,(注意 tslib依赖的是动态链接库 文件),如果忘记拷贝动态链接库的话会出现以下错误:error wAile loadable shared Libriric.3: LiAiL曲匕瓯mt occn shized objisct filesmuch (工Jx sr dlirectomy拷贝进去之后需要在自己的根文件系统的/etc/profile(在文件的一开始添加下面的内容)设置tslib的环境变量(要根据自己的实际情况来设置),下面是我的开发板所设置的有关tslib的环境变量:# Ash profile#vim syntax=

20、sh#No core files by defaultecho "Set ENV for tslib "export QTDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm(文件系统中QT的安装目录)export TSLIB_ROOT=/usr/local/tslib(tslib 的目录)export TSLIB_CONSOLEDEV=CEneexport TSLIB_FBDEVICE/dev/fb0export TSLIB_TSDEVIC=/ dev/input/ event。exportTSLIB_PLUGINDI=$TSLIB_

21、ROOTb /tsexportTSLIB_CONFFILETSLIB_ROO!etc/ts . confexportTSLIB_CALIBFILE=$TSLIB_ROOTetc / pointercalexport POINTERCAL_FILE=$TSLIB_ROOT/etc/pointercalexport QWS_DISPLAY=LinuxFb:dev/fb0export set QWS_SIZE=320x240export QWS_MOUSE_PROTO :/ dev/input/ eventOexportLD_LIBRARY_PATHTSLIB_ROOHb:$QTDIR/lib:/u

22、sr/local/lib:$LD_LIBRARY_PATHecho “the env is successful ”当配置好这些环境变量后下载到开发板,执行./ts_calibrate时如果出现:ts_open: No such directory说明环境变量设置有问题,可以用env命令查看一下有没有你刚才设置的环境变量。在设置环境变量这一个环节上是比较重要的,要保证在每一个目录下都存在你需要用到的文件。补充:tslib环境变量配置说明:在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电 磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。Tslib是一个开源的程序,能够为触

23、摸屏驱动获得的采样提供诸如滤波、去 抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个 统一的接口。在 Qtopia 4.* 版本中,默认的Tslib版本为Tslib 1.4 。在 Qtopia 2.*版本中,默认的Tslib 版本为Tslib 1.3 。在嵌入式中,由于触摸屏的种类多样、质量不一,采用 Tslib的参考配置往 往无法获得较好的触摸屏触摸效果,同样需要经过大量的测试才能得到满意 的配置参数,恶劣情况下,甚至需要对 Tslib的算法进行进一步的优化。下 面就Tslib的环境变量、配置文件等进行简要的介绍。1) 环境变量为了实现Tslib的正确运行,需要对如下的 T

24、slib的环境变量进行配置:2) TSLIB_TSDEVICE /触摸屏设备文件名Default (no inputapi): /dev/touchscreen/ucb1x00Default (inputapi): /dev/input/event0TSLIB_CALIB校准的数据文件,由ts_calibrate校准程序生成Default: $sysconfdir/pointercalTSLIB_CON配置文件名Default: $sysconfdir/ts.confTSLIB_PLUGINDIR /插件目录Default: $datadir/pluginsTSLIB_CONSOLEDEVIC

25、E/制台设备文件名Default: /dev/ttyTSLIB_FBDEVICE /FrameBuffer 设备名Default: /dev/fb03) 以上环境变量在实际开发中的实际配置可以根据实际情况决定。4) 2)配置文件除了环境变量以外,Tslib的配置文件ts.conf同样是个十分重要的部 分,在ts.conf中配置了需要加载的插件、插件加载顺序以及插件的一 些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。下面是Tslib 1.4 中的ts.conf 的参考配置:5) # Uncomment if you wish to use the linux input laye

26、r eventinterface# module raw input# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d# module_raw collie# Uncommentif you're using a Sharp Zaurus SL-C700/C750/C760/C860# module_raw corgi# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface# module raw ucb1x00

27、# Uncomment if you're using an HP iPaq h3600 or similar# module_raw h3600# Uncomment if you're using a Hitachi Webpad# module_raw mk712# Uncomment if you're using an IBM Arctic II# module raw arctic2module pthres pmin=1module variance delta=30module dejitter delta=100 module linear6) 其中p

28、thres为Tslib提供的触摸屏灵敏度门槛插件;variance 为 Tslib提供的触摸屏滤波算法插件;dejitter 为Tslib提供的触摸屏去噪 算法插件;linear为Tslib提供的触摸屏坐标变换插件。7) tslib的实际配置:8) 去掉module_raw input 前面的#号,同时把其他#号注释项全部删 除,以免给后来的操作带来麻烦。我的最终 ts.conf内容为:module_raw input module pthres pmin=1 module variance delta=30 module dejitter delta=100 module linear在执行

29、校正程序时(如./ts_calibrate 或./ts_test )可能出现的错误:1 :运行./ts_testNo raw modules loaded.ts_config: No such directory出现这样的错误提示,可以很明确的告诉你,你的库缺少了一些*.so文件()ts.conf文件中应该有一行(在配置文件上有很多的raw ,但是全部是被注释掉的,但是至少需要打开一个。因为触摸屏是使用input子系统的,所以将 module_raw input前面的#号去掉,并且前面不留空格,千万别留空格啊,有一个网友就是因为这个小小的空格搞到他郁闷了很久,幸好我比他醒目,绝不留 空格,哈哈

30、。)module_raw input/nand1/tslib-1.4/lib/ts目录下应该有个文件叫input.so(这个文件比较重要,我第二次移植过程中不小心把input裁剪掉了,当插件库$TSLIB_ROOT/lib/ts目录下没有这个文件时会提示如下错误)No raw modules loaded.ts_config: No such directory2:在做测试的时候,运行./ts_calibrate 出现了 tslib-1.4 经典的错误:(出现这个错误你不要沮丧,反 而应该高兴,说明你之前的步骤已经全部没错了,只要把这个经典的错误解决就万事大吉了。很庆幸,这个错误有很多网友都已

31、经有办法解决了)经典错误:Couldnt load module inputNo raw modules loadedtsconfig: Success错误分析:那么错误就定位在ts_config 里。并且可以进一步确定是在加载插件模块时出的错。阅读了 tslib 的源代码,知道了 cstdlib 库里的一个函数: getenv是用来得到指定系统环境变量的值。是为了测试tslib是否得到正确的环境变量。其环境变量默认的值在 readme中有注明。加载插件模块时出出错分析:ts_calibrate 会打开 ts_configts_config 函数里首先会读取 tslib 配置文件(ts.con

32、f ,由TSLIB_CONFFILE环境变量指定,在tslib/etc 下面),然后根据这个文件逐个加载插件库,1.4版本的ts.conf内容为:Module_raw input (读readme 文件可以找到这个字符串 )module pthres pmin=1module variance delta=30module dejtter delta=100module linearts_config 又会调用ts_load_module加载库。从这个函数里,程序先是得到配置文件中指定加载的模块名,然后根据模块名构造了一个so文件文件名,然后调用了系统函数dlopen加载库!Linux 下的加载dlopen 类似于 Windows 下动态链接库的函数:dlopen错误就应该出在构造的库文件名是错误的-其指定的文件不存在-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论