1. 程式人生 > >MTK-TP(電阻屏校準程序ts_lib移植)

MTK-TP(電阻屏校準程序ts_lib移植)

點運算 java代碼 cto close 其中 .get 失敗 nta phi

現今的項目中已經很少有使用電阻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移植)