在前些日子调试的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尺寸的范围内。