TP驱动调试过程的几个问题

  1. TP点击不能正常唤醒系统。

在TP休眠时,irq使用enable_irq_wake()方法,保证IRQ在休眠状态可以唤醒系统,在中断唤醒系统后在进行I2C读写操作。

  1. TP电量是不能正常上报POWER KEY。

在写上报点时,需要设置上报事件包括key

__set_bit(BTN_TOUCH, input_dev->keybit);

然后key里面包括power key。

input_set_capability(input_dev, EV_KEY, KEY_POWER);

这样在上报点时才能正常上报。

3.连续两次点击随机出现亮屏后息屏的情况。

以为当前没有组双击,只做了单击操作,两次点击是如果太快,可能才是两次power key,导致亮屏后立刻息屏。可以在第一次收到power key后,使用time_after做一个500ms不在上报power key的处理。

if (buf[0] == 1 && data->is_suspend == 1 && time_after(jiffies, data->current_time + msecs_to_jiffies(500)))
        {
            input_report_key(data->input_dev, KEY_POWER, 1);
        	input_sync(data->input_dev);
        	mdelay(1);
        	input_report_key(data->input_dev, KEY_POWER, 0);
        	input_sync(data->input_dev);
            data->current_time = jiffies;
            printk(KERN_INFO "[touch]%s:gesture wakeup\n", __func__);
        }
  1. I2C休眠过程中,中断无法打开休眠过程,导致I2C读写失败,此处电亮失败。

因为TP设备通过监听屏的亮灭来控制休眠与唤醒,没有键入到PM Core中,导致当TP中断到来,系统I2C等设备将跟随PM Core逐个唤醒设备。但是TP中断要立刻处理,I2C的没有唤醒导致TP中断处理异常。

在接收到中断,为读I2C之前,先持500s超时休眠锁,把整个系统唤醒。可以避免给问题。

if (!wake_lock_active(&data->wakelock)) {
        printk(KERN_INFO  "[touch] wake_lock_timeout");
        wake_lock_timeout(&data->wakelock,msecs_to_jiffies(500));
    }

5.画C操作偶然出现画一次C不亮。

发现在画C时,其实是识别到的,但是画C的按键还没有被应用处理到就系统休眠了。这个时候,也需要在上报C操作前,进行系统持锁,防止休眠。和4一样的操作。

  1. 屏选择问题

触摸屏使用哪一块屏在bootloader就做了判定,内核可以从cmdline中知道使用哪一块触摸屏。

static int __init poffmode_setup(char *str)
{
	if(!strncmp(str, "sec_", 4))
		g_xtc_tp_type = 5;
	else if(!strncmp(str, "cyttsp5_", 8))
		g_xtc_tp_type = 6;
	else if(!strncmp(str, "raydium_t", 9))
		g_xtc_tp_type = 7;
	else
		g_xtc_tp_type = -1;
	return 1;
}
("androidboot.xtc.touchid=", poffmode_setup);

上面函数来获得使用的屏,并把使用的屏写入到全局变量g_xtc_tp_type 。在赛普拉斯probe是g_xtc_tp_type = 2;在纪斯屏probe是g_xtc_tp_type = 1,在raydium屏proe时,设置g_xtc_tp_type = 3.在每个屏probe时先看看这个g_xtc_tp_type是不是自己,是自己就probe,不是自己直接退出probe。以此加快触摸屏加载速度。

其他问题基本都是和固件有关了,需要配合供应商,提供数据修改固件来调试。

你可能感兴趣的:(Linux驱动,触摸屏驱动,TP驱动问题,TP)