一、概述
最近我在调试 mtk 平台 LCD 驱动的过程中,发现机器开机后 LCD 显示是正常的,但在休眠后再唤醒时会出现短暂花屏,之后又马上恢复正常。
然后联系了 LCD 驱动 IC 的技术支持工程师,其了解情况后建议通过延迟打开背光来处理这个问题。
于是,按照此思路,我开始了分析、编码和调试:一开始试图直接在 lcm_resume() 函数执行延时操作,但这样没有达到预期的效果;后来通过创建内核线程来执行延迟操作和打开背光,经测试,达到了预期的效果,问题得以解决。
二、关键驱动代码以及说明
static struct task_struct *bl_delay_task;
struct pinctrl *pinctrl;
struct pinctrl_state *pinctrl_bl_low;
struct pinctrl_state *pinctrl_bl_high;
int bl_delay_func(void *arg) {
msleep(500); // 延时 500 毫秒,可根据实际情况调整
pinctrl_select_state(pinctrl, pinctrl_bl_high); // 打开背光
return 0;
}
// suspend 回调函数
static void lcm_suspend(void)
{
pinctrl_select_state(pinctrl, pinctrl_bl_low); // 关闭背光
... //此处省略部分代码
}
// resume 回调函数
static void lcm_resume(void)
{
... //此处省略部分代码
bl_delay_task = kthread_run(bl_delay_func, 0, "bl_delay");
}