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