bluefishhttp://blog.yesky.com/Blog/vincentzhou/复制地址
公告栏
专注wince底层开发,学习linux 为生活而奋斗!
控制面板
日历
<2007年10月>
SuMoTuWeThFrSa
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
留言簿(5)
文章分类
文章档案
日记档案
向强人学习

在前些日子调试的spi-touchp中遗留了一个问题:打开explorer之类的窗口,最右边的X按钮图标点不到。而左边和上下都是ok的。

上来先一顿瞎搞,没有搞定,又咨询了厂家的工程师,还是未果。后来在硬件工程师的帮助分析下,经过代码调试,找到了问题。右边的最小值范围太大了,如果从spi-data寄存器拿到的x值小于这个最小值的话,这次点击的x值就变成0了。

虽然不知道别的屏是不是这样,这个屏是以右下角为坐标原点的。而以前的想法是以左上角为坐标原点。

下面分析下这个屏的驱动中是得到返回给系统的点坐标值的。

大家当然都知道,当点击touchp时,从touchp拿到的值是不能直接给系统(应用程序)用的,要经过比对和平均(至少这里是这样的)才能给系统以及应用程序使用。当一次点击时,至少要取3个x和y值。在进行取x和y值之前要分别发送命令给touchp的controler,在这里是通过将相应的命令值放到spi-data寄存器中去。取到的3个值(以x为例),首先要分别做差值计算,并取差值最小的两个差值中的点相加再除以2。并且要保证那3个差值要在一个可允许得偏差之内。还是看代码来得明显:
diff0 = val0 - val1;
diff1 = val1 - val2;
diff2 = val2 - val0;
diff0 = diff0 > 0  ? diff0 : -diff0;
diff1 = diff1 > 0  ? diff1 : -diff1;
diff2 = diff2 > 0  ? diff2 : -diff2;

if (diff0 < diff1)
 *sample=(ULONG)(val0 + ((diff2 < diff0) ? val2 : val1));
else 
 *sample=(ULONG)(val2 + ((diff2 < diff1) ? val0 : val1)); 
*sample>>=1;
难道这就是传说中的差分法?

接下来就是看上面得到的这个值是否在规定的最大,最小值边界值之间,如果不是则取最大或者最小边界值(我的问题就是出现在这个最小边界值太大了)。最后就是根据lcd分辨率以及最大最小边界值来映射这一点到lcd中的某一个点处,也就是要发给系统处理的值。

总结,虽然这个问题没有什么太多值得讨论的地方,不过,通过这个问题可以发现:如果当touchp的尺寸大于lcd的尺寸的时候,可以通过增大(减小)最小(最大)边界值来将可触摸区的范围限制在lcd尺寸的范围内。


作者:bluefish 阅读() 评论()  编辑 发表于:2007-10-17 19:03
相关内容
文章评论

暂无人对此文章发表评论!

发表评论
标题 *  
姓名 *  
内容 *  
   验证码: *       
       
版权声明:天极是本Blog托管服务提供商。如本文牵涉版权问题,天极不承担相关责任,请版权拥有者直接与文章作者联系解决。
Powered by:

Copyright © bluefish