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
而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
同時還要添加一些比如上報壓力的參數,不然可能校準代碼不通過,在彈起時還要上報壓力為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移植)