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 中可以重新定義傳入的參數和驅動間的數值映射,不過最後由於種種原因,這個後來不需要做了。。。就不了了之了。。。。

 

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