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

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

转载于:https://www.cnblogs.com/inkhearts/p/10313501.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ONENET读取与控制麒麟座MINI开发板LED状态

硬件 麒麟座MINI开发板V1.4 嵌入式软件 OneNET_Demo_ESP8266_EDP_Led 工程修改内容 led.c文件修改 函数LED_Init,mini开发板LED所在GPIO为PB6、PB7、PB8、PB9 函数LED_GetValue,mini开发板LED状态与IO口状态相反 /** * brief LED指示灯初始化函数**/v…

activemq的使用场景

一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境&#xff0c…

Java(发布/订阅模式)

1、概述 观察者模式又称为发布/订阅(Publish/Subscribe)模式 观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer) (1)Subject模块 Subjec模块有3个主要操作 addObserver()&#…

VUE $SET源码

转载于:https://www.cnblogs.com/smzd/p/11634255.html

Java实现消息队列服务

使用 JAVA 语言自己动手来写一个MQ (类似ActiveMQ,RabbitMQ) 主要角色 首先我们必须需要搞明白 MQ (消息队列) 中的三个基本角色 ProducerBrokerConsumer 整体架构如下所示 自定义协议 首先从上一篇中介绍了协议的相关信息,具体厂商的 MQ(消息队列) 需要遵循某种协议或者…

java 发布订阅

1.发布者接口 package com.yy.subpub; /** * Description: 发布者接口 * author: leijing * date: 2016年9月29日 下午5:07:20 */ public interface IPublisher<M> { /** * Description: 向订阅器发布消息 * param subscribePublish 订阅器 * param message 消息 * para…

EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案...

背景分析 对于EasyNVR我们应该都了解&#xff0c;主要应用于互联安防直播&#xff0c;对于EasyNVR&#xff0c;我们可以清楚的发现&#xff0c;EasyNVR的工作机制是EasyNVR拉取摄像机的RTSP/Onvif视频流&#xff0c;然后客户端可以通过访问EasyNVR服务端实现流分发&#xff0c;…

Vim删除文件到行首或者行尾

vim用的不是很熟练&#xff0c;只是有时候需要的时候会学习一下 我们知道&#xff0c;vim有三种模式&#xff0c;一种是一般模式&#xff0c;一种是编辑模式&#xff0c;另外一种是命令行模式 在一般模式下&#xff0c;可以进行删除&#xff0c;复制粘贴等操作&#xff0c;在编…

Golang的值类型和引用类型的范围、存储区域、区别

常见的值类型和引用类型分别有哪些&#xff1f; 值类型&#xff1a;基本数据类型 int 系列, float 系列, bool, string 、数组和结构体struct&#xff0c;使用这些类型的变量直接指向存在内存中的值&#xff0c;值类型的变量的值通常存储在栈中。 引用类型&#xff1a;指针、sl…

RPC框架实现原理

一、什么是RPC框架&#xff1f; RPC&#xff0c;全称为Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;是一种计算机通信协议。 比如现在有两台机器&#xff1a;A机器和B机器&#xff0c;并且分别部署了应用A和应用B。假设此时位于A机器上的A应用想要调用位于B机…

zookeeper入门系列

zookeeper可谓是目前使用最广泛的分布式组件了。其功能和职责单一&#xff0c;但却非常重要。 在现今这个年代&#xff0c;介绍zookeeper的书和文章可谓多如牛毛&#xff0c;本人不才&#xff0c;试图通过自己的理解来介绍zookeeper&#xff0c;希望通过一个初学者的视角来学习…

plsql查询数据中文乱码

在plsql中进行表数据查询的时候&#xff0c;发现查询出来的中文居然显示为乱码&#xff0c;通过查找资料解决该问题。 1、查看数据的编码&#xff08;语句&#xff1a;select * from v$nls_parameters&#xff09; 发现显示的语言不是我们常用的GBK模式 2、配置本机语言环境变量…

Zookeeper的功能以及工作原理

1.ZooKeeper是什么&#xff1f; ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xf…

前端学习总结——CSS布局方式之传统布局

传统布局 传统布局即是早期在平板电脑、智能手机等移动设备并不流行的时候使用的布局方式。 一、表格布局 例如&#xff1a;采用表格方式实现如下简单模型的布局 &#xff08;1&#xff09;固定布局 即用具体的像素值来确定模型的宽和高等值。 HTML代码如下所示 <tabl…

[POI2007]MEG-Megalopolis

传送门&#xff1a;嘟嘟嘟 第一反应是树链剖分&#xff0c;但是太长懒得写&#xff0c;然后就想出了一个很不错的做法。 想一下&#xff0c;如果我们改一条边&#xff0c;那么影响的只有他的子树&#xff0c;只要先搞一个dfs序&#xff0c;为什么搞出这个呢&#xff1f;因为有一…

memcache在ThinkPHP中的使用1---PHP下安装memcache

1.什么是Memcached缓存 Memcached是一套小巧、高效且成熟的内存数据库。与普通的数据库不同&#xff0c;Memcached存储的数据只能是简单的键值对&#xff0c;在查询时需要根据存放的key获取数据。 Memcached最大的特点是数据存放于内存&#xff0c;性能会比传统文件系统高出…

骨骼收集器01背包

来源hdu2602 问题描述 许多年前&#xff0c;在泰迪的家乡&#xff0c;有一个人被称为“骨头收藏家”。这个男人喜欢收集各种各样的骨头&#xff0c;比如狗狗&#xff0c;牛&#xff0c;还有他去了坟墓...... 骨头收藏家有一个大容量的V袋&#xff0c;沿着他的收集之旅有很多骨头…

ZooKeeper的安装与部署

本文讲述如何安装和部署ZooKeeper。 一、系统要求 ZooKeeper可以运行在多种系统平台上面&#xff0c;表1展示了zk支持的系统平台&#xff0c;以及在该平台上是否支持开发环境或者生产环境。 表1&#xff1a;ZooKeeper支持的运行平台 | 系统 | 开发环境 | 生产环境| | Linux…

python爬取豆瓣前25个影片内容的正则表达式练习

通过python正则表达式获取豆瓣top250的第一页的25个影片排名,影片名字,影片连接,导演,主演,上映日期,国家,剧情,评分,评价人数的内容 网页html内容: 1 <ol class"grid_view">2 <li>3 <div class"item">4 …

JavaScript 面向对象的程序设计1

一、理解对象 1.创建一个对象&#xff0c;然后给这个对象新建属性和方法。 ①常见的创建方式 var person new Object(); //创建一个Object 对象person.name XIE; //创建一个name 属性并赋值person.age 20; //创建一个age 属性并赋值person.sayName function () { //创建…