机器休眠后,按电源键唤醒,2s多屏幕才亮,查看内核信息,没发现什么报错信息。先检查lcd的初始化代码,去掉多余的延时,唤醒时间依然很长。继续分析内核信息,从按下电源键到开背光,用时2s多,发现tp唤醒时间较长。直接修改tp的i2c地址(或者拔掉tp),让tp驱动不跑,唤醒时间就正常了。继续分析tp的唤醒函数。
通过如下方法,把tp的唤醒的每个函数的执行时间都打印出来。
long long int elapsed_ms;
ktime_t time_start;
time_start=ktime_get();
elapsed_ms = ktime_to_ms(ktime_sub(ktime_get(), time_start));
最终定位到该函数耗时较长。
int fts_wait_tp_to_valid(struct i2c_client *client)
{
int ret = 0;
int cnt = 0;
u8 reg_value = 0;
u8 chip_id = fts_data->ic_info.ids.chip_idh;
do {
ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value);
if (ret < 0) {
FTS_DEBUG("TP Not Ready, ReadData = 0x%x", reg_value);
} else {
FTS_INFO("TP Ready, Device ID = 0x%x", reg_value);
return 0;
}
cnt++;
msleep(INTERVAL_READ_REG);
} while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG);
return -EIO;
}
tp唤醒后,会有复位操作,然后通过2c通信判断tp是否已经正常工作。逻辑没有问题。但读到的id跟FTS_REG_CHIP_ID不符,导致一直在循序,直到超时退出。最开始由于tp那边没有驱动代码,说跟敦泰的tp协议兼容,直接用了敦泰的驱动,最终导致了唤醒慢的问题。
本文详细分析了机器休眠后,TP(触摸屏)唤醒时间过长的问题。通过内核信息排查,发现TP的i2c地址冲突及驱动兼容性问题是导致唤醒延迟的关键。文章深入探讨了tps_wait_tp_to_valid函数的执行逻辑,揭示了读取TP芯片ID异常导致的无限循环,并给出了修改tp的i2c地址或驱动以解决唤醒慢问题的方法。
4781

被折叠的 条评论
为什么被折叠?



