如何调整模块earlySuspend/lateResume的顺序

2017-10-30  本文已影响0人  RTThread小师弟

[DESCRIPTION]

有些情况下,因为一些模块在earlySuspend时的特殊操作,而导致另外一些模块在

earlySuspend/lateResume后无法工作,

比如常见的CTP跟MEMs Sensor如果公用一个I2C port,经常会有一些冲突;

调整earlySuspend/lateResume的顺序可以解决类似的问题

[SOLUTION]

earlySuspend跟lateResume的顺序是关联的,简单地说先执行earlySuspend的模块,必然后执行lateResume;

类似于堆栈,先进后出;这个顺序是在模块驱动代码中注册earlySuspend函数时传入的:

-------------------------------------------------------------

obj->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB-1,

obj->early_drv.suspend = xxx_early_suspend,

obj->early_drv.resume=xxx_late_resume,

register_early_suspend(&obj->early_drv),

-------------------------------------------------------------

这里的level值就决定了该模块在earlySuspend/lateResume执行中的顺序

earlySuspend的执行顺序是 low level ---> high level

lateResume的执行顺序是 high level ---> low level

EarlySuspend.h中定义了几个宏作为基准,主要依据是mtk系统屏幕的状态;

其他的模块可以参照这些基准值自行决定,一般来说,跟屏幕显示有关的,都要放到

EARLY_SUSPEND_LEVEL_DISABLE_FB之前

-------------------------------------------------------------

enum {

EARLY_SUSPEND_LEVEL_BLACK_SCREEN = 50,

EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,

EARLY_SUSPEND_LEVEL_DISABLE_FB =150,

};

-------------------------------------------------------------

来源:一牛网论坛

上一篇 下一篇

猜你喜欢

热点阅读