前言
@狗头人川川子 aka 南昌狗头人老哥在一加5/5T 上移植了 蛋丁的pcc 遮罩类DC调光。
原理:
- OP5 256级亮度,66以上为类dc调光,OP5T 1024级亮度,大约370以上为类dc调光
- 对于小于类dc调光的亮度,我们设置亮度为最小dc调光亮度,同时使用pcc遮罩对亮度进行调节,对于大于dc调光的亮度,pcc遮罩亮度max。
- hijack 内核调节亮度接口
问题
狗头人老哥用的PE,我喜欢OOS,于是cherry-pick 到我之前捣鼓的内核上后,发现三个较为影响使用的问题。
- 开关dc 屏幕亮度瞬间变亮 然后暗下来。
- 一加设置 调节颜色模式 (SRGB/DCIP3/ADAPTION),pcc遮罩失效,表现为亮度很亮,需要调一次亮度才恢复。
- 锁屏后再开启,pcc遮罩失效。
逐一分析
问题1
代码分析,set_fliker_free(bool enabled) 为开关proc_fs文件的回调函数。
开启后调用pdata->set_backlight(pdata, mdss_panel_calc_backlight(get_bkl_lvl())),其中的mdss_panel_calc_backlight则是利用mdss kcal去设置一个遮罩,最后一路追踪,追到这里,本菜鸡实在看不懂,只知道最后向一些地址中写入了pcc遮罩的rgb value。
那为什么亮度小于dc阈值情况下,有时候打开dc开关,屏幕会变亮然后变暗呢?
因为在低亮度下,我们首先打开一个pcc遮罩,然后设置亮度为370或66,pcc若晚于设置亮度生效,那就会先变亮然后变暗。
解决方法(experimental):注册一个DELAYED_WORK工作队列,在pcc遮罩设置后,delay 500ms再设置亮度。这样不闪了,但还是有点小bug,就不细说了。
问题2
我只能说wtf。
这个问题只在OOS/H2os上有,类原生没有。原因是一加设置中调节颜色模式的同时,它还会动pcc遮罩...我佛了,导致之前的pcc遮罩就会失效,进而导致低亮度下亮度会突然变亮。
同时这个问题带来一个更进一步的问题。来看一段log。请忽略(m**** f** )
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.847982]@0 Power-Key DOWN
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.872142]@2 mother fucker dcip3 mode=1
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.909536]@1 mdss_dsi_on start
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.929195]@2 mdss_dsi_on end
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.930950]@2 mdss_dsi_panel_on start
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.957251]@0 mdss_dsi_panel_on end
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.958111]@0 DCI-P3 Mode On.
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.958117]@0 oneplus is mother fucker
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.989671]@3 fliker free mode on
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.989688]@3 elvss_off = 370, backlight_level = 36
[Sat Apr 4 16:49:53 2020] [20200404_16:49:54.989698]@3 ---backlight level = 370---
[Sat Apr 4 16:49:53 2020] [20200404_16:49:55.133857]@2 mother fucker dcip3 mode=1
[Sat Apr 4 16:49:53 2020] [20200404_16:49:55.191509]@4 DCI-P3 Mode On.
你开屏幕调用mdss_dsi_panel_on就算了,你!为!什!么!还要调用两次mdss_dsi_event_handler处理DCI-P3 Mode On???是怕不生效吗?这样带来一个很蛋疼的问题,概率性在低亮度下开屏幕会闪。。原因还是一样的,动了pcc。
所以这个不是内核的锅,那我怎么发现的?
echo 1 > /sys/class/graphics/fb0/DCI_P3
丝毫没问题。
解决方法(experimental):
接管一加设置的颜色模式!例如,写一个app去开启颜色模式,开完再改下 /sys/class/graphics/fb0/DCI_P3权限。
问题3
锁屏后再开启,pcc遮罩失效。
这个问题。。hijack 一下mdss_fb_update_backlight,再往下追踪会发现display是在一个线程里,至于为什么开屏幕执行mdss_fb_update_backlight,还没有细看
写的有点乱,见谅