MTK-TP(电阻屏校准程序ts_lib移植)
Posted inkhearts
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MTK-TP(电阻屏校准程序ts_lib移植)相关的知识,希望对你有一定的参考价值。
现今的项目中已经很少有使用电阻TP,但总有些奇怪的需求。如果项目中遇到需要校准电阻屏如何保证较快且较稳的调试TP呢。这里介绍使用ts_lib库来进行调试。
当然也可以使用一些常见的校准算法,采集5点,但最终的公式应该是不变的:
X上报= Kx*Xraw+Kyx*Yraw+Xoff (1)
Y上报= Ky*Yraw+Kxy*Xraw+Yoff (2)
利用这两个公式可以校准大部分的屏幕,这里Kx,Ky指的是AD采集的数值上与逻辑屏幕上的比例关系,而Kyx指的是在按压物理面同一高度,因为不同Y值所带来X采集值的变化。实际的效果就是,当你按压同一高度时,发现上报的极左与极右两个点高度数值不一样。同理Kxy一样。外框为边界,内框为内部的实际报点坐标,通过该图就能明白Kxy与Kyx的作用了。、
而Xoff与Yoff则很好理解了,就是一些非比例关系的偏差。
有了该公式其实就很容易理解如何去校准屏幕了,当然已经有人为你做好了,那就不必要花时间在这方面过多,把时间放在做自己想做的那块,当然有心趣的朋友可以深入研究。这里附上源码地址: https://github.com/rmcc/android_external_tslib
这个源码下载下来,通过编译即可使用,我这里介绍如何将其编入到MTK源码中,且使其在app中能够使用。其实我的方法算是绕了弯路,其实可以直接把算法核心移植到java代码中,或者JNI中是的效率更高,但我的工作重心不想放在这块,则使用我所知道的方法。
将下载得到的代码放置MTK源码中的/package/app/tslib中,然后cd /package/app/tslib中,使用mm进行编译。在编译中会遇到一些问题,这些问题比如:"No raw modules loaded","Segmentation fault","no souch file or directory"," VT_OPENQRY",FB问题等为问题,这些问题将会附在我的附件中,请查看我的移植方法附件来进行修改源码。直至编译通过。
我们不需要知道ts_lib是怎样来进行校准的,但是我们得知道如何去使用这个工具,首先我们得明白,使用这个工具时,参与K这些计算的X,Y坐标是哪种坐标,在进行计算时,我们的底层需要上报的是AD数值的坐标,范围可能是0~4096或者0~65536,所以在公式里面是Xraw,直接使用的原始数据,而不是根据屏幕转换后的数据,好处当然是因为精度不会丢失,进行转换,难免小数无效位会去掉。驱动代码应在校准时直接上报AD数值,触摸时上报经过公式转换的数值。
同时还要添加一些比如上报压力的参数,不然可能校准代码不通过,在弹起时还要上报压力为0,这些是代码逻辑。
部分重要的需要在驱动中添加修改的代码,我会附在源码附件中使用鲜艳颜色标记,在移植附件中会给大家详细讲解源码,这里就不重复。
如果说在移植后大家能够直接使用adb shell来运行ts_calibretion这个程序,并且完全成功,恭喜你完成移植了。可以小试一把,然后将所得的参数填入你的驱动代码验证,会发现其效果还是杠杠的。校准图如下:
当然其中会有些问题,较多的是open失败,可以尝试使用su权限,并且chmod 777 /dev/graphics/fb0 ;chmod 777 /dev/input/event?(你的TP event),不知如何确定?很简单,输入getevent,按压触屏就知道了。
在./ts_calibretion之前,有必要将一些变量定义下,直接复制在adb shell运行:
export T_ROOT=/system
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_TSDEVICE=/dev/input/event2
export TSLIB_FBDEVICE=/dev/graphics/fb0
export TSLIB_CONSOLEDEVICE=none
这是我的硬件参数,也可以直接写入代码中,免去这一步。
接下来,我们发现没有屏幕告诉我按哪里,怎么做校准。似乎在C程序拿不到屏幕的使用权,更正确的讲应该是立马被刷掉了。那么就在app里面实现好了绘图好了。app这块不懂,只有在网上摘抄些代码,如果有原著觉得不行可联系我,会立马删除。
app这块只能作为一个demo,大家看着修改。源码在附件中。
app中的主要功能是实现一个调用命令行的功能,将参数写入到文件中,更新驱动中当前运行的参数,绘制校准点。
ts_lib采用的是五点校准法,所以先在app中绘制出5个点,但是五个点的位置需要得到,该位置是在屏幕中的位置,可以随意画分布在四个边角的4个点和居中第五点,但是注意的是需要计算出该5个点在屏幕中的像素位置,方法可以使用截图软件截下图,然后使用绘图工具确认下。比如:
图中左下角为显示(200,1855),屏幕为1080*1920,那么在tests/ ts_calibrate.c中修改:
get_sample (ts, &cal, 3, 200, yres - 55, "Bot left");同理其他坐标一样,如图:
此为修改示例,请按照实际情况修改即可,当然厉害的朋友可以在app中画出和实际一样的坐标相同就可以不需要去测量,并且可以传入到ts_calibrate程序中。
接着编写在app中执行命令行的代码,具体实现代码在ExeCommand.java中,而测试代码则在MyThread.java中
1 ExeCommand cmd = new ExeCommand(false).run("/system/bin/ts_calibrate", 60000); 2 calibrtion.Open(); 3 calibrtion.Start_Cali(1); 4 while(cmd.isRunning()) 5 { 6 try { 7 sleep(100); 8 } catch (Exception e) { 9 10 } 11 String buf = cmd.getResult(); 12 //do something 13 Log.i("result",buf.toString()); 14 15 calibrtion.Close(); 16 Log.i("auto","done!"); 17 }
该小段则为运行命令行。
在程序中我还做了一部分获取ts_calibration打印出的最后参数,参数有a[0]~a[6]7个参数,a[6]为扩大倍数,因为很多时候内核不做浮点运算,所以将浮点计算转换为整形计算更好,各参数对应如下:
Kx -> a[1] Ky -> a[5]
Kyx -> a[2] Kxy-> a[4]
Xoff-> a[0] Yoff-> a[3]
当然可能会与网上说的对应有差异,请按照实际情况来匹配。最后一个a[6]一般为65536。
获得了校准参数后当然是储存在文件中,使得驱动以后开机能够使用最新校准参数,其次是更新RAM中正运行的参数。
修改后的源码下载链接:https://files.cnblogs.com/files/inkhearts/tslib-%E4%BF%AE%E6%94%B9androids.rar
demo app,部分驱动程序下载链接:https://files.cnblogs.com/files/inkhearts/dem%26%E7%94%B5%E9%98%BB%E9%A9%B1%E5%8A%A8.rar
完全移植后的的ts_lib app(网上找到的,需修改才能使用):https://pan.baidu.com/s/19vU3E3bkBuFAFttI5uaV8w 提取码:hkac
以上是关于MTK-TP(电阻屏校准程序ts_lib移植)的主要内容,如果未能解决你的问题,请参考以下文章
Sympy 中的 Steinhart-Hart 热敏电阻校准
C8051逆向电阻屏:头儿拍脑袋说电阻屏IC好赚钱3块钱成本能卖20几块。,一个月不分昼夜逆向成功后头儿说电阻屏已经被市场淘汰请放弃治疗。