近期多台设备出现触摸异常情况,借此记录Android 触摸异常排查解决过程。此篇将介绍通过Android开发者选项指针显示功能和I2cTools快速定位问题,并分析异常原因。
异常现象:
与实际点击的位置相差大,触摸跳点。
排查思路:
①.开启指针显示,快速确定是固件问题还是TP物理损坏;
②.如果不是tp物理损坏,确定TP参数是否有误。
一、开启指针显示排查:
查找源码,找出指针位置显示开启方法如下:
即:
1.开启/关闭指针位置显示:
settings put system pointer_location 1/0
2.查询是否开启触摸显示:
settings get system pointer_location
开启后,可沿着对角线滑动,观察轨迹是否连续,选取易观察的特殊点确定坐标是否大致正确。如下图是触摸正常的轨迹图。
以分辨率为720*1280的正常设备为例,从左上角->屏幕中点->右下角滑动时,坐标值应为(0,0)->(360,640)->(720,1280)线性变化。
①.如果触摸轨迹不是连续的且触摸与显示的位置偏差大(坐标值偏差大),这种为触摸跳点,通常是固件原因;
②.如果触摸轨迹不连续且轨迹有断点,这种为触摸坏点,通常是触摸屏物理损坏,直接更换便是;
③.如果是局部位置没有触摸显示,其它位置触摸都有显示且坐标大致是对的,也是触摸坏点。
我手上这台异常的设备,点上方,显示的下方,且不对称(没保存图片,只能描述了),存在跳点现象,据此判断是TP参数有误,可能是固件问题。为此我们需要读取TP参数进一步确认。
二、确定TP参数
我们知道TP是I2C设备,那理应可以通过i2c协议读取出tp 触摸IC里的参数,再与配置的参数比较便能确定tp ic里参数是否有误。
这里使用的是Goodix 9271的触摸ic,找到驱动代码如下:
在Gt9xx.c gtp_init_panel()函数里发现tp ic的版本号是通过读取GTP_REG_CONFIG_DATA这个地址寄存器读取的,而tp ic的版本号就是tp参数数组的第一个参数,那第一个参数的寄存器地址我们知道了,长度可以查看下发的tp参数数组长度知道,如下是上电时下发的tp参数,可知道长度是185.这样我们就可以借助i2c-tools来读取tp ic里的参数。
i2c-tools在源码里没有预置,需要自行下载编译,我这里使用的是i2c-tools-3.1.0这个版本,放在源码里,mma编译,在out/..../system/bin/下生成i2cdetect、i2cdump、i2cget、i2cset可执行文件,把这个文件push到设备systen/bin/下。
根据i2c协议知道,我们需要先通过i2cset 写入要读取的寄存器地址,再通过i2cget获取这个寄存器的值。先看看i2cset怎么使用,如下:
看来我们需要指定:
I2CBUS:TP IC 的i2c总线
CHIP-ADDRESS:TP IC芯片地址
DATA-ADDRESS:寄存器地址
VALUE:往寄存器写入的值
从上面分析中我们知道:
DATA-ADDRESS = GTP_REG_CONFIG_DATA>> 8
VALUE为[0x47,0x47+185]
CHIP-ADDRESS可参看对应dts,如下图:
可知CHIP-ADDRESS = 0x5d.
I2CBUS可以通过i2cdetect查找,先确定有几组总线:
可知总共有4组i2c总线,然后逐个遍历这4组总线,确定出地址为0x5d,且显示UU(设备已被驱动占用)的这组总线,如下:
可知是tp设备使用的i2c-5这组总线,即I2CBUS=5;现在就可以使用i2cset、i2cget来读取了,这里先读取第一个参数。如下:
说明第一个参数跟dts配置的参数是一致的,为方便读取一整组参数,写了bat脚本读取,如下:
在我这台异常的设备中,发现读取的参数和配置的参数不一样,现在可以确定是固件问题。
经排查,可能是在上电下发tp参数时出现数据错乱导致下发的版本号大于tp ic里的版本号,导致写入错误参数。为此增加了版本号比较功能,要下发的TP固件版本号大于tp ic固件的版本号才下发,这样就可大大降低写入错误参数的几率。代码如下: