天嵌 ARM开发社区

 找回密码
 注册
查看: 9582|回复: 26

求tq210 android4.0 电阻屏的校准方法

[复制链接]
copyleft 发表于 2013-9-25 15:03:12 | 显示全部楼层 |阅读模式
本帖最后由 copyleft 于 2013-10-11 19:05 编辑

    由于最近需要,我将一款电阻屏弄到TQ210上,原来配的是7.0-inch的电容屏。现在准备工作基本上也做的差不多了。电阻屏能在android4.0上跑起来,桌面显示正常,少了“返回、菜单”等几个快捷键。但触摸屏工作却不正常。除了在整个屏的中间部分正确外,其它地方都是反的。上下是反的,左右也是反的,不知道怎么解决。
    我想得到的结果是:能否参内核中或启动过程是做好校准,等进入系统后,触摸屏工作正确。
    在内核文件中:tq210-ts.c 中有与触摸屏及校准相关的代码的,我用的是Linux下得到的a0~a6的值,但也不能解决这个问题。得到的结果还是是反的。
    各位大虾求解决。。。。

wbz073 发表于 2013-9-25 15:35:48 | 显示全部楼层
你把对应坐标反转过来,会出现啥情况
TQ-lkp 发表于 2013-9-25 16:23:33 | 显示全部楼层
先在linux系统中使用校准程序获取校验参数,再设置到系统的idc文件中
亚瑟王 发表于 2013-9-25 17:04:46 | 显示全部楼层
a0到a6这些数据是在Linux下用tslib校正后在/etc/pointercal文件中获取的。
 楼主| copyleft 发表于 2013-9-25 17:05:42 | 显示全部楼层
wbz073 发表于 2013-9-25 15:35
你把对应坐标反转过来,会出现啥情况

怎么反转。。。
 楼主| copyleft 发表于 2013-9-25 17:08:17 | 显示全部楼层
TQ-lkp 发表于 2013-9-25 16:23
先在linux系统中使用校准程序获取校验参数,再设置到系统的idc文件中

参数 a0 到 a6 都是从Linux中的TSLIB中得到的,只是不知道如何设置到系统 idc 文件中。。。。
还有就是:内核中的 tq210-ts.c 中的 a0 到 a6 的值对系统有什么影响??我修改了,感觉对TS没有一点影响。。
 楼主| copyleft 发表于 2013-9-25 17:11:12 | 显示全部楼层
亚瑟王 发表于 2013-9-25 17:04
a0到a6这些数据是在Linux下用tslib校正后在/etc/pointercal文件中获取的。

a0 到 a6 这7个参数,我已经从Linux 下的TSLIB中得到了,也在 tq210-ts.c 中增加了对新LCD支持,并修改这7个参数,但还是出现了这上下相反,左右相反的情况。。。
亚瑟王 发表于 2013-9-26 09:07:01 | 显示全部楼层
copyleft 发表于 2013-9-25 17:11
a0 到 a6 这7个参数,我已经从Linux 下的TSLIB中得到了,也在 tq210-ts.c 中增加了对新LCD支持,并修改这 ...

调整这个参数值的顺序吧。
做好了发个总结的帖子吧,方便其他人学习和开发,如何?
 楼主| copyleft 发表于 2013-9-26 10:44:00 | 显示全部楼层
亚瑟王 发表于 2013-9-26 09:07
调整这个参数值的顺序吧。
做好了发个总结的帖子吧,方便其他人学习和开发,如何?

一定会的
谢谢了
如果这个弄好,连带前面遇到一个背光问题也一起总结发一个帖吧。
 楼主| copyleft 发表于 2013-9-26 16:09:25 | 显示全部楼层
亚瑟王 发表于 2013-9-26 09:07
调整这个参数值的顺序吧。
做好了发个总结的帖子吧,方便其他人学习和开发,如何?

我这有一组串口输出的坐标:
计算前               计算后
165   220          684   74
867   226          100   78
872   665          96     319
152   623          694   295
502   439          404   195
其中 a0 到 a6 的值为:4504, 50, -2771024, -3, 6596, -5809416, 65536
根据这些数据,我将其计算前的坐标值代入到: Xts = (a0*Xlcd + a1*Ylcd + a2)/a6 中得到的结果与输出不同,我不知道是不是我对这些数据的处理方法不对,导致计算结果不同,还是其它什么原因。
我试着将公式中的 a2 与 a5 进行交换,Xlcd 与 Ylcd 的系数进行交换,得到的结果都不行。
请问能不能给一个比较详细一点的方法。
谢谢了
 楼主| copyleft 发表于 2013-9-26 17:51:03 | 显示全部楼层
亚瑟王 发表于 2013-9-26 09:07
调整这个参数值的顺序吧。
做好了发个总结的帖子吧,方便其他人学习和开发,如何?

只是左右是反的
在 tq210-ts.c 文件中用最大的x坐标值减去计算所得的x坐标值就可以使触摸点与响应点之间存在一些距离,而不是左右相反的情况,但我不知道x坐标值的最大值为多少,所以得到的现象相当于触摸点与响应点始终存在一些距离,不知道怎么解决。。
亚瑟王 发表于 2013-9-27 09:26:13 | 显示全部楼层
copyleft 发表于 2013-9-26 17:51
只是左右是反的
在 tq210-ts.c 文件中用最大的x坐标值减去计算所得的x坐标值就可以使触摸点与响应点之间 ...

触摸驱动给android上报的是坐标值,你在调试的时候分别打印出来看看,然后根据实际情况调整一下就可以了。
 楼主| copyleft 发表于 2013-9-27 11:20:02 | 显示全部楼层
亚瑟王 发表于 2013-9-27 09:26
触摸驱动给android上报的是坐标值,你在调试的时候分别打印出来看看,然后根据实际情况调整一下就可以了。 ...

现在基本上解决了。但还有一些小问题。
前面说的是:X坐标是反的,也就是左右是反的。当按在触摸屏的左边时,实际上在LCD上的右边进行了响应。所以可以看出:TS的X坐标与LCD的X坐标是刚好相反的。解决这个问题的方法就是:想办法将X坐标反过来,在 tq210-ts.c 文件中大约160行左右有代码:

  1. x = (long )ts->xp / (ts->count);
  2. y = (long )ts->yp / (ts->count);
复制代码
所以将以上代码修改如下:

  1. x = 1024 - (long )ts->xp / (ts->count);
  2. y = (long )ts->yp / (ts->count);
复制代码
我们采用的是10-bit ADC,所以我使用1024.编译下载运行发现:比之前的效果好些,但X坐标还是存在一点偏移。Y坐标出现向上偏移的情况,我试了下,在y坐标基础上增加一定的值会使Y坐标出现小范围内的上下相反的情况,离中心越远,偏离越大,影响操作,不知道这个问题怎么解决。
亚瑟王 发表于 2013-9-30 16:43:26 | 显示全部楼层
copyleft 发表于 2013-9-27 11:20
现在基本上解决了。但还有一些小问题。
前面说的是:X坐标是反的,也就是左右是反的。当按在触摸屏的左边 ...

电阻屏多多少少都会有一些偏差的,特别是android机制中用的是上报的坐标值的方式。
 楼主| copyleft 发表于 2013-10-9 14:24:02 | 显示全部楼层
亚瑟王 发表于 2013-9-30 16:43
电阻屏多多少少都会有一些偏差的,特别是android机制中用的是上报的坐标值的方式。

你好
我查看了一下 Linux 与 Android 下 tq210-ts.c 这个文件,并对其进行了下对比。
发现:在 linux 中使用的上报的坐标值的计算方法与 android 中的不一样
在函数:touch_timer_fire 中
linux 上报的坐标值是:

  1.                         x=(long) ts->xp;//
  2.                         y=(long) ts->yp;
  3.                         #if defined(CONFIG_TOUCHSCREEN_S3C_DEBUG)
  4.                         printk("x=%d,y=%d\n",(long) x,(long) y);
  5.                         #endif
  6.                        
  7.                         input_report_abs(ts->dev, ABS_X, x);
  8.                         input_report_abs(ts->dev, ABS_Y, y);

  9.                         input_report_key(ts->dev, BTN_TOUCH, 1);
  10.                         input_report_abs(ts->dev, ABS_PRESSURE, 1);
  11.                         input_sync(ts->dev);
复制代码
而在 android 中上報的值是通过

  1. tpx = (long )((a2 + (a0 * x) + (a1 * y)) / a6);
  2. tpy = (long )((a5 + (a2 * x) + (a3 * y)) / a6);
  3. x = tpx;
  4. y = tpy;
复制代码
計算得到的。
由于这两种对坐标的计算方法不同,觉得在 linux 中得到核准数据(a0~a6)可能不适合 android 。个人认为:要使 android 能使用 linux 下得到的7个值就要使用相同的坐标计算方法。但当我将添加宏:CONFIG_ANDROID_1 时,结果显示;能正常读取坐标值,从串口输出中也可以得到触摸点的坐标,但TSLIB没有响应。也就是在显示第一个“+”后,屏幕就不动了,但能看到坐标值,也不清楚这个坐标值是否正确。
当我添加宏:CONFIG_ANDROID_1 , 并修改了部分地方(CONFIG_CPU_S5PV210_EVT1_abc)代码,使在linux 下能以

  1.                         ts->xp=(long) ((a2+(a0*x)+(a1*y))/a6);
  2.                         ts->yp=(long) ((a5+(a3*x)+(a4*y))/a6);
复制代码
作为计算后的坐标上报给系统,但也遇到了相同的问题。
由于现在按照上面的方法没有得到预期想得到值
所以请问:
    这可能是不是导致 android 下触摸屏不准的一个原因。
    还有就是宏:CONFIG_ANDROID_1 与 CONFIG_CPU_S5PV210_EVT1_abc 在对这两个宏进行修改时,为什么出现问题:能看到上报的坐标值,但屏幕没有响应。
谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 04:38 , Processed in 1.078125 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表