tslib 主要做了两件事,坐标系映射和按键的滤波。
屏幕的校准主要原理是两个坐标系的映射,通过平移,旋转,缩放。
即原坐标系的坐标点左乘,平移矩阵,旋转矩阵,缩放矩阵,可以得到校准后的矩阵。
由此可以推导出方程组:
X_ = aX + bY + c
Y_ = dX +eY + f
只要求出abc和defi就可以得出两个坐标系的映射关系。
tslib用的是5点校准,推倒公式如下:
X_ = a*X + b*Y + c
X_*X = a*X*X + b*Y*X + c*X
X_*Y = a*X*Y + b*Y *Y+ c*Y
Y_ = d*X +e*Y + f
Y_*X = d*X*X +e*Y*X + f*X
Y_*Y = d*X*Y +e*Y*Y + f*Y
ts_calibration.c
typedef struct {
int x[5], xfb[5];
int y[5], yfb[5];
int a[7];
} calibration;
x和y用来存触摸屏采样的五个点坐标(getxy函数获取,读取触摸屏设备而来)
xfb和yfb用来存lcd的五个坐标点(即lcd上的五个十字架,坐标已知)
a[0..2]对应方程组的a b c(根据克莱姆法则计算而来)
a[3...5]对应方程组的d e f(根据克莱姆法则计算而来)
a[6] a b c d e f 的放大系数