一 LCM ESD防护
1 TE方法
屏幕定义TE中断脚
dts文件中定义中断脚:
dsi_te: dsi_te {
compatible = "mediatek, dsi_te-eint";
interrupt-parent = <&eintc>;
interrupts = <44 IRQ_TYPE_EDGE_RISING>; //修改为44
debounce = <44 0>;
status = "okay";
};
primary_display.c文件中,
void primary_display_esd_check_enable(int enable)函数下检测是否是使能
2读取寄存器方式
在primary_display.c的primary_display_esd_check_worker_kthread 函数里面检测
lcd初始化代码写入
params->dsi.esd_check_enable = 1;//TE方式始能
params->dsi.customization_esd_check_enable = 1; //读取寄存器方式始能
以下找屏厂FAE提供
params->dsi.PLL_CLOCK = 230;//208;
params->dsi.lcm_esd_check_table[0].cmd = 0x0A;
params->dsi.lcm_esd_check_table[0].count = 1;
params->dsi.lcm_esd_check_table[0].para_list[0] = 0x9C;
编译后,打印kernel log有esd循环检查
如:
<7>[ 114.369654] (5)[240:disp_check][DISP][ESD]ESD check begin
<7>[ 114.392798] (5)[240:disp_check][DISP]DSI read long packet size: 1
<7>[ 114.392831] (5)[240:disp_check][DISP]DSI read long packet size: 1
<7>[ 114.392848] (5)[240:disp_check][DISP]DSI read long packet size: 1
<7>[ 114.392921] (5)[240:disp_check][DISP][ESD]ESD check end, ret = 0
二 CTP ESD防护
以gt1151为例
定义CONFIG_GTP_ESD_PROTECT
定义1S查询一次寄存器
void gt1x_init_esd_protect(void)
{
/*HZ: clock ticks in 1 second generated by system*/
esd_work_cycle = 2 * HZ;
GTP_INFO("Clock ticks for an esd cycle: %d", esd_work_cycle);
INIT_DELAYED_WORK(&esd_check_work, gt1x_esd_check_func);
mutex_init(&esd_lock);
}
通过static void gt1x_esd_check_func(struct work_struct *work)读取寄存器,实施复位操作
如果void gt1x_power_reset(void)无效果可以做更深入的复位动作.有时可以用亮屏推出睡眠方式s32 gt1x_wakeup_sleep(void)重新唤醒后可以恢复.
抓log检查是否在循环检测
如:
<6>[ 420.294543] (4)[608:kworker/u16:15]<<GTP-INF>>[gt1x_esd_check_func:1634] [Esd]0x8040 = 0xFF, 0x8043 = 0xAA
<6>[ 422.374850] (7)[613:kworker/u16:20]<<GTP-INF>>[gt1x_esd_check_func:1634] [Esd]0x8040 = 0xFF, 0x8043 = 0xAA
<6>[ 424.454341] (5)[452:kworker/u16:10]<<GTP-INF>>[gt1x_esd_check_func:1634] [Esd]0x8040 = 0xFF, 0x8043 = 0xAA