Android HAL层到驱动代码搜索---基于背光亮度的调试

以前阅读源码时一般只阅读到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 中可以重新定义传入的参数和驱动间的数值映射,不过最后由于种种原因,这个后来不需要做了。。。就不了了之了。。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章