MTK-TP(电阻屏校准程序ts_lib移植)

现今的项目中已经不多有使用电阻TP,但总有些奇怪的需求。若是项目中遇到须要校准电阻屏如何保证较快且较稳的调试TP呢。这里介绍使用ts_lib库来进行调试。java

         固然也可使用一些常见的校准算法,采集5点,但最终的公式应该是不变的:android

X上报= Kx*Xraw+Kyx*Yraw+Xoff                           (1)git

Y上报= Ky*Yraw+Kxy*Xraw+Yoff                           (2)github

       利用这两个公式能够校准大部分的屏幕,这里Kx,Ky指的是AD采集的数值上与逻辑屏幕上的比例关系,而Kyx指的是在按压物理面同一高度,由于不一样Y值所带来X采集值的变化。实际的效果就是,当你按压同一高度时,发现上报的极左与极右两个点高度数值不同。同理Kxy同样。外框为边界,内框为内部的实际报点坐标,经过该图就能明白Kxy与Kyx的做用了。、算法

 

而Xoff与Yoff则很好理解了,就是一些非比例关系的误差。shell

       有了该公式其实就很容易理解如何去校准屏幕了,固然已经有人为你作好了,那就没必要要花时间在这方面过多,把时间放在作本身想作的那块,固然有心趣的朋友能够深刻研究。这里附上源码地址:         https://github.com/rmcc/android_external_tslibapp

       这个源码下载下来,经过编译便可使用,我这里介绍如何将其编入到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数值,触摸时上报通过公式转换的数值。spa

       同时还要添加一些好比上报压力的参数,否则可能校准代码不经过,在弹起时还要上报压力为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

移植步骤问题:https://files.cnblogs.com/files/inkhearts/tslib_%E7%AC%94%E8%AE%B0.rar

相关文章
相关标签/搜索