在TP休眠时,irq使用enable_irq_wake()方法,保证IRQ在休眠状态可以唤醒系统,在中断唤醒系统后在进行I2C读写操作。
在写上报点时,需要设置上报事件包括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__);
}
因为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一样的操作。
触摸屏使用哪一块屏在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。以此加快触摸屏加载速度。
其他问题基本都是和固件有关了,需要配合供应商,提供数据修改固件来调试。