触摸驱动常见问题分析(二)

I2C 类问题

1、 I2C 速度被修改

1.1 调试方法

\qquad 用逻辑分析仪监视从工作正常到出现问题整个过程中的 I2C 波形。

1.2 问题现象

(1)I2C 速度在使用过程中突然会降低到原来的 1/100;
(2)Android 上层表现为报点率突然降低,并严重丢点。

1.3 分析解决

\qquad 该问题是由瑞星微时钟控驱动中对分频比的一个 bug 造成的,解决办法是每次 I2C 访问先都需要对 I2C 速度进行设置,以保证该次 I2C 访问速度的正确,设置方法参考以下代码(该参考代码以 I2C 读函数为例,I2C 写函数以此类推):

s32 gtp_i2c_read(struct i2c_client *client,u8 *buf,s32 len)
{
	struct i2c_msg msgs[2];
	s32 ret=-1;
	s32 retries = 0;
	
	GTP_DEBUG_FUNC();
	
	msgs[0].flags = !I2C_M_RD;
	msgs[0].addr = client->addr;
	msgs[0].len = GTP_ADDR_LENGTH;
	msgs[0].buf = &buf[0];
	msgs[0].scl_rate = 300*1000;
	msgs[1].flags = I2C_M_RD;
	msgs[1].addr = client->addr;
	msgs[1].len = len - GTP_ADDR_LENGTH;
	msgs[1].buf = &buf[GTP_ADDR_LENGTH];
	msgs[1].scl_rate = 300*1000;
	
	while(retries < 5)
	{
		ret = i2c_transfer(client->adapter, msgs, 2);
		if(ret == 2)break;
		retries++;
	}
	return ret;
}

2、干扰总线上其他设备初始化

2.1 调试方法

\qquad 用示波器或逻辑分析仪观察 SCL,SDA,AVDD,VDDIO 的对应时序图,会发现在上电时序出现类似下图中的波形,可以看出,在 VDDIO 上电后,AVDD 上电之前,SDA 由于倒灌电流的原因,会被拉到 0.7V 左右,持续时间一般为秒级,主控如果在这段时间内通过 I2C对总线上的其他设备进行初始化,则会初始化失败。
Alt

图1

2.2 问题现象

\qquad 连接 TP 开机上电,则总线上的其他设备(如光感,G-sensor 等)无法正常工作,拔掉 TP后再开机上电,则无此问题。

2.3 分析解决

\qquad 此问题是由于主控 I2C 上电先于 VDD 上电,导致通过 SCL,SDA 倒灌电流到芯片,是 SCL,SDA 被钳位到 0.7V 左右,相当于把 I2C 总线拉死,解决办法是在驱动中将 TP 的上电提前到同条总线上所有其他设备之前,以 MT6577 芯片为例,修改方法是在 kernel 中找到板级设置的 mt6577_devs.c 文件,按以下方法修改代码:

//将以下红色代码提前到该总线其他设备初始化代码之前
__init int mt6577_board_init(void)
{ 

……
#if defined(CONFIG_MTK_TOUCHPANEL)
	retval = platform_device_register(&mtk_tpd_dev);
	
	if (retval != 0) 
	{
		return retval;
		}
		
	#endif 
	……
}

中断类问题

1、中断 GPIO 申请失败

1.1 调试方法

(1)查看 Log 信息,看是否有抛出 GPIO request failed 类似的错误信息;
(2)非 MTK 平台,在中断处理函数中加入打印信息,看无触摸时是否依然定时执行该函数;

1.2 问题现象

\qquad 如果中断申请失败,进入 polling 模式,则从 Android 上层看来报点率非常慢,而且容易丢点,如果程序中没有做容错的 polling 功能,则会出现驱动对 INT PIN 波形无响应,即 TP无动作的情况。

1.3 分析解决

\qquad 出现该问题,一般为 kernel 中其他驱动先于该 TP 的驱动将 GPIO 资源申请了,导致驱动中再次申请时失败,解决办法是在申请 GPIO 之前先将该 GPIO 释放一次,参考以下代码:

//free gpio
gpio_free(GTP_INT_PORT);
ret = gpio_request(GTP_INT_PORT, "GTP_INT_PORT"); 
……

2、TOUCH 无中断

2.1 调试方法

(1)先用万用表排除 INT PIN 没有跟 VDD 或者是 GND 短路;
(2)确认主控下发的配置是否正确,可以先固化一组配置来排除该疑问;(3)如果测得 INT PIN 一直为低电平,检查主控 INT PIN 的状态是否已经设置为输入模式;

2.2 问题现象

\qquad TOUCH TP 时在 INT PIN 上无中断波形输出,TP 无动作。

2.3 分析解决

(1)这种问题先确认配置,COF 直接用工具固化,COB 可以在驱动中发下配置后再延时读出来比较,看是否一致,最后可以用导电布测量屏体脉冲的方式来确认配置是否生效;
(2)确认配置无误以后,还要确认 AVDD 供电电压与调配置时所用的一致,以免由于灵敏度不够,导致无中断输出;
(3)如果 INT PIN 还一直为低,可以考虑将主控和芯片的 INT PIN 断开,来确定是否为驱动输出低所致。

3、无 TOUCH 不停输出中断

调试方法

示波器测量 INT PIN 输出波形,观察输出波形的特征。

问题现象

以下以 GT818X 系列为例,说明几种 INT 脉冲的特征:
(1)如果 INT PIN 输出如下高低脉宽相同的脉冲,则可能是芯片没有收到配置,在不停向主控请求配置
在这里插入图片描述

图2

(2)如果 INT PIN 输出如下电平,配置为上升沿时,大部分时间为高,过 14ms(正常模式)或 46ms(低功耗模式)左右拉低 100us;配置为下降沿时,大部分时间为低,过 14ms(正常模式)或 46ms(低功耗模式)左右打高 100us,则可能是芯片有产生松键没有被读走,在不停通知主控来读
在这里插入图片描述

图3

(3)如果 INT PIN 输出如下波形,低 4ms~10ms 左右,其他大部分为高,或者相反,则可能是 TP 配置不对或者受到干扰而导致冒点
在这里插入图片描述

图4

(4)GT819/8105/8110 的一个特例,当该系列芯片配置成上升沿触发时,会出现如下图示的波形,每 10s 钟被拉低几毫秒,这是因为每过 10s,芯片会自动从 Green Mode 醒来进行基准学习的判断,判断过程中将 INT PIN 初始化为低电平,该波形不会影响正常使用,但是为了消除客户的顾虑,建议将该系列芯片配置成下降沿触发方式
在这里插入图片描述

图5

分析解决

针对不同问题,采用相应的办法解决,如:
(1)检查驱动中的发配置函数,有必要的话用逻辑分析仪监控 I2C 上的配置数据;
(2)检查 I2C 通信是否有异常,并用逻辑分析仪分析漏读松键的原因;
(3)用量产工具确认配置是否正确,或如有干扰,则调整配置频率避开干扰源。

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值