触摸屏校正总结.docx

上传人:b****4 文档编号:4167362 上传时间:2022-11-28 格式:DOCX 页数:8 大小:40.95KB
下载 相关 举报
触摸屏校正总结.docx_第1页
第1页 / 共8页
触摸屏校正总结.docx_第2页
第2页 / 共8页
触摸屏校正总结.docx_第3页
第3页 / 共8页
触摸屏校正总结.docx_第4页
第4页 / 共8页
触摸屏校正总结.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

触摸屏校正总结.docx

《触摸屏校正总结.docx》由会员分享,可在线阅读,更多相关《触摸屏校正总结.docx(8页珍藏版)》请在冰豆网上搜索。

触摸屏校正总结.docx

触摸屏校正总结

移植所遇到的问题分析与总结(elephant半原创)

一:

移植环境

1:

主机环境:

RetHatEnterprise5

2:

交叉工具链:

开发平台:

友善之臂mini2440+统宝寸屏

4:

所需的软件资源:

(QT的移植是参考网上找到一篇较好的移植手册,但是此手册的作者不知道是无心之失还是咋的,给的资料有所保留。

不过思路比较清晰以及解析的比较详细,还是非常值得参考的)

参照的文章链接地址为:

二:

交叉编译

在移植好触摸屏的驱动后(在移植内核的时候完成),一般都要移植一个tslib来配合,在用户层对触摸屏的数据进行滤波和矫正,同时也可以给应用程序一个统一的接口,很多GUI都支持tslib的接口。

我移植到开发板的QT版本是QT4,所以用进行触摸屏校正,因为QT4只是支持(目前最新版),QT2支持的是版本,所以在移植过程中先要看清楚自己移植的是什么版本。

简单描述tslib校正触摸屏原理:

Tslib是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。

通过tslib/src/文件可以看出,在tslib中为应用层提供了2个主要的接口ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()为正常情况下的接口,ts_read_raw()为校准情况下使用的接口。

从tslib默认的文件中可以看出包括如下基本插件:

(强烈建议通读这个配置文件并理解这个文件所写的内容)

  pthres为Tslib提供的触摸屏灵敏度门槛插件;

  variance为Tslib提供的触摸屏滤波算法插件;

  dejitter为Tslib提供的触摸屏去噪算法插件;

  linear为Tslib提供的触摸屏坐标变换插件。

tslib从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下:

  rawdevice-->variance-->dejitter-->linear-->application

   module        module      module     module

再来看看ts_calibrate主要做了哪些事情,校准情况下,tslib对驱动采样到的数据进行处理的一般过程如下:

  1。

读取屏上5个点的坐标(TopLeft,TopRight,BottomLeft,BottomRight,Center),在进行一系列的变换,取样的5个点,实际上是包含3个不同的X值,3个不同的Y值。

和scaling值一共7个值,一起保存到/etc/pointercal中.(触摸屏校准文件)

  2.这个/etc/pointercal文件主要是供linear插件使用。

而我们每次的触摸的操作都进行多次触摸坐标变换。

至此已经找到解决问题的大体的方法了。

在校准触摸屏后只需及时的让linear插件再次读取新的/etc/pointeracal文件,这样新校准的坐标信息就及时的更新到上层应用。

下面就要考虑具体实现的问题了。

1。

从文件可以看出在该模块初始化时读取了/etc/pointercal文件。

只要在linear_read()中读取新的/etc/pointercal文件即可。

2。

校准后保存了一个新的pointercal文件,但ts_lib怎么知道当前的pointercal文件是应该读取的新文件。

刚开始的时候我们在的linear_read()函数中采取计数轮询的方式查看/etc/poinercal文件的最后更新时间,如果当前的更新时间大于上次更新时间,就去读取下pointercal文件。

我们暂且不说在一台刚下流水线的机器,它的rtc时间是不确定,再进行时间比较时会出现错误。

另外始终的轮询的方式和ts_lib的采样间隔时间值很小。

这样用户在进行触摸屏常按操作时,会非常明显的消耗系统资源。

3。

此时想到的办法就是进程通信,ts_lib是个动态库运行于系统中,他存在系统中不是以进程方式,但可以采取折衷方法,将调用ts_lib的进程号(实际上就是X的进程号)保存到一个配置文件中。

这样在使用ts_calibrate校准触摸屏后,利用信号的方式给ts_lib发送用户自定义信号,ts_lib的中加一个简单的信号处理函数。

在接受到信号后就去读取下新的pointercal文件。

正常情况下不做任何的轮询和读取操作。

从上说的3个步骤中完全解决了校准后应用端触摸及时生效的问题。

还有个次要问题就是如何锁屏这需要从内核入手了,查看内核/drivers/input/从该驱动提供的ioctl中看到对基于evdev的输入设备都提供EVIOCGRAB实现。

顾名思义,grab就是将当前的输入操作抓取到当前的操作中,让当前操作之外的所有应用端读不到触摸屏的触摸操作。

由驱动源码就很容易知道该如何实现锁屏解锁操作了。

源码如下:

tructtsdev*ts;

char*tsdevice="/dev/input/event0";

ts=ts_open(tsdevice,0);

intts_tmpfd=ts_fd(ts);

if(ts_tmpfd==-1)

{

   perror("ts_open");

   exit

(1);

}

unsignedlongval=1;

intioctl_ret=ioctl(ts_tmpfd,EVIOCGRAB,&val);

printf("nowlockthetsioctlretis:

%d\n",ioctl_ret);

if(ioctl_ret!

=0)

{

   printf("Error:

%s\n",strerror(errno));

   exit

(1);

}

printf("lockthetssuccess\n");

 

现在开始交叉编译tslib,在开始编译前需要确定自己的开发环境是否安装了autoconf、automake和libtool等软件包。

之前我的虚拟机并不是完全安装,在编译过程中出现很多问题,在这里我建议大家虚拟机完全安装。

不过如果确实不想重装系统的话,也可以手动安装,之前我自己就是手动安装的,虽然成功安装了tslib软件,但是在后续的QT移植过程中出现很多不可预知的错误,因此还是建议大家的虚拟机是完全安装的。

可以利用命令查看自己虚拟机上的autoconf版本:

autoconf–V

在开始编译tslib前还有一个问题需要特别注意:

就是要确定在编译时所用的工具是交叉工具链而不是PC平台下的GCC工具,因为我要运行的平台是嵌入式ARM架构而不是PC的X86架构。

关于这一点,在网上找到很多资料都没有说明,几经寻找之下,终于在CSDN博客上看到网友yihui8的文章,对这一点作了说明。

(还是网友yihui8厚道)。

网友yihui8博客地址(详细解析交叉编译):

第一步:

解压源码包:

tarxvzftslib

第二步:

进入tslib之后关键是要设置交叉编译环境(下面是根据我自己的实际情况所添加的)——如果不设置交叉编译环境,在移植到开发板时,执行./ts_calibrate程序时会出现以下错误:

./ts_calibrate:

line1:

syntaxerror:

”(”unexpected.

$exportPATH=$PATH:

/usr/local/arm/CC=arm-linux-gcc

$exportCXX=arm-linux-g++

设置好交叉编译环境后就可以开始安装了:

执行./

执行./之后可能会有上述信息出现,但是我的机器上灰常不给力,只是显示出其中几行信息,一开始以为是出错,但是最后还是移植成功,证明这步就算只出现几行信息并无多大关系。

接着执行以下命令:

./configure--prefix=/usr/local/tslib/--host=arm-linuxac_cv_func_malloc_0_nonnull=yes

(1)有些开发板在执行此命令时需要添加—enableinputapi=no或者—enableinput=no,至于是哪一个就需要根据tslib目录下的configure文件才可以知道。

(建议这个文件还是看一下)。

由于友善之臂mini2440的触摸屏驱动是支持ioctl操作的(在内核移植时做触摸屏驱动时可以看到源码中是支持ioctl的),因此我在这里并没有加上—enableinputapi=no.

(2)如果没有加上ac_cv_func_malloc_0_nonnull=yes会出现交叉编译错误:

undefinedreferenceto`rpl_malloc'.这是由ac_cv_func_malloc_0_nonnull检查引起的,为了不让它检查,产生一个cache文件,欺骗configure再执行:

因此为了编译的顺利进行,在配置的时候需要加上这一句:

ac_cv_func_malloc_0_nonnull=yes

最后执行make&makeinstall就可以在指定的路径上成功安装tslib。

我的指定路径是/usr/local/tslib/,在这个文件下安装成功的话会有四个目录:

lib/etc/include/bin/.

安装好tslib之后将动态链接库文件拷贝到根文件系统中,(注意tslib依赖的是动态链接库文件),如果忘记拷贝动态链接库的话会出现以下错误:

拷贝进去之后需要在自己的根文件系统的/etc/profile(在文件的一开始添加下面的内容)设置tslib的环境变量(要根据自己的实际情况来设置),下面是我的开发板所设置的有关tslib的环境变量:

# Ashprofile

#vimsyntax=sh

#Nocorefilesbydefault

echo"SetENVfortslib......"

export QTDIR=/usr/local/Trolltech/文件系统中QT的安装目录)

exportTSLIB_ROOT=/usr/local/tslib(tslib的目录)

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/input/event0

export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/tsexport TSLIB_CONFFILE=$TSLIB_ROOT/etc/export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal

exportPOINTERCAL_FILE=$TSLIB_ROOT/etc/pointercal

exportQWS_DISPLAY=LinuxFb:

dev/fb0

exportsetQWS_SIZE=320x240

export QWS_MOUSE_PROTO=Tslib:

/dev/input/event0

export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:

$QTDIR/lib:

/usr/local/lib:

$LD_LIBRARY_PATH

echo“theenvissuccessful”

当配置好这些环境变量后下载到开发板,执行./ts_calibrate时如果出现:

ts_open:

Nosuchfileordirectory

说明环境变量设置有问题,可以用env命令查看一下有没有你刚才设置的环境变量。

在设置环境变量这一个环节上是比较重要的,要保证在每一个目录下都存在你需要用到的文件。

补充:

tslib环境变量配置说明:

在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。

Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。

在Qtopia4.*版本中,默认的Tslib版本为Tslib。

在Qtopia2.*版本中,默认的Tslib版本为Tslib。

在嵌入式中,由于触摸屏的种类多样、质量不一,采用Tslib的参考配置往往无法获得较好的触摸屏触摸效果,同样需要经过大量的测试才能得到满意的配置参数,恶劣情况下,甚至需要对Tslib的算法进行进一步的优化。

下面就Tslib的环境变量、配置文件等进行简要的介绍。

1)环境变量

2)为了实现Tslib的正确运行,需要对如下的Tslib的环境变量进行配置:

TSLIB_TSDEVICEts_calibrate或./ts_test)可能出现的错误:

1:

运行./ts_test

Norawmodulesloaded.

ts_config:

Nosuchfileordirectory

出现这样的错误提示,可以很明确的告诉你,你的库缺少了一些*.so文件()

文件中应该有一行(在配置文件上有很多的raw,但是全部是被注释掉的,但是至少需要打开一个。

因为触摸屏是使用input子系统的,所以将module_rawinput前面的#号去掉,并且前面不留空格,千万别留空格啊,有一个网友就是因为这个小小的空格搞到他郁闷了很久,幸好我比他醒目,绝不留空格,哈哈。

module_rawinput

/nand1/lib/ts目录下应该有个文件叫

(这个文件比较重要,我第二次移植过程中不小心把input裁剪掉了,当插件库$TSLIB_ROOT/lib/ts目录下没有这个文件时会提示如下错误)

Norawmodulesloaded.

ts_config:

Nosuchfileordirectory

2:

在做测试的时候,运行./ts_calibrate出现了经典的错误:

(出现这个错误你不要沮丧,反而应该高兴,说明你之前的步骤已经全部没错了,只要把这个经典的错误解决就万事大吉了。

很庆幸,这个错误有很多网友都已经有办法解决了)

经典错误:

Couldntloadmoduleinput

Norawmodulesloaded

tsconfig:

Success

错误分析:

那么错误就定位在ts_config里。

并且可以进一步确定是在加载插件模块时出的错。

阅读了tslib的源代码,知道了cstdlib库里的一个函数:

getenv

是用来得到指定系统环境变量的值。

是为了测试tslib是否得到正确的环境变量。

其环境变量默认的值在readme中有注明。

加载插件模块时出出错分析:

ts_calibrate会打开ts_config

ts_config函数里首先会读取tslib配置文件(,由TSLIB_CONFFILE环境变量指定,在tslib/etc下面),

然后根据这个文件逐个加载插件库,版本的内容为:

Module_rawinput(读readme文件可以找到这个字符串)

modulepthrespmin=1

modulevariancedelta=30

moduledejtterdelta=100

modulelinear

ts_config又会调用ts_load_module加载库。

从这个函数里,程序先是得到配置文件中指定加载的模块名,

然后根据模块名构造了一个so文件文件名,然后调用了系统函数dlopen加载库!

Linux下的加载dlopen类似于Windows下动态链接库的函数:

dlopen

错误就应该出在构造的库文件名是错误的---其指定的文件不存在

---从而导致dlopen无法加载。

所以才提示找不到文件或目录!

那么这样就是应该把需要的应该复制到/tslib/plugins中(上面修正后作了这一步,就可以拉,就不会出现错误拉)

3:

[~#]./

此时会加载tslib中的插件模块,且会抛出Segementfault的错误。

仔细分析tslib的源码之后,得知在加载

时,中__ts_attach_raw()函数中使用NULL指针,导致Segementfault产生。

经过修改过,重新

编译tslib,再运行,一切正常。

中__ts_attach_raw()中的修改如下:

#if0

 for(next=ts->list,prev=next;next!

=NULL&&next!

=prev_list;next=prev->next,prev=

next)

 {

  DEBUG("LIUHAO:

:

%s%s:

count=%dprev_list=%xprev=%xnext=%xprev->next=%x\n",

__FILE__,__FUNCTION__,count++,prev_list,prev,next,prev->next);

  ;

 }

#else

 for(next=ts->list,prev=next;next!

=NULL&&next!

=prev_list;)

 {

  DEBUG("LIUHAO:

:

%s%s:

count=%dprev_list=%xprev=%xnext=%xprev->next=%x\n",

__FILE__,__FUNCTION__,count++,prev_list,prev,next,prev->next);

  next=prev->next;

  if(next==NULL)

   break;

  else

   prev=next;

 }

#endif

至此,tslib所有工作已经完成,ts_calibrate会在~/ts-release/etc/目录下生成pointercal文件。

pointercal为触摸屏校准后生成的文件,确保QT运行时,触摸屏工作正常。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1