android不提供触屏数据校正,最近一项目需要移植tslib校正电阻屏坐标,因为电阻屏的原始坐标非常不准。网上找了很多资料,并参考了一些文献终于搞定了。下面就将具体过程分享给大家。
一、android 源码包中移植tslib
1.下载tslib,注意此tslib已经经过移植,可以适合android编译
下载地址 http://download.csdn.net/detail/wenxiaohua_113/7503017
2.解压tslib,到目录android4.4.2/external下
3.编译tslib:
执行:source ./build/envsetup.sh
进入tslib目录
执行:mm
至此,tslib编译完成,相关的tslib库和校正程序被移至:android4.4.2/out/target/product/rk3188/system/ 目录下面
二、上面编译完成后,如果直接运行 ts_calibrate程序,会发现在android下面并没现有十字光标的校正界面出来,而是黑屏一会而,继续进入android的界面。但是串口终端的打印显示是正常了,当你在屏幕上点击五次后,完成校正。据我分析可能是android的ui界面覆盖了ts_calibrate的校正界面。下面给出一种可以显示校正界面的方法:
即android 4.4.2/out/target/product/rk3188/system/bin目录中的surfaceflinger删除,重新打包system.
环境变量:
export T_ROOT=/system
export LD_LIBRARY_PATH=$T_ROOT/lib
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/graphics/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CALIBFILE=/data/data/pointercal
export TSLIB_CONFFILE=/system/tslib/ts.conf
然后运行
ts_calibrate
至此,获得校正数据。(同时也可以使用adb 工具将校正的数据pointercal文件拿出来)获取校正数据
二、在内核的触屏驱动中使用上面的校正数据
在驱动中上报坐标的地方加上如下代码
int a0,a1,a2,a3,a4,a5,a6;
int x,y;
a0 = 394;
a1 = 13791;
a2 = -2087008;
a3 = -8200;
a4 = 71;
a5 = 33547940;
a6 = 65536;
x=(int) ts->event.x;
y=(int) ts->event.y;
ts->event.x=(long) ((a2+(a0*x)+(a1*y))/a6);
ts->event.y=(long) ((a5+(a3*x)+(a4*y))/a6);
ts->input->name = "TSC2003_I2C_Touchscreen";
那么此时idc文件名字就必须是:TSC2003_I2C_Touchscreen.idc
# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1
# Size
touch.size.calibration = diameter
touch.size.scale = 10
touch.size.bias = 0
touch.size.isSummed = 0
# Pressure
# Driver reports signal strength as pressure.
#
# A normal thumb touch typically registers about 200 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.005
# Orientation
touch.orientation.calibration = none