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

相關文章
相關標籤/搜索