天嵌 ARM开发社区

 找回密码
 注册
12
返回列表 发新帖
楼主: copyleft

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

[复制链接]
亚瑟王 发表于 2013-10-9 17:48:23 | 显示全部楼层
copyleft 发表于 2013-10-9 14:24
你好
我查看了一下 Linux 与 Android 下 tq210-ts.c 这个文件,并对其进行了下对比。
发现:在 linux 中 ...

Linux上报的是电压值
Android上报的是坐标值
这个就是差异。Android上报的坐标值是计算出来的。(用于计算的参数就是Linux+TSlib的校验值)。
 楼主| copyleft 发表于 2013-10-9 18:41:02 | 显示全部楼层
亚瑟王 发表于 2013-10-9 17:48
Linux上报的是电压值
Android上报的是坐标值
这个就是差异。Android上报的坐标值是计算出来的。(用于计 ...

也就是说:linux 下上报的值相当于是原始值,这个值在经过 TSLIB 计算得出坐标值。而 android 中上报的值已经是经过计算后的坐标值了。linux 下经过 TSLIB 计算出来的 a0~a6 这7个值就应该适合 android 中用于计算出坐标值,并上报。
这样的话,那就只有调整这7个值,使坐标计算准确了。
谢谢你了。
亚瑟王 发表于 2013-10-9 18:57:08 | 显示全部楼层
copyleft 发表于 2013-10-9 18:41
也就是说:linux 下上报的值相当于是原始值,这个值在经过 TSLIB 计算得出坐标值。而 android 中上报的值 ...

是的,是这样的。你弄好了写个总结贴出来吧。嘿嘿。
 楼主| copyleft 发表于 2013-10-10 18:18:12 | 显示全部楼层
亚瑟王 发表于 2013-10-9 17:48
Linux上报的是电压值
Android上报的是坐标值
这个就是差异。Android上报的坐标值是计算出来的。(用于计 ...

我今天在 linux 内核 + linux 文件系统的环境下通过不同的数据处理方法得到了不同的 a0~a6 的值。
1.不修改 tq210-ts.c 文件,得到坐标值并上报;
2.由于源代码中上报的坐标为累加的值,所以在上报累加值前,我将这个值除以 ts->count ,然后再上报;
3.由于在 android 中出现情况是:X坐标是反的,所以我在 tq210-ts.c 中在读取 x 坐标值后,用1024减去这个值做为测量值,然后再进行累加,最后上报;
4.将方法2与3合起来,上报的值为: x = (1024 - xp) / count;

从上面的4种方法中可以得到4组 a0~a6 的值,然后将其用于 android 内核源代码中:tq210-ts.c 文件中。得到的现象:x 坐标的反的,y 坐标向上偏。而且最主要的是这4组数据得到的现象都是相同的。所以不仅将 android 中计算前后前后的坐标值也打印出来,还将 a0~a6 这7个值也打印,同时也将 g_plcd->width 与 g_plcd->height 的值也打印出来,后来发现:a0~a6 的值是 800x480 的屏的校正参数,而且 width 与 height 的值也为 800, 480.。
然后我将我的屏的参数填入800x480的参数中,不同的情况得到不同结果(与前面方法相对应)(将android的显示坐标选项开启)
1.AD采样值正确,计算出错。导致当按在屏幕最右下方时,才在最左上方有反应;
2.x轴方向:向右移动,实际响应的距离变小,最后在最右侧时,响应大概在中间;而y则是超前;
3.4没有测试

前面给的现象,感觉没有什么作用,不知道如何下手处理,不知道您能不能给点建议。
前面的4组 a0~a6 我都各自得到了3组值,感觉大方向上不知道如何从 linux 下得到适合 android 的值。
谢谢了。
 楼主| copyleft 发表于 2013-10-10 19:21:55 | 显示全部楼层
亚瑟王 发表于 2013-10-9 17:48
Linux上报的是电压值
Android上报的是坐标值
这个就是差异。Android上报的坐标值是计算出来的。(用于计 ...

将 tq210-ts.c 文件中的 800x480 的 a0~a6 的参数修改为当 linux 中上报值为: x = xp / count;时得到的校正值时,屏幕反应为:
X:从左到右,计算前坐标变化大概为:103-->934, 经过计算后得到的值为:16-->474,屏幕上方给出的坐标变化为:0-->285
Y:从上到下,计算前坐标变化:105-->708,计算后坐标变化为:31-->603,屏幕上方给出的坐标变化为:0-->800
注:在Y方向时:当AD的值为575左右时,计算后的坐标大概为480,响应点已经到达屏幕最下方。
亚瑟王 发表于 2013-10-10 19:34:01 | 显示全部楼层
copyleft 发表于 2013-10-10 18:18
我今天在 linux 内核 + linux 文件系统的环境下通过不同的数据处理方法得到了不同的 a0~a6 的值。
1.不 ...

1、电阻屏不是线性的。
2、关于坐标值的计算,你可以模仿tslib的方式进行,然后上报即可。反正校正值都获取了的。
 楼主| copyleft 发表于 2013-10-11 10:35:52 | 显示全部楼层
亚瑟王 发表于 2013-10-10 19:34
1、电阻屏不是线性的。
2、关于坐标值的计算,你可以模仿tslib的方式进行,然后上报即可。反正校正值都获 ...

谢谢了
问题好像是解决了
在 android 代码中的 tq210-ts.c 文件中的 probe 函数中有:g_plcd = get_s5pv210_fb(); 问题应该出现在这个函数上。它返回的LCD值为 800x480 ,所以在前面计算进就用的是 800x480 的参数,导致后面的坐标计算出现了问题。也导致在设置 LCD 的坐标时出现冲突(设置值与实际LCD大小不同)。在这条代码后面,人为的将 width 与 height 修改为自己LCD的值,就可以了。但校准值(a0~a6),它们应该是 linux 下的平均值,而不是累加值。
这样修改后,屏幕响应人精准度会提高很多,可能根据情况有点偏差。
等将这个问题完全解决后,再把帖子结了
谢谢你了
亚瑟王 发表于 2013-10-11 18:08:07 | 显示全部楼层
copyleft 发表于 2013-10-11 10:35
谢谢了
问题好像是解决了
在 android 代码中的 tq210-ts.c 文件中的 probe 函数中有:g_plcd = get_s5p ...

亲,忘记给你说那个LCD显示参数了。
问题解决了就好,请把帖子类型改为“已解决”(请参考:http://www.armbbs.net/forum.php?mod=viewthread&tid=15200)。
 楼主| copyleft 发表于 2013-10-11 18:48:16 | 显示全部楼层
亚瑟王 发表于 2013-10-11 18:08
亲,忘记给你说那个LCD显示参数了。
问题解决了就好,请把帖子类型改为“已解决”(请参考:http://www. ...

问题基本上已经完全解决了。
谢谢了
 楼主| copyleft 发表于 2013-10-11 19:04:48 | 显示全部楼层
问题原因:
    校正参数(a0~a6)不正确。计算坐标时,所选择的校正参数出现错误。
解决方法:
    由于校正参数不正确,所以我们应该重新获得正确的校正参数。然后要使在计算坐标时选择正确的校正参数。通过修改 android 内核的代码,使其能正确选择校正参数。
    获得正确的校正参数:在Linux 下通过 TSLIB获得a0~a6,同时也要确保在 linux 内核源代码中上报的AD坐标值为平均值,而不是多次的累加值。只需在上报坐标前将所得到的坐标值除以 ts->count 即可。实验发现:不是每次在 linux 表现完美的校正参数,都可以在 android 中表现完美,有时会出现一些偏差(响应点与触摸点存在较大距离),所以可以通过多组校正参数,在 android 下测试,得到最好的效果。
    修改 android 内核,由于 tq210-ts.c 中的 probe 函数中的 get_s5pv210_fb() 函数不开源,所以它所返回的值会是原来系统原来已经列出来的LCD的长宽的值,所以在该代码后面,重新对 g_plcd->width 与 g_plcd->height 进行赋值,使其为我们自己的LCD 的长宽。这样问题基本上就解决了。由于我所用的 800x480 的电容屏,所以在末修改前,在计算坐标时,就会采用 800x480 的校正参数,而不是我自己的校正参数。修改过后,就好了。

终于把它给搞定了。。。
danshuihepan 发表于 2013-10-11 22:57:25 | 显示全部楼层
说下我的做法:
我在android上写了个触摸校准程序,让用户摸5个点,选3点计算出a0~a6, 然后反过来推算其余两个点的触摸屏上位置,将屏幕坐标点,计算出来的点绘制出来,就可以看出误差来了 。 a0~a6保存在文件中,通过 sysfs传入驱动程序中。
我的经验,的确有些电阻屏,误差太大,非线性问题严重,无法商用。
 楼主| copyleft 发表于 2013-10-12 10:56:51 | 显示全部楼层
danshuihepan 发表于 2013-10-11 22:57
说下我的做法:
我在android上写了个触摸校准程序,让用户摸5个点,选3点计算出a0~a6, 然后反过来推算其余 ...

谢谢你了
我现在还没有能力写上层的校正程序,对上层的编程不熟悉。
不过还是要谢谢你的这个方法,如果有可能的话,我可能会试试的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-29 04:41 , Processed in 1.031250 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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