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.pswp.cn/news/249739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249739.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac vscode 實用快捷鍵

cmddel:光標左邊刪到頭 cmdfndel:光標右側刪到頭轉載于:https://www.cnblogs.com/smzd/p/11474488.html

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…

洛谷 - P1217 - 回文質數 - 枚舉

https://www.luogu.org/problemnew/show/P1217 考慮暴力生成所有的回文數然后再判斷是不是質數。注意個位的選擇實際上只有4種。所以是 $4*10^3*10^34*10^6$ &#xff0c;完全充裕的復雜度。 #include<bits/stdc.h> using namespace std; #define ll long longint a,b; v…

git commit之后,想撤銷commit

寫完代碼后&#xff0c;我們一般這樣git add . //添加所有文件git commit -m "本功能全部完成"執行完commit后&#xff0c;想撤回commit&#xff0c;怎么辦&#xff1f;這樣涼拌&#xff1a;git reset --soft HEAD^這樣就成功的撤銷了你的commit注意&#xff0c;僅僅…

引用數據類型

1.Scanner類 Scanner類是引用數據類型的一種&#xff0c;我們可以使用該類來完成用戶鍵盤錄入&#xff0c;獲取到錄入的數據。 引用數據類型的使用&#xff1a; 與定義基本數據類型變量不同&#xff0c;引用數據類型的變量定義及賦值有一個相對固定的步驟或格式。 數據類型 變…

phpmyadmin登錄遠程mysql數據庫

之前只用phpmyadmin登錄本地的mysql&#xff0c;管理另一個遠程數據庫的時候發現&#xff0c;單純用命令行處理字符串、換行符實在是不好使&#xff0c;所以配置了遠程登錄mysql&#xff0c;很簡單的問題結果沒有搜到合適的方法&#xff0c;所以記錄下我的配置方式。 phpmyadmi…

activemq的使用場景

一、消息隊列概述 消息隊列中間件是分布式系統中重要的組件&#xff0c;主要解決應用耦合&#xff0c;異步消息&#xff0c;流量削鋒等問題。實現高性能&#xff0c;高可用&#xff0c;可伸縮和最終一致性架構。是大型分布式系統不可缺少的中間件。 目前在生產環境&#xff0c…

復習JavaScript隨手記

數據類型 基本類型 stringnumberbooleanundefinednumber類型,包含整數浮點數 NaN和自己都不相等,涉及NaN的計算結果都是NaN isNaN()函數用于判斷一個數是不是NaN 引用類型 object類型 function類型 繼承自object object類型定義了prototype屬性 可以通過它動態給對象綁定方法和…

TP5在前端時間戳轉換為時間格式

value"{:date(Y-m-d H:i:s,$data[add_date])}" 例如&#xff1a; <td>{:date(Y-m-d H:i:s,$d[create_time])}</td> 轉載于:https://www.cnblogs.com/shark1100913/p/9468077.html

Java(發布/訂閱模式)

1、概述 觀察者模式又稱為發布/訂閱(Publish/Subscribe)模式 觀察者設計模式涉及到兩種角色&#xff1a;主題&#xff08;Subject&#xff09;和觀察者&#xff08;Observer&#xff09; &#xff08;1&#xff09;Subject模塊 Subjec模塊有3個主要操作 addObserver()&#…

VUE $SET源碼

轉載于:https://www.cnblogs.com/smzd/p/11634255.html

JS 日期格式化

1、將中國標準時間格式化為&#xff08;2017-06-06 15:05:04&#xff09; function formatDateTime(theDate) { var _hour theDate.getHours(); var _minute theDate.getMinutes(); var _second theDate.getSeconds(); var _year theDate.getFullYear() var _month theDat…

canvas 入門

<canvas>是HTML5新增的&#xff0c;是可以使用腳本&#xff08;JavaScript&#xff09;在其中繪制圖像的HTML元素。 canvas是由HTML代碼配合高度和寬度屬性而定義出的可繪制區域&#xff0c;JavaScript代碼可訪問該區域&#xff0c;類似于其它通用的二維API&#xff0c;通…

Java實現消息隊列服務

使用 JAVA 語言自己動手來寫一個MQ (類似ActiveMQ,RabbitMQ) 主要角色 首先我們必須需要搞明白 MQ (消息隊列) 中的三個基本角色 ProducerBrokerConsumer 整體架構如下所示 自定義協議 首先從上一篇中介紹了協議的相關信息,具體廠商的 MQ(消息隊列) 需要遵循某種協議或者…

Knockout中ko.utils中處理數組的方法集合

每一套框架基本上都會有一個工具類&#xff0c;如&#xff1a;Vue中的Vue.util、Knockout中的ko.utils、jQuery直接將一些工具類放到了$里面&#xff0c;如果你還需要更多的工具類可以試試lodash。本文只介紹一下Knockout中ko.utils中處理數組的一些方法。 ko.utils.arrayForEa…

$nextTick 源碼

x現在沒時間&#xff0c;留個坑 轉載于:https://www.cnblogs.com/smzd/p/11634665.html

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…

.NET Core Session的簡單使用

前言 在之前的.NET 里&#xff0c;我們可以很容易的使用Session讀取值。那今天我們來看看 如何在.NET Core中讀取Session值呢&#xff1f; Session 使用Session之前&#xff0c;我們需要到Startup.cs中配置我們的服務如下&#xff1a; ①在ConfigureServices中加入&#xff1a;…

EasyNVR內網攝像機接入網關+EasyNVS云端管理平臺,組件起一套輕量級類似于企業級螢石云的解決方案...

背景分析 對于EasyNVR我們應該都了解&#xff0c;主要應用于互聯安防直播&#xff0c;對于EasyNVR&#xff0c;我們可以清楚的發現&#xff0c;EasyNVR的工作機制是EasyNVR拉取攝像機的RTSP/Onvif視頻流&#xff0c;然后客戶端可以通過訪問EasyNVR服務端實現流分發&#xff0c;…

java.util.Queue用法

隊列是一種特殊的線性表&#xff0c;它只允許在表的前端&#xff08;front&#xff09;進行刪除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;進行插入操作。進行插入操作的端稱為隊尾&#xff0c;進行刪除操作的端稱為隊頭。隊列中沒有元素時&#xff0c;稱為空隊…