机器休眠后,按电源键唤醒,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协议兼容,直接用了敦泰的驱动,最终导致了唤醒慢的问题。