Android4.4关于电阻屏调试和校准
一、关于滑鼠模式
最近在Android4.4上移植了一个电阻屏驱动,开机后,触摸屏可以工作,只不过是和笔记本电脑上面触摸板似的,你点击滑动界面上面会有一个白色的远点广播跟着你动,但是一旦你抬起手,点击操作的话就不行了你点击屏幕上面的任何一点响应的位置都是光标所在的位置,这就是滑鼠模式了,那么如何实现单点模式呢?
看网上资料了解还需要在system/usr/idc 下添加自己相应的idc文件,文件名是有特殊规定的,是
触摸驱动名.idc
可以用 cat proc/bus/input/devices 查看自己相应的驱动名称
- [email protected]_6dq:/ # cat proc/bus/input/devices
- I: Bus=0000 Vendor=0000 Product=0000 Version=0000
- N: Name="RohmCTPBu21014"
- P: Phys=
- S: Sysfs=/devices/virtual/input/input0
- U: Uniq=
- H: Handlers=mouse0 event0
- B: PROP=0
- B: EV=b
- B: KEY=400 0 4 0 0 4000 0 0 0 0 0
- B: ABS=610000 11030003
如果驱动名称中有空格,或横线等特殊字符,都要换成下划线,例如,Name=“Rohm-CTP Bu21014” 那么文件名称:Rohm_CTP_Bu21014.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
二、关于触摸校验
触摸屏退出滑鼠模式后,可以正常工作,但出现了电阻屏的通病,由于工艺问题触摸坐标和LCD坐标会出现偏差,那就是需要校准,这里校准分为手动计算和利用tslib工具。
1、手动计算是为了了解触摸校准的原理
触摸屏坐标和LCD坐标之间是成线性关系的,通用公式如下:
s*Xs = a*Xd + b*Yd + c
s*Ys = d*Xd + e*Yd + f
Xs,Ys:LCD坐标
Xd,Yd:触摸屏坐标
计算前需要取得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 |
得出各个系数后在驱动中代入上公式,再将公式得出的坐标上报给系统即可。
2、利用 tslib 校准
①下载tslib,注意此tslib已经经过移植,可以适合Android编译
下载地址 http://download.****.net/detail/wenxiaohua_113/7503017
②解压tslib到目录android4.4.2/external下
③编译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文件拿出来)获取校正数据
在测试校验时出现了,串口有坐标输出,但点击屏幕光标没有反应,查看ts_calibrate源码发现原来是驱动中没有上报压力值,所以在驱动中需添加
- input_set_abs_params(ts.input, ABS_PRESSURE, 0, 1, 0, 0); //在probe函数中添加压力参数
- input_report_abs(ts.input, ABS_PRESSURE, 1); //在上报坐标时顺便把压力值上报
- input_report_abs(ts.input, ABS_PRESSURE, 0); //在手指松开时清零
⑤在运行ts_calibrate进行校验后,会在/data/data/pointercal 中得到7个系数a0~a6,这和上面手动计算是一个原理,把七个系数代入下列公式即可
- x=(int) ts->xp;
- y=(int) ts->yp;
- ts->xp=(long) ((a2+(a0*x)+(a1*y))/a6);
- ts->yp=(long) ((a5+(a3*x)+(a4*y))/a6);
- 开始的ts->xp、ts->yp为原始的A/D数据,通过公式计算后的ts->xp、ts->yp为屏坐标。