android觸摸屏座標手工校準/調整成功

1.簡述
android 的座標轉換處理:
This implementation is a linear transformation using 7 parameters 
(a, b, c, d, e, f and s) to transform the device coordinates (Xd, Yd) 
into screen coordinates (Xs, Ys) using the following equations:

 s*Xs = a*Xd + b*Yd + c
 s*Ys = d*Xd + e*Yd + f
 
Xs,Ys:LCD座標
Xd,Yd:觸摸屏座標

在編譯好了的ANDROID根文件系統的system/etc/pointercal這個文件內,存放着7個數,
這7個數就是對應上面公式的a,b,c,d,e,f,s
比如我原來的:(如果表格沒對齊,請拷到記事本里面看)
+----+-----+--------+------+--+--------+----+
| a  |  b  |  c     | d    |e |   f    | s  |
+----+-----+--------+------+--+--------+----+
|-411|37818|-3636780|-51325|39|47065584|6553|
+----+-----+--------+------+--+--------+----+

2.處理說明:
“system/etc/pointercal”這個文件是被java程序讀取使用的,文件目錄:
f rameworks/base/services/java/com/android/server/InputDevice.java
---注:我用的是koolu的源碼(http://git.koolu.org/),官方的源碼請自行搜索。
該文件的第32行定義了:static final String CALIBRATION_FILE = "/system/etc/pointercal";
這個CALIBRATION_FILE變量在第237行被使用於打開該文件:
FileInputStream is = new FileInputStream(CALIBRATION_FILE);
後面的代碼就是從這個文件裏讀取那7個數據,用於上層函數的座標轉換。
所以只要根據該公式通過手工計算出那7個值,就可以準確的進行觸摸操作了。

3.計算
計算前需要取得4個觸摸屏的座標,我們取LCD 4個對角的座標,因爲只有這4個座標知道確切的LCD座標。
要取座標必須打開內核中觸摸屏的調試代碼,啓動後在console上使用dmesg命令來跟蹤取得。
我是在一個角上用筆點一下,再用dmesg調出記錄,然後記錄下來。如下是我的320x240屏記錄的結果:
座標軸裏小括號()裏面的是調試信息給的觸摸屏座標,中括號[]裏的是對應的LCD座標。

 x座標
/|\
 |(X:870, Y:140)   (X:870, Y:890)
 |  [320,0]          [320,240]
 |
 |
 |
 +-------------------------------> y座標
 (X:120, Y:140)    (X:120, Y:890)
     [0,0]             [0,240]

*LCD 分辨率:320 x 240 ,也是LCD座標的最大值
             x     y

設定s=65536
將那4個座標代入那個公式,可以得出8個方程組

        0 = a*120 + b*140 + c
        0 = d*120 + e*140 + f
        0 = a*120 + b*890 + c
65536*240 = d*120 + e*890 + f
65536*320 = a*870 + b*140 + c
        0 = d*870 + e*140 + f
65536*320 = a*870 + b*890 + c
65536*240 = d*870 + e*890 + f
解方程組後就可得:
a = 0
b = 20971
c = -2935940
d = 27962
e = 0
f = -3355440
s = 65535
然後用工具打開andriod的“system/etc/pointercal”文件,把這幾個數輸進去,用空格分開,
注意不要改文件結尾的兩個字節0x00 0x0A,我是用Ghex工具打開的,在右邊窗口中進行輸入,在編輯裏可以切換插入和覆蓋模式。
此時啓動試試。

////////////////////////////
我的屏到這個步驟後觸摸操作的左右變成了上下,上下變成了左右操作,
處理方法:把a,b,c值和d,e,f值分別對調。
再啓動試試。。
還是不行,左右是正確的,上下是反的。
處理方法:
把Y座標再反向的公式:
Ys‘ = 320 - Ys = 320 - (a*Xd + b*Yd + c)/s
重新計算a,b,c的值,就OK了。

現在我點擊計算器的按鈕等操作都很準了,指哪打哪。

前面發的那個視頻裏的座標是在內核裏調的座標,不是很準。

這是手工調的方法,如果要用程序校準的話可以用tslib,有時間再玩下。

注:我用的開發板是mini2440,LCD屏是320x240


http://blog.21ic.com/user1/2537/archives/2009/61231.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章