以前阅读源码时一般只阅读到fwk层部分,近期因为一个问题,想顺便把fwk层到hal 到驱动的调用关系都看下。在此做下记录。
原始问题是客户嫌屏幕调到最大亮度后仍然觉得亮度不够亮,让看看能不能把亮度调亮点。
分析
这个需求首先得硬件上能支持亮度能满足客户需求,在硬件上支持的前提下再看软件上怎么把亮度设置到满足需求(驱动得能调节到那个值,应用层到驱动间的映射能满足在设置最大亮度时驱动能调到对应值)
接着驱动报出驱动部分调节亮度的函数disp_pwm_set_backlight 在传入最大值时能满足客户需求,但是设置中设置的亮度最大值传到驱动时,参数并没有设置到对应的最大值。这就说明是应用层往下面传的时候中间出现了转换。
网上搜索了一下设置屏幕亮度的流程,参考:https://blog.csdn.net/FightFightFight/article/details/81320519
最后的setBrightness是调用LightsService.java中的setBrightness 方法,再通过jni调用com_android_server_lights_LightsService.cpp中的setLight_native
static void setLight_native(
JNIEnv* /* env */,
jobject /* clazz */,
jint light,
jint colorARGB,
jint flashMode,
jint onMS,
jint offMS,
jint brightnessMode) {
if (!validate(light, flashMode, brightnessMode)) {
return;
}
sp<ILight> hal = LightHal::associate();
if (hal == nullptr) {
return;
}
Type type = static_cast<Type>(light);
LightState state = constructState(
colorARGB, flashMode, onMS, offMS, brightnessMode);
{
android::base::Timer t;
Return<Status> ret = hal->setLight(type, state);
processReturn(ret, type, state);
if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
}
}
LightHal是hal层代码,其默认是在/hardware/interfaces/light/2.0/default 下,但是我使用的MTK代码中,在vendor做了定制,其实现在vendor/mediatek/proprietary/hardware/liblights/lights.c 中,进一步分析可知设置背光应该是set_light_backlight方法,写的/sys/class/leds/lcd-backlight/brightness设备节点。截止到此当亮度设置到最大值时,应用层往下传入的参数是255,这应该算最大值了。那么做的转换多半是hal层到驱动之间哪里有转换,从驱动那边得知的是设置背光调用的是 kernel-4.4/drivers/misc/mediatek/video/common/pwm10/ddp_pwm.c 由于kernel-4.4中有很多类似的写背光的驱动文件,估计是有什么宏去控制编译时调用什么文件。这个我现在也没有找到规则,有人知道的话,麻烦跟我说下。 最后看了一下代码,应该在disp_pwm_level_remap 中可以重新定义传入的参数和驱动间的数值映射,不过最后由于种种原因,这个后来不需要做了。。。就不了了之了。。。。